ultracontext 1.3.1 → 1.3.2
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/dist/cli/entry.mjs +3 -3
- package/dist/cli/sdk-daemon.mjs +11 -4
- package/dist/cli/sdk-daemon.mjs.map +1 -1
- package/dist/{ctl-3wE5-uEy.mjs → ctl-BVPu-D57.mjs} +3 -3
- package/dist/{ctl-3wE5-uEy.mjs.map → ctl-BVPu-D57.mjs.map} +1 -1
- package/dist/{launcher-DeTwUGTs.mjs → launcher-BFPi7_wD.mjs} +3 -3
- package/dist/{launcher-DeTwUGTs.mjs.map → launcher-BFPi7_wD.mjs.map} +1 -1
- package/dist/{lock-PqeXMp7P.mjs → lock-CQ3xrIlj.mjs} +2 -2
- package/dist/{lock-PqeXMp7P.mjs.map → lock-CQ3xrIlj.mjs.map} +1 -1
- package/dist/{src-B9CWO5Xk.mjs → src-BSCJv6SU.mjs} +2 -2
- package/dist/{src-B9CWO5Xk.mjs.map → src-BSCJv6SU.mjs.map} +1 -1
- package/dist/{src-B7VNX8_g.mjs → src-DzUz8GPJ.mjs} +85 -8
- package/dist/src-DzUz8GPJ.mjs.map +1 -0
- package/dist/{tui-BmUdW0Nf.mjs → tui-C3H6iRjz.mjs} +4 -4
- package/dist/tui-C3H6iRjz.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/src-B7VNX8_g.mjs.map +0 -1
- package/dist/tui-BmUdW0Nf.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-C3H6iRjz.mjs","names":["fs","process","fsSync","fs"],"sources":["../../tui/src/ui/layout.mjs","../../tui/src/ui/input-handlers/bootstrap.mjs","../../tui/src/ui/input-handlers/menu.mjs","../../tui/src/ui/input-handlers/quit.mjs","../../tui/src/ui/input-handlers/resume-target.mjs","../../tui/src/ui/input-handlers/update-prompt.mjs","../../tui/src/ui/input-handlers/view-contexts.mjs","../../tui/src/ui/input-handlers/view-configs.mjs","../../tui/src/ui/input-handlers/view.mjs","../../tui/src/ui/input.mjs","../../tui/src/ui/format.mjs","../../tui/src/ui/state.mjs","../../tui/src/ui/components/Section.mjs","../../tui/src/ui/components/ClientsPanel.mjs","../../tui/src/ui/components/HeroLockup.mjs","../../tui/src/ui/components/MenuPanel.mjs","../../tui/src/ui/components/NarrowWidthPanel.mjs","../../tui/src/ui/panels/BootstrapPanel.mjs","../../tui/src/ui/panels/ConfigsContent.mjs","../../tui/src/ui/panels/ContextDetailContent.mjs","../../tui/src/ui/panels/ContextsContent.mjs","../../tui/src/ui/panels/HeaderPanel.mjs","../../tui/src/ui/panels/LogsContent.mjs","../../tui/src/ui/panels/RightPanel.mjs","../../tui/src/ui/panels/MainPanels.mjs","../../tui/src/ui/panels/ResumeTargetPanel.mjs","../../tui/src/ui/panels/UpdatePromptPanel.mjs","../../tui/src/ui/DaemonTui.mjs","../../tui/src/ui/controller.mjs","../../tui/src/utils.mjs","../../tui/src/ws-client.mjs","../../tui/src/tui.mjs"],"sourcesContent":["export function computeTuiLayout(stdoutColumns, stdoutRows) {\n const safeCols = Math.max(Math.floor(Number(stdoutColumns) || 0), 1);\n const safeRows = Math.max(Math.floor(Number(stdoutRows) || 0), 1);\n const minWideCols = 64;\n const isNarrowWidth = safeCols < minWideCols;\n const frameWidth = Math.max(safeCols - 2, 1);\n const narrowWidth = frameWidth;\n const containerWidth = frameWidth;\n const contentWidth = Math.max(containerWidth - 2, 1);\n\n const compactLayoutBreakpoint = 114;\n const isCompactLayout = contentWidth < compactLayoutBreakpoint;\n const sidebarWidth = contentWidth >= 140 ? 34 : contentWidth >= 112 ? 30 : 24;\n const fullBottomPanelHeight = Math.max(safeRows - 12, 6);\n const targetBottomPanelHeight = Math.max(Math.floor(fullBottomPanelHeight * 0.75), 6);\n const maxBottomPanelHeight = Math.max(safeRows - 7, 4);\n const bottomPanelHeight = Math.min(targetBottomPanelHeight, maxBottomPanelHeight);\n\n // Wide layout (left sidebar + right panel)\n const minMenuPanelHeight = Math.min(5, Math.max(bottomPanelHeight, 1));\n const minAgentsPanelHeight = 0;\n let menuPanelHeight = Math.max(Math.floor(bottomPanelHeight * 0.52), minMenuPanelHeight);\n if (menuPanelHeight > bottomPanelHeight - minAgentsPanelHeight) {\n menuPanelHeight = Math.max(bottomPanelHeight - minAgentsPanelHeight, minMenuPanelHeight);\n }\n const agentsPanelHeight = Math.max(bottomPanelHeight - menuPanelHeight, 0);\n const showClientsPanel = agentsPanelHeight >= 4;\n const rightPanelContentRows = Math.max(bottomPanelHeight - 5, 1);\n const rightPanelApproxWidth = Math.max(contentWidth - sidebarWidth - 3, 24);\n const rightPanelTextCols = Math.max(rightPanelApproxWidth - 12, 12);\n\n // Compact layout (stacked panels)\n // In compact mode, prioritize readability of the main view.\n let compactMenuPanelHeight = Math.min(Math.max(Math.floor(bottomPanelHeight * 0.28), 3), Math.max(bottomPanelHeight - 3, 1));\n let compactRemaining = Math.max(bottomPanelHeight - compactMenuPanelHeight, 1);\n let compactAgentsPanelHeight = compactRemaining >= 10 ? 5 : 0;\n let compactViewPanelHeight = Math.max(compactRemaining - compactAgentsPanelHeight, 1);\n if (compactMenuPanelHeight + compactAgentsPanelHeight + compactViewPanelHeight > bottomPanelHeight) {\n compactViewPanelHeight = Math.max(bottomPanelHeight - compactMenuPanelHeight - compactAgentsPanelHeight, 1);\n }\n if (compactMenuPanelHeight + compactAgentsPanelHeight + compactViewPanelHeight > bottomPanelHeight) {\n compactAgentsPanelHeight = 0;\n compactViewPanelHeight = Math.max(bottomPanelHeight - compactMenuPanelHeight, 1);\n }\n compactRemaining = Math.max(bottomPanelHeight - compactMenuPanelHeight, 1);\n if (compactViewPanelHeight > compactRemaining) compactViewPanelHeight = compactRemaining;\n const compactShowClientsPanel = compactAgentsPanelHeight >= 4;\n const compactRightPanelContentRows = Math.max(compactViewPanelHeight - 4, 1);\n const compactRightPanelTextCols = Math.max(contentWidth - 12, 12);\n\n return {\n minWideCols,\n isNarrowWidth,\n narrowWidth,\n containerWidth,\n contentWidth,\n isCompactLayout,\n sidebarWidth,\n bottomPanelHeight,\n menuPanelHeight,\n agentsPanelHeight,\n showClientsPanel,\n rightPanelContentRows,\n rightPanelTextCols,\n compactMenuPanelHeight,\n compactAgentsPanelHeight,\n compactShowClientsPanel,\n compactViewPanelHeight,\n compactRightPanelContentRows,\n compactRightPanelTextCols,\n };\n}\n","export function handleBootstrapInput({ input, key, actions, snapshot }) {\n if (key.upArrow) {\n actions.moveBootstrap?.(-1);\n return;\n }\n if (key.downArrow) {\n actions.moveBootstrap?.(1);\n return;\n }\n if (input === \"1\" || input === \"2\" || input === \"3\") {\n actions.chooseBootstrap?.(Number(input) - 1);\n return;\n }\n if (key.return || input === \" \") {\n actions.chooseBootstrap?.(snapshot.bootstrap?.selectedIndex ?? 0);\n }\n}\n","import { MENU_TABS } from \"../constants.mjs\";\n\nexport function handleMenuInput({ input, key, actions, menuIndex, setFocusMode, moveMenuIndex }) {\n const activeTab = MENU_TABS[Math.max(Number(menuIndex) || 0, 0)]?.id ?? \"logs\";\n if ((input === \"r\" || input === \"R\") && activeTab === \"contexts\") {\n actions.refreshResume?.();\n return;\n }\n\n if (key.upArrow) {\n moveMenuIndex(-1);\n return;\n }\n if (key.downArrow) {\n moveMenuIndex(1);\n return;\n }\n if (key.return || key.rightArrow) {\n actions.selectTab(menuIndex);\n setFocusMode(\"view\");\n }\n}\n\nexport function buildMoveMenuIndex(actions, setMenuIndex) {\n return (delta) => {\n setMenuIndex((prev) => {\n const base = Number.isInteger(prev) ? prev : 0;\n const next = Math.max(0, Math.min(base + delta, MENU_TABS.length - 1));\n if (next !== base) actions.selectTab(next);\n return next;\n });\n };\n}\n","export function isQuitInput(input, key) {\n return (key.ctrl && input === \"c\") || input === \"\\u0003\" || input === \"q\" || input === \"Q\";\n}\n","export function handleResumeTargetInput({ input, key, actions, snapshot }) {\n if (key.upArrow) {\n actions.moveResumeTarget?.(-1);\n return;\n }\n if (key.downArrow) {\n actions.moveResumeTarget?.(1);\n return;\n }\n if (input === \"1\" || input === \"2\" || input === \"3\") {\n actions.chooseResumeTarget?.(Number(input) - 1);\n return;\n }\n if (key.leftArrow || key.escape) {\n actions.cancelResumeTarget?.();\n return;\n }\n if (key.return || input === \" \") {\n actions.chooseResumeTarget?.(snapshot.resumeTargetPicker?.selectedIndex ?? 0);\n }\n}\n","export function handleUpdatePromptInput({ input, key, actions, snapshot }) {\n if (key.upArrow) {\n actions.moveUpdatePrompt?.(-1);\n return;\n }\n if (key.downArrow) {\n actions.moveUpdatePrompt?.(1);\n return;\n }\n if (input === \"1\" || input === \"2\") {\n actions.chooseUpdatePrompt?.(Number(input) - 1);\n return;\n }\n if (key.return || input === \" \") {\n actions.chooseUpdatePrompt?.(snapshot.updatePrompt?.selectedIndex ?? 0);\n }\n}\n","export function handleContextsViewInput({ input, key, actions, snapshot }) {\n const detailActive = snapshot?.detailView?.active;\n\n // ── detail mode ───────────────────────────────────────────────\n if (detailActive) {\n if (key.escape || key.leftArrow) {\n actions.closeDetail();\n return true;\n }\n if (key.upArrow) {\n actions.scrollDetail(-1);\n return true;\n }\n if (key.downArrow) {\n actions.scrollDetail(1);\n return true;\n }\n if (input === \"j\") {\n actions.scrollDetailLine(1);\n return true;\n }\n if (input === \"k\") {\n actions.scrollDetailLine(-1);\n return true;\n }\n if (input === \"r\") {\n actions.refreshDetail();\n return true;\n }\n return true;\n }\n\n // ── list mode ─────────────────────────────────────────────────\n if (key.upArrow) {\n actions.moveResume(-1);\n return true;\n }\n if (key.downArrow) {\n actions.moveResume(1);\n return true;\n }\n if (input === \"r\") {\n actions.refreshResume();\n return true;\n }\n if (key.return || input === \" \") {\n actions.enterContext();\n return true;\n }\n return false;\n}\n","export function handleConfigsViewInput({ input, key, actions }) {\n if (key.upArrow) {\n actions.moveConfig(-1);\n return true;\n }\n if (key.downArrow) {\n actions.moveConfig(1);\n return true;\n }\n if (key.return || key.rightArrow || input === \" \") {\n actions.toggleConfig();\n return true;\n }\n return false;\n}\n","import { handleContextsViewInput } from \"./view-contexts.mjs\";\nimport { handleConfigsViewInput } from \"./view-configs.mjs\";\n\nexport function handleViewInput({ input, key, actions, snapshot, selectedTabIndex, setFocusMode, setMenuIndex }) {\n // detail view captures Esc/← to close itself instead of leaving view mode\n if (snapshot.selectedTab === \"contexts\" && snapshot.detailView?.active) {\n handleContextsViewInput({ input, key, actions, snapshot });\n return;\n }\n\n if (key.leftArrow || key.escape) {\n setMenuIndex(selectedTabIndex);\n setFocusMode(\"menu\");\n return;\n }\n\n if (snapshot.selectedTab === \"contexts\") {\n handleContextsViewInput({ input, key, actions, snapshot });\n return;\n }\n\n if (snapshot.selectedTab === \"configs\") {\n handleConfigsViewInput({ input, key, actions });\n }\n}\n","import {\n handleBootstrapInput,\n buildMoveMenuIndex,\n handleMenuInput,\n handleResumeTargetInput,\n handleUpdatePromptInput,\n handleViewInput,\n isQuitInput,\n} from \"./input-handlers/index.mjs\";\n\nexport { buildMoveMenuIndex } from \"./input-handlers/index.mjs\";\n\nexport function createInputHandler({\n snapshot,\n actions,\n focusMode,\n menuIndex,\n selectedTabIndex,\n setFocusMode,\n setMenuIndex,\n moveMenuIndex,\n bootstrapActive,\n updatePromptActive,\n resumeTargetPickerActive,\n}) {\n return (input, key) => {\n if (isQuitInput(input, key)) {\n actions.stop();\n return;\n }\n\n // update prompt has highest priority\n if (updatePromptActive) {\n handleUpdatePromptInput({ input, key, actions, snapshot });\n return;\n }\n if (bootstrapActive) {\n handleBootstrapInput({ input, key, actions, snapshot });\n return;\n }\n if (resumeTargetPickerActive) {\n handleResumeTargetInput({ input, key, actions, snapshot });\n return;\n }\n if (focusMode === \"menu\") {\n handleMenuInput({ input, key, actions, menuIndex, setFocusMode, moveMenuIndex });\n return;\n }\n\n handleViewInput({\n input,\n key,\n actions,\n snapshot,\n selectedTabIndex,\n setFocusMode,\n setMenuIndex,\n });\n };\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\n\nimport { UC_CLAUDE_ORANGE, UC_CODEX_BLUE, UC_OPENCLAW_RED } from \"./constants.mjs\";\n\nexport function compact(value, max = 80) {\n const raw = String(value ?? \"\");\n if (raw.length <= max) return raw;\n if (max <= 3) return raw.slice(0, max);\n return `${raw.slice(0, max - 3)}...`;\n}\n\nexport function formatTime(value = Date.now()) {\n return new Date(value).toISOString().slice(11, 19);\n}\n\nexport function formatContextDate(value) {\n if (!value) return \"-\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return \"-\";\n const yyyy = String(d.getFullYear()).padStart(4, \"0\");\n const mm = String(d.getMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getDate()).padStart(2, \"0\");\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mi = String(d.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${mi}`;\n}\n\nexport function levelColor(level) {\n if (level === \"error\") return \"red\";\n if (level === \"warn\") return \"yellow\";\n if (level === \"info\") return \"green\";\n return \"cyan\";\n}\n\nexport function sourceColor(source) {\n const normalized = String(source ?? \"\").trim().toLowerCase();\n if (normalized === \"claude\" || normalized === \"claude code\") return UC_CLAUDE_ORANGE;\n if (normalized === \"codex\") return UC_CODEX_BLUE;\n if (normalized === \"openclaw\") return UC_OPENCLAW_RED;\n return \"gray\";\n}\n\nexport function sourceLabel(source) {\n const normalized = String(source ?? \"\").trim().toLowerCase();\n if (normalized === \"claude\" || normalized === \"claude code\") return \"Claude Code\";\n if (normalized === \"codex\") return \"Codex\";\n if (normalized === \"openclaw\") return \"OpenClaw\";\n return String(source ?? \"\");\n}\n\nexport function contextBadge(source) {\n const normalized = String(source ?? \"\").trim().toLowerCase();\n if (normalized === \"codex\") return { text: \"Codex\", color: sourceColor(\"codex\") };\n if (normalized === \"claude\" || normalized === \"claude code\") {\n return { text: \"Claude Code\", color: sourceColor(\"claude\") };\n }\n if (normalized === \"openclaw\") {\n return { text: \"OpenClaw\", color: sourceColor(\"openclaw\") };\n }\n const label = sourceLabel(source) || \"Unknown\";\n return { text: `Context: ${label}`, color: \"gray\" };\n}\n\nexport function fitToWidth(text, width) {\n const raw = String(text ?? \"\");\n if (width <= 0) return \"\";\n if (raw.length <= width) return raw;\n if (width === 1) return raw.slice(0, 1);\n return `${raw.slice(0, width - 1)}…`;\n}\n\nexport function padElements(elements, maxRows, keyPrefix) {\n const rows = elements.slice(0, Math.max(maxRows, 0));\n while (rows.length < maxRows) {\n rows.push(React.createElement(Text, { key: `${keyPrefix}-pad-${rows.length}` }, \" \"));\n }\n return rows;\n}\n\nexport function centerText(text, width, bias = 0) {\n const fitted = fitToWidth(text, width);\n const centeredLeft = Math.floor((width - fitted.length) / 2);\n const left = Math.max(centeredLeft + bias, 0);\n const right = Math.max(width - fitted.length - left, 0);\n return `${\" \".repeat(left)}${fitted}${\" \".repeat(right)}`;\n}\n","import { MENU_TABS } from \"./constants.mjs\";\n\nexport function selectedTabIndexFromId(tabId) {\n return Math.max(\n MENU_TABS.findIndex((tab) => tab.id === tabId),\n 0\n );\n}\n\nexport function selectedTabTitle(tabId) {\n return MENU_TABS.find((tab) => tab.id === tabId)?.label ?? \"View\";\n}\n\nexport function footerHelpText({ updatePromptActive, bootstrapActive, resumeTargetPickerActive, detailViewActive, selectedTab, focusMode }) {\n if (updatePromptActive) {\n return \"Update: ↑/↓ select, 1/2, Enter to confirm, q to quit.\";\n }\n if (bootstrapActive) {\n return \"Bootstrap: choose initial mode (↑/↓, 1/2/3, Enter) or q to quit.\";\n }\n if (resumeTargetPickerActive) {\n return \"Resume target: choose Claude Code or Codex (↑/↓, 1/2, Enter), Esc/← cancel.\";\n }\n if (focusMode !== \"view\") {\n return \"Controls: ↑/↓ navigate, Enter focus/open, ← back, q/Ctrl+C quit.\";\n }\n if (selectedTab === \"contexts\" && detailViewActive) {\n return \"Detail: ↑/↓ messages, j/k lines, r refresh, Esc/← back.\";\n }\n if (selectedTab === \"contexts\") {\n return \"Contexts: ↑/↓ select, Enter open, r refresh, ← back, q/Ctrl+C quit.\";\n }\n if (selectedTab === \"configs\") {\n return \"Controls: ↑/↓ select config, Enter/→ apply, ← back, q/Ctrl+C quit.\";\n }\n return \"Controls: ↑/↓ navigate, Enter focus/open, ← back, q/Ctrl+C quit.\";\n}\n","import React from \"react\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\n\nexport function Section({\n title,\n width,\n grow,\n height,\n children,\n marginRight = 0,\n borderColor = \"blue\",\n titleColor = \"cyan\",\n borderStyle = \"single\",\n paddingX = 2,\n paddingY = 1,\n}) {\n return React.createElement(\n TitledBox,\n {\n key: `section:${title}:${width ?? \"auto\"}:${height ?? \"auto\"}:${paddingX}:${paddingY}:${borderStyle}`,\n borderStyle,\n titles: [title],\n titleJustify: \"flex-start\",\n borderColor,\n flexDirection: \"column\",\n paddingX,\n paddingY,\n width,\n flexGrow: grow ? 1 : 0,\n height,\n flexShrink: 0,\n marginRight,\n },\n children\n );\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\n\nimport { compact } from \"../format.mjs\";\nimport { fitToWidth } from \"../format.mjs\";\nimport { Section } from \"./Section.mjs\";\n\nconst CLIENTS_PADDING_X = 2;\nconst CLIENTS_PADDING_Y = 1;\nconst CLIENTS_HORIZONTAL_FRAME = 4;\nconst CLIENTS_VERTICAL_FRAME = 2;\nconst SPARK_CHARS = \"▁▂▃▄▅▆▇█\";\n\nfunction formatLag(ms) {\n const safeMs = Math.max(Number(ms) || 0, 0);\n const totalSeconds = Math.floor(safeMs / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h`;\n}\n\nfunction sparklineFromLag(history) {\n const values = Array.isArray(history) ? history : [];\n if (values.length === 0) return SPARK_CHARS[0];\n return values\n .map((lagMs) => {\n const normalized = 1 - Math.max(Math.min((Number(lagMs) || 0) / 10000, 1), 0);\n const index = Math.max(Math.min(Math.round(normalized * (SPARK_CHARS.length - 1)), SPARK_CHARS.length - 1), 0);\n return SPARK_CHARS[index];\n })\n .join(\"\");\n}\n\nfunction clientLabel(client) {\n return `${compact(client.userId ?? \"-\", 12)}@${compact(client.host ?? \"-\", 20)}`;\n}\n\nfunction compactClientLine(client, lagMs, sparkline, maxCols) {\n const base = `● ${clientLabel(client)} lag ${formatLag(lagMs)} ${sparkline}`;\n return fitToWidth(base, maxCols);\n}\n\nexport function ClientsPanel({ clients, now, height, width }) {\n const innerCols = Math.max((Number(width ?? 0) || 0) - CLIENTS_HORIZONTAL_FRAME - CLIENTS_PADDING_X * 2, 10);\n const estimatedRows = Math.max((Number(height ?? 0) || 0) - CLIENTS_VERTICAL_FRAME - CLIENTS_PADDING_Y * 2, 1);\n const nowTs = Number(now ?? Date.now()) || Date.now();\n const historyRef = React.useRef(new Map());\n\n const list = (Array.isArray(clients) ? clients : [])\n .map((client) => ({\n ...client,\n id: `${String(client?.userId ?? \"-\")}@${String(client?.host ?? \"-\")}`,\n lagMs: Math.max(nowTs - Number(client?.ts ?? nowTs), 0),\n }))\n .sort((a, b) => a.lagMs - b.lagMs);\n\n const activeClientIds = new Set();\n for (const client of list) {\n activeClientIds.add(client.id);\n const previous = historyRef.current.get(client.id) ?? [];\n const next = [...previous, client.lagMs].slice(-8);\n historyRef.current.set(client.id, next);\n }\n for (const key of [...historyRef.current.keys()]) {\n if (!activeClientIds.has(key)) historyRef.current.delete(key);\n }\n\n const rows = [];\n if (list.length === 0) {\n rows.push(\n React.createElement(\n Text,\n { key: \"clients-empty\", color: \"yellow\", wrap: \"truncate-end\" },\n fitToWidth(\"No clients online\", innerCols)\n )\n );\n } else if (estimatedRows < 4) {\n const first = list[0];\n const sparkline = sparklineFromLag(historyRef.current.get(first.id) ?? []);\n rows.push(\n React.createElement(\n Text,\n { key: `clients-compact-${first.id}`, color: \"white\", wrap: \"truncate-end\" },\n compactClientLine(first, first.lagMs, sparkline, innerCols)\n )\n );\n if (list.length > 1 && rows.length < estimatedRows) {\n rows.push(\n React.createElement(\n Text,\n { key: \"clients-compact-more\", color: \"gray\", dim: true, wrap: \"truncate-end\" },\n fitToWidth(`+${list.length - 1} more online`, innerCols)\n )\n );\n }\n } else {\n const maxVisibleClients = Math.max(Math.floor(estimatedRows / 2), 1);\n const visible = list.slice(0, maxVisibleClients);\n for (let index = 0; index < visible.length; index += 1) {\n const client = visible[index];\n const sparkline = sparklineFromLag(historyRef.current.get(client.id) ?? []);\n const head = fitToWidth(`● ${clientLabel(client)}`, innerCols);\n const detail = fitToWidth(`lag ${formatLag(client.lagMs)} · activity ${sparkline}`, innerCols);\n\n rows.push(\n React.createElement(\n Text,\n { key: `clients-head-${client.id}-${index}`, wrap: \"truncate-end\" },\n React.createElement(Text, { color: \"green\" }, \"● \"),\n React.createElement(Text, { color: \"white\" }, head.slice(2))\n )\n );\n if (rows.length < estimatedRows) {\n rows.push(\n React.createElement(Text, { key: `clients-detail-${client.id}-${index}`, color: \"gray\", dim: true, wrap: \"truncate-end\" }, detail)\n );\n }\n }\n if (list.length > visible.length && rows.length < estimatedRows) {\n rows.push(\n React.createElement(\n Text,\n { key: \"clients-more\", color: \"gray\", dim: true, wrap: \"truncate-end\" },\n fitToWidth(`+${list.length - visible.length} more online`, innerCols)\n )\n );\n }\n }\n\n return React.createElement(\n Section,\n {\n title: \"Clients\",\n height,\n width,\n borderColor: \"gray\",\n titleColor: \"white\",\n paddingX: CLIENTS_PADDING_X,\n paddingY: CLIENTS_PADDING_Y,\n },\n ...rows\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { fitToWidth } from \"../format.mjs\";\nimport { heroArtForWidth } from \"../hero-art.mjs\";\n\nfunction clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction centerAround(text, width, center) {\n const fitted = fitToWidth(text, width);\n const safeCenter = clamp(Math.floor(center), 0, Math.max(width - 1, 0));\n const maxLeft = Math.max(width - fitted.length, 0);\n const left = clamp(safeCenter - Math.floor(fitted.length / 2), 0, maxLeft);\n const right = Math.max(width - fitted.length - left, 0);\n return `${\" \".repeat(left)}${fitted}${\" \".repeat(right)}`;\n}\n\nexport function HeroLockup({ width, tagline, artCenterBias = 0 }) {\n const lockupWidth = Math.max(width, 8);\n const rawArtLines = heroArtForWidth(lockupWidth).map((line) => fitToWidth(String(line ?? \"\"), lockupWidth));\n const artBlockWidth = Math.max(...rawArtLines.map((line) => line.length), 0);\n const maxLeft = Math.max(lockupWidth - artBlockWidth, 0);\n const artLeft = clamp(Math.floor((lockupWidth - artBlockWidth) / 2) + artCenterBias, 0, maxLeft);\n const artLines = rawArtLines.map((line) => fitToWidth(`${\" \".repeat(artLeft)}${line}`, lockupWidth));\n const taglineText = `[ ${tagline} ]`;\n const artCenter = artLeft + Math.floor(Math.max(artBlockWidth - 1, 0) / 2);\n const taglineLine = centerAround(taglineText, lockupWidth, artCenter);\n\n return React.createElement(\n Box,\n { flexDirection: \"column\", width: lockupWidth, alignItems: \"flex-start\", justifyContent: \"flex-start\" },\n ...artLines.map((line, index) =>\n React.createElement(Text, { key: `hero-${index}`, color: \"white\", bold: true }, line)\n ),\n React.createElement(Text, { color: \"white\" }, \" \"),\n React.createElement(Text, { color: \"blue\", bold: true }, taglineLine)\n );\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\n\nimport { MENU_TABS, UC_BRAND_BLUE, UC_BLUE_LIGHT } from \"../constants.mjs\";\nimport { fitToWidth } from \"../format.mjs\";\nimport { Section } from \"./Section.mjs\";\n\nconst MENU_PADDING_X = 2;\nconst MENU_PADDING_Y = 1;\nconst MENU_HORIZONTAL_FRAME = 4;\nconst MENU_VERTICAL_FRAME = 2;\n\nexport function MenuPanel({ focusMode, menuIndex, selectedTab, height, width }) {\n const innerCols = Math.max(\n (Number(width ?? 0) || 0) - MENU_HORIZONTAL_FRAME - MENU_PADDING_X * 2,\n 10\n );\n const activeIndex = Math.max(\n focusMode === \"menu\" ? Number(menuIndex ?? 0) : MENU_TABS.findIndex((tab) => tab.id === selectedTab),\n 0\n );\n const estimatedRows = Math.max(\n (Number(height ?? 0) || 0) - MENU_VERTICAL_FRAME - MENU_PADDING_Y * 2,\n 1\n );\n const listCapacity = Math.max(Math.min(estimatedRows, MENU_TABS.length), 1);\n const start = Math.max(\n Math.min(activeIndex - Math.floor(listCapacity / 2), Math.max(MENU_TABS.length - listCapacity, 0)),\n 0\n );\n const end = Math.min(start + listCapacity, MENU_TABS.length);\n const visibleTabs = MENU_TABS.slice(start, end);\n\n return React.createElement(\n Section,\n {\n title: \"Menu\",\n width,\n height,\n borderColor: \"gray\",\n titleColor: \"white\",\n paddingX: MENU_PADDING_X,\n paddingY: MENU_PADDING_Y,\n },\n ...visibleTabs.map((tab, visibleIndex) => {\n const index = start + visibleIndex;\n const isFocusedInMenu = focusMode === \"menu\" && index === menuIndex;\n const isActiveInView = focusMode !== \"menu\" && index === activeIndex;\n const isHighlighted = isFocusedInMenu || isActiveInView;\n const marker = isHighlighted ? \"[•]\" : \"[ ]\";\n const markerColor = isHighlighted ? UC_BRAND_BLUE : \"white\";\n const labelColor = isHighlighted ? UC_BLUE_LIGHT : \"white\";\n const labelMax = Math.max(innerCols - marker.length - 1, 4);\n const label = fitToWidth(tab.label, labelMax);\n const lineLen = marker.length + 1 + label.length;\n const tailPad = \" \".repeat(Math.max(innerCols - lineLen, 0));\n\n return React.createElement(\n Text,\n { key: `menu-${tab.id}-${start}-${listCapacity}`, wrap: \"truncate-end\" },\n React.createElement(Text, { color: markerColor }, marker),\n \" \",\n React.createElement(Text, { color: labelColor, dim: !isHighlighted }, label),\n tailPad\n );\n })\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\n\nimport { UC_BRAND_BLUE } from \"../constants.mjs\";\nimport { fitToWidth } from \"../format.mjs\";\n\nexport function NarrowWidthPanel({ minWideCols, narrowWidth, stdoutColumns }) {\n return React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(\n TitledBox,\n {\n borderStyle: \"single\",\n titles: [\"UltraContext v1.1\"],\n titleJustify: \"flex-start\",\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width: narrowWidth,\n },\n React.createElement(Text, { color: \"yellow\", bold: true, wrap: \"truncate-end\" }, \"Window too narrow\"),\n React.createElement(\n Text,\n { color: \"gray\", wrap: \"truncate-end\" },\n fitToWidth(`Resize terminal width to at least ${minWideCols} cols (current=${stdoutColumns}).`, Math.max(narrowWidth - 6, 12))\n )\n )\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\n\nimport { UC_BLUE_LIGHT, UC_BRAND_BLUE } from \"../constants.mjs\";\n\nexport function BootstrapPanel({ snapshot, width }) {\n const options = snapshot.bootstrap?.options ?? [];\n const selectedIndex = Math.max(\n Math.min(snapshot.bootstrap?.selectedIndex ?? 0, Math.max(options.length - 1, 0)),\n 0\n );\n const sourceLabel = (snapshot.bootstrap?.sourceNames ?? []).join(\", \") || \"sources\";\n\n return React.createElement(\n TitledBox,\n {\n key: `bootstrap:${width}:${options.length}`,\n borderStyle: \"single\",\n titles: [\"First Sync Setup\"],\n titleJustify: \"flex-start\",\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width,\n },\n React.createElement(Text, { color: \"white\", bold: true }, `How should sync start for: ${sourceLabel}?`),\n React.createElement(Box, { height: 1 }),\n ...options.map((option, index) => {\n const selected = index === selectedIndex;\n return React.createElement(\n Box,\n { key: `bootstrap-option-${option.id}`, flexDirection: \"column\" },\n React.createElement(\n Text,\n { color: selected ? UC_BLUE_LIGHT : \"white\" },\n selected ? \"[•]\" : \"[ ]\",\n ` ${index + 1}. ${option.label}`\n ),\n React.createElement(Text, { color: \"gray\" }, ` ${option.description}`)\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Choose: ↑/↓, 1/2/3 or Enter\")\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { UC_BLUE_LIGHT } from \"../constants.mjs\";\nimport { compact, padElements } from \"../format.mjs\";\n\nexport function ConfigsContent({ snapshot, viewFocused, maxRows }) {\n const configItems = snapshot.configEditor?.items ?? [];\n const selectedConfigIndex = Math.max(\n Math.min(snapshot.configEditor?.selectedIndex ?? 0, Math.max(configItems.length - 1, 0)),\n 0\n );\n const rows = [];\n for (let index = 0; index < configItems.length; index += 1) {\n const item = configItems[index];\n const selected = index === selectedConfigIndex;\n const marker = selected ? \"[•]\" : \"[ ]\";\n const rowColor = selected && viewFocused ? UC_BLUE_LIGHT : \"white\";\n const status =\n item.kind === \"action\"\n ? item.valueLabel ?? \"RUN\"\n : item.kind === \"enum\"\n ? item.valueLabel ?? String(item.value ?? \"-\")\n : item.value ? \"ON\" : \"OFF\";\n const detail = item.blockedByMaster\n ? `${item.description ?? \"\"} (disabled while Master sounds is OFF)`\n : item.description ?? \"\";\n rows.push(\n React.createElement(\n Text,\n { key: `config-row-${item.key}`, color: rowColor },\n `${marker} ${item.label} [${status}]`\n )\n );\n if (detail) {\n rows.push(\n React.createElement(\n Text,\n { key: `config-detail-${item.key}`, color: item.blockedByMaster ? \"yellow\" : \"gray\" },\n compact(` ${detail}`, 130)\n )\n );\n }\n }\n\n if (rows.length === 0) {\n rows.push(React.createElement(Text, { key: \"config-empty\", color: \"yellow\" }, \"No editable configs found.\"));\n }\n if (snapshot.resume.notice) {\n rows.push(React.createElement(Text, { key: \"config-gap\" }, \" \"));\n rows.push(\n React.createElement(Text, { key: \"config-notice\", color: \"gray\" }, compact(`last action: ${snapshot.resume.notice}`, 130))\n );\n }\n\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"cfg\"));\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { compact, contextBadge, padElements } from \"../format.mjs\";\n\n// ── role helpers ─────────────────────────────────────────────────\n\nfunction roleColor(role) {\n if (role === \"user\") return \"green\";\n if (role === \"assistant\") return \"blue\";\n return \"gray\";\n}\n\nfunction normalizeRole(msg) {\n const role = String(msg?.role ?? \"system\").toLowerCase();\n if (role === \"user\" || role === \"human\") return \"user\";\n if (role === \"assistant\" || role === \"agent\") return \"assistant\";\n return \"system\";\n}\n\n// ── extract full message text (no truncation) ───────────────────\n\nfunction messageText(msg) {\n const content = msg?.content;\n if (typeof content === \"string\") return content;\n if (content && typeof content === \"object\") {\n if (typeof content.message === \"string\") return content.message;\n if (typeof content.text === \"string\") return content.text;\n return JSON.stringify(content, null, 2);\n }\n return \"\";\n}\n\nfunction messageTimestamp(msg) {\n const raw = msg?.content?.timestamp ?? msg?.metadata?.timestamp ?? \"\";\n if (!raw) return \"\";\n const d = new Date(raw);\n if (Number.isNaN(d.getTime())) return String(raw).slice(0, 5);\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mm = String(d.getMinutes()).padStart(2, \"0\");\n return `${hh}:${mm}`;\n}\n\n// ── wrap a single line respecting maxWidth ──────────────────────\n\nfunction wrapLine(text, maxWidth) {\n if (!text) return [\"\"];\n const width = Math.max(maxWidth, 10);\n const lines = [];\n let remaining = text;\n while (remaining.length > width) {\n lines.push(remaining.slice(0, width));\n remaining = remaining.slice(width);\n }\n lines.push(remaining);\n return lines;\n}\n\n// ── build visual lines from messages ────────────────────────────\n\nfunction buildMessageLines(messages, maxWidth) {\n const lines = [];\n const separatorWidth = Math.max(maxWidth, 10);\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const role = normalizeRole(msg);\n const ts = messageTimestamp(msg);\n const fullText = messageText(msg);\n const color = roleColor(role);\n\n // separator: ── role · HH:MM ──────────\n const label = ts ? `${role} · ${ts}` : role;\n const labelPart = `── ${label} `;\n const fillLen = Math.max(separatorWidth - labelPart.length, 0);\n const fill = \"─\".repeat(fillLen);\n lines.push({ type: \"separator\", color, label: `${labelPart}${fill}`, msgIndex: i });\n\n // split by real newlines, wrap each, preserve structure\n const rawLines = (fullText || \"(empty)\").split(/\\r?\\n/);\n for (const rawLine of rawLines) {\n for (const wrapped of wrapLine(rawLine, maxWidth)) {\n lines.push({ type: \"text\", text: wrapped, msgIndex: i });\n }\n }\n\n // blank line between messages\n if (i < messages.length - 1) {\n lines.push({ type: \"blank\", msgIndex: i });\n }\n }\n\n return lines;\n}\n\n// ── main component ──────────────────────────────────────────────\n\nexport function ContextDetailContent({ snapshot, maxRows, maxCols }) {\n const dv = snapshot.detailView;\n const textWidth = Math.max((maxCols ?? 60) - 2, 20);\n const rows = [];\n const totalMsgs = dv.messages.length;\n\n const source = dv.contextMeta?.source ?? \"unknown\";\n const badge = contextBadge(source);\n\n // header placeholder (filled after scroll info is known)\n const headerIdx = 0;\n rows.push(null);\n rows.push(React.createElement(Text, { key: \"detail-spacer\" }, \" \"));\n\n // loading state\n if (dv.loading) {\n rows[headerIdx] = renderHeader({ badge, dv, scrollInfo: \"loading...\" });\n rows.push(React.createElement(Text, { key: \"detail-loading\", color: \"yellow\" }, \"Loading messages...\"));\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"dtl\"));\n }\n\n // error state\n if (dv.error) {\n rows[headerIdx] = renderHeader({ badge, dv, scrollInfo: \"error\" });\n rows.push(React.createElement(Text, { key: \"detail-error\", color: \"red\" }, `Error: ${dv.error}`));\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"dtl\"));\n }\n\n // empty state\n if (totalMsgs === 0) {\n rows[headerIdx] = renderHeader({ badge, dv, scrollInfo: \"empty\" });\n rows.push(React.createElement(Text, { key: \"detail-empty\", color: \"gray\" }, \"No messages in this context.\"));\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"dtl\"));\n }\n\n // build all visual lines\n const allLines = buildMessageLines(dv.messages, textWidth);\n const availableRows = Math.max(maxRows - rows.length, 1);\n\n // two-level scroll: ↑/↓ by message (scrollOffset), j/k by line (lineOffset)\n const targetMsg = Math.max(0, Math.min(dv.scrollOffset, totalMsgs - 1));\n let msgStartLine = 0;\n for (let i = 0; i < allLines.length; i++) {\n if (allLines[i].msgIndex === targetMsg) {\n msgStartLine = i;\n break;\n }\n }\n\n // apply fine line offset, clamped\n const maxScroll = Math.max(allLines.length - availableRows, 0);\n const startLine = Math.max(0, Math.min(msgStartLine + (dv.lineOffset ?? 0), maxScroll));\n\n // header with scroll info\n const msgLabel = `msg ${targetMsg + 1}/${totalMsgs}`;\n const pct = allLines.length > 0 ? Math.min(Math.round(((startLine + availableRows) / allLines.length) * 100), 100) : 100;\n rows[headerIdx] = renderHeader({ badge, dv, scrollInfo: `${msgLabel} ${pct}%` });\n\n // render visible slice\n const visibleLines = allLines.slice(startLine, startLine + availableRows);\n for (let i = 0; i < visibleLines.length; i++) {\n const line = visibleLines[i];\n if (line.type === \"separator\") {\n rows.push(React.createElement(Text, { key: `dtl-l-${i}`, color: line.color, bold: true }, line.label));\n } else if (line.type === \"text\") {\n rows.push(React.createElement(Text, { key: `dtl-l-${i}` }, line.text));\n } else {\n rows.push(React.createElement(Text, { key: `dtl-l-${i}` }, \" \"));\n }\n }\n\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"dtl\"));\n}\n\n// ── header helper ───────────────────────────────────────────────\n\nfunction renderHeader({ badge, dv, scrollInfo }) {\n return React.createElement(\n Text,\n { key: \"detail-header\", wrap: \"truncate-end\" },\n React.createElement(Text, { color: badge.color, bold: true }, `[${badge.text}]`),\n React.createElement(Text, { color: \"gray\" }, ` ${compact(dv.contextId ?? \"\", 36)} `),\n React.createElement(Text, { color: \"cyan\" }, scrollInfo),\n React.createElement(Text, { color: \"gray\" }, \" ↑/↓ msg j/k line r refresh Esc back\")\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { UC_BLUE_LIGHT } from \"../constants.mjs\";\nimport { compact, contextBadge, formatContextDate, padElements } from \"../format.mjs\";\nimport { ContextDetailContent } from \"./ContextDetailContent.mjs\";\n\nexport function ContextsContent({ snapshot, viewFocused, maxRows, maxCols }) {\n // detail view takes over the panel\n if (snapshot.detailView?.active) {\n return React.createElement(ContextDetailContent, { snapshot, maxRows, maxCols });\n }\n\n const contexts = snapshot.resume.contexts;\n const total = contexts.length;\n const selected = Math.max(Math.min(snapshot.resume.selectedIndex, Math.max(total - 1, 0)), 0);\n\n const rows = [];\n\n const tailRows = [];\n if (total > 0 && (snapshot.resume.notice || snapshot.resume.error || snapshot.resume.summaryPath || snapshot.resume.command)) {\n const selectedContext = contexts[selected];\n const selectedCreatedAt = formatContextDate(selectedContext?.created_at);\n const selectedInfo = contextBadge(selectedContext?.metadata?.source || \"unknown\");\n tailRows.push(\n React.createElement(\n Text,\n { key: \"contexts-selected\", color: \"gray\" },\n `selected: ${selectedCreatedAt} `,\n React.createElement(Text, { color: selectedInfo.color, bold: true }, `[${selectedInfo.text}]`),\n ` id=${compact(selectedContext?.id ?? \"-\", 36)}`\n )\n );\n }\n if (tailRows.length > 0) tailRows.push(React.createElement(Text, { key: \"contexts-spacer-1\" }, \" \"));\n if (snapshot.resume.notice) {\n tailRows.push(\n React.createElement(Text, { key: \"contexts-notice\", color: \"green\" }, `info: ${compact(snapshot.resume.notice, 120)}`)\n );\n }\n if (snapshot.resume.error) {\n tailRows.push(React.createElement(Text, { key: \"contexts-error\", color: \"red\" }, `error: ${compact(snapshot.resume.error, 120)}`));\n }\n if (snapshot.resume.summaryPath) {\n tailRows.push(\n React.createElement(Text, { key: \"contexts-summary\", color: \"gray\" }, `summary: ${compact(snapshot.resume.summaryPath, 120)}`)\n );\n }\n if (snapshot.resume.command) {\n tailRows.push(\n React.createElement(Text, { key: \"contexts-command\", color: \"gray\" }, `command: ${compact(snapshot.resume.command, 120)}`)\n );\n }\n if (snapshot.resume.commandPath) {\n tailRows.push(\n React.createElement(Text, { key: \"contexts-command-path\", color: \"gray\" }, `command file: ${compact(snapshot.resume.commandPath, 120)}`)\n );\n }\n\n const availableRows = Math.max(maxRows, 4);\n const listCapacity = Math.max(availableRows - tailRows.length, 1);\n\n if (total === 0) {\n rows.push(React.createElement(Text, { key: \"contexts-empty\", color: \"yellow\" }, \"No contexts available.\"));\n } else {\n const start = Math.max(Math.min(selected - Math.floor(listCapacity / 2), Math.max(total - listCapacity, 0)), 0);\n const end = Math.min(start + listCapacity, total);\n for (let i = start; i < end; i += 1) {\n const ctx = contexts[i];\n const md = ctx?.metadata ?? {};\n const rowSelected = i === selected;\n const marker = rowSelected ? \"[•]\" : \"[ ]\";\n const rowColor = viewFocused && rowSelected ? UC_BLUE_LIGHT : \"white\";\n const sourceInfo = contextBadge(md.source || \"unknown\");\n const createdAt = formatContextDate(ctx?.created_at);\n const user = compact(md.user_id ?? \"-\", 12);\n const sessionId = compact(md.session_id ?? \"-\", 28);\n rows.push(\n React.createElement(\n Text,\n { key: `contexts-row-${i}`, color: rowColor },\n `${marker} `,\n React.createElement(Text, { color: sourceInfo.color, bold: true }, `[${sourceInfo.text}]`),\n ` ${createdAt} ${user} ${sessionId}`\n )\n );\n }\n }\n rows.push(...tailRows);\n\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"ctx\"));\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport Spinner from \"../../Spinner.mjs\";\nimport { HeroLockup } from \"../components/index.mjs\";\nimport { fitToWidth, formatTime } from \"../format.mjs\";\n\nfunction formatUptime(value) {\n const ms = Math.max(Number(value) || 0, 0);\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}h${String(minutes).padStart(2, \"0\")}m`;\n if (minutes > 0) return `${minutes}m${String(seconds).padStart(2, \"0\")}s`;\n return `${seconds}s`;\n}\n\nexport function HeaderPanel({ snapshot, stdoutColumns }) {\n const [pulseOn, setPulseOn] = React.useState(true);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setPulseOn((current) => !current);\n }, 320);\n timer.unref?.();\n return () => clearInterval(timer);\n }, []);\n\n const health = snapshot.stats.errors > 0 ? \"DEGRADED\" : \"HEALTHY\";\n const healthColor = health === \"HEALTHY\" ? \"green\" : \"yellow\";\n const tagline = \"Same context, everywhere\";\n const innerWidth = Math.max(stdoutColumns, 40);\n const spinnerVisualWidth = 28;\n const gap = innerWidth >= 96 ? 3 : 2;\n const artWidth = Math.max(innerWidth - spinnerVisualWidth - gap, 8);\n const statusPrefix = \"status \";\n const healthToken = `● ${health}`;\n const clientsOnline = Array.isArray(snapshot.onlineClients) ? snapshot.onlineClients.length : 0;\n const dashboardTail = [\n `live ${formatTime(snapshot.now)}`,\n `☻ ${snapshot.cfg.userId}`,\n `clients ${clientsOnline}`,\n `uptime ${formatUptime(Date.now() - Number(snapshot.stats.startedAt ?? 0))}`,\n ].join(\" │ \");\n const tailMax = Math.max(innerWidth - statusPrefix.length - healthToken.length - 3, 0);\n const fittedTail = fitToWidth(dashboardTail, tailMax);\n\n return React.createElement(\n Box,\n { flexDirection: \"column\", width: innerWidth },\n React.createElement(\n Box,\n { flexDirection: \"row\", alignItems: \"center\", width: innerWidth },\n React.createElement(Spinner, { color: \"white\" }),\n React.createElement(Box, { width: gap }),\n React.createElement(\n HeroLockup,\n { width: artWidth, tagline }\n )\n ),\n React.createElement(\n Box,\n { flexDirection: \"row\", width: innerWidth },\n React.createElement(Text, { color: \"gray\", dim: true }, statusPrefix),\n React.createElement(\n Text,\n { color: healthColor, bold: true },\n React.createElement(Text, { color: healthColor, dim: !pulseOn }, \"●\"),\n ` ${health}`\n ),\n fittedTail\n ? React.createElement(Text, { color: \"gray\", dim: true }, ` │ ${fittedTail}`)\n : null\n )\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { fitToWidth, levelColor, padElements, sourceColor, sourceLabel } from \"../format.mjs\";\n\nfunction classifyLog(entry) {\n const text = String(entry?.text ?? \"\").toLowerCase();\n if (text.includes(\"bootstrap\")) return { label: \"BOOTSTRAP\", color: \"cyan\" };\n if (text.includes(\"config\")) return { label: \"CONFIG\", color: \"yellow\" };\n if (text.includes(\"daemon\") || text.includes(\"instance lock\")) return { label: \"DAEMON\", color: \"green\" };\n if (entry?.level === \"error\") return { label: \"ERROR\", color: \"red\" };\n if (entry?.level === \"warn\") return { label: \"WARN\", color: \"yellow\" };\n return { label: \"\", color: \"gray\" };\n}\n\nexport function LogsContent({ snapshot, maxRows, maxCols = 100 }) {\n const rows = [];\n const safeCols = Math.max(maxCols, 12);\n const visibleLogs = snapshot.recentLogs.slice(-Math.max(maxRows, 1)).reverse();\n\n if (visibleLogs.length === 0) {\n rows.push(\n React.createElement(Text, { key: \"log-empty\", color: \"gray\", wrap: \"truncate-end\" }, fitToWidth(\"waiting for activity...\", safeCols))\n );\n } else {\n rows.push(\n ...visibleLogs.map((entry, index) => {\n const category = classifyLog(entry);\n const sourceTag = entry.source ? `[${sourceLabel(entry.source)}]` : \"\";\n const timePrefix = `${String(entry.ts ?? \"--:--:--\")} `;\n const typePrefix = category.label ? `[${category.label}] ` : \"\";\n const sourcePrefix = sourceTag ? `${sourceTag} ` : \"\";\n const prefixWidth = 2 + 1 + timePrefix.length + typePrefix.length + sourcePrefix.length;\n const messageMax = Math.max(safeCols - prefixWidth, 8);\n const message = fitToWidth(String(entry.text ?? \"\"), messageMax);\n const messageColor = entry.level === \"warn\" || entry.level === \"error\" ? levelColor(entry.level) : \"white\";\n\n return React.createElement(\n Text,\n { key: `log-${index}`, wrap: \"truncate-end\" },\n React.createElement(Text, { color: category.color }, \"● \"),\n React.createElement(Text, { color: \"gray\", dim: true }, timePrefix),\n typePrefix\n ? React.createElement(Text, { color: category.color, bold: true }, typePrefix)\n : null,\n sourceTag\n ? React.createElement(Text, { color: sourceColor(entry.source), bold: true }, sourcePrefix)\n : null,\n React.createElement(Text, { color: messageColor }, message)\n );\n })\n );\n }\n\n return React.createElement(Box, { flexDirection: \"column\" }, ...padElements(rows, maxRows, \"log\"));\n}\n","import React from \"react\";\n\nimport { ConfigsContent } from \"./ConfigsContent.mjs\";\nimport { ContextsContent } from \"./ContextsContent.mjs\";\nimport { LogsContent } from \"./LogsContent.mjs\";\n\nexport function RightPanel({ snapshot, viewFocused, maxRows, maxCols }) {\n if (snapshot.selectedTab === \"configs\") return React.createElement(ConfigsContent, { snapshot, viewFocused, maxRows });\n if (snapshot.selectedTab === \"contexts\") return React.createElement(ContextsContent, { snapshot, viewFocused, maxRows, maxCols });\n return React.createElement(LogsContent, { snapshot, maxRows, maxCols });\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\nimport { UC_BLUE_LIGHT, UC_BRAND_BLUE } from \"../constants.mjs\";\nimport { fitToWidth } from \"../format.mjs\";\nimport { selectedTabTitle } from \"../state.mjs\";\nimport { ClientsPanel, MenuPanel, Section } from \"../components/index.mjs\";\nimport { RightPanel } from \"./RightPanel.mjs\";\n\nfunction renderFocusedViewTop(width, title) {\n const safeWidth = Math.max(Number(width) || 0, 4);\n const innerWidth = Math.max(safeWidth - 2, 1);\n const paddedTitle = ` ${title} `;\n const shownTitle = fitToWidth(paddedTitle, innerWidth);\n const fillWidth = Math.max(innerWidth - shownTitle.length, 0);\n\n return React.createElement(\n Text,\n { color: UC_BRAND_BLUE, wrap: \"truncate-end\" },\n \"╔\",\n React.createElement(Text, { color: UC_BLUE_LIGHT, bold: true }, shownTitle),\n \"═\".repeat(fillWidth),\n \"╗\"\n );\n}\n\nfunction ViewSection({ snapshot, focusMode, width, grow, height, maxRows, maxCols }) {\n const viewFocused = focusMode === \"view\";\n const title = selectedTabTitle(snapshot.selectedTab);\n\n if (viewFocused) {\n return React.createElement(\n Box,\n { flexDirection: \"column\", width, flexGrow: grow ? 1 : 0, flexShrink: 0 },\n renderFocusedViewTop(width, title),\n React.createElement(\n Box,\n {\n borderStyle: \"double\",\n borderTop: false,\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width,\n height,\n flexGrow: grow ? 1 : 0,\n flexShrink: 0,\n },\n React.createElement(RightPanel, {\n snapshot,\n viewFocused,\n maxRows,\n maxCols,\n })\n )\n );\n }\n\n return React.createElement(\n Section,\n {\n title,\n width,\n height,\n grow,\n borderColor: \"cyan\",\n titleColor: \"white\",\n borderStyle: \"double\",\n },\n React.createElement(RightPanel, {\n snapshot,\n viewFocused,\n maxRows,\n maxCols,\n })\n );\n}\n\nexport function MainPanels({ snapshot, layout, focusMode, menuIndex, clients }) {\n if (layout.isCompactLayout) {\n const clientsSection = layout.compactShowClientsPanel\n ? React.createElement(ClientsPanel, {\n clients,\n now: snapshot.now,\n height: layout.compactAgentsPanelHeight,\n width: layout.contentWidth,\n })\n : null;\n\n return React.createElement(\n Box,\n { flexDirection: \"column\", alignItems: \"flex-start\", width: layout.contentWidth },\n React.createElement(MenuPanel, {\n focusMode,\n menuIndex,\n selectedTab: snapshot.selectedTab,\n height: layout.compactMenuPanelHeight,\n width: layout.contentWidth,\n }),\n React.createElement(ViewSection, {\n snapshot,\n focusMode,\n width: layout.contentWidth,\n height: layout.compactViewPanelHeight,\n maxRows: layout.compactRightPanelContentRows,\n maxCols: layout.compactRightPanelTextCols,\n }),\n clientsSection\n );\n }\n\n const clientsSection = layout.showClientsPanel\n ? React.createElement(ClientsPanel, {\n clients,\n now: snapshot.now,\n height: layout.agentsPanelHeight,\n width: layout.sidebarWidth,\n })\n : null;\n\n const rightPanelWidth = Math.max(layout.contentWidth - layout.sidebarWidth, 20);\n\n return React.createElement(\n Box,\n { flexDirection: \"row\", alignItems: \"flex-start\", height: layout.bottomPanelHeight, width: layout.contentWidth },\n React.createElement(\n Box,\n { flexDirection: \"column\", width: layout.sidebarWidth, marginRight: 0, height: layout.bottomPanelHeight, flexShrink: 0 },\n React.createElement(MenuPanel, {\n focusMode,\n menuIndex,\n selectedTab: snapshot.selectedTab,\n height: layout.menuPanelHeight,\n width: layout.sidebarWidth,\n }),\n clientsSection\n ),\n React.createElement(ViewSection, {\n snapshot,\n focusMode,\n width: rightPanelWidth,\n height: layout.bottomPanelHeight,\n maxRows: layout.rightPanelContentRows,\n maxCols: layout.rightPanelTextCols,\n })\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\n\nimport { UC_BLUE_LIGHT, UC_BRAND_BLUE } from \"../constants.mjs\";\nimport { compact, sourceColor, sourceLabel } from \"../format.mjs\";\n\nexport function ResumeTargetPanel({ snapshot, width }) {\n const picker = snapshot.resumeTargetPicker ?? {};\n const options = picker.options ?? [];\n const selectedIndex = Math.max(\n Math.min(picker.selectedIndex ?? 0, Math.max(options.length - 1, 0)),\n 0\n );\n const source = sourceLabel(picker.source || \"unknown\");\n const contextId = compact(picker.contextId ?? \"-\", 42);\n\n return React.createElement(\n TitledBox,\n {\n key: `resume-target:${width}:${options.length}`,\n borderStyle: \"single\",\n titles: [\"Continue Conversation\"],\n titleJustify: \"flex-start\",\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width,\n },\n React.createElement(Text, { color: \"white\", bold: true }, \"Continue selected context in:\"),\n React.createElement(\n Text,\n { color: \"gray\" },\n `source=${source} id=${contextId}`\n ),\n React.createElement(Box, { height: 1 }),\n ...options.map((option, index) => {\n const selected = index === selectedIndex;\n return React.createElement(\n Text,\n { key: `resume-target-option-${option.id}`, color: selected ? UC_BLUE_LIGHT : \"white\" },\n selected ? \"[•]\" : \"[ ]\",\n \" \",\n React.createElement(Text, { color: sourceColor(option.id), bold: true }, option.label)\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, `Choose: ↑/↓, ${options.map((_, i) => i + 1).join(\"/\")} or Enter`),\n React.createElement(Text, { color: \"gray\" }, \"Cancel: Esc or ←\")\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\n\nimport { UC_BLUE_LIGHT, UC_BRAND_BLUE } from \"../constants.mjs\";\n\nexport function UpdatePromptPanel({ snapshot, width }) {\n const prompt = snapshot.updatePrompt ?? {};\n const options = prompt.options ?? [];\n const selectedIndex = Math.max(\n Math.min(prompt.selectedIndex ?? 0, Math.max(options.length - 1, 0)),\n 0\n );\n const current = snapshot.currentVersion ?? \"?\";\n const latest = prompt.latestVersion ?? \"?\";\n\n return React.createElement(\n TitledBox,\n {\n key: `update-prompt:${width}`,\n borderStyle: \"single\",\n titles: [\"Update Available\"],\n titleJustify: \"flex-start\",\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width,\n },\n React.createElement(\n Text,\n { color: \"white\", bold: true },\n `New version available: `,\n React.createElement(Text, { color: \"gray\" }, `v${current}`),\n ` → `,\n React.createElement(Text, { color: \"green\", bold: true }, `v${latest}`)\n ),\n React.createElement(Box, { height: 1 }),\n ...options.map((option, index) => {\n const selected = index === selectedIndex;\n return React.createElement(\n Text,\n { key: `update-option-${option.id}`, color: selected ? UC_BLUE_LIGHT : \"white\" },\n selected ? \"[•]\" : \"[ ]\",\n ` ${index + 1}. ${option.label}`\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Choose: ↑/↓, 1/2 or Enter\")\n );\n}\n","import React from \"react\";\nimport { Box, Text, useInput, useStdout } from \"ink\";\n\nimport { UC_BLUE_LIGHT, UC_BRAND_BLUE } from \"./constants.mjs\";\nimport { computeTuiLayout } from \"./layout.mjs\";\nimport { buildMoveMenuIndex, createInputHandler } from \"./input.mjs\";\nimport { fitToWidth } from \"./format.mjs\";\nimport { footerHelpText, selectedTabIndexFromId } from \"./state.mjs\";\nimport { NarrowWidthPanel } from \"./components/index.mjs\";\nimport { BootstrapPanel, HeaderPanel, MainPanels, ResumeTargetPanel, UpdatePromptPanel } from \"./panels/index.mjs\";\n\nconst FOOTER_QUIPS = [\n \"Who is John Galt?\",\n \"ultrathink -> ultracontext\",\n \"Welcome to the beginning of infinity.\",\n \"Our job is to take the jobs.\",\n];\n\nfunction renderFooterQuip(quip) {\n const token = \"ultrathink\";\n const lower = String(quip ?? \"\").toLowerCase();\n const index = lower.indexOf(token);\n if (index < 0) {\n return React.createElement(Text, { color: \"gray\", bold: true }, quip);\n }\n\n const before = quip.slice(0, index);\n const match = quip.slice(index, index + token.length);\n const after = quip.slice(index + token.length);\n\n return React.createElement(\n Box,\n { flexDirection: \"row\", flexShrink: 0 },\n before ? React.createElement(Text, { key: \"quip-before\", color: \"gray\", bold: true }, before) : null,\n React.createElement(Text, { key: \"quip-strike\", color: \"gray\", bold: true, strikethrough: true }, match),\n after ? React.createElement(Text, { key: \"quip-after\", color: \"gray\", bold: true }, after) : null\n );\n}\n\nfunction renderMainFrameTop(width, title) {\n const safeWidth = Math.max(Number(width) || 0, 4);\n const innerWidth = Math.max(safeWidth - 2, 1);\n const paddedTitle = ` ${title} `;\n const shownTitle = fitToWidth(paddedTitle, innerWidth);\n const fillWidth = Math.max(innerWidth - shownTitle.length, 0);\n\n return React.createElement(\n Text,\n { color: UC_BRAND_BLUE, wrap: \"truncate-end\" },\n \"┌\",\n React.createElement(Text, { color: UC_BLUE_LIGHT, bold: true }, shownTitle),\n \"─\".repeat(fillWidth),\n \"┐\"\n );\n}\n\nexport function DaemonTui({ snapshot, actions }) {\n const { stdout } = useStdout();\n const [terminalSize, setTerminalSize] = React.useState(() => ({\n cols: stdout?.columns ?? process.stdout.columns ?? 120,\n rows: stdout?.rows ?? process.stdout.rows ?? 40,\n }));\n\n React.useEffect(() => {\n const target = stdout ?? process.stdout;\n if (!target) return;\n\n const update = () => {\n const next = {\n cols: Math.max(target.columns ?? process.stdout.columns ?? 120, 1),\n rows: Math.max(target.rows ?? process.stdout.rows ?? 40, 1),\n };\n setTerminalSize((current) => (current.cols === next.cols && current.rows === next.rows ? current : next));\n };\n\n update();\n target.on?.(\"resize\", update);\n return () => {\n if (typeof target.off === \"function\") {\n target.off(\"resize\", update);\n } else if (typeof target.removeListener === \"function\") {\n target.removeListener(\"resize\", update);\n }\n };\n }, [stdout]);\n\n const stdoutColumns = terminalSize.cols;\n const stdoutRows = terminalSize.rows;\n const layout = computeTuiLayout(stdoutColumns, stdoutRows);\n const selectedTabIndex = selectedTabIndexFromId(snapshot.selectedTab);\n\n const updatePromptActive = Boolean(snapshot.updatePrompt?.active);\n const bootstrapActive = Boolean(snapshot.bootstrap?.active);\n const resumeTargetPickerActive = Boolean(snapshot.resumeTargetPicker?.active);\n const [focusMode, setFocusMode] = React.useState(\"menu\");\n const [menuIndex, setMenuIndex] = React.useState(selectedTabIndex);\n const [quipIndex, setQuipIndex] = React.useState(0);\n\n React.useEffect(() => {\n if (focusMode === \"menu\") setMenuIndex(selectedTabIndex);\n }, [focusMode, selectedTabIndex]);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setQuipIndex((current) => (current + 1) % FOOTER_QUIPS.length);\n }, 3800);\n return () => clearInterval(timer);\n }, []);\n\n const moveMenuIndex = React.useMemo(() => buildMoveMenuIndex(actions, setMenuIndex), [actions]);\n\n useInput(\n createInputHandler({\n snapshot,\n actions,\n focusMode,\n menuIndex,\n selectedTabIndex,\n setFocusMode,\n setMenuIndex,\n moveMenuIndex,\n bootstrapActive,\n updatePromptActive,\n resumeTargetPickerActive,\n })\n );\n\n const clients = Array.isArray(snapshot.onlineClients) ? snapshot.onlineClients : [];\n\n if (layout.isNarrowWidth) {\n return React.createElement(NarrowWidthPanel, {\n minWideCols: layout.minWideCols,\n narrowWidth: layout.narrowWidth,\n stdoutColumns,\n });\n }\n\n const bodyContent = updatePromptActive\n ? React.createElement(UpdatePromptPanel, { snapshot, width: layout.contentWidth })\n : bootstrapActive\n ? React.createElement(BootstrapPanel, { snapshot, width: layout.contentWidth })\n : resumeTargetPickerActive\n ? React.createElement(ResumeTargetPanel, { snapshot, width: layout.contentWidth })\n : React.createElement(MainPanels, { snapshot, layout, focusMode, menuIndex, clients });\n\n const footerLeft = footerHelpText({\n updatePromptActive,\n bootstrapActive,\n resumeTargetPickerActive,\n detailViewActive: Boolean(snapshot.detailView?.active),\n selectedTab: snapshot.selectedTab,\n focusMode,\n });\n const footerWidth = Math.max(layout.containerWidth, 24);\n const quipRaw = FOOTER_QUIPS[quipIndex % FOOTER_QUIPS.length];\n const quip = fitToWidth(quipRaw, Math.max(Math.floor(footerWidth * 0.48), 18));\n const leftMax = Math.max(footerWidth - quip.length - 2, 12);\n const left = fitToWidth(footerLeft, leftMax);\n const gap = \" \".repeat(Math.max(footerWidth - left.length - quip.length, 1));\n const footerRule = \"─\".repeat(Math.max(footerWidth, 1));\n\n return React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Box, { width: layout.containerWidth }, renderMainFrameTop(\n layout.containerWidth,\n snapshot.updateAvailable\n ? `UltraContext v${snapshot.currentVersion} ↑`\n : `UltraContext v${snapshot.currentVersion}`\n )),\n React.createElement(\n Box,\n {\n borderStyle: \"single\",\n borderTop: false,\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 0,\n paddingY: 0,\n width: layout.containerWidth,\n },\n React.createElement(HeaderPanel, { snapshot, stdoutColumns: layout.contentWidth }),\n bodyContent\n ),\n React.createElement(\n Box,\n { width: footerWidth, flexDirection: \"column\" },\n React.createElement(Text, { color: \"gray\", dim: true, wrap: \"truncate-end\" }, footerRule),\n React.createElement(\n Box,\n { width: footerWidth, flexDirection: \"row\" },\n React.createElement(\n Text,\n { color: \"gray\", wrap: \"truncate-end\" },\n `${left}${gap}`\n ),\n renderFooterQuip(quip)\n )\n )\n );\n}\n","import React from \"react\";\nimport { render } from \"ink\";\n\nimport { DaemonTui } from \"./DaemonTui.mjs\";\n\nexport function createInkUiController({ getSnapshot, actions }) {\n let app = null;\n let lastCols = null;\n let lastRows = null;\n const view = () => React.createElement(DaemonTui, { snapshot: getSnapshot(), actions });\n\n const readDims = () => ({\n cols: process.stdout.columns ?? 0,\n rows: process.stdout.rows ?? 0,\n });\n\n return {\n start() {\n if (app) return;\n app = render(view(), { exitOnCtrlC: false });\n const dims = readDims();\n lastCols = dims.cols;\n lastRows = dims.rows;\n },\n refresh() {\n if (!app) return;\n const dims = readDims();\n const sizeChanged = dims.cols !== lastCols || dims.rows !== lastRows;\n if (sizeChanged && typeof app.clear === \"function\") {\n app.clear();\n }\n lastCols = dims.cols;\n lastRows = dims.rows;\n app.rerender(view());\n },\n stop() {\n if (!app) return;\n app.unmount();\n app = null;\n lastCols = null;\n lastRows = null;\n },\n };\n}\n","import crypto from \"node:crypto\";\n\n// shared utils from harness\nexport { expandHome, truncateString, safeJsonParse, extractSessionIdFromPath } from \"@ultracontext/parsers/utils\";\n\nexport function sha256(value) {\n return crypto.createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function toInt(value, fallback) {\n const parsed = Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport function boolFromEnv(value, fallback = false) {\n if (value === undefined) return fallback;\n const normalized = String(value).trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n return fallback;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { DAEMON_WS_MESSAGE_TYPES, parseDaemonWsMessage } from \"@ultracontext/protocol\";\nimport WebSocket from \"ws\";\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeParseMessage(raw) {\n return parseDaemonWsMessage(String(raw ?? \"\"), null);\n}\n\nfunction errorMessage(error, fallback = \"unknown_error\") {\n if (!error) return fallback;\n if (error instanceof Error && error.message) return error.message;\n return String(error);\n}\n\nfunction isPidAlive(pid) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (error?.code === \"EPERM\") return true;\n if (error?.code === \"ESRCH\") return false;\n return false;\n }\n}\n\nasync function readDaemonInfoFile(infoFilePath) {\n const resolved = path.resolve(infoFilePath);\n const raw = await fs.readFile(resolved, \"utf8\");\n const parsed = JSON.parse(raw);\n const port = Number.parseInt(String(parsed?.port ?? \"\"), 10);\n if (!Number.isInteger(port) || port <= 0) {\n throw new Error(\"invalid daemon info file\");\n }\n const pid = Number.parseInt(String(parsed?.pid ?? \"\"), 10) || 0;\n if (pid > 1 && !isPidAlive(pid)) {\n try {\n await fs.unlink(resolved);\n } catch {\n // ignore stale info cleanup failures\n }\n throw new Error(\"stale daemon info file\");\n }\n return {\n port,\n pid,\n startedAt: String(parsed?.startedAt ?? \"\"),\n host: String(parsed?.host ?? \"\"),\n };\n}\n\nexport function createDaemonWsClient({\n host = \"127.0.0.1\",\n infoFilePath,\n portFilePath,\n onMessage = () => {},\n onStatus = () => {},\n onError = () => {},\n} = {}) {\n const discoveryFilePath = infoFilePath ?? portFilePath;\n let ws = null;\n let stopped = false;\n let reconnectAttempt = 0;\n let connectLoopRunning = false;\n let requestSeq = 0;\n const pendingRequests = new Map();\n\n const settlePending = (requestId, payload) => {\n if (!pendingRequests.has(requestId)) return false;\n const pending = pendingRequests.get(requestId);\n pendingRequests.delete(requestId);\n pending.resolve(payload);\n return true;\n };\n\n const rejectPending = (requestId, error) => {\n if (!pendingRequests.has(requestId)) return false;\n const pending = pendingRequests.get(requestId);\n pendingRequests.delete(requestId);\n pending.reject(error);\n return true;\n };\n\n async function connectOnce() {\n if (!discoveryFilePath) {\n throw new Error(\"daemon info file path is required\");\n }\n\n const info = await readDaemonInfoFile(discoveryFilePath);\n const url = `ws://${host}:${info.port}`;\n\n await new Promise((resolve, reject) => {\n const socket = new WebSocket(url);\n ws = socket;\n\n socket.once(\"open\", () => {\n reconnectAttempt = 0;\n onStatus({ connected: true, url, pid: info.pid, port: info.port });\n resolve();\n });\n\n socket.once(\"error\", (error) => {\n reject(error);\n });\n\n socket.on(\"message\", (raw) => {\n const msg = safeParseMessage(raw);\n if (!msg || typeof msg !== \"object\") return;\n\n if (msg.type === DAEMON_WS_MESSAGE_TYPES.PING) {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: DAEMON_WS_MESSAGE_TYPES.PONG, data: { ts: Date.now() } }));\n }\n return;\n }\n\n if (msg.type === DAEMON_WS_MESSAGE_TYPES.REQUEST_ACK && msg.id) {\n if (msg.ok) {\n settlePending(msg.id, msg.data ?? {});\n } else {\n rejectPending(msg.id, new Error(String(msg.error ?? \"request_failed\")));\n }\n return;\n }\n\n onMessage(msg);\n });\n\n socket.on(\"close\", () => {\n onStatus({ connected: false });\n for (const [id, pending] of pendingRequests.entries()) {\n pending.reject(new Error(\"socket_closed\"));\n pendingRequests.delete(id);\n }\n if (!stopped) {\n void ensureConnectedLoop();\n }\n });\n });\n }\n\n async function ensureConnectedLoop() {\n if (connectLoopRunning || stopped) return;\n connectLoopRunning = true;\n try {\n while (!stopped) {\n try {\n if (ws && ws.readyState === WebSocket.OPEN) return;\n await connectOnce();\n return;\n } catch (error) {\n onError(error);\n reconnectAttempt += 1;\n const delay = Math.min(1000 * (2 ** Math.min(reconnectAttempt - 1, 3)), 10000);\n await sleep(delay);\n }\n }\n } finally {\n connectLoopRunning = false;\n }\n }\n\n return {\n async start() {\n stopped = false;\n await ensureConnectedLoop();\n },\n async stop() {\n stopped = true;\n if (ws) {\n try {\n ws.close();\n } catch {\n // ignore\n }\n ws = null;\n }\n },\n isConnected() {\n return Boolean(ws && ws.readyState === WebSocket.OPEN);\n },\n send(type, data = {}) {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"socket_not_connected\");\n }\n ws.send(JSON.stringify({ type, data }));\n },\n request(type, data = {}, timeoutMs = 8000) {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"socket_not_connected\"));\n }\n requestSeq += 1;\n const requestId = `req_${Date.now()}_${requestSeq}`;\n ws.send(JSON.stringify({ id: requestId, type, data }));\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error(\"request_timeout\"));\n }, timeoutMs);\n pendingRequests.set(requestId, {\n resolve: (payload) => {\n clearTimeout(timer);\n resolve(payload);\n },\n reject: (error) => {\n clearTimeout(timer);\n reject(error);\n },\n });\n });\n },\n formatError(error) {\n return errorMessage(error);\n },\n };\n}\n","// tui core — exported as tuiBoot(), no env.mjs import (caller handles that)\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { UltraContext } from \"ultracontext\";\nimport {\n DAEMON_WS_MESSAGE_TYPES,\n normalizeBootstrapMode,\n resolveDaemonWsHost,\n resolveDaemonWsInfoFile,\n} from \"@ultracontext/protocol\";\n\nimport {\n hasLocalClaudeSession,\n hasLocalCodexSession,\n writeClaudeSession,\n writeCodexSession,\n} from \"@ultracontext/parsers\";\nimport { MENU_TABS, createInkUiController } from \"./ui.mjs\";\nimport { boolFromEnv, expandHome, toInt } from \"./utils.mjs\";\nimport { createDaemonWsClient } from \"./ws-client.mjs\";\n\nconst DEFAULT_RUNTIME_CONFIG_FILE = \"~/.ultracontext/config.json\";\n\n// ── exported boot function ──────────────────────────────────────\n\nexport async function tuiBoot({\n assetsRoot,\n offlineNotice,\n onFatalError,\n} = {}) {\n\nconst APP_ROOT = assetsRoot ?? path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\");\nconst DEFAULT_STARTUP_SOUND_FILE = path.join(APP_ROOT, \"assets\", \"sounds\", \"hello_mf.mp3\");\nconst DEFAULT_CONTEXT_SOUND_FILE = path.join(APP_ROOT, \"assets\", \"sounds\", \"quack.mp3\");\nconst OFFLINE_NOTICE = offlineNotice ?? \"Daemon offline. Run: pnpm --filter @ultracontext/daemon run start\";\n\nconst CONFIG_BOOTSTRAP_MODES = [\n { id: \"prompt\", label: \"Ask on startup\" },\n { id: \"new_only\", label: \"New only\" },\n { id: \"last_24h\", label: \"Last 24h\" },\n { id: \"all\", label: \"All\" },\n];\nconst CONFIG_RESUME_TERMINALS = [\n { id: \"terminal\", label: \"Terminal\" },\n { id: \"warp\", label: \"Warp\" },\n];\nconst RESUME_TARGET_OPTIONS = [\n { id: \"claude\", label: \"Claude Code\" },\n { id: \"codex\", label: \"Codex\" },\n];\nconst INSPECT_OPTION = { id: \"inspect\", label: \"Inspect messages\" };\nconst PERSISTED_CONFIG_FIELDS = [\n \"soundEnabled\",\n \"startupSoundEnabled\",\n \"contextSoundEnabled\",\n \"bootstrapMode\",\n \"resumeTerminal\",\n \"claudeIncludeSubagents\",\n \"resumeOpenTab\",\n \"startupGreetingFile\",\n \"contextCreatedSoundFile\",\n];\n\nfunction normalizeApiKey(raw) {\n if (!raw) return \"\";\n return String(raw).trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction normalizeResumeSourceFilter(raw) {\n const value = String(raw ?? \"all\").trim().toLowerCase();\n if (value === \"codex\" || value === \"claude\" || value === \"openclaw\" || value === \"all\") return value;\n return \"all\";\n}\n\nfunction normalizeResumeTerminal(raw) {\n const value = String(raw ?? \"terminal\").trim().toLowerCase();\n if (value === \"warp\") return \"warp\";\n return \"terminal\";\n}\n\nfunction resolveRuntimeConfigPath() {\n return expandHome(process.env.ULTRACONTEXT_CONFIG_FILE ?? DEFAULT_RUNTIME_CONFIG_FILE);\n}\n\nfunction normalizeBootstrapModeWithPrompt(raw) {\n return normalizeBootstrapMode(raw, { allowPrompt: true }) || \"\";\n}\n\nfunction readEnv(...keys) {\n for (const key of keys) {\n if (process.env[key] !== undefined) return process.env[key];\n }\n return undefined;\n}\n\nconst cfg = {\n apiKey: normalizeApiKey(process.env.ULTRACONTEXT_API_KEY),\n baseUrl: (process.env.ULTRACONTEXT_BASE_URL ?? \"https://api.ultracontext.ai\").trim(),\n daemonWsHost: resolveDaemonWsHost(process.env),\n daemonWsInfoFile: resolveDaemonWsInfoFile(process.env),\n userId: process.env.DAEMON_USER_ID ?? process.env.USER ?? \"unknown-user\",\n host: (process.env.DAEMON_HOST || os.hostname() || \"unknown-host\").trim(),\n uiRefreshMs: toInt(process.env.TUI_REFRESH_MS, 1200),\n resumeAutoRefreshMs: Math.max(toInt(process.env.RESUME_AUTO_REFRESH_MS, 3500), 0),\n uiRecentLimit: toInt(process.env.TUI_RECENT_LIMIT, 240),\n configFile: resolveRuntimeConfigPath(),\n soundEnabled: boolFromEnv(readEnv(\"TUI_SOUND_ENABLED\", \"DAEMON_SOUND_ENABLED\"), true),\n startupSoundEnabled: boolFromEnv(\n readEnv(\"TUI_STARTUP_SOUND_ENABLED\", \"DAEMON_STARTUP_SOUND_ENABLED\"),\n true\n ),\n contextSoundEnabled: boolFromEnv(\n readEnv(\"TUI_CONTEXT_SOUND_ENABLED\", \"DAEMON_CONTEXT_SOUND_ENABLED\"),\n true\n ),\n startupGreetingFile: expandHome(\n readEnv(\"TUI_STARTUP_SOUND_FILE\", \"DAEMON_STARTUP_GREETING_FILE\") ?? DEFAULT_STARTUP_SOUND_FILE\n ),\n contextCreatedSoundFile: expandHome(\n readEnv(\"TUI_CONTEXT_SOUND_FILE\", \"DAEMON_CONTEXT_SOUND_FILE\") ?? DEFAULT_CONTEXT_SOUND_FILE\n ),\n bootstrapMode: normalizeBootstrapModeWithPrompt(process.env.DAEMON_BOOTSTRAP_MODE ?? \"prompt\") || \"prompt\",\n bootstrapReset: boolFromEnv(process.env.DAEMON_BOOTSTRAP_RESET, false),\n claudeIncludeSubagents: boolFromEnv(process.env.CLAUDE_INCLUDE_SUBAGENTS, false),\n resumeTerminal: normalizeResumeTerminal(process.env.RESUME_TERMINAL),\n resumeContextLimit: toInt(process.env.RESUME_CONTEXT_LIMIT, 1000),\n resumeSourceFilter: normalizeResumeSourceFilter(process.env.RESUME_SOURCE_FILTER),\n resumeSummaryTail: toInt(process.env.RESUME_SUMMARY_TAIL, 14),\n resumeOutputDir: expandHome(process.env.RESUME_OUTPUT_DIR ?? \"~/.codex/resume\"),\n resumeOpenTab: boolFromEnv(process.env.RESUME_OPEN_TAB, true),\n};\n\nconst stats = {\n startedAt: Date.now(),\n cycles: 0,\n filesScanned: 0,\n linesRead: 0,\n parsedEvents: 0,\n appended: 0,\n deduped: 0,\n contextsCreated: 0,\n errors: 0,\n};\n\nconst CONFIG_TOGGLES = [\n {\n key: \"soundEnabled\",\n label: \"Master sounds\",\n description: \"Enable or disable all app sounds\",\n },\n {\n key: \"startupSoundEnabled\",\n label: \"Startup sounds\",\n description: \"Play sound when the TUI starts\",\n },\n {\n key: \"contextSoundEnabled\",\n label: \"Context sounds\",\n description: \"Play duck sound when the TUI detects a new context\",\n },\n];\n\n// ── update check helpers ─────────────────────────────────────────\n\nconst UPDATE_CHECK_INTERVAL = 3 * 60 * 60 * 1000; // 3h\n\nfunction readTuiVersion() {\n try {\n const pkgPath = path.resolve(APP_ROOT, \"package.json\");\n const pkg = JSON.parse(fsSync.readFileSync(pkgPath, \"utf8\"));\n return pkg.version ?? \"unknown\";\n } catch { return \"unknown\"; }\n}\n\nfunction getUpdateCheckPath() {\n return path.join(os.homedir(), \".ultracontext\", \"update-check.json\");\n}\n\nfunction readUpdateCache() {\n try { return JSON.parse(fsSync.readFileSync(getUpdateCheckPath(), \"utf8\")); }\n catch { return null; }\n}\n\nfunction writeUpdateCache(data) {\n try { fsSync.writeFileSync(getUpdateCheckPath(), JSON.stringify(data)); }\n catch { /* best effort */ }\n}\n\nasync function fetchLatestVersion() {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n try {\n const res = await fetch(\"https://registry.npmjs.org/ultracontext/latest\", { signal: controller.signal });\n const data = await res.json();\n return data.version ?? null;\n } catch { return null; }\n finally { clearTimeout(timeout); }\n}\n\nfunction isNewerVersion(latest, current) {\n const l = latest.split(\".\").map(Number);\n const c = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] ?? 0) > (c[i] ?? 0)) return true;\n if ((l[i] ?? 0) < (c[i] ?? 0)) return false;\n }\n return false;\n}\n\nasync function checkForUpdateSilent() {\n const current = readTuiVersion();\n if (current === \"unknown\") return;\n\n const notifyUpdate = (latest) => {\n ui.updateAvailable = latest;\n ui.updatePrompt.active = true;\n ui.updatePrompt.selectedIndex = 0;\n ui.updatePrompt.latestVersion = latest;\n renderDashboard();\n };\n\n // use cache if fresh\n const cache = readUpdateCache();\n if (cache?.lastCheck && Date.now() - cache.lastCheck < UPDATE_CHECK_INTERVAL) {\n if (cache.latestVersion && isNewerVersion(cache.latestVersion, current)) {\n notifyUpdate(cache.latestVersion);\n }\n return;\n }\n\n // fetch from registry\n const latest = await fetchLatestVersion();\n writeUpdateCache({ lastCheck: Date.now(), latestVersion: latest });\n if (latest && isNewerVersion(latest, current)) {\n notifyUpdate(latest);\n }\n}\n\nconst UPDATE_PROMPT_OPTIONS = [\n { id: \"install\", label: \"Install now\" },\n { id: \"skip\", label: \"Skip\" },\n];\n\nconst ui = {\n daemonOnline: false,\n currentVersion: readTuiVersion(),\n updateAvailable: \"\",\n updatePrompt: {\n active: false,\n selectedIndex: 0,\n latestVersion: \"\",\n },\n recentLogs: [],\n onlineClients: [],\n sourceStats: new Map(),\n sourceOrder: [],\n selectedTab: \"logs\",\n configEditor: {\n selectedIndex: 0,\n },\n resume: {\n loading: false,\n syncing: false,\n contexts: [],\n selectedIndex: 0,\n loadedAt: 0,\n error: \"\",\n notice: \"\",\n summaryPath: \"\",\n command: \"\",\n commandPath: \"\",\n },\n detailView: {\n active: false,\n contextId: null,\n contextMeta: null,\n messages: [],\n scrollOffset: 0,\n lineOffset: 0,\n loading: false,\n error: null,\n },\n resumeTargetPicker: {\n active: false,\n selectedIndex: 0,\n source: \"\",\n contextId: \"\",\n options: RESUME_TARGET_OPTIONS,\n recommendedTarget: \"\",\n },\n bootstrap: {\n active: false,\n selectedIndex: 0,\n options: [],\n sourceNames: [],\n note: \"\",\n },\n};\n\nconst runtime = {\n daemonClient: null,\n uc: null,\n uiController: null,\n renderTimer: null,\n contextRefreshTimer: null,\n stop: null,\n seenLogSignatures: new Set(),\n seenLogQueue: [],\n initialLogsSeeded: false,\n syncCount: 0,\n resumeKnownContextIds: new Set(),\n resumeBaselineReady: false,\n};\n\nconst sound = { startupFile: \"\", contextFile: \"\", warnedNonDarwin: false };\n\nfunction ensureSourceStats(sourceName) {\n if (!ui.sourceStats.has(sourceName)) {\n ui.sourceStats.set(sourceName, {\n filesScanned: 0,\n linesRead: 0,\n parsedEvents: 0,\n appended: 0,\n deduped: 0,\n contextsCreated: 0,\n errors: 0,\n lastEventType: \"-\",\n lastSessionId: \"-\",\n lastAt: 0,\n lastFile: \"-\",\n });\n }\n return ui.sourceStats.get(sourceName);\n}\n\nfunction runtimeLogsKeep() {\n return Math.max(cfg.uiRecentLimit, 180);\n}\n\nfunction formatTime(value = Date.now()) {\n return new Date(value).toISOString().slice(11, 19);\n}\n\nfunction errorDetails(error) {\n if (!error || typeof error !== \"object\") {\n return { message: String(error) };\n }\n\n const details = {\n message: error.message ?? String(error),\n };\n\n if (\"status\" in error) details.status = error.status;\n if (\"url\" in error) details.url = error.url;\n if (\"bodyText\" in error) details.bodyText = error.bodyText;\n return details;\n}\n\nfunction renderDashboard() {\n runtime.uiController?.refresh();\n}\n\nfunction applyRemoteRuntimeSnapshot(snapshot) {\n if (!snapshot || typeof snapshot !== \"object\") return false;\n\n const remoteStats = snapshot.stats;\n if (remoteStats && typeof remoteStats === \"object\") {\n Object.assign(stats, remoteStats);\n }\n\n const sourceStats = Array.isArray(snapshot.sourceStats) ? snapshot.sourceStats : [];\n ui.sourceOrder = [];\n ui.sourceStats.clear();\n\n for (const item of sourceStats) {\n const name = String(item?.name ?? \"\").trim();\n if (!name) continue;\n ui.sourceOrder.push(name);\n ui.sourceStats.set(name, {\n filesScanned: Number(item.filesScanned ?? 0),\n linesRead: Number(item.linesRead ?? 0),\n parsedEvents: Number(item.parsedEvents ?? 0),\n appended: Number(item.appended ?? 0),\n deduped: Number(item.deduped ?? 0),\n contextsCreated: Number(item.contextsCreated ?? 0),\n errors: Number(item.errors ?? 0),\n lastEventType: item.lastEventType ?? \"-\",\n lastSessionId: item.lastSessionId ?? \"-\",\n lastAt: Number(item.lastAt ?? 0),\n lastFile: item.lastFile ?? \"-\",\n });\n }\n\n const online = Boolean(snapshot.running);\n if (!online) {\n ui.onlineClients = [];\n return false;\n }\n\n const host = String(snapshot.host ?? cfg.host);\n const userId = String(snapshot.userId ?? cfg.userId);\n const ts = Number(snapshot.ts ?? Date.now());\n const clientCountRaw = Number(snapshot.clients ?? 1);\n const clientCount = Number.isFinite(clientCountRaw) && clientCountRaw > 0 ? Math.floor(clientCountRaw) : 1;\n\n ui.onlineClients = Array.from({ length: clientCount }, () => ({\n host,\n userId,\n ts,\n }));\n\n return true;\n}\n\nfunction logSignature(entry) {\n return `${entry.ts}|${entry.level}|${entry.source}|${entry.text}`;\n}\n\nfunction trackSeenLogSignature(signature) {\n if (runtime.seenLogSignatures.has(signature)) return;\n runtime.seenLogSignatures.add(signature);\n runtime.seenLogQueue.push(signature);\n\n const maxSize = 4000;\n while (runtime.seenLogQueue.length > maxSize) {\n const removed = runtime.seenLogQueue.shift();\n if (removed) runtime.seenLogSignatures.delete(removed);\n }\n}\n\nfunction normalizeLogEntry(item) {\n if (!item || typeof item !== \"object\") return null;\n if (!item.ts || !item.level) return null;\n return {\n ts: String(item.ts),\n level: String(item.level),\n source: String(item.source ?? \"\"),\n text: String(item.text ?? \"\"),\n };\n}\n\nfunction applyRemoteLogsSnapshot(list) {\n const parsed = [];\n for (const raw of list ?? []) {\n const entry = normalizeLogEntry(raw);\n if (!entry) continue;\n parsed.push(entry);\n }\n\n const newEntries = [];\n for (const entry of parsed) {\n const signature = logSignature(entry);\n if (runtime.initialLogsSeeded && !runtime.seenLogSignatures.has(signature)) {\n newEntries.push(entry);\n }\n trackSeenLogSignature(signature);\n }\n\n if (!runtime.initialLogsSeeded) {\n runtime.initialLogsSeeded = true;\n }\n\n ui.recentLogs = parsed.slice(-runtimeLogsKeep());\n return newEntries;\n}\n\nfunction appendRemoteLogEntry(raw) {\n const entry = normalizeLogEntry(raw);\n if (!entry) return null;\n\n const signature = logSignature(entry);\n if (runtime.seenLogSignatures.has(signature)) return null;\n\n trackSeenLogSignature(signature);\n ui.recentLogs.push(entry);\n while (ui.recentLogs.length > runtimeLogsKeep()) {\n ui.recentLogs.shift();\n }\n return entry;\n}\n\nfunction setDaemonOfflineNotice(notice = OFFLINE_NOTICE) {\n ui.daemonOnline = false;\n ui.sourceOrder = [];\n ui.sourceStats.clear();\n ui.onlineClients = [];\n\n if (!ui.resume.notice || ui.resume.notice === OFFLINE_NOTICE || ui.resume.notice.startsWith(\"Daemon offline\")) {\n ui.resume.notice = notice;\n }\n\n const alreadyHasOffline = ui.recentLogs.some((entry) => entry.text === OFFLINE_NOTICE);\n if (!alreadyHasOffline) {\n ui.recentLogs.push({\n ts: formatTime(),\n level: \"warn\",\n source: \"\",\n text: OFFLINE_NOTICE,\n });\n }\n\n while (ui.recentLogs.length > runtimeLogsKeep()) {\n ui.recentLogs.shift();\n }\n}\n\nfunction clearDaemonOfflineNotice() {\n if (ui.resume.notice === OFFLINE_NOTICE || ui.resume.notice.startsWith(\"Daemon offline\")) {\n ui.resume.notice = \"\";\n }\n}\n\nfunction applyDaemonConfig(config) {\n if (!config || typeof config !== \"object\") return;\n\n if (\"bootstrapMode\" in config) {\n const normalized = normalizeBootstrapModeWithPrompt(config.bootstrapMode);\n if (normalized) cfg.bootstrapMode = normalized;\n }\n\n if (\"claudeIncludeSubagents\" in config) {\n cfg.claudeIncludeSubagents = Boolean(config.claudeIncludeSubagents);\n }\n}\n\nasync function sendDaemonCommand(type, data = {}, timeoutMs = 8000) {\n if (!runtime.daemonClient || !runtime.daemonClient.isConnected()) {\n return { sent: false, reason: \"daemon_offline\" };\n }\n\n const response = await runtime.daemonClient.request(type, data, timeoutMs);\n if (response?.config) {\n applyDaemonConfig(response.config);\n }\n\n return { sent: true, response };\n}\n\nasync function requestDaemonConfig() {\n try {\n const result = await sendDaemonCommand(DAEMON_WS_MESSAGE_TYPES.CONFIG_GET, {});\n if (result.sent && result.response?.config) {\n applyDaemonConfig(result.response.config);\n renderDashboard();\n }\n } catch {\n // ignore one-off config request errors\n }\n}\n\nfunction handleDaemonWsMessage(message) {\n if (!message || typeof message !== \"object\") return;\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.SNAPSHOT) {\n const payload = message.data ?? {};\n const wasOnline = ui.daemonOnline;\n ui.daemonOnline = applyRemoteRuntimeSnapshot(payload.state);\n const recentLogs = Array.isArray(payload.recentLogs) ? payload.recentLogs : payload.logs;\n const newLogEntries = applyRemoteLogsSnapshot(recentLogs);\n applyDaemonConfig(payload.config);\n\n if (!ui.daemonOnline) {\n setDaemonOfflineNotice();\n } else {\n clearDaemonOfflineNotice();\n if (runtime.syncCount > 0 && !wasOnline) {\n ui.resume.notice = \"Daemon reconnected.\";\n }\n }\n\n runtime.syncCount += 1;\n renderDashboard();\n return;\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.STATE) {\n const wasOnline = ui.daemonOnline;\n ui.daemonOnline = applyRemoteRuntimeSnapshot(message.data);\n if (!ui.daemonOnline) {\n setDaemonOfflineNotice();\n } else {\n clearDaemonOfflineNotice();\n if (runtime.syncCount > 0 && !wasOnline) {\n ui.resume.notice = \"Daemon reconnected.\";\n }\n }\n runtime.syncCount += 1;\n renderDashboard();\n return;\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.LOG) {\n const appended = appendRemoteLogEntry(message.data);\n void appended;\n renderDashboard();\n return;\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONFIG_STATE) {\n applyDaemonConfig(message.data);\n renderDashboard();\n return;\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONTEXT_EVENT) {\n // TUI-driven context sound is based on API context list diffs, not daemon events.\n return;\n }\n}\n\nfunction handleDaemonWsStatus(status) {\n if (status?.connected) {\n ui.daemonOnline = true;\n clearDaemonOfflineNotice();\n void requestDaemonConfig();\n renderDashboard();\n return;\n }\n\n setDaemonOfflineNotice();\n renderDashboard();\n}\n\nfunction handleDaemonWsError(error) {\n if (ui.daemonOnline) return;\n\n const formatter = runtime.daemonClient?.formatError?.bind(runtime.daemonClient);\n const message = formatter ? formatter(error) : String(error ?? \"\");\n\n if (\n message.includes(\"ENOENT\") ||\n message.includes(\"invalid daemon info file\") ||\n message.includes(\"invalid port file\") ||\n message.includes(\"stale daemon info file\")\n ) {\n setDaemonOfflineNotice();\n } else {\n setDaemonOfflineNotice(`${OFFLINE_NOTICE} (${message})`);\n }\n\n renderDashboard();\n}\n\nfunction resumeCompact(value, max = 60) {\n const raw = String(value ?? \"\");\n if (raw.length <= max) return raw;\n if (max <= 3) return raw.slice(0, max);\n return `${raw.slice(0, max - 3)}...`;\n}\n\nfunction resumeNormalizeRole(message) {\n const role = String(message?.role ?? \"system\").toLowerCase();\n if (role === \"user\" || role === \"human\") return \"user\";\n if (role === \"assistant\" || role === \"agent\") return \"assistant\";\n return \"system\";\n}\n\nfunction resumeMessageText(message) {\n const content = message?.content;\n if (typeof content === \"string\") return resumeCompact(content.replace(/\\s+/g, \" \").trim(), 220);\n if (content && typeof content === \"object\") {\n if (typeof content.message === \"string\") return resumeCompact(content.message.replace(/\\s+/g, \" \").trim(), 220);\n if (typeof content.text === \"string\") return resumeCompact(content.text.replace(/\\s+/g, \" \").trim(), 220);\n return resumeCompact(JSON.stringify(content), 220);\n }\n return \"\";\n}\n\nfunction resumeMessageTimestamp(message) {\n return message?.content?.timestamp ?? message?.metadata?.timestamp ?? \"\";\n}\n\nfunction resumeMessageEventType(message) {\n return message?.content?.event_type ?? message?.metadata?.event_type ?? \"message\";\n}\n\nfunction resumeExtractSessionCwd(messages) {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const cwd = messages[i]?.content?.raw?.payload?.cwd;\n if (typeof cwd === \"string\" && cwd.length > 0) return cwd;\n }\n return \"\";\n}\n\nasync function resumeResolveWorkingDirectory(preferredCwd) {\n if (!preferredCwd) return process.cwd();\n try {\n const stat = await fs.stat(preferredCwd);\n if (stat.isDirectory()) return preferredCwd;\n } catch {\n // Fall back to current directory.\n }\n return process.cwd();\n}\n\nfunction resumeShellQuote(value) {\n return `'${String(value).replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction resumeAppleScriptString(value) {\n return `\"${String(value).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction runAppleScriptLines(scriptLines) {\n const args = [];\n for (const line of scriptLines) args.push(\"-e\", line);\n const out = spawnSync(\"osascript\", args, { stdio: \"pipe\", encoding: \"utf8\" });\n if (out.status !== 0) {\n return {\n ok: false,\n reason: out.stderr?.trim() || out.stdout?.trim() || \"osascript failed\",\n };\n }\n return { ok: true };\n}\n\nfunction warpLaunchConfigDirs() {\n const home = os.homedir();\n return [\n path.join(home, \".warp\", \"launch_configurations\"),\n path.join(home, \"Library\", \"Application Support\", \"dev.warp.Warp-Stable\", \"launch_configurations\"),\n path.join(home, \"Library\", \"Application Support\", \"dev.warp.Warp-Preview\", \"launch_configurations\"),\n ];\n}\n\nfunction warpLaunchConfigYaml({ name, cwd, command }) {\n const safeCommand = String(command ?? \"\").replace(/\\r?\\n/g, \" && \");\n return [\n \"---\",\n `name: ${JSON.stringify(name)}`,\n \"windows:\",\n \" - tabs:\",\n \" - title: UltraContext Resume\",\n \" layout:\",\n ` cwd: ${JSON.stringify(cwd)}`,\n \" commands:\",\n ` - exec: ${JSON.stringify(safeCommand)}`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction runOpenUri(uri) {\n const out = spawnSync(\"open\", [uri], { stdio: \"pipe\", encoding: \"utf8\" });\n if (out.status !== 0) {\n return {\n ok: false,\n reason: out.stderr?.trim() || out.stdout?.trim() || \"open uri failed\",\n };\n }\n return { ok: true };\n}\n\nfunction resumeWarpPasteAndRun(command, { openNewTab = false } = {}) {\n const scriptLines = [\n \"set _uc_prev_clipboard to the clipboard\",\n `set the clipboard to ${resumeAppleScriptString(command)}`,\n \"tell application \\\"Warp\\\" to activate\",\n \"delay 0.85\",\n \"tell application \\\"System Events\\\"\",\n ];\n if (openNewTab) {\n scriptLines.push(\"keystroke \\\"t\\\" using {command down}\", \"delay 0.45\");\n }\n scriptLines.push(\n \"keystroke \\\"v\\\" using {command down}\",\n \"delay 0.25\",\n \"key code 36\",\n \"delay 0.18\",\n \"key code 36\",\n \"end tell\",\n \"delay 0.05\",\n \"set the clipboard to _uc_prev_clipboard\"\n );\n return runAppleScriptLines(scriptLines);\n}\n\nfunction resumeOpenWarpNewWindowAndRun(command) {\n spawnSync(\"open\", [\"-a\", \"Warp\"], { stdio: \"ignore\" });\n runAppleScriptLines([\"tell application \\\"Warp\\\" to activate\", \"delay 0.12\"]);\n\n const uri = `warp://action/new_window?path=${encodeURIComponent(process.cwd())}`;\n const opened = runOpenUri(uri);\n if (!opened.ok) return opened;\n\n runAppleScriptLines([\"tell application \\\"Warp\\\" to activate\", \"delay 0.3\"]);\n return resumeWarpPasteAndRun(command, { openNewTab: false });\n}\n\nfunction resumeOpenWarpViaUri(command) {\n try {\n const timestamp = Date.now();\n const launchName = `ultracontext_resume_${timestamp}_${process.pid}`;\n const yaml = warpLaunchConfigYaml({\n name: `UltraContext Resume ${timestamp}`,\n cwd: process.cwd(),\n command,\n });\n\n let primaryFilePath = \"\";\n for (const dir of warpLaunchConfigDirs()) {\n try {\n fsSync.mkdirSync(dir, { recursive: true });\n const filePath = path.join(dir, `${launchName}.yaml`);\n fsSync.writeFileSync(filePath, yaml, \"utf8\");\n if (!primaryFilePath) primaryFilePath = filePath;\n } catch {\n // Best effort.\n }\n }\n\n if (!primaryFilePath) {\n return { ok: false, reason: \"could not write Warp launch configuration file\" };\n }\n\n const uri = `warp://launch/${encodeURIComponent(primaryFilePath)}`;\n spawnSync(\"open\", [\"-a\", \"Warp\"], { stdio: \"ignore\" });\n runAppleScriptLines([\"tell application \\\"Warp\\\" to activate\", \"delay 0.12\"]);\n\n const opened = runOpenUri(uri);\n if (!opened.ok) return opened;\n\n runAppleScriptLines([\"tell application \\\"Warp\\\" to activate\", \"delay 0.12\"]);\n return { ok: true };\n } catch (error) {\n return {\n ok: false,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction resumeOpenAppleTerminalTab(command) {\n const scriptLines = [\n \"tell application \\\"Terminal\\\"\",\n \"activate\",\n \"if (count of windows) = 0 then\",\n ` do script ${resumeAppleScriptString(command)}`,\n \"else\",\n ` do script ${resumeAppleScriptString(command)} in front window`,\n \"end if\",\n \"end tell\",\n ];\n const out = runAppleScriptLines(scriptLines);\n return out.ok ? { ...out, method: \"terminal_applescript\" } : { ...out, method: \"terminal_applescript\" };\n}\n\nfunction resumeOpenWarpTab(command) {\n const uriLaunch = resumeOpenWarpViaUri(command);\n if (uriLaunch.ok) return { ...uriLaunch, method: \"warp_uri_launch\" };\n\n const newWindowFlow = resumeOpenWarpNewWindowAndRun(command);\n if (newWindowFlow.ok) return { ...newWindowFlow, method: \"warp_new_window_paste\" };\n\n const firstTry = resumeWarpPasteAndRun(command, { openNewTab: true });\n if (firstTry.ok) return { ...firstTry, method: \"warp_new_tab_paste\" };\n\n const fallback = resumeWarpPasteAndRun(command, { openNewTab: false });\n if (fallback.ok) return { ...fallback, method: \"warp_current_tab_paste\" };\n\n return {\n ok: false,\n method: \"warp_failed\",\n reason: `${newWindowFlow.reason}; ${uriLaunch.reason}; ${firstTry.reason}; fallback failed: ${fallback.reason}. Check macOS Accessibility permission for your terminal and osascript/System Events.`,\n };\n}\n\nfunction resumeOpenTerminalTab(command) {\n if (process.platform !== \"darwin\") {\n return { ok: false, reason: \"open-tab is available only on macOS\" };\n }\n if (cfg.resumeTerminal === \"warp\") return resumeOpenWarpTab(command);\n return resumeOpenAppleTerminalTab(command);\n}\n\nfunction readProcessInfo(pid) {\n try {\n const out = spawnSync(\"ps\", [\"-o\", \"ppid=,command=\", \"-p\", String(pid)], {\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n const raw = String(out.stdout ?? \"\").trim();\n if (!raw) return null;\n const match = raw.match(/^(\\d+)\\s+(.*)$/);\n if (!match) return null;\n return {\n ppid: Number(match[1]),\n command: match[2] ?? \"\",\n };\n } catch {\n return null;\n }\n}\n\nfunction isWatchCommand(command) {\n const raw = String(command ?? \"\").trim();\n if (!raw) return false;\n return raw.includes(\"node --watch\") || raw.includes(\" --watch \");\n}\n\nfunction stopWatchParentProcess() {\n let pid = Number(process.ppid);\n const seen = new Set();\n for (let depth = 0; depth < 10; depth += 1) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n if (seen.has(pid)) return false;\n seen.add(pid);\n\n const info = readProcessInfo(pid);\n if (!info) return false;\n if (isWatchCommand(info.command)) {\n try {\n process.kill(pid, \"SIGTERM\");\n return true;\n } catch {\n return false;\n }\n }\n pid = Number(info.ppid);\n }\n return false;\n}\n\nfunction resumeDedupeById(contexts) {\n const out = [];\n const seen = new Set();\n for (const item of contexts ?? []) {\n if (!item?.id || seen.has(item.id)) continue;\n seen.add(item.id);\n out.push(item);\n }\n return out;\n}\n\nfunction resumeFilterContexts(contexts) {\n return contexts.filter((ctx) => {\n const md = ctx?.metadata ?? {};\n const source = String(md.source ?? \"\").toLowerCase();\n if (cfg.resumeSourceFilter !== \"all\" && source && source !== cfg.resumeSourceFilter) return false;\n return true;\n });\n}\n\nfunction resumeSortContexts(contexts) {\n const ts = (ctx) => {\n const candidates = [ctx?.created_at, ctx?.updated_at, ctx?.metadata?.timestamp, ctx?.metadata?.created_at];\n for (const candidate of candidates) {\n const value = new Date(candidate ?? 0).getTime();\n if (!Number.isNaN(value) && value > 0) return value;\n }\n return 0;\n };\n\n return contexts.slice().sort((a, b) => {\n const diff = ts(b) - ts(a);\n if (diff !== 0) return diff;\n const aId = String(a?.id ?? \"\");\n const bId = String(b?.id ?? \"\");\n return bId.localeCompare(aId);\n });\n}\n\nfunction resumeFormatDate(value) {\n if (!value) return \"-\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return String(value);\n return d.toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\nfunction resumeContextSource(context) {\n const raw = String(context?.metadata?.source ?? \"\").trim().toLowerCase();\n if (raw === \"codex\") return \"codex\";\n if (raw === \"claude\") return \"claude\";\n return \"unknown\";\n}\n\nfunction isCodingContextSource(source) {\n return source === \"codex\" || source === \"claude\";\n}\n\nfunction resumeTargetAgent(source) {\n if (source === \"codex\") return \"claude\";\n if (source === \"claude\") return \"codex\";\n return \"codex\";\n}\n\nfunction resumeTargetOptionsForSource(source) {\n if (!isCodingContextSource(source)) return RESUME_TARGET_OPTIONS.slice();\n const recommended = resumeTargetAgent(source);\n const ordered = RESUME_TARGET_OPTIONS.slice().sort((a, b) => {\n if (a.id === recommended && b.id !== recommended) return -1;\n if (b.id === recommended && a.id !== recommended) return 1;\n return 0;\n });\n ordered.push(INSPECT_OPTION);\n return ordered;\n}\n\nfunction resumeAgentLabel(agent) {\n if (agent === \"claude\") return \"Claude Code\";\n if (agent === \"codex\") return \"Codex\";\n return \"Unknown\";\n}\n\nfunction resumeSummaryMarkdown({ context, messages }) {\n const counts = { user: 0, assistant: 0, system: 0 };\n for (const msg of messages) counts[resumeNormalizeRole(msg)] += 1;\n const recent = messages.slice(-Math.max(cfg.resumeSummaryTail, 4));\n const lines = [\n \"# UltraContext Resume\",\n \"\",\n `Generated at: ${new Date().toISOString()}`,\n `Context ID: ${context.id}`,\n `Created at: ${resumeFormatDate(context.created_at)}`,\n `Source: ${context.metadata?.source ?? \"-\"}`,\n `User: ${context.metadata?.user_id ?? \"-\"}`,\n `Session ID: ${context.metadata?.session_id ?? \"-\"}`,\n \"\",\n \"## Snapshot\",\n `- Messages: ${messages.length}`,\n `- Roles: user=${counts.user}, assistant=${counts.assistant}, system=${counts.system}`,\n \"\",\n `## Recent Timeline (last ${recent.length})`,\n ];\n\n for (const msg of recent) {\n const ts = resumeCompact(resumeMessageTimestamp(msg) || \"-\", 19).padEnd(19);\n const role = resumeNormalizeRole(msg).toUpperCase().padEnd(9);\n const eventType = resumeCompact(resumeMessageEventType(msg), 24).padEnd(24);\n const text = resumeMessageText(msg) || \"-\";\n lines.push(`- ${ts} ${role} ${eventType} ${text}`);\n }\n\n lines.push(\"\", \"## Resume Instructions\", \"1. Use the generated adapter command from the Contexts tab.\", \"2. Continue from the latest unresolved request.\", \"\");\n return lines.join(\"\\n\");\n}\n\nasync function loadResumeContexts({ silent = false } = {}) {\n if (!runtime.uc || ui.resume.loading) return;\n ui.resume.loading = true;\n if (!silent) {\n ui.resume.error = \"\";\n ui.resume.notice = \"Loading contexts from UltraContext...\";\n renderDashboard();\n }\n\n try {\n const listed = await runtime.uc.get({ limit: Math.max(cfg.resumeContextLimit, 1) });\n const filtered = resumeSortContexts(resumeFilterContexts(resumeDedupeById(listed.data)));\n const nextIds = new Set(filtered.map((ctx) => String(ctx?.id ?? \"\")).filter(Boolean));\n let newContextCount = 0;\n if (runtime.resumeBaselineReady) {\n for (const id of nextIds) {\n if (!runtime.resumeKnownContextIds.has(id)) newContextCount += 1;\n }\n }\n runtime.resumeKnownContextIds = nextIds;\n if (!runtime.resumeBaselineReady) runtime.resumeBaselineReady = true;\n\n if (newContextCount > 0) {\n playContextCreatedSound();\n }\n\n ui.resume.contexts = filtered;\n if (ui.resume.selectedIndex >= filtered.length) {\n ui.resume.selectedIndex = Math.max(filtered.length - 1, 0);\n }\n ui.resume.loadedAt = Date.now();\n\n const sourceCounts = { codex: 0, claude: 0, openclaw: 0, other: 0 };\n for (const ctx of filtered) {\n const source = String(ctx?.metadata?.source ?? \"\").toLowerCase();\n if (source === \"codex\") sourceCounts.codex += 1;\n else if (source === \"claude\") sourceCounts.claude += 1;\n else if (source === \"openclaw\") sourceCounts.openclaw += 1;\n else sourceCounts.other += 1;\n }\n\n if (!silent) {\n const filterLabel = cfg.resumeSourceFilter === \"all\" ? \"all sources\" : cfg.resumeSourceFilter;\n ui.resume.notice = `Loaded ${filtered.length} session contexts (${filterLabel}: codex=${sourceCounts.codex}, claude=${sourceCounts.claude}, openclaw=${sourceCounts.openclaw}, other=${sourceCounts.other})`;\n if (filtered.length === 0) {\n ui.resume.notice = `No contexts found for filter=${cfg.resumeSourceFilter}`;\n }\n }\n } catch (error) {\n if (!silent) {\n const details = errorDetails(error);\n ui.resume.error = details.message ?? \"Failed loading contexts\";\n ui.resume.notice = \"\";\n }\n } finally {\n ui.resume.loading = false;\n renderDashboard();\n }\n}\n\nfunction moveResumeSelection(delta) {\n const total = ui.resume.contexts.length;\n if (!total) return;\n const next = ui.resume.selectedIndex + delta;\n if (next < 0) {\n ui.resume.selectedIndex = total - 1;\n return;\n }\n if (next >= total) {\n ui.resume.selectedIndex = 0;\n return;\n }\n ui.resume.selectedIndex = next;\n}\n\nfunction recommendedResumeTargetForContext(context) {\n const sourceAgent = resumeContextSource(context);\n if (!isCodingContextSource(sourceAgent)) return \"\";\n return resumeTargetAgent(sourceAgent);\n}\n\nfunction openResumeTargetPicker() {\n if (ui.resume.syncing) return false;\n const context = ui.resume.contexts[ui.resume.selectedIndex];\n if (!context) {\n ui.resume.notice = \"No context selected\";\n renderDashboard();\n return false;\n }\n\n const sourceAgent = resumeContextSource(context);\n if (!isCodingContextSource(sourceAgent)) {\n ui.resume.notice = `Selected context source=${sourceAgent}. Adapt/Resume is available only for codex/claude contexts.`;\n renderDashboard();\n return false;\n }\n\n const recommendedTarget = recommendedResumeTargetForContext(context);\n ui.resumeTargetPicker.active = true;\n ui.resumeTargetPicker.selectedIndex = 0;\n ui.resumeTargetPicker.source = sourceAgent;\n ui.resumeTargetPicker.contextId = String(context.id ?? \"\");\n ui.resumeTargetPicker.options = resumeTargetOptionsForSource(sourceAgent);\n ui.resumeTargetPicker.recommendedTarget = recommendedTarget;\n renderDashboard();\n return true;\n}\n\nfunction closeResumeTargetPicker() {\n ui.resumeTargetPicker.active = false;\n ui.resumeTargetPicker.source = \"\";\n ui.resumeTargetPicker.contextId = \"\";\n ui.resumeTargetPicker.selectedIndex = 0;\n ui.resumeTargetPicker.options = RESUME_TARGET_OPTIONS;\n ui.resumeTargetPicker.recommendedTarget = \"\";\n renderDashboard();\n}\n\nfunction moveResumeTargetPickerSelection(delta) {\n const options = ui.resumeTargetPicker.options ?? RESUME_TARGET_OPTIONS;\n const total = options.length;\n if (total <= 0) return;\n const base = Number.isInteger(ui.resumeTargetPicker.selectedIndex) ? ui.resumeTargetPicker.selectedIndex : 0;\n ui.resumeTargetPicker.selectedIndex = (base + delta + total) % total;\n renderDashboard();\n}\n\nfunction resumeTargetPickerSelectionByIndex(index) {\n const options = ui.resumeTargetPicker.options ?? RESUME_TARGET_OPTIONS;\n const safeIndex = Math.max(Math.min(index, options.length - 1), 0);\n return options[safeIndex]?.id ?? \"codex\";\n}\n\nasync function buildCodexResumePlan({ sessionId, runCwd, messages }) {\n const originalSessionId = String(sessionId ?? \"\").trim();\n let canResumeBySessionId = originalSessionId ? await hasLocalCodexSession(originalSessionId) : false;\n let restoredPath = \"\";\n let restoredError = \"\";\n\n if (!canResumeBySessionId && originalSessionId) {\n const restored = await writeCodexSession({\n sessionId: originalSessionId,\n cwd: runCwd,\n messages,\n });\n canResumeBySessionId = await hasLocalCodexSession(originalSessionId);\n restoredPath = restored.filePath || \"\";\n restoredError = restored.error || \"\";\n }\n\n const command = canResumeBySessionId\n ? `codex -C ${resumeShellQuote(runCwd)} resume ${resumeShellQuote(originalSessionId)}`\n : `codex -C ${resumeShellQuote(runCwd)}`;\n\n return {\n targetAgent: \"codex\",\n sessionId: originalSessionId,\n command,\n canResumeBySessionId,\n restoredPath,\n restoredError,\n };\n}\n\nasync function buildClaudeResumePlan({ sessionId, runCwd, messages }) {\n const originalSessionId = String(sessionId ?? \"\").trim();\n let candidateSessionId = originalSessionId;\n let canResumeBySessionId = candidateSessionId ? await hasLocalClaudeSession(candidateSessionId, runCwd) : false;\n let restoredPath = \"\";\n let restoredError = \"\";\n\n if (!canResumeBySessionId || !candidateSessionId) {\n const restored = await writeClaudeSession({\n sessionId: candidateSessionId,\n cwd: runCwd,\n messages,\n });\n candidateSessionId = restored.sessionId || candidateSessionId;\n canResumeBySessionId = candidateSessionId ? await hasLocalClaudeSession(candidateSessionId, runCwd) : false;\n restoredPath = restored.filePath || \"\";\n restoredError = restored.error || \"\";\n }\n\n const command = canResumeBySessionId\n ? `cd ${resumeShellQuote(runCwd)} && claude --resume ${resumeShellQuote(candidateSessionId)}`\n : `cd ${resumeShellQuote(runCwd)} && claude`;\n\n return {\n targetAgent: \"claude\",\n sessionId: candidateSessionId,\n command,\n canResumeBySessionId,\n restoredPath,\n restoredError,\n };\n}\n\nasync function resumeSelectedContext({ targetAgentOverride = \"\" } = {}) {\n if (!runtime.uc || ui.resume.syncing) return;\n const context = ui.resume.contexts[ui.resume.selectedIndex];\n if (!context) {\n ui.resume.notice = \"No context selected\";\n renderDashboard();\n return;\n }\n\n const selectedSourceAgent = resumeContextSource(context);\n if (!isCodingContextSource(selectedSourceAgent)) {\n ui.resume.notice = `Selected context source=${selectedSourceAgent}. Adapt/Resume is available only for codex/claude contexts.`;\n renderDashboard();\n return;\n }\n\n ui.resume.syncing = true;\n ui.resumeTargetPicker.active = false;\n ui.resume.error = \"\";\n ui.resume.notice = `Pulling ${context.id}...`;\n renderDashboard();\n\n try {\n const detail = await runtime.uc.get(context.id);\n const messages = Array.isArray(detail.data) ? detail.data : [];\n\n const outDir = path.resolve(cfg.resumeOutputDir);\n await fs.mkdir(outDir, { recursive: true });\n\n const summaryPath = path.join(outDir, `${context.id}.md`);\n const snapshotPath = path.join(outDir, `${context.id}.json`);\n const commandPath = path.join(outDir, `${context.id}.command.txt`);\n\n const summary = resumeSummaryMarkdown({ context, messages });\n const snapshot = {\n exported_at: new Date().toISOString(),\n context_id: context.id,\n metadata: context.metadata ?? {},\n messages,\n };\n\n await fs.writeFile(summaryPath, summary, \"utf8\");\n await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), \"utf8\");\n\n const originalCwd = resumeExtractSessionCwd(messages);\n const runCwd = await resumeResolveWorkingDirectory(originalCwd);\n const sourceAgent = selectedSourceAgent;\n const manualTarget = targetAgentOverride === \"claude\" || targetAgentOverride === \"codex\" ? targetAgentOverride : \"\";\n\n let targetAgent = manualTarget || resumeTargetAgent(sourceAgent);\n if (targetAgent === sourceAgent) {\n targetAgent = resumeTargetAgent(sourceAgent);\n }\n\n const sessionId = String(context.metadata?.session_id ?? \"\");\n const resumePlan =\n targetAgent === \"claude\"\n ? await buildClaudeResumePlan({ sessionId, runCwd, messages })\n : await buildCodexResumePlan({ sessionId, runCwd, messages });\n\n const command = resumePlan.command;\n await fs.writeFile(commandPath, `${command}\\n`, \"utf8\");\n\n ui.resume.summaryPath = summaryPath;\n ui.resume.command = command;\n ui.resume.commandPath = commandPath;\n\n const direction = `${resumeAgentLabel(sourceAgent)} -> ${resumeAgentLabel(targetAgent)}`;\n\n if (cfg.resumeOpenTab) {\n const opened = resumeOpenTerminalTab(command);\n const openMethod = opened.method ? ` method=${opened.method}` : \"\";\n if (opened.ok) {\n ui.resume.notice = resumePlan.canResumeBySessionId\n ? `Adapter ready (${direction}). Opened ${resumeAgentLabel(targetAgent)} via session_id ${resumePlan.sessionId}.${openMethod}`\n : `Adapter ready (${direction}). Opened ${resumeAgentLabel(targetAgent)} without session resume.${openMethod}`;\n if (resumePlan.restoredError) {\n ui.resume.notice = `${ui.resume.notice} Adapter warning: ${resumePlan.restoredError}`;\n }\n } else {\n ui.resume.notice = `Adapter ready (${direction}). Open tab failed: ${opened.reason}${openMethod}`;\n }\n } else {\n ui.resume.notice = resumePlan.canResumeBySessionId\n ? `Adapter ready (${direction}). Use generated ${resumeAgentLabel(targetAgent)} resume command.`\n : `Adapter ready (${direction}). Use generated command to start a clean ${resumeAgentLabel(targetAgent)} session.`;\n if (resumePlan.restoredPath) {\n ui.resume.notice = `${ui.resume.notice} Local adapter: ${resumePlan.restoredPath}`;\n } else if (resumePlan.restoredError) {\n ui.resume.notice = `${ui.resume.notice} Adapter warning: ${resumePlan.restoredError}`;\n }\n }\n } catch (error) {\n const details = errorDetails(error);\n ui.resume.error = details.message ?? \"Resume failed\";\n ui.resume.notice = \"\";\n } finally {\n ui.resume.syncing = false;\n ui.resumeTargetPicker.active = false;\n ui.resumeTargetPicker.source = \"\";\n ui.resumeTargetPicker.contextId = \"\";\n ui.resumeTargetPicker.selectedIndex = 0;\n ui.resumeTargetPicker.options = RESUME_TARGET_OPTIONS;\n ui.resumeTargetPicker.recommendedTarget = \"\";\n renderDashboard();\n }\n}\n\nfunction bootstrapModeConfigLabel(mode) {\n return CONFIG_BOOTSTRAP_MODES.find((entry) => entry.id === mode)?.label ?? mode;\n}\n\nfunction resumeTerminalConfigLabel(mode) {\n const normalized = normalizeResumeTerminal(mode);\n return CONFIG_RESUME_TERMINALS.find((entry) => entry.id === normalized)?.label ?? \"Terminal\";\n}\n\nfunction serializeConfigPrefs() {\n return {\n soundEnabled: Boolean(cfg.soundEnabled),\n startupSoundEnabled: Boolean(cfg.startupSoundEnabled),\n contextSoundEnabled: Boolean(cfg.contextSoundEnabled),\n bootstrapMode: normalizeBootstrapModeWithPrompt(cfg.bootstrapMode) || \"prompt\",\n resumeTerminal: normalizeResumeTerminal(cfg.resumeTerminal),\n claudeIncludeSubagents: Boolean(cfg.claudeIncludeSubagents),\n resumeOpenTab: Boolean(cfg.resumeOpenTab),\n startupGreetingFile: String(cfg.startupGreetingFile ?? \"\"),\n contextCreatedSoundFile: String(cfg.contextCreatedSoundFile ?? \"\"),\n };\n}\n\nasync function persistConfigPrefsToFile(targetFile = cfg.configFile) {\n const target = path.resolve(targetFile);\n const payload = JSON.stringify(serializeConfigPrefs(), null, 2);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, `${payload}\\n`, \"utf8\");\n return { saved: true, file: target };\n}\n\nasync function loadConfigPrefsFromPath(target) {\n let raw = \"\";\n try {\n raw = await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (error?.code === \"ENOENT\") return { loaded: false, missing: true };\n return { loaded: false, missing: false, error };\n }\n\n let parsed = null;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n return { loaded: false, missing: false, error };\n }\n\n applyConfigPrefs(parsed);\n return { loaded: true, missing: false };\n}\n\nasync function loadConfigPrefsFromFile() {\n const primary = path.resolve(cfg.configFile);\n const loaded = await loadConfigPrefsFromPath(primary);\n return {\n loaded: loaded.loaded,\n source: loaded.loaded ? \"primary\" : \"none\",\n file: loaded.loaded ? primary : \"\",\n };\n}\n\nfunction applyConfigPrefs(prefs) {\n if (!prefs || typeof prefs !== \"object\") return;\n for (const field of PERSISTED_CONFIG_FIELDS) {\n if (!(field in prefs)) continue;\n if (field === \"bootstrapMode\") {\n cfg.bootstrapMode = normalizeBootstrapModeWithPrompt(prefs.bootstrapMode) || \"prompt\";\n continue;\n }\n if (field === \"resumeTerminal\") {\n cfg.resumeTerminal = normalizeResumeTerminal(prefs.resumeTerminal);\n continue;\n }\n if (field === \"startupGreetingFile\") {\n cfg.startupGreetingFile = expandHome(String(prefs.startupGreetingFile ?? cfg.startupGreetingFile));\n continue;\n }\n if (field === \"contextCreatedSoundFile\") {\n cfg.contextCreatedSoundFile = expandHome(String(prefs.contextCreatedSoundFile ?? cfg.contextCreatedSoundFile));\n continue;\n }\n cfg[field] = Boolean(prefs[field]);\n }\n}\n\nasync function persistConfigPrefs() {\n let fileSaved = false;\n\n try {\n await persistConfigPrefsToFile();\n fileSaved = true;\n } catch {\n // ignore\n }\n\n return { fileSaved };\n}\n\nasync function resolveSoundFile(filePath, label) {\n if (!filePath) return \"\";\n try {\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) {\n ui.resume.notice = `Configured sound is not a file: ${label}`;\n return \"\";\n }\n return filePath;\n } catch {\n ui.resume.notice = `Configured sound file not found: ${label}`;\n return \"\";\n }\n}\n\nasync function prepareSoundConfig() {\n sound.startupFile = \"\";\n sound.contextFile = \"\";\n sound.warnedNonDarwin = false;\n if (!cfg.soundEnabled) return;\n\n sound.startupFile = await resolveSoundFile(cfg.startupGreetingFile, \"startup\");\n sound.contextFile = await resolveSoundFile(cfg.contextCreatedSoundFile, \"context_created\");\n}\n\nfunction playSoundFile(filePath) {\n if (!cfg.soundEnabled || !filePath) return;\n\n if (process.platform !== \"darwin\") {\n if (!sound.warnedNonDarwin) {\n sound.warnedNonDarwin = true;\n ui.resume.notice = \"Sound notifications currently support only macOS (afplay).\";\n renderDashboard();\n }\n return;\n }\n\n try {\n const child = spawn(\"afplay\", [filePath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n } catch {\n // ignore playback errors\n }\n}\n\nfunction playStartupGreetingSound() {\n if (!cfg.startupSoundEnabled) return;\n playSoundFile(sound.startupFile);\n}\n\nfunction playContextCreatedSound() {\n if (!cfg.contextSoundEnabled) return;\n playSoundFile(sound.contextFile);\n}\n\nfunction configToggleItems() {\n const masterEnabled = Boolean(cfg.soundEnabled);\n const soundItems = CONFIG_TOGGLES.map((item) => {\n const rawValue = Boolean(cfg[item.key]);\n const blockedByMaster = item.key !== \"soundEnabled\" && !masterEnabled;\n const effectiveValue = blockedByMaster ? false : rawValue;\n return {\n ...item,\n kind: \"boolean\",\n rawValue,\n value: effectiveValue,\n valueLabel: effectiveValue ? \"ON\" : \"OFF\",\n blockedByMaster,\n };\n });\n\n const normalizedBootstrapMode = normalizeBootstrapModeWithPrompt(cfg.bootstrapMode) || \"prompt\";\n const syncItems = [\n {\n key: \"bootstrapMode\",\n kind: \"enum\",\n label: \"Sync profile\",\n description: \"Defines bootstrap strategy for next daemon startup/reset.\",\n value: normalizedBootstrapMode,\n valueLabel: bootstrapModeConfigLabel(normalizedBootstrapMode),\n blockedByMaster: false,\n },\n {\n key: \"resumeTerminal\",\n kind: \"enum\",\n label: \"Resume terminal\",\n description: \"Choose where resume opens (Terminal or Warp).\",\n value: normalizeResumeTerminal(cfg.resumeTerminal),\n valueLabel: resumeTerminalConfigLabel(cfg.resumeTerminal),\n blockedByMaster: false,\n },\n {\n key: \"claudeIncludeSubagents\",\n kind: \"boolean\",\n label: \"Claude subagents\",\n description: \"Includes Claude subagents in scan (daemon applies on next cycle).\",\n value: Boolean(cfg.claudeIncludeSubagents),\n valueLabel: cfg.claudeIncludeSubagents ? \"ON\" : \"OFF\",\n blockedByMaster: false,\n },\n {\n key: \"bootstrapResetState\",\n kind: \"action\",\n label: \"Reset bootstrap state\",\n description: \"Clears daemon bootstrap state so re-bootstrap can run again.\",\n value: \"run\",\n valueLabel: \"RUN\",\n blockedByMaster: false,\n },\n ];\n\n return [...soundItems, ...syncItems];\n}\n\nfunction moveConfigSelection(delta) {\n const items = configToggleItems();\n const total = items.length;\n if (!total) return;\n const next = ui.configEditor.selectedIndex + delta;\n if (next < 0) {\n ui.configEditor.selectedIndex = total - 1;\n return;\n }\n if (next >= total) {\n ui.configEditor.selectedIndex = 0;\n return;\n }\n ui.configEditor.selectedIndex = next;\n}\n\nasync function toggleSelectedConfig() {\n const items = configToggleItems();\n if (items.length === 0) return;\n\n const selected = Math.max(Math.min(ui.configEditor.selectedIndex, items.length - 1), 0);\n const item = items[selected];\n\n try {\n if (item.kind === \"action\" && item.key === \"bootstrapResetState\") {\n const daemonResult = await sendDaemonCommand(DAEMON_WS_MESSAGE_TYPES.BOOTSTRAP_RESET, {\n profile: normalizeBootstrapModeWithPrompt(cfg.bootstrapMode) || \"prompt\",\n });\n cfg.bootstrapReset = true;\n const saved = await persistConfigPrefs();\n if (daemonResult.sent) {\n ui.resume.notice = \"Bootstrap state reset on daemon.\";\n } else {\n ui.resume.notice = \"Daemon offline. Bootstrap reset will apply on next start.\";\n }\n if (!saved.fileSaved) {\n ui.resume.notice = \"Bootstrap reset requested, but prefs were not persisted.\";\n }\n renderDashboard();\n return;\n }\n\n if (item.kind === \"enum\" && item.key === \"bootstrapMode\") {\n const currentIndex = Math.max(CONFIG_BOOTSTRAP_MODES.findIndex((entry) => entry.id === item.value), 0);\n const next = CONFIG_BOOTSTRAP_MODES[(currentIndex + 1) % CONFIG_BOOTSTRAP_MODES.length];\n cfg.bootstrapMode = next.id;\n cfg.bootstrapReset = next.id === \"prompt\";\n\n const daemonResult = await sendDaemonCommand(DAEMON_WS_MESSAGE_TYPES.CONFIG_SET, {\n key: \"bootstrapMode\",\n value: next.id,\n });\n\n const saved = await persistConfigPrefs();\n if (daemonResult.sent) {\n ui.resume.notice = `Sync profile set: ${next.label} (daemon + file).`;\n } else {\n ui.resume.notice = `Sync profile set: ${next.label} (file only; daemon offline).`;\n }\n if (!saved.fileSaved) {\n ui.resume.notice = `Sync profile set: ${next.label}, but prefs were not persisted.`;\n }\n renderDashboard();\n return;\n }\n\n if (item.kind === \"enum\" && item.key === \"resumeTerminal\") {\n const current = normalizeResumeTerminal(item.value);\n const currentIndex = Math.max(CONFIG_RESUME_TERMINALS.findIndex((entry) => entry.id === current), 0);\n const next = CONFIG_RESUME_TERMINALS[(currentIndex + 1) % CONFIG_RESUME_TERMINALS.length];\n cfg.resumeTerminal = next.id;\n const saved = await persistConfigPrefs();\n ui.resume.notice = `Resume terminal: ${next.label}${saved.fileSaved ? \" (saved)\" : \"\"}.`;\n renderDashboard();\n return;\n }\n\n if (item.kind === \"boolean\") {\n cfg[item.key] = !cfg[item.key];\n\n if (item.key === \"claudeIncludeSubagents\") {\n const daemonResult = await sendDaemonCommand(DAEMON_WS_MESSAGE_TYPES.CONFIG_SET, {\n key: \"claudeIncludeSubagents\",\n value: cfg.claudeIncludeSubagents,\n });\n\n const saved = await persistConfigPrefs();\n if (daemonResult.sent) {\n ui.resume.notice = cfg.claudeIncludeSubagents\n ? `Claude subagents: ON (daemon + file${saved.fileSaved ? \" saved\" : \"\"}).`\n : `Claude subagents: OFF (daemon + file${saved.fileSaved ? \" saved\" : \"\"}).`;\n } else {\n ui.resume.notice = cfg.claudeIncludeSubagents\n ? `Claude subagents: ON (file only; daemon offline).`\n : `Claude subagents: OFF (file only; daemon offline).`;\n }\n renderDashboard();\n return;\n }\n\n if (\n item.key === \"soundEnabled\" ||\n item.key === \"startupSoundEnabled\" ||\n item.key === \"contextSoundEnabled\"\n ) {\n await prepareSoundConfig();\n const saved = await persistConfigPrefs();\n ui.resume.notice = `${item.label}: ${cfg[item.key] ? \"ON\" : \"OFF\"}${saved.fileSaved ? \" (file saved)\" : \"\"}.`;\n renderDashboard();\n return;\n }\n }\n } catch (error) {\n const details = errorDetails(error);\n ui.resume.notice = `Failed to apply config: ${details.message}`;\n renderDashboard();\n }\n}\n\n// ── update prompt actions ────────────────────────────────────────\n\nfunction moveUpdatePrompt(delta) {\n const total = UPDATE_PROMPT_OPTIONS.length;\n ui.updatePrompt.selectedIndex = (ui.updatePrompt.selectedIndex + delta + total) % total;\n renderDashboard();\n}\n\nfunction chooseUpdatePrompt(index) {\n const safeIndex = Math.max(Math.min(index, UPDATE_PROMPT_OPTIONS.length - 1), 0);\n const choice = UPDATE_PROMPT_OPTIONS[safeIndex]?.id;\n\n // dismiss prompt\n ui.updatePrompt.active = false;\n renderDashboard();\n\n if (choice === \"install\") {\n // stop TUI and run update in a new terminal tab\n const command = \"ultracontext update\";\n const opened = resumeOpenTerminalTab(command);\n if (opened.ok) {\n ui.resume.notice = `Update started in new tab. Restart TUI after update.`;\n } else {\n ui.resume.notice = `Run manually: ultracontext update`;\n }\n renderDashboard();\n }\n}\n\n// ── detail view actions ─────────────────────────────────────────\n\nasync function openContextDetail() {\n if (ui.detailView.loading) return;\n const context = ui.resume.contexts[ui.resume.selectedIndex];\n if (!context) return;\n\n ui.detailView.active = true;\n ui.detailView.contextId = context.id;\n ui.detailView.contextMeta = context.metadata ?? {};\n ui.detailView.messages = [];\n ui.detailView.scrollOffset = 0;\n ui.detailView.lineOffset = 0;\n ui.detailView.loading = true;\n ui.detailView.error = null;\n renderDashboard();\n\n try {\n const detail = await runtime.uc.get(context.id);\n const messages = Array.isArray(detail.data) ? detail.data : [];\n ui.detailView.messages = messages;\n } catch (error) {\n ui.detailView.error = error?.message ?? \"Failed to load context\";\n } finally {\n ui.detailView.loading = false;\n renderDashboard();\n }\n}\n\nfunction closeContextDetail() {\n ui.detailView.active = false;\n ui.detailView.contextId = null;\n ui.detailView.contextMeta = null;\n ui.detailView.messages = [];\n ui.detailView.scrollOffset = 0;\n ui.detailView.lineOffset = 0;\n ui.detailView.loading = false;\n ui.detailView.error = null;\n renderDashboard();\n}\n\nasync function refreshContextDetail() {\n if (!ui.detailView.active || !ui.detailView.contextId || ui.detailView.loading) return;\n ui.detailView.loading = true;\n ui.detailView.error = null;\n renderDashboard();\n\n try {\n const detail = await runtime.uc.get(ui.detailView.contextId);\n ui.detailView.messages = Array.isArray(detail.data) ? detail.data : [];\n } catch (error) {\n ui.detailView.error = error?.message ?? \"Failed to refresh\";\n } finally {\n ui.detailView.loading = false;\n renderDashboard();\n }\n}\n\n// message-level scroll (↑/↓) — resets line offset\nfunction scrollContextDetail(delta) {\n const total = ui.detailView.messages.length;\n if (total === 0) return;\n const next = ui.detailView.scrollOffset + delta;\n if (next < 0) ui.detailView.scrollOffset = total - 1;\n else if (next >= total) ui.detailView.scrollOffset = 0;\n else ui.detailView.scrollOffset = next;\n ui.detailView.lineOffset = 0;\n renderDashboard();\n}\n\n// line-level fine scroll (j/k) within current view\nfunction scrollContextDetailLine(delta) {\n if (ui.detailView.messages.length === 0) return;\n ui.detailView.lineOffset = Math.max(0, ui.detailView.lineOffset + delta);\n renderDashboard();\n}\n\n// ── enter context (picker or detail based on source) ────────────\n\nfunction enterContext() {\n const context = ui.resume.contexts[ui.resume.selectedIndex];\n if (!context) {\n ui.resume.notice = \"No context selected\";\n renderDashboard();\n return;\n }\n\n const source = resumeContextSource(context);\n if (isCodingContextSource(source)) {\n openResumeTargetPicker();\n } else {\n void openContextDetail();\n }\n}\n\nfunction setSelectedTabByIndex(nextIndex) {\n const normalized = (nextIndex + MENU_TABS.length) % MENU_TABS.length;\n ui.selectedTab = MENU_TABS[normalized].id;\n}\n\nfunction ensureResumeTabDataLoaded() {\n if (ui.selectedTab !== \"contexts\") return;\n if (ui.resume.contexts.length === 0 && !ui.resume.loading) {\n void loadResumeContexts();\n }\n}\n\nfunction selectTabAndRefreshByIndex(index) {\n setSelectedTabByIndex(index);\n ensureResumeTabDataLoaded();\n renderDashboard();\n}\n\nfunction moveTabAndRefresh(delta) {\n const idx = MENU_TABS.findIndex((tab) => tab.id === ui.selectedTab);\n const current = idx === -1 ? 0 : idx;\n setSelectedTabByIndex(current + delta);\n ensureResumeTabDataLoaded();\n renderDashboard();\n}\n\nfunction buildUiSnapshot() {\n const configItems = configToggleItems();\n const selectedConfigIndex = Math.max(\n Math.min(ui.configEditor.selectedIndex, Math.max(configItems.length - 1, 0)),\n 0\n );\n\n return {\n now: Date.now(),\n currentVersion: ui.currentVersion,\n updateAvailable: ui.updateAvailable,\n updatePrompt: {\n active: ui.updatePrompt.active,\n selectedIndex: ui.updatePrompt.selectedIndex,\n latestVersion: ui.updatePrompt.latestVersion,\n options: UPDATE_PROMPT_OPTIONS,\n },\n cfg: {\n userId: cfg.userId,\n host: cfg.host,\n daemonWsHost: cfg.daemonWsHost,\n daemonWsInfoFile: cfg.daemonWsInfoFile,\n pollMs: 0,\n uiRefreshMs: cfg.uiRefreshMs,\n logLevel: \"info\",\n soundEnabled: cfg.soundEnabled,\n startupSoundEnabled: cfg.startupSoundEnabled,\n contextSoundEnabled: cfg.contextSoundEnabled,\n startupGreetingFile: cfg.startupGreetingFile,\n contextCreatedSoundFile: cfg.contextCreatedSoundFile,\n },\n stats,\n selectedTab: ui.selectedTab,\n configEditor: {\n selectedIndex: selectedConfigIndex,\n items: configItems,\n },\n recentLogs: ui.recentLogs.slice(-runtimeLogsKeep()),\n sourceStats: ui.sourceOrder.map((name) => ({\n name,\n ...ensureSourceStats(name),\n })),\n resume: {\n ...ui.resume,\n contexts: ui.resume.contexts,\n },\n detailView: {\n active: ui.detailView.active,\n contextId: ui.detailView.contextId,\n contextMeta: ui.detailView.contextMeta,\n messages: ui.detailView.messages,\n scrollOffset: ui.detailView.scrollOffset,\n lineOffset: ui.detailView.lineOffset,\n loading: ui.detailView.loading,\n error: ui.detailView.error,\n },\n resumeTargetPicker: {\n active: ui.resumeTargetPicker.active,\n selectedIndex: ui.resumeTargetPicker.selectedIndex,\n source: ui.resumeTargetPicker.source,\n contextId: ui.resumeTargetPicker.contextId,\n options: ui.resumeTargetPicker.options,\n recommendedTarget: ui.resumeTargetPicker.recommendedTarget,\n },\n onlineClients: ui.onlineClients,\n bootstrap: {\n active: ui.bootstrap.active,\n selectedIndex: ui.bootstrap.selectedIndex,\n options: ui.bootstrap.options,\n sourceNames: ui.bootstrap.sourceNames,\n note: ui.bootstrap.note,\n },\n };\n}\n\nfunction validateConfig() {\n if (!cfg.apiKey) {\n throw new Error(\"Missing ULTRACONTEXT_API_KEY\");\n }\n}\n\nasync function tuiMain() {\n validateConfig();\n\n if (!process.stdout.isTTY) {\n throw new Error(\"TUI mode requires a TTY.\");\n }\n\n try {\n const fileLoad = await loadConfigPrefsFromFile();\n if (!fileLoad.loaded) {\n await persistConfigPrefsToFile();\n }\n } catch {\n // ignore config persistence startup issues\n }\n\n await prepareSoundConfig();\n playStartupGreetingSound();\n setDaemonOfflineNotice();\n\n const uc = new UltraContext({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl });\n runtime.uc = uc;\n\n await uc.get({ limit: 1 });\n\n runtime.daemonClient = createDaemonWsClient({\n host: cfg.daemonWsHost,\n infoFilePath: cfg.daemonWsInfoFile,\n onMessage: handleDaemonWsMessage,\n onStatus: handleDaemonWsStatus,\n onError: handleDaemonWsError,\n });\n\n let running = true;\n let stopRequested = false;\n const stop = (reason = \"internal\") => {\n if (stopRequested) return;\n stopRequested = true;\n if (reason === \"user\" || reason === \"sigint\") {\n stopWatchParentProcess();\n }\n running = false;\n };\n runtime.stop = stop;\n\n runtime.uiController = createInkUiController({\n getSnapshot: buildUiSnapshot,\n actions: {\n stop: () => runtime.stop?.(\"user\"),\n moveBootstrap: () => {},\n chooseBootstrap: () => {},\n moveUpdatePrompt: (delta) => {\n moveUpdatePrompt(delta);\n },\n chooseUpdatePrompt: (index) => {\n chooseUpdatePrompt(index);\n },\n moveTab: moveTabAndRefresh,\n selectTab: selectTabAndRefreshByIndex,\n moveConfig: (delta) => {\n moveConfigSelection(delta);\n renderDashboard();\n },\n toggleConfig: () => {\n void toggleSelectedConfig();\n },\n moveResume: (delta) => {\n moveResumeSelection(delta);\n renderDashboard();\n },\n refreshResume: () => {\n void loadResumeContexts();\n },\n promptResumeTarget: () => {\n openResumeTargetPicker();\n },\n moveResumeTarget: (delta) => {\n moveResumeTargetPickerSelection(delta);\n },\n chooseResumeTarget: (index) => {\n const target = resumeTargetPickerSelectionByIndex(index);\n if (target === \"inspect\") {\n closeResumeTargetPicker();\n void openContextDetail();\n return;\n }\n void resumeSelectedContext({ targetAgentOverride: target });\n },\n cancelResumeTarget: () => {\n closeResumeTargetPicker();\n },\n enterContext: () => {\n enterContext();\n },\n openDetail: () => {\n void openContextDetail();\n },\n closeDetail: () => {\n closeContextDetail();\n },\n scrollDetail: (delta) => {\n scrollContextDetail(delta);\n },\n scrollDetailLine: (delta) => {\n scrollContextDetailLine(delta);\n },\n refreshDetail: () => {\n void refreshContextDetail();\n },\n },\n });\n\n runtime.uiController.start();\n renderDashboard();\n void loadResumeContexts();\n void runtime.daemonClient.start();\n void checkForUpdateSilent();\n\n runtime.renderTimer = setInterval(() => {\n renderDashboard();\n }, Math.max(cfg.uiRefreshMs, 250));\n runtime.renderTimer.unref?.();\n\n if (cfg.resumeAutoRefreshMs > 0) {\n runtime.contextRefreshTimer = setInterval(() => {\n if (ui.resume.loading || ui.resume.syncing) return;\n void loadResumeContexts({ silent: ui.selectedTab !== \"contexts\" });\n }, Math.max(cfg.resumeAutoRefreshMs, 1000));\n runtime.contextRefreshTimer.unref?.();\n }\n\n process.on(\"SIGINT\", () => stop(\"sigint\"));\n process.on(\"SIGTERM\", () => stop(\"sigterm\"));\n\n while (running) {\n await new Promise((resolve) => setTimeout(resolve, 120));\n }\n\n if (runtime.renderTimer) clearInterval(runtime.renderTimer);\n runtime.renderTimer = null;\n if (runtime.contextRefreshTimer) clearInterval(runtime.contextRefreshTimer);\n runtime.contextRefreshTimer = null;\n\n runtime.uiController?.stop();\n runtime.uiController = null;\n\n if (runtime.daemonClient) {\n await runtime.daemonClient.stop();\n runtime.daemonClient = null;\n }\n\n runtime.stop = null;\n runtime.uc = null;\n}\n\ntuiMain().catch(async (error) => {\n if (runtime.renderTimer) clearInterval(runtime.renderTimer);\n runtime.renderTimer = null;\n if (runtime.contextRefreshTimer) clearInterval(runtime.contextRefreshTimer);\n runtime.contextRefreshTimer = null;\n\n runtime.uiController?.stop();\n runtime.uiController = null;\n\n if (runtime.daemonClient) {\n try {\n await runtime.daemonClient.stop();\n } catch {\n // ignore close errors\n }\n runtime.daemonClient = null;\n }\n\n runtime.stop = null;\n runtime.uc = null;\n\n if (onFatalError) {\n onFatalError(error);\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[error] UltraContext TUI failed: ${message}`);\n process.exit(1);\n});\n\n} // end tuiBoot\n"],"mappings":"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"}
|