ohbaby-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/bin.d.ts +19 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +5705 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/commands/run.d.ts +8 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/serve.d.ts +13 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/terminal.d.ts +13 -0
- package/dist/cli/commands/terminal.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts +64 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/exit-codes.d.ts +7 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/stdin.d.ts +3 -0
- package/dist/cli/stdin.d.ts.map +1 -0
- package/dist/cli/stdout-renderer.d.ts +10 -0
- package/dist/cli/stdout-renderer.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5215 -0
- package/dist/index.js.map +1 -0
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/tui/app.d.ts +10 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/components/dialog/command-panel-manager.d.ts +14 -0
- package/dist/tui/components/dialog/command-panel-manager.d.ts.map +1 -0
- package/dist/tui/components/dialog/command-panel-state.d.ts +25 -0
- package/dist/tui/components/dialog/command-panel-state.d.ts.map +1 -0
- package/dist/tui/components/dialog/connect-panel.d.ts +9 -0
- package/dist/tui/components/dialog/connect-panel.d.ts.map +1 -0
- package/dist/tui/components/dialog/overlay-card.d.ts +7 -0
- package/dist/tui/components/dialog/overlay-card.d.ts.map +1 -0
- package/dist/tui/components/header.d.ts +6 -0
- package/dist/tui/components/header.d.ts.map +1 -0
- package/dist/tui/components/logo.d.ts +3 -0
- package/dist/tui/components/logo.d.ts.map +1 -0
- package/dist/tui/components/message/message-list.d.ts +10 -0
- package/dist/tui/components/message/message-list.d.ts.map +1 -0
- package/dist/tui/components/message/message-row.d.ts +50 -0
- package/dist/tui/components/message/message-row.d.ts.map +1 -0
- package/dist/tui/components/message/notice-banner.d.ts +9 -0
- package/dist/tui/components/message/notice-banner.d.ts.map +1 -0
- package/dist/tui/components/message/parts/tool-part.d.ts +10 -0
- package/dist/tui/components/message/parts/tool-part.d.ts.map +1 -0
- package/dist/tui/components/prompt/completion.d.ts +9 -0
- package/dist/tui/components/prompt/completion.d.ts.map +1 -0
- package/dist/tui/components/prompt/editor-reducer.d.ts +46 -0
- package/dist/tui/components/prompt/editor-reducer.d.ts.map +1 -0
- package/dist/tui/components/prompt/index.d.ts +21 -0
- package/dist/tui/components/prompt/index.d.ts.map +1 -0
- package/dist/tui/components/shimmer-text.d.ts +28 -0
- package/dist/tui/components/shimmer-text.d.ts.map +1 -0
- package/dist/tui/components/spinner.d.ts +8 -0
- package/dist/tui/components/spinner.d.ts.map +1 -0
- package/dist/tui/components/transcript/command-notice-lane.d.ts +6 -0
- package/dist/tui/components/transcript/command-notice-lane.d.ts.map +1 -0
- package/dist/tui/components/transcript/committed-transcript.d.ts +13 -0
- package/dist/tui/components/transcript/committed-transcript.d.ts.map +1 -0
- package/dist/tui/components/transcript/live-tail-window.d.ts +14 -0
- package/dist/tui/components/transcript/live-tail-window.d.ts.map +1 -0
- package/dist/tui/components/transcript/live-tail.d.ts +6 -0
- package/dist/tui/components/transcript/live-tail.d.ts.map +1 -0
- package/dist/tui/components/transcript/notice-lane.d.ts +6 -0
- package/dist/tui/components/transcript/notice-lane.d.ts.map +1 -0
- package/dist/tui/components/transcript/transcript-viewport.d.ts +13 -0
- package/dist/tui/components/transcript/transcript-viewport.d.ts.map +1 -0
- package/dist/tui/components/working-phrases.d.ts +13 -0
- package/dist/tui/components/working-phrases.d.ts.map +1 -0
- package/dist/tui/components/working-spinner.d.ts +12 -0
- package/dist/tui/components/working-spinner.d.ts.map +1 -0
- package/dist/tui/dialogs/confirm.d.ts +9 -0
- package/dist/tui/dialogs/confirm.d.ts.map +1 -0
- package/dist/tui/dialogs/manager.d.ts +10 -0
- package/dist/tui/dialogs/manager.d.ts.map +1 -0
- package/dist/tui/dialogs/model-dialog.d.ts +9 -0
- package/dist/tui/dialogs/model-dialog.d.ts.map +1 -0
- package/dist/tui/dialogs/permission-dialog.d.ts +8 -0
- package/dist/tui/dialogs/permission-dialog.d.ts.map +1 -0
- package/dist/tui/dialogs/select-one.d.ts +10 -0
- package/dist/tui/dialogs/select-one.d.ts.map +1 -0
- package/dist/tui/dialogs/session-dialog.d.ts +10 -0
- package/dist/tui/dialogs/session-dialog.d.ts.map +1 -0
- package/dist/tui/index.d.ts +6 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/layout/app-shell.d.ts +6 -0
- package/dist/tui/layout/app-shell.d.ts.map +1 -0
- package/dist/tui/layout/context.d.ts +9 -0
- package/dist/tui/layout/context.d.ts.map +1 -0
- package/dist/tui/layout/metrics.d.ts +13 -0
- package/dist/tui/layout/metrics.d.ts.map +1 -0
- package/dist/tui/render/highlight.d.ts +2 -0
- package/dist/tui/render/highlight.d.ts.map +1 -0
- package/dist/tui/render/logo.d.ts +5 -0
- package/dist/tui/render/logo.d.ts.map +1 -0
- package/dist/tui/render/markdown.d.ts +5 -0
- package/dist/tui/render/markdown.d.ts.map +1 -0
- package/dist/tui/render/status-panel.d.ts +2 -0
- package/dist/tui/render/status-panel.d.ts.map +1 -0
- package/dist/tui/render/usage.d.ts +3 -0
- package/dist/tui/render/usage.d.ts.map +1 -0
- package/dist/tui/render/wrap.d.ts +4 -0
- package/dist/tui/render/wrap.d.ts.map +1 -0
- package/dist/tui/slash-commands/completions.d.ts +7 -0
- package/dist/tui/slash-commands/completions.d.ts.map +1 -0
- package/dist/tui/slash-commands/hints.d.ts +5 -0
- package/dist/tui/slash-commands/hints.d.ts.map +1 -0
- package/dist/tui/slash-commands/runtime.d.ts +23 -0
- package/dist/tui/slash-commands/runtime.d.ts.map +1 -0
- package/dist/tui/store/events.d.ts +7 -0
- package/dist/tui/store/events.d.ts.map +1 -0
- package/dist/tui/store/selectors/transcript.d.ts +19 -0
- package/dist/tui/store/selectors/transcript.d.ts.map +1 -0
- package/dist/tui/store/selectors.d.ts +9 -0
- package/dist/tui/store/selectors.d.ts.map +1 -0
- package/dist/tui/store/snapshot.d.ts +82 -0
- package/dist/tui/store/snapshot.d.ts.map +1 -0
- package/dist/tui/store/stream-coalescer.d.ts +10 -0
- package/dist/tui/store/stream-coalescer.d.ts.map +1 -0
- package/dist/tui/store/transcript.d.ts +43 -0
- package/dist/tui/store/transcript.d.ts.map +1 -0
- package/dist/tui/theme/colors.d.ts +55 -0
- package/dist/tui/theme/colors.d.ts.map +1 -0
- package/dist/tui/theme/detect.d.ts +12 -0
- package/dist/tui/theme/detect.d.ts.map +1 -0
- package/dist/tui/theme/index.d.ts +14 -0
- package/dist/tui/theme/index.d.ts.map +1 -0
- package/dist/tui/theme/tokens.d.ts +61 -0
- package/dist/tui/theme/tokens.d.ts.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tui/theme/colors.ts","../src/tui/theme/tokens.ts","../src/tui/theme/detect.ts","../src/tui/theme/index.tsx","../src/tui/dialogs/confirm.tsx","../src/tui/dialogs/select-one.tsx","../src/tui/dialogs/model-dialog.tsx","../src/tui/dialogs/permission-dialog.tsx","../src/tui/layout/metrics.ts","../src/tui/layout/context.tsx","../src/tui/components/dialog/overlay-card.tsx","../src/tui/render/wrap.ts","../src/tui/dialogs/session-dialog.tsx","../src/tui/dialogs/manager.tsx","../src/tui/render/usage.ts","../src/tui/components/dialog/connect-panel.tsx","../src/tui/components/dialog/command-panel-manager.tsx","../src/tui/components/dialog/command-panel-state.ts","../src/tui/render/logo.ts","../src/tui/components/logo.tsx","../src/tui/components/header.tsx","../src/tui/components/shimmer-text.tsx","../src/tui/components/spinner.tsx","../src/tui/components/working-phrases.ts","../src/tui/components/working-spinner.tsx","../src/tui/components/transcript/command-notice-lane.tsx","../src/tui/render/highlight.ts","../src/tui/render/markdown.ts","../src/tui/components/message/parts/tool-part.tsx","../src/tui/components/message/message-row.tsx","../src/tui/components/transcript/committed-transcript.tsx","../src/tui/components/transcript/live-tail-window.ts","../src/tui/components/transcript/live-tail.tsx","../src/tui/components/transcript/notice-lane.tsx","../src/tui/components/transcript/transcript-viewport.tsx","../src/tui/slash-commands/runtime.ts","../src/tui/slash-commands/hints.ts","../src/tui/slash-commands/completions.ts","../src/tui/components/prompt/completion.tsx","../src/tui/components/prompt/editor-reducer.ts","../src/tui/components/prompt/index.tsx","../src/tui/layout/app-shell.tsx","../src/tui/render/status-panel.ts","../src/tui/store/transcript.ts","../src/tui/store/events.ts","../src/tui/store/selectors.ts","../src/tui/store/selectors/transcript.ts","../src/tui/store/stream-coalescer.ts","../src/tui/app.tsx","../src/tui/index.tsx"],"names":["jsx","useState","useInput","formatError","jsxs","Box","Text","useRef","createContext","useContext","normalizeWidth","useEffect","CommandNoticeLane","Fragment","memo","CommittedTranscript","LiveTail","NoticeLane","parseSdkSlashInput","resolveSdkCommand","filterSdkCommandCatalog","lines","row","useStdout","getString","formatPermission","getRecord","formatModelLabel","formatTools","toContextWindowUsage","getNumber","formatCount","isRecord","getStringArray","catalog","createInvocationId"],"mappings":"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","file":"index.js","sourcesContent":["export interface RawPalette {\r\n readonly border: string;\r\n readonly gold: string;\r\n readonly goldBright: string;\r\n readonly green: string;\r\n readonly purple: string;\r\n readonly purpleBright: string;\r\n readonly purpleShimmer: string;\r\n readonly red: string;\r\n readonly skyBlue: string;\r\n readonly surface: string;\r\n readonly text: string;\r\n readonly textDim: string;\r\n readonly textMuted: string;\r\n readonly textStrong: string;\r\n readonly userBlockBg: string;\r\n readonly yellow: string;\r\n}\r\n\r\nexport const darkPalette = {\r\n border: \"#3E3A34\",\r\n gold: \"#D4A24F\",\r\n goldBright: \"#E0B463\",\r\n green: \"#8FCB9B\",\r\n purple: \"#B9A3E3\",\r\n purpleBright: \"#C9B8EC\",\r\n purpleShimmer: \"#F3ECFF\",\r\n red: \"#E8857D\",\r\n skyBlue: \"#6E9FCE\",\r\n surface: \"#141A12\",\r\n text: \"#E8E4DC\",\r\n textDim: \"#9A938A\",\r\n textMuted: \"#6E675F\",\r\n textStrong: \"#F5F2EC\",\r\n userBlockBg: \"#2C5D8A\",\r\n yellow: \"#E0C06B\",\r\n} as const satisfies RawPalette;\r\n\r\nexport const lightPalette = {\r\n border: \"#C0B8AC\",\r\n gold: \"#B5832A\",\r\n goldBright: \"#C79535\",\r\n green: \"#3D9A57\",\r\n purple: \"#7C5BC4\",\r\n purpleBright: \"#8E6ED4\",\r\n purpleShimmer: \"#C9B2F5\",\r\n red: \"#C8453E\",\r\n skyBlue: \"#2E6FB0\",\r\n surface: \"#F0EBE2\",\r\n text: \"#1A1714\",\r\n textDim: \"#5F5750\",\r\n textMuted: \"#6E675F\",\r\n textStrong: \"#0F0D0B\",\r\n userBlockBg: \"#DCEEFF\",\r\n yellow: \"#9A7B1F\",\r\n} as const satisfies RawPalette;\r\n","import { darkPalette, lightPalette, type RawPalette } from \"./colors.js\";\r\n\r\nexport type ColorMode = \"dark\" | \"light\";\r\nexport type ColorLevel = 0 | 1 | 2 | 3;\r\n\r\nexport interface Theme {\r\n readonly border: string;\r\n readonly brandTitle: {\r\n readonly primary: string;\r\n readonly secondary: string;\r\n readonly tertiary: string;\r\n };\r\n readonly cursor: string;\r\n readonly diff: {\r\n readonly add: string;\r\n readonly remove: string;\r\n };\r\n readonly message: {\r\n readonly userBlockBg: string;\r\n readonly userGutter: string;\r\n };\r\n readonly mode: ColorMode;\r\n readonly reasoning: string;\r\n readonly role: {\r\n readonly assistant: string;\r\n readonly user: string;\r\n };\r\n readonly spinner: {\r\n readonly frames: readonly string[];\r\n readonly palette: readonly string[];\r\n };\r\n readonly workingSpinner: {\r\n readonly base: string;\r\n readonly highlight: string;\r\n };\r\n readonly status: {\r\n readonly accent: string;\r\n readonly error: string;\r\n readonly idle: string;\r\n readonly running: string;\r\n readonly success: string;\r\n readonly waiting: string;\r\n readonly warning: string;\r\n };\r\n readonly text: {\r\n readonly dim: string;\r\n readonly heading: string;\r\n readonly headingAccent: string;\r\n readonly link: string;\r\n readonly muted: string;\r\n readonly normal: string;\r\n readonly strong: string;\r\n };\r\n readonly tool: {\r\n readonly arg: string;\r\n readonly failed: string;\r\n readonly name: string;\r\n readonly running: string;\r\n readonly success: string;\r\n };\r\n}\r\n\r\nexport const BRAILLE_SPINNER_FRAMES = [\r\n \"⠋\",\r\n \"⠙\",\r\n \"⠹\",\r\n \"⠸\",\r\n \"⠼\",\r\n \"⠴\",\r\n \"⠦\",\r\n \"⠧\",\r\n \"⠇\",\r\n \"⠏\",\r\n] as const;\r\n\r\nexport function createTheme(mode: ColorMode, colorLevel = 3): Theme {\r\n const palette = mode === \"light\" ? lightPalette : darkPalette;\r\n const color = createColorResolver(palette, colorLevel);\r\n\r\n return {\r\n border: color(\"border\", \"gray\"),\r\n brandTitle: {\r\n primary: color(\"gold\", \"yellow\"),\r\n secondary: color(\"purple\", \"magenta\"),\r\n tertiary: color(\"skyBlue\", \"cyan\"),\r\n },\r\n cursor: color(\"goldBright\", \"yellow\"),\r\n diff: {\r\n add: color(\"green\", \"green\"),\r\n remove: color(\"red\", \"red\"),\r\n },\r\n message: {\r\n userBlockBg: color(\"userBlockBg\", \"blue\"),\r\n userGutter: color(\"textMuted\", \"gray\"),\r\n },\r\n mode,\r\n reasoning: color(\"textMuted\", \"gray\"),\r\n role: {\r\n assistant: color(\"text\", \"white\"),\r\n user: color(\"text\", \"white\"),\r\n },\r\n spinner: {\r\n frames: BRAILLE_SPINNER_FRAMES,\r\n palette: [color(\"gold\", \"yellow\")],\r\n },\r\n workingSpinner: {\r\n base: color(\"purple\", \"magenta\"),\r\n highlight: color(\"purpleShimmer\", \"whiteBright\"),\r\n },\r\n status: {\r\n accent: color(\"skyBlue\", \"cyan\"),\r\n error: color(\"red\", \"red\"),\r\n idle: color(\"textDim\", \"gray\"),\r\n running: color(\"gold\", \"yellow\"),\r\n success: color(\"green\", \"green\"),\r\n waiting: color(\"yellow\", \"yellow\"),\r\n warning: color(\"yellow\", \"yellow\"),\r\n },\r\n text: {\r\n dim: color(\"textDim\", \"gray\"),\r\n heading: color(\"gold\", \"yellow\"),\r\n headingAccent: color(\"skyBlue\", \"cyan\"),\r\n link: color(\"skyBlue\", \"cyan\"),\r\n muted: color(\"textMuted\", \"gray\"),\r\n normal: color(\"text\", \"white\"),\r\n strong: color(\"textStrong\", \"white\"),\r\n },\r\n tool: {\r\n arg: color(\"textDim\", \"gray\"),\r\n failed: color(\"red\", \"red\"),\r\n name: color(\"gold\", \"yellow\"),\r\n running: color(\"purple\", \"magenta\"),\r\n success: color(\"green\", \"green\"),\r\n },\r\n };\r\n}\r\n\r\nfunction createColorResolver(\r\n palette: RawPalette,\r\n colorLevel: number,\r\n): (key: keyof RawPalette, ansiName: string) => string {\r\n const useTrueColor = colorLevel >= 2;\r\n return (key, ansiName) => (useTrueColor ? palette[key] : ansiName);\r\n}\r\n","import chalk from \"chalk\";\r\nimport {\r\n createTheme,\r\n type ColorLevel,\r\n type ColorMode,\r\n type Theme,\r\n} from \"./tokens.js\";\r\n\r\nexport interface DetectThemeInput {\r\n readonly chalkLevel?: number;\r\n readonly env?: Readonly<Record<string, string | undefined>>;\r\n}\r\n\r\nexport interface ThemeDetection {\r\n readonly colorLevel: ColorLevel;\r\n readonly mode: ColorMode;\r\n readonly theme: Theme;\r\n}\r\n\r\nexport function detectTheme(input: DetectThemeInput = {}): ThemeDetection {\r\n const env = input.env ?? process.env;\r\n const mode = detectMode(env);\r\n const colorLevel = detectColorLevel(env, input.chalkLevel ?? chalk.level);\r\n\r\n return {\r\n colorLevel,\r\n mode,\r\n theme: createTheme(mode, colorLevel),\r\n };\r\n}\r\n\r\nfunction detectMode(\r\n env: Readonly<Record<string, string | undefined>>,\r\n): ColorMode {\r\n const explicit = env.OHBABY_TUI_THEME?.trim().toLowerCase();\r\n return explicit === \"light\" ? \"light\" : \"dark\";\r\n}\r\n\r\nfunction detectColorLevel(\r\n env: Readonly<Record<string, string | undefined>>,\r\n chalkLevel: number,\r\n): ColorLevel {\r\n if (env.NO_COLOR !== undefined || env.FORCE_COLOR === \"0\") {\r\n return 0;\r\n }\r\n\r\n const forced = parseForcedColor(env.FORCE_COLOR);\r\n if (forced !== undefined) {\r\n return forced;\r\n }\r\n\r\n return normalizeColorLevel(chalkLevel);\r\n}\r\n\r\nfunction parseForcedColor(value: string | undefined): ColorLevel | undefined {\r\n if (value === undefined || value.trim() === \"\") {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === \"true\") {\r\n return 1;\r\n }\r\n\r\n const parsed = Number.parseInt(normalized, 10);\r\n return Number.isNaN(parsed) ? undefined : normalizeColorLevel(parsed);\r\n}\r\n\r\nfunction normalizeColorLevel(value: number): ColorLevel {\r\n if (value <= 0) {\r\n return 0;\r\n }\r\n if (value === 1) {\r\n return 1;\r\n }\r\n if (value === 2) {\r\n return 2;\r\n }\r\n return 3;\r\n}\r\n","import {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type ReactElement,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { detectTheme, type ThemeDetection } from \"./detect.js\";\r\nimport type { Theme } from \"./tokens.js\";\r\n\r\nexport { darkPalette, lightPalette, type RawPalette } from \"./colors.js\";\r\nexport {\r\n detectTheme,\r\n type DetectThemeInput,\r\n type ThemeDetection,\r\n} from \"./detect.js\";\r\nexport {\r\n BRAILLE_SPINNER_FRAMES,\r\n createTheme,\r\n type ColorLevel,\r\n type ColorMode,\r\n type Theme,\r\n} from \"./tokens.js\";\r\n\r\nconst defaultDetection = detectTheme();\r\nconst ThemeContext = createContext<Theme>(defaultDetection.theme);\r\n\r\nexport interface ThemeProviderProps {\r\n readonly children: ReactNode;\r\n readonly detection?: ThemeDetection;\r\n readonly theme?: Theme;\r\n}\r\n\r\nexport function ThemeProvider({\r\n children,\r\n detection,\r\n theme,\r\n}: ThemeProviderProps): ReactElement {\r\n const resolvedTheme = useMemo(\r\n () => theme ?? detection?.theme ?? detectTheme().theme,\r\n [detection, theme],\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={resolvedTheme}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useTheme(): Theme {\r\n return useContext(ThemeContext);\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type { CoreAPI } from \"ohbaby-sdk\";\r\nimport { useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport type { TuiInteractionRequest } from \"../store/snapshot.js\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nexport interface ConfirmDialogProps {\r\n readonly client: CoreAPI;\r\n readonly interaction: TuiInteractionRequest;\r\n}\r\n\r\nexport function ConfirmDialog({\r\n client,\r\n interaction,\r\n}: ConfirmDialogProps): ReactElement {\r\n const theme = useTheme();\r\n const [pending, setPending] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useInput((_, key) => {\r\n if (pending) {\r\n return;\r\n }\r\n\r\n if (key.return) {\r\n setPending(true);\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n kind: \"accepted\",\r\n value: true,\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n }\r\n\r\n if (key.escape) {\r\n setPending(true);\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n kind: \"cancelled\",\r\n reason: \"user-cancelled\",\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n }\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color={theme.status.warning}>\r\n Confirm: {interaction.title ?? \"Confirm\"}\r\n </Text>\r\n {interaction.message === undefined ? null : (\r\n <Text>{interaction.message}</Text>\r\n )}\r\n {pending ? <Text dimColor>sending...</Text> : null}\r\n {error === null ? null : <Text color={theme.status.error}>{error}</Text>}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"Interaction failed\";\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type { CoreAPI } from \"ohbaby-sdk\";\r\nimport { useRef, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport type { TuiInteractionRequest } from \"../store/snapshot.js\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nconst SELECT_ONE_PAGE_SIZE = 6;\r\n\r\nexport interface SelectOneDialogProps {\r\n readonly client: CoreAPI;\r\n readonly interaction: TuiInteractionRequest;\r\n readonly title: string;\r\n}\r\n\r\nexport function SelectOneDialog({\r\n client,\r\n interaction,\r\n title,\r\n}: SelectOneDialogProps): ReactElement {\r\n const theme = useTheme();\r\n const options = interaction.options ?? [];\r\n const [selectedIndex, setSelectedIndex] = useState(0);\r\n const selectedIndexRef = useRef(0);\r\n const [pending, setPending] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const selectIndex = (index: number): void => {\r\n selectedIndexRef.current = index;\r\n setSelectedIndex(index);\r\n };\r\n\r\n const selectPagedIndex = (delta: number): void => {\r\n if (options.length === 0) {\r\n selectIndex(0);\r\n return;\r\n }\r\n selectIndex(\r\n Math.max(\r\n 0,\r\n Math.min(options.length - 1, selectedIndexRef.current + delta),\r\n ),\r\n );\r\n };\r\n\r\n useInput((value, key) => {\r\n if (pending) {\r\n return;\r\n }\r\n\r\n const numericIndex = Number.parseInt(value, 10) - 1;\r\n\r\n if (\r\n Number.isInteger(numericIndex) &&\r\n numericIndex >= 0 &&\r\n numericIndex < options.length\r\n ) {\r\n selectIndex(numericIndex);\r\n return;\r\n }\r\n\r\n if (key.upArrow || key.leftArrow) {\r\n selectIndex(\r\n options.length === 0\r\n ? 0\r\n : (selectedIndexRef.current - 1 + options.length) % options.length,\r\n );\r\n return;\r\n }\r\n\r\n if (key.downArrow || key.rightArrow || key.tab) {\r\n selectIndex(\r\n options.length === 0\r\n ? 0\r\n : (selectedIndexRef.current + 1) % options.length,\r\n );\r\n return;\r\n }\r\n\r\n if (key.pageUp) {\r\n selectPagedIndex(-SELECT_ONE_PAGE_SIZE);\r\n return;\r\n }\r\n\r\n if (key.pageDown) {\r\n selectPagedIndex(SELECT_ONE_PAGE_SIZE);\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n setPending(true);\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n kind: \"cancelled\",\r\n reason: \"user-cancelled\",\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n return;\r\n }\r\n\r\n if (key.return && options.length > 0) {\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n choiceId: options[selectedIndexRef.current % options.length].id,\r\n kind: \"accepted\",\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n setPending(true);\r\n }\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color={theme.status.warning}>\r\n {title}: {interaction.title ?? \"Select one\"}\r\n </Text>\r\n {options.map((option, index) => (\r\n <Text key={option.id}>\r\n {index === selectedIndex ? \">\" : \" \"} {String(index + 1)}.{\" \"}\r\n {option.label}\r\n </Text>\r\n ))}\r\n {options.length === 0 ? <Text dimColor>No options</Text> : null}\r\n {pending ? <Text dimColor>sending...</Text> : null}\r\n {error === null ? null : <Text color={theme.status.error}>{error}</Text>}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"Interaction failed\";\r\n}\r\n","import type { CoreAPI } from \"ohbaby-sdk\";\r\nimport type { TuiInteractionRequest } from \"../store/snapshot.js\";\r\nimport type { ReactElement } from \"react\";\r\nimport { SelectOneDialog } from \"./select-one.js\";\r\n\r\nexport interface ModelDialogProps {\r\n readonly client: CoreAPI;\r\n readonly interaction: TuiInteractionRequest;\r\n}\r\n\r\nexport function ModelDialog({\r\n client,\r\n interaction,\r\n}: ModelDialogProps): ReactElement {\r\n return (\r\n <SelectOneDialog client={client} interaction={interaction} title=\"Model\" />\r\n );\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type { CoreAPI, UiPermissionRequest } from \"ohbaby-sdk\";\r\nimport { useRef, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nexport interface PermissionDialogProps {\r\n readonly client: CoreAPI;\r\n readonly request: UiPermissionRequest;\r\n}\r\n\r\nexport function PermissionDialog({\r\n client,\r\n request,\r\n}: PermissionDialogProps): ReactElement {\r\n const theme = useTheme();\r\n const [selectedIndex, setSelectedIndex] = useState(() =>\r\n findInitialChoiceIndex(request),\r\n );\r\n const selectedIndexRef = useRef(selectedIndex);\r\n const [pending, setPending] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const selectIndex = (index: number): void => {\r\n selectedIndexRef.current = index;\r\n setSelectedIndex(index);\r\n };\r\n\r\n useInput((_, key) => {\r\n if (pending) {\r\n return;\r\n }\r\n\r\n if (key.upArrow || key.leftArrow) {\r\n if (request.choices.length === 0) {\r\n return;\r\n }\r\n\r\n selectIndex(\r\n (selectedIndexRef.current - 1 + request.choices.length) %\r\n request.choices.length,\r\n );\r\n return;\r\n }\r\n\r\n if (key.downArrow || key.rightArrow || key.tab) {\r\n if (request.choices.length === 0) {\r\n return;\r\n }\r\n\r\n selectIndex((selectedIndexRef.current + 1) % request.choices.length);\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n respondWithChoice(\r\n client,\r\n request,\r\n findEscapeDefaultChoiceIndex(request),\r\n setPending,\r\n setError,\r\n );\r\n return;\r\n }\r\n\r\n if (key.return) {\r\n respondWithChoice(\r\n client,\r\n request,\r\n selectedIndexRef.current,\r\n setPending,\r\n setError,\r\n );\r\n }\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color={theme.status.warning}>Permission: {request.title}</Text>\r\n <Text>{request.description}</Text>\r\n {request.choices.map((choice, index) => (\r\n <Text key={choice.id}>\r\n {index === selectedIndex ? \">\" : \" \"} {choice.label} [{choice.intent}]\r\n </Text>\r\n ))}\r\n {request.choices.length === 0 ? <Text dimColor>No choices</Text> : null}\r\n {request.choices.length === 0 ? null : (\r\n <Text dimColor>Enter select | Esc safe default | arrows move</Text>\r\n )}\r\n {pending ? <Text dimColor>sending...</Text> : null}\r\n {error === null ? null : <Text color={theme.status.error}>{error}</Text>}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction respondWithChoice(\r\n client: CoreAPI,\r\n request: UiPermissionRequest,\r\n choiceIndex: number,\r\n setPending: (pending: boolean) => void,\r\n setError: (message: string | null) => void,\r\n): void {\r\n if (request.choices.length === 0) {\r\n setError(\"Permission request has no choices\");\r\n return;\r\n }\r\n\r\n const choice = request.choices[choiceIndex % request.choices.length];\r\n\r\n setPending(true);\r\n void client\r\n .respondPermission(request.id, { choiceId: choice.id })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n}\r\n\r\nfunction findInitialChoiceIndex(request: UiPermissionRequest): number {\r\n const allowIndex = request.choices.findIndex(\r\n (choice) => choice.intent === \"allow\",\r\n );\r\n\r\n return allowIndex >= 0 ? allowIndex : findEscapeDefaultChoiceIndex(request);\r\n}\r\n\r\nfunction findEscapeDefaultChoiceIndex(request: UiPermissionRequest): number {\r\n const denyIndex = request.choices.findIndex(\r\n (choice) => choice.intent === \"deny\",\r\n );\r\n\r\n if (denyIndex >= 0) {\r\n return denyIndex;\r\n }\r\n\r\n const abortIndex = request.choices.findIndex(\r\n (choice) => choice.intent === \"abort\",\r\n );\r\n\r\n return abortIndex >= 0 ? abortIndex : 0;\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"Permission response failed\";\r\n}\r\n","export interface TuiLayoutMetrics {\r\n readonly columns: number;\r\n readonly rows: number;\r\n readonly contentWidth: number;\r\n readonly horizontalPadding: number;\r\n readonly isCompact: boolean;\r\n readonly liveTailRows: number;\r\n}\r\n\r\nconst MAX_CONTENT_WIDTH = 220;\r\n// Rows kept free for the prompt, spinner, notices, and margins so the dynamic\r\n// (non-Static) frame never reaches the terminal height. Ink falls back to a\r\n// clearTerminal-per-frame strategy once the frame is as tall as the terminal,\r\n// which wipes the scrollback buffer and flickers on every render.\r\nconst LIVE_TAIL_RESERVED_ROWS = 10;\r\nconst MIN_LIVE_TAIL_ROWS = 3;\r\n\r\nexport function computeLayoutMetrics(input: {\r\n readonly columns: number;\r\n readonly rows: number;\r\n}): TuiLayoutMetrics {\r\n // Non-TTY streams (tests, pipes) report no dimensions; fall back to a\r\n // conventional 80x24 terminal instead of letting NaN poison the layout.\r\n const columns = Math.max(\r\n 1,\r\n Math.floor(Number.isFinite(input.columns) ? input.columns : 80),\r\n );\r\n const rows = Math.max(\r\n 1,\r\n Math.floor(Number.isFinite(input.rows) ? input.rows : 24),\r\n );\r\n const isCompact = columns < 80;\r\n const horizontalPadding = isCompact ? 2 : 4;\r\n const contentWidth = Math.min(\r\n MAX_CONTENT_WIDTH,\r\n Math.max(24, columns - horizontalPadding * 2),\r\n );\r\n\r\n const liveTailRows = Math.max(\r\n MIN_LIVE_TAIL_ROWS,\r\n rows - LIVE_TAIL_RESERVED_ROWS,\r\n );\r\n\r\n return {\r\n columns,\r\n contentWidth,\r\n horizontalPadding,\r\n isCompact,\r\n liveTailRows,\r\n rows,\r\n };\r\n}\r\n","import { createContext, useContext } from \"react\";\r\nimport type { ReactElement, ReactNode } from \"react\";\r\nimport { computeLayoutMetrics, type TuiLayoutMetrics } from \"./metrics.js\";\r\n\r\nconst DEFAULT_METRICS = computeLayoutMetrics({ columns: 80, rows: 24 });\r\n\r\nconst LayoutContext = createContext<TuiLayoutMetrics>(DEFAULT_METRICS);\r\n\r\nexport interface LayoutProviderProps {\r\n readonly children: ReactNode;\r\n readonly value: TuiLayoutMetrics;\r\n}\r\n\r\nexport function LayoutProvider({\r\n children,\r\n value,\r\n}: LayoutProviderProps): ReactElement {\r\n return (\r\n <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>\r\n );\r\n}\r\n\r\nexport function useTuiLayout(): TuiLayoutMetrics {\r\n return useContext(LayoutContext);\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { ReactElement, ReactNode } from \"react\";\r\nimport { useTuiLayout } from \"../../layout/context.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\n\r\nexport interface OverlayCardProps {\r\n readonly children: ReactNode;\r\n readonly title: string;\r\n}\r\n\r\nexport function OverlayCard({\r\n children,\r\n title,\r\n}: OverlayCardProps): ReactElement {\r\n const layout = useTuiLayout();\r\n const theme = useTheme();\r\n const width = Math.max(24, Math.min(88, layout.contentWidth));\r\n\r\n return (\r\n <Box justifyContent=\"center\" width={layout.contentWidth}>\r\n <Box\r\n borderColor={theme.border}\r\n borderStyle=\"round\"\r\n flexDirection=\"column\"\r\n paddingX={2}\r\n paddingY={1}\r\n width={width}\r\n >\r\n <Box justifyContent=\"space-between\">\r\n <Text bold color={theme.text.headingAccent}>\r\n {title}\r\n </Text>\r\n <Text color={theme.text.muted}>esc</Text>\r\n </Box>\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n {children}\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n","const ANSI_ESCAPE = String.fromCharCode(27);\r\nconst ANSI_RESET = `${ANSI_ESCAPE}[0m`;\r\nconst ANSI_ESCAPE_PATTERN = new RegExp(\r\n `${ANSI_ESCAPE}\\\\[[0-?]*[ -/]*[@-~]`,\r\n \"gu\",\r\n);\r\n\r\nexport function visibleWidth(input: string): number {\r\n let width = 0;\r\n for (const token of tokenizeAnsi(input)) {\r\n if (token.kind === \"ansi\") {\r\n continue;\r\n }\r\n width += charWidth(token.value);\r\n }\r\n return width;\r\n}\r\n\r\nexport function wrapAnsi(input: string, width: number): string[] {\r\n const targetWidth = normalizeWidth(width);\r\n if (!ANSI_ESCAPE_PATTERN.test(input)) {\r\n ANSI_ESCAPE_PATTERN.lastIndex = 0;\r\n return wrapPlainText(input, targetWidth);\r\n }\r\n ANSI_ESCAPE_PATTERN.lastIndex = 0;\r\n const lines: string[] = [];\r\n let current = \"\";\r\n let currentWidth = 0;\r\n\r\n for (const token of tokenizeAnsi(input)) {\r\n if (token.kind === \"ansi\") {\r\n current += token.value;\r\n continue;\r\n }\r\n\r\n if (token.value === \"\\n\") {\r\n lines.push(current);\r\n current = \"\";\r\n currentWidth = 0;\r\n continue;\r\n }\r\n\r\n const nextWidth = charWidth(token.value);\r\n if (currentWidth > 0 && currentWidth + nextWidth > targetWidth) {\r\n lines.push(current.trimEnd());\r\n current = \"\";\r\n currentWidth = 0;\r\n }\r\n\r\n current += token.value;\r\n currentWidth += nextWidth;\r\n }\r\n\r\n lines.push(current.trimEnd());\r\n return lines;\r\n}\r\n\r\nfunction wrapPlainText(input: string, width: number): string[] {\r\n return input.split(\"\\n\").flatMap((line) => {\r\n if (line === \"\") {\r\n return [\"\"];\r\n }\r\n\r\n const words = line.split(/(\\s+)/u).filter((part) => part.length > 0);\r\n const output: string[] = [];\r\n let current = \"\";\r\n\r\n for (const word of words) {\r\n if (/^\\s+$/u.test(word)) {\r\n if (current !== \"\") {\r\n current += \" \";\r\n }\r\n continue;\r\n }\r\n\r\n if (visibleWidth(word) > width) {\r\n if (current.trimEnd() !== \"\") {\r\n output.push(current.trimEnd());\r\n current = \"\";\r\n }\r\n output.push(...wrapLongPlainWord(word, width));\r\n continue;\r\n }\r\n\r\n const next = current === \"\" ? word : `${current}${word}`;\r\n if (visibleWidth(next) <= width) {\r\n current = next;\r\n continue;\r\n }\r\n\r\n output.push(current.trimEnd());\r\n current = word;\r\n }\r\n\r\n if (current !== \"\") {\r\n output.push(current.trimEnd());\r\n }\r\n return output.length > 0 ? output : [\"\"];\r\n });\r\n}\r\n\r\nfunction wrapLongPlainWord(word: string, width: number): string[] {\r\n const output: string[] = [];\r\n let current = \"\";\r\n let currentWidth = 0;\r\n for (const char of word) {\r\n const nextWidth = charWidth(char);\r\n if (currentWidth > 0 && currentWidth + nextWidth > width) {\r\n output.push(current);\r\n current = \"\";\r\n currentWidth = 0;\r\n }\r\n current += char;\r\n currentWidth += nextWidth;\r\n }\r\n if (current !== \"\") {\r\n output.push(current);\r\n }\r\n return output;\r\n}\r\n\r\nexport function truncateAnsi(input: string, width: number): string {\r\n const targetWidth = normalizeWidth(width);\r\n if (visibleWidth(input) <= targetWidth) {\r\n return input;\r\n }\r\n\r\n if (targetWidth <= 3) {\r\n return \".\".repeat(targetWidth);\r\n }\r\n\r\n const contentWidth = targetWidth - 3;\r\n let currentWidth = 0;\r\n let output = \"\";\r\n const trailingAnsi: string[] = [];\r\n\r\n for (const token of tokenizeAnsi(input)) {\r\n if (token.kind === \"ansi\") {\r\n output += token.value;\r\n if (isAnsiReset(token.value)) {\r\n trailingAnsi.length = 0;\r\n } else {\r\n trailingAnsi.push(ANSI_RESET);\r\n }\r\n continue;\r\n }\r\n\r\n const nextWidth = charWidth(token.value);\r\n if (currentWidth + nextWidth > contentWidth) {\r\n break;\r\n }\r\n output += token.value;\r\n currentWidth += nextWidth;\r\n }\r\n\r\n const trailingReset = trailingAnsi.length > 0 ? ANSI_RESET : \"\";\r\n return `${output}...${trailingReset}`;\r\n}\r\n\r\ninterface AnsiToken {\r\n readonly kind: \"ansi\" | \"text\";\r\n readonly value: string;\r\n}\r\n\r\nfunction tokenizeAnsi(input: string): readonly AnsiToken[] {\r\n const tokens: AnsiToken[] = [];\r\n let lastIndex = 0;\r\n\r\n for (const match of input.matchAll(ANSI_ESCAPE_PATTERN)) {\r\n const index = match.index;\r\n pushTextTokens(tokens, input.slice(lastIndex, index));\r\n tokens.push({ kind: \"ansi\", value: match[0] });\r\n lastIndex = index + match[0].length;\r\n }\r\n\r\n pushTextTokens(tokens, input.slice(lastIndex));\r\n return tokens;\r\n}\r\n\r\nfunction pushTextTokens(tokens: AnsiToken[], text: string): void {\r\n for (const char of text) {\r\n tokens.push({ kind: \"text\", value: char });\r\n }\r\n}\r\n\r\nfunction normalizeWidth(width: number): number {\r\n return Math.max(1, Math.floor(width));\r\n}\r\n\r\nfunction charWidth(char: string): number {\r\n const codePoint = char.codePointAt(0);\r\n if (codePoint === undefined) {\r\n return 0;\r\n }\r\n if (char === \"\\n\" || char === \"\\r\") {\r\n return 0;\r\n }\r\n if (codePoint === 0) {\r\n return 0;\r\n }\r\n if (\r\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\r\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f)\r\n ) {\r\n return 0;\r\n }\r\n if (\r\n codePoint >= 0x1100 &&\r\n (codePoint <= 0x115f ||\r\n codePoint === 0x2329 ||\r\n codePoint === 0x232a ||\r\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf) ||\r\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\r\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\r\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\r\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\r\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\r\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\r\n (codePoint >= 0x1f300 && codePoint <= 0x1faff))\r\n ) {\r\n return 2;\r\n }\r\n return 1;\r\n}\r\n\r\nfunction isAnsiReset(value: string): boolean {\r\n return value === \"\\u001B[0m\" || value === \"\\u001B[m\";\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type { CoreAPI } from \"ohbaby-sdk\";\r\nimport { useRef, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport { OverlayCard } from \"../components/dialog/overlay-card.js\";\r\nimport { useTuiLayout } from \"../layout/context.js\";\r\nimport { truncateAnsi, visibleWidth } from \"../render/wrap.js\";\r\nimport type {\r\n TuiInteractionOption,\r\n TuiInteractionRequest,\r\n} from \"../store/snapshot.js\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nconst SESSION_PAGE_SIZE = 10;\r\nconst SESSION_TIME_WIDTH = 11;\r\nconst ROW_MARKER_WIDTH = 2;\r\nconst ROW_GAP_WIDTH = 2;\r\n\r\nexport interface SessionDialogProps {\r\n readonly client: CoreAPI;\r\n readonly interaction: TuiInteractionRequest;\r\n readonly title?: string;\r\n}\r\n\r\nexport function SessionDialog({\r\n client,\r\n interaction,\r\n title = \"Session\",\r\n}: SessionDialogProps): ReactElement {\r\n const layout = useTuiLayout();\r\n const theme = useTheme();\r\n const options = interaction.options ?? [];\r\n const [selectedIndex, setSelectedIndex] = useState(0);\r\n const selectedIndexRef = useRef(0);\r\n const [pending, setPending] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const cardWidth = Math.max(24, Math.min(88, layout.contentWidth));\r\n const contentWidth = Math.max(18, cardWidth - 6);\r\n const pageStart =\r\n options.length === 0\r\n ? 0\r\n : Math.floor(selectedIndex / SESSION_PAGE_SIZE) * SESSION_PAGE_SIZE;\r\n const pageEnd = Math.min(options.length, pageStart + SESSION_PAGE_SIZE);\r\n const visibleOptions = options.slice(pageStart, pageEnd);\r\n\r\n const selectIndex = (index: number): void => {\r\n const clampedIndex =\r\n options.length === 0 ? 0 : Math.max(0, Math.min(options.length - 1, index));\r\n selectedIndexRef.current = clampedIndex;\r\n setSelectedIndex(clampedIndex);\r\n };\r\n\r\n const selectPagedIndex = (delta: number): void => {\r\n selectIndex(selectedIndexRef.current + delta);\r\n };\r\n\r\n useInput((value, key) => {\r\n if (pending) {\r\n return;\r\n }\r\n\r\n const numericIndex = Number.parseInt(value, 10) - 1;\r\n\r\n if (\r\n Number.isInteger(numericIndex) &&\r\n numericIndex >= 0 &&\r\n numericIndex < options.length\r\n ) {\r\n selectIndex(numericIndex);\r\n return;\r\n }\r\n\r\n if (key.upArrow || key.leftArrow) {\r\n selectIndex(selectedIndexRef.current - 1);\r\n return;\r\n }\r\n\r\n if (key.downArrow || key.rightArrow || key.tab) {\r\n selectIndex(selectedIndexRef.current + 1);\r\n return;\r\n }\r\n\r\n if (key.pageUp) {\r\n selectPagedIndex(-SESSION_PAGE_SIZE);\r\n return;\r\n }\r\n\r\n if (key.pageDown) {\r\n selectPagedIndex(SESSION_PAGE_SIZE);\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n setPending(true);\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n kind: \"cancelled\",\r\n reason: \"user-cancelled\",\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n return;\r\n }\r\n\r\n if (key.return && options.length > 0) {\r\n void client\r\n .respondInteraction(interaction.interactionId, {\r\n choiceId: options[selectedIndexRef.current]?.id,\r\n kind: \"accepted\",\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n setPending(false);\r\n });\r\n setPending(true);\r\n }\r\n });\r\n\r\n return (\r\n <OverlayCard title={title}>\r\n <Box flexDirection=\"column\">\r\n {visibleOptions.map((option, offset) => {\r\n const optionIndex = pageStart + offset;\r\n return (\r\n <SessionOptionRow\r\n contentWidth={contentWidth}\r\n key={option.id}\r\n option={option}\r\n selected={optionIndex === selectedIndex}\r\n />\r\n );\r\n })}\r\n {options.length === 0 ? <Text dimColor>No sessions</Text> : null}\r\n <Box marginTop={1}>\r\n <Text color={theme.text.muted}>\r\n {formatFooter(pageStart, pageEnd, options.length)}\r\n </Text>\r\n </Box>\r\n {pending ? <Text dimColor>sending...</Text> : null}\r\n {error === null ? null : (\r\n <Text color={theme.status.error}>{error}</Text>\r\n )}\r\n </Box>\r\n </OverlayCard>\r\n );\r\n}\r\n\r\nfunction SessionOptionRow({\r\n contentWidth,\r\n option,\r\n selected,\r\n}: {\r\n readonly contentWidth: number;\r\n readonly option: TuiInteractionOption;\r\n readonly selected: boolean;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n const updatedAt = formatUpdatedAt(option.metadata?.updatedAt);\r\n const titleWidth = Math.max(\r\n 4,\r\n contentWidth -\r\n ROW_MARKER_WIDTH -\r\n ROW_GAP_WIDTH -\r\n Math.max(SESSION_TIME_WIDTH, visibleWidth(updatedAt)),\r\n );\r\n const title = truncateAnsi(option.label.trim() || option.id, titleWidth);\r\n const marker = selected ? \">\" : \" \";\r\n const color = selected ? theme.text.headingAccent : theme.text.normal;\r\n\r\n return (\r\n <Box justifyContent=\"space-between\" width={contentWidth}>\r\n <Text color={color}>\r\n {marker} {title}\r\n </Text>\r\n <Text color={theme.text.muted}>{updatedAt}</Text>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction formatFooter(start: number, end: number, total: number): string {\r\n if (total === 0) {\r\n return \"showing 0 of 0 · pgup/pgdn · ↑↓\";\r\n }\r\n return `showing ${String(start + 1)}-${String(end)} of ${String(\r\n total,\r\n )} · pgup/pgdn · ↑↓`;\r\n}\r\n\r\nfunction formatUpdatedAt(value: unknown): string {\r\n const timestamp = parseTimestamp(value);\r\n if (timestamp === undefined) {\r\n return \"\";\r\n }\r\n\r\n const date = new Date(timestamp);\r\n if (Number.isNaN(date.getTime())) {\r\n return \"\";\r\n }\r\n\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n const hours = String(date.getHours()).padStart(2, \"0\");\r\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\r\n return `${month}-${day} ${hours}:${minutes}`;\r\n}\r\n\r\nfunction parseTimestamp(value: unknown): number | undefined {\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n return value;\r\n }\r\n if (typeof value !== \"string\" || value.trim() === \"\") {\r\n return undefined;\r\n }\r\n const timestamp = Date.parse(value);\r\n return Number.isNaN(timestamp) ? undefined : timestamp;\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"Interaction failed\";\r\n}\r\n","import type { CoreAPI, UiPermissionRequest } from \"ohbaby-sdk\";\r\nimport type { ReactElement } from \"react\";\r\nimport { ConfirmDialog } from \"./confirm.js\";\r\nimport { ModelDialog } from \"./model-dialog.js\";\r\nimport { PermissionDialog } from \"./permission-dialog.js\";\r\nimport { SelectOneDialog } from \"./select-one.js\";\r\nimport { SessionDialog } from \"./session-dialog.js\";\r\nimport type { TuiInteractionRequest } from \"../store/snapshot.js\";\r\n\r\nexport interface DialogManagerProps {\r\n readonly client: CoreAPI;\r\n readonly interactions: readonly TuiInteractionRequest[];\r\n readonly permissions: readonly UiPermissionRequest[];\r\n}\r\n\r\nexport function DialogManager({\r\n client,\r\n interactions,\r\n permissions,\r\n}: DialogManagerProps): ReactElement {\r\n if (permissions.length > 0) {\r\n return (\r\n <PermissionDialog\r\n client={client}\r\n key={permissions[0].id}\r\n request={permissions[0]}\r\n />\r\n );\r\n }\r\n\r\n if (interactions.length === 0) {\r\n return <></>;\r\n }\r\n\r\n const interaction = interactions[0];\r\n\r\n if (interaction.kind === \"select-one\" && interaction.subject === \"model\") {\r\n return (\r\n <ModelDialog\r\n client={client}\r\n interaction={interaction}\r\n key={interaction.interactionId}\r\n />\r\n );\r\n }\r\n\r\n if (interaction.kind === \"select-one\" && interaction.subject === \"session\") {\r\n return (\r\n <SessionDialog\r\n client={client}\r\n interaction={interaction}\r\n key={interaction.interactionId}\r\n />\r\n );\r\n }\r\n\r\n if (interaction.kind === \"select-one\") {\r\n return (\r\n <SelectOneDialog\r\n client={client}\r\n key={interaction.interactionId}\r\n interaction={interaction}\r\n title={interaction.title ?? \"Select\"}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <ConfirmDialog\r\n client={client}\r\n interaction={interaction}\r\n key={interaction.interactionId}\r\n />\r\n );\r\n}\r\n","import type { UiContextWindowUsage } from \"ohbaby-sdk\";\r\n\r\nexport function formatContextWindowUsage(\r\n usage: UiContextWindowUsage | null | undefined,\r\n): string {\r\n if (!usage || !Number.isFinite(usage.contextWindowTokens)) {\r\n return \"\";\r\n }\r\n if (usage.contextWindowTokens <= 0) {\r\n return \"\";\r\n }\r\n\r\n return `${formatTokenAmount(usage.currentTokens)} / ${formatTokenAmount(\r\n usage.contextWindowTokens,\r\n )} (${formatPercent(usage.contextWindowRatio)})`;\r\n}\r\n\r\nfunction formatTokenAmount(value: number): string {\r\n if (!Number.isFinite(value)) {\r\n return \"0\";\r\n }\r\n\r\n const normalized = Math.max(0, value);\r\n if (normalized >= 1_000_000) {\r\n return `${formatScaledNumber(normalized / 1_000_000)}M`;\r\n }\r\n if (normalized >= 1_000) {\r\n return `${formatScaledNumber(normalized / 1_000)}K`;\r\n }\r\n\r\n return String(Math.round(normalized));\r\n}\r\n\r\nfunction formatScaledNumber(value: number): string {\r\n const rounded = Math.round(value * 10) / 10;\r\n return Number.isInteger(rounded) ? String(rounded) : rounded.toFixed(1);\r\n}\r\n\r\nfunction formatPercent(ratio: number): string {\r\n if (!Number.isFinite(ratio) || ratio <= 0) {\r\n return \"0%\";\r\n }\r\n if (ratio < 0.01) {\r\n return \"<1%\";\r\n }\r\n\r\n return `${String(Math.round(ratio * 100))}%`;\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type {\r\n CoreAPI,\r\n UiCurrentModelConfig,\r\n UiConnectModelInput,\r\n UiConnectModelInterfaceProvider,\r\n UiRunStatus,\r\n} from \"ohbaby-sdk\";\r\nimport type { ReactElement } from \"react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\n\r\ntype ConnectFieldKey =\r\n | \"provider\"\r\n | \"baseUrl\"\r\n | \"apiKeyEnv\"\r\n | \"apiKey\"\r\n | \"model\"\r\n | \"contextWindowTokens\"\r\n | \"maxOutputTokens\";\r\n\r\ninterface ConnectField {\r\n readonly key: ConnectFieldKey;\r\n readonly label: string;\r\n readonly optional?: boolean;\r\n readonly secret?: boolean;\r\n}\r\n\r\ninterface ConnectDraft {\r\n readonly provider: string;\r\n readonly baseUrl: string;\r\n readonly apiKeyEnv: string;\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly contextWindowTokens: string;\r\n readonly maxOutputTokens: string;\r\n}\r\n\r\ninterface PendingSave {\r\n readonly input: UiConnectModelInput;\r\n readonly key: string;\r\n readonly secret?: string;\r\n}\r\n\r\ntype SaveState =\r\n | { readonly kind: \"idle\" }\r\n | { readonly kind: \"saving\" }\r\n | { readonly kind: \"saved\"; readonly warning?: string }\r\n | { readonly kind: \"error\"; readonly message: string };\r\n\r\nconst CONNECT_FIELDS: readonly ConnectField[] = [\r\n { key: \"provider\", label: \"Provider\" },\r\n { key: \"baseUrl\", label: \"Base URL\" },\r\n { key: \"apiKeyEnv\", label: \"API key env\" },\r\n { key: \"apiKey\", label: \"API key value\", secret: true },\r\n { key: \"model\", label: \"Model name\" },\r\n { key: \"contextWindowTokens\", label: \"Context window\", optional: true },\r\n { key: \"maxOutputTokens\", label: \"Max output tokens\", optional: true },\r\n];\r\n\r\nconst EMPTY_DRAFT: ConnectDraft = {\r\n apiKey: \"\",\r\n apiKeyEnv: \"\",\r\n baseUrl: \"\",\r\n contextWindowTokens: \"\",\r\n maxOutputTokens: \"\",\r\n model: \"\",\r\n provider: \"\",\r\n};\r\n\r\nexport interface ConnectPanelProps {\r\n readonly client: CoreAPI;\r\n readonly onClose: () => void;\r\n readonly runtime: UiRunStatus;\r\n}\r\n\r\nexport function ConnectPanel({\r\n client,\r\n onClose,\r\n runtime,\r\n}: ConnectPanelProps): ReactElement {\r\n const [draft, setDraft] = useState<ConnectDraft>(EMPTY_DRAFT);\r\n const [selectedIndex, setSelectedIndex] = useState(0);\r\n const [editingField, setEditingField] = useState<ConnectFieldKey | null>(\r\n null,\r\n );\r\n const [editValue, setEditValue] = useState(\"\");\r\n const [saveState, setSaveState] = useState<SaveState>({ kind: \"idle\" });\r\n const draftRef = useRef<ConnectDraft>(EMPTY_DRAFT);\r\n const hasLocalEditRef = useRef(false);\r\n const editValueRef = useRef(\"\");\r\n const lastSavedPayloadKeyRef = useRef<string | null>(null);\r\n const inFlightSaveKeyRef = useRef<string | null>(null);\r\n const latestSaveKeyRef = useRef<string | null>(null);\r\n const pendingSaveRef = useRef<PendingSave | null>(null);\r\n const lastSavedWarningRef = useRef<string | undefined>(undefined);\r\n\r\n const selectedField =\r\n CONNECT_FIELDS[Math.min(selectedIndex, CONNECT_FIELDS.length - 1)];\r\n const isRunning = runtime.kind === \"running\";\r\n\r\n const replaceEditValue = (nextValue: string): void => {\r\n editValueRef.current = nextValue;\r\n setEditValue(nextValue);\r\n };\r\n\r\n const replaceDraft = (nextDraft: ConnectDraft): void => {\r\n draftRef.current = nextDraft;\r\n setDraft(nextDraft);\r\n };\r\n\r\n useEffect(() => {\r\n let isStale = false;\r\n void client\r\n .getCurrentModel()\r\n .then((current) => {\r\n if (isStale || current === null || hasLocalEditRef.current) {\r\n return;\r\n }\r\n replaceDraft(draftFromCurrentModel(current));\r\n })\r\n .catch(() => undefined);\r\n\r\n return (): void => {\r\n isStale = true;\r\n };\r\n }, [client]);\r\n\r\n const startSave = (save: PendingSave): void => {\r\n inFlightSaveKeyRef.current = save.key;\r\n setSaveState({ kind: \"saving\" });\r\n void client\r\n .connectModel(save.input)\r\n .then((result) => {\r\n lastSavedPayloadKeyRef.current = save.key;\r\n lastSavedWarningRef.current = readConnectWarning(result);\r\n if (pendingSaveRef.current === null) {\r\n setSaveState(\r\n latestSaveKeyRef.current === save.key\r\n ? savedState(lastSavedWarningRef.current)\r\n : { kind: \"idle\" },\r\n );\r\n }\r\n })\r\n .catch((caught: unknown) => {\r\n if (\r\n pendingSaveRef.current === null &&\r\n latestSaveKeyRef.current === save.key\r\n ) {\r\n setSaveState({\r\n kind: \"error\",\r\n message: sanitizeError(caught, save.secret),\r\n });\r\n }\r\n })\r\n .finally(() => {\r\n if (inFlightSaveKeyRef.current === save.key) {\r\n inFlightSaveKeyRef.current = null;\r\n }\r\n const pending = pendingSaveRef.current;\r\n if (pending !== null) {\r\n pendingSaveRef.current = null;\r\n if (pending.key === lastSavedPayloadKeyRef.current) {\r\n setSaveState(savedState(lastSavedWarningRef.current));\r\n return;\r\n }\r\n startSave(pending);\r\n }\r\n });\r\n };\r\n\r\n const maybeSave = (nextDraft: ConnectDraft): void => {\r\n const payload = buildPayload(nextDraft);\r\n if (payload.kind === \"incomplete\") {\r\n latestSaveKeyRef.current = null;\r\n pendingSaveRef.current = null;\r\n if (inFlightSaveKeyRef.current === null) {\r\n setSaveState({ kind: \"idle\" });\r\n }\r\n return;\r\n }\r\n if (payload.kind === \"error\") {\r\n latestSaveKeyRef.current = null;\r\n pendingSaveRef.current = null;\r\n setSaveState({ kind: \"error\", message: payload.message });\r\n return;\r\n }\r\n if (isRunning) {\r\n return;\r\n }\r\n\r\n const payloadKey = JSON.stringify(payload.input);\r\n latestSaveKeyRef.current = payloadKey;\r\n if (payloadKey === lastSavedPayloadKeyRef.current) {\r\n pendingSaveRef.current = null;\r\n setSaveState(savedState(lastSavedWarningRef.current));\r\n return;\r\n }\r\n\r\n const save = {\r\n input: payload.input,\r\n key: payloadKey,\r\n ...(payload.input.apiKey === undefined\r\n ? {}\r\n : { secret: payload.input.apiKey }),\r\n };\r\n if (inFlightSaveKeyRef.current !== null) {\r\n pendingSaveRef.current =\r\n payloadKey === inFlightSaveKeyRef.current ? null : save;\r\n setSaveState({ kind: \"saving\" });\r\n return;\r\n }\r\n startSave(save);\r\n };\r\n\r\n useInput(\r\n (value, key) => {\r\n const isReturn = key.return || value === \"\\r\" || value === \"\\n\";\r\n if (editingField !== null) {\r\n if (key.escape) {\r\n setEditingField(null);\r\n replaceEditValue(\"\");\r\n return;\r\n }\r\n if (isReturn) {\r\n const nextDraft = updateDraft(\r\n draftRef.current,\r\n editingField,\r\n editValueRef.current,\r\n );\r\n hasLocalEditRef.current = true;\r\n replaceDraft(nextDraft);\r\n setEditingField(null);\r\n replaceEditValue(\"\");\r\n maybeSave(nextDraft);\r\n return;\r\n }\r\n if (key.backspace || key.delete || isBackspaceInput(value)) {\r\n hasLocalEditRef.current = true;\r\n replaceEditValue(editValueRef.current.slice(0, -1));\r\n return;\r\n }\r\n if (isPrintableInput(value) && !key.ctrl && !key.meta) {\r\n hasLocalEditRef.current = true;\r\n replaceEditValue(editValueRef.current + value);\r\n }\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n onClose();\r\n return;\r\n }\r\n if (key.downArrow) {\r\n setSelectedIndex((current) => (current + 1) % CONNECT_FIELDS.length);\r\n return;\r\n }\r\n if (key.upArrow) {\r\n setSelectedIndex(\r\n (current) =>\r\n (current - 1 + CONNECT_FIELDS.length) % CONNECT_FIELDS.length,\r\n );\r\n return;\r\n }\r\n if (isReturn) {\r\n setEditingField(selectedField.key);\r\n replaceEditValue(draftRef.current[selectedField.key]);\r\n }\r\n },\r\n { isActive: true },\r\n );\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n {CONNECT_FIELDS.map((field, index) => (\r\n <ConnectFieldRow\r\n draft={draft}\r\n editValue={editValue}\r\n editingField={editingField}\r\n field={field}\r\n isSelected={index === selectedIndex}\r\n key={field.key}\r\n />\r\n ))}\r\n </Box>\r\n <Box marginTop={1}>\r\n <ConnectStatusLine isRunning={isRunning} saveState={saveState} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction ConnectFieldRow({\r\n draft,\r\n editValue,\r\n editingField,\r\n field,\r\n isSelected,\r\n}: {\r\n readonly draft: ConnectDraft;\r\n readonly editValue: string;\r\n readonly editingField: ConnectFieldKey | null;\r\n readonly field: ConnectField;\r\n readonly isSelected: boolean;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n const isEditing = editingField === field.key;\r\n const rawValue = isEditing ? editValue : draft[field.key];\r\n const displayValue = field.secret ? maskSecret(rawValue) : rawValue;\r\n const prefix = isSelected ? \"> \" : \" \";\r\n const label = field.label.padEnd(18, \" \");\r\n\r\n return (\r\n <Text color={isSelected ? theme.text.strong : undefined}>\r\n {prefix}\r\n <Text bold>{label}</Text>\r\n {field.optional ? <Text dimColor>optional </Text> : null}\r\n {displayValue}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction ConnectStatusLine({\r\n isRunning,\r\n saveState,\r\n}: {\r\n readonly isRunning: boolean;\r\n readonly saveState: SaveState;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n\r\n if (isRunning) {\r\n return <Text color={theme.status.warning}>running - save disabled</Text>;\r\n }\r\n switch (saveState.kind) {\r\n case \"saving\":\r\n return <Text color={theme.status.running}>saving</Text>;\r\n case \"saved\":\r\n return saveState.warning === undefined ? (\r\n <Text color={theme.status.success}>saved</Text>\r\n ) : (\r\n <Text color={theme.status.warning}>saved - {saveState.warning}</Text>\r\n );\r\n case \"error\":\r\n return <Text color={theme.status.error}>{saveState.message}</Text>;\r\n case \"idle\":\r\n return <Text> </Text>;\r\n }\r\n}\r\n\r\nfunction savedState(warning: string | undefined): SaveState {\r\n return warning === undefined\r\n ? { kind: \"saved\" }\r\n : { kind: \"saved\", warning };\r\n}\r\n\r\nfunction readConnectWarning(result: unknown): string | undefined {\r\n if (typeof result !== \"object\" || result === null || Array.isArray(result)) {\r\n return undefined;\r\n }\r\n const warning = (result as Record<string, unknown>).warning;\r\n return typeof warning === \"string\" && warning.trim() !== \"\"\r\n ? warning\r\n : undefined;\r\n}\r\n\r\ntype PayloadBuildResult =\r\n | { readonly kind: \"incomplete\" }\r\n | { readonly kind: \"error\"; readonly message: string }\r\n | { readonly kind: \"ready\"; readonly input: UiConnectModelInput };\r\n\r\nfunction draftFromCurrentModel(current: UiCurrentModelConfig): ConnectDraft {\r\n return {\r\n apiKey: \"\",\r\n apiKeyEnv: current.apiKeyEnv,\r\n baseUrl: current.baseUrl,\r\n contextWindowTokens:\r\n current.contextWindowTokens === undefined\r\n ? \"\"\r\n : String(current.contextWindowTokens),\r\n maxOutputTokens:\r\n current.maxOutputTokens === undefined\r\n ? \"\"\r\n : String(current.maxOutputTokens),\r\n model: current.model,\r\n provider: current.provider,\r\n };\r\n}\r\n\r\nfunction buildPayload(draft: ConnectDraft): PayloadBuildResult {\r\n const provider = draft.provider.trim();\r\n const baseUrl = draft.baseUrl.trim();\r\n const interfaceProvider = inferInterfaceProvider(baseUrl);\r\n const apiKeyEnv = draft.apiKeyEnv.trim();\r\n const apiKey = draft.apiKey.trim();\r\n const model = draft.model.trim();\r\n\r\n if (!provider || !baseUrl || !apiKeyEnv || !model) {\r\n return { kind: \"incomplete\" };\r\n }\r\n\r\n const contextWindowTokens = parseOptionalPositiveInteger(\r\n draft.contextWindowTokens,\r\n \"Context window\",\r\n );\r\n if (contextWindowTokens.kind === \"error\") {\r\n return contextWindowTokens;\r\n }\r\n const maxOutputTokens = parseOptionalPositiveInteger(\r\n draft.maxOutputTokens,\r\n \"Max output tokens\",\r\n );\r\n if (maxOutputTokens.kind === \"error\") {\r\n return maxOutputTokens;\r\n }\r\n\r\n return {\r\n input: {\r\n apiKey: apiKey || undefined,\r\n apiKeyEnv,\r\n baseUrl,\r\n contextWindowTokens: contextWindowTokens.value,\r\n interfaceProvider,\r\n maxOutputTokens: maxOutputTokens.value,\r\n model,\r\n provider,\r\n },\r\n kind: \"ready\",\r\n };\r\n}\r\n\r\nfunction parseOptionalPositiveInteger(\r\n value: string,\r\n label: string,\r\n):\r\n | { readonly kind: \"ok\"; readonly value?: number }\r\n | { readonly kind: \"error\"; readonly message: string } {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return { kind: \"ok\" };\r\n }\r\n if (!/^\\d+$/u.test(trimmed)) {\r\n return { kind: \"error\", message: `${label} must be a positive integer` };\r\n }\r\n const parsed = Number.parseInt(trimmed, 10);\r\n return parsed > 0\r\n ? { kind: \"ok\", value: parsed }\r\n : { kind: \"error\", message: `${label} must be a positive integer` };\r\n}\r\n\r\nfunction updateDraft(\r\n draft: ConnectDraft,\r\n field: ConnectFieldKey,\r\n value: string,\r\n): ConnectDraft {\r\n const trimmedValue = value.trim();\r\n if (field === \"baseUrl\") {\r\n return {\r\n ...draft,\r\n baseUrl: trimmedValue,\r\n };\r\n }\r\n return {\r\n ...draft,\r\n [field]: trimmedValue,\r\n };\r\n}\r\n\r\nfunction inferInterfaceProvider(\r\n baseUrl: string,\r\n): UiConnectModelInterfaceProvider {\r\n const lower = baseUrl.toLowerCase();\r\n return lower.includes(\"anthropic\") ||\r\n lower.includes(\"/api/anthropic\") ||\r\n lower.endsWith(\"/anthropic\") ||\r\n lower.includes(\"/v1/messages\")\r\n ? \"anthropic\"\r\n : \"openai-compatible\";\r\n}\r\n\r\nfunction maskSecret(value: string): string {\r\n return \"*\".repeat(value.length);\r\n}\r\n\r\nfunction isBackspaceInput(value: string): boolean {\r\n return value === \"\\b\" || value === \"\\u007F\";\r\n}\r\n\r\nfunction isPrintableInput(value: string): boolean {\r\n if (value === \"\") {\r\n return false;\r\n }\r\n for (const char of value) {\r\n const code = char.charCodeAt(0);\r\n if (code <= 31 || code === 127) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction sanitizeError(error: unknown, secret?: string): string {\r\n const message =\r\n error instanceof Error ? error.message : \"Model connection failed\";\r\n const withoutExactSecret =\r\n secret && secret.trim() !== \"\"\r\n ? message.split(secret).join(\"[redacted]\")\r\n : message;\r\n return withoutExactSecret\r\n .replace(/https?:\\/\\/[^\\s)]*/giu, \"[redacted-url]\")\r\n .replace(\r\n /((?:api[_-]?key|access[_-]?token|auth[_-]?token|token)=)[^&\\s)]+/giu,\r\n \"$1[redacted]\",\r\n )\r\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/gu, \"sk-[redacted]\");\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type {\r\n CoreAPI,\r\n UiCommandCatalog,\r\n UiContextWindowUsage,\r\n UiRunStatus,\r\n} from \"ohbaby-sdk\";\r\nimport type { ReactElement } from \"react\";\r\nimport { useRef, useState } from \"react\";\r\nimport { useTuiLayout } from \"../../layout/context.js\";\r\nimport { formatContextWindowUsage } from \"../../render/usage.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\nimport type {\r\n CommandPanelState,\r\n DisplayCommandPanelState,\r\n} from \"./command-panel-state.js\";\r\nimport { ConnectPanel } from \"./connect-panel.js\";\r\nimport { OverlayCard } from \"./overlay-card.js\";\r\n\r\nconst SKILLS_PANEL_MAX_VISIBLE_LINES = 10;\r\nconst SKILLS_PANEL_MIN_VISIBLE_LINES = 3;\r\n// Rows kept free around the skills list: overlay border, padding, title, and\r\n// footer plus the prompt area below the card. Keeping the dynamic frame\r\n// shorter than the terminal avoids Ink's clearTerminal-per-frame fallback\r\n// (see layout/metrics.ts).\r\nconst SKILLS_PANEL_RESERVED_ROWS = 14;\r\n\r\nexport function resolveSkillsPanelVisibleLines(rows: number): number {\r\n const available =\r\n (Number.isFinite(rows) ? Math.floor(rows) : 24) -\r\n SKILLS_PANEL_RESERVED_ROWS;\r\n return Math.max(\r\n SKILLS_PANEL_MIN_VISIBLE_LINES,\r\n Math.min(SKILLS_PANEL_MAX_VISIBLE_LINES, available),\r\n );\r\n}\r\n\r\ninterface SkillsSelection {\r\n readonly index: number;\r\n readonly invocationId: string | null;\r\n}\r\n\r\nexport interface CommandPanelManagerProps {\r\n readonly catalog: UiCommandCatalog | null;\r\n readonly client: CoreAPI;\r\n readonly contextWindowUsage: UiContextWindowUsage | null;\r\n readonly onClose: () => void;\r\n readonly panel: CommandPanelState | null;\r\n readonly runtime: UiRunStatus;\r\n}\r\n\r\nexport function CommandPanelManager({\r\n catalog,\r\n client,\r\n contextWindowUsage,\r\n onClose,\r\n panel,\r\n runtime,\r\n}: CommandPanelManagerProps): ReactElement | null {\r\n const theme = useTheme();\r\n const layout = useTuiLayout();\r\n const skillsVisibleLines = resolveSkillsPanelVisibleLines(layout.rows);\r\n const skills = panelSkills(panel);\r\n const maxSkillIndex = Math.max(0, skills.length - 1);\r\n const skillsPanelInvocationId =\r\n panel !== null && panel.mode === \"display\" && panel.kind === \"skills\"\r\n ? panel.clientInvocationId\r\n : null;\r\n // Selection is keyed by the panel invocation so a freshly opened panel\r\n // derives index 0 without a reset effect.\r\n const [skillsSelection, setSkillsSelection] = useState<SkillsSelection>({\r\n index: 0,\r\n invocationId: null,\r\n });\r\n const skillsSelectedIndex =\r\n skillsSelection.invocationId === skillsPanelInvocationId\r\n ? skillsSelection.index\r\n : 0;\r\n // Input handlers re-register in a passive effect, so a keypress can hit a\r\n // handler whose closure predates the latest commit (e.g. the loading frame\r\n // before skills data arrived). Route per-frame data through a render-synced\r\n // ref so navigation always sees the committed skills window.\r\n const skillsNavigationRef = useRef({\r\n invocationId: skillsPanelInvocationId,\r\n maxIndex: maxSkillIndex,\r\n pageSize: skillsVisibleLines,\r\n });\r\n skillsNavigationRef.current = {\r\n invocationId: skillsPanelInvocationId,\r\n maxIndex: maxSkillIndex,\r\n pageSize: skillsVisibleLines,\r\n };\r\n\r\n useInput(\r\n (_value, key) => {\r\n if (key.escape) {\r\n onClose();\r\n return;\r\n }\r\n\r\n if (panel?.kind !== \"skills\") {\r\n return;\r\n }\r\n\r\n const { invocationId, maxIndex, pageSize } = skillsNavigationRef.current;\r\n const delta = key.downArrow\r\n ? 1\r\n : key.upArrow\r\n ? -1\r\n : key.pageDown\r\n ? pageSize\r\n : key.pageUp\r\n ? -pageSize\r\n : 0;\r\n if (delta !== 0) {\r\n setSkillsSelection((current) => {\r\n const baseIndex =\r\n current.invocationId === invocationId\r\n ? clampSkillIndex(current.index, maxIndex)\r\n : 0;\r\n return {\r\n index: clampSkillIndex(baseIndex + delta, maxIndex),\r\n invocationId,\r\n };\r\n });\r\n }\r\n },\r\n { isActive: panel?.mode === \"display\" },\r\n );\r\n\r\n if (panel === null) {\r\n return null;\r\n }\r\n\r\n if (panel.mode === \"interactive\") {\r\n return (\r\n <OverlayCard title={panelTitle(panel.kind)}>\r\n <ConnectPanel client={client} onClose={onClose} runtime={runtime} />\r\n </OverlayCard>\r\n );\r\n }\r\n\r\n return (\r\n <OverlayCard title={panelTitle(panel.kind)}>\r\n {panel.status === \"loading\" ? (\r\n <Text dimColor>Loading...</Text>\r\n ) : panel.status === \"error\" ? (\r\n <Text color={theme.status.error}>\r\n {panel.error ?? \"Command failed\"}\r\n </Text>\r\n ) : (\r\n <CommandPanelBody\r\n catalog={catalog}\r\n contextWindowUsage={contextWindowUsage}\r\n panel={panel}\r\n skills={skills}\r\n skillsSelectedIndex={skillsSelectedIndex}\r\n skillsVisibleLines={skillsVisibleLines}\r\n />\r\n )}\r\n </OverlayCard>\r\n );\r\n}\r\n\r\nfunction CommandPanelBody({\r\n catalog,\r\n contextWindowUsage,\r\n panel,\r\n skills,\r\n skillsSelectedIndex,\r\n skillsVisibleLines,\r\n}: {\r\n readonly catalog: UiCommandCatalog | null;\r\n readonly contextWindowUsage: UiContextWindowUsage | null;\r\n readonly panel: DisplayCommandPanelState;\r\n readonly skills: readonly Record<string, unknown>[];\r\n readonly skillsSelectedIndex: number;\r\n readonly skillsVisibleLines: number;\r\n}): ReactElement {\r\n const data = panel.output?.kind === \"data\" ? panel.output.data : {};\r\n\r\n switch (panel.kind) {\r\n case \"status\":\r\n return <StatusPanel data={data} />;\r\n case \"help\":\r\n return <HelpPanel catalog={catalog} data={data} />;\r\n case \"mcps\":\r\n return <McpsPanel data={data} />;\r\n case \"models\":\r\n return (\r\n <ModelsPanel contextWindowUsage={contextWindowUsage} data={data} />\r\n );\r\n case \"skills\":\r\n return (\r\n <SkillsPanel\r\n selectedIndex={skillsSelectedIndex}\r\n skills={skills}\r\n visibleLines={skillsVisibleLines}\r\n />\r\n );\r\n }\r\n}\r\n\r\nfunction StatusPanel({\r\n data,\r\n}: {\r\n readonly data: Record<string, unknown>;\r\n}): ReactElement {\r\n const permission = getRecord(data, \"permission\");\r\n const model = getRecord(data, \"model\");\r\n const tools = getRecord(data, \"tools\");\r\n const mcps = getRecord(data, \"mcps\");\r\n const contextWindow = toContextWindowUsage(getRecord(data, \"contextWindow\"));\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <PanelRow\r\n label=\"Runtime\"\r\n value={getString(data, \"status\") ?? \"unknown\"}\r\n />\r\n <PanelRow label=\"Session\" value={getString(data, \"sessionId\")} />\r\n <PanelRow label=\"Permission\" value={formatPermission(permission)} />\r\n <PanelRow label=\"Model\" value={formatModelLabel(model)} />\r\n <PanelRow\r\n label=\"Context\"\r\n value={formatUsageOrUnavailable(contextWindow)}\r\n />\r\n <PanelRow label=\"Tools\" value={formatTools(tools)} />\r\n <PanelRow label=\"MCP\" value={formatMcpSummary(mcps)} />\r\n <PanelRow label=\"Project\" value={getString(data, \"projectRoot\")} />\r\n </Box>\r\n );\r\n}\r\n\r\nfunction HelpPanel({\r\n catalog,\r\n data,\r\n}: {\r\n readonly catalog: UiCommandCatalog | null;\r\n readonly data: Record<string, unknown>;\r\n}): ReactElement {\r\n const commands = Array.isArray(data.commands)\r\n ? data.commands\r\n : catalog\r\n ? catalog.commands\r\n : [];\r\n\r\n if (commands.length === 0) {\r\n return <Text dimColor>No commands</Text>;\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {commands.map((command, index) =>\r\n isRecord(command) ? (\r\n <HelpCommand command={command} key={String(index)} />\r\n ) : null,\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction HelpCommand({\r\n command,\r\n}: {\r\n readonly command: Record<string, unknown>;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n\r\n return (\r\n <Text>\r\n <Text color={theme.text.headingAccent}>{formatCommandPath(command)}</Text>\r\n <Text dimColor> - {getString(command, \"description\") ?? \"\"}</Text>\r\n </Text>\r\n );\r\n}\r\n\r\nfunction McpsPanel({\r\n data,\r\n}: {\r\n readonly data: Record<string, unknown>;\r\n}): ReactElement {\r\n const servers = Array.isArray(data.servers) ? data.servers : [];\r\n\r\n if (servers.length === 0) {\r\n return <Text dimColor>No MCP servers</Text>;\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {servers\r\n .slice(0, 12)\r\n .map((server, index) =>\r\n isRecord(server) ? (\r\n <PanelRow\r\n key={String(index)}\r\n label={getString(server, \"name\") ?? \"server\"}\r\n value={getString(server, \"status\") ?? \"unknown\"}\r\n />\r\n ) : null,\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction SkillsPanel({\r\n selectedIndex,\r\n skills,\r\n visibleLines,\r\n}: {\r\n readonly selectedIndex: number;\r\n readonly skills: readonly Record<string, unknown>[];\r\n readonly visibleLines: number;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n\r\n if (skills.length === 0) {\r\n return <Text dimColor>No skills</Text>;\r\n }\r\n\r\n const clampedIndex = clampSkillIndex(selectedIndex, skills.length - 1);\r\n const windowStart = Math.floor(clampedIndex / visibleLines) * visibleLines;\r\n const visibleSkills = skills.slice(windowStart, windowStart + visibleLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {visibleSkills.map((skill, index) => {\r\n const absoluteIndex = windowStart + index;\r\n const selected = absoluteIndex === clampedIndex;\r\n return (\r\n <Text\r\n bold={selected}\r\n color={selected ? theme.status.accent : undefined}\r\n dimColor={!selected}\r\n key={String(absoluteIndex)}\r\n wrap=\"truncate-end\"\r\n >\r\n {selected ? \"> \" : \" \"}\r\n {formatSkillRow(skill)}\r\n </Text>\r\n );\r\n })}\r\n {skills.length > visibleLines ? (\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n showing {windowStart + 1}-\r\n {Math.min(windowStart + visibleLines, skills.length)} of{\" \"}\r\n {skills.length} · pgup/pgdn\r\n </Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction ModelsPanel({\r\n contextWindowUsage,\r\n data,\r\n}: {\r\n readonly contextWindowUsage: UiContextWindowUsage | null;\r\n readonly data: Record<string, unknown>;\r\n}): ReactElement {\r\n const theme = useTheme();\r\n const current = getRecord(data, \"current\");\r\n const models = Array.isArray(data.models) ? data.models : [];\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color={theme.text.heading}>Models (current)</Text>\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <PanelRow label=\"Model\" value={getString(current ?? {}, \"model\")} />\r\n <PanelRow\r\n label=\"Provider\"\r\n value={getString(current ?? {}, \"provider\")}\r\n />\r\n <PanelRow\r\n label=\"Interface\"\r\n value={getString(current ?? {}, \"interfaceProvider\")}\r\n />\r\n <PanelRow\r\n label=\"Context\"\r\n value={formatUsageOrUnavailable(contextWindowUsage)}\r\n />\r\n </Box>\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text color={theme.text.heading}>Models (switch)</Text>\r\n {models.length === 0 ? (\r\n <Text dimColor>No models</Text>\r\n ) : (\r\n models.slice(0, 8).map((model, index) =>\r\n isRecord(model) ? (\r\n <Text key={String(index)}>\r\n <Text\r\n color={isActiveModel(model) ? theme.status.accent : undefined}\r\n >\r\n {isActiveModel(model) ? \"> \" : \" \"}\r\n {formatModelLabel(model) ?? \"Unnamed model\"}\r\n </Text>\r\n <Text dimColor>\r\n {\" \"}\r\n {getString(model, \"provider\") ?? \"Unavailable\"}\r\n </Text>\r\n </Text>\r\n ) : null,\r\n )\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction PanelRow({\r\n label,\r\n value,\r\n}: {\r\n readonly label: string;\r\n readonly value?: string | null;\r\n}): ReactElement {\r\n return (\r\n <Text>\r\n <Text bold>{label.padEnd(10, \" \")} </Text>\r\n {value && value.trim() !== \"\" ? value : \"Unavailable\"}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction panelTitle(kind: CommandPanelState[\"kind\"]): string {\r\n switch (kind) {\r\n case \"status\":\r\n return \"Status\";\r\n case \"help\":\r\n return \"Help\";\r\n case \"mcps\":\r\n return \"MCP\";\r\n case \"models\":\r\n return \"Models\";\r\n case \"skills\":\r\n return \"Skills\";\r\n case \"connect\":\r\n return \"Connect\";\r\n }\r\n}\r\n\r\nfunction formatPermission(\r\n permission: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n const mode = permission ? getString(permission, \"mode\") : undefined;\r\n const level = permission ? getString(permission, \"level\") : undefined;\r\n return mode && level ? `${mode} / ${level}` : undefined;\r\n}\r\n\r\nfunction formatTools(\r\n tools: Record<string, unknown> | undefined,\r\n): string | null {\r\n if (!tools) {\r\n return null;\r\n }\r\n\r\n return `${formatCount(getNumber(tools, \"builtin\"))} builtin, ${formatCount(\r\n getNumber(tools, \"module\"),\r\n )} module, ${formatCount(getNumber(tools, \"skill\"))} skill, ${formatCount(\r\n getNumber(tools, \"mcp\"),\r\n )} mcp`;\r\n}\r\n\r\nfunction formatMcpSummary(\r\n mcps: Record<string, unknown> | undefined,\r\n): string | null {\r\n if (!mcps) {\r\n return null;\r\n }\r\n const labels = [\r\n { count: getNumber(mcps, \"connected\"), label: \"connected\" },\r\n { count: getNumber(mcps, \"failed\"), label: \"failed\" },\r\n { count: getNumber(mcps, \"disabled\"), label: \"disabled\" },\r\n { count: getNumber(mcps, \"disconnected\"), label: \"disconnected\" },\r\n ]\r\n .filter(\r\n (entry): entry is { readonly count: number; readonly label: string } =>\r\n entry.count !== undefined && entry.count > 0,\r\n )\r\n .map((entry) => `${formatCount(entry.count)} ${entry.label}`);\r\n\r\n return labels.length > 0 ? labels.join(\", \") : \"none\";\r\n}\r\n\r\nfunction formatModelLabel(\r\n model: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!model) {\r\n return undefined;\r\n }\r\n return getString(model, \"label\") ?? getString(model, \"id\");\r\n}\r\n\r\nfunction formatCommandPath(command: Record<string, unknown>): string {\r\n const path = getStringArray(command, \"path\");\r\n return path.length > 0 ? `/${path.join(\" \")}` : \"/\";\r\n}\r\n\r\nfunction formatSkillRow(skill: Record<string, unknown>): string {\r\n const name = getString(skill, \"name\") ?? \"skill\";\r\n const description = truncatePanelText(getString(skill, \"description\"));\r\n const metadata = [\r\n getString(skill, \"scope\"),\r\n getString(skill, \"source\"),\r\n ].filter((item): item is string => Boolean(item));\r\n const suffixes = [\r\n metadata.length > 0 ? metadata.join(\" · \") : \"\",\r\n description ? `- ${description}` : \"\",\r\n ].filter((item) => item !== \"\");\r\n\r\n return suffixes.length > 0 ? `${name} ${suffixes.join(\" \")}` : name;\r\n}\r\n\r\nfunction panelSkills(\r\n panel: CommandPanelState | null,\r\n): readonly Record<string, unknown>[] {\r\n if (\r\n panel?.mode !== \"display\" ||\r\n panel.kind !== \"skills\" ||\r\n panel.status !== \"ready\" ||\r\n panel.output?.kind !== \"data\"\r\n ) {\r\n return [];\r\n }\r\n\r\n const skills = panel.output.data.skills;\r\n return Array.isArray(skills) ? skills.filter(isRecord) : [];\r\n}\r\n\r\nfunction clampSkillIndex(index: number, maxIndex: number): number {\r\n return Math.max(0, Math.min(maxIndex, index));\r\n}\r\n\r\nfunction truncatePanelText(value: string | undefined, maxLength = 64): string {\r\n if (!value) {\r\n return \"\";\r\n }\r\n const normalized = value.replace(/\\s+/gu, \" \").trim();\r\n if (normalized.length <= maxLength) {\r\n return normalized;\r\n }\r\n return `${normalized.slice(0, maxLength - 3)}...`;\r\n}\r\n\r\nfunction formatUsageOrUnavailable(usage: UiContextWindowUsage | null): string {\r\n const formatted = formatContextWindowUsage(usage);\r\n return formatted === \"\" ? \"Unavailable\" : formatted;\r\n}\r\n\r\nfunction toContextWindowUsage(\r\n record: Record<string, unknown> | undefined,\r\n): UiContextWindowUsage | null {\r\n if (!record) {\r\n return null;\r\n }\r\n const currentTokens = getNumber(record, \"currentTokens\");\r\n const contextWindowTokens = getNumber(record, \"contextWindowTokens\");\r\n const contextWindowRatio = getNumber(record, \"contextWindowRatio\");\r\n if (\r\n currentTokens === undefined ||\r\n contextWindowTokens === undefined ||\r\n contextWindowRatio === undefined\r\n ) {\r\n return null;\r\n }\r\n\r\n return {\r\n contextWindowRatio,\r\n contextWindowTokens,\r\n currentTokens,\r\n estimatedAt: getString(record, \"estimatedAt\") ?? \"\",\r\n modelId: getString(record, \"modelId\") ?? \"\",\r\n sessionId: getString(record, \"sessionId\") ?? \"\",\r\n };\r\n}\r\n\r\nfunction isActiveModel(model: Record<string, unknown>): boolean {\r\n return getBoolean(model, \"active\") === true;\r\n}\r\n\r\nfunction formatCount(value: number | undefined): string {\r\n return String(Math.max(0, Math.round(value ?? 0)));\r\n}\r\n\r\nfunction getRecord(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): Record<string, unknown> | undefined {\r\n const value = record[key];\r\n return isRecord(value) ? value : undefined;\r\n}\r\n\r\nfunction getString(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): string | undefined {\r\n const value = record[key];\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction getNumber(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): number | undefined {\r\n const value = record[key];\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction getBoolean(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): boolean | undefined {\r\n const value = record[key];\r\n return typeof value === \"boolean\" ? value : undefined;\r\n}\r\n\r\nfunction getStringArray(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): string[] {\r\n const value = record[key];\r\n return Array.isArray(value)\r\n ? value.filter((item): item is string => typeof item === \"string\")\r\n : [];\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import type { UiCommandOutput } from \"ohbaby-sdk\";\r\n\r\nexport type DisplayCommandPanelKind =\r\n | \"status\"\r\n | \"help\"\r\n | \"mcps\"\r\n | \"models\"\r\n | \"skills\";\r\n\r\nexport type InteractiveCommandPanelKind = \"connect\";\r\n\r\nexport type CommandPanelKind =\r\n | DisplayCommandPanelKind\r\n | InteractiveCommandPanelKind;\r\n\r\nexport type CommandPanelStatus = \"loading\" | \"ready\" | \"error\";\r\n\r\nexport interface DisplayCommandPanelState {\r\n readonly kind: DisplayCommandPanelKind;\r\n readonly mode: \"display\";\r\n readonly clientInvocationId: string;\r\n readonly openedAt: number;\r\n readonly sessionId: string | null;\r\n readonly status: CommandPanelStatus;\r\n readonly output?: UiCommandOutput;\r\n readonly error?: string;\r\n}\r\n\r\nexport interface InteractiveCommandPanelState {\r\n readonly kind: InteractiveCommandPanelKind;\r\n readonly mode: \"interactive\";\r\n readonly openedAt: number;\r\n readonly sessionId: string | null;\r\n}\r\n\r\nexport type CommandPanelState =\r\n | DisplayCommandPanelState\r\n | InteractiveCommandPanelState;\r\n\r\nconst DISPLAY_COMMAND_IDS = new Set<DisplayCommandPanelKind>([\r\n \"help\",\r\n \"mcps\",\r\n \"models\",\r\n \"skills\",\r\n \"status\",\r\n]);\r\n\r\nconst INTERACTIVE_COMMAND_IDS = new Set<InteractiveCommandPanelKind>([\r\n \"connect\",\r\n]);\r\n\r\nexport function displayPanelKindForCommandId(\r\n commandId: string,\r\n): DisplayCommandPanelKind | null {\r\n return DISPLAY_COMMAND_IDS.has(commandId as DisplayCommandPanelKind)\r\n ? (commandId as DisplayCommandPanelKind)\r\n : null;\r\n}\r\n\r\nexport function interactivePanelKindForCommandId(\r\n commandId: string,\r\n): InteractiveCommandPanelKind | null {\r\n return INTERACTIVE_COMMAND_IDS.has(commandId as InteractiveCommandPanelKind)\r\n ? (commandId as InteractiveCommandPanelKind)\r\n : null;\r\n}\r\n","import figlet from \"figlet\";\r\nimport ansiShadowFont from \"figlet/importable-fonts/ANSI Shadow.js\";\r\n\r\nconst LOGO_TEXT = \"OHBABY\";\r\nconst LOGO_FONT = \"OHBABY ANSI Shadow\";\r\nconst COMPACT_LOGO_WIDTH = LOGO_TEXT.length;\r\n\r\nlet registered = false;\r\nlet cachedLogo: readonly string[] | undefined;\r\n\r\nexport interface LogoRenderOptions {\r\n readonly maxWidth?: number;\r\n}\r\n\r\nexport function renderOhbabyLogo(\r\n options: LogoRenderOptions = {},\r\n): readonly string[] {\r\n const maxWidth = normalizeWidth(options.maxWidth);\r\n const logo = getGeneratedLogo();\r\n const logoWidth = measureWidth(logo);\r\n\r\n if (maxWidth < logoWidth && maxWidth < 64) {\r\n return [LOGO_TEXT.slice(0, maxWidth || COMPACT_LOGO_WIDTH)];\r\n }\r\n\r\n return logo;\r\n}\r\n\r\nfunction getGeneratedLogo(): readonly string[] {\r\n if (cachedLogo) {\r\n return cachedLogo;\r\n }\r\n\r\n ensureFontRegistered();\r\n cachedLogo = figlet\r\n .textSync(LOGO_TEXT, {\r\n font: LOGO_FONT,\r\n horizontalLayout: \"fitted\",\r\n verticalLayout: \"fitted\",\r\n })\r\n .split(\"\\n\")\r\n .map((line) => line.trimEnd())\r\n .filter((line) => line.length > 0);\r\n\r\n return cachedLogo;\r\n}\r\n\r\nfunction ensureFontRegistered(): void {\r\n if (registered) {\r\n return;\r\n }\r\n\r\n figlet.parseFont(LOGO_FONT, ansiShadowFont);\r\n registered = true;\r\n}\r\n\r\nfunction normalizeWidth(width: number | undefined): number {\r\n if (typeof width !== \"number\" || !Number.isFinite(width)) {\r\n return Number.MAX_SAFE_INTEGER;\r\n }\r\n\r\n return Math.max(0, Math.floor(width));\r\n}\r\n\r\nfunction measureWidth(lines: readonly string[]): number {\r\n return Math.max(0, ...lines.map((line) => line.length));\r\n}\r\n","import Gradient from \"ink-gradient\";\r\nimport { Box, Text } from \"ink\";\r\nimport type { ReactElement } from \"react\";\r\nimport { useTuiLayout } from \"../layout/context.js\";\r\nimport { renderOhbabyLogo } from \"../render/logo.js\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nexport function Logo(): ReactElement {\r\n const theme = useTheme();\r\n const layout = useTuiLayout();\r\n const lines = renderOhbabyLogo({ maxWidth: layout.contentWidth });\r\n const logo = lines.join(\"\\n\");\r\n const gradientColors = [\r\n theme.brandTitle.primary,\r\n theme.brandTitle.secondary,\r\n theme.brandTitle.tertiary,\r\n ];\r\n const useGradient =\r\n lines.length > 1 && gradientColors.every((color) => color.startsWith(\"#\"));\r\n\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n {useGradient ? (\r\n <Gradient colors={gradientColors}>{logo}</Gradient>\r\n ) : (\r\n <Text color={theme.brandTitle.primary} bold>\r\n {logo}\r\n </Text>\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import { Box } from \"ink\";\r\nimport type { ReactElement } from \"react\";\r\nimport { Logo } from \"./logo.js\";\r\n\r\nexport interface HeaderProps {\r\n readonly isEmpty: boolean;\r\n}\r\n\r\nexport function Header({ isEmpty }: HeaderProps): ReactElement {\r\n return <Box flexDirection=\"column\">{isEmpty ? <Logo /> : null}</Box>;\r\n}\r\n","import { Text } from \"ink\";\r\nimport { useEffect, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nconst SHIMMER_INTERVAL_MS = 55;\r\n/** Idle steps between sweeps, so the highlight pauses off the end before looping. */\r\nexport const SHIMMER_GAP = 8;\r\n/** Highlight window is the head character ± this many neighbours (5-char band). */\r\nexport const SHIMMER_HALF_WIDTH = 2;\r\n\r\nexport interface ShimmerSegments {\r\n readonly before: string;\r\n readonly shimmer: string;\r\n readonly after: string;\r\n}\r\n\r\n/** Total tick cycle for a phrase: one step per character plus the idle gap. */\r\nexport function shimmerCycleLength(text: string): number {\r\n return Array.from(text).length + SHIMMER_GAP;\r\n}\r\n\r\n/**\r\n * Split text into before / highlighted / after for the given tick. When the\r\n * highlight window sits entirely off the text (during the idle gap), `shimmer`\r\n * is empty and the whole phrase is `before`.\r\n */\r\nexport function computeShimmerSegments(\r\n text: string,\r\n tick: number,\r\n): ShimmerSegments {\r\n const chars = Array.from(text);\r\n const start = tick - SHIMMER_HALF_WIDTH;\r\n const end = tick + SHIMMER_HALF_WIDTH;\r\n\r\n if (end < 0 || start >= chars.length) {\r\n return { before: text, shimmer: \"\", after: \"\" };\r\n }\r\n\r\n const clampedStart = Math.max(0, start);\r\n const clampedEnd = Math.min(chars.length - 1, end);\r\n return {\r\n before: chars.slice(0, clampedStart).join(\"\"),\r\n shimmer: chars.slice(clampedStart, clampedEnd + 1).join(\"\"),\r\n after: chars.slice(clampedEnd + 1).join(\"\"),\r\n };\r\n}\r\n\r\nexport interface ShimmerTextProps {\r\n readonly text: string;\r\n}\r\n\r\n/**\r\n * Renders text with a single highlight that sweeps left-to-right, looping with a\r\n * short pause. The sweep conveys \"alive\" without rotating the words themselves.\r\n * Honors OHBABY_TUI_NO_ANIM by rendering the phrase flat.\r\n */\r\nexport function ShimmerText({ text }: ShimmerTextProps): ReactElement {\r\n const theme = useTheme();\r\n const animate = process.env.OHBABY_TUI_NO_ANIM !== \"1\";\r\n const cycleLength = shimmerCycleLength(text);\r\n const [tick, setTick] = useState(0);\r\n\r\n useEffect(() => {\r\n if (!animate) {\r\n return undefined;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n setTick((current): number => (current + 1) % cycleLength);\r\n }, SHIMMER_INTERVAL_MS);\r\n\r\n return (): void => {\r\n clearInterval(interval);\r\n };\r\n }, [animate, cycleLength]);\r\n\r\n const base = theme.workingSpinner.base;\r\n const highlight = theme.workingSpinner.highlight;\r\n\r\n if (!animate) {\r\n return <Text color={base}>{text}</Text>;\r\n }\r\n\r\n const { before, shimmer, after } = computeShimmerSegments(text, tick);\r\n if (shimmer === \"\") {\r\n return <Text color={base}>{text}</Text>;\r\n }\r\n\r\n return (\r\n <Text>\r\n {before ? <Text color={base}>{before}</Text> : null}\r\n <Text color={highlight}>{shimmer}</Text>\r\n {after ? <Text color={base}>{after}</Text> : null}\r\n </Text>\r\n );\r\n}\r\n","import { Text } from \"ink\";\r\nimport { useEffect, useState } from \"react\";\r\nimport type { ReactElement, ReactNode } from \"react\";\r\nimport { useTheme } from \"../theme/index.js\";\r\n\r\nconst SPINNER_INTERVAL_MS = 80;\r\n\r\nexport interface SpinnerProps {\r\n readonly children?: ReactNode;\r\n readonly label?: string;\r\n readonly color?: string;\r\n}\r\n\r\nexport function Spinner({ children, label, color }: SpinnerProps): ReactElement {\r\n const theme = useTheme();\r\n const animate = process.env.OHBABY_TUI_NO_ANIM !== \"1\";\r\n const [frameIndex, setFrameIndex] = useState(0);\r\n const frames = theme.spinner.frames;\r\n const palette = theme.spinner.palette;\r\n const frame = frames[frameIndex % frames.length] ?? \"⠋\";\r\n const frameColor = color ?? palette[frameIndex % palette.length];\r\n\r\n useEffect(() => {\r\n if (!animate) {\r\n return undefined;\r\n }\r\n\r\n const interval = setInterval(() => {\r\n setFrameIndex((current): number => (current + 1) % frames.length);\r\n }, SPINNER_INTERVAL_MS);\r\n\r\n return (): void => {\r\n clearInterval(interval);\r\n };\r\n }, [animate, frames.length]);\r\n\r\n return (\r\n <Text>\r\n <Text color={frameColor}>{frame}</Text>\r\n {label ? <Text> {label}</Text> : null}\r\n {children}\r\n </Text>\r\n );\r\n}\r\n","/**\r\n * Humorous, value-laden phrases shown by the main-conversation WorkingSpinner\r\n * while the agent is running. One is picked per turn (keyed by runId) and stays\r\n * fixed for that turn.\r\n *\r\n * Phrases carry the ohbaby-agent personality (\"building an agent just like\r\n * raising a baby\" / Saint Seiya cosmo imagery). Edit freely — count need not be\r\n * exactly ten.\r\n */\r\nexport const WORKING_PHRASES = [\r\n \"I was thinking about the name of this project when I travelled to Shenzhen...\",\r\n \"I still remember the time I couldn't walk and just crawled...\",\r\n \"Looking back on the path of raising a baby, I mean, an agent...\",\r\n \"The awakening of individual consciousness...\",\r\n 'Guess where the \"ohbaby-agent\" name comes from...',\r\n \"Actually, I watched Saint Seiya during my Java course in my sophomore year...\",\r\n \"What's your favorite programming language?...\",\r\n \"I do nearly everything with the help of Codex and Claude Code these days...\",\r\n \"How did you find your internships?...\",\r\n \"Using parallel agents to complete tasks actually distracts my attention...\",\r\n] as const;\r\n\r\n/** Pick a random phrase. Used once per turn. */\r\nexport function pickWorkingPhrase(): string {\r\n const index = Math.floor(Math.random() * WORKING_PHRASES.length);\r\n return WORKING_PHRASES[index] ?? WORKING_PHRASES[0];\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport { useRef } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport type { TuiRuntimeStatus } from \"../store/snapshot.js\";\r\nimport { useTheme } from \"../theme/index.js\";\r\nimport { ShimmerText } from \"./shimmer-text.js\";\r\nimport { Spinner } from \"./spinner.js\";\r\nimport { pickWorkingPhrase } from \"./working-phrases.js\";\r\n\r\nexport interface WorkingSpinnerProps {\r\n readonly runtime: TuiRuntimeStatus;\r\n}\r\n\r\n/**\r\n * Turn-level \"agent is working\" heartbeat for the main conversation. Visible only\r\n * while runtime.kind === \"running\": a rotating dot glyph (shared with tool rows,\r\n * tinted purple) plus a per-turn humorous phrase that shimmers left-to-right.\r\n */\r\nexport function WorkingSpinner({\r\n runtime,\r\n}: WorkingSpinnerProps): ReactElement | null {\r\n const theme = useTheme();\r\n // Call the hook unconditionally; an empty runId while idle keeps order stable.\r\n const runId = runtime.kind === \"running\" ? runtime.runId : \"\";\r\n const phrase = useTurnPhrase(runId);\r\n\r\n if (runtime.kind !== \"running\") {\r\n return null;\r\n }\r\n const text = runtime.title?.trim() ? runtime.title : phrase;\r\n\r\n return (\r\n <Box>\r\n <Spinner color={theme.workingSpinner.base} />\r\n <Text> </Text>\r\n <ShimmerText text={text} />\r\n </Box>\r\n );\r\n}\r\n\r\n/**\r\n * Returns one phrase fixed per turn. Re-picks only when runId changes, so the\r\n * phrase is stable across re-renders within a turn and rotates between turns.\r\n */\r\nfunction useTurnPhrase(runId: string): string {\r\n const cache = useRef<{ runId: string; phrase: string } | null>(null);\r\n if (cache.current?.runId !== runId) {\r\n cache.current = { runId, phrase: pickWorkingPhrase() };\r\n }\r\n return cache.current.phrase;\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport { memo, type ReactElement } from \"react\";\r\nimport type { TuiCommandNotice } from \"../../store/snapshot.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\n\r\nexport interface CommandNoticeLaneProps {\r\n readonly commandNotices: readonly TuiCommandNotice[];\r\n}\r\n\r\nexport const CommandNoticeLane = memo(function CommandNoticeLane({\r\n commandNotices,\r\n}: CommandNoticeLaneProps): ReactElement {\r\n const theme = useTheme();\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {commandNotices.map((notice) => (\r\n <Box flexDirection=\"row\" key={notice.id} marginBottom={1}>\r\n {notice.kind === \"error\" ? (\r\n <>\r\n <Text color={theme.status.error}>error</Text>\r\n <Text> {notice.text}</Text>\r\n </>\r\n ) : (\r\n <Text>{notice.text}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","export function highlightCode(code: string): string[] {\r\n return code.split(/\\r?\\n/u);\r\n}\r\n","import { highlightCode } from \"./highlight.js\";\r\nimport { wrapAnsi } from \"./wrap.js\";\r\n\r\nconst FENCE_PATTERN = /^```(\\S*)\\s*$/u;\r\nconst HEADING_PATTERN = /^(#{1,6})\\s+(.+)$/u;\r\nconst UNORDERED_PATTERN = /^\\s*[-*+]\\s+(.+)$/u;\r\nconst ORDERED_PATTERN = /^\\s*(\\d+)[.)]\\s+(.+)$/u;\r\nconst QUOTE_PATTERN = /^\\s*>\\s?(.+)$/u;\r\n\r\nexport interface MarkdownRenderOptions {\r\n readonly width: number;\r\n}\r\n\r\nexport function mdToAnsi(\r\n markdown: string,\r\n options: MarkdownRenderOptions,\r\n): string[] {\r\n const lines: string[] = [];\r\n const sourceLines = markdown.replace(/\\r\\n/gu, \"\\n\").split(\"\\n\");\r\n let inFence = false;\r\n let fenceLanguage = \"\";\r\n\r\n for (const rawLine of sourceLines) {\r\n const fence = FENCE_PATTERN.exec(rawLine);\r\n if (fence) {\r\n if (inFence) {\r\n lines.push(\"```\");\r\n inFence = false;\r\n fenceLanguage = \"\";\r\n } else {\r\n inFence = true;\r\n fenceLanguage = fence[1];\r\n lines.push(fenceLanguage === \"\" ? \"```\" : `\\`\\`\\`${fenceLanguage}`);\r\n }\r\n continue;\r\n }\r\n\r\n if (inFence) {\r\n for (const highlighted of highlightCode(rawLine)) {\r\n lines.push(\r\n ...wrapAnsi(highlighted, Math.max(1, options.width - 2)).map(\r\n (line) => ` ${line}`,\r\n ),\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n if (rawLine.trim() === \"\") {\r\n lines.push(\"\");\r\n continue;\r\n }\r\n\r\n const heading = HEADING_PATTERN.exec(rawLine);\r\n if (heading) {\r\n const text = normalizeInlineMarkdown(heading[2]);\r\n lines.push(...wrapAnsi(text, options.width));\r\n if (heading[1].length === 1) {\r\n lines.push(\"-\".repeat(Math.min(text.length, options.width)));\r\n }\r\n continue;\r\n }\r\n\r\n const unordered = UNORDERED_PATTERN.exec(rawLine);\r\n if (unordered) {\r\n lines.push(\r\n ...wrapAnsi(\r\n `- ${normalizeInlineMarkdown(unordered[1])}`,\r\n options.width,\r\n ),\r\n );\r\n continue;\r\n }\r\n\r\n const ordered = ORDERED_PATTERN.exec(rawLine);\r\n if (ordered) {\r\n lines.push(\r\n ...wrapAnsi(\r\n `${ordered[1]}. ${normalizeInlineMarkdown(ordered[2])}`,\r\n options.width,\r\n ),\r\n );\r\n continue;\r\n }\r\n\r\n const quote = QUOTE_PATTERN.exec(rawLine);\r\n if (quote) {\r\n lines.push(\r\n ...wrapAnsi(`> ${normalizeInlineMarkdown(quote[1])}`, options.width),\r\n );\r\n continue;\r\n }\r\n\r\n lines.push(...wrapAnsi(normalizeInlineMarkdown(rawLine), options.width));\r\n }\r\n\r\n return lines;\r\n}\r\n\r\nfunction normalizeInlineMarkdown(input: string): string {\r\n return input\r\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/gu, \"$1 ($2)\")\r\n .replace(/`([^`]+)`/gu, \"$1\")\r\n .replace(/\\*\\*([^*]+)\\*\\*/gu, \"$1\")\r\n .replace(/__([^_]+)__/gu, \"$1\")\r\n .replace(/\\*([^*]+)\\*/gu, \"$1\")\r\n .replace(/_([^_]+)_/gu, \"$1\");\r\n}\r\n","import type { UiMessagePart, UiToolCall, UiToolResult } from \"ohbaby-sdk\";\r\n\r\nexport interface ToolLabelParts {\r\n readonly error: string;\r\n readonly name: string;\r\n readonly summary: string;\r\n}\r\n\r\nexport function renderToolPart(part: UiMessagePart): string {\r\n switch (part.type) {\r\n case \"tool-call\":\r\n return renderToolLabel(part.call);\r\n case \"tool-result\":\r\n return part.result.error ? `Error ${formatBody(part.result.error)}` : \"\";\r\n case \"text\":\r\n case \"reasoning\":\r\n return part.text;\r\n }\r\n}\r\n\r\nexport function renderToolLabel(\r\n call: UiToolCall,\r\n result?: UiToolResult,\r\n): string {\r\n const parts = renderToolLabelParts(call, result);\r\n const summary = parts.summary === \"\" ? \"\" : ` ${parts.summary}`;\r\n const error = parts.error === \"\" ? \"\" : ` ${parts.error}`;\r\n return `${parts.name}${summary}${error}`;\r\n}\r\n\r\nexport function renderToolLabelParts(\r\n call: UiToolCall,\r\n result?: UiToolResult,\r\n): ToolLabelParts {\r\n const summary = formatPrimaryInput(call.input);\r\n const error = result?.error ? formatBody(result.error) : \"\";\r\n return {\r\n error,\r\n name: formatToolName(call.name),\r\n summary,\r\n };\r\n}\r\n\r\nfunction formatToolName(name: string): string {\r\n return name\r\n .split(/[-_\\s]+/u)\r\n .filter(Boolean)\r\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\r\n .join(\" \");\r\n}\r\n\r\nfunction formatPrimaryInput(input: Record<string, unknown>): string {\r\n for (const key of [\"command\", \"file_path\", \"path\", \"query\", \"prompt\"]) {\r\n const value = input[key];\r\n if (typeof value === \"string\" && value.trim() !== \"\") {\r\n return truncate(value.trim());\r\n }\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nfunction formatBody(output: string): string {\r\n return truncate(output.trim());\r\n}\r\n\r\nfunction truncate(value: string): string {\r\n const limit = 180;\r\n\r\n if (value.length <= limit) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, limit - 3)}...`;\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type {\r\n UiMessage,\r\n UiMessagePart,\r\n UiToolCall,\r\n UiToolResult,\r\n} from \"ohbaby-sdk\";\r\nimport type { ReactElement } from \"react\";\r\nimport { mdToAnsi } from \"../../render/markdown.js\";\r\nimport { wrapAnsi } from \"../../render/wrap.js\";\r\nimport { useTheme, type Theme } from \"../../theme/index.js\";\r\nimport { Spinner } from \"../spinner.js\";\r\nimport {\r\n renderToolLabel,\r\n renderToolLabelParts,\r\n renderToolPart,\r\n} from \"./parts/tool-part.js\";\r\n\r\nconst OUTPUT_TRUNCATED_LABEL = \"output truncated\";\r\n\r\nexport interface MessageRowProps {\r\n /** Bottom margin rows; 0 for transcript fragments that continue below. */\r\n readonly bottomMargin?: number;\r\n readonly contentWidth: number;\r\n readonly message: UiMessage;\r\n}\r\n\r\nexport type PairedMessagePart =\r\n | {\r\n readonly index: number;\r\n readonly kind: \"part\";\r\n readonly part: UiMessagePart;\r\n }\r\n | {\r\n readonly call: UiToolCall;\r\n readonly index: number;\r\n readonly kind: \"tool\";\r\n readonly result?: UiToolResult;\r\n };\r\n\r\nexport function MessageRow({\r\n bottomMargin = 1,\r\n contentWidth,\r\n message,\r\n}: MessageRowProps): ReactElement {\r\n const theme = useTheme();\r\n const partWidth = Math.max(\r\n 1,\r\n contentWidth - (message.role === \"user\" ? 2 : 0),\r\n );\r\n const renderedParts = renderMessageParts(message, partWidth, theme);\r\n\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={bottomMargin}>\r\n <MessageParts message={message} parts={renderedParts} />\r\n </Box>\r\n );\r\n}\r\n\r\nexport function MessageParts({\r\n message,\r\n parts,\r\n}: {\r\n readonly message: UiMessage;\r\n readonly parts: readonly RenderedPart[];\r\n}): ReactElement {\r\n return (\r\n <>\r\n {parts.map((part) => (\r\n <Box key={`${message.id}_${String(part.index)}`}>\r\n {part.kind === \"spinner\"\r\n ? renderSpinnerPart(part)\r\n : renderTextPart(message, part)}\r\n </Box>\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\nexport function pairToolCallResult(\r\n parts: readonly UiMessagePart[],\r\n): readonly PairedMessagePart[] {\r\n const paired: PairedMessagePart[] = [];\r\n const callIds = new Set<string>();\r\n for (const part of parts) {\r\n if (part.type === \"tool-call\") {\r\n callIds.add(part.call.id);\r\n }\r\n }\r\n\r\n const resultByCallId = new Map<string, UiToolResult>();\r\n for (const part of parts) {\r\n if (\r\n part.type === \"tool-result\" &&\r\n !resultByCallId.has(part.result.callId)\r\n ) {\r\n resultByCallId.set(part.result.callId, part.result);\r\n }\r\n }\r\n\r\n for (let index = 0; index < parts.length; index += 1) {\r\n const part = parts[index];\r\n\r\n if (part.type === \"tool-call\") {\r\n paired.push({\r\n call: part.call,\r\n index,\r\n kind: \"tool\",\r\n result: resultByCallId.get(part.call.id),\r\n });\r\n continue;\r\n }\r\n\r\n if (part.type === \"tool-result\" && callIds.has(part.result.callId)) {\r\n continue;\r\n }\r\n\r\n paired.push({ index, kind: \"part\", part });\r\n }\r\n\r\n return paired;\r\n}\r\n\r\nexport interface RenderedMessagePart {\r\n readonly backgroundColor?: string;\r\n readonly color: string | undefined;\r\n readonly dimColor: boolean;\r\n readonly gutterColor?: string;\r\n readonly indent: number;\r\n readonly index: number;\r\n readonly kind: \"text\";\r\n readonly segments?: readonly RenderedTextSegment[];\r\n readonly text: string;\r\n}\r\n\r\nexport interface RenderedTextSegment {\r\n readonly color: string | undefined;\r\n readonly dimColor?: boolean;\r\n readonly text: string;\r\n}\r\n\r\nexport interface RenderedSpinnerPart {\r\n readonly index: number;\r\n readonly kind: \"spinner\";\r\n readonly label: string;\r\n readonly segments?: readonly RenderedTextSegment[];\r\n}\r\n\r\nexport type RenderedPart = RenderedMessagePart | RenderedSpinnerPart;\r\n\r\nexport function renderMessageParts(\r\n message: UiMessage,\r\n partWidth: number,\r\n theme: Theme,\r\n): readonly (RenderedMessagePart | RenderedSpinnerPart)[] {\r\n const rendered: (RenderedMessagePart | RenderedSpinnerPart)[] = [];\r\n\r\n for (const part of pairToolCallResult(message.parts)) {\r\n if (\r\n part.kind === \"tool\" &&\r\n (part.call.status === \"running\" || part.call.status === \"pending\")\r\n ) {\r\n rendered.push({\r\n index: part.index,\r\n kind: \"spinner\",\r\n label: renderToolLabel(part.call, part.result),\r\n segments: renderToolLabelSegments(\r\n part.call,\r\n part.result,\r\n theme,\r\n renderToolLabel(part.call, part.result),\r\n ),\r\n });\r\n continue;\r\n }\r\n\r\n const indent = message.role === \"user\" ? 0 : pairedPartIndent(part);\r\n const renderedPart = renderPairedMessagePart(\r\n message,\r\n part,\r\n Math.max(1, partWidth - indent),\r\n theme,\r\n );\r\n if (renderedPart.text === \"\") {\r\n continue;\r\n }\r\n\r\n rendered.push({\r\n backgroundColor:\r\n message.role === \"user\" ? theme.message.userBlockBg : undefined,\r\n color:\r\n message.role === \"user\"\r\n ? theme.role.user\r\n : pairedPartColor(part, theme),\r\n dimColor: part.kind === \"part\" && part.part.type === \"reasoning\",\r\n gutterColor:\r\n message.role === \"user\" ? theme.message.userGutter : undefined,\r\n indent,\r\n index: part.index,\r\n kind: \"text\",\r\n ...(renderedPart.segments === undefined\r\n ? {}\r\n : { segments: renderedPart.segments }),\r\n text: renderedPart.text,\r\n });\r\n }\r\n\r\n if (shouldRenderOutputTruncated(message)) {\r\n rendered.push({\r\n color: undefined,\r\n dimColor: true,\r\n indent: 0,\r\n index: message.parts.length,\r\n kind: \"text\",\r\n text: OUTPUT_TRUNCATED_LABEL,\r\n });\r\n }\r\n\r\n return rendered;\r\n}\r\n\r\nfunction shouldRenderOutputTruncated(message: UiMessage): boolean {\r\n return (\r\n message.role === \"assistant\" &&\r\n message.status === \"completed\" &&\r\n message.finishReason === \"length\"\r\n );\r\n}\r\n\r\nfunction renderSpinnerPart(part: RenderedSpinnerPart): ReactElement {\r\n if (!part.segments) {\r\n return <Spinner label={part.label} />;\r\n }\r\n\r\n return (\r\n <Text>\r\n <Spinner />\r\n <Text> </Text>\r\n {part.segments.map((segment, index) => (\r\n <Text\r\n color={segment.color}\r\n dimColor={segment.dimColor}\r\n key={String(index)}\r\n >\r\n {segment.text}\r\n </Text>\r\n ))}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction renderTextPart(\r\n message: UiMessage,\r\n part: RenderedMessagePart,\r\n): ReactElement {\r\n if (message.role !== \"user\") {\r\n return (\r\n <Box marginLeft={part.indent}>\r\n <Text color={part.color} dimColor={part.dimColor}>\r\n {part.segments\r\n ? part.segments.map((segment, index) => (\r\n <Text\r\n color={segment.color}\r\n dimColor={segment.dimColor}\r\n key={String(index)}\r\n >\r\n {segment.text}\r\n </Text>\r\n ))\r\n : part.text}\r\n </Text>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {part.text.split(\"\\n\").map((line, index) => (\r\n <Text backgroundColor={part.backgroundColor} key={String(index)}>\r\n <Text color={part.gutterColor}>\r\n {part.index === 0 && index === 0 ? \"| \" : \" \"}\r\n </Text>\r\n <Text color={part.color} dimColor={part.dimColor}>\r\n {line}\r\n </Text>\r\n </Text>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction renderPairedMessagePart(\r\n message: UiMessage,\r\n part: PairedMessagePart,\r\n partWidth: number,\r\n theme: Theme,\r\n): {\r\n readonly segments?: readonly RenderedTextSegment[];\r\n readonly text: string;\r\n} {\r\n if (part.kind === \"tool\") {\r\n const text = wrapAnsi(\r\n renderToolLabel(part.call, part.result),\r\n partWidth,\r\n ).join(\"\\n\");\r\n return {\r\n segments: renderToolLabelSegments(part.call, part.result, theme, text),\r\n text,\r\n };\r\n }\r\n\r\n return { text: renderSingleMessagePart(message, part.part, partWidth) };\r\n}\r\n\r\nfunction renderToolLabelSegments(\r\n call: UiToolCall,\r\n result: UiToolResult | undefined,\r\n theme: Theme,\r\n wrappedText: string,\r\n): readonly RenderedTextSegment[] {\r\n const parts = renderToolLabelParts(call, result);\r\n const nameText = parts.name;\r\n const summaryText = parts.summary === \"\" ? \"\" : ` ${parts.summary}`;\r\n const errorText = parts.error === \"\" ? \"\" : ` ${parts.error}`;\r\n const nameEnd = Array.from(nameText).length;\r\n const errorStart = Array.from(`${nameText}${summaryText}`).length;\r\n const rawChars = Array.from(`${nameText}${summaryText}${errorText}`);\r\n const segments: RenderedTextSegment[] = [];\r\n let rawIndex = 0;\r\n\r\n for (const char of Array.from(wrappedText)) {\r\n appendSegment(\r\n segments,\r\n colorForToolLabelIndex(rawIndex, theme, {\r\n errorStart,\r\n hasError: errorText !== \"\",\r\n nameEnd,\r\n }),\r\n char,\r\n );\r\n\r\n if (rawChars[rawIndex] === char || char !== \"\\n\") {\r\n rawIndex += 1;\r\n }\r\n }\r\n\r\n return segments;\r\n}\r\n\r\nfunction appendSegment(\r\n segments: RenderedTextSegment[],\r\n color: string,\r\n text: string,\r\n): void {\r\n const previous = segments.at(-1);\r\n if (previous?.color === color && previous.dimColor === undefined) {\r\n segments[segments.length - 1] = {\r\n color,\r\n text: `${previous.text}${text}`,\r\n };\r\n return;\r\n }\r\n segments.push({ color, text });\r\n}\r\n\r\nfunction colorForToolLabelIndex(\r\n rawIndex: number,\r\n theme: Theme,\r\n boundaries: {\r\n readonly errorStart: number;\r\n readonly hasError: boolean;\r\n readonly nameEnd: number;\r\n },\r\n): string {\r\n if (rawIndex < boundaries.nameEnd) {\r\n return theme.tool.name;\r\n }\r\n if (boundaries.hasError && rawIndex >= boundaries.errorStart) {\r\n return theme.tool.failed;\r\n }\r\n return theme.tool.arg;\r\n}\r\n\r\nfunction pairedPartIndent(part: PairedMessagePart): number {\r\n if (part.kind === \"tool\") {\r\n return 2;\r\n }\r\n\r\n return part.part.type === \"tool-call\" || part.part.type === \"tool-result\"\r\n ? 2\r\n : 0;\r\n}\r\n\r\nfunction renderSingleMessagePart(\r\n message: UiMessage,\r\n part: UiMessagePart,\r\n partWidth: number,\r\n): string {\r\n switch (part.type) {\r\n case \"text\":\r\n return message.role === \"assistant\"\r\n ? mdToAnsi(part.text, { width: partWidth }).join(\"\\n\")\r\n : wrapAnsi(part.text, partWidth).join(\"\\n\");\r\n case \"reasoning\":\r\n return message.status === \"streaming\"\r\n ? wrapAnsi(part.text, partWidth).join(\"\\n\")\r\n : \"Thought\";\r\n case \"tool-call\":\r\n case \"tool-result\":\r\n return wrapAnsi(renderToolPart(part), partWidth).join(\"\\n\");\r\n }\r\n}\r\n\r\nfunction pairedPartColor(\r\n part: PairedMessagePart,\r\n theme: Theme,\r\n): string | undefined {\r\n if (part.kind === \"tool\") {\r\n return part.call.status === \"failed\" || part.result?.error\r\n ? theme.tool.failed\r\n : theme.tool.name;\r\n }\r\n\r\n switch (part.part.type) {\r\n case \"tool-call\":\r\n return part.part.call.status === \"failed\"\r\n ? theme.tool.failed\r\n : theme.tool.name;\r\n case \"tool-result\":\r\n return part.part.result.error ? theme.tool.failed : theme.tool.success;\r\n case \"reasoning\":\r\n return theme.reasoning;\r\n case \"text\":\r\n return undefined;\r\n }\r\n}\r\n","import { Box, Static, useStdout } from \"ink\";\r\nimport { memo, type ReactElement } from \"react\";\r\nimport { useTuiLayout } from \"../../layout/context.js\";\r\nimport type { TranscriptItem } from \"../../store/transcript.js\";\r\nimport { MessageRow } from \"../message/message-row.js\";\r\n\r\nexport interface CommittedTranscriptProps {\r\n readonly items: readonly TranscriptItem[];\r\n}\r\n\r\ninterface StaticTranscriptDecisionInput {\r\n readonly env?: Readonly<Record<string, string | undefined>>;\r\n readonly isTTY?: boolean;\r\n readonly platform?: NodeJS.Platform;\r\n}\r\n\r\nexport const CommittedTranscript = memo(function CommittedTranscript({\r\n items,\r\n}: CommittedTranscriptProps): ReactElement {\r\n const layout = useTuiLayout();\r\n const { stdout } = useStdout();\r\n const useStatic = shouldUseStaticTranscript({\r\n isTTY: stdout.isTTY,\r\n });\r\n\r\n if (useStatic) {\r\n return (\r\n <Static items={items as TranscriptItem[]}>\r\n {(item): ReactElement => (\r\n <MessageRow\r\n bottomMargin={item.spacing ? 1 : 0}\r\n contentWidth={layout.contentWidth}\r\n key={item.id}\r\n message={item.message}\r\n />\r\n )}\r\n </Static>\r\n );\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {items.map((item) => (\r\n <MessageRow\r\n bottomMargin={item.spacing ? 1 : 0}\r\n contentWidth={layout.contentWidth}\r\n key={item.id}\r\n message={item.message}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n});\r\n\r\nexport function shouldUseStaticTranscript(\r\n input: StaticTranscriptDecisionInput = {},\r\n): boolean {\r\n const env = input.env ?? process.env;\r\n const override = env.OHBABY_TUI_STATIC_TRANSCRIPT?.trim();\r\n\r\n if (override === \"0\" || override?.toLowerCase() === \"false\") {\r\n return false;\r\n }\r\n\r\n if (override === \"1\" || override?.toLowerCase() === \"true\") {\r\n return true;\r\n }\r\n\r\n return (\r\n input.isTTY === true && (input.platform ?? process.platform) === \"win32\"\r\n );\r\n}\r\n","import type { RenderedPart } from \"../message/message-row.js\";\r\n\r\nexport interface LiveTailWindow {\r\n readonly hiddenLineCount: number;\r\n readonly parts: readonly RenderedPart[];\r\n}\r\n\r\n/**\r\n * Clamps the rendered live message to its trailing `maxLines` terminal rows.\r\n * Ink rewrites the whole dynamic frame with a terminal clear (including the\r\n * scrollback buffer) once that frame is as tall as the terminal, so the live\r\n * region must stay strictly below the terminal height. One row of the budget\r\n * is reserved for the \"hidden lines\" marker whenever clipping happens.\r\n */\r\nexport function clampRenderedPartsToTail(\r\n parts: readonly RenderedPart[],\r\n maxLines: number,\r\n): LiveTailWindow {\r\n const totalLines = parts.reduce((total, part) => total + partLines(part), 0);\r\n if (totalLines <= Math.max(0, maxLines)) {\r\n return { hiddenLineCount: 0, parts };\r\n }\r\n\r\n const budget = Math.max(0, maxLines - 1);\r\n const included: RenderedPart[] = [];\r\n let remaining = budget;\r\n\r\n for (let index = parts.length - 1; index >= 0 && remaining > 0; index -= 1) {\r\n const part = parts[index];\r\n const lines = partLines(part);\r\n\r\n if (lines <= remaining) {\r\n included.unshift(part);\r\n remaining -= lines;\r\n continue;\r\n }\r\n\r\n const sliced = sliceTextPartTail(part, remaining);\r\n if (sliced !== null) {\r\n included.unshift(sliced);\r\n remaining = 0;\r\n }\r\n break;\r\n }\r\n\r\n const includedLines = included.reduce(\r\n (total, part) => total + partLines(part),\r\n 0,\r\n );\r\n\r\n return {\r\n hiddenLineCount: totalLines - includedLines,\r\n parts: included,\r\n };\r\n}\r\n\r\nfunction partLines(part: RenderedPart): number {\r\n return part.kind === \"spinner\" ? 1 : part.text.split(\"\\n\").length;\r\n}\r\n\r\nfunction sliceTextPartTail(\r\n part: RenderedPart,\r\n lineCount: number,\r\n): RenderedPart | null {\r\n if (part.kind === \"spinner\") {\r\n return null;\r\n }\r\n\r\n const text = part.text.split(\"\\n\").slice(-lineCount).join(\"\\n\");\r\n if (part.segments !== undefined) {\r\n const { segments: _segments, ...plainPart } = part;\r\n return {\r\n ...plainPart,\r\n text,\r\n };\r\n }\r\n\r\n return {\r\n ...part,\r\n text,\r\n };\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { UiMessage } from \"ohbaby-sdk\";\r\nimport { memo, type ReactElement } from \"react\";\r\nimport { useTuiLayout } from \"../../layout/context.js\";\r\nimport { MessageParts, renderMessageParts } from \"../message/message-row.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\nimport { clampRenderedPartsToTail } from \"./live-tail-window.js\";\r\n\r\nexport interface LiveTailProps {\r\n readonly message: UiMessage | null;\r\n}\r\n\r\nexport const LiveTail = memo(function LiveTail({\r\n message,\r\n}: LiveTailProps): ReactElement | null {\r\n const layout = useTuiLayout();\r\n const theme = useTheme();\r\n\r\n if (!message) {\r\n return null;\r\n }\r\n\r\n const partWidth = Math.max(\r\n 1,\r\n layout.contentWidth - (message.role === \"user\" ? 2 : 0),\r\n );\r\n const rendered = renderMessageParts(message, partWidth, theme);\r\n const window = clampRenderedPartsToTail(rendered, layout.liveTailRows);\r\n\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n {window.hiddenLineCount > 0 ? (\r\n <Text dimColor>\r\n ... (+{String(window.hiddenLineCount)} earlier lines)\r\n </Text>\r\n ) : null}\r\n <MessageParts message={message} parts={window.parts} />\r\n </Box>\r\n );\r\n});\r\n","import { Box, Text } from \"ink\";\r\nimport type { UiNotice } from \"ohbaby-sdk\";\r\nimport { memo, type ReactElement } from \"react\";\r\nimport { useTheme, type Theme } from \"../../theme/index.js\";\r\n\r\nexport interface NoticeLaneProps {\r\n readonly notices: readonly UiNotice[];\r\n}\r\n\r\nexport const NoticeLane = memo(function NoticeLane({\r\n notices,\r\n}: NoticeLaneProps): ReactElement {\r\n const theme = useTheme();\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {notices.map((notice) => (\r\n <Box flexDirection=\"row\" key={notice.id} marginBottom={1}>\r\n <Text color={noticeColor(notice.level, theme)}>notice</Text>\r\n <Text dimColor> {notice.title}: </Text>\r\n <Text>{notice.message}</Text>\r\n {notice.source === undefined ? null : (\r\n <Text dimColor> ({notice.source})</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n\r\nfunction noticeColor(\r\n level: UiNotice[\"level\"],\r\n theme: Theme,\r\n): string | undefined {\r\n switch (level) {\r\n case \"error\":\r\n return theme.status.error;\r\n case \"warning\":\r\n return theme.status.warning;\r\n case \"info\":\r\n return theme.status.accent;\r\n }\r\n}\r\n","import { Box } from \"ink\";\r\nimport type { UiMessage, UiNotice } from \"ohbaby-sdk\";\r\nimport type { ReactElement } from \"react\";\r\nimport type { TuiCommandNotice, TuiRuntimeStatus } from \"../../store/snapshot.js\";\r\nimport type { TranscriptItem } from \"../../store/transcript.js\";\r\nimport { WorkingSpinner } from \"../working-spinner.js\";\r\nimport { CommandNoticeLane } from \"./command-notice-lane.js\";\r\nimport { CommittedTranscript } from \"./committed-transcript.js\";\r\nimport { LiveTail } from \"./live-tail.js\";\r\nimport { NoticeLane } from \"./notice-lane.js\";\r\n\r\nexport interface TranscriptViewportProps {\r\n readonly commandNotices: readonly TuiCommandNotice[];\r\n readonly committedItems: readonly TranscriptItem[];\r\n readonly liveMessage: UiMessage | null;\r\n readonly notices: readonly UiNotice[];\r\n readonly runtime: TuiRuntimeStatus;\r\n}\r\n\r\nexport function TranscriptViewport({\r\n commandNotices,\r\n committedItems,\r\n liveMessage,\r\n notices,\r\n runtime,\r\n}: TranscriptViewportProps): ReactElement {\r\n return (\r\n <Box flexDirection=\"column\">\r\n <CommittedTranscript items={committedItems} />\r\n <CommandNoticeLane commandNotices={commandNotices} />\r\n <LiveTail message={liveMessage} />\r\n <WorkingSpinner runtime={runtime} />\r\n <NoticeLane notices={notices} />\r\n </Box>\r\n );\r\n}\r\n","import {\r\n filterCommandCatalog as filterSdkCommandCatalog,\r\n parseSlashInput as parseSdkSlashInput,\r\n resolveCommand as resolveSdkCommand,\r\n type UiCommandInvocation,\r\n type UiCommandSpec,\r\n type UiParsedSlashInput,\r\n} from \"ohbaby-sdk\";\r\nimport type { TuiCommandCatalog } from \"../store/snapshot.js\";\r\n\r\nexport type ParsedSlashInput = UiParsedSlashInput | null;\r\n\r\nexport type ResolveCommandResult =\r\n | {\r\n readonly kind: \"resolved\";\r\n readonly command: UiCommandSpec;\r\n readonly invocation: UiCommandInvocation;\r\n }\r\n | {\r\n readonly kind: \"not-found\";\r\n readonly reason: string;\r\n }\r\n | {\r\n readonly kind: \"not-slash\";\r\n readonly reason: string;\r\n };\r\n\r\nexport interface CommandRuntimeOptions {\r\n readonly surface: \"tui\";\r\n readonly sessionId?: string;\r\n}\r\n\r\nlet invocationCounter = 0;\r\n\r\nexport function parseSlashInput(input: string): ParsedSlashInput {\r\n return parseSdkSlashInput(input);\r\n}\r\n\r\nexport function resolveCommand(\r\n parsed: ParsedSlashInput,\r\n catalog: TuiCommandCatalog,\r\n options: CommandRuntimeOptions,\r\n): ResolveCommandResult {\r\n const resolved = resolveSdkCommand(catalog, parsed, {\r\n surface: options.surface,\r\n });\r\n\r\n if (!resolved.ok) {\r\n return resolved.error.code === \"NOT_A_COMMAND\"\r\n ? {\r\n kind: \"not-slash\",\r\n reason: resolved.error.message,\r\n }\r\n : {\r\n kind: \"not-found\",\r\n reason: resolved.error.message,\r\n };\r\n }\r\n\r\n return {\r\n command: resolved.command,\r\n invocation: {\r\n argumentMode: resolved.command.argumentMode,\r\n argv: resolved.argv,\r\n body: resolved.body,\r\n clientInvocationId: createInvocationId(),\r\n commandId: resolved.command.id,\r\n path: resolved.path,\r\n raw: resolved.raw,\r\n rawArgs: resolved.rawArgs,\r\n sessionId: options.sessionId,\r\n surface: options.surface,\r\n },\r\n kind: \"resolved\",\r\n };\r\n}\r\n\r\nexport function filterCommandCatalog(\r\n parsed: ParsedSlashInput,\r\n catalog: TuiCommandCatalog,\r\n options: Pick<CommandRuntimeOptions, \"surface\">,\r\n): readonly UiCommandSpec[] {\r\n if (!parsed) {\r\n return [];\r\n }\r\n\r\n return filterSdkCommandCatalog(catalog, parsed.raw, {\r\n surface: options.surface,\r\n });\r\n}\r\n\r\nexport function applySlashCompletion(\r\n input: string,\r\n catalog: TuiCommandCatalog,\r\n options: Pick<CommandRuntimeOptions, \"surface\">,\r\n): string {\r\n const matches = filterCommandCatalog(\r\n parseSlashInput(input),\r\n catalog,\r\n options,\r\n );\r\n\r\n if (matches.length !== 1) {\r\n return input;\r\n }\r\n\r\n return `/${matches[0]?.path.join(\" \")} `;\r\n}\r\n\r\nfunction createInvocationId(): string {\r\n invocationCounter += 1;\r\n return `tui_${String(invocationCounter)}`;\r\n}\r\n","import type { TuiCommandSpec } from \"../store/snapshot.js\";\r\n\r\nexport const COMMAND_HINT_LIMIT = 6;\r\nconst COMMAND_HINT_MAX_LENGTH = 72;\r\n\r\nexport function formatCommandHint(command: TuiCommandSpec): string {\r\n return truncateHint(`/${command.path.join(\" \")} - ${command.description}`);\r\n}\r\n\r\nexport function formatCommandHints(\r\n commands: readonly TuiCommandSpec[],\r\n): readonly string[] {\r\n return commands.slice(0, COMMAND_HINT_LIMIT).map(formatCommandHint);\r\n}\r\n\r\nfunction truncateHint(value: string): string {\r\n if (value.length <= COMMAND_HINT_MAX_LENGTH) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, COMMAND_HINT_MAX_LENGTH - 3)}...`;\r\n}\r\n","import type { TuiCommandCatalog, TuiCommandSpec } from \"../store/snapshot.js\";\r\nimport {\r\n applySlashCompletion,\r\n filterCommandCatalog,\r\n parseSlashInput,\r\n} from \"./runtime.js\";\r\nimport { COMMAND_HINT_LIMIT } from \"./hints.js\";\r\n\r\nexport function getSlashCompletion(\r\n input: string,\r\n catalog: TuiCommandCatalog | null,\r\n selectedIndex = 0,\r\n): string {\r\n if (catalog === null) {\r\n return input;\r\n }\r\n\r\n const candidates = getSlashCompletionCandidates(input, catalog);\r\n if (candidates.length === 0) {\r\n return applySlashCompletion(input, catalog, { surface: \"tui\" });\r\n }\r\n\r\n const normalizedIndex =\r\n ((Math.floor(selectedIndex) % candidates.length) + candidates.length) %\r\n candidates.length;\r\n const selected = candidates[normalizedIndex];\r\n return `/${selected.path.join(\" \")} `;\r\n}\r\n\r\nexport function getSlashCompletionCandidates(\r\n input: string,\r\n catalog: TuiCommandCatalog | null,\r\n): readonly TuiCommandSpec[] {\r\n if (catalog === null) {\r\n return [];\r\n }\r\n\r\n return filterCommandCatalog(parseSlashInput(input), catalog, {\r\n surface: \"tui\",\r\n });\r\n}\r\n\r\nexport function getSlashCompletionWindow(\r\n input: string,\r\n catalog: TuiCommandCatalog | null,\r\n selectedIndex: number,\r\n): readonly TuiCommandSpec[] {\r\n const candidates = getSlashCompletionCandidates(input, catalog);\r\n const start = getSlashCompletionWindowStart(candidates.length, selectedIndex);\r\n\r\n return candidates.slice(start, start + COMMAND_HINT_LIMIT);\r\n}\r\n\r\nexport function getSlashCompletionWindowStart(\r\n candidateCount: number,\r\n selectedIndex: number,\r\n): number {\r\n if (candidateCount <= COMMAND_HINT_LIMIT) {\r\n return 0;\r\n }\r\n\r\n const normalizedIndex =\r\n ((Math.floor(selectedIndex) % candidateCount) + candidateCount) %\r\n candidateCount;\r\n\r\n return Math.min(\r\n Math.max(0, candidateCount - COMMAND_HINT_LIMIT),\r\n Math.floor(normalizedIndex / COMMAND_HINT_LIMIT) * COMMAND_HINT_LIMIT,\r\n );\r\n}\r\n\r\nexport function getSlashCompletionPageIndex(\r\n candidateCount: number,\r\n selectedIndex: number,\r\n direction: \"next\" | \"previous\",\r\n): number {\r\n if (candidateCount <= 0) {\r\n return 0;\r\n }\r\n\r\n const currentStart = getSlashCompletionWindowStart(\r\n candidateCount,\r\n selectedIndex,\r\n );\r\n const lastStart = getSlashCompletionWindowStart(\r\n candidateCount,\r\n candidateCount - 1,\r\n );\r\n\r\n if (direction === \"next\") {\r\n return currentStart >= lastStart\r\n ? 0\r\n : Math.min(candidateCount - 1, currentStart + COMMAND_HINT_LIMIT);\r\n }\r\n\r\n return currentStart === 0\r\n ? lastStart\r\n : Math.max(0, currentStart - COMMAND_HINT_LIMIT);\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { ReactElement } from \"react\";\r\nimport {\r\n getSlashCompletionCandidates,\r\n getSlashCompletionWindow,\r\n getSlashCompletionWindowStart,\r\n} from \"../../slash-commands/completions.js\";\r\nimport { formatCommandHints } from \"../../slash-commands/hints.js\";\r\nimport type { TuiCommandCatalog } from \"../../store/snapshot.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\n\r\nexport interface CompletionProps {\r\n readonly input: string;\r\n readonly catalog: TuiCommandCatalog | null;\r\n readonly selectedIndex: number;\r\n}\r\n\r\nexport function Completion({\r\n catalog,\r\n input,\r\n selectedIndex,\r\n}: CompletionProps): ReactElement {\r\n const theme = useTheme();\r\n const candidates = getSlashCompletionCandidates(input, catalog);\r\n const windowStart = getSlashCompletionWindowStart(\r\n candidates.length,\r\n selectedIndex,\r\n );\r\n const hints = formatCommandHints(\r\n getSlashCompletionWindow(input, catalog, selectedIndex),\r\n );\r\n const selectedWindowIndex = selectedIndex - windowStart;\r\n\r\n if (!input.startsWith(\"/\") || hints.length === 0) {\r\n return <></>;\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {hints.map((hint, index) => (\r\n <Text\r\n bold={index === selectedWindowIndex}\r\n color={\r\n index === selectedWindowIndex ? theme.status.accent : undefined\r\n }\r\n dimColor={index !== selectedWindowIndex}\r\n key={hint}\r\n >\r\n {index === selectedWindowIndex ? \"> \" : \" \"}\r\n {hint}\r\n </Text>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n","export interface EditorState {\r\n readonly cursor: EditorCursor;\r\n readonly draft: string | null;\r\n readonly history: readonly string[];\r\n readonly historyIndex: number;\r\n readonly lines: readonly string[];\r\n}\r\n\r\nexport interface EditorCursor {\r\n readonly col: number;\r\n readonly row: number;\r\n}\r\n\r\nexport type EditorAction =\r\n | { readonly text: string; readonly type: \"insert\" }\r\n | { readonly type: \"backspace\" }\r\n | { readonly type: \"clear-line\" }\r\n | { readonly type: \"history-down\" }\r\n | { readonly type: \"history-up\" }\r\n | { readonly type: \"move-end\" }\r\n | { readonly type: \"move-home\" }\r\n | { readonly type: \"move-left\" }\r\n | { readonly type: \"move-right\" }\r\n | { readonly type: \"newline\" }\r\n | { readonly type: \"submit\" };\r\n\r\nexport interface EditorReducerResult {\r\n readonly state: EditorState;\r\n readonly submission?: string;\r\n}\r\n\r\nexport function createEditorState(\r\n input: {\r\n readonly history?: readonly string[];\r\n readonly text?: string;\r\n } = {},\r\n): EditorState {\r\n const text = input.text ?? \"\";\r\n const lines = text.split(\"\\n\");\r\n const lastLine = lines.at(-1) ?? \"\";\r\n const history = input.history ?? [];\r\n\r\n return {\r\n cursor: { col: lastLine.length, row: lines.length - 1 },\r\n draft: null,\r\n history,\r\n historyIndex: history.length,\r\n lines,\r\n };\r\n}\r\n\r\nexport function editorText(state: EditorState): string {\r\n return state.lines.join(\"\\n\");\r\n}\r\n\r\nexport function applyEditorAction(\r\n state: EditorState,\r\n action: EditorAction,\r\n): EditorReducerResult {\r\n switch (action.type) {\r\n case \"insert\":\r\n return { state: insertText(state, action.text) };\r\n case \"newline\":\r\n return { state: insertText(state, \"\\n\") };\r\n case \"backspace\":\r\n return { state: backspace(state) };\r\n case \"clear-line\":\r\n return { state: clearCurrentLine(state) };\r\n case \"move-left\":\r\n return { state: moveLeft(state) };\r\n case \"move-right\":\r\n return { state: moveRight(state) };\r\n case \"move-home\":\r\n return { state: withCursor(state, { col: 0, row: state.cursor.row }) };\r\n case \"move-end\":\r\n return {\r\n state: withCursor(state, {\r\n col: lineAt(state, state.cursor.row).length,\r\n row: state.cursor.row,\r\n }),\r\n };\r\n case \"history-up\":\r\n return { state: historyUp(state) };\r\n case \"history-down\":\r\n return { state: historyDown(state) };\r\n case \"submit\":\r\n return submit(state);\r\n }\r\n}\r\n\r\nfunction insertText(state: EditorState, text: string): EditorState {\r\n if (text === \"\") {\r\n return state;\r\n }\r\n\r\n let next = state;\r\n for (const char of text.replace(/\\r\\n/gu, \"\\n\")) {\r\n next = char === \"\\n\" ? insertNewline(next) : insertChar(next, char);\r\n }\r\n return {\r\n ...next,\r\n draft: next.historyIndex === next.history.length ? next.draft : null,\r\n historyIndex: next.history.length,\r\n };\r\n}\r\n\r\nfunction insertChar(state: EditorState, char: string): EditorState {\r\n const lines = [...state.lines];\r\n const line = lineAt(state, state.cursor.row);\r\n lines[state.cursor.row] =\r\n `${line.slice(0, state.cursor.col)}${char}${line.slice(state.cursor.col)}`;\r\n return withLinesAndCursor(state, lines, {\r\n col: state.cursor.col + char.length,\r\n row: state.cursor.row,\r\n });\r\n}\r\n\r\nfunction insertNewline(state: EditorState): EditorState {\r\n const lines = [...state.lines];\r\n const line = lineAt(state, state.cursor.row);\r\n lines.splice(\r\n state.cursor.row,\r\n 1,\r\n line.slice(0, state.cursor.col),\r\n line.slice(state.cursor.col),\r\n );\r\n return withLinesAndCursor(state, lines, {\r\n col: 0,\r\n row: state.cursor.row + 1,\r\n });\r\n}\r\n\r\nfunction backspace(state: EditorState): EditorState {\r\n if (state.cursor.col > 0) {\r\n const lines = [...state.lines];\r\n const line = lineAt(state, state.cursor.row);\r\n lines[state.cursor.row] =\r\n `${line.slice(0, state.cursor.col - 1)}${line.slice(state.cursor.col)}`;\r\n return withLinesAndCursor(state, lines, {\r\n col: state.cursor.col - 1,\r\n row: state.cursor.row,\r\n });\r\n }\r\n\r\n if (state.cursor.row === 0) {\r\n return state;\r\n }\r\n\r\n const lines = [...state.lines];\r\n const currentLine = lineAt(state, state.cursor.row);\r\n const previousLine = lineAt(state, state.cursor.row - 1);\r\n lines.splice(state.cursor.row - 1, 2, `${previousLine}${currentLine}`);\r\n return withLinesAndCursor(state, lines, {\r\n col: previousLine.length,\r\n row: state.cursor.row - 1,\r\n });\r\n}\r\n\r\nfunction clearCurrentLine(state: EditorState): EditorState {\r\n const lines = [...state.lines];\r\n lines[state.cursor.row] = \"\";\r\n return withLinesAndCursor(state, lines, { col: 0, row: state.cursor.row });\r\n}\r\n\r\nfunction moveLeft(state: EditorState): EditorState {\r\n if (state.cursor.col > 0) {\r\n return withCursor(state, {\r\n col: state.cursor.col - 1,\r\n row: state.cursor.row,\r\n });\r\n }\r\n if (state.cursor.row === 0) {\r\n return state;\r\n }\r\n return withCursor(state, {\r\n col: lineAt(state, state.cursor.row - 1).length,\r\n row: state.cursor.row - 1,\r\n });\r\n}\r\n\r\nfunction moveRight(state: EditorState): EditorState {\r\n const currentLine = lineAt(state, state.cursor.row);\r\n if (state.cursor.col < currentLine.length) {\r\n return withCursor(state, {\r\n col: state.cursor.col + 1,\r\n row: state.cursor.row,\r\n });\r\n }\r\n if (state.cursor.row >= state.lines.length - 1) {\r\n return state;\r\n }\r\n return withCursor(state, { col: 0, row: state.cursor.row + 1 });\r\n}\r\n\r\nfunction historyUp(state: EditorState): EditorState {\r\n if (state.history.length === 0) {\r\n return state;\r\n }\r\n const nextIndex = Math.max(0, state.historyIndex - 1);\r\n const draft =\r\n state.historyIndex === state.history.length\r\n ? editorText(state)\r\n : state.draft;\r\n return loadText(state, state.history[nextIndex], {\r\n draft,\r\n historyIndex: nextIndex,\r\n });\r\n}\r\n\r\nfunction historyDown(state: EditorState): EditorState {\r\n if (state.historyIndex >= state.history.length) {\r\n return state;\r\n }\r\n const nextIndex = state.historyIndex + 1;\r\n if (nextIndex >= state.history.length) {\r\n return loadText(state, state.draft ?? \"\", {\r\n draft: null,\r\n historyIndex: state.history.length,\r\n });\r\n }\r\n return loadText(state, state.history[nextIndex], {\r\n draft: state.draft,\r\n historyIndex: nextIndex,\r\n });\r\n}\r\n\r\nfunction submit(state: EditorState): EditorReducerResult {\r\n const submission = editorText(state).trim();\r\n if (submission === \"\") {\r\n return { state };\r\n }\r\n\r\n const history = [...state.history, submission];\r\n return {\r\n state: createEditorState({ history }),\r\n submission,\r\n };\r\n}\r\n\r\nfunction loadText(\r\n state: EditorState,\r\n text: string,\r\n patch: Pick<EditorState, \"draft\" | \"historyIndex\">,\r\n): EditorState {\r\n const loaded = createEditorState({ history: state.history, text });\r\n return {\r\n ...loaded,\r\n draft: patch.draft,\r\n historyIndex: patch.historyIndex,\r\n };\r\n}\r\n\r\nfunction withLinesAndCursor(\r\n state: EditorState,\r\n lines: readonly string[],\r\n cursor: EditorCursor,\r\n): EditorState {\r\n return {\r\n ...state,\r\n cursor: clampCursor(lines, cursor),\r\n lines,\r\n };\r\n}\r\n\r\nfunction withCursor(state: EditorState, cursor: EditorCursor): EditorState {\r\n return {\r\n ...state,\r\n cursor: clampCursor(state.lines, cursor),\r\n };\r\n}\r\n\r\nfunction clampCursor(\r\n lines: readonly string[],\r\n cursor: EditorCursor,\r\n): EditorCursor {\r\n const row = Math.min(Math.max(0, cursor.row), lines.length - 1);\r\n const col = Math.min(Math.max(0, cursor.col), (lines[row] ?? \"\").length);\r\n return { col, row };\r\n}\r\n\r\nfunction lineAt(state: EditorState, row: number): string {\r\n return state.lines[row] ?? \"\";\r\n}\r\n","import { Box, Text, useInput } from \"ink\";\r\nimport type { CoreAPI, UiCommandInvocation, UiPermissionState } from \"ohbaby-sdk\";\r\nimport { useRef, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport {\r\n getSlashCompletion,\r\n getSlashCompletionCandidates,\r\n getSlashCompletionPageIndex,\r\n} from \"../../slash-commands/completions.js\";\r\nimport {\r\n parseSlashInput,\r\n resolveCommand,\r\n} from \"../../slash-commands/runtime.js\";\r\nimport { useTuiLayout } from \"../../layout/context.js\";\r\nimport type { TuiCommandCatalog } from \"../../store/snapshot.js\";\r\nimport { useTheme } from \"../../theme/index.js\";\r\nimport { Completion } from \"./completion.js\";\r\nimport {\r\n applyEditorAction,\r\n createEditorState,\r\n editorText,\r\n type EditorAction,\r\n type EditorState,\r\n} from \"./editor-reducer.js\";\r\nimport {\r\n displayPanelKindForCommandId,\r\n interactivePanelKindForCommandId,\r\n type CommandPanelKind,\r\n} from \"../dialog/command-panel-state.js\";\r\n\r\nexport interface PromptProps {\r\n readonly activeSessionId: string | null;\r\n readonly catalog: TuiCommandCatalog | null;\r\n readonly client: CoreAPI;\r\n readonly contextWindowUsage?: string;\r\n readonly disabled: boolean;\r\n readonly isRuntimeRunning?: boolean;\r\n readonly loadCatalog?: () => Promise<TuiCommandCatalog>;\r\n readonly onCommandPanelOpen?: (input: {\r\n readonly invocation: UiCommandInvocation;\r\n readonly kind: CommandPanelKind;\r\n }) => void;\r\n readonly permission?: UiPermissionState;\r\n readonly runtimeStatusLabel?: string;\r\n}\r\n\r\nexport function Prompt({\r\n activeSessionId,\r\n catalog,\r\n client,\r\n contextWindowUsage = \"\",\r\n disabled,\r\n isRuntimeRunning = false,\r\n loadCatalog,\r\n onCommandPanelOpen,\r\n permission,\r\n runtimeStatusLabel,\r\n}: PromptProps): ReactElement {\r\n const theme = useTheme();\r\n const layout = useTuiLayout();\r\n const [editor, setEditor] = useState<EditorState>(() => createEditorState());\r\n const [error, setError] = useState<string | null>(null);\r\n const [queuedPromptCount, setQueuedPromptCount] = useState(0);\r\n const [selectedIndex, setSelectedIndex] = useState(0);\r\n const editorRef = useRef(editor);\r\n const pendingPromptSubmissionCountRef = useRef(0);\r\n const selectedIndexRef = useRef(0);\r\n\r\n const replaceEditor = (nextEditor: EditorState): void => {\r\n editorRef.current = nextEditor;\r\n setEditor(nextEditor);\r\n };\r\n\r\n const replaceInput = (nextInput: string): void => {\r\n replaceEditor(\r\n createEditorState({\r\n history: editorRef.current.history,\r\n text: nextInput,\r\n }),\r\n );\r\n };\r\n\r\n const applyEditor = (\r\n action: EditorAction,\r\n ): ReturnType<typeof applyEditorAction> => {\r\n const result = applyEditorAction(editorRef.current, action);\r\n replaceEditor(result.state);\r\n return result;\r\n };\r\n\r\n const selectIndex = (index: number): void => {\r\n selectedIndexRef.current = index;\r\n setSelectedIndex(index);\r\n };\r\n\r\n useInput(\r\n (value, key) => {\r\n const currentInput = editorText(editorRef.current);\r\n const candidates = getSlashCompletionCandidates(currentInput, catalog);\r\n\r\n if (key.return) {\r\n if (key.shift) {\r\n applyEditor({ type: \"newline\" });\r\n return;\r\n }\r\n\r\n const result = applyEditor({ type: \"submit\" });\r\n if (result.submission === undefined) {\r\n return;\r\n }\r\n void submitInput(\r\n result.submission,\r\n activeSessionId,\r\n catalog,\r\n client,\r\n loadCatalog,\r\n replaceInput,\r\n setError,\r\n isRuntimeRunning,\r\n pendingPromptSubmissionCountRef,\r\n setQueuedPromptCount,\r\n selectedIndexRef.current,\r\n onCommandPanelOpen,\r\n );\r\n return;\r\n }\r\n\r\n if (currentInput.startsWith(\"/\") && candidates.length > 0) {\r\n if (key.upArrow) {\r\n selectIndex(\r\n (selectedIndexRef.current - 1 + candidates.length) %\r\n candidates.length,\r\n );\r\n return;\r\n }\r\n\r\n if (key.downArrow) {\r\n selectIndex((selectedIndexRef.current + 1) % candidates.length);\r\n return;\r\n }\r\n\r\n if (key.pageUp) {\r\n selectIndex(\r\n getSlashCompletionPageIndex(\r\n candidates.length,\r\n selectedIndexRef.current,\r\n \"previous\",\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n if (key.pageDown) {\r\n selectIndex(\r\n getSlashCompletionPageIndex(\r\n candidates.length,\r\n selectedIndexRef.current,\r\n \"next\",\r\n ),\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (key.upArrow) {\r\n applyEditor({ type: \"history-up\" });\r\n return;\r\n }\r\n\r\n if (key.downArrow) {\r\n applyEditor({ type: \"history-down\" });\r\n return;\r\n }\r\n\r\n if (key.tab && !key.shift) {\r\n replaceInput(\r\n getSlashCompletion(currentInput, catalog, selectedIndexRef.current),\r\n );\r\n selectIndex(0);\r\n return;\r\n }\r\n\r\n if (value === \"\\u0015\" || (key.ctrl && value === \"u\")) {\r\n applyEditor({ type: \"clear-line\" });\r\n selectIndex(0);\r\n setError(null);\r\n return;\r\n }\r\n\r\n if (isDeleteControlInput(value, key)) {\r\n applyEditor({ type: \"backspace\" });\r\n selectIndex(0);\r\n return;\r\n }\r\n\r\n if (key.leftArrow) {\r\n applyEditor({ type: \"move-left\" });\r\n return;\r\n }\r\n\r\n if (key.rightArrow) {\r\n applyEditor({ type: \"move-right\" });\r\n return;\r\n }\r\n\r\n if (key.home) {\r\n applyEditor({ type: \"move-home\" });\r\n return;\r\n }\r\n\r\n if (key.end) {\r\n applyEditor({ type: \"move-end\" });\r\n return;\r\n }\r\n\r\n if (value.length > 0 && !key.ctrl && !key.meta) {\r\n applyEditor({ text: value, type: \"insert\" });\r\n selectIndex(0);\r\n setError(null);\r\n }\r\n },\r\n { isActive: !disabled },\r\n );\r\n\r\n const dockStatus = formatDockStatus({\r\n activeSessionId,\r\n permission,\r\n queuedPromptCount,\r\n runtimeStatusLabel,\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box\r\n borderColor={theme.border}\r\n borderStyle=\"round\"\r\n flexDirection=\"column\"\r\n paddingX={1}\r\n width={layout.contentWidth}\r\n >\r\n {renderEditorLines(editor, disabled, theme.cursor)}\r\n </Box>\r\n {dockStatus === \"\" && contextWindowUsage === \"\" ? null : (\r\n <Box justifyContent=\"space-between\">\r\n <Text dimColor>{dockStatus}</Text>\r\n {contextWindowUsage === \"\" ? null : (\r\n <Text dimColor>{contextWindowUsage}</Text>\r\n )}\r\n </Box>\r\n )}\r\n {error === null ? null : <Text color={theme.status.error}>{error}</Text>}\r\n <Completion\r\n catalog={catalog}\r\n input={editorText(editor)}\r\n selectedIndex={selectedIndex}\r\n />\r\n </Box>\r\n );\r\n}\r\n\r\nfunction renderEditorLines(\r\n editor: EditorState,\r\n disabled: boolean,\r\n cursorColor: string,\r\n): readonly ReactElement[] {\r\n const isEmpty = editorText(editor).length === 0;\r\n return editor.lines.map((line, index) => (\r\n <Text key={String(index)}>\r\n <Text dimColor={disabled}>{index === 0 ? \"> \" : \" \"}</Text>\r\n {disabled && isEmpty && index === 0 ? (\r\n <Text dimColor>paused</Text>\r\n ) : (\r\n renderEditorLineText({\r\n cursorColor,\r\n editor,\r\n enabled: !disabled,\r\n index,\r\n line,\r\n })\r\n )}\r\n </Text>\r\n ));\r\n}\r\n\r\nfunction renderEditorLineText(input: {\r\n readonly cursorColor: string;\r\n readonly editor: EditorState;\r\n readonly enabled: boolean;\r\n readonly index: number;\r\n readonly line: string;\r\n}): ReactElement {\r\n if (!input.enabled || input.editor.cursor.row !== input.index) {\r\n return <Text>{input.line}</Text>;\r\n }\r\n\r\n const cursorColumn = input.editor.cursor.col;\r\n const cursorChar =\r\n cursorColumn >= input.line.length\r\n ? \" \"\r\n : input.line.slice(cursorColumn, cursorColumn + 1);\r\n return (\r\n <Text>\r\n {input.line.slice(0, cursorColumn)}\r\n <Text color={input.cursorColor} inverse>\r\n {cursorChar}\r\n </Text>\r\n {input.line.slice(cursorColumn + cursorChar.length)}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction isDeleteControlInput(\r\n value: string,\r\n key: { readonly backspace: boolean; readonly delete: boolean },\r\n): boolean {\r\n return (\r\n key.backspace ||\r\n key.delete ||\r\n value === \"\\b\" ||\r\n value === \"\\x7f\" ||\r\n value === \"[P\" ||\r\n value === \"\\u001B[P\"\r\n );\r\n}\r\n\r\nfunction formatDockStatus(input: {\r\n readonly activeSessionId: string | null;\r\n readonly permission?: UiPermissionState;\r\n readonly queuedPromptCount: number;\r\n readonly runtimeStatusLabel?: string;\r\n}): string {\r\n const parts: string[] = [];\r\n if (input.runtimeStatusLabel) {\r\n parts.push(input.runtimeStatusLabel);\r\n }\r\n if (input.queuedPromptCount > 0) {\r\n parts.push(\r\n input.queuedPromptCount === 1\r\n ? \"Queued\"\r\n : `Queued ${String(input.queuedPromptCount)}`,\r\n );\r\n }\r\n if (input.permission) {\r\n parts.push(input.permission.mode, input.permission.level);\r\n }\r\n if (input.activeSessionId) {\r\n parts.push(input.activeSessionId);\r\n }\r\n return parts.join(\" · \");\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"Command failed\";\r\n}\r\n\r\nasync function submitInput(\r\n input: string,\r\n activeSessionId: string | null,\r\n catalog: TuiCommandCatalog | null,\r\n client: CoreAPI,\r\n loadCatalog: (() => Promise<TuiCommandCatalog>) | undefined,\r\n replaceInput: (nextInput: string) => void,\r\n setError: (message: string | null) => void,\r\n isRuntimeRunning: boolean,\r\n pendingPromptSubmissionCountRef: { current: number },\r\n setQueuedPromptCount: (updater: (current: number) => number) => void,\r\n selectedIndex: number,\r\n onCommandPanelOpen:\r\n | ((input: {\r\n readonly invocation: UiCommandInvocation;\r\n readonly kind: CommandPanelKind;\r\n }) => void)\r\n | undefined,\r\n): Promise<void> {\r\n const text = input.trim();\r\n\r\n if (text === \"\") {\r\n return;\r\n }\r\n\r\n if (!text.startsWith(\"/\")) {\r\n setError(null);\r\n replaceInput(\"\");\r\n const trackQueuedPrompt =\r\n isRuntimeRunning || pendingPromptSubmissionCountRef.current > 0;\r\n pendingPromptSubmissionCountRef.current += 1;\r\n if (trackQueuedPrompt) {\r\n setQueuedPromptCount((current) => current + 1);\r\n }\r\n void client\r\n .submitPrompt(text, {\r\n sessionId: activeSessionId ?? undefined,\r\n })\r\n .catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n })\r\n .finally(() => {\r\n pendingPromptSubmissionCountRef.current = Math.max(\r\n 0,\r\n pendingPromptSubmissionCountRef.current - 1,\r\n );\r\n if (trackQueuedPrompt) {\r\n setQueuedPromptCount((current) => Math.max(0, current - 1));\r\n }\r\n });\r\n return;\r\n }\r\n\r\n let commandCatalog = catalog;\r\n if (commandCatalog === null) {\r\n if (!loadCatalog) {\r\n setError(\"Command catalog is not loaded\");\r\n return;\r\n }\r\n setError(null);\r\n replaceInput(\"\");\r\n try {\r\n commandCatalog = await loadCatalog();\r\n } catch (caught) {\r\n setError(formatError(caught));\r\n return;\r\n }\r\n }\r\n\r\n const result = resolveCommand(parseSlashInput(text), commandCatalog, {\r\n sessionId: activeSessionId ?? undefined,\r\n surface: \"tui\",\r\n });\r\n const candidates = getSlashCompletionCandidates(text, commandCatalog);\r\n const selected =\r\n candidates.length > 0\r\n ? candidates[selectedIndex % candidates.length]\r\n : null;\r\n const selectedOverridesExact =\r\n result.kind === \"resolved\" &&\r\n selectedIndex > 0 &&\r\n selected !== null &&\r\n selected.id !== result.command.id;\r\n\r\n if ((result.kind !== \"resolved\" || selectedOverridesExact) && selected) {\r\n const selectedResult = resolveCommand(\r\n parseSlashInput(`/${selected.path.join(\" \")}`),\r\n commandCatalog,\r\n {\r\n sessionId: activeSessionId ?? undefined,\r\n surface: \"tui\",\r\n },\r\n );\r\n if (selectedResult.kind === \"resolved\") {\r\n setError(null);\r\n replaceInput(\"\");\r\n executeCommandInvocation(\r\n selectedResult.invocation,\r\n client,\r\n setError,\r\n onCommandPanelOpen,\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (result.kind !== \"resolved\") {\r\n setError(result.reason);\r\n return;\r\n }\r\n\r\n setError(null);\r\n replaceInput(\"\");\r\n executeCommandInvocation(\r\n result.invocation,\r\n client,\r\n setError,\r\n onCommandPanelOpen,\r\n );\r\n}\r\n\r\nfunction executeCommandInvocation(\r\n invocation: UiCommandInvocation,\r\n client: CoreAPI,\r\n setError: (message: string | null) => void,\r\n onCommandPanelOpen:\r\n | ((input: {\r\n readonly invocation: UiCommandInvocation;\r\n readonly kind: CommandPanelKind;\r\n }) => void)\r\n | undefined,\r\n): void {\r\n const interactiveKind = interactivePanelKindForCommandId(\r\n invocation.commandId,\r\n );\r\n if (interactiveKind !== null) {\r\n onCommandPanelOpen?.({ invocation, kind: interactiveKind });\r\n return;\r\n }\r\n\r\n const displayKind = displayPanelKindForCommandId(invocation.commandId);\r\n if (displayKind !== null) {\r\n onCommandPanelOpen?.({ invocation, kind: displayKind });\r\n }\r\n\r\n void client.executeCommand(invocation).catch((caught: unknown) => {\r\n setError(formatError(caught));\r\n });\r\n}\r\n","import { Box, useStdout } from \"ink\";\r\nimport type { ReactElement, ReactNode } from \"react\";\r\nimport { LayoutProvider } from \"./context.js\";\r\nimport { computeLayoutMetrics } from \"./metrics.js\";\r\n\r\nexport interface AppShellProps {\r\n readonly children: ReactNode;\r\n}\r\n\r\nexport function AppShell({ children }: AppShellProps): ReactElement {\r\n const { stdout } = useStdout();\r\n const metrics = computeLayoutMetrics({\r\n columns: stdout.columns,\r\n rows: stdout.rows,\r\n });\r\n\r\n return (\r\n <LayoutProvider value={metrics}>\r\n <Box\r\n alignItems=\"center\"\r\n flexDirection=\"column\"\r\n paddingLeft={metrics.horizontalPadding}\r\n paddingRight={metrics.horizontalPadding}\r\n width={metrics.columns}\r\n >\r\n <Box flexDirection=\"column\" width={metrics.contentWidth}>\r\n {children}\r\n </Box>\r\n </Box>\r\n </LayoutProvider>\r\n );\r\n}\r\n","import type { UiContextWindowUsage } from \"ohbaby-sdk\";\r\nimport { formatContextWindowUsage } from \"./usage.js\";\r\n\r\nconst LABEL_WIDTH = 8;\r\n\r\ninterface CountLabel {\r\n readonly count: number | undefined;\r\n readonly label: string;\r\n}\r\n\r\ninterface PresentCountLabel {\r\n readonly count: number;\r\n readonly label: string;\r\n}\r\n\r\nexport function renderStatusPanel(data: Record<string, unknown>): string {\r\n const rows: string[] = [\r\n row(\"Runtime\", getString(data, \"status\") ?? \"unknown\"),\r\n ];\r\n const sessionId = getString(data, \"sessionId\");\r\n const permission = formatPermission(getRecord(data, \"permission\"));\r\n const model = formatModelLabel(getRecord(data, \"model\"));\r\n const tools = formatTools(getRecord(data, \"tools\"));\r\n const mcps = formatMcps(getRecord(data, \"mcps\"));\r\n const projectRoot = getString(data, \"projectRoot\");\r\n\r\n if (sessionId) {\r\n rows.push(row(\"Session\", sessionId));\r\n }\r\n if (permission) {\r\n rows.push(row(\"Permission\", permission));\r\n }\r\n if (model) {\r\n rows.push(row(\"Model\", model));\r\n }\r\n rows.push(row(\"Context\", formatContextWindow(data)));\r\n if (tools) {\r\n rows.push(row(\"Tools\", tools));\r\n }\r\n if (mcps) {\r\n rows.push(row(\"MCP\", mcps));\r\n }\r\n if (projectRoot) {\r\n rows.push(row(\"Project\", projectRoot));\r\n }\r\n\r\n return [\"╭─ Status ─\", ...rows, \"╰──────────\"].join(\"\\n\");\r\n}\r\n\r\nfunction row(label: string, value: string): string {\r\n return `│ ${label.padEnd(LABEL_WIDTH, \" \")} ${value}`;\r\n}\r\n\r\nfunction formatContextWindow(data: Record<string, unknown>): string {\r\n const usage = toContextWindowUsage(getRecord(data, \"contextWindow\"));\r\n const formatted = formatContextWindowUsage(usage);\r\n return formatted === \"\" ? \"Context unavailable\" : formatted;\r\n}\r\n\r\nfunction toContextWindowUsage(\r\n record: Record<string, unknown> | undefined,\r\n): UiContextWindowUsage | null {\r\n if (!record) {\r\n return null;\r\n }\r\n const currentTokens = getNumber(record, \"currentTokens\");\r\n const contextWindowTokens = getNumber(record, \"contextWindowTokens\");\r\n const contextWindowRatio = getNumber(record, \"contextWindowRatio\");\r\n if (\r\n currentTokens === undefined ||\r\n contextWindowTokens === undefined ||\r\n contextWindowRatio === undefined\r\n ) {\r\n return null;\r\n }\r\n\r\n return {\r\n contextWindowRatio,\r\n contextWindowTokens,\r\n currentTokens,\r\n estimatedAt: getString(record, \"estimatedAt\") ?? \"\",\r\n modelId: getString(record, \"modelId\") ?? \"\",\r\n sessionId: getString(record, \"sessionId\") ?? \"\",\r\n };\r\n}\r\n\r\nfunction formatModelLabel(\r\n model: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!model) {\r\n return undefined;\r\n }\r\n return getString(model, \"label\") ?? getString(model, \"id\");\r\n}\r\n\r\nfunction formatPermission(\r\n permission: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!permission) {\r\n return undefined;\r\n }\r\n const mode = getString(permission, \"mode\");\r\n const level = getString(permission, \"level\");\r\n return mode && level ? `${mode} / ${level}` : undefined;\r\n}\r\n\r\nfunction formatTools(tools: Record<string, unknown> | undefined): string | null {\r\n if (!tools) {\r\n return null;\r\n }\r\n\r\n return `${formatCount(getNumber(tools, \"builtin\"))} builtin, ${formatCount(\r\n getNumber(tools, \"module\"),\r\n )} module, ${formatCount(getNumber(tools, \"skill\"))} skill, ${formatCount(\r\n getNumber(tools, \"mcp\"),\r\n )} mcp`;\r\n}\r\n\r\nfunction formatMcps(mcps: Record<string, unknown> | undefined): string | null {\r\n if (!mcps) {\r\n return null;\r\n }\r\n const entries: readonly CountLabel[] = [\r\n { count: getNumber(mcps, \"connected\"), label: \"connected\" },\r\n { count: getNumber(mcps, \"failed\"), label: \"failed\" },\r\n { count: getNumber(mcps, \"disabled\"), label: \"disabled\" },\r\n { count: getNumber(mcps, \"disconnected\"), label: \"disconnected\" },\r\n ]\r\n .filter((entry): entry is PresentCountLabel => entry.count !== undefined)\r\n .filter((entry) => entry.count > 0);\r\n const parts = entries.map(\r\n (entry) => `${formatCount(entry.count)} ${entry.label}`,\r\n );\r\n\r\n return parts.length > 0 ? parts.join(\", \") : \"none\";\r\n}\r\n\r\nfunction formatCount(value: number | undefined): string {\r\n return String(Math.max(0, Math.round(value ?? 0)));\r\n}\r\n\r\nfunction getRecord(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): Record<string, unknown> | undefined {\r\n const value = record[key];\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : undefined;\r\n}\r\n\r\nfunction getString(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): string | undefined {\r\n const value = record[key];\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction getNumber(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): number | undefined {\r\n const value = record[key];\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n","import type { UiMessage } from \"ohbaby-sdk\";\r\nimport type { TuiRuntimeStatus } from \"./snapshot.js\";\r\n\r\nexport interface TranscriptSplit {\r\n readonly committedMessages: readonly UiMessage[];\r\n readonly liveMessage: UiMessage | null;\r\n}\r\n\r\n/**\r\n * One append-only entry of the committed transcript. Whole messages map to a\r\n * single item; a streaming message is committed progressively as fragment\r\n * items so finished parts reach the terminal scrollback (via <Static>) while\r\n * the rest of the message is still being generated.\r\n */\r\nexport interface TranscriptItem {\r\n readonly id: string;\r\n readonly messageId: string;\r\n readonly message: UiMessage;\r\n /** Render a bottom margin: true for whole messages and final fragments. */\r\n readonly spacing: boolean;\r\n}\r\n\r\nexport interface TranscriptCommitState {\r\n readonly committedItems: readonly TranscriptItem[];\r\n /** Parts already committed per fragmented message id. */\r\n readonly committedPartCounts: Readonly<Partial<Record<string, number>>>;\r\n readonly liveMessage: UiMessage | null;\r\n}\r\n\r\n/**\r\n * Advances the committed transcript: emits new items for messages that have\r\n * committed wholesale and fragment items for the sealed prefix of the live\r\n * message. Items are append-only (committed output is frozen in scrollback),\r\n * so previously committed parts are never re-emitted, and the returned arrays\r\n * keep their previous references when nothing changed.\r\n */\r\nexport function advanceTranscriptCommit(\r\n previous: TranscriptCommitState | undefined,\r\n messages: readonly UiMessage[],\r\n runtime: TuiRuntimeStatus,\r\n): TranscriptCommitState {\r\n const split = splitTranscript(messages, runtime);\r\n const previousItems = previous?.committedItems ?? [];\r\n const previousCounts = previous?.committedPartCounts ?? {};\r\n const items = [...previousItems];\r\n const counts: Partial<Record<string, number>> = { ...previousCounts };\r\n const itemIndexById = new Map(\r\n previousItems.map((item, index) => [item.id, index] as const),\r\n );\r\n const committedMessageIds = new Set(\r\n previousItems.map((item) => item.messageId),\r\n );\r\n let changed = false;\r\n\r\n const appendItem = (item: TranscriptItem): void => {\r\n itemIndexById.set(item.id, items.length);\r\n items.push(item);\r\n committedMessageIds.add(item.messageId);\r\n changed = true;\r\n };\r\n\r\n for (const message of split.committedMessages) {\r\n const committedParts = counts[message.id];\r\n if (committedParts !== undefined) {\r\n if (committedParts < message.parts.length) {\r\n appendItem(\r\n fragmentItem(message, committedParts, message.parts.length, true),\r\n );\r\n counts[message.id] = message.parts.length;\r\n } else if (needsFinalItem(items, message)) {\r\n appendItem(finalItem(message));\r\n }\r\n continue;\r\n }\r\n\r\n if (committedMessageIds.has(message.id)) {\r\n // A whole-committed message changed after the fact (e.g. a late delta\r\n // or canonical update). Refresh the item in place so the dynamic\r\n // (non-Static) transcript re-renders it; the Static path keeps showing\r\n // the frozen output, exactly as before.\r\n const index = itemIndexById.get(message.id);\r\n if (\r\n index !== undefined &&\r\n items[index].message !== message &&\r\n needsFinalItem(items, message)\r\n ) {\r\n appendItem(finalItem(message));\r\n continue;\r\n }\r\n if (index !== undefined && items[index].message !== message) {\r\n items[index] = { ...items[index], message };\r\n changed = true;\r\n }\r\n continue;\r\n }\r\n appendItem({\r\n id: message.id,\r\n message,\r\n messageId: message.id,\r\n spacing: true,\r\n });\r\n }\r\n\r\n let liveMessage: UiMessage | null = null;\r\n if (split.liveMessage !== null) {\r\n const live = split.liveMessage;\r\n if (itemIndexById.has(live.id)) {\r\n return unchangedOrNext(previous, changed, items, counts, null);\r\n }\r\n\r\n const alreadyCommitted = counts[live.id] ?? 0;\r\n const start = Math.min(\r\n live.parts.length,\r\n Math.max(alreadyCommitted, computeLiveStartIndex(live)),\r\n );\r\n\r\n if (start > alreadyCommitted) {\r\n appendItem(fragmentItem(live, alreadyCommitted, start, false));\r\n counts[live.id] = start;\r\n }\r\n\r\n if (start === 0) {\r\n liveMessage = live;\r\n } else if (start < live.parts.length) {\r\n liveMessage = reuseLiveMessage(previous?.liveMessage ?? null, {\r\n ...live,\r\n parts: live.parts.slice(start),\r\n });\r\n }\r\n }\r\n\r\n return unchangedOrNext(previous, changed, items, counts, liveMessage);\r\n}\r\n\r\n/**\r\n * Index of the first part of a streaming message that may still change.\r\n * Everything before it is \"sealed\" and safe to freeze into the scrollback:\r\n * text and reasoning parts once a later part exists, tool calls once they\r\n * reached a terminal status and their result is present. A tool call is never\r\n * separated from its result across the committed/live boundary.\r\n */\r\nexport function computeLiveStartIndex(message: UiMessage): number {\r\n const parts = message.parts;\r\n const lastIndex = parts.length - 1;\r\n const resultIndexByCallId = new Map<string, number>();\r\n parts.forEach((part, index) => {\r\n if (\r\n part.type === \"tool-result\" &&\r\n !resultIndexByCallId.has(part.result.callId)\r\n ) {\r\n resultIndexByCallId.set(part.result.callId, index);\r\n }\r\n });\r\n\r\n const sealed = (index: number): boolean => {\r\n const part = parts[index];\r\n switch (part.type) {\r\n case \"text\":\r\n case \"reasoning\":\r\n return index < lastIndex;\r\n case \"tool-call\":\r\n return (\r\n (part.call.status === \"completed\" || part.call.status === \"failed\") &&\r\n resultIndexByCallId.has(part.call.id)\r\n );\r\n case \"tool-result\":\r\n return true;\r\n }\r\n };\r\n\r\n let start = 0;\r\n while (start < parts.length && sealed(start)) {\r\n start += 1;\r\n }\r\n\r\n let changed = true;\r\n while (changed) {\r\n changed = false;\r\n for (let index = 0; index < start; index += 1) {\r\n const part = parts[index];\r\n if (part.type !== \"tool-call\") {\r\n continue;\r\n }\r\n const resultIndex = resultIndexByCallId.get(part.call.id);\r\n if (resultIndex !== undefined && resultIndex >= start) {\r\n start = index;\r\n changed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return start;\r\n}\r\n\r\nfunction fragmentItem(\r\n message: UiMessage,\r\n from: number,\r\n to: number,\r\n spacing: boolean,\r\n): TranscriptItem {\r\n return {\r\n id: `${message.id}#${String(from)}-${String(to)}`,\r\n // Fragments are frozen; \"completed\" also collapses sealed reasoning parts\r\n // to their summary form instead of freezing the full reasoning text.\r\n message: {\r\n ...message,\r\n parts: message.parts.slice(from, to),\r\n status: \"completed\",\r\n },\r\n messageId: message.id,\r\n spacing,\r\n };\r\n}\r\n\r\nfunction finalItem(message: UiMessage): TranscriptItem {\r\n return {\r\n id: finalItemId(message.id),\r\n message: {\r\n ...message,\r\n parts: [],\r\n status: \"completed\",\r\n },\r\n messageId: message.id,\r\n spacing: true,\r\n };\r\n}\r\n\r\nfunction finalItemId(messageId: string): string {\r\n return `${messageId}#final`;\r\n}\r\n\r\nfunction needsFinalItem(\r\n items: readonly TranscriptItem[],\r\n message: UiMessage,\r\n): boolean {\r\n const hasFinalSpacing = items.some(\r\n (item) => item.messageId === message.id && item.spacing,\r\n );\r\n if (!hasFinalSpacing) {\r\n return true;\r\n }\r\n\r\n return (\r\n isLengthTruncatedAssistant(message) &&\r\n !hasTruncationMarker(items, message.id)\r\n );\r\n}\r\n\r\nfunction hasTruncationMarker(\r\n items: readonly TranscriptItem[],\r\n messageId: string,\r\n): boolean {\r\n return items.some(\r\n (item) =>\r\n item.messageId === messageId && isLengthTruncatedAssistant(item.message),\r\n );\r\n}\r\n\r\nfunction isLengthTruncatedAssistant(message: UiMessage): boolean {\r\n return (\r\n message.role === \"assistant\" &&\r\n message.status === \"completed\" &&\r\n message.finishReason === \"length\"\r\n );\r\n}\r\n\r\nfunction unchangedOrNext(\r\n previous: TranscriptCommitState | undefined,\r\n changed: boolean,\r\n committedItems: readonly TranscriptItem[],\r\n committedPartCounts: Readonly<Partial<Record<string, number>>>,\r\n liveMessage: UiMessage | null,\r\n): TranscriptCommitState {\r\n if (!changed && previous !== undefined) {\r\n return {\r\n committedItems: previous.committedItems,\r\n committedPartCounts: previous.committedPartCounts,\r\n liveMessage,\r\n };\r\n }\r\n\r\n return {\r\n committedItems,\r\n committedPartCounts,\r\n liveMessage,\r\n };\r\n}\r\n\r\nfunction reuseLiveMessage(\r\n previous: UiMessage | null,\r\n next: UiMessage,\r\n): UiMessage {\r\n if (previous?.id !== next.id) {\r\n return next;\r\n }\r\n\r\n if (\r\n previous.status !== next.status ||\r\n previous.parts.length !== next.parts.length ||\r\n !previous.parts.every((part, index) => part === next.parts[index])\r\n ) {\r\n return next;\r\n }\r\n return previous;\r\n}\r\n\r\nexport function splitTranscript(\r\n messages: readonly UiMessage[],\r\n runtime: TuiRuntimeStatus,\r\n): TranscriptSplit {\r\n const last = messages.at(-1);\r\n if (!last || runtime.kind === \"idle\" || runtime.kind === \"error\") {\r\n return { committedMessages: messages, liveMessage: null };\r\n }\r\n\r\n if (\r\n runtime.kind === \"waiting-for-permission\" &&\r\n hasPendingOrRunningTool(last)\r\n ) {\r\n return liveTail(messages, last);\r\n }\r\n\r\n if (last.role === \"user\") {\r\n return { committedMessages: messages, liveMessage: null };\r\n }\r\n\r\n const isAssistant = last.role === \"assistant\";\r\n if (!isAssistant) {\r\n return { committedMessages: messages, liveMessage: null };\r\n }\r\n\r\n if (last.status === \"streaming\" || hasPendingOrRunningTool(last)) {\r\n return liveTail(messages, last);\r\n }\r\n\r\n if (runtime.kind === \"running\") {\r\n return liveTail(messages, last);\r\n }\r\n\r\n return { committedMessages: messages, liveMessage: null };\r\n}\r\n\r\nfunction liveTail(\r\n messages: readonly UiMessage[],\r\n liveMessage: UiMessage,\r\n): TranscriptSplit {\r\n return {\r\n committedMessages: messages.slice(0, -1),\r\n liveMessage,\r\n };\r\n}\r\n\r\nfunction hasPendingOrRunningTool(message: UiMessage): boolean {\r\n return message.parts.some(\r\n (part) =>\r\n part.type === \"tool-call\" &&\r\n (part.call.status === \"pending\" || part.call.status === \"running\"),\r\n );\r\n}\r\n","import type {\r\n UiCommandOutput,\r\n UiContextWindowUsage,\r\n UiInteractionRequest,\r\n UiMessage,\r\n UiMessagePart,\r\n UiNotice,\r\n UiPermissionState,\r\n UiPermissionRequest,\r\n UiRun,\r\n UiSession,\r\n UiSnapshot,\r\n} from \"ohbaby-sdk\";\r\nimport type {\r\n TuiCommandCatalog,\r\n TuiCommandNotice,\r\n TuiEvent,\r\n TuiInteractionRequest,\r\n TuiRuntimeStatus,\r\n TuiStore,\r\n TuiStoreState,\r\n} from \"./snapshot.js\";\r\nimport { renderStatusPanel } from \"../render/status-panel.js\";\r\nimport {\r\n advanceTranscriptCommit,\r\n type TranscriptCommitState,\r\n} from \"./transcript.js\";\r\n\r\nconst COMMAND_NOTICE_LIMIT = 20;\r\nconst COMMAND_SESSION_LIMIT = 100;\r\nconst COMMAND_NOTICE_TEXT_LIMIT = 240;\r\nconst UI_NOTICE_LIMIT = 10;\r\n\r\nexport function createStateFromSnapshot(snapshot: UiSnapshot): TuiStoreState {\r\n const activeSession = findActiveSession(snapshot);\r\n const messages = activeSession?.messages ?? [];\r\n const transcript = advanceTranscriptCommit(\r\n undefined,\r\n messages,\r\n snapshot.status,\r\n );\r\n\r\n return {\r\n activeSessionId: snapshot.activeSessionId,\r\n catalog: null,\r\n catalogInvalidation: null,\r\n commandNotices: [],\r\n commandNoticeSequence: 0,\r\n commandSessionIds: {},\r\n contextWindowUsages: snapshot.contextWindowUsages ?? [],\r\n resolvedPermissionIds: [],\r\n interactions: [],\r\n committedItems: transcript.committedItems,\r\n committedPartCounts: transcript.committedPartCounts,\r\n liveMessage: transcript.liveMessage,\r\n messages,\r\n notices: [],\r\n permissions: snapshot.permissions,\r\n permission: snapshot.permission,\r\n runs: snapshot.runs,\r\n runtime: snapshot.status,\r\n sessions: snapshot.sessions,\r\n snapshot,\r\n };\r\n}\r\n\r\nexport function applyTuiEvent(\r\n state: TuiStoreState,\r\n event: TuiEvent,\r\n): TuiStoreState {\r\n switch (event.type) {\r\n case \"snapshot.replaced\":\r\n return preserveLocalQueues(\r\n state,\r\n createStateFromSnapshot(event.snapshot),\r\n );\r\n\r\n case \"session.updated\":\r\n return rebuildFromCollections(state, {\r\n activeSessionId: state.activeSessionId ?? event.session.id,\r\n sessions: upsertById(state.sessions, event.session),\r\n });\r\n\r\n case \"message.appended\": {\r\n const next = rebuildFromCollections(state, {\r\n activeSessionId: state.activeSessionId ?? event.sessionId,\r\n sessions: updateSessionMessages(\r\n state.sessions,\r\n event.sessionId,\r\n (messages) => [...messages, event.message],\r\n ),\r\n });\r\n return event.message.role === \"user\" &&\r\n next.activeSessionId === event.sessionId\r\n ? clearEphemeralNotices(clearCommandNotices(next))\r\n : next;\r\n }\r\n\r\n case \"message.updated\":\r\n return rebuildFromCollections(state, {\r\n sessions: updateSessionMessages(\r\n state.sessions,\r\n event.sessionId,\r\n (messages) => upsertById(messages, event.message),\r\n ),\r\n });\r\n\r\n case \"message.part.delta\":\r\n if (\r\n event.messageId &&\r\n event.sessionId === state.activeSessionId &&\r\n !state.messages.some((message) => message.id === event.messageId)\r\n ) {\r\n return appendUiNotice(state, {\r\n createdAt: new Date(event.timestamp ?? Date.now()).toISOString(),\r\n id: `message_delta_${event.sessionId}_${event.messageId}`,\r\n key: `message-delta:${event.sessionId}:${event.messageId}`,\r\n level: \"warning\",\r\n message: `Dropped streaming delta for missing message ${event.messageId}.`,\r\n source: \"transcript\",\r\n title: \"Message unavailable\",\r\n });\r\n }\r\n\r\n return rebuildFromCollections(state, {\r\n sessions: updateSessionMessages(\r\n state.sessions,\r\n event.sessionId,\r\n (messages) =>\r\n messages.map((message) =>\r\n event.messageId !== undefined && message.id === event.messageId\r\n ? applyPartDelta(\r\n message,\r\n event.partId,\r\n event.delta,\r\n event.content,\r\n )\r\n : message,\r\n ),\r\n ),\r\n });\r\n\r\n case \"run.updated\": {\r\n const next = rebuildFromCollections(state, {\r\n runs: upsertById(state.runs, event.run),\r\n runtime: event.run.status,\r\n });\r\n return event.run.status.kind === \"running\" &&\r\n event.run.sessionId === next.activeSessionId\r\n ? clearEphemeralNotices(clearCommandNotices(next))\r\n : next;\r\n }\r\n\r\n case \"run.interrupted\":\r\n return event.sessionId === state.activeSessionId\r\n ? appendCommandNotice(state, {\r\n commandId: \"run.interrupted\",\r\n kind: \"result\",\r\n sessionId: event.sessionId,\r\n text: \"Interrupted\",\r\n })\r\n : state;\r\n\r\n case \"runtime.updated\": {\r\n const next = rebuildFromCollections(state, {\r\n runtime: event.status,\r\n });\r\n return event.status.kind === \"running\"\r\n ? clearEphemeralNotices(clearCommandNotices(next))\r\n : next;\r\n }\r\n\r\n case \"context.window.updated\":\r\n return rebuildFromCollections(state, {\r\n contextWindowUsages: upsertContextWindowUsage(\r\n state.contextWindowUsages,\r\n event.usage,\r\n ),\r\n });\r\n\r\n case \"permission.requested\":\r\n if (state.resolvedPermissionIds.includes(event.request.id)) {\r\n return state;\r\n }\r\n return rebuildWithPermissions(state, {\r\n permissions: upsertById(state.permissions, event.request),\r\n runtime: {\r\n kind: \"waiting-for-permission\",\r\n requestId: event.request.id,\r\n },\r\n });\r\n\r\n case \"permission.resolved\":\r\n return rebuildWithPermissions(\r\n {\r\n ...state,\r\n resolvedPermissionIds: rememberResolvedPermission(\r\n state.resolvedPermissionIds,\r\n event.requestId,\r\n ),\r\n },\r\n {\r\n permissions: state.permissions.filter(\r\n (request) => request.id !== event.requestId,\r\n ),\r\n },\r\n );\r\n\r\n case \"permission.updated\":\r\n return rebuildFromCollections(state, {\r\n permission: event.permission,\r\n });\r\n\r\n case \"notice.emitted\":\r\n return appendUiNotice(state, event.notice);\r\n\r\n case \"command.started\": {\r\n const next = {\r\n ...state,\r\n commandSessionIds: rememberCommandSessionId(\r\n state.commandSessionIds,\r\n event.command.commandRunId,\r\n event.command.sessionId,\r\n ),\r\n };\r\n if (event.command.commandId !== \"compact\") {\r\n return next;\r\n }\r\n return clearEphemeralNotices(\r\n rebuildFromCollections(next, {\r\n runtime: {\r\n kind: \"running\",\r\n runId: event.command.commandRunId,\r\n title: \"Compacting...\",\r\n },\r\n }),\r\n );\r\n }\r\n\r\n case \"command.result.delivered\": {\r\n const next = clearCommandRuntime(state, event.commandRunId);\r\n if (!event.output || !shouldDisplayCommandOutput(event.output)) {\r\n return next;\r\n }\r\n if (!shouldDisplayCommandNotice(next, event.commandRunId)) {\r\n return next;\r\n }\r\n return appendCommandNotice(next, {\r\n clientInvocationId: event.clientInvocationId,\r\n commandId: event.commandRunId,\r\n kind: \"result\",\r\n sessionId: commandSessionId(next, event.commandRunId) ?? undefined,\r\n text: formatCommandOutput(event.output),\r\n });\r\n }\r\n\r\n case \"command.failed\": {\r\n const next = clearCommandRuntime(state, event.commandRunId);\r\n if (!shouldDisplayCommandNotice(next, event.commandRunId)) {\r\n return next;\r\n }\r\n return appendCommandNotice(next, {\r\n clientInvocationId: event.clientInvocationId,\r\n commandId: event.commandRunId,\r\n kind: \"error\",\r\n sessionId: commandSessionId(next, event.commandRunId) ?? undefined,\r\n text: event.error.message,\r\n });\r\n }\r\n\r\n case \"command.catalog.updated\":\r\n return {\r\n ...state,\r\n catalogInvalidation: {\r\n reason: event.reason,\r\n version: event.version,\r\n },\r\n };\r\n\r\n case \"interaction.requested\":\r\n return {\r\n ...state,\r\n interactions: upsertInteraction(\r\n state.interactions,\r\n toTuiInteraction(event.request),\r\n ),\r\n };\r\n\r\n case \"interaction.resolved\":\r\n return {\r\n ...state,\r\n interactions: state.interactions.filter(\r\n (interaction) => interaction.interactionId !== event.interactionId,\r\n ),\r\n };\r\n }\r\n\r\n return state;\r\n}\r\n\r\nexport function setCommandCatalog(\r\n state: TuiStoreState,\r\n catalog: TuiCommandCatalog,\r\n): TuiStoreState {\r\n return {\r\n ...state,\r\n catalog,\r\n catalogInvalidation: null,\r\n };\r\n}\r\n\r\nexport function createTuiStore(snapshot: UiSnapshot): TuiStore {\r\n let state = createStateFromSnapshot(snapshot);\r\n const listeners = new Set<() => void>();\r\n\r\n const notify = (): void => {\r\n for (const listener of listeners) {\r\n listener();\r\n }\r\n };\r\n\r\n return {\r\n dispatch(event): void {\r\n const nextState = applyTuiEvent(state, event);\r\n if (nextState !== state) {\r\n state = nextState;\r\n notify();\r\n }\r\n },\r\n dispatchMany(events): void {\r\n let nextState = state;\r\n for (const event of events) {\r\n nextState = applyTuiEvent(nextState, event);\r\n }\r\n if (nextState !== state) {\r\n state = nextState;\r\n notify();\r\n }\r\n },\r\n getState(): TuiStoreState {\r\n return state;\r\n },\r\n replaceSnapshot(nextSnapshot): void {\r\n state = applyTuiEvent(state, {\r\n snapshot: nextSnapshot,\r\n type: \"snapshot.replaced\",\r\n });\r\n notify();\r\n },\r\n setCatalog(catalog): void {\r\n state = setCommandCatalog(state, catalog);\r\n notify();\r\n },\r\n subscribe(listener): () => void {\r\n listeners.add(listener);\r\n return () => {\r\n listeners.delete(listener);\r\n };\r\n },\r\n };\r\n}\r\n\r\nfunction findActiveSession(snapshot: UiSnapshot): UiSession | undefined {\r\n return snapshot.sessions.find(\r\n (session) => session.id === snapshot.activeSessionId,\r\n );\r\n}\r\n\r\nfunction preserveLocalQueues(\r\n previous: TuiStoreState,\r\n next: TuiStoreState,\r\n): TuiStoreState {\r\n const activeSessionChanged =\r\n previous.activeSessionId !== next.activeSessionId;\r\n const permissions = mergePermissions(\r\n previous.permissions,\r\n next.permissions,\r\n previous.resolvedPermissionIds,\r\n );\r\n const sessions = mergeSessions(next.sessions, previous.sessions);\r\n const runs = mergeRuns(next.runs, previous.runs);\r\n const permission = previous.permission ?? next.permission;\r\n const contextWindowUsages = mergeContextWindowUsages(\r\n next.contextWindowUsages,\r\n previous.contextWindowUsages,\r\n );\r\n const runtime = resolveRuntimeAfterSnapshot(\r\n previous,\r\n next,\r\n permissions,\r\n runs,\r\n );\r\n const snapshot: UiSnapshot = {\r\n ...next.snapshot,\r\n permissions,\r\n runs,\r\n sessions,\r\n status: runtime,\r\n ...(contextWindowUsages.length > 0 ? { contextWindowUsages } : {}),\r\n ...(permission === undefined ? {} : { permission }),\r\n };\r\n const messages =\r\n sessions.find((session) => session.id === next.activeSessionId)?.messages ??\r\n [];\r\n const transcript = resolveTranscriptState(\r\n activeSessionChanged ? undefined : previous,\r\n next.activeSessionId,\r\n messages,\r\n runtime,\r\n );\r\n\r\n return {\r\n ...next,\r\n catalog: previous.catalog,\r\n catalogInvalidation: previous.catalogInvalidation,\r\n commandNotices: activeSessionChanged ? [] : previous.commandNotices,\r\n commandNoticeSequence: previous.commandNoticeSequence,\r\n commandSessionIds: previous.commandSessionIds,\r\n contextWindowUsages,\r\n interactions: previous.interactions,\r\n committedItems: transcript.committedItems,\r\n committedPartCounts: transcript.committedPartCounts,\r\n liveMessage: transcript.liveMessage,\r\n messages,\r\n notices: activeSessionChanged\r\n ? previous.notices.filter((notice) =>\r\n noticeBelongsToActiveSession(notice, next.activeSessionId),\r\n )\r\n : previous.notices,\r\n permissions,\r\n permission,\r\n resolvedPermissionIds: previous.resolvedPermissionIds,\r\n runs,\r\n runtime,\r\n sessions,\r\n snapshot,\r\n };\r\n}\r\n\r\nfunction rebuildFromCollections(\r\n state: TuiStoreState,\r\n patch: {\r\n readonly activeSessionId?: string | null;\r\n readonly sessions?: readonly UiSession[];\r\n readonly runs?: readonly UiRun[];\r\n readonly permissions?: readonly UiPermissionRequest[];\r\n readonly permission?: UiPermissionState;\r\n readonly runtime?: TuiRuntimeStatus;\r\n readonly contextWindowUsages?: readonly UiContextWindowUsage[];\r\n },\r\n): TuiStoreState {\r\n const activeSessionId =\r\n patch.activeSessionId === undefined\r\n ? state.activeSessionId\r\n : patch.activeSessionId;\r\n const sessions = patch.sessions ?? state.sessions;\r\n const runs = patch.runs ?? state.runs;\r\n const permissions = patch.permissions ?? state.permissions;\r\n const permission = patch.permission ?? state.permission;\r\n const runtime = patch.runtime ?? state.runtime;\r\n const contextWindowUsages =\r\n patch.contextWindowUsages ?? state.contextWindowUsages;\r\n const snapshot: UiSnapshot = {\r\n activeSessionId,\r\n permissions,\r\n runs,\r\n sessions,\r\n status: runtime,\r\n ...(contextWindowUsages.length > 0 ? { contextWindowUsages } : {}),\r\n ...(permission === undefined ? {} : { permission }),\r\n };\r\n const messages =\r\n sessions.find((session) => session.id === activeSessionId)?.messages ?? [];\r\n const transcript = resolveTranscriptState(\r\n state,\r\n activeSessionId,\r\n messages,\r\n runtime,\r\n );\r\n\r\n return {\r\n ...state,\r\n activeSessionId,\r\n committedItems: transcript.committedItems,\r\n committedPartCounts: transcript.committedPartCounts,\r\n contextWindowUsages,\r\n liveMessage: transcript.liveMessage,\r\n messages,\r\n permissions,\r\n permission,\r\n runs,\r\n runtime,\r\n sessions,\r\n snapshot,\r\n };\r\n}\r\n\r\nfunction resolveTranscriptState(\r\n previous: TuiStoreState | undefined,\r\n activeSessionId: string | null,\r\n messages: readonly UiMessage[],\r\n runtime: TuiRuntimeStatus,\r\n): TranscriptCommitState {\r\n // A session switch starts a fresh transcript: committed items are rebuilt\r\n // wholesale because the viewport remounts its <Static> region.\r\n const previousCommit =\r\n previous?.activeSessionId === activeSessionId\r\n ? {\r\n committedItems: previous.committedItems,\r\n committedPartCounts: previous.committedPartCounts,\r\n liveMessage: previous.liveMessage,\r\n }\r\n : undefined;\r\n\r\n return advanceTranscriptCommit(previousCommit, messages, runtime);\r\n}\r\n\r\nfunction rebuildWithPermissions(\r\n state: TuiStoreState,\r\n patch: {\r\n readonly permissions: readonly UiPermissionRequest[];\r\n readonly runtime?: TuiRuntimeStatus;\r\n },\r\n): TuiStoreState {\r\n const runtime =\r\n patch.permissions.length > 0\r\n ? {\r\n kind: \"waiting-for-permission\" as const,\r\n requestId: patch.permissions[0].id,\r\n }\r\n : (patch.runtime ?? resolveRuntimeAfterPermission(state));\r\n\r\n return rebuildFromCollections(state, {\r\n permissions: patch.permissions,\r\n runtime,\r\n });\r\n}\r\n\r\nfunction mergePermissions(\r\n previous: readonly UiPermissionRequest[],\r\n next: readonly UiPermissionRequest[],\r\n resolvedPermissionIds: readonly string[],\r\n): readonly UiPermissionRequest[] {\r\n const resolved = new Set(resolvedPermissionIds);\r\n const merged = new Map<string, UiPermissionRequest>();\r\n\r\n for (const request of next) {\r\n if (!resolved.has(request.id)) {\r\n merged.set(request.id, request);\r\n }\r\n }\r\n for (const request of previous) {\r\n if (!resolved.has(request.id) && !merged.has(request.id)) {\r\n merged.set(request.id, request);\r\n }\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction mergeSessions(\r\n next: readonly UiSession[],\r\n previous: readonly UiSession[],\r\n): readonly UiSession[] {\r\n const merged = new Map<string, UiSession>();\r\n\r\n for (const session of next) {\r\n merged.set(session.id, session);\r\n }\r\n for (const session of previous) {\r\n const existing = merged.get(session.id);\r\n merged.set(\r\n session.id,\r\n existing ? mergeSession(existing, session) : session,\r\n );\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction mergeSession(next: UiSession, previous: UiSession): UiSession {\r\n const newerShell =\r\n compareIso(previous.updatedAt, next.updatedAt) > 0 ? previous : next;\r\n\r\n return {\r\n ...newerShell,\r\n messages: mergeMessages(next.messages, previous.messages),\r\n };\r\n}\r\n\r\nfunction mergeMessages(\r\n next: readonly UiMessage[],\r\n previous: readonly UiMessage[],\r\n): readonly UiMessage[] {\r\n const merged = new Map<string, UiMessage>();\r\n\r\n for (const message of next) {\r\n merged.set(message.id, message);\r\n }\r\n for (const message of previous) {\r\n if (!merged.has(message.id)) {\r\n merged.set(message.id, message);\r\n }\r\n }\r\n\r\n return Array.from(merged.values()).sort((left, right) =>\r\n compareIso(left.createdAt, right.createdAt),\r\n );\r\n}\r\n\r\nfunction mergeRuns(\r\n next: readonly UiRun[],\r\n previous: readonly UiRun[],\r\n): readonly UiRun[] {\r\n const merged = new Map<string, UiRun>();\r\n\r\n for (const run of next) {\r\n merged.set(run.id, run);\r\n }\r\n for (const run of previous) {\r\n const existing = merged.get(run.id);\r\n if (!existing || compareIso(run.updatedAt, existing.updatedAt) > 0) {\r\n merged.set(run.id, run);\r\n }\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction mergeContextWindowUsages(\r\n next: readonly UiContextWindowUsage[],\r\n previous: readonly UiContextWindowUsage[],\r\n): readonly UiContextWindowUsage[] {\r\n const merged = new Map<string, UiContextWindowUsage>();\r\n\r\n for (const usage of previous) {\r\n merged.set(usage.sessionId, usage);\r\n }\r\n for (const usage of next) {\r\n merged.set(usage.sessionId, usage);\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction upsertContextWindowUsage(\r\n usages: readonly UiContextWindowUsage[],\r\n usage: UiContextWindowUsage,\r\n): readonly UiContextWindowUsage[] {\r\n const index = usages.findIndex(\r\n (candidate) => candidate.sessionId === usage.sessionId,\r\n );\r\n\r\n if (index === -1) {\r\n return [...usages, usage];\r\n }\r\n\r\n return usages.map((candidate) =>\r\n candidate.sessionId === usage.sessionId ? usage : candidate,\r\n );\r\n}\r\n\r\nfunction compareIso(left: string, right: string): number {\r\n return Date.parse(left) - Date.parse(right);\r\n}\r\n\r\nfunction resolveRuntimeAfterSnapshot(\r\n previous: TuiStoreState,\r\n next: TuiStoreState,\r\n permissions: readonly UiPermissionRequest[],\r\n runs: readonly UiRun[],\r\n): TuiRuntimeStatus {\r\n if (permissions.length > 0) {\r\n return { kind: \"waiting-for-permission\", requestId: permissions[0].id };\r\n }\r\n\r\n if (previous.runtime.kind === \"running\") {\r\n const running = previous.runtime;\r\n const run = runs.find((candidate) => candidate.id === running.runId);\r\n if (run?.status.kind === \"running\") {\r\n return running;\r\n }\r\n }\r\n\r\n return next.runtime;\r\n}\r\n\r\nfunction resolveRuntimeAfterPermission(state: TuiStoreState): TuiRuntimeStatus {\r\n if (state.runtime.kind !== \"waiting-for-permission\") {\r\n return state.runtime;\r\n }\r\n\r\n const waiting = state.runtime;\r\n const request = state.permissions.find(\r\n (candidate) => candidate.id === waiting.requestId,\r\n );\r\n const run = state.runs.find((candidate) => candidate.id === request?.runId);\r\n\r\n if (run?.status.kind === \"running\") {\r\n return run.status;\r\n }\r\n if (run?.status.kind === \"waiting-for-permission\") {\r\n return { kind: \"running\", runId: run.id };\r\n }\r\n\r\n return { kind: \"idle\" };\r\n}\r\n\r\nfunction rememberResolvedPermission(\r\n resolvedPermissionIds: readonly string[],\r\n requestId: string,\r\n): readonly string[] {\r\n return [\r\n ...resolvedPermissionIds.filter((id) => id !== requestId),\r\n requestId,\r\n ].slice(-100);\r\n}\r\n\r\nfunction updateSessionMessages(\r\n sessions: readonly UiSession[],\r\n sessionId: string,\r\n update: (messages: readonly UiMessage[]) => readonly UiMessage[],\r\n): readonly UiSession[] {\r\n return sessions.map((session) =>\r\n session.id === sessionId\r\n ? {\r\n ...session,\r\n messages: update(session.messages),\r\n }\r\n : session,\r\n );\r\n}\r\n\r\nfunction applyPartDelta(\r\n message: UiMessage,\r\n partId: string | undefined,\r\n delta: string,\r\n content: string | undefined,\r\n): UiMessage {\r\n const resolvedIndex = resolvePartIndex(message, partId);\r\n\r\n if (resolvedIndex === null) {\r\n return content === undefined\r\n ? appendDeltaToLastTextPart(message, delta)\r\n : upsertLastTextPart(message, content);\r\n }\r\n\r\n return {\r\n ...message,\r\n parts: message.parts.map((part, index) =>\r\n index === resolvedIndex\r\n ? appendTextToPart(part, content ?? delta, content !== undefined)\r\n : part,\r\n ),\r\n };\r\n}\r\n\r\nfunction resolvePartIndex(\r\n message: UiMessage,\r\n partId: string | undefined,\r\n): number | null {\r\n if (partId === undefined) {\r\n return null;\r\n }\r\n\r\n const resolvedIndex = message.parts.findIndex((part) => {\r\n const candidate = part as { readonly id?: string };\r\n\r\n return candidate.id === partId;\r\n });\r\n\r\n return resolvedIndex >= 0 ? resolvedIndex : null;\r\n}\r\n\r\nfunction appendTextToPart(\r\n part: UiMessagePart,\r\n text: string,\r\n replace = false,\r\n): UiMessagePart {\r\n if (part.type === \"text\" || part.type === \"reasoning\") {\r\n return {\r\n ...part,\r\n text: replace ? text : `${part.text}${text}`,\r\n };\r\n }\r\n\r\n return part;\r\n}\r\n\r\nfunction appendDeltaToLastTextPart(\r\n message: UiMessage,\r\n delta: string,\r\n): UiMessage {\r\n const textIndex = findTailTextPartIndex(message);\r\n\r\n if (textIndex === -1) {\r\n return {\r\n ...message,\r\n parts: [...message.parts, { text: delta, type: \"text\" }],\r\n };\r\n }\r\n\r\n return {\r\n ...message,\r\n parts: message.parts.map((part, index) =>\r\n index === textIndex ? appendTextToPart(part, delta) : part,\r\n ),\r\n };\r\n}\r\n\r\nfunction upsertLastTextPart(message: UiMessage, content: string): UiMessage {\r\n const textIndex = findTailTextPartIndex(message);\r\n\r\n if (textIndex === -1) {\r\n return {\r\n ...message,\r\n parts: [...message.parts, { text: content, type: \"text\" }],\r\n };\r\n }\r\n\r\n return {\r\n ...message,\r\n parts: message.parts.map(\r\n (part, index): UiMessagePart =>\r\n index === textIndex &&\r\n (part.type === \"text\" || part.type === \"reasoning\")\r\n ? { ...part, text: content }\r\n : part,\r\n ),\r\n };\r\n}\r\n\r\nfunction findTailTextPartIndex(message: UiMessage): number {\r\n const lastIndex = message.parts.length - 1;\r\n const lastPart = message.parts.at(lastIndex);\r\n\r\n return lastPart?.type === \"text\" || lastPart?.type === \"reasoning\"\r\n ? lastIndex\r\n : -1;\r\n}\r\n\r\nfunction formatCommandOutput(output: UiCommandOutput | undefined): string {\r\n if (!output) {\r\n return \"\";\r\n }\r\n\r\n if (output.kind === \"text\") {\r\n return truncateCommandOutput(output.text);\r\n }\r\n\r\n if (output.kind === \"markdown\") {\r\n return truncateCommandOutput(output.markdown);\r\n }\r\n\r\n return truncateCommandOutput(formatDataCommandOutput(output));\r\n}\r\n\r\nfunction shouldDisplayCommandOutput(output: UiCommandOutput): boolean {\r\n if (output.kind !== \"data\") {\r\n return true;\r\n }\r\n\r\n return ![\r\n \"permission.level\",\r\n \"permission.mode\",\r\n \"session.created\",\r\n \"session.current\",\r\n ].includes(output.subject);\r\n}\r\n\r\nfunction formatPermissionOutput(\r\n permission: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n const mode = permission ? getString(permission, \"mode\") : undefined;\r\n const level = permission ? getString(permission, \"level\") : undefined;\r\n if (!mode || !level) {\r\n return undefined;\r\n }\r\n\r\n return `${mode} · ${level}`;\r\n}\r\n\r\nfunction formatDataCommandOutput(\r\n output: Extract<UiCommandOutput, { readonly kind: \"data\" }>,\r\n): string {\r\n switch (output.subject) {\r\n case \"help\": {\r\n const categories = Array.isArray(output.data.categories)\r\n ? output.data.categories\r\n : [];\r\n if (categories.length > 0) {\r\n return categories\r\n .map((category) =>\r\n isRecord(category) ? formatHelpCategory(category) : \"\",\r\n )\r\n .filter(Boolean)\r\n .join(\"\\n\\n\");\r\n }\r\n const commands = Array.isArray(output.data.commands)\r\n ? output.data.commands\r\n : [];\r\n return commands.length > 0\r\n ? formatHelpCommands(commands)\r\n : JSON.stringify(output.data);\r\n }\r\n case \"permission.mode\": {\r\n const permission = getRecord(output.data, \"permission\");\r\n return formatPermissionOutput(permission) ?? JSON.stringify(output.data);\r\n }\r\n case \"permission.level\": {\r\n const permission = getRecord(output.data, \"permission\");\r\n return formatPermissionOutput(permission) ?? JSON.stringify(output.data);\r\n }\r\n case \"status\": {\r\n return renderStatusPanel(output.data);\r\n }\r\n case \"tools\": {\r\n const tools = Array.isArray(output.data.tools)\r\n ? output.data.tools\r\n .map((tool) => (isRecord(tool) ? getString(tool, \"name\") : null))\r\n .filter((name): name is string => Boolean(name))\r\n : [];\r\n return tools.length > 0\r\n ? `tools: ${tools.join(\", \")}`\r\n : JSON.stringify(output.data);\r\n }\r\n case \"session.current\": {\r\n const sessionId = getString(output.data, \"sessionId\");\r\n return sessionId ? `session: ${sessionId}` : JSON.stringify(output.data);\r\n }\r\n case \"session.created\": {\r\n const session = getRecord(output.data, \"session\");\r\n const title = session ? getString(session, \"title\") : undefined;\r\n const id = session ? getString(session, \"id\") : undefined;\r\n const label = title ?? id;\r\n return label ? `new session: ${label}` : JSON.stringify(output.data);\r\n }\r\n case \"session.compact\": {\r\n const result = getRecord(output.data, \"result\");\r\n const status = result ? getString(result, \"status\") : undefined;\r\n switch (status) {\r\n case \"compacted\":\r\n case \"pruned\":\r\n return \"Compacted\";\r\n case \"failed\":\r\n return \"Compact failed\";\r\n case \"inflated\":\r\n case \"not-needed\":\r\n return \"Compact skipped\";\r\n default:\r\n return JSON.stringify(output.data);\r\n }\r\n }\r\n case \"session.list\": {\r\n const sessions = Array.isArray(output.data.sessions)\r\n ? output.data.sessions\r\n .map((session) =>\r\n isRecord(session)\r\n ? (getString(session, \"title\") ?? getString(session, \"id\"))\r\n : null,\r\n )\r\n .filter((session): session is string => Boolean(session))\r\n : [];\r\n return sessions.length > 0\r\n ? `sessions: ${sessions.join(\", \")}`\r\n : \"sessions: none\";\r\n }\r\n case \"models.current\": {\r\n const model = getRecord(output.data, \"current\");\r\n const label = formatModelLabel(model);\r\n if (label) {\r\n return `model: ${label}`;\r\n }\r\n const models = formatModelList(output.data);\r\n return models.length > 0\r\n ? `models: ${models.join(\", \")}`\r\n : JSON.stringify(output.data);\r\n }\r\n case \"model.connected\": {\r\n return formatModelConnectedOutput(output.data);\r\n }\r\n case \"mcps\": {\r\n const servers = Array.isArray(output.data.servers)\r\n ? output.data.servers\r\n : [];\r\n const labels = servers\r\n .map((server) => (isRecord(server) ? formatMcpServer(server) : null))\r\n .filter((server): server is string => Boolean(server));\r\n return labels.length > 0 ? `mcps: ${labels.join(\", \")}` : \"mcps: none\";\r\n }\r\n case \"skills\": {\r\n const skills = Array.isArray(output.data.skills)\r\n ? output.data.skills\r\n : [];\r\n const labels = skills\r\n .map((skill) => (isRecord(skill) ? formatSkillSummary(skill) : null))\r\n .filter((skill): skill is string => Boolean(skill));\r\n return labels.length > 0\r\n ? `skills: ${labels.join(\", \")}`\r\n : \"skills: none\";\r\n }\r\n default:\r\n return JSON.stringify(output.data);\r\n }\r\n}\r\n\r\nfunction formatModelConnectedOutput(data: Record<string, unknown>): string {\r\n const result = getRecord(data, \"result\");\r\n const model = result ? getString(result, \"model\") : undefined;\r\n const provider = result ? getString(result, \"provider\") : undefined;\r\n const contextWindowTokens = result\r\n ? getNumber(result, \"contextWindowTokens\")\r\n : undefined;\r\n const label = [provider, model].filter(Boolean).join(\"/\");\r\n const context =\r\n contextWindowTokens === undefined\r\n ? \"\"\r\n : ` (${formatTokenCount(contextWindowTokens)} context tokens)`;\r\n const connected =\r\n label === \"\" ? \"model connected\" : `model connected: ${label}${context}`;\r\n const warning = result ? getString(result, \"warning\") : undefined;\r\n return warning === undefined\r\n ? connected\r\n : `${connected}\\nwarning: ${warning}`;\r\n}\r\n\r\nfunction formatHelpCategory(category: Record<string, unknown>): string {\r\n const title =\r\n getString(category, \"title\") ?? getString(category, \"name\") ?? \"Commands\";\r\n const commands = Array.isArray(category.commands) ? category.commands : [];\r\n const lines = commands\r\n .map((command) => (isRecord(command) ? formatHelpCommand(command) : \"\"))\r\n .filter(Boolean);\r\n return lines.length > 0 ? `${title}:\\n${lines.join(\"\\n\")}` : `${title}: none`;\r\n}\r\n\r\nfunction formatHelpCommands(commands: readonly unknown[]): string {\r\n const lines = commands\r\n .map((command) => (isRecord(command) ? formatHelpCommand(command) : \"\"))\r\n .filter(Boolean);\r\n return lines.length > 0 ? lines.join(\"\\n\") : \"commands: none\";\r\n}\r\n\r\nfunction formatHelpCommand(command: Record<string, unknown>): string {\r\n const path = getStringArray(command, \"path\");\r\n const description = getString(command, \"description\") ?? \"\";\r\n const label = path.length > 0 ? `/${path.join(\" \")}` : \"/\";\r\n return `${label}${description ? ` - ${description}` : \"\"}`;\r\n}\r\n\r\nfunction formatMcpServer(server: Record<string, unknown>): string | null {\r\n const name = getString(server, \"name\");\r\n const status = getString(server, \"status\");\r\n if (!name || !status) {\r\n return null;\r\n }\r\n return `${name} ${status}`;\r\n}\r\n\r\nfunction formatSkillSummary(skill: Record<string, unknown>): string | null {\r\n const name = getString(skill, \"name\");\r\n const scope = getString(skill, \"scope\");\r\n if (!name || !scope) {\r\n return null;\r\n }\r\n const source = getString(skill, \"source\");\r\n const description = getString(skill, \"description\");\r\n const metadata = [scope, source].filter((value): value is string =>\r\n Boolean(value),\r\n );\r\n return `${name} [${metadata.join(\", \")}]${\r\n description ? ` - ${description}` : \"\"\r\n }`;\r\n}\r\n\r\nfunction truncateCommandOutput(value: string): string {\r\n const normalized = value.trim();\r\n\r\n if (normalized.length <= COMMAND_NOTICE_TEXT_LIMIT) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, COMMAND_NOTICE_TEXT_LIMIT - 3)}...`;\r\n}\r\n\r\nfunction getRecord(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): Record<string, unknown> | undefined {\r\n const value = record[key];\r\n return isRecord(value) ? value : undefined;\r\n}\r\n\r\nfunction getString(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): string | undefined {\r\n const value = record[key];\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction getStringArray(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): string[] {\r\n const value = record[key];\r\n return Array.isArray(value)\r\n ? value.filter((item): item is string => typeof item === \"string\")\r\n : [];\r\n}\r\n\r\nfunction formatModelLabel(\r\n model: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!model) {\r\n return undefined;\r\n }\r\n return getString(model, \"label\") ?? getString(model, \"id\");\r\n}\r\n\r\nfunction formatModelList(data: Record<string, unknown>): string[] {\r\n return Array.isArray(data.models)\r\n ? data.models\r\n .map((model) => (isRecord(model) ? formatModelLabel(model) : null))\r\n .filter((model): model is string => Boolean(model))\r\n : [];\r\n}\r\n\r\nfunction getNumber(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): number | undefined {\r\n const value = record[key];\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction formatTokenCount(value: number): string {\r\n return Math.round(value).toLocaleString(\"en-US\");\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction toTuiInteraction(\r\n interaction: UiInteractionRequest,\r\n): TuiInteractionRequest {\r\n return {\r\n interactionId: interaction.interactionId,\r\n kind: interaction.kind,\r\n message: interaction.prompt,\r\n options: interaction.options,\r\n subject: interaction.subject,\r\n title: interaction.prompt,\r\n };\r\n}\r\n\r\nfunction upsertById<TItem extends { readonly id: string }>(\r\n items: readonly TItem[],\r\n item: TItem,\r\n): readonly TItem[] {\r\n const index = items.findIndex((candidate) => candidate.id === item.id);\r\n\r\n if (index === -1) {\r\n return [...items, item];\r\n }\r\n\r\n return items.map((candidate) =>\r\n candidate.id === item.id ? item : candidate,\r\n );\r\n}\r\n\r\nfunction upsertInteraction(\r\n interactions: readonly TuiInteractionRequest[],\r\n interaction: TuiInteractionRequest,\r\n): readonly TuiInteractionRequest[] {\r\n const index = interactions.findIndex(\r\n (candidate) => candidate.interactionId === interaction.interactionId,\r\n );\r\n\r\n if (index === -1) {\r\n return [...interactions, interaction];\r\n }\r\n\r\n return interactions.map((candidate) =>\r\n candidate.interactionId === interaction.interactionId\r\n ? interaction\r\n : candidate,\r\n );\r\n}\r\n\r\nfunction appendCommandNotice(\r\n state: TuiStoreState,\r\n notice: Omit<TuiCommandNotice, \"id\">,\r\n): TuiStoreState {\r\n const commandNoticeSequence = state.commandNoticeSequence + 1;\r\n\r\n return {\r\n ...state,\r\n commandNotices: [\r\n ...state.commandNotices,\r\n {\r\n ...notice,\r\n id: `notice_${String(commandNoticeSequence)}`,\r\n },\r\n ].slice(-COMMAND_NOTICE_LIMIT),\r\n commandNoticeSequence,\r\n };\r\n}\r\n\r\nfunction clearCommandNotices(state: TuiStoreState): TuiStoreState {\r\n if (state.commandNotices.length === 0) {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n commandNotices: [],\r\n };\r\n}\r\n\r\nfunction clearCommandRuntime(\r\n state: TuiStoreState,\r\n commandRunId: string,\r\n): TuiStoreState {\r\n return state.runtime.kind === \"running\" &&\r\n state.runtime.runId === commandRunId\r\n ? rebuildFromCollections(state, { runtime: { kind: \"idle\" } })\r\n : state;\r\n}\r\n\r\nfunction clearEphemeralNotices(state: TuiStoreState): TuiStoreState {\r\n const notices = state.notices.filter(isPersistentNotice);\r\n return notices.length === state.notices.length\r\n ? state\r\n : { ...state, notices };\r\n}\r\n\r\nfunction isPersistentNotice(notice: UiNotice): boolean {\r\n return (notice.key ?? notice.id).startsWith(\"prompt-security:\");\r\n}\r\n\r\nfunction appendUiNotice(state: TuiStoreState, notice: UiNotice): TuiStoreState {\r\n if (!noticeBelongsToActiveSession(notice, state.activeSessionId)) {\r\n return state;\r\n }\r\n\r\n const dedupeId = notice.key ?? notice.id;\r\n const notices = [\r\n ...state.notices.filter(\r\n (candidate) => (candidate.key ?? candidate.id) !== dedupeId,\r\n ),\r\n notice,\r\n ].slice(-UI_NOTICE_LIMIT);\r\n\r\n return {\r\n ...state,\r\n notices,\r\n };\r\n}\r\n\r\nfunction rememberCommandSessionId(\r\n commandSessionIds: Readonly<Record<string, string | null>>,\r\n commandRunId: string,\r\n sessionId: string | undefined,\r\n): Readonly<Record<string, string | null>> {\r\n const entries = Object.entries(commandSessionIds).filter(\r\n ([existingCommandRunId]) => existingCommandRunId !== commandRunId,\r\n );\r\n entries.push([commandRunId, sessionId ?? null]);\r\n\r\n return Object.fromEntries(entries.slice(-COMMAND_SESSION_LIMIT));\r\n}\r\n\r\nfunction commandSessionId(\r\n state: TuiStoreState,\r\n commandRunId: string,\r\n): string | null | undefined {\r\n return Object.hasOwn(state.commandSessionIds, commandRunId)\r\n ? state.commandSessionIds[commandRunId]\r\n : undefined;\r\n}\r\n\r\nfunction shouldDisplayCommandNotice(\r\n state: TuiStoreState,\r\n commandRunId: string,\r\n): boolean {\r\n const sessionId = commandSessionId(state, commandRunId);\r\n\r\n return (\r\n sessionId === undefined ||\r\n sessionId === null ||\r\n sessionId === state.activeSessionId\r\n );\r\n}\r\n\r\nfunction noticeBelongsToActiveSession(\r\n notice: UiNotice,\r\n activeSessionId: string | null,\r\n): boolean {\r\n const sessionId = noticeSessionId(notice);\r\n\r\n return sessionId === undefined || sessionId === activeSessionId;\r\n}\r\n\r\nfunction noticeSessionId(notice: UiNotice): string | undefined {\r\n const key = notice.key ?? \"\";\r\n if (key.startsWith(\"context-window:\")) {\r\n return key.slice(\"context-window:\".length);\r\n }\r\n if (key.startsWith(\"message-delta:\")) {\r\n return key.slice(\"message-delta:\".length).split(\":\").at(0);\r\n }\r\n\r\n return undefined;\r\n}\r\n","import { useSyncExternalStore } from \"react\";\r\nimport type { UiContextWindowUsage } from \"ohbaby-sdk\";\r\nimport type {\r\n TuiInteractionRequest,\r\n TuiRuntimeStatus,\r\n TuiStore,\r\n TuiStoreState,\r\n} from \"./snapshot.js\";\r\n\r\nexport function selectActiveDialog(\r\n state: TuiStoreState,\r\n): TuiInteractionRequest | undefined {\r\n return state.interactions[0];\r\n}\r\n\r\nexport function selectHasActivePermission(state: TuiStoreState): boolean {\r\n return state.permissions.length > 0;\r\n}\r\n\r\nexport function selectEffectiveRuntime(state: TuiStoreState): TuiRuntimeStatus {\r\n if (state.permissions.length > 0) {\r\n return {\r\n kind: \"waiting-for-permission\" as const,\r\n requestId: state.permissions[0].id,\r\n };\r\n }\r\n return state.runtime;\r\n}\r\n\r\nexport function selectActiveContextWindowUsage(\r\n state: TuiStoreState,\r\n): UiContextWindowUsage | null {\r\n if (!state.activeSessionId) {\r\n return null;\r\n }\r\n\r\n return (\r\n state.contextWindowUsages.find(\r\n (usage) => usage.sessionId === state.activeSessionId,\r\n ) ?? null\r\n );\r\n}\r\n\r\nexport function selectRuntimeLabel(state: TuiStoreState): string {\r\n const runtime = selectEffectiveRuntime(state);\r\n\r\n switch (runtime.kind) {\r\n case \"idle\":\r\n return \"idle\";\r\n case \"running\":\r\n return runtime.title ? `running: ${trimLabel(runtime.title)}` : \"running\";\r\n case \"waiting-for-permission\":\r\n return formatPermissionWaitLabel(state);\r\n case \"error\":\r\n return `error: ${runtime.message}`;\r\n }\r\n}\r\n\r\nfunction formatPermissionWaitLabel(state: TuiStoreState): string {\r\n const request = state.permissions.at(0);\r\n const title =\r\n request?.title === undefined || request.title.trim() === \"\"\r\n ? \"permission\"\r\n : trimLabel(request.title);\r\n\r\n return state.permissions.length > 1\r\n ? `waiting: ${title} (+${String(state.permissions.length - 1)})`\r\n : `waiting: ${title}`;\r\n}\r\n\r\nfunction trimLabel(value: string): string {\r\n const normalized = value.replace(/\\s+/gu, \" \").trim();\r\n const maxLength = 48;\r\n\r\n if (normalized.length <= maxLength) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, maxLength - 3)}...`;\r\n}\r\n\r\nexport function useTuiStoreSelector<TSelected>(\r\n store: TuiStore,\r\n selector: (state: TuiStoreState) => TSelected,\r\n): TSelected {\r\n return useSyncExternalStore(\r\n store.subscribe,\r\n () => selector(store.getState()),\r\n () => selector(store.getState()),\r\n );\r\n}\r\n","import type { UiMessage, UiNotice } from \"ohbaby-sdk\";\r\nimport type { TuiCommandNotice, TuiStoreState } from \"../snapshot.js\";\r\nimport type { TranscriptItem } from \"../transcript.js\";\r\n\r\nexport interface TranscriptSplitSelection {\r\n readonly committedItems: readonly TranscriptItem[];\r\n readonly liveMessage: UiMessage | null;\r\n}\r\n\r\nexport interface NoticeLaneState {\r\n readonly notices: readonly UiNotice[];\r\n}\r\n\r\nexport interface CommandNoticeLaneState {\r\n readonly commandNotices: readonly TuiCommandNotice[];\r\n}\r\n\r\nexport function selectCommittedItems(\r\n state: TuiStoreState,\r\n): readonly TranscriptItem[] {\r\n return state.committedItems;\r\n}\r\n\r\nexport function selectLiveMessage(state: TuiStoreState): UiMessage | null {\r\n return state.liveMessage;\r\n}\r\n\r\nexport function selectTranscriptSplit(\r\n state: TuiStoreState,\r\n): TranscriptSplitSelection {\r\n return {\r\n committedItems: state.committedItems,\r\n liveMessage: state.liveMessage,\r\n };\r\n}\r\n\r\nexport function selectNoticeLaneState(state: TuiStoreState): NoticeLaneState {\r\n return { notices: state.notices };\r\n}\r\n\r\nexport function selectCommandNoticeLaneState(\r\n state: TuiStoreState,\r\n): CommandNoticeLaneState {\r\n return { commandNotices: state.commandNotices };\r\n}\r\n","import type { TuiEvent } from \"./snapshot.js\";\r\n\r\nexport const STREAMING_UI_FLUSH_MS = 50;\r\n\r\nexport interface CoalescedTuiEventDispatcher {\r\n readonly dispatch: (event: TuiEvent) => void;\r\n readonly dispose: () => void;\r\n}\r\n\r\nexport function createCoalescedTuiEventDispatcher(\r\n dispatchBatch: (events: readonly TuiEvent[]) => void,\r\n options: { readonly flushMs?: number } = {},\r\n): CoalescedTuiEventDispatcher {\r\n const flushMs = options.flushMs ?? STREAMING_UI_FLUSH_MS;\r\n const pendingDeltas = new Map<\r\n string,\r\n Extract<TuiEvent, { type: \"message.part.delta\" }>\r\n >();\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const clearTimer = (): void => {\r\n if (timer !== undefined) {\r\n clearTimeout(timer);\r\n timer = undefined;\r\n }\r\n };\r\n\r\n const flush = (): readonly TuiEvent[] => {\r\n clearTimer();\r\n if (pendingDeltas.size === 0) {\r\n return [];\r\n }\r\n const events = Array.from(pendingDeltas.values());\r\n pendingDeltas.clear();\r\n dispatchBatch(events);\r\n return events;\r\n };\r\n\r\n const scheduleFlush = (): void => {\r\n if (timer !== undefined) {\r\n return;\r\n }\r\n timer = setTimeout(() => {\r\n flush();\r\n }, flushMs);\r\n };\r\n\r\n return {\r\n dispatch(event): void {\r\n if (event.type !== \"message.part.delta\") {\r\n clearTimer();\r\n if (pendingDeltas.size === 0) {\r\n dispatchBatch([event]);\r\n return;\r\n }\r\n\r\n const deltas = Array.from(pendingDeltas.values());\r\n pendingDeltas.clear();\r\n dispatchBatch([...deltas, event]);\r\n return;\r\n }\r\n\r\n const key = deltaKey(event);\r\n const previous = pendingDeltas.get(key);\r\n pendingDeltas.set(key, previous ? mergeDelta(previous, event) : event);\r\n scheduleFlush();\r\n },\r\n dispose(): void {\r\n flush();\r\n },\r\n };\r\n}\r\n\r\nfunction deltaKey(\r\n event: Extract<TuiEvent, { type: \"message.part.delta\" }>,\r\n): string {\r\n return [event.sessionId, event.messageId, event.partId ?? \"\"].join(\"\\u0000\");\r\n}\r\n\r\nfunction mergeDelta(\r\n previous: Extract<TuiEvent, { type: \"message.part.delta\" }>,\r\n next: Extract<TuiEvent, { type: \"message.part.delta\" }>,\r\n): Extract<TuiEvent, { type: \"message.part.delta\" }> {\r\n return {\r\n ...next,\r\n content:\r\n next.content ??\r\n (previous.content === undefined\r\n ? undefined\r\n : `${previous.content}${next.delta}`),\r\n delta: `${previous.delta}${next.delta}`,\r\n };\r\n}\r\n","import { Text, useApp, useInput, useStdout } from \"ink\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport type { ReactElement } from \"react\";\r\nimport type {\r\n CoreAPI,\r\n UiCommandInvocation,\r\n UiCommandOutput,\r\n UiEventHandler,\r\n UiSnapshot,\r\n UiUnsubscribe,\r\n} from \"ohbaby-sdk\";\r\nimport { DialogManager } from \"./dialogs/manager.js\";\r\nimport { CommandPanelManager } from \"./components/dialog/command-panel-manager.js\";\r\nimport {\r\n displayPanelKindForCommandId,\r\n type CommandPanelKind,\r\n type CommandPanelState,\r\n} from \"./components/dialog/command-panel-state.js\";\r\nimport { Header } from \"./components/header.js\";\r\nimport { TranscriptViewport } from \"./components/transcript/transcript-viewport.js\";\r\nimport { Prompt } from \"./components/prompt/index.js\";\r\nimport { AppShell } from \"./layout/app-shell.js\";\r\nimport { formatContextWindowUsage } from \"./render/usage.js\";\r\nimport { createTuiStore } from \"./store/events.js\";\r\nimport {\r\n selectActiveContextWindowUsage,\r\n useTuiStoreSelector,\r\n} from \"./store/selectors.js\";\r\nimport {\r\n selectCommittedItems,\r\n selectLiveMessage,\r\n} from \"./store/selectors/transcript.js\";\r\nimport { createCoalescedTuiEventDispatcher } from \"./store/stream-coalescer.js\";\r\nimport { ThemeProvider } from \"./theme/index.js\";\r\nimport type {\r\n TuiCommandCatalog,\r\n TuiEvent,\r\n TuiStore,\r\n TuiRuntimeStatus,\r\n} from \"./store/snapshot.js\";\r\n\r\nexport const NEW_SESSION_CLEAR_SEQUENCE = \"\\x1b[2J\\x1b[3J\\x1b[H\";\r\n\r\nexport const ESC_INTERRUPT_WINDOW_MS = 1500;\r\nconst ESC_INTERRUPT_HINT = \"Press Esc again to interrupt\";\r\n\r\nexport interface TerminalUiOptions {\r\n readonly client: CoreAPI;\r\n readonly subscribeEvents: (handler: UiEventHandler) => UiUnsubscribe;\r\n}\r\n\r\nexport function OhbabyTerminalApp({\r\n client,\r\n subscribeEvents,\r\n}: TerminalUiOptions): ReactElement {\r\n const storeRef = useRef<TuiStore>(createTuiStore(createEmptySnapshot()));\r\n const keyboardCommandSequenceRef = useRef(0);\r\n const catalogRequestSequenceRef = useRef(0);\r\n const contextRefreshSequenceRef = useRef(0);\r\n const contextNoticeSequenceRef = useRef(0);\r\n const disposedRef = useRef(false);\r\n const [screenGeneration, setScreenGeneration] = useState(0);\r\n const [commandPanel, setCommandPanel] = useState<CommandPanelState | null>(\r\n null,\r\n );\r\n const activeSessionIdRef = useRef<string | null>(null);\r\n const commandPanelRef = useRef<CommandPanelState | null>(null);\r\n const pendingDisplayCommandInvocationsRef = useRef<\r\n Map<string, { readonly sessionId: string | null }>\r\n >(new Map());\r\n const store = storeRef.current;\r\n const { exit } = useApp();\r\n const { write: writeStdout } = useStdout();\r\n const activeSessionId = useTuiStoreSelector(\r\n store,\r\n (state) => state.activeSessionId,\r\n );\r\n activeSessionIdRef.current = activeSessionId;\r\n const activeContextWindowUsage = useTuiStoreSelector(\r\n store,\r\n selectActiveContextWindowUsage,\r\n );\r\n const catalog = useTuiStoreSelector(store, (state) => state.catalog);\r\n const interactions = useTuiStoreSelector(\r\n store,\r\n (state) => state.interactions,\r\n );\r\n const permission = useTuiStoreSelector(store, (state) => state.permission);\r\n const permissions = useTuiStoreSelector(store, (state) => state.permissions);\r\n const runtime = useTuiStoreSelector(store, (state) => state.runtime);\r\n const hasBackendDialog = permissions.length > 0 || interactions.length > 0;\r\n const hasDialog = hasBackendDialog || commandPanel !== null;\r\n const contextWindowUsageLabel = formatContextWindowUsage(\r\n activeContextWindowUsage,\r\n );\r\n const [escInterruptArmedRunId, setEscInterruptArmedRunId] = useState<\r\n string | null\r\n >(null);\r\n const escInterruptArmedRunIdRef = useRef<string | null>(null);\r\n const escInterruptTimerRef = useRef<{\r\n readonly runId: string;\r\n readonly timer: ReturnType<typeof setTimeout>;\r\n } | null>(null);\r\n const disarmEscInterrupt = useCallback((runId?: string): void => {\r\n if (runId !== undefined && escInterruptArmedRunIdRef.current !== runId) {\r\n return;\r\n }\r\n if (\r\n escInterruptTimerRef.current !== null &&\r\n (runId === undefined || escInterruptTimerRef.current.runId === runId)\r\n ) {\r\n clearTimeout(escInterruptTimerRef.current.timer);\r\n escInterruptTimerRef.current = null;\r\n }\r\n escInterruptArmedRunIdRef.current = null;\r\n setEscInterruptArmedRunId((current) =>\r\n runId !== undefined && current !== runId ? current : null,\r\n );\r\n }, []);\r\n const armEscInterrupt = useCallback((runId: string): void => {\r\n if (escInterruptTimerRef.current !== null) {\r\n clearTimeout(escInterruptTimerRef.current.timer);\r\n }\r\n escInterruptArmedRunIdRef.current = runId;\r\n setEscInterruptArmedRunId(runId);\r\n escInterruptTimerRef.current = {\r\n runId,\r\n timer: setTimeout(() => {\r\n if (escInterruptTimerRef.current?.runId === runId) {\r\n escInterruptTimerRef.current = null;\r\n }\r\n if (escInterruptArmedRunIdRef.current === runId) {\r\n escInterruptArmedRunIdRef.current = null;\r\n }\r\n setEscInterruptArmedRunId((current) =>\r\n current === runId ? null : current,\r\n );\r\n }, ESC_INTERRUPT_WINDOW_MS),\r\n };\r\n }, []);\r\n useEffect(() => {\r\n if (escInterruptArmedRunId === null) {\r\n return;\r\n }\r\n if (\r\n permissions.length > 0 ||\r\n runtime.kind !== \"running\" ||\r\n runtime.runId !== escInterruptArmedRunId\r\n ) {\r\n disarmEscInterrupt(escInterruptArmedRunId);\r\n }\r\n }, [disarmEscInterrupt, escInterruptArmedRunId, permissions.length, runtime]);\r\n useEffect(\r\n () => (): void => {\r\n if (escInterruptTimerRef.current !== null) {\r\n clearTimeout(escInterruptTimerRef.current.timer);\r\n escInterruptTimerRef.current = null;\r\n }\r\n escInterruptArmedRunIdRef.current = null;\r\n },\r\n [],\r\n );\r\n const effectiveRuntime = resolveEffectiveRuntime(permissions, runtime);\r\n const runtimeStatusLabel =\r\n runtime.kind === \"running\" && escInterruptArmedRunId === runtime.runId\r\n ? ESC_INTERRUPT_HINT\r\n : effectiveRuntime.kind === \"error\"\r\n ? formatRuntimeLabel(permissions, runtime)\r\n : undefined;\r\n const setActiveCommandPanel = useCallback(\r\n (panel: CommandPanelState | null): void => {\r\n commandPanelRef.current = panel;\r\n setCommandPanel(panel);\r\n },\r\n [],\r\n );\r\n const closeCommandPanel = useCallback((): void => {\r\n setActiveCommandPanel(null);\r\n }, [setActiveCommandPanel]);\r\n const openCommandPanel = useCallback(\r\n (input: {\r\n readonly invocation: UiCommandInvocation;\r\n readonly kind: CommandPanelKind;\r\n }): void => {\r\n if (input.kind === \"connect\") {\r\n setActiveCommandPanel({\r\n kind: \"connect\",\r\n mode: \"interactive\",\r\n openedAt: Date.now(),\r\n sessionId: activeSessionId,\r\n });\r\n return;\r\n }\r\n\r\n pendingDisplayCommandInvocationsRef.current.set(\r\n input.invocation.clientInvocationId,\r\n {\r\n sessionId: activeSessionId,\r\n },\r\n );\r\n setActiveCommandPanel({\r\n clientInvocationId: input.invocation.clientInvocationId,\r\n kind: input.kind,\r\n mode: \"display\",\r\n openedAt: Date.now(),\r\n sessionId: activeSessionId,\r\n status: \"loading\",\r\n });\r\n },\r\n [activeSessionId, setActiveCommandPanel],\r\n );\r\n const consumeCommandPanelEvent = useCallback(\r\n (tuiEvent: TuiEvent): boolean => {\r\n if (\r\n tuiEvent.type === \"command.started\" &&\r\n displayPanelKindForCommandId(tuiEvent.command.commandId) !== null\r\n ) {\r\n return pendingDisplayCommandInvocationsRef.current.has(\r\n tuiEvent.command.clientInvocationId,\r\n );\r\n }\r\n\r\n if (\r\n tuiEvent.type !== \"command.result.delivered\" &&\r\n tuiEvent.type !== \"command.failed\"\r\n ) {\r\n return false;\r\n }\r\n\r\n const pendingDisplayCommand =\r\n pendingDisplayCommandInvocationsRef.current.get(\r\n tuiEvent.clientInvocationId,\r\n );\r\n if (pendingDisplayCommand === undefined) {\r\n return false;\r\n }\r\n pendingDisplayCommandInvocationsRef.current.delete(\r\n tuiEvent.clientInvocationId,\r\n );\r\n\r\n if (\r\n pendingDisplayCommand.sessionId !== store.getState().activeSessionId\r\n ) {\r\n return true;\r\n }\r\n\r\n const panel = commandPanelRef.current;\r\n if (panel === null) {\r\n return true;\r\n }\r\n if (panel.mode !== \"display\") {\r\n return true;\r\n }\r\n if (\r\n panel.clientInvocationId !== tuiEvent.clientInvocationId ||\r\n panel.sessionId !== pendingDisplayCommand.sessionId\r\n ) {\r\n return true;\r\n }\r\n\r\n if (tuiEvent.type === \"command.result.delivered\") {\r\n setActiveCommandPanel({\r\n ...panel,\r\n output:\r\n tuiEvent.output === undefined\r\n ? undefined\r\n : sanitizeCommandPanelOutput(tuiEvent.output),\r\n status: \"ready\",\r\n });\r\n return true;\r\n }\r\n\r\n setActiveCommandPanel({\r\n ...panel,\r\n error: sanitizeCommandPanelError(tuiEvent.error.message),\r\n status: \"error\",\r\n });\r\n return true;\r\n },\r\n [setActiveCommandPanel],\r\n );\r\n\r\n useInput(\r\n (value, key) => {\r\n if (commandPanelRef.current !== null) {\r\n return;\r\n }\r\n\r\n if (key.tab && key.shift && permissions.length === 0) {\r\n const command = nextPermissionModeCommand(\r\n permission,\r\n activeSessionId ?? undefined,\r\n () => {\r\n keyboardCommandSequenceRef.current += 1;\r\n return `tui_key_${String(keyboardCommandSequenceRef.current)}`;\r\n },\r\n );\r\n\r\n if (command !== null) {\r\n void client.executeCommand(command).catch((caught: unknown) => {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n if (permissions.length > 0 || runtime.kind !== \"running\") {\r\n disarmEscInterrupt();\r\n return;\r\n }\r\n if (escInterruptArmedRunIdRef.current !== runtime.runId) {\r\n armEscInterrupt(runtime.runId);\r\n return;\r\n }\r\n disarmEscInterrupt(runtime.runId);\r\n void client.abortRun(runtime.runId).catch((caught: unknown) => {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (value !== \"\\u0003\" && !(key.ctrl && value === \"c\")) {\r\n return;\r\n }\r\n\r\n if (permissions.length > 0) {\r\n void client.abortRun(permissions[0].runId).catch((caught: unknown) => {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (runtime.kind === \"running\") {\r\n void client.abortRun(runtime.runId).catch((caught: unknown) => {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n });\r\n return;\r\n }\r\n\r\n exit();\r\n },\r\n { isActive: interactions.length === 0 && commandPanel === null },\r\n );\r\n\r\n const loadCatalog = useCallback(async (): Promise<TuiCommandCatalog> => {\r\n const requestSequence = catalogRequestSequenceRef.current + 1;\r\n catalogRequestSequenceRef.current = requestSequence;\r\n\r\n try {\r\n const catalog = await client.listCommands({ surface: \"tui\" });\r\n\r\n if (\r\n !disposedRef.current &&\r\n requestSequence === catalogRequestSequenceRef.current\r\n ) {\r\n store.setCatalog(catalog);\r\n }\r\n return catalog;\r\n } catch (caught) {\r\n if (!disposedRef.current) {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n }\r\n throw caught;\r\n }\r\n }, [client, store]);\r\n\r\n useEffect(() => {\r\n disposedRef.current = false;\r\n const eventDispatcher = createCoalescedTuiEventDispatcher((events) => {\r\n store.dispatchMany(events);\r\n });\r\n\r\n const unsubscribe = subscribeEvents((tuiEvent: TuiEvent) => {\r\n if (consumeCommandPanelEvent(tuiEvent)) {\r\n return;\r\n }\r\n\r\n eventDispatcher.dispatch(tuiEvent);\r\n\r\n if (isNewSessionSelectionEvent(tuiEvent)) {\r\n writeStdout(NEW_SESSION_CLEAR_SEQUENCE);\r\n setScreenGeneration((current) => current + 1);\r\n setActiveCommandPanel(null);\r\n }\r\n\r\n if (\r\n tuiEvent.type === \"command.result.delivered\" &&\r\n tuiEvent.action?.kind === \"app.exit\"\r\n ) {\r\n exit();\r\n }\r\n\r\n if (tuiEvent.type === \"command.catalog.updated\") {\r\n void loadCatalog().catch(() => undefined);\r\n }\r\n });\r\n\r\n void client\r\n .getSnapshot()\r\n .then((snapshot) => {\r\n if (!disposedRef.current) {\r\n store.replaceSnapshot(snapshot);\r\n }\r\n })\r\n .catch((caught: unknown) => {\r\n if (!disposedRef.current) {\r\n store.dispatch({\r\n status: {\r\n kind: \"error\",\r\n message: formatError(caught),\r\n recoverable: true,\r\n },\r\n type: \"runtime.updated\",\r\n });\r\n }\r\n });\r\n void loadCatalog().catch(() => undefined);\r\n\r\n return (): void => {\r\n disposedRef.current = true;\r\n eventDispatcher.dispose();\r\n unsubscribe();\r\n };\r\n }, [\r\n client,\r\n consumeCommandPanelEvent,\r\n exit,\r\n loadCatalog,\r\n setActiveCommandPanel,\r\n store,\r\n subscribeEvents,\r\n ]);\r\n\r\n useEffect(() => {\r\n const panel = commandPanelRef.current;\r\n if (panel !== null && panel.sessionId !== activeSessionId) {\r\n setActiveCommandPanel(null);\r\n }\r\n }, [activeSessionId, setActiveCommandPanel]);\r\n\r\n useEffect(() => {\r\n const sessionId = activeSessionId;\r\n if (!sessionId) {\r\n return;\r\n }\r\n\r\n const requestSequence = contextRefreshSequenceRef.current + 1;\r\n contextRefreshSequenceRef.current = requestSequence;\r\n let cancelled = false;\r\n\r\n void client\r\n .getContextWindowUsage({ sessionId })\r\n .then((usage) => {\r\n if (\r\n cancelled ||\r\n disposedRef.current ||\r\n requestSequence !== contextRefreshSequenceRef.current ||\r\n !usage\r\n ) {\r\n return;\r\n }\r\n store.dispatch({\r\n type: \"context.window.updated\",\r\n usage,\r\n });\r\n })\r\n .catch((caught: unknown) => {\r\n if (\r\n cancelled ||\r\n disposedRef.current ||\r\n requestSequence !== contextRefreshSequenceRef.current\r\n ) {\r\n return;\r\n }\r\n\r\n contextNoticeSequenceRef.current += 1;\r\n store.dispatch({\r\n notice: {\r\n createdAt: new Date().toISOString(),\r\n id: `context_notice_${String(contextNoticeSequenceRef.current)}`,\r\n key: `context-window:${sessionId}`,\r\n level: \"warning\",\r\n message: `Context window usage could not be refreshed: ${formatError(\r\n caught,\r\n )}`,\r\n source: \"context\",\r\n title: \"Context unavailable\",\r\n },\r\n type: \"notice.emitted\",\r\n });\r\n });\r\n\r\n return (): void => {\r\n cancelled = true;\r\n };\r\n }, [activeSessionId, client, store]);\r\n\r\n return (\r\n <ThemeProvider>\r\n <AppShell key={screenGeneration}>\r\n <HeaderContainer store={store} />\r\n <TranscriptViewportContainer store={store} />\r\n <DialogManager\r\n client={client}\r\n interactions={interactions}\r\n permissions={permissions}\r\n />\r\n <CommandPanelManager\r\n catalog={catalog}\r\n client={client}\r\n contextWindowUsage={activeContextWindowUsage}\r\n onClose={closeCommandPanel}\r\n panel={hasBackendDialog ? null : commandPanel}\r\n runtime={runtime}\r\n />\r\n <Prompt\r\n activeSessionId={activeSessionId}\r\n catalog={catalog}\r\n client={client}\r\n disabled={hasDialog}\r\n isRuntimeRunning={runtime.kind === \"running\"}\r\n loadCatalog={loadCatalog}\r\n onCommandPanelOpen={openCommandPanel}\r\n permission={permission}\r\n contextWindowUsage={contextWindowUsageLabel}\r\n runtimeStatusLabel={runtimeStatusLabel}\r\n />\r\n <CatalogInvalidation store={store} />\r\n </AppShell>\r\n </ThemeProvider>\r\n );\r\n}\r\n\r\nfunction HeaderContainer({\r\n store,\r\n}: {\r\n readonly store: TuiStore;\r\n}): ReactElement {\r\n const isEmpty = useTuiStoreSelector(\r\n store,\r\n (state) => state.messages.length === 0,\r\n );\r\n\r\n return <Header isEmpty={isEmpty} />;\r\n}\r\n\r\nfunction TranscriptViewportContainer({\r\n store,\r\n}: {\r\n readonly store: TuiStore;\r\n}): ReactElement {\r\n const activeSessionId = useTuiStoreSelector(\r\n store,\r\n (state) => state.activeSessionId,\r\n );\r\n const commandNotices = useTuiStoreSelector(\r\n store,\r\n (state) => state.commandNotices,\r\n );\r\n const committedItems = useTuiStoreSelector(store, selectCommittedItems);\r\n const liveMessage = useTuiStoreSelector(store, selectLiveMessage);\r\n const notices = useTuiStoreSelector(store, (state) => state.notices);\r\n const runtime = useTuiStoreSelector(store, (state) => state.runtime);\r\n\r\n return (\r\n <TranscriptViewport\r\n key={activeSessionId ?? \"none\"}\r\n commandNotices={commandNotices}\r\n committedItems={committedItems}\r\n liveMessage={liveMessage}\r\n notices={notices}\r\n runtime={runtime}\r\n />\r\n );\r\n}\r\n\r\nfunction CatalogInvalidation({\r\n store,\r\n}: {\r\n readonly store: TuiStore;\r\n}): ReactElement | null {\r\n const catalogInvalidation = useTuiStoreSelector(\r\n store,\r\n (state) => state.catalogInvalidation,\r\n );\r\n\r\n return catalogInvalidation === null ? null : (\r\n <Text dimColor>\r\n command catalog refresh: {catalogInvalidation.version ?? \"new\"}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction createEmptySnapshot(): UiSnapshot {\r\n return {\r\n activeSessionId: null,\r\n permission: {\r\n level: \"default\",\r\n mode: \"auto\",\r\n sessionRules: [],\r\n },\r\n permissions: [],\r\n runs: [],\r\n sessions: [],\r\n status: { kind: \"idle\" },\r\n };\r\n}\r\n\r\nfunction isNewSessionSelectionEvent(tuiEvent: TuiEvent): boolean {\r\n if (\r\n tuiEvent.type !== \"command.result.delivered\" ||\r\n tuiEvent.action?.kind !== \"session.selected\"\r\n ) {\r\n return false;\r\n }\r\n const data = tuiEvent.action.data;\r\n return isStringRecord(data) && data.source === \"new\";\r\n}\r\n\r\nfunction isStringRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction sanitizeCommandPanelOutput(output: UiCommandOutput): UiCommandOutput {\r\n if (output.kind !== \"data\") {\r\n return output;\r\n }\r\n\r\n switch (output.subject) {\r\n case \"models.current\":\r\n return {\r\n ...output,\r\n data: {\r\n current: sanitizePublicModelRecord(\r\n getRecordValue(output.data, \"current\"),\r\n ),\r\n models: sanitizePublicModelList(output.data.models),\r\n switching: sanitizeSwitchingRecord(\r\n getRecordValue(output.data, \"switching\"),\r\n ),\r\n },\r\n };\r\n case \"status\":\r\n return {\r\n ...output,\r\n data: sanitizeStatusPanelData(output.data),\r\n };\r\n default:\r\n return output;\r\n }\r\n}\r\n\r\nfunction sanitizeCommandPanelError(message: string): string {\r\n return message\r\n .replace(/https?:\\/\\/[^\\s)]*/giu, \"[redacted-url]\")\r\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+/giu, \"Bearer [redacted]\")\r\n .replace(\r\n /((?:api[_-]?key|access[_-]?token|auth[_-]?token|token)=)[^&\\s)]+/giu,\r\n \"$1[redacted]\",\r\n )\r\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/gu, \"sk-[redacted]\")\r\n .replace(\r\n /\\b[A-Z0-9_]*(?:API_KEY|ACCESS_TOKEN|AUTH_TOKEN|SECRET|PASSWORD)[A-Z0-9_]*\\b/gu,\r\n \"[redacted-env]\",\r\n );\r\n}\r\n\r\nfunction sanitizeStatusPanelData(\r\n data: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const key of [\r\n \"context\",\r\n \"contextWindow\",\r\n \"mcps\",\r\n \"permission\",\r\n \"projectRoot\",\r\n \"sessionId\",\r\n \"skillsCount\",\r\n \"status\",\r\n \"tools\",\r\n ]) {\r\n const value = data[key];\r\n if (value !== undefined) {\r\n result[key] = value;\r\n }\r\n }\r\n result.model = sanitizePublicModelRecord(getRecordValue(data, \"model\"));\r\n result.models = sanitizePublicModelList(data.models);\r\n return result;\r\n}\r\n\r\nfunction sanitizePublicModelList(\r\n value: unknown,\r\n): readonly Record<string, unknown>[] {\r\n return Array.isArray(value)\r\n ? value\r\n .map((item) =>\r\n isStringRecord(item) ? sanitizePublicModelRecord(item) : undefined,\r\n )\r\n .filter((item): item is Record<string, unknown> => item !== undefined)\r\n : [];\r\n}\r\n\r\nfunction sanitizePublicModelRecord(\r\n record: Record<string, unknown> | undefined,\r\n): Record<string, unknown> | undefined {\r\n if (!record) {\r\n return undefined;\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n for (const key of [\"id\", \"label\", \"provider\", \"model\", \"interfaceProvider\"]) {\r\n const value = record[key];\r\n if (typeof value === \"string\" && value.trim() !== \"\") {\r\n result[key] = value;\r\n }\r\n }\r\n if (typeof record.active === \"boolean\") {\r\n result.active = record.active;\r\n }\r\n\r\n return Object.keys(result).length > 0 ? result : undefined;\r\n}\r\n\r\nfunction sanitizeSwitchingRecord(\r\n record: Record<string, unknown> | undefined,\r\n): Record<string, unknown> | undefined {\r\n if (!record) {\r\n return undefined;\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n if (typeof record.available === \"boolean\") {\r\n result.available = record.available;\r\n }\r\n if (typeof record.mode === \"string\" && record.mode.trim() !== \"\") {\r\n result.mode = record.mode;\r\n }\r\n return Object.keys(result).length > 0 ? result : undefined;\r\n}\r\n\r\nfunction getRecordValue(\r\n record: Record<string, unknown>,\r\n key: string,\r\n): Record<string, unknown> | undefined {\r\n const value = record[key];\r\n return isStringRecord(value) ? value : undefined;\r\n}\r\n\r\nfunction resolveEffectiveRuntime(\r\n permissions: UiSnapshot[\"permissions\"],\r\n runtime: TuiRuntimeStatus,\r\n): TuiRuntimeStatus {\r\n if (permissions.length > 0) {\r\n return {\r\n kind: \"waiting-for-permission\",\r\n requestId: permissions[0].id,\r\n };\r\n }\r\n return runtime;\r\n}\r\n\r\nfunction formatRuntimeLabel(\r\n permissions: UiSnapshot[\"permissions\"],\r\n runtime: TuiRuntimeStatus,\r\n): string {\r\n const effectiveRuntime = resolveEffectiveRuntime(permissions, runtime);\r\n\r\n switch (effectiveRuntime.kind) {\r\n case \"idle\":\r\n return \"idle\";\r\n case \"running\":\r\n return effectiveRuntime.title\r\n ? `running: ${trimLabel(effectiveRuntime.title)}`\r\n : \"running\";\r\n case \"waiting-for-permission\":\r\n return formatPermissionWaitLabel(permissions);\r\n case \"error\":\r\n return `error: ${effectiveRuntime.message}`;\r\n }\r\n}\r\n\r\nfunction formatPermissionWaitLabel(\r\n permissions: UiSnapshot[\"permissions\"],\r\n): string {\r\n const request = permissions.at(0);\r\n const title =\r\n request?.title === undefined || request.title.trim() === \"\"\r\n ? \"permission\"\r\n : trimLabel(request.title);\r\n\r\n return permissions.length > 1\r\n ? `waiting: ${title} (+${String(permissions.length - 1)})`\r\n : `waiting: ${title}`;\r\n}\r\n\r\nfunction trimLabel(value: string): string {\r\n const normalized = value.replace(/\\s+/gu, \" \").trim();\r\n const maxLength = 48;\r\n\r\n if (normalized.length <= maxLength) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, maxLength - 3)}...`;\r\n}\r\n\r\nfunction nextPermissionModeCommand(\r\n permission: UiSnapshot[\"permission\"],\r\n sessionId: string | undefined,\r\n createInvocationId: () => string,\r\n): UiCommandInvocation | null {\r\n if (permission === undefined) {\r\n return null;\r\n }\r\n\r\n const path = [\"permission\", \"toggle-mode\"] as const;\r\n\r\n return {\r\n argv: [],\r\n clientInvocationId: createInvocationId(),\r\n commandId: \"permission.toggle-mode\",\r\n path,\r\n raw: \"<shift-tab>\",\r\n rawArgs: \"\",\r\n sessionId,\r\n surface: \"tui\",\r\n };\r\n}\r\n\r\nfunction formatError(error: unknown): string {\r\n return error instanceof Error ? error.message : \"TUI backend request failed\";\r\n}\r\n","import { render, type Instance } from \"ink\";\r\nimport { OhbabyTerminalApp, type TerminalUiOptions } from \"./app.js\";\r\n\r\nexport { OhbabyTerminalApp };\r\nexport type { TerminalUiOptions };\r\n\r\nexport function renderTerminalUi(options: TerminalUiOptions): Instance {\r\n return render(\r\n <OhbabyTerminalApp\r\n client={options.client}\r\n subscribeEvents={options.subscribeEvents}\r\n />,\r\n { incrementalRendering: true },\r\n );\r\n}\r\n"]}
|