@ngandu/ulicode 0.0.6
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/CHANGELOG.md +1081 -0
- package/README.md +312 -0
- package/dist/agents/definitions/ask.agent.md +53 -0
- package/dist/agents/definitions/audit-tests.agent.md +138 -0
- package/dist/agents/definitions/build.agent.md +111 -0
- package/dist/agents/definitions/execute.agent.md +99 -0
- package/dist/agents/definitions/explore.agent.md +57 -0
- package/dist/agents/definitions/fast.agent.md +48 -0
- package/dist/agents/definitions/plan-mode.agent.md +102 -0
- package/dist/agents/definitions/planner.agent.md +59 -0
- package/dist/chunk-3YYDXNUH.js +854 -0
- package/dist/chunk-3YYDXNUH.js.map +1 -0
- package/dist/chunk-IEV2IT3O.cjs +873 -0
- package/dist/chunk-IEV2IT3O.cjs.map +1 -0
- package/dist/chunk-MBWGSXBT.js +11927 -0
- package/dist/chunk-MBWGSXBT.js.map +1 -0
- package/dist/chunk-MS5RYNRK.js +137 -0
- package/dist/chunk-MS5RYNRK.js.map +1 -0
- package/dist/chunk-OXFO76JC.js +2633 -0
- package/dist/chunk-OXFO76JC.js.map +1 -0
- package/dist/chunk-PKRLG6A4.js +1756 -0
- package/dist/chunk-PKRLG6A4.js.map +1 -0
- package/dist/chunk-PUVEPQQ3.cjs +1805 -0
- package/dist/chunk-PUVEPQQ3.cjs.map +1 -0
- package/dist/chunk-R6JK3DE3.cjs +148 -0
- package/dist/chunk-R6JK3DE3.cjs.map +1 -0
- package/dist/chunk-Y3HWP75B.cjs +11974 -0
- package/dist/chunk-Y3HWP75B.cjs.map +1 -0
- package/dist/chunk-Y5PO67TG.cjs +2659 -0
- package/dist/chunk-Y5PO67TG.cjs.map +1 -0
- package/dist/cli.cjs +372 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +370 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +16 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +165 -0
- package/dist/index.d.ts +165 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions-NRD36MYI.cjs +40 -0
- package/dist/permissions-NRD36MYI.cjs.map +1 -0
- package/dist/permissions-RC7CYR5H.js +3 -0
- package/dist/permissions-RC7CYR5H.js.map +1 -0
- package/dist/project-q9WpahUs.d.cts +329 -0
- package/dist/project-q9WpahUs.d.ts +329 -0
- package/dist/storage-6P53PQBL.cjs +24 -0
- package/dist/storage-6P53PQBL.cjs.map +1 -0
- package/dist/storage-QELMNBZ2.js +3 -0
- package/dist/storage-QELMNBZ2.js.map +1 -0
- package/dist/tui.cjs +76 -0
- package/dist/tui.cjs.map +1 -0
- package/dist/tui.d.cts +1013 -0
- package/dist/tui.d.ts +1013 -0
- package/dist/tui.js +3 -0
- package/dist/tui.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/claude-max-warning.ts","../src/tui/theme.ts","../src/tui/components/ask-question-inline.ts","../src/onboarding/onboarding-inline.ts","../package.json","../src/version.ts","../src/utils/update-check.ts","../src/tui/claude-max-warning.ts","../src/tui/api-key-auth.ts","../src/tui/chat-layout.ts","../src/utils/slash-command-processor.ts","../src/tui/components/help-overlay.ts","../src/tui/commands/help.ts","../src/tui/commands/cost.ts","../src/tui/commands/yolo.ts","../src/tui/components/thinking-settings.ts","../src/tui/commands/think.ts","../src/tui/commands/permissions.ts","../src/tui/commands/name.ts","../src/tui/commands/exit.ts","../src/tui/commands/hooks.ts","../src/tui/commands/mcp.ts","../src/tui/commands/mode.ts","../src/tui/commands/skills.ts","../src/tui/commands/new.ts","../src/tui/commands/clone.ts","../src/tui/commands/resource.ts","../src/tui/components/diff-output.ts","../src/tui/commands/diff.ts","../src/tui/components/thread-selector.ts","../src/tui/commands/threads.ts","../src/tui/commands/thread-tag-dir.ts","../src/tui/commands/sandbox.ts","../src/tui/components/model-selector.ts","../src/tui/components/obi-loader.ts","../src/tui/components/om-progress.ts","../src/tui/status-line.ts","../src/tui/commands/models-pack.ts","../src/tui/commands/custom-providers.ts","../src/tui/commands/subagents.ts","../src/tui/components/om-settings.ts","../src/tui/commands/om.ts","../src/tui/components/settings.ts","../src/tui/commands/settings.ts","../src/tui/components/login-dialog.ts","../src/tui/commands/login.ts","../src/tui/commands/review.ts","../src/tui/commands/report-issue.ts","../src/tui/commands/setup.ts","../src/tui/detect-theme.ts","../src/tui/commands/theme.ts","../src/tui/commands/update.ts","../src/tui/components/slash-command.ts","../src/utils/errors.ts","../src/tui/notify.ts","../src/tui/display.ts","../src/tui/command-dispatch.ts","../src/tui/components/project-file-selector.ts","../src/tui/composer-attachments.ts","../src/tui/handlers/agent-lifecycle.ts","../src/tui/components/assistant-message.ts","../src/tui/components/collapsible.ts","../src/tui/components/error-display.ts","../src/tui/components/tool-validation-error.ts","../src/tui/components/tool-execution-enhanced.ts","../src/tui/handlers/message.ts","../src/tui/components/om-marker.ts","../src/tui/components/om-output.ts","../src/tui/handlers/om.ts","../src/utils/plans.ts","../src/tui/components/ask-question-dialog.ts","../src/tui/components/plan-approval-inline.ts","../src/tui/handlers/prompts.ts","../src/tui/components/subagent-execution.ts","../src/tui/handlers/subagent.ts","../src/tui/components/tool-approval-dialog.ts","../src/tui/handlers/tool.ts","../src/tui/event-dispatch.ts","../src/tui/components/system-reminder.ts","../src/tui/components/user-message.ts","../src/tui/render-messages.ts","../src/utils/slash-command-loader.ts","../src/tui/components/banner.ts","../src/tui/components/task-progress.ts","../src/tui/setup.ts","../src/tui/components/shell-output.ts","../src/tui/shell.ts","../src/clipboard/index.ts","../src/tui/components/custom-editor.ts","../src/tui/state.ts","../src/tui/pulse-tui.ts","../src/tui/components/login-selector.ts"],"names":["Container","Box","Spacer","Text","chalk","SelectList","resolve","showError","showInfo","path","fs","TOOL_CATEGORIES","statuses","component","Input","getEditorKeybindings","fuzzyFilter","isSelected","line","bg","dim","homedir","askText","askSelect","SettingsList","settings","exec","rangeDisplay","status","pathDisplay","termWidth","output","border","footerText","maxLineWidth","fixedParts","availableForPath","highlight","remaining","formatTokens","OBSERVER_COLOR","REFLECTOR_COLOR","truncateAnsi","Markdown","processNextInlineQuestion","COLLAPSED_LINES","parsePartialJson","text","name","sep","execFileSync","formatDuration","execSync","join","readFileSync","theme","mimeType","statSync","extname","PROVIDER_DEFAULT_MODELS"],"mappings":"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","file":"chunk-MBWGSXBT.js","sourcesContent":["/**\n * Claude Max OAuth warning constants.\n *\n * Shared between the TUI startup check, the /login command, and onboarding so\n * the provider ID and user-facing message stay in sync.\n */\n\nexport const ANTHROPIC_OAUTH_PROVIDER_ID = 'anthropic';\n\nexport const CLAUDE_MAX_OAUTH_WARNING_MESSAGE =\n 'OAuth with a Claude Max plan is a grey area. Anthropic has reportedly banned users for using Claude max credentials outside of Claude Code, and it may violate Anthropic Terms of Service. Proceed at your own risk.';\n","/**\n * Theme system for the Mastra Code TUI.\n * Simplified from pi-mono's theme system.\n */\n\nimport type { MarkdownTheme, EditorTheme, SettingsListTheme, SelectListTheme } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\n\n// =============================================================================\n// Theme Mode\n// =============================================================================\n\nexport type ThemeMode = 'dark' | 'light';\n\nlet currentThemeMode: ThemeMode = 'dark';\n\nexport function getThemeMode(): ThemeMode {\n return currentThemeMode;\n}\n\n// =============================================================================\n// Mastra Brand Palette (immutable — stays constant regardless of theme)\n// =============================================================================\n\nexport const mastraBrand = {\n purple: '#7f45e0', // #b588fe brand is too washed out for terminal\n green: '#059669', // #7aff78 too vibrant\n orange: '#fdac53',\n pink: '#ff69cc',\n blue: '#2563eb', // #6ccdfb brand is to washed out\n red: '#DC5663', // #ff4758 too intense\n yellow: '#e7e67b',\n} as const;\n\nexport const projectTheme = {\n accent: '#16a34a',\n accentContrast: '#86efac',\n accentMutedDarkBg: '#0d1f14',\n accentMutedLightBg: '#ecfdf3',\n accentGradientStops: ['#14532d', '#166534', '#16a34a', '#22c55e', '#86efac'],\n accentRgb: [22, 163, 74] as const,\n modeColors: {\n build: '#16a34a',\n plan: mastraBrand.blue,\n fast: mastraBrand.green,\n ask: mastraBrand.orange,\n },\n} as const;\n\n// =============================================================================\n// Mastra Surface Palette (theme-dependent)\n// =============================================================================\n\ninterface MastraSurface {\n bg: string;\n antiGrid: string;\n elevationSm: string;\n elevationLg: string;\n hover: string;\n white: string;\n specialGray: string;\n mainGray: string;\n darkGray: string;\n borderAntiGrid: string;\n borderElevation: string;\n}\n\nconst darkSurface: MastraSurface = {\n bg: '#020202',\n antiGrid: '#0d0d0d',\n elevationSm: '#1a1a1a',\n elevationLg: '#141414',\n hover: '#262626',\n white: '#f0f0f0',\n specialGray: '#cccccc',\n mainGray: '#939393',\n darkGray: '#424242',\n borderAntiGrid: '#141414',\n borderElevation: '#1a1a1a',\n};\n\nconst lightSurface: MastraSurface = {\n bg: '#ffffff',\n antiGrid: '#eaeaea',\n elevationSm: '#ebebeb',\n elevationLg: '#f0f0f0',\n hover: '#e0e0e0',\n white: '#1a1a1a',\n specialGray: '#444444',\n mainGray: '#6b6b6b',\n darkGray: '#b0b0b0',\n borderAntiGrid: '#e5e5e5',\n borderElevation: '#e0e0e0',\n};\n\ntype MastraPalette = typeof mastraBrand & MastraSurface;\n\nfunction getSurface(): MastraSurface {\n return currentThemeMode === 'dark' ? darkSurface : lightSurface;\n}\n\n/** Mastra palette — brand colors are constant, surface colors adapt to theme mode. */\nexport const mastra: MastraPalette = new Proxy({} as MastraPalette, {\n get(_target, prop: string) {\n if (prop in mastraBrand) {\n return mastraBrand[prop as keyof typeof mastraBrand];\n }\n const surface = getSurface();\n if (prop in surface) {\n return surface[prop as keyof MastraSurface];\n }\n return undefined;\n },\n});\n\n/** Tint a hex color by a brightness factor (0–1). e.g. tintHex(\"#ff8800\", 0.15) → near-black orange */\nexport function tintHex(hex: string, factor: number): string {\n const r = Math.floor(parseInt(hex.slice(1, 3), 16) * factor);\n const g = Math.floor(parseInt(hex.slice(3, 5), 16) * factor);\n const b = Math.floor(parseInt(hex.slice(5, 7), 16) * factor);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n// =============================================================================\n// Theme Colors\n// =============================================================================\n\nexport type ThemeColor =\n | 'accent'\n | 'border'\n | 'borderAccent'\n | 'borderMuted'\n | 'success'\n | 'error'\n | 'warning'\n | 'muted'\n | 'dim'\n | 'text'\n | 'thinkingText'\n | 'userMessageText'\n | 'toolTitle'\n | 'toolOutput'\n | 'toolBorderPending'\n | 'toolBorderSuccess'\n | 'toolBorderError'\n | 'function'\n | 'path'\n | 'number';\n\nexport type ThemeBg =\n | 'selectedBg'\n | 'userMessageBg'\n | 'systemReminderBg'\n | 'toolPendingBg'\n | 'toolSuccessBg'\n | 'toolErrorBg'\n | 'overlayBg'\n | 'errorBg';\n\nexport interface ThemeColors {\n // Core UI\n accent: string;\n border: string;\n borderAccent: string;\n borderMuted: string;\n success: string;\n error: string;\n warning: string;\n muted: string;\n dim: string;\n text: string;\n thinkingText: string;\n // User messages\n userMessageBg: string;\n userMessageText: string;\n // System reminders\n systemReminderBg: string;\n // Tool execution\n toolPendingBg: string;\n toolSuccessBg: string;\n toolErrorBg: string;\n toolBorderPending: string;\n toolBorderSuccess: string;\n toolBorderError: string;\n toolTitle: string;\n toolOutput: string;\n // Selection\n selectedBg: string;\n // Overlays\n overlayBg: string;\n // Error display\n errorBg: string;\n path: string;\n number: string;\n function: string;\n}\n\n// =============================================================================\n// Dark Theme\n// =============================================================================\n\nexport const darkTheme: ThemeColors = {\n // Core UI\n accent: projectTheme.accent,\n border: '#3f3f46',\n borderAccent: projectTheme.accent,\n borderMuted: '#27272a',\n success: '#22c55e',\n error: '#ef4444',\n warning: '#f59e0b',\n muted: '#71717a',\n dim: '#52525b',\n text: '#fafafa',\n thinkingText: '#a1a1aa',\n // User messages\n userMessageBg: '#0f172a', // Slate blue\n userMessageText: '#fafafa',\n // System reminders\n systemReminderBg: '#1a1400', // Dark orange tint\n // Tool execution\n toolPendingBg: projectTheme.accentMutedDarkBg,\n toolSuccessBg: projectTheme.accentMutedDarkBg,\n toolErrorBg: '#1f0a0a', // Dark red tint\n toolBorderPending: projectTheme.accent,\n toolBorderSuccess: '#22c55e', // Green for success\n toolBorderError: '#ef4444', // Red for error\n toolTitle: projectTheme.accentContrast,\n toolOutput: '#d4d4d8',\n // Error display\n errorBg: '#291415', // Slightly lighter than toolErrorBg for contrast\n path: '#9ca3af', // Gray for file paths\n number: '#fbbf24', // Yellow for line numbers\n function: '#60a5fa', // Light blue for function names\n // Selection\n selectedBg: darkSurface.hover,\n // Overlays\n overlayBg: darkSurface.antiGrid,\n};\n\n// =============================================================================\n// Light Theme\n// =============================================================================\n\nexport const lightTheme: ThemeColors = {\n // Core UI\n accent: projectTheme.accent,\n border: '#d4d4d8',\n borderAccent: projectTheme.accent,\n borderMuted: '#e4e4e7',\n success: '#16a34a',\n error: '#dc2626',\n warning: '#d97706',\n muted: '#71717a',\n dim: '#a1a1aa',\n text: '#18181b',\n thinkingText: '#71717a',\n // User messages\n userMessageBg: '#eff6ff', // Light blue\n userMessageText: '#18181b',\n // System reminders\n systemReminderBg: '#fefce8', // Light yellow\n // Tool execution\n toolPendingBg: projectTheme.accentMutedLightBg,\n toolSuccessBg: projectTheme.accentMutedLightBg,\n toolErrorBg: '#fef2f2', // Light red\n toolBorderPending: projectTheme.accent,\n toolBorderSuccess: '#16a34a', // Green for success\n toolBorderError: '#dc2626', // Red for error\n toolTitle: projectTheme.accent,\n toolOutput: '#3f3f46',\n // Error display\n errorBg: '#fef2f2', // Light red\n path: '#6b7280', // Gray for file paths\n number: '#b45309', // Amber for line numbers\n function: '#2563eb', // Blue for function names\n // Selection\n selectedBg: lightSurface.hover,\n // Overlays\n overlayBg: lightSurface.antiGrid,\n};\n\n// =============================================================================\n// Theme Instance\n// =============================================================================\n\nlet currentTheme: ThemeColors = darkTheme;\n\n/**\n * Get the current theme colors.\n */\nfunction getTheme(): ThemeColors {\n return currentTheme;\n}\n\n/**\n * Set the current theme.\n */\nfunction setTheme(colors: ThemeColors): void {\n currentTheme = colors;\n}\n\n/**\n * Apply a theme mode, updating both the surface palette and the theme colors.\n */\nexport function applyThemeMode(mode: ThemeMode): void {\n currentThemeMode = mode;\n currentTheme = mode === 'light' ? lightTheme : darkTheme;\n}\n\n// =============================================================================\n// Theme Helper Functions\n// =============================================================================\n\n/**\n * Apply foreground color from theme.\n */\nfunction fg(color: ThemeColor, text: string): string {\n const hex = currentTheme[color];\n if (!hex) return text;\n return chalk.hex(hex)(text);\n}\n\n/**\n * Apply background color from theme.\n */\nfunction bg(color: ThemeBg, text: string): string {\n const hex = currentTheme[color];\n if (!hex) return text;\n return chalk.bgHex(hex)(text);\n}\n\n/**\n * Apply bold styling.\n */\nfunction bold(text: string): string {\n return chalk.bold(text);\n}\n\n/**\n * Apply italic styling.\n */\nfunction italic(text: string): string {\n return chalk.italic(text);\n}\n\n/**\n * Apply dim styling.\n */\nfunction dim(text: string): string {\n return chalk.dim(text);\n}\n\n/**\n * Returns \"#ffffff\" or \"#000000\" depending on which has better contrast\n * against the given hex background color (WCAG relative luminance).\n */\nexport function getContrastText(hexBg: string): string {\n const hex = hexBg.replace('#', '');\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const toLinear = (c: number) => (c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\n const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n return luminance > 0.179 ? '#000000' : '#ffffff';\n}\n\n// =============================================================================\n// Theme Object\n// =============================================================================\n\nexport const theme = {\n fg,\n bg,\n bold,\n italic,\n dim,\n getTheme,\n setTheme,\n};\n\n// =============================================================================\n// Markdown Theme (for pi-tui Markdown component)\n// =============================================================================\n\nexport function getMarkdownTheme(): MarkdownTheme {\n const t = getTheme();\n return {\n heading: (text: string) => chalk.hex(t.accent).bold(text),\n link: (text: string) => chalk.hex(t.accent)(text),\n linkUrl: (text: string) => chalk.hex(t.muted)(text),\n code: (text: string) => chalk.hex(t.accent)(text),\n codeBlock: (text: string) => text,\n codeBlockBorder: (text: string) => chalk.hex(t.borderMuted)(text),\n quote: (text: string) => chalk.hex(t.muted).italic(text),\n quoteBorder: (text: string) => chalk.hex(t.borderMuted)(text),\n hr: (text: string) => chalk.hex(t.borderMuted)(text),\n listBullet: (text: string) => chalk.hex(t.accent)(text),\n // Required by MarkdownTheme interface\n bold: (text: string) => chalk.bold(text),\n italic: (text: string) => chalk.italic(text),\n strikethrough: (text: string) => chalk.strikethrough(text),\n underline: (text: string) => chalk.underline(text),\n };\n}\n\n// =============================================================================\n// Editor Theme (for pi-tui Editor component)\n// =============================================================================\n\nexport function getEditorTheme(): EditorTheme {\n const t = getTheme();\n return {\n borderColor: (text: string) => chalk.hex(t.border)(text),\n selectList: {\n selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n description: (text: string) => chalk.hex(t.muted)(text),\n scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n noMatch: (text: string) => chalk.hex(t.muted)(text),\n },\n };\n}\n\n// =============================================================================\n// Settings List Theme (for pi-tui SettingsList component)\n// =============================================================================\n\nexport function getSettingsListTheme(): SettingsListTheme {\n const t = getTheme();\n return {\n label: (text: string, selected: boolean) => (selected ? chalk.hex(t.text).bold(text) : chalk.hex(t.muted)(text)),\n value: (text: string, selected: boolean) => (selected ? chalk.hex(t.accent)(text) : chalk.hex(t.dim)(text)),\n description: (text: string) => chalk.hex(t.muted).italic(text),\n cursor: chalk.hex(t.accent)('→ '),\n hint: (text: string) => chalk.hex(t.dim)(text),\n };\n}\n\nexport function getSelectListTheme(): SelectListTheme {\n const t = getTheme();\n return {\n selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n description: (text: string) => chalk.hex(t.muted)(text),\n scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n noMatch: (text: string) => chalk.hex(t.muted)(text),\n };\n}\n","/**\n * Inline ask question component.\n * Shows a question with either selectable options or free-text input\n * directly in the conversation flow instead of as an overlay dialog.\n */\n\nimport { Box, Container, getEditorKeybindings, Input, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme } from '../theme.js';\n\nexport interface AskQuestionInlineOptions {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n /** Format the text shown after an answer is selected. Defaults to `question → answer`. */\n formatResult?: (answer: string) => string;\n /** If provided, determines whether an answer should be shown with error styling (red ✗). */\n isNegativeAnswer?: (answer: string) => boolean;\n /** Allow submitting an empty string in free-text mode. */\n allowEmptyInput?: boolean;\n onSubmit: (answer: string) => void;\n onCancel: () => void;\n}\n\nexport class AskQuestionInlineComponent extends Container implements Focusable {\n private contentBox: Box;\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit: (answer: string) => void;\n private onCancel: () => void;\n private formatResult?: (answer: string) => string;\n private isNegativeAnswer?: (answer: string) => boolean;\n private allowEmptyInput = false;\n private answered = false;\n private questionText: string;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (!this.answered && this.input) {\n this.input.focused = value;\n }\n }\n\n constructor(options: AskQuestionInlineOptions, _ui: TUI) {\n super();\n\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n this.formatResult = options.formatResult;\n this.isNegativeAnswer = options.isNegativeAnswer;\n this.allowEmptyInput = Boolean(options.allowEmptyInput);\n this.questionText = options.question;\n\n // Add spacing above\n this.addChild(new Spacer(1));\n\n // Create box with accent border for the question\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n // Question header\n this.contentBox.addChild(new Text(theme.bold(theme.fg('accent', '❓ Question')), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n // Question text (may be multi-line)\n for (const line of options.question.split('\\n')) {\n this.contentBox.addChild(new Text(theme.fg('text', line), 0, 0));\n }\n this.contentBox.addChild(new Spacer(1));\n\n if (options.options && options.options.length > 0) {\n this.buildSelectMode(options.options);\n } else {\n this.buildInputMode();\n }\n }\n\n private buildSelectMode(opts: Array<{ label: string; description?: string }>): void {\n const items: SelectItem[] = opts.map(opt => ({\n value: opt.label,\n label: opt.description ? ` ${opt.label} ${theme.fg('dim', opt.description)}` : ` ${opt.label}`,\n }));\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.handleAnswer(item.value);\n };\n this.selectList.onCancel = () => {\n this.handleCancel();\n };\n\n this.contentBox.addChild(this.selectList);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', '↑↓ to navigate · Enter to select · Esc to skip'), 0, 0));\n }\n\n private buildInputMode(): void {\n this.input = new Input();\n this.input.onSubmit = (value: string) => {\n const trimmed = value.trim();\n if (trimmed || this.allowEmptyInput) {\n this.handleAnswer(trimmed);\n }\n };\n\n this.contentBox.addChild(this.input);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', 'Enter to submit · Esc to skip'), 0, 0));\n }\n\n private handleAnswer(answer: string): void {\n if (this.answered) return;\n this.answered = true;\n\n const isNegative = this.isNegativeAnswer?.(answer) ?? false;\n\n this.contentBox.clear();\n this.contentBox.setBgFn((text: string) => theme.bg(isNegative ? 'toolErrorBg' : 'toolSuccessBg', text));\n\n const resultText = this.formatResult ? this.formatResult(answer) : `${this.questionText} → ${answer}`;\n\n const icon = isNegative ? theme.fg('error', '✗') : theme.fg('success', '✓');\n\n this.contentBox.addChild(new Text(theme.fg('text', `${icon} ${resultText}`), 0, 0));\n\n this.onSubmit(answer);\n }\n\n private handleCancel(): void {\n if (this.answered) return;\n this.answered = true;\n\n this.contentBox.clear();\n this.contentBox.setBgFn((text: string) => theme.bg('toolErrorBg', text));\n this.contentBox.addChild(\n new Text(theme.fg('dim', `${theme.fg('error', '✗')} ${this.questionText} (cancelled)`), 0, 0),\n );\n\n this.onCancel();\n }\n\n handleInput(data: string): void {\n if (this.answered) return;\n\n if (this.selectList) {\n this.selectList.handleInput(data);\n } else if (this.input) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.handleCancel();\n return;\n }\n this.input.handleInput(data);\n }\n }\n}\n","/**\n * Inline onboarding component.\n *\n * Walks the user through a multi-step wizard:\n * 1. Welcome\n * 2. Auth / Login prompt\n * 3. Mode pack selection (model preset for every configured mode)\n * 4. OM pack selection (observational memory model)\n * 5. YOLO mode toggle\n *\n * The component renders each step inline in the conversation stream.\n * On completion it fires `onComplete` with the collected choices.\n */\n\nimport { Box, Container, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { ANTHROPIC_OAUTH_PROVIDER_ID, CLAUDE_MAX_OAUTH_WARNING_MESSAGE } from '../auth/claude-max-warning.js';\nimport { AskQuestionInlineComponent } from '../tui/components/ask-question-inline.js';\nimport { theme, getSelectListTheme, mastra, projectTheme } from '../tui/theme.js';\nimport type { ModePack, ModePackOption, OMPack } from './packs.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OnboardingResult {\n modePack: ModePack;\n omPack: OMPack;\n yolo: boolean;\n /** True if the user chose to log in (auth flow handled externally). */\n loginRequested: boolean;\n loginProvider?: string;\n}\n\n/** Previously saved selections to pre-populate when re-running /setup. */\nexport interface PreviousSetupChoices {\n modePackId: string | null;\n omPackId: string | null;\n yolo: boolean | null;\n}\n\nexport interface OnboardingOptions {\n tui: TUI;\n /** OAuth providers available for login. label=display name, value=provider id */\n authProviders: Array<{ label: string; value: string; loggedIn: boolean }>;\n /** Whether to show the direct API-key login method in the auth step. */\n allowApiKeyLogin?: boolean;\n /** Available mode packs (pre-filtered by provider access). */\n modePacks: ModePack[];\n /** Ordered mode metadata used for pack rendering and custom pack selection. */\n packModes: ModePackOption[];\n /** Available OM packs (pre-filtered by provider access). */\n omPacks: OMPack[];\n /** Whether the user has any provider access (API key or OAuth) — even for providers without a built-in pack. */\n hasProviderAccess: boolean;\n /** Previously saved choices — used to highlight current selections when re-running. */\n previous?: PreviousSetupChoices;\n /** Called when the wizard completes. */\n onComplete: (result: OnboardingResult) => void;\n /** Called if the user cancels the wizard (Esc on welcome). */\n onCancel: () => void;\n /** Called when the user requests login during onboarding. */\n onLogin: (providerId: string, done: () => void) => void;\n /** Called when the user chooses the direct API-key login flow during onboarding. */\n onSetApiKey: (done: () => void) => void;\n /** Show the model selector overlay and return the chosen model ID (or undefined on cancel). */\n onSelectModel: (title: string, modeColor?: string) => Promise<string | undefined>;\n}\n\n// ---------------------------------------------------------------------------\n// Steps\n// ---------------------------------------------------------------------------\n\ntype StepId = 'welcome' | 'auth' | 'claudeMaxWarning' | 'modePack' | 'omPack' | 'yolo' | 'done';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport class OnboardingInlineComponent extends Container implements Focusable {\n private tui: TUI;\n private options: OnboardingOptions;\n\n // Track which step we're on (written by renderStep for debugging / future use)\n private currentStep: StepId = 'welcome';\n private stepBox!: Box;\n private selectList?: SelectList;\n private activeInlineQuestion?: AskQuestionInlineComponent;\n private _finished = false;\n\n // Collected choices\n private loginRequested = false;\n private loginProvider?: string;\n private selectedModePack!: ModePack;\n private selectedOmPack!: OMPack;\n private selectedYolo = true;\n\n // Focusable\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(options: OnboardingOptions) {\n super();\n this.tui = options.tui;\n this.options = options;\n\n // Initialize defaults — prefer previous selection if it still exists in the available packs\n const prevModePack = options.previous?.modePackId\n ? options.modePacks.find(p => p.id === options.previous!.modePackId)\n : undefined;\n this.selectedModePack = prevModePack ?? options.modePacks[0]!;\n\n const prevOmPack = options.previous?.omPackId\n ? options.omPacks.find(p => p.id === options.previous!.omPackId)\n : undefined;\n this.selectedOmPack = prevOmPack ??\n options.omPacks[0] ?? { id: 'none', name: 'None available', description: '', modelId: '' };\n\n if (options.previous?.yolo != null) {\n this.selectedYolo = options.previous.yolo;\n }\n\n this.renderStep('welcome');\n }\n\n get finished(): boolean {\n return this._finished;\n }\n\n /** Programmatically cancel the wizard (e.g. on Ctrl+C). */\n cancel(): void {\n if (this._finished) return;\n this._finished = true;\n this.collapseStep('Setup skipped — run /setup anytime to configure');\n this.options.onCancel();\n }\n\n /** Refresh the available mode packs (e.g. after a login grants new provider access). */\n updateModePacks(packs: ModePack[]): void {\n this.options.modePacks = packs;\n if (!this.selectedModePack || !packs.find(p => p.id === this.selectedModePack.id)) {\n this.selectedModePack = packs[0]!;\n }\n }\n\n /** Refresh the available OM packs (e.g. after a login grants new provider access). */\n updateOmPacks(packs: OMPack[]): void {\n this.options.omPacks = packs;\n if (!this.selectedOmPack || !packs.find(p => p.id === this.selectedOmPack.id)) {\n this.selectedOmPack = packs[0]!;\n }\n }\n\n /** Update whether the user has any provider access (e.g. after a login). */\n updateHasProviderAccess(hasAccess: boolean): void {\n this.options.hasProviderAccess = hasAccess;\n }\n\n // ---------------------------------------------------------------------------\n // Rendering helpers\n // ---------------------------------------------------------------------------\n\n private clearStep(): void {\n if (this.stepBox) {\n this.removeChild(this.stepBox);\n }\n this.selectList = undefined;\n }\n\n private renderStep(step: StepId): void {\n this.currentStep = step;\n\n switch (step) {\n case 'welcome':\n return this.renderWelcome();\n case 'auth':\n return this.renderAuth();\n case 'claudeMaxWarning':\n return this.renderClaudeMaxWarning();\n case 'modePack':\n return this.renderModePack();\n case 'omPack':\n return this.renderOmPack();\n case 'yolo':\n return this.renderYolo();\n case 'done':\n return this.renderDone();\n }\n }\n\n private stepCount = 0;\n\n private makeBox(): Box {\n this.clearStep();\n this.stepBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n // Add a spacer between steps, but not before the very first one\n if (this.stepCount > 0) {\n this.addChild(new Spacer(1));\n }\n this.stepCount++;\n this.addChild(this.stepBox);\n return this.stepBox;\n }\n\n // ---------------------------------------------------------------------------\n // Step: Welcome\n // ---------------------------------------------------------------------------\n\n private renderWelcome(): void {\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('accent', '👋 Welcome to Ulicode')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', \"Let's configure your models and preferences.\"), 0, 0));\n box.addChild(new Text(chalk.white('You can re-run this anytime with /setup.'), 0, 0));\n box.addChild(new Spacer(1));\n\n const items: SelectItem[] = [\n { value: 'continue', label: ` ${theme.fg('success', 'Continue')}` },\n { value: 'skip', label: ` ${theme.fg('dim', 'Skip')}` },\n ];\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n this.selectList.onSelect = (item: SelectItem) => {\n if (item.value === 'continue') {\n this.collapseStep('Welcome');\n this.renderStep('auth');\n } else {\n this._finished = true;\n this.collapseStep('Setup skipped — run /setup anytime to configure');\n this.options.onCancel();\n }\n };\n this.selectList.onCancel = () => {\n this._finished = true;\n this.collapseStep('Setup skipped — run /setup anytime to configure');\n this.options.onCancel();\n };\n box.addChild(this.selectList);\n }\n\n // ---------------------------------------------------------------------------\n // Step: Auth\n // ---------------------------------------------------------------------------\n\n private renderAuth(): void {\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('accent', '🔑 Authentication')), 0, 0));\n box.addChild(new Spacer(1));\n\n const providers = this.options.authProviders;\n if (providers.length === 0) {\n box.addChild(new Text(theme.fg('dim', 'No OAuth providers available. Skipping.'), 0, 0));\n // auto-advance after brief moment\n setTimeout(() => this.renderStep('modePack'), 100);\n return;\n }\n\n box.addChild(new Text(theme.fg('text', 'Log in with an AI provider to use your subscription,'), 0, 0));\n box.addChild(new Text(theme.fg('text', 'use a stored API key, or skip if credentials are already configured.'), 0, 0));\n box.addChild(new Spacer(1));\n\n const items: SelectItem[] = providers.map(p => ({\n value: p.value,\n label: p.loggedIn ? ` ${p.label} ${theme.fg('success', '✓ logged in')}` : ` ${p.label}`,\n }));\n if (this.options.allowApiKeyLogin) {\n items.push({\n value: '__api_key',\n label: ` ${theme.fg('accent', 'Set API key')} ${theme.fg('dim', 'Anthropic, OpenAI, or Google')}`,\n });\n }\n items.push({\n value: '__skip',\n label: ` ${theme.fg('dim', 'Skip (configure later with /login or /custom-providers)')}`,\n });\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n this.selectList.onSelect = (item: SelectItem) => {\n if (item.value === '__skip') {\n this.renderStep('modePack');\n } else if (item.value === '__api_key') {\n this.loginRequested = true;\n this.loginProvider = '__api_key';\n this.options.onSetApiKey(() => {\n this.renderStep('modePack');\n });\n } else if (item.value === ANTHROPIC_OAUTH_PROVIDER_ID) {\n // Show Claude Max ToS warning before proceeding\n this.renderStep('claudeMaxWarning');\n } else {\n this.loginRequested = true;\n this.loginProvider = item.value;\n // Hand off to the external login flow; it calls `done()` when finished\n this.options.onLogin(item.value, () => {\n this.renderStep('modePack');\n });\n }\n };\n this.selectList.onCancel = () => {\n this.renderStep('modePack');\n };\n\n box.addChild(this.selectList);\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc skip'), 0, 0));\n }\n\n // ---------------------------------------------------------------------------\n // Step: Claude Max OAuth Warning\n // ---------------------------------------------------------------------------\n\n private renderClaudeMaxWarning(): void {\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('warning', '⚠ Claude Max OAuth Warning')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', CLAUDE_MAX_OAUTH_WARNING_MESSAGE), 0, 0));\n box.addChild(new Spacer(1));\n\n const items: SelectItem[] = [\n { value: 'continue', label: ` ${theme.fg('success', 'Continue')}` },\n { value: 'cancel', label: ` ${theme.fg('dim', 'Cancel')}` },\n ];\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n this.selectList.onSelect = (item: SelectItem) => {\n if (item.value === 'continue') {\n this.loginRequested = true;\n this.loginProvider = ANTHROPIC_OAUTH_PROVIDER_ID;\n this.options.onLogin(ANTHROPIC_OAUTH_PROVIDER_ID, () => {\n this.renderStep('modePack');\n });\n } else {\n // Cancel — go back to auth provider list\n this.renderStep('auth');\n }\n };\n this.selectList.onCancel = () => {\n // Esc — go back to auth provider list\n this.renderStep('auth');\n };\n\n box.addChild(this.selectList);\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc go back'), 0, 0));\n }\n\n // ---------------------------------------------------------------------------\n // Step: Mode pack\n // ---------------------------------------------------------------------------\n\n /** Text component showing details for the currently highlighted mode pack. */\n private modePackDetail?: Text;\n\n private renderModePack(): void {\n const packs = this.options.modePacks;\n const box = this.makeBox();\n\n // No API keys and no OAuth logins — show warning but allow the user to continue\n if (!this.options.hasProviderAccess) {\n box.addChild(new Text(theme.bold(theme.fg('warning', 'No model providers configured')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', 'To use Ulicode you need at least one API key or OAuth login'), 0, 0));\n box.addChild(new Text(theme.fg('text', 'for Anthropic, OpenAI, or another supported provider.'), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(\n new Text(theme.fg('dim', 'See https://mastra.ai/models for supported providers and API key env vars.'), 0, 0),\n );\n box.addChild(new Spacer(1));\n box.addChild(\n new Text(theme.fg('dim', 'Set an API key and restart, or run /login to authenticate via OAuth.'), 0, 0),\n );\n box.addChild(new Spacer(1));\n }\n\n box.addChild(new Text(theme.bold(theme.fg('accent', 'Model Packs')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', 'Choose default models for each mode (build / plan / fast):'), 0, 0));\n box.addChild(new Spacer(1));\n\n const prevId = this.options.previous?.modePackId ?? null;\n const items: SelectItem[] = packs.map(p => ({\n value: p.id,\n label: ` ${p.name} ${theme.fg('dim', p.description)}${p.id === prevId ? theme.fg('dim', ' (current)') : ''}`,\n }));\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n // Pre-select the previously chosen pack\n const prevIdx = prevId ? packs.findIndex(p => p.id === prevId) : -1;\n if (prevIdx > 0) this.selectList.setSelectedIndex(prevIdx);\n\n this.selectList.onSelect = (item: SelectItem) => {\n const pack = packs.find(p => p.id === item.value) ?? packs[0]!;\n if (pack.id === 'custom') {\n this.runCustomPackFlow();\n } else {\n this.selectedModePack = pack;\n this.collapseStep(`Model pack → ${theme.bold(this.selectedModePack.name)}`);\n this.renderStep('omPack');\n }\n };\n this.selectList.onCancel = () => {\n this.collapseStep(`Model pack → ${theme.bold(this.selectedModePack.name)} (default)`);\n this.renderStep('omPack');\n };\n this.selectList.onSelectionChange = (item: SelectItem) => {\n this.updateModePackDetail(packs, item.value);\n };\n\n box.addChild(this.selectList);\n box.addChild(new Spacer(1));\n\n // Detail line — shows models for the currently highlighted pack\n this.modePackDetail = new Text('', 0, 0);\n box.addChild(this.modePackDetail);\n\n // Initialize detail for the highlighted item\n const initialId = prevIdx > 0 ? packs[prevIdx]!.id : packs[0]!.id;\n this.updateModePackDetail(packs, initialId);\n\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc use default'), 0, 0));\n }\n\n private updateModePackDetail(packs: ModePack[], highlightedId: string): void {\n const pack = packs.find(p => p.id === highlightedId);\n if (!pack || !this.modePackDetail) return;\n\n if (pack.id === 'custom') {\n this.modePackDetail.setText(theme.fg('dim', \" You'll pick a model for each mode in the next steps.\"));\n } else {\n const detail = this.options.packModes\n .map(mode => {\n const color = mode.color ?? projectTheme.modeColors[mode.id as keyof typeof projectTheme.modeColors] ?? mastra.blue;\n return ` ${chalk.hex(color)(mode.id)} → ${theme.fg('text', pack.models[mode.id] ?? '')}`;\n })\n .join('\\n');\n this.modePackDetail.setText(detail);\n }\n this.tui.requestRender();\n }\n\n // ---------------------------------------------------------------------------\n // Custom pack flow — sequential model selection for each mode\n // ---------------------------------------------------------------------------\n\n private async promptCustomPackName(): Promise<string | null> {\n return new Promise(resolve => {\n const question = new AskQuestionInlineComponent(\n {\n question: 'Name this custom pack',\n formatResult: answer => `Custom pack: ${answer}`,\n onSubmit: answer => {\n this.activeInlineQuestion = undefined;\n const trimmed = answer.trim();\n resolve(trimmed.length > 0 ? trimmed : null);\n },\n onCancel: () => {\n this.activeInlineQuestion = undefined;\n resolve(null);\n },\n },\n this.tui,\n );\n\n this.activeInlineQuestion = question;\n this.stepBox.addChild(new Spacer(1));\n this.stepBox.addChild(question);\n this.tui.requestRender();\n });\n }\n\n private async runCustomPackFlow(): Promise<void> {\n // Clear the pack selector so it doesn't capture input while overlays are shown\n this.selectList = undefined;\n\n const packName = await this.promptCustomPackName();\n if (!packName) {\n const fallback = this.options.modePacks.find(p => p.id !== 'custom') ?? this.options.modePacks[0]!;\n this.selectedModePack = fallback;\n this.collapseStep(`Model pack → ${theme.bold(this.selectedModePack.name)} (cancelled custom)`);\n this.renderStep('omPack');\n this.tui.requestRender();\n return;\n }\n\n this.collapseStep(`Model pack → Custom (${packName})`);\n\n const modes = this.options.packModes;\n const models: Record<string, string> = {};\n\n for (const mode of modes) {\n const title = `Select model for ${mode.label} mode`;\n const modelId = await this.options.onSelectModel(title, mode.color);\n\n if (!modelId) {\n // User cancelled — fall back to first non-custom pack (or keep current)\n const fallback = this.options.modePacks.find(p => p.id !== 'custom') ?? this.options.modePacks[0]!;\n this.selectedModePack = fallback;\n this.collapseStep(`Model pack → ${theme.bold(this.selectedModePack.name)} (cancelled custom)`);\n this.renderStep('omPack');\n this.tui.requestRender();\n return;\n }\n\n models[mode.id] = modelId;\n }\n\n this.selectedModePack = {\n id: `custom:${packName}`,\n name: packName,\n description: 'Saved custom pack',\n models,\n };\n\n this.collapseStep(\n `Model pack → ${theme.bold(packName)} ${modes.map(mode => `${chalk.hex(mode.color ?? projectTheme.modeColors[mode.id as keyof typeof projectTheme.modeColors] ?? mastra.blue)(mode.id)} ${models[mode.id]}`).join(' ')}`,\n );\n this.renderStep('omPack');\n this.tui.requestRender();\n }\n\n // ---------------------------------------------------------------------------\n // Step: OM pack\n // ---------------------------------------------------------------------------\n\n private renderOmPack(): void {\n const omPacks = this.options.omPacks;\n\n // If no OM packs at all (unlikely — would mean zero supported providers),\n // skip to next step\n if (omPacks.length === 0) {\n this.renderStep('yolo');\n return;\n }\n\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('accent', '🧠 Observational Memory')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', 'Choose the model for observational memory:'), 0, 0));\n box.addChild(new Text(theme.fg('dim', 'https://mastra.ai/docs/memory/observational-memory'), 0, 0));\n box.addChild(new Spacer(1));\n\n const prevOmId = this.options.previous?.omPackId ?? null;\n const items: SelectItem[] = omPacks.map(p => ({\n value: p.id,\n label: ` ${p.name} ${theme.fg('dim', p.description)}${p.id === prevOmId ? theme.fg('dim', ' (current)') : ''}`,\n }));\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n // Pre-select the previously chosen OM pack\n const prevOmIdx = prevOmId ? omPacks.findIndex(p => p.id === prevOmId) : -1;\n if (prevOmIdx > 0) this.selectList.setSelectedIndex(prevOmIdx);\n\n this.selectList.onSelect = (item: SelectItem) => {\n const pack = omPacks.find(p => p.id === item.value) ?? omPacks[0]!;\n if (pack.id === 'custom') {\n this.runCustomOmFlow();\n } else {\n this.selectedOmPack = pack;\n this.collapseStep(`Observational memory → ${theme.bold(this.selectedOmPack.name)}`);\n this.renderStep('yolo');\n }\n };\n this.selectList.onCancel = () => {\n this.collapseStep(`Observational memory → ${theme.bold(this.selectedOmPack.name)} (default)`);\n this.renderStep('yolo');\n };\n\n box.addChild(this.selectList);\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc use default'), 0, 0));\n }\n\n private async runCustomOmFlow(): Promise<void> {\n this.selectList = undefined;\n this.collapseStep(`Observational memory → ${theme.bold('Custom')}`);\n\n const modelId = await this.options.onSelectModel('Select model for observational memory');\n if (modelId) {\n this.selectedOmPack = { id: 'custom', name: 'Custom', description: 'User-selected model', modelId };\n this.collapseStep(`Observational memory → ${theme.bold('Custom')} ${modelId}`);\n } else {\n // Cancelled — fall back to first non-custom pack\n const fallback = this.options.omPacks.find(p => p.id !== 'custom');\n if (fallback) {\n this.selectedOmPack = fallback;\n this.collapseStep(`Observational memory → ${theme.bold(fallback.name)} (cancelled custom)`);\n } else {\n this.collapseStep(`Observational memory → ${theme.bold('Custom')} (cancelled)`);\n }\n }\n this.renderStep('yolo');\n this.tui.requestRender();\n }\n\n // ---------------------------------------------------------------------------\n // Step: YOLO mode\n // ---------------------------------------------------------------------------\n\n private renderYolo(): void {\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('accent', '⚡ Tool Approval')), 0, 0));\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('text', 'YOLO mode auto-approves all tool calls (edits, commands, etc).'), 0, 0));\n box.addChild(new Text(theme.fg('text', 'You can toggle this anytime with Ctrl+Y or /yolo.'), 0, 0));\n box.addChild(new Spacer(1));\n\n const prevYolo = this.options.previous?.yolo ?? null;\n const currentOn = prevYolo === true ? theme.fg('dim', ' (current)') : '';\n const currentOff = prevYolo === false ? theme.fg('dim', ' (current)') : '';\n const items: SelectItem[] = [\n {\n value: 'on',\n label: ` ${theme.fg('success', 'Enable YOLO')} ${theme.fg('dim', '(recommended — auto-approve everything)')}${currentOn}`,\n },\n {\n value: 'off',\n label: ` ${theme.fg('warning', 'Disable YOLO')} ${theme.fg('dim', '(ask before each tool call)')}${currentOff}`,\n },\n ];\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n // Pre-select the previously chosen YOLO setting\n if (prevYolo === false) this.selectList.setSelectedIndex(1);\n this.selectList.onSelect = (item: SelectItem) => {\n this.selectedYolo = item.value === 'on';\n const label = this.selectedYolo ? 'enabled' : 'disabled';\n this.collapseStep(`YOLO mode → ${theme.bold(label)}`);\n this.renderStep('done');\n };\n this.selectList.onCancel = () => {\n this.collapseStep(`YOLO mode → ${theme.bold('enabled')} (default)`);\n this.renderStep('done');\n };\n\n box.addChild(this.selectList);\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc use default'), 0, 0));\n }\n\n // ---------------------------------------------------------------------------\n // Step: Done\n // ---------------------------------------------------------------------------\n\n private renderDone(): void {\n this._finished = true;\n const box = this.makeBox();\n box.addChild(new Text(theme.bold(theme.fg('success', '✓ Setup complete!')), 0, 0));\n box.addChild(new Spacer(1));\n\n const lines = [\n `Model pack: ${theme.bold(this.selectedModePack.name)}`,\n ...this.options.packModes.map(mode => {\n const color = mode.color ?? projectTheme.modeColors[mode.id as keyof typeof projectTheme.modeColors] ?? mastra.blue;\n return ` ${chalk.hex(color)(mode.id)} → ${this.selectedModePack.models[mode.id] ?? ''}`;\n }),\n `Observational memory: ${theme.bold(this.selectedOmPack.name)}`,\n `YOLO mode: ${theme.bold(this.selectedYolo ? 'enabled' : 'disabled')}`,\n ];\n for (const line of lines) {\n box.addChild(new Text(theme.fg('text', line), 0, 0));\n }\n box.addChild(new Spacer(1));\n box.addChild(new Text(theme.fg('dim', 'Type a message to start coding, or use /help for commands.'), 0, 0));\n\n this.options.onComplete({\n modePack: this.selectedModePack,\n omPack: this.selectedOmPack,\n yolo: this.selectedYolo,\n loginRequested: this.loginRequested,\n loginProvider: this.loginProvider,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Collapse a completed step into a single summary line\n // ---------------------------------------------------------------------------\n\n private collapseStep(summary: string): void {\n if (!this.stepBox) return;\n this.stepBox.clear();\n this.stepBox.setBgFn((text: string) => theme.bg('toolSuccessBg', text));\n this.stepBox.addChild(new Text(`${theme.fg('success', '✓')} ${theme.fg('text', summary)}`, 0, 0));\n this.selectList = undefined;\n this.activeInlineQuestion = undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Input handling\n // ---------------------------------------------------------------------------\n\n handleInput(data: string): void {\n if (this._finished) return;\n\n if (this.activeInlineQuestion) {\n this.activeInlineQuestion.handleInput(data);\n return;\n }\n\n if (this.selectList) {\n this.selectList.handleInput(data);\n return;\n }\n }\n}\n","{\n \"name\": \"@ngandu/ulicode\",\n \"version\": \"0.0.6\",\n \"description\": \"\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"CHANGELOG.md\"\n ],\n \"homepage\": \"https://ulicode.ai\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ngandugilbert/ulicode.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ngandugilbert/ulicode/issues\"\n },\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"bin\": {\n \"ulicode\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./tui\": {\n \"import\": {\n \"types\": \"./dist/tui/index.d.ts\",\n \"default\": \"./dist/tui.js\"\n },\n \"require\": {\n \"types\": \"./dist/tui/index.d.ts\",\n \"default\": \"./dist/tui.cjs\"\n }\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"cli\": \"tsx src/main.ts\",\n \"check\": \"tsc --noEmit\",\n \"build\": \"pnpm build:lib\",\n \"build:lib\": \"tsup --silent --config tsup.config.ts && node scripts/copy-agent-definitions.mjs\",\n \"prepack\": \"pnpm build\",\n \"build:watch\": \"pnpm build --watch\",\n \"release:verify\": \"pnpm check && pnpm exec vitest run && pnpm build\",\n \"test\": \"vitest\",\n \"lint\": \"eslint .\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/anthropic\": \"3.0.58\",\n \"@ai-sdk/openai\": \"3.0.41\",\n \"@ast-grep/napi\": \"0.41.1\",\n \"@mariozechner/pi-tui\": \"0.58.1\",\n \"@mastra/core\": \"1.13.2\",\n \"@mastra/libsql\": \"1.7.0\",\n \"@mastra/mcp\": \"1.2.1\",\n \"@mastra/memory\": \"1.8.2\",\n \"@mastra/pg\": \"1.8.0\",\n \"@tavily/core\": \"0.7.2\",\n \"ai\": \"6.0.116\",\n \"chalk\": \"5.6.2\",\n \"cli-highlight\": \"2.1.11\",\n \"cli-spinners\": \"^3.4.0\",\n \"execa\": \"^9.6.1\",\n \"fastest-levenshtein\": \"1.0.16\",\n \"js-tiktoken\": \"^1.0.21\",\n \"js-yaml\": \"4.1.1\",\n \"partial-json\": \"^0.1.7\",\n \"strip-ansi\": \"^7.1.2\",\n \"tree-kill\": \"1.2.2\",\n \"typescript-language-server\": \"^5.1.3\",\n \"vscode-jsonrpc\": \"8.2.1\",\n \"vscode-languageserver-protocol\": \"3.17.5\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"10.0.1\",\n \"@types/js-yaml\": \"4.0.9\",\n \"@types/node\": \"25.5.0\",\n \"@vitest/coverage-v8\": \"4.1.0\",\n \"@vitest/ui\": \"4.1.0\",\n \"eslint\": \"10.0.3\",\n \"globals\": \"17.4.0\",\n \"tsup\": \"8.5.1\",\n \"tsx\": \"4.21.0\",\n \"typescript\": \"5.9.3\",\n \"typescript-eslint\": \"8.57.0\",\n \"vitest\": \"4.1.0\"\n },\n \"engines\": {\n \"node\": \">=22.13.0\"\n }\n}","import packageJson from '../package.json';\n\nexport const APP_VERSION = packageJson.version;\n","/**\n * Check for newer versions of Ulicode using the npm registry.\n */\n\nimport { execFile } from 'node:child_process';\nimport { realpathSync } from 'node:fs';\n\nimport { APP_VERSION } from '../version.js';\n\nconst PACKAGE_NAME = '@ngandu/ulicode';\nconst NPM_REGISTRY_URL = 'https://registry.npmjs.org';\nconst NPM_PACKAGE_URL = `${NPM_REGISTRY_URL}/${PACKAGE_NAME.replace('/', '%2F')}/latest`;\n\n/** Timeout for the npm registry fetch (ms). */\nconst FETCH_TIMEOUT_MS = 5_000;\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nfunction matchPM(str: string): PackageManager | null {\n // Order matters: check pnpm before npm since \"npm\" is a substring of some paths\n if (/pnpm/i.test(str)) return 'pnpm';\n if (/\\byarn\\b/i.test(str)) return 'yarn';\n if (/\\bbun\\b/i.test(str)) return 'bun';\n if (/\\bnpm\\b/i.test(str)) return 'npm';\n return null;\n}\n\n/**\n * Detect which package manager was used to install Ulicode globally.\n *\n * Uses a multi-tier approach:\n * 1. npm_config_user_agent env var (set when run via `pnpm run`, `npm run`, etc.)\n * 2. npm_execpath env var (fallback for script-based invocation)\n * 3. NODE_PATH env var (set by pnpm global bin stubs)\n * 4. Resolved path of the running script (process.argv[1])\n * 5. Shell-out to `pnpm list -g` to check if pnpm manages the package\n * 6. Falls back to 'npm'\n */\nexport async function detectPackageManager(): Promise<PackageManager> {\n // Tier 1: npm_config_user_agent (most reliable when available)\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n const pm = matchPM(userAgent);\n if (pm) return pm;\n }\n\n // Tier 2: npm_execpath\n const execPath = process.env.npm_execpath;\n if (execPath) {\n const pm = matchPM(execPath);\n if (pm) return pm;\n }\n\n // Tier 3: NODE_PATH (pnpm global stubs set this to paths containing .pnpm)\n const nodePath = process.env.NODE_PATH;\n if (nodePath) {\n if (/[/\\\\]\\.pnpm[/\\\\]/.test(nodePath) || /[/\\\\]pnpm[/\\\\]/.test(nodePath)) return 'pnpm';\n if (/[/\\\\]\\.yarn[/\\\\]/.test(nodePath)) return 'yarn';\n if (/[/\\\\]\\.bun[/\\\\]/.test(nodePath)) return 'bun';\n }\n\n // Tier 4: Resolved script path\n try {\n const scriptPath = realpathSync(process.argv[1] ?? '');\n if (/[/\\\\]\\.?pnpm[/\\\\]/.test(scriptPath)) return 'pnpm';\n if (/[/\\\\]\\.?yarn[/\\\\]/.test(scriptPath)) return 'yarn';\n if (/[/\\\\]\\.?bun[/\\\\]/.test(scriptPath)) return 'bun';\n } catch {\n // realpathSync can fail if argv[1] is missing/broken — fall through\n }\n\n // Tier 5: Check if the package is in pnpm's global store (non-blocking)\n const pnpmResult = await new Promise<boolean>(resolve => {\n execFile('pnpm', ['list', '-g', '--depth=0', PACKAGE_NAME], { timeout: 3_000 }, (error, stdout) => {\n resolve(!error && stdout.includes(PACKAGE_NAME));\n });\n });\n if (pnpmResult) return 'pnpm';\n\n return 'npm';\n}\n\n/**\n * Build the shell command string a user would run to install/update globally.\n */\nexport function getInstallCommand(pm: PackageManager, version?: string): string {\n const pkg = version ? `${PACKAGE_NAME}@${version}` : `${PACKAGE_NAME}@latest`;\n switch (pm) {\n case 'pnpm':\n return `pnpm add -g ${pkg}`;\n case 'yarn':\n return `yarn global add ${pkg}`;\n case 'bun':\n return `bun add -g ${pkg}`;\n default:\n return `npm install -g ${pkg}`;\n }\n}\n\n/**\n * Read the current version from the package manifest.\n */\nexport function getCurrentVersion(): string {\n return APP_VERSION;\n}\n\n/**\n * Fetch the latest published version from the npm registry.\n * Returns null if the fetch fails (network error, timeout, etc.).\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n const res = await fetch(NPM_PACKAGE_URL, {\n signal: controller.signal,\n headers: { Accept: 'application/json' },\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return normalizeVersion(data.version ?? null);\n } catch {\n return null;\n }\n}\n\n/**\n * Simple semver comparison: returns true if `latest` is newer than `current`.\n * Handles standard x.y.z versions. Ignores pre-release tags.\n */\nexport function isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, '')\n .split('-')[0]!\n .split('.')\n .map(s => {\n const n = Number(s);\n return Number.isFinite(n) ? n : 0;\n });\n const [cMajor = 0, cMinor = 0, cPatch = 0] = parse(current);\n const [lMajor = 0, lMinor = 0, lPatch = 0] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\n/**\n * Run the appropriate global install command to update Ulicode.\n * Returns true on success, false on failure.\n */\nexport function runUpdate(pm: PackageManager, targetVersion: string): Promise<boolean> {\n const args = buildInstallArgs(pm, targetVersion);\n return new Promise(resolve => {\n execFile(pm, args, { timeout: 60_000 }, error => {\n resolve(!error);\n });\n });\n}\n\nfunction buildInstallArgs(pm: PackageManager, version: string): string[] {\n const pkg = `${PACKAGE_NAME}@${version}`;\n switch (pm) {\n case 'pnpm':\n return ['add', '-g', pkg];\n case 'yarn':\n return ['global', 'add', pkg];\n case 'bun':\n return ['add', '-g', pkg];\n default:\n return ['install', '-g', pkg];\n }\n}\n\nfunction normalizeVersion(value: string | null): string | null {\n if (!value) return null;\n const normalized = value.trim().replace(/^v/, '');\n return /^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(normalized) ? normalized : null;\n}\n","/**\n * Claude Max OAuth warning prompt.\n *\n * Renders an inline question asking the user whether to proceed with\n * Anthropic OAuth (grey-area ToS), with different options depending on\n * whether we're in the login/onboarding flow or the startup check.\n */\n\nimport { Spacer } from '@mariozechner/pi-tui';\nimport { CLAUDE_MAX_OAUTH_WARNING_MESSAGE } from '../auth/claude-max-warning.js';\nimport { AskQuestionInlineComponent } from './components/ask-question-inline.js';\nimport type { TUIState } from './state.js';\n\nexport type ClaudeMaxWarningMode = 'login' | 'startup';\nexport type ClaudeMaxWarningResult = 'continue' | 'cancel' | 'remove';\n\n/**\n * Show the Claude Max OAuth warning inline and return the user's choice.\n *\n * - **login** mode: \"Continue\" / \"Cancel\"\n * - **startup** mode: \"Continue\" / \"Remove OAuth\"\n */\nexport function showClaudeMaxOAuthWarning(\n state: TUIState,\n mode: ClaudeMaxWarningMode,\n): Promise<ClaudeMaxWarningResult> {\n const options =\n mode === 'login'\n ? [\n { label: 'Continue', description: 'Proceed with Anthropic OAuth' },\n { label: 'Cancel', description: 'Go back' },\n ]\n : [\n { label: 'Continue', description: 'Keep Anthropic OAuth credentials' },\n { label: 'Remove OAuth', description: 'Log out from Anthropic' },\n ];\n\n return new Promise<ClaudeMaxWarningResult>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: CLAUDE_MAX_OAUTH_WARNING_MESSAGE,\n options,\n formatResult: answer => `Claude Max OAuth warning → ${answer}`,\n isNegativeAnswer: answer => answer !== 'Continue',\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n if (answer === 'Continue') {\n resolve('continue');\n } else if (answer === 'Cancel') {\n resolve('cancel');\n } else {\n resolve('remove');\n }\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n resolve('cancel');\n },\n },\n state.ui,\n );\n\n state.activeInlineQuestion = questionComponent;\n state.chatContainer.addChild(questionComponent);\n state.chatContainer.addChild(new Spacer(1));\n state.ui.requestRender();\n state.chatContainer.invalidate();\n });\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport type { AuthStorage, PROVIDER_DEFAULT_MODELS } from '../auth/storage.js';\nimport { AskQuestionInlineComponent } from './components/ask-question-inline.js';\nimport type { TUIState } from './state.js';\n\nexport type SupportedApiKeyProviderId = 'anthropic' | 'openai-codex' | 'google';\n\ninterface ApiKeyProviderOption {\n providerId: SupportedApiKeyProviderId;\n label: string;\n description: string;\n}\n\ninterface ApiKeyAuthFlowOptions {\n state: TUIState;\n authStorage?: AuthStorage;\n showInfo: (message: string) => void;\n showError: (message: string) => void;\n switchModel?: (modelId: string) => Promise<void>;\n providerDefaults: typeof PROVIDER_DEFAULT_MODELS;\n oauthProviders?: Array<{ id: string; name: string }>;\n}\n\nconst API_KEY_PROVIDER_FALLBACK_NAMES: Record<SupportedApiKeyProviderId, string> = {\n anthropic: 'Anthropic',\n 'openai-codex': 'OpenAI',\n google: 'Google',\n};\n\nfunction processNextInlineQuestion(state: TUIState): void {\n const next = state.pendingInlineQuestions.shift();\n if (next) {\n next();\n }\n}\n\nfunction addInlineQuestion(state: TUIState, component: AskQuestionInlineComponent): void {\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(component);\n state.chatContainer.addChild(new Spacer(1));\n state.ui.requestRender();\n state.chatContainer.invalidate();\n component.focused = true;\n}\n\nfunction askQuestion(\n state: TUIState,\n options: ConstructorParameters<typeof AskQuestionInlineComponent>[0],\n): Promise<string | null> {\n return new Promise(resolve => {\n const activate = () => {\n const component = new AskQuestionInlineComponent(\n {\n ...options,\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n options.onSubmit(answer);\n resolve(answer);\n processNextInlineQuestion(state);\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n options.onCancel();\n resolve(null);\n processNextInlineQuestion(state);\n },\n },\n state.ui,\n );\n\n state.activeInlineQuestion = component;\n addInlineQuestion(state, component);\n };\n\n if (state.activeInlineQuestion) {\n state.pendingInlineQuestions.push(activate);\n } else {\n activate();\n }\n });\n}\n\nasync function askSelect(\n state: TUIState,\n question: string,\n options: Array<{ label: string; value: string; description?: string }>,\n): Promise<string | null> {\n const answer = await askQuestion(state, {\n question,\n options: options.map(option => ({ label: option.label, description: option.description })),\n onSubmit: () => {},\n onCancel: () => {},\n });\n if (!answer) {\n return null;\n }\n return options.find(option => option.label === answer)?.value ?? null;\n}\n\nasync function askText(state: TUIState, question: string, secret = false): Promise<string | null> {\n const answer = await askQuestion(state, {\n question: secret ? `${question}\\n${'Value is stored locally in plaintext.'}` : question,\n onSubmit: () => {},\n onCancel: () => {},\n });\n return answer?.trim() || null;\n}\n\nfunction resolveProviderLabel(\n providerId: SupportedApiKeyProviderId,\n oauthProviders?: Array<{ id: string; name: string }>,\n): string {\n return oauthProviders?.find(provider => provider.id === providerId)?.name ?? API_KEY_PROVIDER_FALLBACK_NAMES[providerId];\n}\n\nexport function getStoredAuthDescription(\n authStorage: AuthStorage | undefined,\n providerId: SupportedApiKeyProviderId,\n oauthProviders?: Array<{ id: string; name: string }>,\n): string | undefined {\n const credential = authStorage?.get(providerId);\n if (!credential) {\n return undefined;\n }\n\n if (credential.type === 'oauth') {\n return 'oauth';\n }\n\n const providerLabel = resolveProviderLabel(providerId, oauthProviders);\n return credential.name?.trim() ? `api key: ${credential.name.trim()} (${providerLabel})` : `api key (${providerLabel})`;\n}\n\nexport function getApiKeyProviderOptions(\n oauthProviders?: Array<{ id: string; name: string }>,\n): ApiKeyProviderOption[] {\n const ids: SupportedApiKeyProviderId[] = ['anthropic', 'openai-codex', 'google'];\n return ids.map(providerId => {\n const label = resolveProviderLabel(providerId, oauthProviders);\n return {\n providerId,\n label,\n description: `Store a direct ${label} API key`,\n };\n });\n}\n\nexport async function runApiKeyLoginFlow(options: ApiKeyAuthFlowOptions): Promise<SupportedApiKeyProviderId | undefined> {\n const { state, authStorage, showError, showInfo, switchModel, providerDefaults, oauthProviders } = options;\n\n if (!authStorage) {\n showError('Auth storage not configured');\n return undefined;\n }\n\n const providerOptions = getApiKeyProviderOptions(oauthProviders);\n const providerId = await askSelect(\n state,\n 'Save an API key for which provider?',\n providerOptions.map(option => ({\n label: option.label,\n value: option.providerId,\n description: option.description,\n })),\n );\n if (!providerId || (providerId !== 'anthropic' && providerId !== 'openai-codex' && providerId !== 'google')) {\n return undefined;\n }\n\n const keyName = await askText(state, 'API key name');\n if (!keyName) {\n return undefined;\n }\n\n const keyValue = await askText(state, 'API key value', true);\n if (!keyValue) {\n return undefined;\n }\n\n authStorage.set(providerId, { type: 'api_key', name: keyName, key: keyValue });\n\n const providerLabel = resolveProviderLabel(providerId, oauthProviders);\n const defaultModel = providerDefaults[providerId];\n if (defaultModel && switchModel) {\n await switchModel(defaultModel);\n showInfo(`Saved ${providerLabel} API key \"${keyName}\" - switched to ${defaultModel}`);\n } else {\n showInfo(`Saved ${providerLabel} API key \"${keyName}\"`);\n }\n\n return providerId;\n}","import type { Component, Container } from '@mariozechner/pi-tui';\n\ntype MinimalContainer = Pick<Container, 'children' | 'addChild' | 'invalidate'>;\ntype RenderableUI = { requestRender: () => void };\n\nconst pendingRenderTimers = new WeakMap<RenderableUI, ReturnType<typeof setTimeout>>();\n\nexport function insertChildBeforeAnchor(\n container: MinimalContainer,\n child: Component,\n anchor?: Component,\n): void {\n if (anchor) {\n const idx = container.children.indexOf(anchor);\n if (idx >= 0) {\n container.children.splice(idx, 0, child);\n container.invalidate();\n return;\n }\n }\n\n container.addChild(child);\n}\n\nexport function insertChildrenAfterAnchor(\n container: MinimalContainer,\n children: Component[],\n anchor?: Component,\n): void {\n if (anchor) {\n const idx = container.children.indexOf(anchor);\n if (idx >= 0) {\n container.children.splice(idx + 1, 0, ...children);\n container.invalidate();\n return;\n }\n }\n\n for (const child of children) {\n container.addChild(child);\n }\n}\n\nexport function removeChild(container: MinimalContainer, child?: Component): boolean {\n if (!child) return false;\n\n const idx = container.children.indexOf(child);\n if (idx === -1) return false;\n\n container.children.splice(idx, 1);\n container.invalidate();\n return true;\n}\n\nexport function requestRenderSoon(ui: RenderableUI): void {\n if (pendingRenderTimers.has(ui)) return;\n\n const timer = setTimeout(() => {\n pendingRenderTimers.delete(ui);\n ui.requestRender();\n }, 0);\n\n pendingRenderTimers.set(ui, timer);\n}","import { execSync } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { SlashCommandMetadata } from './slash-command-loader.js';\n\n/**\n * Process a slash command by replacing variables and executing shell commands\n */\nexport async function processSlashCommand(\n command: SlashCommandMetadata,\n args: string[],\n workingDir: string,\n): Promise<string> {\n const { result: withArgs, shouldAppendRawArgs } = replaceArguments(command.template, args);\n let result = withArgs;\n\n // Replace shell commands\n result = await replaceShellOutput(result, workingDir);\n\n // Replace file references\n result = await replaceFileReferences(result, workingDir);\n\n // Append raw args after shell/file processing to avoid executing user input\n if (shouldAppendRawArgs) {\n result = result.trimEnd() + `\\n\\nARGUMENTS: ${args.join(' ')}`;\n }\n\n return result;\n}\n\n/**\n * Replace argument variables in template\n * $ARGUMENTS - all arguments joined\n * $1, $2, etc. - positional arguments\n */\nfunction replaceArguments(template: string, args: string[]): { result: string; shouldAppendRawArgs: boolean } {\n let result = template;\n\n // Check if template references any argument variables\n const hasArgumentsVar = /\\$ARGUMENTS/.test(template);\n const hasPositionalVar = /\\$[1-9]\\d*/.test(template);\n\n // Replace $ARGUMENTS with all args joined\n result = result.replace(/\\$ARGUMENTS/g, args.join(' '));\n\n // Replace positional arguments $1, $2, etc.\n args.forEach((arg, index) => {\n const pattern = new RegExp(`\\\\\\$${index + 1}`, 'g');\n result = result.replace(pattern, arg);\n });\n\n // Clear unused positional arguments\n result = result.replace(/\\$[1-9]\\d*/g, '');\n\n return {\n result,\n shouldAppendRawArgs: !hasArgumentsVar && !hasPositionalVar && args.length > 0,\n };\n}\n\n/**\n * Replace shell command references with their output\n * Format: !`command`\n */\nasync function replaceShellOutput(template: string, workingDir: string): Promise<string> {\n const shellPattern = /!`([^`]+)`/g;\n const matches = [...template.matchAll(shellPattern)];\n\n let result = template;\n for (const match of matches) {\n const [fullMatch, command] = match;\n try {\n const output = execSync(command!, {\n cwd: workingDir,\n encoding: 'utf-8',\n timeout: 30000,\n maxBuffer: 1024 * 1024, // 1MB buffer\n });\n result = result.replace(fullMatch, output.trim());\n } catch (error) {\n console.error(`Error executing shell command \"${command}\":`, error);\n result = result.replace(fullMatch, `[Error: Failed to execute \"${command}\"]`);\n }\n }\n\n return result;\n}\n\n/**\n * Replace file references with file content\n * Format: @filename or @path/to/file\n */\nasync function replaceFileReferences(template: string, workingDir: string): Promise<string> {\n const filePattern = /@([\\w./-]+)/g;\n const matches = [...template.matchAll(filePattern)];\n\n let result = template;\n for (const match of matches) {\n const [fullMatch, filePath] = match;\n try {\n const fullPath = path.resolve(workingDir, filePath!);\n const content = await fs.readFile(fullPath, 'utf-8');\n result = result.replace(fullMatch, content);\n } catch (error) {\n console.error(`Error reading file \"${filePath}\":`, error);\n result = result.replace(fullMatch, `[Error: Could not read \"${filePath}\"]`);\n }\n }\n\n return result;\n}\n\n/**\n * Format a command for display in help/autocomplete\n */\nexport function formatCommandForDisplay(command: SlashCommandMetadata): string {\n const parts = [command.name];\n\n if (command.description) {\n parts.push(`- ${command.description}`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Group commands by namespace for display\n */\nexport function groupCommandsByNamespace(commands: SlashCommandMetadata[]): Map<string, SlashCommandMetadata[]> {\n const groups = new Map<string, SlashCommandMetadata[]>();\n\n for (const command of commands) {\n const namespace = command.namespace || command.name.split(':')[0] || 'general';\n\n if (!groups.has(namespace)) {\n groups.set(namespace, []);\n }\n\n groups.get(namespace)!.push(command);\n }\n\n return groups;\n}\n","/**\n * Help text builder — generates the inline help content shown by /help.\n */\n\nimport type { SlashCommandMetadata } from '../../utils/slash-command-loader.js';\n\nexport interface HelpTextOptions {\n /** Number of available harness modes (mode commands shown when > 1) */\n modes: number;\n /** User-defined custom slash commands */\n customSlashCommands: SlashCommandMetadata[];\n}\n\ninterface HelpEntry {\n key: string;\n description: string;\n}\n\n// =============================================================================\n// Data\n// =============================================================================\n\nfunction getCommands(modes: number): HelpEntry[] {\n const cmds: HelpEntry[] = [\n { key: '/new', description: 'Start a new thread' },\n { key: '/threads', description: 'Switch between threads' },\n { key: '/thread:tag-dir', description: 'Tag thread with current directory' },\n { key: '/name', description: 'Rename current thread' },\n { key: '/resource', description: 'Show/switch resource ID' },\n { key: '/skills', description: 'List available skills' },\n { key: '/models', description: 'Switch model pack' },\n { key: '/custom-providers', description: 'Manage custom providers and models' },\n { key: '/subagents', description: 'Configure subagent models' },\n { key: '/permissions', description: 'Tool approval permissions' },\n { key: '/settings', description: 'Notifications, YOLO, thinking' },\n { key: '/om', description: 'Configure Observational Memory' },\n { key: '/review', description: 'Review a GitHub pull request' },\n { key: '/report-issue', description: 'Open or browse Ulicode issues' },\n { key: '/cost', description: 'Token usage and costs' },\n { key: '/diff', description: 'Modified files or git diff' },\n { key: '/sandbox', description: 'Manage sandbox allowed paths' },\n { key: '/hooks', description: 'Show/reload configured hooks' },\n { key: '/mcp', description: 'Show/reload MCP connections' },\n { key: '/login', description: 'Login with OAuth provider' },\n { key: '/logout', description: 'Logout from OAuth provider' },\n { key: '/setup', description: 'Run the setup wizard' },\n { key: '/theme', description: 'Switch color theme (auto/dark/light)' },\n { key: '/update', description: 'Check for and install updates' },\n ];\n\n if (modes > 1) {\n cmds.push({ key: '/mode', description: 'Switch or list modes' });\n }\n\n cmds.push({ key: '/exit', description: 'Exit' }, { key: '/help', description: 'Show this help' });\n\n return cmds;\n}\n\nfunction getShortcuts(modes: number): HelpEntry[] {\n const shortcuts: HelpEntry[] = [\n { key: 'Ctrl+C', description: 'Interrupt / clear input' },\n { key: 'Ctrl+C×2', description: 'Exit (double-tap)' },\n { key: 'Ctrl+D', description: 'Exit (when editor empty)' },\n { key: 'Enter', description: 'Send message / queue follow-up' },\n { key: 'Ctrl+T', description: 'Toggle thinking blocks' },\n { key: 'Ctrl+E', description: 'Expand/collapse tool outputs' },\n { key: 'Ctrl+Y', description: 'Toggle YOLO mode' },\n { key: 'Ctrl+Z', description: 'Suspend process (fg to resume)' },\n { key: 'Alt+Z', description: 'Undo last clear' },\n ];\n\n if (modes > 1) {\n shortcuts.push({ key: '⇧+Tab', description: 'Cycle agent modes' });\n }\n\n shortcuts.push({ key: '/', description: 'Commands' }, { key: '!', description: 'Shell' });\n\n return shortcuts;\n}\n\n// =============================================================================\n// Rendering\n// =============================================================================\n\nfunction renderSection(title: string, entries: HelpEntry[]): string {\n const maxKeyLen = Math.max(...entries.map(e => e.key.length));\n const lines = entries.map(e => ` ${e.key.padEnd(maxKeyLen + 2)}${e.description}`).join('\\n');\n return `${title}\\n${lines}`;\n}\n\n/**\n * Build the full help text as a plain string for inline display via showInfo().\n */\nexport function buildHelpText(options: HelpTextOptions): string {\n const sections: string[] = [];\n\n sections.push(renderSection('Commands', getCommands(options.modes)));\n\n if (options.customSlashCommands.length > 0) {\n const customEntries = options.customSlashCommands.map(cmd => ({\n key: `//${cmd.name}`,\n description: cmd.description || 'No description',\n }));\n sections.push(renderSection('Custom Commands', customEntries));\n }\n\n sections.push(renderSection('Shell', [{ key: '!<cmd>', description: 'Run a shell command' }]));\n\n sections.push(renderSection('Keyboard Shortcuts', getShortcuts(options.modes)));\n\n return sections.join('\\n\\n');\n}\n","import { buildHelpText } from '../components/help-overlay.js';\nimport type { SlashCommandContext } from './types.js';\n\nexport function handleHelpCommand(ctx: SlashCommandContext): void {\n const text = buildHelpText({\n modes: ctx.harness.listModes().length,\n customSlashCommands: ctx.customSlashCommands,\n });\n ctx.showInfo(text);\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport function handleCostCommand(ctx: SlashCommandContext): void {\n const formatNumber = (n: number) => n.toLocaleString();\n\n // Read from Harness display state (canonical source)\n const ds = ctx.state.harness.getDisplayState();\n\n let omTokensText = '';\n if (ds.omProgress.observationTokens > 0) {\n omTokensText = `\n Memory: ${formatNumber(ds.omProgress.observationTokens)} tokens`;\n }\n\n ctx.showInfo(`Token Usage (Current Thread):\n Input: ${formatNumber(ds.tokenUsage.promptTokens)} tokens\n Output: ${formatNumber(ds.tokenUsage.completionTokens)} tokens${omTokensText}\n ─────────────────────────────────────────\n Total: ${formatNumber(ds.tokenUsage.totalTokens)} tokens\n \n Note: For cost estimates, check your provider's pricing page.`);\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport function handleYoloCommand(ctx: SlashCommandContext): void {\n const current = (ctx.harness.getState() as any).yolo === true;\n ctx.harness.setState({ yolo: !current } as any);\n ctx.showInfo(!current ? 'YOLO mode ON — tools auto-approved' : 'YOLO mode OFF — tools require approval');\n}\n","/**\n * Thinking level settings component.\n * Simple selector for reasoning depth levels.\n *\n * Changes apply immediately — Esc closes the panel.\n */\n\nimport { Box, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { SelectItem, Focusable } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ThinkingSettingsCallbacks {\n onLevelChange: (level: string) => void;\n onClose: () => void;\n}\n\n// =============================================================================\n// Thinking Levels\n// =============================================================================\n\nexport type ThinkingLevelId = 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n\nexport interface ThinkingLevelOption {\n id: ThinkingLevelId;\n label: string;\n providerValue: 'none' | 'low' | 'medium' | 'high' | 'xhigh';\n description: string;\n}\n\nconst BASE_THINKING_LEVELS: ThinkingLevelOption[] = [\n { id: 'off', label: 'Off', providerValue: 'none', description: 'Reasoning disabled' },\n { id: 'low', label: 'Low', providerValue: 'low', description: 'Light reasoning' },\n { id: 'medium', label: 'Medium', providerValue: 'medium', description: 'Balanced reasoning' },\n { id: 'high', label: 'High', providerValue: 'high', description: 'Deep reasoning' },\n { id: 'xhigh', label: 'Very High', providerValue: 'xhigh', description: 'Maximum reasoning depth' },\n];\n\nfunction isOpenAIModel(modelId: string): boolean {\n return modelId.startsWith('openai/');\n}\n\nexport function getThinkingLevelsForModel(modelId: string): ThinkingLevelOption[] {\n if (!isOpenAIModel(modelId)) {\n return [...BASE_THINKING_LEVELS];\n }\n\n return BASE_THINKING_LEVELS.map(level => ({\n ...level,\n label: level.providerValue,\n }));\n}\n\nexport const THINKING_LEVELS = getThinkingLevelsForModel('');\n\nexport function getThinkingLevelForModel(modelId: string, levelId: string): ThinkingLevelOption {\n return (\n getThinkingLevelsForModel(modelId).find(level => level.id === levelId) ?? getThinkingLevelsForModel(modelId)[0]!\n );\n}\n\n// =============================================================================\n// Thinking Settings Component\n// =============================================================================\n\nexport class ThinkingSettingsComponent extends Box implements Focusable {\n private selectList: SelectList;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(currentLevel: string, callbacks: ThinkingSettingsCallbacks) {\n super(2, 1, (text: string) => theme.bg('overlayBg', text));\n\n // Title\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Thinking Level')), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Extended thinking for Anthropic models'), 0, 0));\n this.addChild(new Spacer(1));\n\n // Build items\n const items: SelectItem[] = THINKING_LEVELS.map(level => ({\n value: level.id,\n label: ` ${level.label} ${theme.fg('dim', level.description)}`,\n }));\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n // Pre-select current level\n const currentIndex = THINKING_LEVELS.findIndex(l => l.id === currentLevel);\n if (currentIndex !== -1) {\n this.selectList.setSelectedIndex(currentIndex);\n }\n\n this.selectList.onSelect = (item: SelectItem) => {\n callbacks.onLevelChange(item.value);\n callbacks.onClose();\n };\n this.selectList.onCancel = callbacks.onClose;\n\n this.addChild(this.selectList);\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('dim', ' Enter to select · Esc to close'), 0, 0));\n }\n\n handleInput(data: string): void {\n this.selectList.handleInput(data);\n }\n}\n","import { Box, SelectList, Spacer, Text, isKeyRelease } from '@mariozechner/pi-tui';\nimport type { SelectItem } from '@mariozechner/pi-tui';\n\nimport type { ThinkingLevelSetting } from '../../onboarding/settings.js';\nimport { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport {\n THINKING_LEVELS,\n getThinkingLevelForModel,\n getThinkingLevelsForModel,\n} from '../components/thinking-settings.js';\nimport { theme, getSelectListTheme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\n/** Models that support reasoning effort. */\nfunction supportsThinking(modelId: string): boolean {\n return modelId.startsWith('openai/');\n}\n\nfunction getThinkingStatusLine(modelId: string, levelId: string): string {\n const level = getThinkingLevelForModel(modelId, levelId);\n return `Thinking: ${level.label}`;\n}\n\nfunction isThinkingLevelSetting(level: string): level is ThinkingLevelSetting {\n return THINKING_LEVELS.some(option => option.id === level);\n}\n\nfunction persistGlobalThinkingLevel(level: ThinkingLevelSetting): void {\n const settings = loadSettingsCached();\n settings.preferences.thinkingLevel = level;\n saveSettings(settings);\n}\n\nfunction getModelNote(ctx: SlashCommandContext): string | null {\n const modelId = ctx.state.harness.getCurrentModelId() ?? '';\n if (!modelId) return 'No model selected.';\n if (!supportsThinking(modelId)) {\n return `Warning: current model (${modelId}) may not support reasoning effort. Setting will be saved but may not take effect.`;\n }\n return null;\n}\n\nexport async function handleThinkCommand(ctx: SlashCommandContext, args: string[] = []): Promise<void> {\n const currentLevel = ((ctx.harness.getState() as any)?.thinkingLevel ?? 'off') as string;\n const modelId = ctx.state.harness.getCurrentModelId() ?? '';\n const thinkingLevels = getThinkingLevelsForModel(modelId);\n const arg = args[0]?.toLowerCase();\n\n if (arg === 'status') {\n ctx.showInfo(getThinkingStatusLine(modelId, currentLevel));\n return;\n }\n\n // Direct level argument: /think high\n if (arg) {\n const selected = thinkingLevels.find(l => l.id === arg);\n if (!selected) {\n ctx.showInfo(\n `Invalid thinking level: ${arg}. Use one of: ${THINKING_LEVELS.map(l => l.id).join(', ')} or 'status'.`,\n );\n return;\n }\n const note = getModelNote(ctx);\n await ctx.harness.setState({ thinkingLevel: selected.id } as any);\n persistGlobalThinkingLevel(selected.id);\n ctx.showInfo(getThinkingStatusLine(modelId, selected.id) + (note ? ` (${note})` : ''));\n return;\n }\n\n // No argument: show inline selector\n const items: SelectItem[] = thinkingLevels.map(l => ({\n value: l.id,\n label: ` ${l.label} ${theme.fg('dim', l.description)}${l.id === currentLevel ? theme.fg('dim', ' (current)') : ''}`,\n }));\n\n const modelNote = getModelNote(ctx);\n\n return new Promise<void>(resolve => {\n const container = new Box(1, 1);\n container.addChild(new Text(theme.bold(theme.fg('accent', 'Thinking Level')), 0, 0));\n container.addChild(new Spacer(1));\n if (modelNote) {\n container.addChild(new Text(theme.fg('warning', modelNote), 0, 0));\n container.addChild(new Spacer(1));\n }\n\n const selectList = new SelectList(items, items.length, getSelectListTheme());\n\n selectList.onSelect = async (item: SelectItem) => {\n ctx.state.activeInlineQuestion = undefined;\n const selectedLevel = item.value;\n if (!isThinkingLevelSetting(selectedLevel)) {\n collapseResult('cancelled');\n ctx.state.ui.requestRender();\n resolve();\n return;\n }\n\n try {\n await ctx.harness.setState({ thinkingLevel: selectedLevel } as any);\n persistGlobalThinkingLevel(selectedLevel);\n const selectedLabel = getThinkingLevelForModel(modelId, selectedLevel).label;\n collapseResult(\n `Thinking → ${theme.bold(selectedLevel === currentLevel ? `${selectedLabel} (unchanged)` : selectedLabel)}`,\n );\n } catch {\n collapseResult('cancelled');\n } finally {\n ctx.state.ui.requestRender();\n resolve();\n }\n };\n\n selectList.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n collapseResult('cancelled');\n ctx.state.ui.requestRender();\n resolve();\n };\n\n container.addChild(selectList);\n container.addChild(new Spacer(1));\n container.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc cancel'), 0, 0));\n\n // Pre-select current level (after adding to container, matching models-pack pattern)\n const currentIdx = thinkingLevels.findIndex(l => l.id === currentLevel);\n if (currentIdx > 0) selectList.setSelectedIndex(currentIdx);\n\n const collapseResult = (result: string) => {\n container.clear();\n if (result === 'cancelled') {\n container.addChild(new Text(theme.fg('dim', `${theme.fg('error', '✗')} Thinking level (cancelled)`), 0, 0));\n } else {\n container.addChild(new Text(theme.fg('text', `${theme.fg('success', '✓')} ${result}`), 0, 0));\n }\n };\n\n // Route input through activeInlineQuestion (filter key releases from Kitty protocol)\n const inputShim = {\n handleInput: (data: string) => {\n if (isKeyRelease(data)) return;\n selectList.handleInput(data);\n },\n } as any;\n ctx.state.activeInlineQuestion = inputShim;\n\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(container);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handlePermissionsCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n if (args[0] === 'set' && args.length >= 3) {\n const category = args[1] as any;\n const policy = args[2] as any;\n const validCategories = ['read', 'edit', 'execute', 'mcp'];\n const validPolicies = ['allow', 'ask', 'deny'];\n if (!validCategories.includes(category)) {\n ctx.showInfo(`Invalid category: ${category}. Must be one of: ${validCategories.join(', ')}`);\n return;\n }\n if (!validPolicies.includes(policy)) {\n ctx.showInfo(`Invalid policy: ${policy}. Must be one of: ${validPolicies.join(', ')}`);\n return;\n }\n ctx.harness.setPermissionForCategory({ category, policy });\n ctx.showInfo(`Set ${category} policy to: ${policy}`);\n return;\n }\n await showPermissions(ctx);\n}\n\nasync function showPermissions(ctx: SlashCommandContext): Promise<void> {\n const { TOOL_CATEGORIES, getToolsForCategory } = await import('../../permissions.js');\n const rules = ctx.harness.getPermissionRules();\n const grants = ctx.harness.getSessionGrants();\n const isYolo = (ctx.harness.getState() as any).yolo === true;\n\n const lines: string[] = [];\n lines.push('Tool Approval Permissions');\n lines.push('─'.repeat(40));\n\n if (isYolo) {\n lines.push('');\n lines.push('⚡ YOLO mode is ON — all tools are auto-approved');\n lines.push(' Use /yolo to toggle off');\n }\n\n lines.push('');\n lines.push('Category Policies:');\n for (const [cat, meta] of Object.entries(TOOL_CATEGORIES)) {\n const policy = rules.categories[cat as keyof typeof rules.categories] || 'ask';\n const sessionGranted = grants.categories.includes(cat as any);\n const tools = getToolsForCategory(cat as any);\n const status = sessionGranted ? `${policy} (session: always allow)` : policy;\n lines.push(` ${meta.label.padEnd(12)} ${status.padEnd(16)} tools: ${tools.join(', ')}`);\n }\n\n if (Object.keys(rules.tools).length > 0) {\n lines.push('');\n lines.push('Per-tool Overrides:');\n for (const [tool, policy] of Object.entries(rules.tools)) {\n lines.push(` ${tool.padEnd(24)} ${policy}`);\n }\n }\n\n if (grants.categories.length > 0 || grants.tools.length > 0) {\n lines.push('');\n lines.push('Session Grants (reset on restart):');\n if (grants.categories.length > 0) {\n lines.push(` Categories: ${grants.categories.join(', ')}`);\n }\n if (grants.tools.length > 0) {\n lines.push(` Tools: ${grants.tools.join(', ')}`);\n }\n }\n\n lines.push('');\n lines.push('Commands:');\n lines.push(' /permissions set <category> <allow|ask|deny>');\n lines.push(' /yolo — toggle auto-approve all tools');\n\n ctx.showInfo(lines.join('\\n'));\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleNameCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const title = args.join(' ').trim();\n if (!title) {\n ctx.showInfo('Usage: /name <title>');\n return;\n }\n if (!ctx.harness.getCurrentThreadId()) {\n ctx.showInfo('No active thread. Send a message first.');\n return;\n }\n await ctx.harness.renameThread({ title });\n ctx.showInfo(`Thread renamed to: ${title}`);\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport function handleExitCommand(ctx: SlashCommandContext): void {\n ctx.stop();\n process.exit(0);\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport function handleHooksCommand(ctx: SlashCommandContext, args: string[]): void {\n const hm = ctx.hookManager;\n if (!hm) {\n ctx.showInfo('Hooks system not initialized.');\n return;\n }\n\n const subcommand = args[0];\n if (subcommand === 'reload') {\n hm.reload();\n ctx.showInfo('Hooks config reloaded.');\n return;\n }\n\n const paths = hm.getConfigPaths();\n\n if (!hm.hasHooks()) {\n ctx.showInfo(\n `No hooks configured.\\n\\n` +\n `Add hooks to:\\n` +\n ` ${paths.project} (project)\\n` +\n ` ${paths.global} (global)\\n\\n` +\n `Example hooks.json:\\n` +\n ` {\\n` +\n ` \"PreToolUse\": [{\\n` +\n ` \"type\": \"command\",\\n` +\n ` \"command\": \"echo 'tool called'\",\\n` +\n ` \"matcher\": { \"tool_name\": \"execute_command\" }\\n` +\n ` }]\\n` +\n ` }`,\n );\n return;\n }\n\n const hookConfig = hm.getConfig();\n const lines: string[] = [`Hooks Configuration:`];\n lines.push(` Project: ${paths.project}`);\n lines.push(` Global: ${paths.global}`);\n lines.push('');\n\n const eventNames = ['PreToolUse', 'PostToolUse', 'Stop', 'UserPromptSubmit', 'SessionStart', 'SessionEnd'] as const;\n\n for (const event of eventNames) {\n const hooks = hookConfig[event];\n if (hooks && hooks.length > 0) {\n lines.push(` ${event} (${hooks.length} hook${hooks.length > 1 ? 's' : ''}):`);\n for (const hook of hooks) {\n const matcherStr = hook.matcher?.tool_name ? ` [tool: ${hook.matcher.tool_name}]` : '';\n const desc = hook.description ? ` - ${hook.description}` : '';\n lines.push(` ${hook.command}${matcherStr}${desc}`);\n }\n }\n }\n\n lines.push('');\n lines.push(` /hooks reload - Reload config from disk`);\n\n ctx.showInfo(lines.join('\\n'));\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleMcpCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const mm = ctx.mcpManager;\n if (!mm) {\n ctx.showInfo('MCP system not initialized.');\n return;\n }\n\n const subcommand = args[0];\n if (subcommand === 'reload') {\n ctx.showInfo('MCP: Reconnecting to servers...');\n try {\n await mm.reload();\n const statuses = mm.getServerStatuses();\n const connected = statuses.filter(s => s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n ctx.showInfo(`MCP: Reloaded. ${connected.length} server(s) connected, ${totalTools} tool(s).`);\n } catch (error) {\n ctx.showError(`MCP reload failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n return;\n }\n\n const paths = mm.getConfigPaths();\n\n if (!mm.hasServers()) {\n ctx.showInfo(\n `No MCP servers configured.\\n\\n` +\n `Add servers to:\\n` +\n ` ${paths.project} (project)\\n` +\n ` ${paths.global} (global)\\n` +\n ` ${paths.claude} (Claude Code compat)\\n\\n` +\n `Example mcp.json:\\n` +\n ` {\\n` +\n ` \"mcpServers\": {\\n` +\n ` \"filesystem\": {\\n` +\n ` \"command\": \"npx\",\\n` +\n ` \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/path\"],\\n` +\n ` \"env\": {}\\n` +\n ` },\\n` +\n ` \"remote-api\": {\\n` +\n ` \"url\": \"https://mcp.example.com/sse\",\\n` +\n ` \"headers\": { \"Authorization\": \"Bearer <token>\" }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n\\n` +\n `Note: For dynamic auth (token refresh), use a stdio wrapper.\\n` +\n `\"headers\" only supports static values.`,\n );\n return;\n }\n\n const statuses = mm.getServerStatuses();\n const skipped = mm.getSkippedServers();\n const lines: string[] = [`MCP Servers:`];\n lines.push(` Project: ${paths.project}`);\n lines.push(` Global: ${paths.global}`);\n lines.push(` Claude: ${paths.claude}`);\n lines.push('');\n\n for (const status of statuses) {\n const icon = status.connected ? '\\u2713' : '\\u2717';\n const state = status.connected ? 'connected' : `error: ${status.error}`;\n lines.push(` ${icon} ${status.name} [${status.transport}] (${state})`);\n if (status.toolNames.length > 0) {\n for (const toolName of status.toolNames) {\n lines.push(` - ${toolName}`);\n }\n }\n }\n\n if (skipped.length > 0) {\n lines.push('');\n lines.push(' Skipped:');\n for (const s of skipped) {\n lines.push(` \\u2717 ${s.name}: ${s.reason}`);\n }\n }\n\n lines.push('');\n lines.push(` /mcp reload - Disconnect and reconnect all servers`);\n\n ctx.showInfo(lines.join('\\n'));\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleModeCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const modes = ctx.harness.listModes();\n if (modes.length <= 1) {\n ctx.showInfo('Only one mode available');\n return;\n }\n if (args[0]) {\n try {\n await ctx.harness.switchMode({ modeId: args[0] });\n } catch (err) {\n ctx.showError(`Failed to switch mode: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n const currentMode = ctx.harness.getCurrentMode();\n const modeList = modes\n .map(m => ` ${m.id === currentMode?.id ? '* ' : ' '}${m.id}${m.name ? ` - ${m.name}` : ''}`)\n .join('\\n');\n ctx.showInfo(`Modes:\\n${modeList}`);\n }\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleSkillsCommand(ctx: SlashCommandContext): Promise<void> {\n // Eagerly resolve workspace if not yet cached (e.g. /skills called before first message)\n let workspace = ctx.getResolvedWorkspace();\n if (!workspace && ctx.harness.hasWorkspace()) {\n try {\n workspace = await ctx.harness.resolveWorkspace();\n } catch (error) {\n ctx.showError(`Failed to resolve workspace: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n }\n if (!workspace?.skills) {\n ctx.showInfo(\n 'No skills configured.\\n\\n' +\n 'Add skills to any of these locations:\\n' +\n ' .ulicode/skills/ (project-local)\\n' +\n ' .uli-cli/skills/ (temporary compatibility path)\\n' +\n ' .pulse/skills/ (legacy project-local)\\n' +\n ' .mastracode/skills/ (legacy project-local)\\n' +\n ' .claude/skills/ (project-local)\\n' +\n ' ~/.ulicode/skills/ (global)\\n' +\n ' ~/.uli-cli/skills/ (temporary compatibility path)\\n' +\n ' ~/.pulse/skills/ (legacy global)\\n' +\n ' ~/.mastracode/skills/ (legacy global)\\n' +\n ' ~/.claude/skills/ (global)\\n\\n' +\n 'Each skill is a folder with a SKILL.md file.\\n' +\n 'Install skills: npx add-skill <github-url>',\n );\n return;\n }\n\n try {\n const skills = await workspace.skills!.list();\n\n if (skills.length === 0) {\n ctx.showInfo(\n 'No skills found in configured directories.\\n\\n' +\n 'Each skill needs a SKILL.md file with YAML frontmatter.\\n' +\n 'Install skills: npx add-skill <github-url>',\n );\n return;\n }\n\n const skillLines = skills.map(skill => {\n const desc = skill.description\n ? ` - ${skill.description.length > 60 ? skill.description.slice(0, 57) + '...' : skill.description}`\n : '';\n return ` ${skill.name}${desc}`;\n });\n\n ctx.showInfo(\n `Skills (${skills.length}):\\n${skillLines.join('\\n')}\\n\\n` +\n 'Skills are automatically activated by the agent when relevant.',\n );\n } catch (error) {\n ctx.showError(`Failed to list skills: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport function handleNewCommand(ctx: SlashCommandContext): void {\n const { state } = ctx;\n\n state.pendingNewThread = true;\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n // Clear file tracking in display state (thread_created will also reset this)\n state.harness.getDisplayState().modifiedFiles.clear();\n if (state.taskProgress) {\n state.taskProgress.updateTasks([]);\n }\n state.taskWriteInsertIndex = -1;\n\n ctx.updateStatusLine();\n state.ui.requestRender();\n ctx.showInfo('Ready for new conversation');\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { TUIState } from '../state.js';\nimport type { SlashCommandContext } from './types.js';\n\n/** Minimal interface accepted by resetUIAfterClone so it works from both\n * slash-command handlers (SlashCommandContext) and the MastraTUI class. */\ninterface CloneResetContext {\n state: TUIState;\n updateStatusLine: () => void;\n renderExistingMessages: () => Promise<void>;\n showInfo: (message: string) => void;\n}\n\n/**\n * Confirm whether the user wants to clone a thread. Returns true if\n * confirmed, false on cancel or \"No\".\n */\nexport function confirmClone(state: TUIState, threadLabel?: string): Promise<boolean> {\n const label = threadLabel ? `Clone thread \"${threadLabel}\"?` : 'Clone the current thread?';\n return new Promise<boolean>(resolve => {\n const question = new AskQuestionInlineComponent(\n {\n question: label,\n options: [\n { label: 'Yes', description: 'Clone this thread' },\n { label: 'No', description: 'Cancel' },\n ],\n formatResult: answer => (answer === 'Yes' ? 'Cloning thread...' : 'Cancelled.'),\n isNegativeAnswer: answer => answer !== 'Yes',\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n resolve(answer === 'Yes');\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n resolve(false);\n },\n },\n state.ui,\n );\n\n state.activeInlineQuestion = question;\n state.chatContainer.addChild(question);\n state.chatContainer.addChild(new Spacer(1));\n state.ui.requestRender();\n state.chatContainer.invalidate();\n });\n}\n\n/**\n * Prompt for an optional clone name. Returns the trimmed name, or null\n * if the user presses Esc or submits an empty string.\n */\nexport function askCloneName(state: TUIState): Promise<string | null> {\n return new Promise<string | null>(resolve => {\n const question = new AskQuestionInlineComponent(\n {\n question: 'Give the cloned thread a name? (Esc to skip)',\n formatResult: answer => `Thread name: ${answer}`,\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n const trimmed = answer.trim();\n resolve(trimmed.length > 0 ? trimmed : null);\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n resolve(null);\n },\n },\n state.ui,\n );\n\n state.activeInlineQuestion = question;\n state.chatContainer.addChild(question);\n state.chatContainer.addChild(new Spacer(1));\n state.ui.requestRender();\n state.chatContainer.invalidate();\n });\n}\n\n/**\n * Shared post-clone UI reset: clears chat, tools, tasks, re-renders messages,\n * and shows an info banner. Every clone path should call this after\n * `harness.cloneThread()` succeeds.\n */\nexport async function resetUIAfterClone(ctx: CloneResetContext, clonedTitle: string): Promise<void> {\n const { state } = ctx;\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n state.harness.getDisplayState().modifiedFiles.clear();\n if (state.taskProgress) {\n state.taskProgress.updateTasks([]);\n }\n state.taskWriteInsertIndex = -1;\n\n ctx.updateStatusLine();\n await ctx.renderExistingMessages();\n state.ui.requestRender();\n ctx.showInfo(`Cloned thread: ${clonedTitle}`);\n}\n\nexport async function handleCloneCommand(ctx: SlashCommandContext): Promise<void> {\n const { state } = ctx;\n\n const currentThreadId = state.harness.getCurrentThreadId();\n if (!currentThreadId) {\n ctx.showInfo('No active thread to clone');\n return;\n }\n\n // Step 1: Confirm / Cancel\n if (!(await confirmClone(state))) return;\n\n // Step 2: Optional rename\n const customTitle = await askCloneName(state);\n\n try {\n const clonedThread = await state.harness.cloneThread({\n sourceThreadId: currentThreadId,\n ...(customTitle ? { title: customTitle } : {}),\n });\n\n await resetUIAfterClone(ctx, clonedThread.title || clonedThread.id);\n } catch (error) {\n ctx.showError(`Failed to clone thread: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleResourceCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const { state, harness } = ctx;\n const sub = args[0]?.trim();\n const current = harness.getResourceId();\n const defaultId = harness.getDefaultResourceId();\n\n if (!sub) {\n const knownIds = await harness.getKnownResourceIds();\n const isOverridden = current !== defaultId;\n const lines = [\n `Current: ${current}${isOverridden ? ` (auto-detected: ${defaultId})` : ''}`,\n '',\n 'Known resource IDs:',\n ...knownIds.map((id: string) => ` ${id === current ? '* ' : ' '}${id}`),\n '',\n 'Usage:',\n ' /resource - Show current resource and known IDs',\n ' /resource <id> - Switch to a resource ID (resumes latest thread)',\n ' /resource reset - Reset to auto-detected ID',\n ];\n ctx.showInfo(lines.join('\\n'));\n return;\n }\n\n const newId = sub === 'reset' ? defaultId : args.join(' ').trim();\n\n if (newId === current) {\n ctx.showInfo(`Already on resource: ${current}`);\n return;\n }\n\n harness.setResourceId({ resourceId: newId });\n\n // Try to resume the most recent thread for this resource\n const threads = await harness.listThreads();\n const latest = [...threads].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())[0];\n\n if (latest) {\n await harness.switchThread({ threadId: latest.id });\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n state.pendingNewThread = false;\n await ctx.renderExistingMessages();\n ctx.showInfo(\n sub === 'reset'\n ? `Resource ID reset to: ${defaultId} — resumed thread: ${latest.title || latest.id}`\n : `Switched to resource: ${newId} — resumed thread: ${latest.title || latest.id}`,\n );\n } else {\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n state.pendingNewThread = true;\n ctx.showInfo(\n sub === 'reset'\n ? `Resource ID reset to: ${defaultId} (no existing threads, a new one will be created)`\n : `Switched to resource: ${newId} (no existing threads, a new one will be created)`,\n );\n }\n\n ctx.updateStatusLine();\n state.ui.requestRender();\n}\n","/**\n * Component that renders git diff output with syntax highlighting.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { theme, mastra } from '../theme.js';\n\nfunction colorizeDiffLine(line: string): string {\n const t = theme.getTheme();\n const addedColor = chalk.hex(t.success);\n const hunkHeaderColor = chalk.hex(t.toolBorderPending);\n const fileHeaderColor = chalk.bold.hex(t.accent);\n const removedColor = chalk.hex(mastra.red);\n const metaColor = chalk.hex(mastra.mainGray);\n\n // Unified diff headers\n if (line.startsWith('+++') || line.startsWith('---')) {\n return fileHeaderColor(line);\n }\n if (line.startsWith('diff ')) {\n return fileHeaderColor(line);\n }\n if (line.startsWith('@@')) {\n return hunkHeaderColor(line);\n }\n if (line.startsWith('+')) {\n return addedColor(line);\n }\n if (line.startsWith('-')) {\n return removedColor(line);\n }\n if (\n line.startsWith('index ') ||\n line.startsWith('new file') ||\n line.startsWith('deleted file') ||\n line.startsWith('similarity') ||\n line.startsWith('rename')\n ) {\n return metaColor(line);\n }\n // --stat lines: \" file | 5 +++--\" or summary \"2 files changed, ...\"\n const statMatch = line.match(/^(.+\\|.+?)(\\++)([- ]*)$/);\n if (statMatch) {\n return statMatch[1] + addedColor(statMatch[2]) + removedColor(statMatch[3]);\n }\n if (/^\\s*\\d+ files? changed/.test(line)) {\n return line\n .replace(/(\\d+ insertions?\\(\\+\\))/, addedColor('$1'))\n .replace(/(\\d+ deletions?\\(-\\))/, removedColor('$1'));\n }\n return line;\n}\n\nexport class DiffOutputComponent extends Container {\n constructor(command: string, diffOutput: string) {\n super();\n this.addChild(new Spacer(1));\n\n // Command header\n this.addChild(\n new Text(`${theme.fg('success', '✓')} ${theme.bold(theme.fg('muted', '$'))} ${theme.fg('text', command)}`, 1, 0),\n );\n\n const output = diffOutput.trimEnd();\n if (output) {\n const lines = output.split('\\n');\n for (const line of lines) {\n this.addChild(new Text(` ${colorizeDiffLine(line)}`, 0, 0));\n }\n }\n }\n}\n","import { DiffOutputComponent } from '../components/diff-output.js';\nimport { theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\nexport async function handleDiffCommand(ctx: SlashCommandContext, filePath?: string): Promise<void> {\n const { state } = ctx;\n\n if (filePath) {\n try {\n const { execa } = await import('execa');\n const result = await execa('git', ['diff', filePath], {\n cwd: process.cwd(),\n reject: false,\n });\n\n if (!result.stdout.trim()) {\n const staged = await execa('git', ['diff', '--cached', filePath], {\n cwd: process.cwd(),\n reject: false,\n });\n if (!staged.stdout.trim()) {\n ctx.showInfo(`No changes detected for: ${filePath}`);\n return;\n }\n const component = new DiffOutputComponent(`git diff --cached ${filePath}`, staged.stdout);\n state.chatContainer.addChild(component);\n state.ui.requestRender();\n return;\n }\n\n const component = new DiffOutputComponent(`git diff ${filePath}`, result.stdout);\n state.chatContainer.addChild(component);\n state.ui.requestRender();\n } catch (error) {\n ctx.showError(error instanceof Error ? error.message : 'Failed to get diff');\n }\n return;\n }\n\n // No path specified — show summary of all tracked modified files\n // Read from Harness display state (canonical source for file modifications)\n const modifiedFiles = state.harness.getDisplayState().modifiedFiles;\n if (modifiedFiles.size === 0) {\n try {\n const { execa } = await import('execa');\n const result = await execa('git', ['diff', '--stat'], {\n cwd: process.cwd(),\n reject: false,\n });\n const staged = await execa('git', ['diff', '--cached', '--stat'], {\n cwd: process.cwd(),\n reject: false,\n });\n\n const output = [result.stdout, staged.stdout].filter(Boolean).join('\\n');\n if (output.trim()) {\n const component = new DiffOutputComponent('git diff --stat', output);\n state.chatContainer.addChild(component);\n state.ui.requestRender();\n } else {\n ctx.showInfo('No file changes detected in this session or working tree.');\n }\n } catch {\n ctx.showInfo('No file changes tracked in this session.');\n }\n return;\n }\n\n const lines: string[] = [`Modified files (${modifiedFiles.size}):`];\n for (const [fp, info] of modifiedFiles) {\n const opCounts = new Map<string, number>();\n for (const op of info.operations) {\n opCounts.set(op, (opCounts.get(op) || 0) + 1);\n }\n const ops = Array.from(opCounts.entries())\n .map(([op, count]) => (count > 1 ? `${op}×${count}` : op))\n .join(', ');\n lines.push(` ${theme.fg('path', fp)} ${theme.fg('muted', `(${ops})`)}`);\n }\n lines.push('');\n lines.push(theme.fg('muted', 'Use /diff <path> to see the git diff for a specific file.'));\n\n ctx.showInfo(lines.join('\\n'));\n}\n","/**\n * Thread selector component for switching between conversation threads.\n * Uses pi-tui overlay pattern with search and navigation.\n */\n\nimport { Box, Container, fuzzyFilter, getEditorKeybindings, Input, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport type { HarnessThread } from '@mastra/core/harness';\nimport { theme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ThreadSelectorOptions {\n tui: TUI;\n threads: HarnessThread[];\n currentThreadId: string | null;\n /** Current resource ID — threads from this resource sort to the top */\n currentResourceId?: string;\n /** Current project root path — threads tagged with this directory sort above other same-resource threads */\n currentProjectPath?: string;\n onSelect: (thread: HarnessThread) => void;\n onCancel: () => void;\n /** Called when user presses 'c' to clone the selected thread */\n onClone?: (thread: HarnessThread) => void;\n /** Function to fetch message preview for a thread */\n getMessagePreview?: (threadId: string) => Promise<string | null>;\n}\n\n// =============================================================================\n// ThreadSelectorComponent\n// =============================================================================\n\nexport class ThreadSelectorComponent extends Box implements Focusable {\n private searchInput!: Input;\n private listContainer!: Container;\n private allThreads: HarnessThread[];\n private filteredThreads: HarnessThread[];\n private selectedIndex = 0;\n private currentThreadId: string | null;\n private currentResourceId: string | undefined;\n private currentProjectPath: string | undefined;\n private onSelectCallback: (thread: HarnessThread) => void;\n private onCancelCallback: () => void;\n private onCloneCallback: ((thread: HarnessThread) => void) | undefined;\n private tui: TUI;\n private getMessagePreview: ((threadId: string) => Promise<string | null>) | undefined;\n private messagePreviews: Map<string, string> = new Map();\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n this.searchInput.focused = value;\n }\n\n constructor(options: ThreadSelectorOptions) {\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.tui = options.tui;\n this.currentResourceId = options.currentResourceId;\n this.currentProjectPath = options.currentProjectPath;\n this.allThreads = this.sortThreads(options.threads, options.currentThreadId);\n this.currentThreadId = options.currentThreadId;\n this.onSelectCallback = options.onSelect;\n this.onCancelCallback = options.onCancel;\n this.onCloneCallback = options.onClone;\n this.getMessagePreview = options.getMessagePreview;\n this.filteredThreads = this.allThreads;\n\n this.buildUI();\n this.loadMessagePreviews();\n }\n\n private async loadMessagePreviews(): Promise<void> {\n if (!this.getMessagePreview) return;\n\n // Load previews for all threads\n for (const thread of this.allThreads) {\n try {\n const preview = await this.getMessagePreview(thread.id);\n if (preview) {\n this.messagePreviews.set(thread.id, preview);\n }\n } catch {\n // Ignore errors, preview will just be empty\n }\n }\n this.updateList();\n this.tui.requestRender();\n }\n\n private buildUI(): void {\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Select Thread')), 0, 0));\n this.addChild(new Spacer(1));\n const cloneHint = this.onCloneCallback ? ' • c clone' : '';\n this.addChild(\n new Text(theme.fg('muted', `Type to search • ↑↓ navigate • Enter select${cloneHint} • Esc cancel`), 0, 0),\n );\n this.addChild(new Spacer(1));\n\n this.searchInput = new Input();\n this.searchInput.onSubmit = () => {\n const selected = this.filteredThreads[this.selectedIndex];\n if (selected) {\n this.onSelectCallback(selected);\n }\n };\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n this.updateList();\n }\n\n private sortThreads(threads: HarnessThread[], currentThreadId: string | null): HarnessThread[] {\n const sorted = [...threads];\n const resId = this.currentResourceId;\n const projPath = this.currentProjectPath;\n sorted.sort((a, b) => {\n // Current thread first\n if (a.id === currentThreadId) return -1;\n if (b.id === currentThreadId) return 1;\n // Current resource threads before other resources\n if (resId) {\n const aLocal = a.resourceId === resId;\n const bLocal = b.resourceId === resId;\n if (aLocal && !bLocal) return -1;\n if (!aLocal && bLocal) return 1;\n }\n // Within the same resource, threads tagged with the current directory first\n if (projPath && a.resourceId === b.resourceId) {\n const aDir = typeof a.metadata?.projectPath === 'string' && a.metadata.projectPath === projPath;\n const bDir = typeof b.metadata?.projectPath === 'string' && b.metadata.projectPath === projPath;\n if (aDir && !bDir) return -1;\n if (!aDir && bDir) return 1;\n }\n // Then by most recently updated\n return b.updatedAt.getTime() - a.updatedAt.getTime();\n });\n return sorted;\n }\n\n private filterThreads(query: string): void {\n this.filteredThreads = query\n ? fuzzyFilter(\n this.allThreads,\n query,\n t =>\n `${t.title ?? ''} ${t.resourceId} ${t.id} ${typeof t.metadata?.projectPath === 'string' ? t.metadata.projectPath : ''}`,\n )\n : this.allThreads;\n\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredThreads.length - 1));\n this.updateList();\n }\n\n private formatTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const maxVisible = 12;\n const startIndex = Math.max(\n 0,\n Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredThreads.length - maxVisible),\n );\n const endIndex = Math.min(startIndex + maxVisible, this.filteredThreads.length);\n\n for (let i = startIndex; i < endIndex; i++) {\n const thread = this.filteredThreads[i];\n if (!thread) continue;\n\n const isSelected = i === this.selectedIndex;\n const isCurrent = thread.id === this.currentThreadId;\n const checkmark = isCurrent ? theme.fg('success', ' ✓') : '';\n const shortId = thread.id.slice(-6);\n const threadPath = thread.metadata?.projectPath as string | undefined;\n const pathTag = threadPath ? theme.fg('dim', ` [${threadPath.split('/').pop()}]`) : '';\n const displayId = `${thread.resourceId}/${shortId}`;\n const timeAgo = theme.fg('muted', ` (${this.formatTimeAgo(thread.updatedAt)})`);\n\n // Only show custom titles (not auto-generated \"New Thread\")\n const hasCustomTitle = thread.title && thread.title !== 'New Thread';\n\n let line = '';\n if (isSelected) {\n line = theme.fg('accent', `→ ${displayId}`) + pathTag + timeAgo + checkmark;\n } else {\n line = ` ${displayId}` + pathTag + timeAgo + checkmark;\n }\n\n this.listContainer.addChild(new Text(line, 0, 0));\n\n // Show message preview or custom title on second line\n const preview = this.messagePreviews.get(thread.id);\n if (preview) {\n this.listContainer.addChild(new Text(` ${theme.fg('muted', `\"${preview}\"`)}`, 0, 0));\n } else if (hasCustomTitle) {\n this.listContainer.addChild(new Text(` ${theme.fg('muted', `\"${thread.title}\"`)}`, 0, 0));\n }\n }\n\n if (startIndex > 0 || endIndex < this.filteredThreads.length) {\n const scrollInfo = theme.fg('muted', `(${this.selectedIndex + 1}/${this.filteredThreads.length})`);\n this.listContainer.addChild(new Text(scrollInfo, 0, 0));\n }\n\n if (this.filteredThreads.length === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No matching threads'), 0, 0));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n if (kb.matches(keyData, 'selectUp')) {\n if (this.filteredThreads.length === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? this.filteredThreads.length - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(keyData, 'selectDown')) {\n if (this.filteredThreads.length === 0) return;\n this.selectedIndex = this.selectedIndex === this.filteredThreads.length - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(keyData, 'selectConfirm')) {\n const selected = this.filteredThreads[this.selectedIndex];\n if (selected) {\n this.onSelectCallback(selected);\n }\n } else if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n } else if (keyData === 'c' && this.onCloneCallback && !this.searchInput.getValue()) {\n const selected = this.filteredThreads[this.selectedIndex];\n if (selected) {\n this.onCloneCallback(selected);\n }\n } else {\n this.searchInput.handleInput(keyData);\n this.filterThreads(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport type { HarnessMessage } from '@mastra/core/harness';\nimport { ThreadLockError } from '../../utils/thread-lock.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { ThreadSelectorComponent } from '../components/thread-selector.js';\nimport { askCloneName, confirmClone, resetUIAfterClone } from './clone.js';\nimport type { SlashCommandContext } from './types.js';\n\nfunction extractTextContent(message: HarnessMessage): string {\n return message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n .trim();\n}\n\nfunction truncatePreview(text: string, maxLength = 50): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n}\n\nexport function showThreadLockPrompt(\n ctx: SlashCommandContext,\n threadTitle: string,\n ownerPid: number,\n lockedThreadId?: string,\n): void {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Thread \"${threadTitle}\" is locked by pid ${ownerPid}. What would you like to do?`,\n options: [\n { label: 'Switch thread', description: 'Pick a different thread' },\n { label: 'New thread', description: 'Start a fresh thread' },\n ...(lockedThreadId ? [{ label: 'Clone thread', description: 'Fork from this thread' }] : []),\n { label: 'Exit', description: 'Exit' },\n ],\n formatResult: answer => {\n if (answer === 'Switch thread') return 'Opening thread selector...';\n if (answer === 'Clone thread') return 'Cloning thread...';\n if (answer === 'New thread') return 'Starting new thread.';\n return 'Exiting.';\n },\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n if (answer === 'Switch thread') {\n await handleThreadsCommand(ctx);\n } else if (answer === 'Clone thread' && lockedThreadId) {\n try {\n const customTitle = await askCloneName(ctx.state);\n const clonedThread = await ctx.state.harness.cloneThread({\n sourceThreadId: lockedThreadId,\n ...(customTitle ? { title: customTitle } : {}),\n });\n ctx.state.pendingNewThread = false;\n await resetUIAfterClone(ctx, clonedThread.title || clonedThread.id);\n } catch (error) {\n ctx.showError(`Failed to clone thread: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else if (answer === 'New thread') {\n // pendingNewThread is already true from the caller\n } else {\n process.exit(0);\n }\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n process.exit(0);\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n}\n\nexport async function handleThreadsCommand(ctx: SlashCommandContext): Promise<void> {\n const { state } = ctx;\n const threads = await state.harness.listThreads({ allResources: true });\n const currentId = state.pendingNewThread ? null : state.harness.getCurrentThreadId();\n const currentResourceId = state.harness.getResourceId();\n\n if (threads.length === 0) {\n ctx.showInfo('No threads yet. Send a message to create one.');\n return;\n }\n\n return new Promise(resolve => {\n const selector = new ThreadSelectorComponent({\n tui: state.ui,\n threads,\n currentThreadId: currentId,\n currentResourceId,\n currentProjectPath: state.projectInfo.rootPath,\n getMessagePreview: async (threadId: string) => {\n const firstUserMessage = await state.harness.getFirstUserMessageForThread({ threadId });\n if (firstUserMessage) {\n const text = extractTextContent(firstUserMessage);\n return truncatePreview(text);\n }\n return null;\n },\n onSelect: async thread => {\n state.ui.hideOverlay();\n\n if (thread.id === currentId) {\n resolve();\n return;\n }\n\n if (thread.resourceId !== currentResourceId) {\n state.harness.setResourceId({ resourceId: thread.resourceId });\n }\n try {\n await state.harness.switchThread({ threadId: thread.id });\n } catch (error) {\n if (error instanceof ThreadLockError) {\n showThreadLockPrompt(ctx, thread.title || thread.id, error.ownerPid, thread.id);\n } else {\n ctx.showError(`Failed to switch thread: ${error instanceof Error ? error.message : String(error)}`);\n }\n resolve();\n return;\n }\n state.pendingNewThread = false;\n\n state.chatContainer.clear();\n state.allToolComponents = [];\n state.pendingTools.clear();\n await ctx.renderExistingMessages();\n\n ctx.showInfo(`Switched to: ${thread.title || thread.id}`);\n resolve();\n },\n onClone: async thread => {\n state.ui.hideOverlay();\n if (!(await confirmClone(state, thread.title || thread.id))) {\n resolve();\n return;\n }\n try {\n const customTitle = await askCloneName(state);\n const clonedThread = await state.harness.cloneThread({\n sourceThreadId: thread.id,\n ...(customTitle ? { title: customTitle } : {}),\n });\n state.pendingNewThread = false;\n await resetUIAfterClone(ctx, clonedThread.title || clonedThread.id);\n } catch (error) {\n ctx.showError(`Failed to clone thread: ${error instanceof Error ? error.message : String(error)}`);\n }\n resolve();\n },\n onCancel: () => {\n state.ui.hideOverlay();\n resolve();\n },\n });\n\n state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n selector.focused = true;\n });\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\nexport async function handleThreadTagDirCommand(ctx: SlashCommandContext): Promise<void> {\n const { state } = ctx;\n const threadId = state.harness.getCurrentThreadId();\n if (!threadId && state.pendingNewThread) {\n ctx.showInfo('No active thread yet — send a message first.');\n return;\n }\n if (!threadId) {\n ctx.showInfo('No active thread.');\n return;\n }\n\n const projectPath = (state.harness.getState() as any)?.projectPath as string | undefined;\n if (!projectPath) {\n ctx.showInfo('Could not detect current project path.');\n return;\n }\n\n const dirName = projectPath.split('/').pop() || projectPath;\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Tag this thread with directory \"${dirName}\"?\\n ${theme.fg('dim', projectPath)}`,\n options: [{ label: 'Yes' }, { label: 'No' }],\n formatResult: answer => (answer === 'Yes' ? `Tagged thread with: ${dirName}` : `Thread not tagged`),\n onSubmit: async answer => {\n state.activeInlineQuestion = undefined;\n if (answer.toLowerCase().startsWith('y')) {\n await state.harness.setThreadSetting({ key: 'projectPath', value: projectPath });\n }\n resolve();\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n state.ui,\n );\n\n state.activeInlineQuestion = questionComponent;\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(questionComponent);\n state.chatContainer.addChild(new Spacer(1));\n state.ui.requestRender();\n state.chatContainer.invalidate();\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { Spacer } from '@mariozechner/pi-tui';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { SlashCommandContext } from './types.js';\n\nasync function sandboxAddPath(ctx: SlashCommandContext, rawPath: string): Promise<void> {\n const harnessState = ctx.state.harness.getState() as {\n sandboxAllowedPaths?: string[];\n };\n const currentPaths = harnessState.sandboxAllowedPaths ?? [];\n const resolved = path.resolve(rawPath);\n\n if (currentPaths.includes(resolved)) {\n ctx.showInfo(`Path already allowed: ${resolved}`);\n return;\n }\n try {\n await fs.promises.access(resolved);\n } catch {\n ctx.showError(`Path does not exist: ${resolved}`);\n return;\n }\n const updated = [...currentPaths, resolved];\n ctx.state.harness.setState({ sandboxAllowedPaths: updated } as any);\n await ctx.state.harness.setThreadSetting({ key: 'sandboxAllowedPaths', value: updated });\n ctx.showInfo(`Added to sandbox: ${resolved}`);\n}\n\nasync function sandboxRemovePath(ctx: SlashCommandContext, rawPath: string, currentPaths: string[]): Promise<void> {\n const resolved = path.resolve(rawPath);\n const match = currentPaths.find(p => p === resolved || p === rawPath);\n if (!match) {\n ctx.showError(`Path not in allowed list: ${resolved}`);\n return;\n }\n const updated = currentPaths.filter(p => p !== match);\n ctx.state.harness.setState({ sandboxAllowedPaths: updated } as any);\n await ctx.state.harness.setThreadSetting({ key: 'sandboxAllowedPaths', value: updated });\n ctx.showInfo(`Removed from sandbox: ${match}`);\n}\n\nasync function showSandboxAddPrompt(ctx: SlashCommandContext): Promise<void> {\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: 'Enter path to allow',\n formatResult: answer => {\n return `Path: ${path.resolve(answer)}`;\n },\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n await sandboxAddPath(ctx, answer);\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nexport async function handleSandboxCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const harnessState = ctx.state.harness.getState() as {\n sandboxAllowedPaths?: string[];\n };\n const currentPaths = harnessState.sandboxAllowedPaths ?? [];\n\n const subcommand = args[0]?.toLowerCase();\n if (subcommand === 'add' && args.length > 1) {\n await sandboxAddPath(ctx, args.slice(1).join(' ').trim());\n return;\n }\n if (subcommand === 'remove' && args.length > 1) {\n await sandboxRemovePath(ctx, args.slice(1).join(' ').trim(), currentPaths);\n return;\n }\n\n // Interactive mode — show inline selector\n const options: Array<{ label: string; description?: string }> = [\n { label: 'Add path', description: 'Allow access to another directory' },\n ];\n\n for (const p of currentPaths) {\n options.push({\n label: `Remove: ${p}`,\n description: p,\n });\n }\n\n const pathsSummary = currentPaths.length\n ? `${currentPaths.length} allowed path${currentPaths.length > 1 ? 's' : ''}`\n : 'no extra paths';\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Sandbox settings (${pathsSummary})`,\n options,\n formatResult: answer => {\n if (answer === 'Add path') return 'Adding sandbox path…';\n if (answer.startsWith('Remove: ')) {\n return `Removed: ${answer.replace('Remove: ', '')}`;\n }\n return answer;\n },\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n if (answer === 'Add path') {\n resolve();\n await showSandboxAddPrompt(ctx);\n } else if (answer.startsWith('Remove: ')) {\n const targetPath = answer.replace('Remove: ', '');\n if (currentPaths.includes(targetPath)) {\n await sandboxRemovePath(ctx, targetPath, currentPaths);\n }\n resolve();\n } else {\n resolve();\n }\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","/**\n * Model selector component for switching between available models.\n * Uses pi-tui overlay pattern with search and fuzzy filtering.\n */\n\nimport { Box, Container, fuzzyFilter, getEditorKeybindings, Input, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { theme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ModelItem {\n /** Full model ID (e.g., \"anthropic/claude-sonnet-4\") */\n id: string;\n /** Provider name (e.g., \"anthropic\") */\n provider: string;\n /** Model name without provider (e.g., \"claude-sonnet-4\") */\n modelName: string;\n /** Whether the API key for this provider is available */\n hasApiKey: boolean;\n /** Environment variable name for the API key (e.g., \"ANTHROPIC_API_KEY\") */\n apiKeyEnvVar?: string;\n /** Number of times this model has been selected (for ranking) */\n useCount?: number;\n}\n\nexport interface ModelSelectorOptions {\n /** TUI instance for rendering */\n tui: TUI;\n /** List of available models */\n models: ModelItem[];\n /** Currently selected model ID */\n currentModelId?: string;\n /** Optional title for the selector */\n title?: string;\n /** Optional hex color for the title background (e.g. mode color) */\n titleColor?: string;\n /** Callback when a model is selected */\n onSelect: (model: ModelItem) => void;\n /** Callback when selection is cancelled */\n onCancel: () => void;\n}\n\n// =============================================================================\n// ModelSelectorComponent\n// =============================================================================\n\nexport class ModelSelectorComponent extends Box implements Focusable {\n private searchInput!: Input;\n private listContainer!: Container;\n private allModels: ModelItem[];\n private filteredModels: ModelItem[];\n private selectedIndex = 0;\n private currentModelId?: string;\n private onSelectCallback: (model: ModelItem) => void;\n private onCancelCallback: () => void;\n private tui: TUI;\n private title: string;\n private titleColor?: string;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n this.searchInput.focused = value;\n }\n\n constructor(options: ModelSelectorOptions) {\n // Box with padding and background\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.tui = options.tui;\n this.title = options.title ?? 'Select Model';\n this.titleColor = options.titleColor;\n this.allModels = this.sortModels(options.models, options.currentModelId);\n this.currentModelId = options.currentModelId;\n this.onSelectCallback = options.onSelect;\n this.onCancelCallback = options.onCancel;\n this.filteredModels = this.allModels;\n\n // Build UI\n this.buildUI();\n }\n\n private buildUI(): void {\n // Title — optionally with a mode-colored background\n const titleText = this.titleColor\n ? chalk.bgHex(this.titleColor).white.bold(` ${this.title} `)\n : theme.bold(theme.fg('accent', this.title));\n this.addChild(new Text(titleText, 0, 0));\n this.addChild(new Spacer(1));\n\n // Hint\n this.addChild(new Text(theme.fg('muted', 'Type to search • ↑↓ navigate • Enter select • Esc cancel'), 0, 0));\n this.addChild(new Spacer(1));\n\n // Search input (Input has built-in \"> \" prompt)\n this.searchInput = new Input();\n this.searchInput.onSubmit = () => {\n if (this.hasCustomItem && this.selectedIndex === 0) {\n const query = this.searchInput.getValue().trim();\n if (query) this.handleSelect(this.makeCustomModelItem(query));\n } else {\n const modelIndex = this.hasCustomItem ? this.selectedIndex - 1 : this.selectedIndex;\n const selected = this.filteredModels[modelIndex];\n if (selected) this.handleSelect(selected);\n }\n };\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n // List container\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n // Initial render\n this.updateList();\n }\n\n private sortModels(models: ModelItem[], currentModelId?: string): ModelItem[] {\n const sorted = [...models];\n\n // Sort: current first, then API key available, then by use count (desc), then alphabetical\n sorted.sort((a, b) => {\n // Current model always first\n const aIsCurrent = a.id === currentModelId;\n const bIsCurrent = b.id === currentModelId;\n if (aIsCurrent && !bIsCurrent) return -1;\n if (!aIsCurrent && bIsCurrent) return 1;\n\n // Models with API keys come before those without\n if (a.hasApiKey && !b.hasApiKey) return -1;\n if (!a.hasApiKey && b.hasApiKey) return 1;\n\n // Then by use count (higher = first)\n const aCount = a.useCount ?? 0;\n const bCount = b.useCount ?? 0;\n if (aCount !== bCount) return bCount - aCount;\n\n // Then by provider\n const providerCompare = a.provider.localeCompare(b.provider);\n if (providerCompare !== 0) return providerCompare;\n\n // Then by model name\n return a.modelName.localeCompare(b.modelName);\n });\n\n return sorted;\n }\n\n /** Whether the custom \"Use: ...\" item is showing at the top */\n private hasCustomItem = false;\n\n private filterModels(query: string): void {\n // Apply fuzzy filter if there's a query, otherwise show all\n // Sorting already puts models with API keys first\n this.filteredModels = query\n ? fuzzyFilter(this.allModels, query, m => `${m.id} ${m.provider} ${m.modelName}`)\n : this.allModels;\n\n // Show \"Use: query\" custom item when query looks like a model ID\n // and doesn't exactly match the top result\n const trimmed = query.trim();\n this.hasCustomItem = trimmed.length > 0 && this.filteredModels[0]?.id !== trimmed;\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, totalItems - 1));\n this.updateList();\n }\n\n private makeCustomModelItem(id: string): ModelItem {\n const parts = id.split('/');\n const provider = parts.length > 1 ? parts[0]! : 'custom';\n const modelName = parts.length > 1 ? parts.slice(1).join('/') : id;\n return { id, provider, modelName, hasApiKey: true };\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n const maxVisible = 12;\n const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), totalItems - maxVisible));\n const endIndex = Math.min(startIndex + maxVisible, totalItems);\n\n for (let i = startIndex; i < endIndex; i++) {\n // First item is the custom \"Use: ...\" entry when active\n if (this.hasCustomItem && i === 0) {\n const query = this.searchInput.getValue().trim();\n const isSelected = this.selectedIndex === 0;\n const line = isSelected\n ? theme.fg('accent', '→ ') + theme.bold(theme.fg('accent', `Use: ${query}`))\n : ' ' + theme.fg('muted', `Use: ${query}`);\n this.listContainer.addChild(new Text(line, 0, 0));\n continue;\n }\n\n // Offset into filteredModels (subtract 1 when custom item is present)\n const modelIndex = this.hasCustomItem ? i - 1 : i;\n const item = this.filteredModels[modelIndex];\n if (!item) continue;\n\n const isSelected = i === this.selectedIndex;\n const isCurrent = item.id === this.currentModelId;\n const checkmark = isCurrent ? theme.fg('success', ' ✓') : '';\n const noKeyIndicator = !item.hasApiKey\n ? theme.fg('error', ' ✗') + theme.fg('muted', item.apiKeyEnvVar ? ` (${item.apiKeyEnvVar})` : ' (no key)')\n : '';\n\n let line = '';\n if (isSelected) {\n line = theme.fg('accent', '→ ' + item.id) + checkmark + noKeyIndicator;\n } else {\n const modelText = item.hasApiKey ? item.id : theme.fg('muted', item.id);\n line = ' ' + modelText + checkmark + noKeyIndicator;\n }\n\n this.listContainer.addChild(new Text(line, 0, 0));\n }\n\n // Scroll indicator\n if (startIndex > 0 || endIndex < totalItems) {\n const scrollInfo = theme.fg('muted', `(${this.selectedIndex + 1}/${totalItems})`);\n this.listContainer.addChild(new Text(scrollInfo, 0, 0));\n }\n\n // Empty state\n if (totalItems === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No matching models'), 0, 0));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n\n // Up arrow\n if (kb.matches(keyData, 'selectUp')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? totalItems - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n }\n // Down arrow\n else if (kb.matches(keyData, 'selectDown')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === totalItems - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n }\n // Enter\n else if (kb.matches(keyData, 'selectConfirm')) {\n if (this.hasCustomItem && this.selectedIndex === 0) {\n const query = this.searchInput.getValue().trim();\n if (query) this.handleSelect(this.makeCustomModelItem(query));\n } else {\n const modelIndex = this.hasCustomItem ? this.selectedIndex - 1 : this.selectedIndex;\n const selected = this.filteredModels[modelIndex];\n if (selected) this.handleSelect(selected);\n }\n }\n // Escape or Ctrl+C\n else if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n }\n // Pass everything else to search input\n else {\n this.searchInput.handleInput(keyData);\n this.filterModels(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n\n private handleSelect(model: ModelItem): void {\n this.onSelectCallback(model);\n }\n\n getSearchInput(): Input {\n return this.searchInput;\n }\n}\n","import chalk from 'chalk';\nimport { getThemeMode, projectTheme } from '../theme.js';\n\nconst GRADIENT_WIDTH = 30; // Width of the bright spot as percentage of total text\nconst BASE_COLOR = projectTheme.accentRgb;\nfunction getMinBrightness(): number {\n return getThemeMode() === 'dark' ? 0.45 : 0.55;\n}\n\n/**\n * Parse a hex color string to [r, g, b].\n */\nfunction hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\n/** Idle brightness target for fade-out interpolation */\nconst IDLE_BRIGHTNESS = 0.8;\n\n/**\n * Applies a sweeping gradient animation to a plain text string.\n * A bright spot moves left-to-right across the text.\n *\n * @param text - Plain text to colorize (no ANSI codes)\n * @param offset - Current animation offset (0-1, wraps around)\n * @param color - Optional hex color override (defaults to the project accent)\n * @param fadeProgress - 0 = full animation, 1 = fully idle (flattens gradient)\n * @returns Chalk-colored string\n */\nexport function applyGradientSweep(text: string, offset: number, color?: string, fadeProgress = 0): string {\n const chars = [...text];\n const totalChars = chars.length;\n if (totalChars === 0) return text;\n\n const baseColor = color ? hexToRgb(color) : BASE_COLOR;\n const gradientCenter = (offset % 1) * 100;\n\n return chars\n .map((char, i) => {\n if (char === ' ') return ' ';\n\n const charPosition = (i / totalChars) * 100;\n let distance = Math.abs(charPosition - gradientCenter);\n\n // Wrap-around for smooth cycling\n if (distance > 50) {\n distance = 100 - distance;\n }\n\n const normalizedDistance = Math.min(distance / (GRADIENT_WIDTH / 2), 1);\n const minBrightness = getMinBrightness();\n const animBrightness = minBrightness + (1 - minBrightness) * (1 - normalizedDistance);\n\n // Interpolate toward idle brightness as fade progresses\n const brightness = animBrightness + (IDLE_BRIGHTNESS - animBrightness) * fadeProgress;\n\n const r = Math.floor(baseColor[0]! * brightness);\n const g = Math.floor(baseColor[1]! * brightness);\n const b = Math.floor(baseColor[2]! * brightness);\n\n return chalk.rgb(r, g, b)(char);\n })\n .join('');\n}\n\n/**\n * Manages the gradient sweep animation state.\n * Call `start()` when agent begins working, `stop()` when idle.\n * On each tick, call `getOffset()` to get the current sweep position.\n */\nexport class GradientAnimator {\n private offset = 0;\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private onTick: () => void;\n private _isFadingOut = false;\n private _isFadingIn = false;\n private _fadeProgress = 0; // 0 = full animation, 1 = fully idle\n\n constructor(onTick: () => void) {\n this.onTick = onTick;\n }\n\n start(): void {\n if (this.intervalId && !this._isFadingOut) return;\n // Cancel any ongoing fade-out\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this._isFadingOut = false;\n this._isFadingIn = true;\n this._fadeProgress = 1; // Start from idle, fade toward full animation\n this.offset = 0;\n this.intervalId = setInterval(() => {\n this.offset += 0.03; // Speed: full sweep in ~55 ticks\n if (this._isFadingIn) {\n this._fadeProgress -= 0.06; // ~17 steps over ~500ms\n if (this._fadeProgress <= 0) {\n this._fadeProgress = 0;\n this._isFadingIn = false;\n }\n }\n this.onTick();\n }, 80);\n }\n\n /**\n * Smoothly fade the gradient to idle state over ~500ms.\n */\n fadeOut(): void {\n if (!this.intervalId) return;\n if (this._isFadingOut) return;\n this._isFadingOut = true;\n this._fadeProgress = 0;\n // Replace the animation interval with a fade interval\n clearInterval(this.intervalId);\n this.intervalId = setInterval(() => {\n this._fadeProgress += 0.08; // ~12 steps over ~500ms\n if (this._fadeProgress >= 1) {\n this._fadeProgress = 1;\n this.stop();\n }\n this.onTick();\n }, 40);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this._isFadingOut = false;\n this._fadeProgress = 0;\n this.offset = 0;\n }\n\n getOffset(): number {\n return this.offset;\n }\n\n /** 0 = full animation, 1 = fully idle. Use to interpolate colors. */\n getFadeProgress(): number {\n return this._fadeProgress;\n }\n\n isFadingOut(): boolean {\n return this._isFadingOut;\n }\n\n isRunning(): boolean {\n return this.intervalId !== null;\n }\n}\n","/**\n * Observational Memory progress indicator component.\n * Shows when OM is observing or reflecting on conversation history.\n */\nimport { Container, Text } from '@mariozechner/pi-tui';\nimport { defaultOMProgressState } from '@mastra/core/harness';\nimport type { OMBufferedStatus, OMProgressState, OMStatus } from '@mastra/core/harness';\nimport chalk from 'chalk';\nimport { theme, mastra } from '../theme.js';\n\n// Re-export types from core for backward compatibility\nexport type { OMBufferedStatus, OMProgressState, OMStatus };\nexport { defaultOMProgressState };\n\n/**\n * Component that displays OM progress in the status line area.\n * Shows a compact indicator when observation/reflection is happening.\n */\nexport class OMProgressComponent extends Container {\n private state: OMProgressState = defaultOMProgressState();\n private statusText: Text;\n\n constructor() {\n super();\n this.statusText = new Text('');\n this.children.push(this.statusText);\n }\n\n updateProgress(progress: {\n pendingTokens: number;\n threshold: number;\n thresholdPercent: number;\n observationTokens: number;\n reflectionThreshold: number;\n reflectionThresholdPercent: number;\n }): void {\n this.state.pendingTokens = progress.pendingTokens;\n this.state.threshold = progress.threshold;\n this.state.thresholdPercent = progress.thresholdPercent;\n this.state.observationTokens = progress.observationTokens;\n this.state.reflectionThreshold = progress.reflectionThreshold;\n this.state.reflectionThresholdPercent = progress.reflectionThresholdPercent;\n this.updateDisplay();\n }\n\n startObservation(cycleId: string, _tokensToObserve: number): void {\n this.state.status = 'observing';\n this.state.cycleId = cycleId;\n this.state.startTime = Date.now();\n this.updateDisplay();\n }\n\n endObservation(): void {\n this.state.status = 'idle';\n this.state.cycleId = undefined;\n this.state.startTime = undefined;\n this.updateDisplay();\n }\n\n startReflection(cycleId: string): void {\n this.state.status = 'reflecting';\n this.state.cycleId = cycleId;\n this.state.startTime = Date.now();\n this.updateDisplay();\n }\n\n endReflection(): void {\n this.state.status = 'idle';\n this.state.cycleId = undefined;\n this.state.startTime = undefined;\n this.updateDisplay();\n }\n\n failOperation(): void {\n this.state.status = 'idle';\n this.state.cycleId = undefined;\n this.state.startTime = undefined;\n this.updateDisplay();\n }\n\n getStatus(): OMStatus {\n return this.state.status;\n }\n\n private updateDisplay(): void {\n if (this.state.status === 'idle') {\n // Show threshold progress when idle (if any pending tokens)\n if (this.state.thresholdPercent > 0) {\n const percent = Math.round(this.state.thresholdPercent);\n const bar = this.renderProgressBar(percent, 10);\n this.statusText.setText(theme.fg('muted', `OM ${bar} ${percent}%`));\n } else {\n this.statusText.setText('');\n }\n } else if (this.state.status === 'observing') {\n const elapsed = this.state.startTime ? Math.round((Date.now() - this.state.startTime) / 1000) : 0;\n const spinner = this.getSpinner();\n this.statusText.setText(chalk.hex(mastra.orange)(`${spinner} Observing... ${elapsed}s`));\n } else if (this.state.status === 'reflecting') {\n const elapsed = this.state.startTime ? Math.round((Date.now() - this.state.startTime) / 1000) : 0;\n const spinner = this.getSpinner();\n this.statusText.setText(chalk.hex(mastra.pink)(`${spinner} Reflecting... ${elapsed}s`));\n }\n }\n\n private renderProgressBar(percent: number, width: number): string {\n const filled = Math.min(width, Math.round((percent / 100) * width));\n const empty = width - filled;\n const bar = '━'.repeat(filled) + '─'.repeat(empty);\n\n // Color based on threshold proximity — Mastra brand colors\n if (percent >= 90) {\n return chalk.hex(mastra.red)(bar); // Mastra red\n } else if (percent >= 70) {\n return chalk.hex(mastra.orange)(bar); // Mastra orange\n } else {\n return chalk.hex(mastra.darkGray)(bar); // Mastra dark gray\n }\n }\n private spinnerFrame = 0;\n private getSpinner(): string {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n this.spinnerFrame = (this.spinnerFrame + 1) % frames.length;\n return frames[this.spinnerFrame]!;\n }\n\n render(maxWidth: number): string[] {\n this.updateDisplay();\n return this.statusText.render(maxWidth);\n }\n}\n\n/** Format token count without k suffix (e.g., 7234 -> \"7.2\", 200 -> \"0.2\", 0 -> \"0\") */\nfunction formatTokensValue(n: number): string {\n if (n === 0) return '0';\n const k = n / 1000;\n const s = k.toFixed(1);\n return s.endsWith('.0') ? s.slice(0, -2) : s;\n}\n\n/** Format token threshold with k suffix (e.g., 30000 -> \"30k\", 40000 -> \"40k\") */\nfunction formatTokensThreshold(n: number): string {\n const k = n / 1000;\n const s = k.toFixed(1);\n return (s.endsWith('.0') ? s.slice(0, -2) : s) + 'k';\n}\n\nfunction colorByPercent(text: string, percent: number): string {\n if (percent >= 90) return chalk.hex(mastra.red)(text); // Mastra red\n if (percent >= 70) return chalk.hex(mastra.orange)(text); // Mastra orange\n return chalk.hex(mastra.darkGray)(text); // Mastra dark gray\n}\n/**\n * Format OM observation threshold for status bar.\n * Compact levels (most → least info):\n * \"full\": messages 12.5k/30k ↓2.1k\n * undefined: msg 12.5k/30k ↓2.1k\n * \"noBuffer\": msg 12.5k/30k\n * \"percentOnly\": msg 42%\n *\n * @param labelStyler - Optional function to style the label text (for animation).\n * Receives the raw label string, returns styled string.\n */\nexport function formatObservationStatus(\n state: OMProgressState,\n compact?: 'percentOnly' | 'noBuffer' | 'full',\n labelStyler?: (label: string) => string,\n): string {\n // Status is now shown in the mode badge, so just show the metrics\n const percent = Math.round(state.thresholdPercent);\n const pct = colorByPercent(`${percent}%`, percent);\n const defaultStyler = (s: string) => chalk.hex(mastra.specialGray)(s);\n const styleLabel = labelStyler ?? defaultStyler;\n if (compact === 'percentOnly') {\n return styleLabel('msg ') + pct;\n }\n const label = compact === 'full' ? 'messages' : 'msg';\n const fraction = `${formatTokensValue(state.pendingTokens)}/${formatTokensThreshold(state.threshold)}`;\n const projectedMessageRemoval = state.buffered?.observations?.projectedMessageRemoval ?? 0;\n const buffered =\n compact !== 'noBuffer' && projectedMessageRemoval > 0\n ? theme.fg('muted', ` ↓${formatTokensThreshold(projectedMessageRemoval)}`)\n : '';\n return styleLabel(`${label} `) + colorByPercent(fraction, percent) + buffered;\n}\n/**\n * Format OM reflection threshold for status bar.\n * Compact levels (most → least info):\n * \"full\": memory 8.2k/40k ↓1.2k\n * undefined: mem 8.2k/40k ↓1.2k\n * \"noBuffer\": mem 8.2k/40k\n * \"percentOnly\": mem 21%\n *\n * @param labelStyler - Optional function to style the label text (for animation).\n * Receives the raw label string, returns styled string.\n */\nexport function formatReflectionStatus(\n state: OMProgressState,\n compact?: 'percentOnly' | 'noBuffer' | 'full',\n labelStyler?: (label: string) => string,\n): string {\n // Status is now shown in the mode badge, so just show the metrics\n const percent = Math.round(state.reflectionThresholdPercent);\n const pct = colorByPercent(`${percent}%`, percent);\n const defaultStyler = (s: string) => chalk.hex(mastra.specialGray)(s);\n const styleLabel = labelStyler ?? defaultStyler;\n const label = styleLabel(compact === 'full' ? 'memory' : 'mem') + ' ';\n if (compact === 'percentOnly') {\n return label + pct;\n }\n const fraction = `${formatTokensValue(state.observationTokens)}/${formatTokensThreshold(state.reflectionThreshold)}`;\n const reflection = state.buffered?.reflection;\n const savings = reflection ? reflection.inputObservationTokens - reflection.observationTokens : 0;\n const buffered =\n compact !== 'noBuffer' && reflection?.status === 'complete'\n ? theme.fg('muted', ` ↓${formatTokensThreshold(savings)}`)\n : '';\n return label + colorByPercent(fraction, percent) + buffered;\n}\n\n/**\n * @deprecated Use formatObservationStatus and formatReflectionStatus instead\n */\nexport function formatOMStatus(state: OMProgressState): string {\n return formatObservationStatus(state);\n}\n","/**\n * Status line rendering — builds the bottom-of-screen status bar\n * showing model, mode, memory progress, and project path.\n */\nimport { visibleWidth } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport cliSpinners from 'cli-spinners';\nimport { lspManager } from '../lsp/index.js';\nimport { applyGradientSweep } from './components/obi-loader.js';\nimport { formatObservationStatus, formatReflectionStatus } from './components/om-progress.js';\nimport type { TUIState } from './state.js';\nimport { theme, mastra, tintHex, getThemeMode, getContrastText, projectTheme } from './theme.js';\n\n// Colors for OM modes\nconst OBSERVER_COLOR = mastra.orange;\nconst REFLECTOR_COLOR = mastra.pink;\nconst AGENT_SPINNER = cliSpinners.dots;\n\n/**\n * Lighten a color by blending toward white. factor 0 = original, 1 = white.\n */\nfunction lighten(r: number, g: number, b: number, factor: number): [number, number, number] {\n return [Math.floor(r + (255 - r) * factor), Math.floor(g + (255 - g) * factor), Math.floor(b + (255 - b) * factor)];\n}\n\n/**\n * For light mode, green and blue badge backgrounds are too dark.\n * Lighten them slightly so they look better on light terminals.\n */\nfunction adjustBadgeColor(r: number, g: number, b: number, modeColor: string): [number, number, number] {\n if (getThemeMode() !== 'light') return [r, g, b];\n if (\n modeColor === projectTheme.modeColors.build ||\n modeColor === projectTheme.modeColors.fast ||\n modeColor === mastra.blue\n ) {\n return lighten(r, g, b, 0.25);\n }\n return [r, g, b];\n}\n\nfunction getWorkingSpinner(state: TUIState, color?: string): { plain: string; styled: string; width: number } | null {\n if (!state.gradientAnimator?.isRunning() || state.gradientAnimator.isFadingOut()) {\n return null;\n }\n\n const frameIndex = Math.floor(Date.now() / AGENT_SPINNER.interval) % AGENT_SPINNER.frames.length;\n const frame = AGENT_SPINNER.frames[frameIndex] ?? AGENT_SPINNER.frames[0] ?? '';\n const plain = `${frame} `;\n\n return {\n plain,\n styled: color ? chalk.hex(color).bold(plain) : theme.fg('accent', plain),\n width: visibleWidth(plain),\n };\n}\n\n/**\n * Update the status line at the bottom of the TUI.\n * Progressively reduces content to fit the terminal width.\n */\nexport function updateStatusLine(state: TUIState): void {\n if (!state.statusLine) return;\n const termWidth = (process.stdout.columns || 80) - 1; // buffer to prevent jitter\n const SEP = ' '; // double-space separator between parts\n\n // --- Determine if we're showing observer/reflector instead of main mode ---\n const omStatus = state.harness.getDisplayState().omProgress.status;\n const isObserving = omStatus === 'observing';\n const isReflecting = omStatus === 'reflecting';\n const showOMMode = isObserving || isReflecting;\n\n // --- Mode badge ---\n let modeBadge = '';\n let modeBadgeWidth = 0;\n const modes = state.harness.listModes();\n const currentMode = modes.length > 1 ? state.harness.getCurrentMode() : undefined;\n // Use OM color when observing/reflecting, otherwise mode color\n const mainModeColor = currentMode?.color;\n const modeColor = showOMMode ? (isObserving ? OBSERVER_COLOR : REFLECTOR_COLOR) : mainModeColor;\n // Badge name: use OM mode name when observing/reflecting, otherwise main mode name\n const badgeName = showOMMode\n ? isObserving\n ? 'observe'\n : 'reflect'\n : currentMode\n ? currentMode.name || currentMode.id || 'unknown'\n : undefined;\n if (badgeName && modeColor) {\n const [mcr, mcg, mcb] = [\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n ];\n // Pulse the badge bg brightness opposite to the gradient sweep\n let badgeBrightness = 0.9;\n if (state.gradientAnimator?.isRunning()) {\n const fade = state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n const offset = state.gradientAnimator.getOffset() % 1;\n // Inverted phase (+ PI), range 0.65-0.95\n const animBrightness = 0.65 + 0.3 * (0.5 + 0.5 * Math.sin(offset * Math.PI * 2 + Math.PI));\n // Interpolate toward idle (0.9) as fade progresses\n badgeBrightness = animBrightness + (0.9 - animBrightness) * fade;\n }\n }\n const [mr, mg, mb] = adjustBadgeColor(\n Math.floor(mcr * badgeBrightness),\n Math.floor(mcg * badgeBrightness),\n Math.floor(mcb * badgeBrightness),\n modeColor,\n );\n const badgeBg = `#${mr.toString(16).padStart(2, '0')}${mg.toString(16).padStart(2, '0')}${mb.toString(16).padStart(2, '0')}`;\n modeBadge = chalk.bgRgb(mr, mg, mb).hex(getContrastText(badgeBg)).bold(` ${badgeName.toLowerCase()} `);\n modeBadgeWidth = badgeName.length + 2;\n } else if (badgeName) {\n modeBadge = theme.fg('dim', badgeName) + ' ';\n modeBadgeWidth = badgeName.length + 1;\n }\n\n // --- Update editor border to match mode color (not OM color) ---\n if (mainModeColor) {\n const [br, bg, bb] = [\n parseInt(mainModeColor.slice(1, 3), 16),\n parseInt(mainModeColor.slice(3, 5), 16),\n parseInt(mainModeColor.slice(5, 7), 16),\n ];\n const dim = 0.35;\n state.editor.borderColor = (text: string) =>\n chalk.rgb(Math.floor(br * dim), Math.floor(bg * dim), Math.floor(bb * dim))(text);\n }\n\n // --- Collect raw data ---\n // Show OM model when observing/reflecting, otherwise main model\n const fullModelId =\n (showOMMode\n ? isObserving\n ? state.harness.getObserverModelId()\n : state.harness.getReflectorModelId()\n : state.harness.getFullModelId()) ?? '';\n // e.g. \"anthropic/claude-sonnet-4-20250514\" → \"claude-sonnet-4-20250514\"\n const shortModelId = fullModelId.includes('/') ? fullModelId.slice(fullModelId.indexOf('/') + 1) : fullModelId;\n // e.g. \"claude-opus-4-6\" → \"opus 4.6\", \"claude-sonnet-4-20250514\" → \"sonnet-4-20250514\"\n const tinyModelId = shortModelId.replace(/^claude-/, '').replace(/^(\\w+)-(\\d+)-(\\d{1,2})$/, '$1 $2.$3');\n\n const homedir = process.env.HOME || process.env.USERPROFILE || '';\n let displayPath = state.projectInfo.rootPath;\n if (homedir && displayPath.startsWith(homedir)) {\n displayPath = '~' + displayPath.slice(homedir.length);\n }\n const branch = state.projectInfo.gitBranch;\n const queuedCount = state.pendingQueuedActions.length + state.harness.getFollowUpCount();\n const queuedLabel = queuedCount > 0 ? `${queuedCount} queued` : null;\n // Build progressively shorter directory strings for layout fallback\n const dirFull = branch ? `${displayPath} (${branch})` : displayPath;\n const dirBranchOnly = branch || null;\n // Abbreviate long branches: keep first 12 + last 8 chars with \"..\" in between\n const dirBranchShort = branch && branch.length > 24 ? branch.slice(0, 12) + '..' + branch.slice(-8) : dirBranchOnly;\n\n // --- Helper to style the model ID ---\n const isYolo = (state.harness.getState() as any).yolo === true;\n const styleModelId = (id: string): string => {\n if (!state.modelAuthStatus.hasAuth) {\n const envVar = state.modelAuthStatus.apiKeyEnvVar;\n return theme.fg('dim', id) + theme.fg('error', ' ✗') + theme.fg('muted', envVar ? ` (${envVar})` : ' (no key)');\n }\n // Tinted near-black background from mode color\n const tintBg = modeColor ? tintHex(modeColor, 0.15) : undefined;\n const padded = ` ${id} `;\n\n if (state.gradientAnimator?.isRunning() && modeColor) {\n const fade = state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n // During active or fade-out: interpolate gradient toward idle color\n const text = applyGradientSweep(\n padded,\n state.gradientAnimator.getOffset(),\n modeColor,\n fade, // pass fade progress to flatten the gradient\n );\n return tintBg ? chalk.bgHex(tintBg)(text) : text;\n }\n }\n if (modeColor) {\n // Idle state\n const [r, g, b] = adjustBadgeColor(\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n modeColor,\n );\n const dim = 0.8;\n const fgStyled = chalk.rgb(Math.floor(r * dim), Math.floor(g * dim), Math.floor(b * dim)).bold(padded);\n return tintBg ? chalk.bgHex(tintBg)(fgStyled) : fgStyled;\n }\n return chalk.hex(mastra.specialGray).bold(id);\n };\n\n // --- Build line with progressive reduction ---\n // Strategy: progressively drop less-important elements to fit terminal width.\n // Each attempt assembles plain-text parts, measures, and if it fits, styles and renders.\n\n // Short badge: first letter only (e.g., \"build\" → \"b\", \"observe\" → \"o\")\n let shortModeBadge = '';\n let shortModeBadgeWidth = 0;\n if (badgeName && modeColor) {\n const shortName = badgeName.toLowerCase().charAt(0);\n const [mcr, mcg, mcb] = [\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n ];\n let sBadgeBrightness = 0.9;\n if (state.gradientAnimator?.isRunning()) {\n const fade = state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n const offset = state.gradientAnimator.getOffset() % 1;\n const animBrightness = 0.65 + 0.3 * (0.5 + 0.5 * Math.sin(offset * Math.PI * 2 + Math.PI));\n sBadgeBrightness = animBrightness + (0.9 - animBrightness) * fade;\n }\n }\n const [sr, sg, sb] = adjustBadgeColor(\n Math.floor(mcr * sBadgeBrightness),\n Math.floor(mcg * sBadgeBrightness),\n Math.floor(mcb * sBadgeBrightness),\n modeColor,\n );\n const shortBadgeBg = `#${sr.toString(16).padStart(2, '0')}${sg.toString(16).padStart(2, '0')}${sb.toString(16).padStart(2, '0')}`;\n shortModeBadge = chalk.bgRgb(sr, sg, sb).hex(getContrastText(shortBadgeBg)).bold(` ${shortName} `);\n shortModeBadgeWidth = shortName.length + 2;\n } else if (badgeName) {\n const shortName = badgeName.toLowerCase().charAt(0);\n shortModeBadge = theme.fg('dim', shortName) + ' ';\n shortModeBadgeWidth = shortName.length + 1;\n }\n\n const workingSpinner = getWorkingSpinner(state, modeColor);\n const workingSpinnerWidth = workingSpinner?.width ?? 0;\n const workingSpinnerStyled = workingSpinner?.styled ?? '';\n\n const buildLine = (opts: {\n modelId: string;\n memCompact?: 'percentOnly' | 'noBuffer' | 'full';\n showDir: boolean;\n dir?: string | null;\n badge?: 'full' | 'short';\n showQueue?: boolean;\n }): { plain: string; styled: string } | null => {\n const parts: Array<{ plain: string; styled: string }> = [];\n // Model ID (always present) — styleModelId adds padding spaces\n // When YOLO, append ⚒ box flush (no SEP gap)\n if (isYolo && modeColor) {\n const yBox = chalk.bgHex(tintHex(modeColor, 0.25)).hex(tintHex(modeColor, 0.9)).bold(' ⚒ ');\n parts.push({\n plain: ` ${opts.modelId} ⚒ `,\n styled: styleModelId(opts.modelId) + yBox,\n });\n } else {\n parts.push({\n plain: ` ${opts.modelId} `,\n styled: styleModelId(opts.modelId),\n });\n }\n const useBadge = opts.badge === 'short' ? shortModeBadge : modeBadge;\n const useBadgeWidth = opts.badge === 'short' ? shortModeBadgeWidth : modeBadgeWidth;\n // Memory info — animate label text when buffering is active\n const ds = state.harness.getDisplayState();\n const msgLabelStyler =\n ds.bufferingMessages && state.gradientAnimator?.isRunning()\n ? (label: string) =>\n applyGradientSweep(\n label,\n state.gradientAnimator!.getOffset(),\n OBSERVER_COLOR,\n state.gradientAnimator!.getFadeProgress(),\n )\n : undefined;\n const obsLabelStyler =\n ds.bufferingObservations && state.gradientAnimator?.isRunning()\n ? (label: string) =>\n applyGradientSweep(\n label,\n state.gradientAnimator!.getOffset(),\n REFLECTOR_COLOR,\n state.gradientAnimator!.getFadeProgress(),\n )\n : undefined;\n const omProg = state.harness.getDisplayState().omProgress;\n const obs = formatObservationStatus(omProg, opts.memCompact, msgLabelStyler);\n const ref = formatReflectionStatus(omProg, opts.memCompact, obsLabelStyler);\n if (obs) {\n parts.push({ plain: obs, styled: obs });\n }\n if (ref) {\n parts.push({ plain: ref, styled: ref });\n }\n if (opts.showQueue && queuedLabel) {\n parts.push({\n plain: queuedLabel,\n styled: theme.fg('warning', queuedLabel),\n });\n }\n // Directory / branch (lowest priority on line 1)\n const dirText = opts.dir !== undefined ? opts.dir : opts.showDir ? dirFull : null;\n if (dirText) {\n parts.push({\n plain: dirText,\n styled: theme.fg('dim', dirText),\n });\n }\n const totalPlain =\n workingSpinnerWidth + useBadgeWidth + parts.reduce((sum, p, i) => sum + visibleWidth(p.plain) + (i > 0 ? SEP.length : 0), 0);\n\n if (totalPlain > termWidth) return null;\n\n let styledLine: string;\n const hasDir = !!dirText;\n if (hasDir && parts.length >= 3) {\n // Three groups: left (model), center (mem/tokens/thinking), right (dir)\n const leftPart = parts[0]!; // model\n const centerParts = parts.slice(1, -1); // mem, tokens, thinking\n const dirPart = parts[parts.length - 1]!; // dir\n\n const leftWidth = workingSpinnerWidth + useBadgeWidth + visibleWidth(leftPart.plain);\n const centerWidth = centerParts.reduce((sum, p, i) => sum + visibleWidth(p.plain) + (i > 0 ? SEP.length : 0), 0);\n const rightWidth = visibleWidth(dirPart.plain);\n const totalContent = leftWidth + centerWidth + rightWidth;\n const freeSpace = termWidth - totalContent;\n const gapLeft = Math.floor(freeSpace / 2);\n const gapRight = freeSpace - gapLeft;\n\n styledLine =\n workingSpinnerStyled +\n useBadge +\n leftPart.styled +\n ' '.repeat(Math.max(gapLeft, 1)) +\n centerParts.map(p => p.styled).join(SEP) +\n ' '.repeat(Math.max(gapRight, 1)) +\n dirPart.styled;\n } else if (hasDir && parts.length === 2) {\n // Just model + dir, right-align dir\n const mainStr = workingSpinnerStyled + useBadge + parts[0]!.styled;\n const dirPart = parts[parts.length - 1]!;\n const gap = termWidth - totalPlain;\n styledLine = mainStr + ' '.repeat(gap + SEP.length) + dirPart.styled;\n } else {\n styledLine = workingSpinnerStyled + useBadge + parts.map(p => p.styled).join(SEP);\n }\n return { plain: '', styled: styledLine };\n };\n // Try progressively more compact layouts.\n // Priority: token fractions + buffer > labels > provider > badge > buffer > fractions\n const result =\n // 1. Full badge + full model + long labels + queue count + full dir\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: false, dir: dirFull, showQueue: true }) ??\n // 2. Full badge + full model + queue count + branch only (drop path)\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: false, dir: dirBranchOnly, showQueue: true }) ??\n // 3. Full badge + full model + queue count + abbreviated branch\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: false, dir: dirBranchShort, showQueue: true }) ??\n // 4. Drop directory entirely\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: false, showQueue: true }) ??\n // 5. Drop provider + \"claude-\" prefix, keep full labels + queue count\n buildLine({ modelId: tinyModelId, memCompact: 'full', showDir: false, showQueue: true }) ??\n // 6. Short labels (msg/mem) + queue count\n buildLine({ modelId: tinyModelId, showDir: false, showQueue: true }) ??\n // 7. Short badge + short labels + queue count\n buildLine({ modelId: tinyModelId, showDir: false, badge: 'short', showQueue: true }) ??\n // 8. Short badge + fractions (drop buffer indicator, keep queue count)\n buildLine({\n modelId: tinyModelId,\n memCompact: 'noBuffer',\n showDir: false,\n badge: 'short',\n showQueue: true,\n }) ??\n // 9. Full badge + percent only + queue count\n buildLine({\n modelId: tinyModelId,\n memCompact: 'percentOnly',\n showDir: false,\n badge: 'full',\n showQueue: true,\n }) ??\n // 10. Short badge + percent only + queue count\n buildLine({\n modelId: tinyModelId,\n memCompact: 'percentOnly',\n showDir: false,\n badge: 'short',\n showQueue: true,\n }) ??\n // 11. Model only + queue count\n buildLine({ modelId: tinyModelId, showDir: false, badge: undefined, showQueue: true }) ??\n // 12. Badge only + queue count\n buildLine({ modelId: '', showDir: false, badge: 'short', showQueue: true }) ??\n // 13. Model only\n buildLine({ modelId: tinyModelId, showDir: false, badge: undefined }) ??\n // 14. Badge only\n buildLine({ modelId: '', showDir: false, badge: 'short' });\n\n state.statusLine.setText(\n result?.styled ??\n workingSpinnerStyled +\n shortModeBadge +\n styleModelId(tinyModelId) +\n (isYolo && modeColor ? chalk.bgHex(tintHex(modeColor, 0.25)).hex(tintHex(modeColor, 0.9)).bold(' ⚒ ') : ''),\n );\n\n // Line 2: hidden — dir only shows on line 1 when it fits\n if (state.memoryStatusLine) {\n const initializingCount = lspManager.getInitializingClientCount();\n if (initializingCount > 0) {\n const label = initializingCount === 1 ? 'LSP initializing...' : `LSP initializing... (${initializingCount})`;\n state.memoryStatusLine.setText(theme.fg('warning', label));\n } else {\n const unavailableHint = lspManager.getUnavailableStatusHint();\n if (unavailableHint) {\n state.memoryStatusLine.setText(theme.fg('warning', unavailableHint));\n } else {\n state.memoryStatusLine.setText('');\n }\n }\n }\n\n state.ui.requestRender();\n}\n","import { Box, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { SelectItem } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\n\nimport { getSubagentModeMap, loadAgentDefinitionsCached } from '../../agents/agent-definitions.js';\nimport type { ModePack, ModePackOption, ProviderAccess, ProviderAccessLevel } from '../../onboarding/packs.js';\nimport { getAvailableModePacks, getModePackOptions } from '../../onboarding/packs.js';\nimport {\n loadSettingsCached,\n resolveThreadActiveModelPackId,\n saveSettings,\n THREAD_ACTIVE_MODEL_PACK_ID_KEY,\n} from '../../onboarding/settings.js';\nimport type { GlobalSettings } from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { ModelSelectorComponent } from '../components/model-selector.js';\nimport type { ModelItem } from '../components/model-selector.js';\nimport { updateStatusLine } from '../status-line.js';\nimport { getSelectListTheme, mastra, projectTheme, theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\nasync function selectModel(\n ctx: SlashCommandContext,\n title: string,\n modeColor?: string,\n currentModelId?: string,\n): Promise<string | undefined> {\n const availableModels = await ctx.state.harness.listAvailableModels();\n if (availableModels.length === 0) return undefined;\n\n return new Promise<string | undefined>(resolve => {\n const selector = new ModelSelectorComponent({\n tui: ctx.state.ui,\n models: availableModels,\n currentModelId,\n title,\n titleColor: modeColor,\n onSelect: (model: ModelItem) => {\n ctx.state.ui.hideOverlay();\n resolve(model.id);\n },\n onCancel: () => {\n ctx.state.ui.hideOverlay();\n resolve(undefined);\n },\n });\n\n ctx.state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n selector.focused = true;\n });\n}\n\nasync function askCustomPackName(ctx: SlashCommandContext, defaultName?: string): Promise<string | null> {\n return new Promise(resolve => {\n const question = new AskQuestionInlineComponent(\n {\n question: 'Name this custom pack',\n formatResult: answer => `Custom pack: ${answer}`,\n onSubmit: answer => {\n ctx.state.activeInlineQuestion = undefined;\n const trimmed = answer.trim();\n resolve(trimmed.length > 0 ? trimmed : null);\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve(null);\n },\n },\n ctx.state.ui,\n );\n\n if (defaultName) {\n (question as any).input?.setValue?.(defaultName);\n }\n\n ctx.state.activeInlineQuestion = question;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(question);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nasync function askCustomPackAction(\n ctx: SlashCommandContext,\n pack: ModePack,\n packModes: ModePackOption[],\n): Promise<'activate' | 'edit' | 'delete' | null> {\n const actions = [\n { id: 'activate', label: 'Activate', description: 'Use this pack as-is' },\n { id: 'edit', label: 'Edit', description: 'Update this pack' },\n { id: 'delete', label: 'Delete', description: 'Remove this custom pack' },\n ] as const;\n\n return new Promise(resolve => {\n const container = new Box(1, 1);\n container.addChild(new Text(theme.bold(theme.fg('accent', `Custom pack: ${pack.name}`)), 0, 0));\n container.addChild(new Spacer(1));\n\n const items: SelectItem[] = actions.map(action => ({\n value: action.id,\n label: ` ${action.label} ${theme.fg('dim', action.description)}`,\n }));\n\n const selectList = new SelectList(items, items.length, getSelectListTheme());\n const detailText = new Text('', 0, 0);\n const detailById: Record<string, string> = {\n activate: getPackDetail(pack, packModes),\n edit: theme.fg('dim', ` Edit one setting at a time (Rename, ${packModes.map(mode => mode.id).join(', ')}).`),\n delete: theme.fg('error', ' Permanently removes this custom pack from settings.'),\n };\n\n selectList.onSelectionChange = item => {\n detailText.setText(detailById[item.value] ?? '');\n ctx.state.ui.requestRender();\n };\n\n selectList.onSelect = item => {\n ctx.state.activeInlineQuestion = undefined;\n container.clear();\n container.addChild(\n new Text(theme.fg('text', `${theme.fg('success', '✓')} ${pack.name} → ${theme.bold(item.value)}`), 0, 0),\n );\n ctx.state.ui.requestRender();\n resolve(item.value as 'activate' | 'edit' | 'delete');\n };\n\n selectList.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n container.clear();\n container.addChild(new Text(theme.fg('dim', `${theme.fg('error', '✗')} ${pack.name} (cancelled)`), 0, 0));\n ctx.state.ui.requestRender();\n resolve(null);\n };\n\n detailText.setText(detailById['activate']!);\n container.addChild(selectList);\n container.addChild(new Spacer(1));\n container.addChild(detailText);\n container.addChild(new Spacer(1));\n container.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc cancel'), 0, 0));\n\n const inputShim = { handleInput: (data: string) => selectList.handleInput(data) } as any;\n ctx.state.activeInlineQuestion = inputShim;\n ctx.state.chatContainer.addChild(container);\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nasync function askCustomPackEditTarget(\n ctx: SlashCommandContext,\n pack: ModePack,\n packModes: ModePackOption[],\n): Promise<'rename' | 'save' | string | null> {\n return new Promise(resolve => {\n const container = new Box(1, 1);\n container.addChild(new Text(theme.bold(theme.fg('accent', `Edit custom pack: ${pack.name}`)), 0, 0));\n container.addChild(new Spacer(1));\n\n const selectList = new SelectList(\n [\n { value: 'rename', label: ` Rename → ${theme.fg('text', pack.name)}` },\n ...packModes.map(mode => {\n const color = mode.color ?? projectTheme.modeColors[mode.id as keyof typeof projectTheme.modeColors] ?? mastra.blue;\n return {\n value: mode.id,\n label: ` ${chalk.hex(color)(mode.id)} → ${theme.fg('text', pack.models[mode.id] ?? '')}`,\n };\n }),\n { value: 'save', label: ` ${theme.fg('success', 'Save')}` },\n ],\n packModes.length + 2,\n getSelectListTheme(),\n );\n\n const cleanup = () => {\n if (ctx.state.chatContainer.children.includes(container as any)) {\n ctx.state.chatContainer.removeChild(container as any);\n }\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n };\n\n selectList.onSelect = item => {\n ctx.state.activeInlineQuestion = undefined;\n cleanup();\n resolve(item.value as 'rename' | 'save' | string);\n };\n\n selectList.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n cleanup();\n resolve(null);\n };\n\n container.addChild(selectList);\n container.addChild(new Spacer(1));\n container.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc cancel'), 0, 0));\n\n const inputShim = { handleInput: (data: string) => selectList.handleInput(data) } as any;\n ctx.state.activeInlineQuestion = inputShim;\n ctx.state.chatContainer.addChild(container);\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nasync function runCustomFlow(\n ctx: SlashCommandContext,\n packModes: ModePackOption[],\n options?: { name?: string; models?: ModePack['models']; skipNamePrompt?: boolean },\n): Promise<ModePack | null> {\n const name = options?.skipNamePrompt\n ? options?.name\n : await askCustomPackName(ctx, options?.name && options.name !== 'Custom' ? options.name : undefined);\n if (!name) return null;\n\n const models: Record<string, string> = { ...(options?.models ?? {}) };\n\n for (const mode of packModes) {\n const modelId = await selectModel(\n ctx,\n `Select model for ${mode.label} mode`,\n mode.color,\n models[mode.id] || undefined,\n );\n if (!modelId) return null;\n models[mode.id] = modelId;\n }\n\n return {\n id: `custom:${name}`,\n name,\n description: 'Saved custom pack',\n models: models as ModePack['models'],\n };\n}\n\nasync function runCustomPackEditFlow(\n ctx: SlashCommandContext,\n pack: ModePack,\n packModes: ModePackOption[],\n): Promise<{ pack: ModePack; previousPackId?: string } | null> {\n let workingPack: ModePack = { ...pack, models: { ...pack.models } };\n let previousPackId: string | undefined;\n\n while (true) {\n const editTarget = await askCustomPackEditTarget(ctx, workingPack, packModes);\n if (!editTarget) return null;\n if (editTarget === 'save') return { pack: workingPack, previousPackId };\n\n if (editTarget === 'rename') {\n const renamed = await askCustomPackName(ctx, workingPack.name);\n if (!renamed) continue;\n const renamedPack: ModePack = {\n ...workingPack,\n id: `custom:${renamed}`,\n name: renamed,\n };\n if (renamedPack.id !== pack.id && !previousPackId) previousPackId = pack.id;\n workingPack = renamedPack;\n continue;\n }\n\n const selectedMode = packModes.find(mode => mode.id === editTarget);\n\n const modelId = await selectModel(\n ctx,\n `Select model for ${editTarget} mode`,\n selectedMode?.color ?? projectTheme.modeColors[editTarget as keyof typeof projectTheme.modeColors] ?? mastra.blue,\n workingPack.models[editTarget],\n );\n if (!modelId) continue;\n\n workingPack = {\n ...workingPack,\n models: {\n ...workingPack.models,\n [editTarget]: modelId,\n },\n };\n }\n}\n\nexport function upsertCustomPackInSettings(\n settings: GlobalSettings,\n pack: ModePack,\n modeDefaults: Record<string, string>,\n previousPackId?: string,\n setActive = true,\n): void {\n if (!pack.id.startsWith('custom:')) return;\n\n if (previousPackId && previousPackId.startsWith('custom:') && previousPackId !== pack.id) {\n removeCustomPackFromSettings(settings, previousPackId);\n }\n\n const customName = pack.id.slice('custom:'.length);\n const entry = { name: customName, models: modeDefaults, createdAt: new Date().toISOString() };\n const idx = settings.customModelPacks.findIndex(p => p.name === customName);\n if (idx >= 0) {\n settings.customModelPacks[idx] = entry;\n } else {\n settings.customModelPacks.push(entry);\n }\n if (setActive) {\n settings.models.activeModelPackId = pack.id;\n settings.models.modeDefaults = modeDefaults;\n }\n}\n\nexport function removeCustomPackFromSettings(settings: GlobalSettings, packId: string): void {\n if (!packId.startsWith('custom:')) return;\n const packName = packId.slice('custom:'.length);\n const removedPack = settings.customModelPacks.find(p => p.name === packName);\n settings.customModelPacks = settings.customModelPacks.filter(p => p.name !== packName);\n\n const modeDefaultsMatchRemovedPack = !!removedPack && mapsEqual(settings.models.modeDefaults, removedPack.models);\n\n if (settings.models.activeModelPackId === packId) {\n settings.models.activeModelPackId = null;\n settings.models.modeDefaults = {};\n } else if (modeDefaultsMatchRemovedPack) {\n settings.models.modeDefaults = {};\n }\n\n if (settings.onboarding.modePackId === packId) {\n settings.onboarding.modePackId = null;\n }\n}\n\nfunction mapsEqual(left: Record<string, string>, right: Record<string, string>): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n for (const key of keys) {\n if ((left[key] ?? '') !== (right[key] ?? '')) return false;\n }\n return true;\n}\n\nasync function applyPack(ctx: SlashCommandContext, pack: ModePack, previousPackId?: string): Promise<void> {\n const harness = ctx.state.harness;\n const modes = harness.listModes();\n\n for (const mode of modes) {\n const modelId = (pack.models as Record<string, string>)[mode.id];\n if (modelId) {\n (mode as any).defaultModelId = modelId;\n await harness.setThreadSetting({ key: `modeModelId_${mode.id}`, value: modelId });\n }\n }\n\n const currentModeId = harness.getCurrentModeId();\n const currentModeModel = (pack.models as Record<string, string>)[currentModeId];\n if (currentModeModel) {\n await harness.switchModel({ modelId: currentModeModel });\n }\n\n const projectPath = ((harness.getState() as { projectPath?: string } | undefined)?.projectPath ?? process.cwd()) as string;\n const subagentModeMap = getSubagentModeMap(loadAgentDefinitionsCached(projectPath));\n for (const [agentType, modeId] of Object.entries(subagentModeMap)) {\n const saModelId = (pack.models as Record<string, string>)[modeId];\n if (saModelId) {\n await harness.setSubagentModelId({ modelId: saModelId, agentType });\n }\n }\n\n await harness.setThreadSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: pack.id });\n\n const s = loadSettingsCached();\n const modeDefaults: Record<string, string> = {};\n for (const mode of modes) {\n const modelId = (pack.models as Record<string, string>)[mode.id];\n if (modelId) modeDefaults[mode.id] = modelId;\n }\n\n if (pack.id.startsWith('custom:')) {\n upsertCustomPackInSettings(s, pack, modeDefaults, previousPackId);\n } else {\n s.models.activeModelPackId = pack.id;\n s.models.modeDefaults = {};\n }\n\n s.models.subagentModels = {};\n\n const hasOpenAI = Object.values(pack.models).some(m => m.startsWith('openai/'));\n const currentThinking = ((harness.getState() as any)?.thinkingLevel ?? 'off') as string;\n if (hasOpenAI && currentThinking === 'off') {\n await harness.setState({ thinkingLevel: 'low' } as any);\n s.preferences.thinkingLevel = 'low';\n }\n\n saveSettings(s);\n updateStatusLine(ctx.state);\n}\n\nfunction getPackDetail(pack: ModePack, packModes: ModePackOption[]): string {\n if (pack.id === 'custom') {\n return theme.fg('dim', ' Create a named custom pack and pick a model for each mode.');\n }\n return packModes\n .map(mode => {\n const color = mode.color ?? projectTheme.modeColors[mode.id as keyof typeof projectTheme.modeColors] ?? mastra.blue;\n return ` ${chalk.hex(color)(mode.id)} → ${theme.fg('text', pack.models[mode.id] ?? '')}`;\n })\n .join('\\n');\n}\n\nasync function saveCustomPackEdits(ctx: SlashCommandContext, pack: ModePack, previousPackId?: string): Promise<void> {\n const settings = loadSettingsCached();\n const wasActive = previousPackId\n ? settings.models.activeModelPackId === previousPackId\n : settings.models.activeModelPackId === pack.id;\n const wasOnboarding = previousPackId\n ? settings.onboarding.modePackId === previousPackId\n : settings.onboarding.modePackId === pack.id;\n\n const modeDefaults: Record<string, string> = { ...pack.models };\n\n upsertCustomPackInSettings(settings, pack, modeDefaults, previousPackId, false);\n\n if (wasActive) {\n settings.models.activeModelPackId = pack.id;\n }\n if (wasOnboarding) {\n settings.onboarding.modePackId = pack.id;\n }\n\n saveSettings(settings);\n\n if (previousPackId && previousPackId !== pack.id) {\n const harness = ctx.state.harness;\n const threadId = harness.getCurrentThreadId();\n const thread = threadId ? (await harness.listThreads()).find(t => t.id === threadId) : undefined;\n const threadPackId = (thread?.metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY] as string | undefined) ?? null;\n if (threadPackId === previousPackId) {\n await harness.setThreadSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: pack.id });\n }\n }\n}\n\nasync function deleteCustomPack(ctx: SlashCommandContext, pack: ModePack): Promise<void> {\n if (!pack.id.startsWith('custom:')) return;\n\n const harness = ctx.state.harness;\n const threadId = harness.getCurrentThreadId();\n const thread = threadId ? (await harness.listThreads()).find(t => t.id === threadId) : undefined;\n const threadPackId = (thread?.metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY] as string | undefined) ?? null;\n\n const settings = loadSettingsCached();\n removeCustomPackFromSettings(settings, pack.id);\n saveSettings(settings);\n\n if (threadPackId === pack.id) {\n await harness.setThreadSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: null });\n }\n}\n\nexport async function handleModelsPackCommand(ctx: SlashCommandContext): Promise<void> {\n const harness = ctx.state.harness;\n const models = await harness.listAvailableModels();\n const projectPath = ((harness.getState() as { projectPath?: string } | undefined)?.projectPath ?? process.cwd()) as string;\n const packModes = getModePackOptions(loadAgentDefinitionsCached(projectPath).modes);\n\n const hasEnv = (provider: string) => models.some(m => m.provider === provider && m.hasApiKey);\n const accessLevel = (storageProviderId: string): ProviderAccessLevel => {\n const cred = ctx.authStorage?.get(storageProviderId);\n if (cred?.type === 'oauth') return 'oauth';\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) return 'apikey';\n return false;\n };\n const access: ProviderAccess = {\n anthropic: accessLevel('anthropic'),\n openai: accessLevel('openai-codex'),\n cerebras: hasEnv('cerebras') ? ('apikey' as const) : false,\n google: hasEnv('google') ? ('apikey' as const) : false,\n deepseek: hasEnv('deepseek') ? ('apikey' as const) : false,\n };\n // Include all other providers that have API keys configured\n const seen = new Set(Object.keys(access));\n for (const m of models) {\n if (!seen.has(m.provider) && m.hasApiKey) {\n access[m.provider] = 'apikey';\n seen.add(m.provider);\n }\n }\n\n const settings = loadSettingsCached();\n const packs = getAvailableModePacks(access, settings.customModelPacks, packModes);\n if (packs.length === 0) {\n ctx.showInfo('No model packs available. Configure provider auth first.');\n return;\n }\n\n const threadId = harness.getCurrentThreadId();\n const thread = threadId ? (await harness.listThreads()).find(t => t.id === threadId) : undefined;\n const currentPackId = resolveThreadActiveModelPackId(\n settings,\n packs,\n thread?.metadata as Record<string, unknown> | undefined,\n );\n\n const items: SelectItem[] = packs.map(p => ({\n value: p.id,\n label: ` ${p.name} ${theme.fg('dim', p.description)}${p.id === currentPackId ? theme.fg('dim', ' (current)') : ''}`,\n }));\n\n return new Promise<void>(resolve => {\n const container = new Box(1, 1);\n container.addChild(new Text(theme.bold(theme.fg('accent', 'Switch model pack')), 0, 0));\n container.addChild(new Spacer(1));\n\n const selectList = new SelectList(items, items.length, getSelectListTheme());\n const detailText = new Text('', 0, 0);\n\n const updateDetail = (packId: string) => {\n const pack = packs.find(p => p.id === packId);\n if (!pack) return;\n detailText.setText(getPackDetail(pack, packModes));\n ctx.state.ui.requestRender();\n };\n\n const collapseResult = (result: string | null) => {\n container.clear();\n if (result === 'cancelled') {\n container.addChild(new Text(theme.fg('dim', `${theme.fg('error', '✗')} Model pack (cancelled)`), 0, 0));\n } else if (result) {\n container.addChild(new Text(theme.fg('text', `${theme.fg('success', '✓')} ${result}`), 0, 0));\n }\n ctx.state.ui.requestRender();\n };\n\n selectList.onSelect = async (item: SelectItem) => {\n ctx.state.activeInlineQuestion = undefined;\n\n let pack: ModePack | null | undefined = packs.find(p => p.id === item.value);\n let previousPackId: string | undefined;\n if (!pack) {\n collapseResult('cancelled');\n resolve();\n return;\n }\n\n if (pack.id === 'custom') {\n collapseResult(null);\n pack = await runCustomFlow(ctx, packModes);\n } else if (pack.id.startsWith('custom:')) {\n while (true) {\n const action = await askCustomPackAction(ctx, pack, packModes);\n if (action === null) {\n collapseResult('cancelled');\n resolve();\n return;\n }\n\n if (action === 'delete') {\n await deleteCustomPack(ctx, pack);\n collapseResult(`Deleted custom pack → ${theme.bold(pack.name)}`);\n ctx.showInfo(`Deleted custom pack: ${pack.name}`);\n resolve();\n return;\n }\n\n if (action === 'activate') {\n break;\n }\n\n const edited = await runCustomPackEditFlow(ctx, pack, packModes);\n if (!edited) {\n continue;\n }\n\n previousPackId = edited.previousPackId;\n pack = edited.pack;\n await saveCustomPackEdits(ctx, pack, previousPackId);\n previousPackId = undefined;\n ctx.showInfo(`Updated custom pack: ${pack.name}`);\n }\n }\n\n if (!pack) {\n collapseResult('cancelled');\n resolve();\n return;\n }\n\n await applyPack(ctx, pack, previousPackId);\n collapseResult(`Model pack → ${theme.bold(pack.name)}`);\n ctx.showInfo(`Switched to ${pack.name} pack`);\n resolve();\n };\n\n selectList.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n collapseResult('cancelled');\n resolve();\n };\n\n selectList.onSelectionChange = (item: SelectItem) => {\n updateDetail(item.value);\n };\n\n container.addChild(selectList);\n container.addChild(new Spacer(1));\n container.addChild(detailText);\n container.addChild(new Spacer(1));\n container.addChild(new Text(theme.fg('dim', '↑↓ navigate · Enter select · Esc cancel'), 0, 0));\n\n const currentIdx = packs.findIndex(p => p.id === currentPackId);\n const initialIdx = currentIdx >= 0 ? currentIdx : 0;\n if (initialIdx > 0) selectList.setSelectedIndex(initialIdx);\n updateDetail(packs[initialIdx]!.id);\n\n const inputShim = { handleInput: (data: string) => selectList.handleInput(data) } as any;\n ctx.state.activeInlineQuestion = inputShim;\n\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(container);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport { getCustomProviderId, loadSettingsCached, saveSettings, toCustomProviderModelId } from '../../onboarding/settings.js';\nimport type { CustomProviderSetting, GlobalSettings } from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { SlashCommandContext } from './types.js';\n\nfunction isValidUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction normalizeProvider(input: CustomProviderSetting): CustomProviderSetting {\n return {\n name: input.name.trim(),\n url: input.url.trim(),\n apiKey: input.apiKey?.trim() || undefined,\n models: [...new Set(input.models.map(model => model.trim()).filter(Boolean))],\n };\n}\n\nexport function upsertCustomProviderInSettings(\n settings: GlobalSettings,\n provider: CustomProviderSetting,\n previousProviderId?: string,\n): void {\n const next = normalizeProvider(provider);\n const nextProviderId = getCustomProviderId(next.name);\n const filteredProviders = settings.customProviders.filter(existing => {\n const id = getCustomProviderId(existing.name);\n return id !== nextProviderId && (!previousProviderId || id !== previousProviderId);\n });\n settings.customProviders = [...filteredProviders, next];\n}\n\nexport function removeCustomProviderFromSettings(settings: GlobalSettings, providerId: string): void {\n settings.customProviders = settings.customProviders.filter(\n provider => getCustomProviderId(provider.name) !== providerId,\n );\n}\n\nexport function addModelToCustomProviderInSettings(\n settings: GlobalSettings,\n providerId: string,\n modelName: string,\n): boolean {\n const trimmed = modelName.trim();\n if (!trimmed) return false;\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) return false;\n provider.models = [...new Set([...provider.models, trimmed])];\n return true;\n}\n\nexport function removeModelFromCustomProviderInSettings(\n settings: GlobalSettings,\n providerId: string,\n modelName: string,\n): boolean {\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) return false;\n const before = provider.models.length;\n provider.models = provider.models.filter(model => model !== modelName);\n return provider.models.length < before;\n}\n\nfunction askText(\n ctx: SlashCommandContext,\n question: string,\n defaultValue?: string,\n allowEmptyInput = false,\n): Promise<string | null> {\n return new Promise(resolve => {\n const component = new AskQuestionInlineComponent(\n {\n question,\n allowEmptyInput,\n onSubmit: answer => {\n ctx.state.activeInlineQuestion = undefined;\n const trimmed = answer.trim();\n resolve(trimmed.length > 0 ? trimmed : null);\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve(null);\n },\n },\n ctx.state.ui,\n );\n\n if (defaultValue) {\n (component as any).input?.setValue?.(defaultValue);\n }\n\n ctx.state.activeInlineQuestion = component;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(component);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nasync function askOptionalText(\n ctx: SlashCommandContext,\n question: string,\n defaultValue?: string,\n): Promise<string | undefined> {\n const answer = await askText(ctx, `${question} (leave blank to skip)`, defaultValue, true);\n return answer?.trim() || undefined;\n}\n\nfunction askSelect(\n ctx: SlashCommandContext,\n question: string,\n options: Array<{ label: string; value: string; description?: string }>,\n): Promise<string | null> {\n return new Promise(resolve => {\n const component = new AskQuestionInlineComponent(\n {\n question,\n options: options.map(option => ({ label: option.label, description: option.description })),\n onSubmit: answer => {\n ctx.state.activeInlineQuestion = undefined;\n const selected = options.find(option => option.label === answer);\n resolve(selected?.value ?? null);\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve(null);\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = component;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(component);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nasync function createProviderFlow(ctx: SlashCommandContext): Promise<void> {\n const settings = loadSettingsCached();\n const name = await askText(ctx, 'Custom provider name');\n if (!name) return;\n\n const providerId = getCustomProviderId(name);\n if (settings.customProviders.some(provider => getCustomProviderId(provider.name) === providerId)) {\n ctx.showError(`Provider already exists: ${name}`);\n return;\n }\n\n const url = await askText(ctx, 'Base URL (OpenAI-compatible endpoint)');\n if (!url) return;\n if (!isValidUrl(url)) {\n ctx.showError('Invalid URL. Use a full http(s) URL.');\n return;\n }\n\n const apiKey = await askOptionalText(ctx, 'API key');\n upsertCustomProviderInSettings(settings, { name, url, apiKey, models: [] });\n saveSettings(settings);\n ctx.showInfo(`Added custom provider: ${name}`);\n\n await manageProviderFlow(ctx, providerId);\n}\n\nasync function editProviderFlow(ctx: SlashCommandContext, providerId: string): Promise<void> {\n const settings = loadSettingsCached();\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) {\n ctx.showError('Provider not found.');\n return;\n }\n\n const name = await askText(ctx, 'Provider name', provider.name);\n if (!name) return;\n const nextProviderId = getCustomProviderId(name);\n if (\n nextProviderId !== providerId &&\n settings.customProviders.some(entry => getCustomProviderId(entry.name) === nextProviderId)\n ) {\n ctx.showError(`Provider already exists: ${name}`);\n return;\n }\n\n const url = await askText(ctx, 'Base URL', provider.url);\n if (!url) return;\n if (!isValidUrl(url)) {\n ctx.showError('Invalid URL. Use a full http(s) URL.');\n return;\n }\n\n const apiKey = await askOptionalText(ctx, 'API key', provider.apiKey);\n upsertCustomProviderInSettings(\n settings,\n {\n ...provider,\n name,\n url,\n apiKey,\n },\n providerId,\n );\n saveSettings(settings);\n ctx.showInfo(`Updated custom provider: ${name}`);\n}\n\nasync function addProviderModelFlow(ctx: SlashCommandContext, providerId: string): Promise<void> {\n const settings = loadSettingsCached();\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) {\n ctx.showError('Provider not found.');\n return;\n }\n\n const modelName = await askText(ctx, `Model ID for ${provider.name}`);\n if (!modelName) return;\n const added = addModelToCustomProviderInSettings(settings, providerId, modelName);\n if (!added) {\n ctx.showError('Unable to add model to provider.');\n return;\n }\n\n saveSettings(settings);\n ctx.showInfo(`Added model: ${toCustomProviderModelId(provider.name, modelName)}`);\n}\n\nasync function removeProviderModelFlow(ctx: SlashCommandContext, providerId: string): Promise<void> {\n const settings = loadSettingsCached();\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) {\n ctx.showError('Provider not found.');\n return;\n }\n if (provider.models.length === 0) {\n ctx.showInfo(`No custom models configured for ${provider.name}.`);\n return;\n }\n\n const modelName = await askSelect(\n ctx,\n `Remove model from ${provider.name}`,\n provider.models.map(model => ({\n label: model,\n value: model,\n description: toCustomProviderModelId(provider.name, model),\n })),\n );\n\n if (!modelName) return;\n\n const removed = removeModelFromCustomProviderInSettings(settings, providerId, modelName);\n if (!removed) {\n ctx.showError('Unable to remove model from provider.');\n return;\n }\n\n saveSettings(settings);\n ctx.showInfo(`Removed model: ${toCustomProviderModelId(provider.name, modelName)}`);\n}\n\nasync function manageProviderFlow(ctx: SlashCommandContext, providerId: string): Promise<void> {\n const settings = loadSettingsCached();\n const provider = settings.customProviders.find(entry => getCustomProviderId(entry.name) === providerId);\n if (!provider) {\n ctx.showError('Provider not found.');\n return;\n }\n\n const action = await askSelect(ctx, `Manage provider: ${provider.name}`, [\n { label: 'Add model', value: 'add-model', description: 'Attach a model ID to this provider' },\n { label: 'Remove model', value: 'remove-model', description: 'Remove a model ID from this provider' },\n { label: 'Edit provider', value: 'edit-provider', description: 'Rename, change URL, or update API key' },\n { label: 'Delete provider', value: 'delete-provider', description: 'Remove provider and all its model IDs' },\n ]);\n\n switch (action) {\n case 'add-model':\n await addProviderModelFlow(ctx, providerId);\n break;\n case 'remove-model':\n await removeProviderModelFlow(ctx, providerId);\n break;\n case 'edit-provider':\n await editProviderFlow(ctx, providerId);\n break;\n case 'delete-provider': {\n const confirm = await askSelect(ctx, `Delete ${provider.name}?`, [\n { label: 'Delete', value: 'delete', description: 'This cannot be undone' },\n ]);\n if (confirm !== 'delete') return;\n const latest = loadSettingsCached();\n removeCustomProviderFromSettings(latest, providerId);\n saveSettings(latest);\n ctx.showInfo(`Deleted custom provider: ${provider.name}`);\n break;\n }\n default:\n break;\n }\n}\n\nexport async function handleCustomProvidersCommand(ctx: SlashCommandContext): Promise<void> {\n const settings = loadSettingsCached();\n const providerOptions = settings.customProviders.map(provider => {\n const providerId = getCustomProviderId(provider.name);\n const modelCount = provider.models.length;\n return {\n label: provider.name,\n value: providerId,\n description: `${provider.url} · ${modelCount} model${modelCount === 1 ? '' : 's'} · ${provider.apiKey ? 'api key set' : 'no api key'}`,\n };\n });\n\n const action = await askSelect(ctx, 'Custom providers', [\n { label: 'Add provider', value: 'add-provider', description: 'Create an OpenAI-compatible provider' },\n ...providerOptions,\n ]);\n\n if (!action) return;\n if (action === 'add-provider') {\n await createProviderFlow(ctx);\n return;\n }\n\n await manageProviderFlow(ctx, action);\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport {\n formatAgentDefinitionDiagnostics,\n getAllowedSubagentIdsForMode,\n getSubagentOwnerModes,\n loadAgentDefinitionsCached,\n} from '../../agents/agent-definitions.js';\nimport { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { ModelSelectorComponent } from '../components/model-selector.js';\nimport type { ModelItem } from '../components/model-selector.js';\nimport type { SlashCommandContext } from './types.js';\n\ninterface SubagentChoice {\n id: string;\n label: string;\n description: string;\n ownerModes: string[];\n}\n\nexport function buildSubagentChoices(\n registry: Awaited<ReturnType<typeof loadAgentDefinitionsCached>>,\n currentModeId?: string,\n): { question: string; choices: SubagentChoice[] } {\n const visibleModes = registry.modes.filter(mode => !mode.hidden);\n const allowedSubagentIds = currentModeId ? new Set(getAllowedSubagentIdsForMode(registry, currentModeId)) : null;\n const activeMode = currentModeId ? visibleModes.find(mode => mode.id === currentModeId) : undefined;\n const visibleSubagents = registry.subagents.filter(subagent => {\n if (subagent.hidden) {\n return false;\n }\n\n if (!allowedSubagentIds) {\n return true;\n }\n\n return allowedSubagentIds.has(subagent.id);\n });\n const choices = visibleSubagents\n .map(subagent => {\n const ownerModes = getSubagentOwnerModes(registry, subagent.id)\n .filter(mode => !mode.hidden)\n .map(mode => mode.name);\n return {\n id: subagent.id,\n label: subagent.name,\n description: ownerModes.length > 0 ? `${subagent.description} Modes: ${ownerModes.join(', ')}.` : subagent.description,\n ownerModes,\n } satisfies SubagentChoice;\n })\n .sort((left, right) => {\n const leftMode = left.ownerModes[0] ?? 'zzz';\n const rightMode = right.ownerModes[0] ?? 'zzz';\n return leftMode.localeCompare(rightMode) || left.label.localeCompare(right.label);\n });\n\n const groupedLines: string[] = [activeMode ? `Select subagent type for ${activeMode.name}` : 'Select subagent type'];\n if (!activeMode && visibleModes.length > 0) {\n groupedLines.push('', 'Available by mode:');\n for (const mode of visibleModes) {\n const members = choices.filter(choice => choice.ownerModes.includes(mode.name));\n if (members.length === 0) {\n continue;\n }\n groupedLines.push(mode.name);\n for (const member of members) {\n groupedLines.push(`- ${member.label}`);\n }\n groupedLines.push('');\n }\n }\n\n const ungrouped = choices.filter(choice => choice.ownerModes.length === 0);\n if (ungrouped.length > 0) {\n groupedLines.push('Ungrouped');\n for (const member of ungrouped) {\n groupedLines.push(`- ${member.label}`);\n }\n }\n\n return {\n question: groupedLines.join('\\n').trimEnd(),\n choices,\n };\n}\n\nasync function showSubagentModelListForScope(\n ctx: SlashCommandContext,\n scope: 'global' | 'thread',\n agentType: string,\n agentTypeLabel: string,\n): Promise<void> {\n const availableModels = await ctx.state.harness.listAvailableModels();\n\n if (availableModels.length === 0) {\n ctx.showInfo('No models available. Check your Mastra configuration.');\n return;\n }\n\n const currentSubagentModel = await ctx.state.harness.getSubagentModelId({ agentType });\n const scopeLabel = scope === 'global' ? `${agentTypeLabel} · Global` : `${agentTypeLabel} · Thread`;\n\n return new Promise(resolve => {\n const selector = new ModelSelectorComponent({\n tui: ctx.state.ui,\n models: availableModels,\n currentModelId: currentSubagentModel ?? undefined,\n title: `Select subagent model (${scopeLabel})`,\n onSelect: async (model: ModelItem) => {\n ctx.state.ui.hideOverlay();\n try {\n await ctx.state.harness.setSubagentModelId({ modelId: model.id, agentType });\n if (scope === 'global') {\n const settings = loadSettingsCached();\n settings.models.subagentModels[agentType] = model.id;\n saveSettings(settings);\n }\n ctx.showInfo(`Subagent model set for ${scopeLabel}: ${model.id}`);\n } catch (err) {\n ctx.showError(`Failed to set subagent model: ${err instanceof Error ? err.message : String(err)}`);\n }\n resolve();\n },\n onCancel: () => {\n ctx.state.ui.hideOverlay();\n resolve();\n },\n });\n\n ctx.state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n selector.focused = true;\n });\n}\n\nasync function showSubagentScopeThenList(\n ctx: SlashCommandContext,\n agentType: string,\n agentTypeLabel: string,\n): Promise<void> {\n const scopes = [\n {\n label: 'Thread default',\n description: `Default for ${agentTypeLabel} subagents in this thread`,\n scope: 'thread' as const,\n },\n {\n label: 'Global default',\n description: `Default for ${agentTypeLabel} subagents in all threads`,\n scope: 'global' as const,\n },\n ];\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Select scope for ${agentTypeLabel} subagents`,\n options: scopes.map(s => ({\n label: s.label,\n description: s.description,\n })),\n formatResult: answer => `${agentTypeLabel} · ${answer}`,\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n try {\n const selected = scopes.find(s => s.label === answer);\n if (selected) {\n await showSubagentModelListForScope(ctx, selected.scope, agentType, agentTypeLabel);\n }\n } catch (err) {\n ctx.showError(`Subagent selection failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nexport async function handleSubagentsCommand(ctx: SlashCommandContext): Promise<void> {\n const harnessState = ctx.state.harness.getState() as { projectPath?: string } | undefined;\n const projectPath = harnessState?.projectPath ?? process.cwd();\n const registry = loadAgentDefinitionsCached(projectPath);\n const currentModeId = ctx.state.harness.getCurrentModeId();\n const customDiagnostics = registry.diagnostics.filter(diagnostic => diagnostic.scope !== 'builtin');\n const diagnosticsMessage = formatAgentDefinitionDiagnostics(customDiagnostics);\n if (diagnosticsMessage) {\n const hasError = customDiagnostics.some(diagnostic => diagnostic.severity === 'error');\n if (hasError) {\n ctx.showError(diagnosticsMessage);\n } else {\n ctx.showInfo(diagnosticsMessage);\n }\n }\n\n const { question, choices: agentTypes } = buildSubagentChoices(registry, currentModeId);\n\n if (agentTypes.length === 0) {\n ctx.showInfo('No subagents available for this project.');\n return;\n }\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\n options: agentTypes.map(t => ({\n label: t.label,\n description: t.description,\n })),\n formatResult: answer => `Subagent: ${answer}`,\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n try {\n const selected = agentTypes.find(t => t.label === answer);\n if (selected) {\n await showSubagentScopeThenList(ctx, selected.id, selected.label);\n }\n } catch (err) {\n ctx.showError(`Subagent selection failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","/**\n * Observational Memory settings component.\n * Uses pi-tui's SettingsList for a clean settings UI with\n * threshold configuration and model selection submenus.\n *\n * Changes apply immediately — Esc closes the panel.\n */\n\nimport {\n Box,\n Container,\n fuzzyFilter,\n getEditorKeybindings,\n Input,\n SelectList,\n SettingsList,\n Spacer,\n Text,\n} from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, SettingItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSettingsListTheme, getSelectListTheme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface OMSettingsConfig {\n observerModelId: string;\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n}\n\nexport interface OMSettingsCallbacks {\n onObserverModelChange: (modelId: string) => void;\n onReflectorModelChange: (modelId: string) => void;\n onObservationThresholdChange: (value: number) => void;\n onReflectionThresholdChange: (value: number) => void;\n onClose: () => void;\n}\n\nexport interface ModelOption {\n id: string;\n label: string;\n}\n\n// =============================================================================\n// Threshold presets (in tokens)\n// =============================================================================\n\nconst OBSERVATION_THRESHOLDS = [5_000, 10_000, 15_000, 20_000, 30_000, 50_000, 75_000, 100_000];\n\nconst REFLECTION_THRESHOLDS = [10_000, 20_000, 30_000, 40_000, 60_000, 80_000, 100_000, 150_000];\n\nfunction formatTokens(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(0)}k`;\n return String(n);\n}\n\nfunction parseTokenInput(input: string): number | null {\n const trimmed = input.trim().toLowerCase();\n if (!trimmed) return null;\n\n // Match patterns like \"30k\", \"30\", \"30000\", \"1.5k\"\n const match = trimmed.match(/^(\\d+(?:\\.\\d+)?)\\s*k?$/);\n if (!match) return null;\n\n const num = parseFloat(match[1]!);\n if (isNaN(num) || num <= 0) return null;\n\n // \"30k\" → 30,000\n if (trimmed.endsWith('k')) {\n return num * 1000;\n }\n // Small numbers (< 500) assumed to be in thousands: \"30\" → 30,000\n if (num < 500) {\n return num * 1000;\n }\n // Large numbers used as-is: \"30000\" → 30,000\n return num;\n}\n\nconst KITTY_CSI_U_REGEX = new RegExp('^\\\\x1b\\\\[(\\\\d+)(?::(\\\\d*))?(?::(\\\\d+))?(?:;(\\\\d+))?(?::(\\\\d+))?u$');\nconst KITTY_MOD_SHIFT = 1;\nconst KITTY_MOD_ALT = 2;\nconst KITTY_MOD_CTRL = 4;\nconst KITTY_LOCK_MASK = 64 + 128; // Caps Lock + Num Lock\nconst KITTY_ALLOWED_MODIFIERS = KITTY_MOD_SHIFT | KITTY_LOCK_MASK;\n\nfunction decodeKittyPrintable(data: string): string | undefined {\n const match = data.match(KITTY_CSI_U_REGEX);\n if (!match) return undefined;\n\n const codepoint = Number.parseInt(match[1] ?? '', 10);\n if (!Number.isFinite(codepoint)) return undefined;\n\n const shiftedKey = match[2] && match[2].length > 0 ? Number.parseInt(match[2], 10) : undefined;\n const modValue = match[4] ? Number.parseInt(match[4], 10) : 1;\n const modifier = Number.isFinite(modValue) ? modValue - 1 : 0;\n\n if ((modifier & ~KITTY_ALLOWED_MODIFIERS) !== 0) return undefined;\n if (modifier & (KITTY_MOD_ALT | KITTY_MOD_CTRL)) return undefined;\n\n let effectiveCodepoint = codepoint;\n if (modifier & KITTY_MOD_SHIFT && typeof shiftedKey === 'number') {\n effectiveCodepoint = shiftedKey;\n }\n\n if (!Number.isFinite(effectiveCodepoint) || effectiveCodepoint < 32) return undefined;\n\n try {\n return String.fromCodePoint(effectiveCodepoint);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeSearchInput(data: string): string {\n const kittyPrintable = decodeKittyPrintable(data);\n return kittyPrintable ?? data;\n}\n\n// =============================================================================\n// Threshold Input Submenu\n// =============================================================================\n\nclass ThresholdSubmenu extends Container {\n private input: Input;\n private selectList: SelectList;\n private onDone: (value: number) => void;\n private onBack: () => void;\n private inInputMode = true;\n\n constructor(\n title: string,\n currentValue: number,\n presets: number[],\n onDone: (value: number) => void,\n onBack: () => void,\n ) {\n super();\n this.onDone = onDone;\n this.onBack = onBack;\n\n this.addChild(new Text(theme.bold(theme.fg('accent', title)), 0, 0));\n this.addChild(new Spacer(1));\n\n // Input for custom value — type a number like 30 for 30k\n this.addChild(new Text(theme.fg('muted', ' _k tokens (type a number, e.g. 30 for 30k):'), 0, 0));\n this.input = new Input();\n this.addChild(this.input);\n this.addChild(new Spacer(1));\n\n // Preset list\n this.addChild(new Text(theme.fg('muted', ' Or pick a preset:'), 0, 0));\n\n const items: SelectItem[] = presets.map(p => ({\n value: String(p),\n label: ` ${formatTokens(p)} tokens`,\n }));\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n // Pre-select current value\n const currentIndex = presets.indexOf(currentValue);\n if (currentIndex !== -1) {\n this.selectList.setSelectedIndex(currentIndex);\n }\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.onDone(parseInt(item.value, 10));\n };\n this.selectList.onCancel = onBack;\n\n this.addChild(this.selectList);\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('dim', ' Enter to confirm · ↓ for presets · Esc to go back'), 0, 0));\n }\n\n handleInput(data: string): void {\n if (this.inInputMode) {\n // Enter — submit the typed value\n if (data === '\\r' || data === '\\n') {\n const parsed = parseTokenInput(this.input.getValue());\n if (parsed) {\n this.onDone(parsed);\n }\n return;\n }\n\n // Escape\n if (data === '\\x1b' || data === '\\x1b\\x1b') {\n this.onBack();\n return;\n }\n\n // Down arrow — switch to preset list\n if (data === '\\x1b[B') {\n this.inInputMode = false;\n return;\n }\n\n // Delegate to input (numbers, backspace, etc.)\n this.input.handleInput(data);\n } else {\n // In preset list mode\n // Escape — go back (handled by selectList.onCancel)\n this.selectList.handleInput(data);\n }\n }\n}\n\n// =============================================================================\n// Model Select Submenu\n// =============================================================================\n\nexport class ModelSelectSubmenu extends Container {\n private searchInput: Input;\n private listContainer: Container;\n private allModels: ModelOption[];\n private filteredModels: ModelOption[];\n private selectedIndex = 0;\n private currentModelId: string;\n private onSelect: (modelId: string) => void;\n private onCancel: () => void;\n private tui: TUI;\n\n constructor(\n title: string,\n models: ModelOption[],\n currentModelId: string,\n onSelect: (modelId: string) => void,\n onCancel: () => void,\n tui: TUI,\n ) {\n super();\n this.allModels = models;\n this.filteredModels = models;\n this.currentModelId = currentModelId;\n this.onSelect = onSelect;\n this.onCancel = onCancel;\n this.tui = tui;\n\n this.addChild(new Text(theme.bold(theme.fg('accent', title)), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Type to search · ↑↓ navigate · Enter select · Esc back'), 0, 0));\n this.addChild(new Spacer(1));\n\n this.searchInput = new Input();\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n // Pre-select current model\n const currentIndex = models.findIndex(m => m.id === currentModelId);\n if (currentIndex !== -1) {\n this.selectedIndex = currentIndex;\n }\n\n this.updateList();\n }\n\n private filterModels(query: string): void {\n this.filteredModels = query ? fuzzyFilter(this.allModels, query, m => `${m.id} ${m.label}`) : this.allModels;\n\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredModels.length - 1));\n this.updateList();\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const maxVisible = 10;\n const total = this.filteredModels.length;\n const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), total - maxVisible));\n const endIndex = Math.min(startIndex + maxVisible, total);\n\n for (let i = startIndex; i < endIndex; i++) {\n const item = this.filteredModels[i]!;\n const isSelected = i === this.selectedIndex;\n const isCurrent = item.id === this.currentModelId;\n const checkmark = isCurrent ? theme.fg('success', ' ✓') : '';\n\n const line = isSelected ? theme.fg('accent', `→ ${item.label}`) + checkmark : ` ${item.label}` + checkmark;\n\n this.listContainer.addChild(new Text(line, 0, 0));\n }\n\n if (startIndex > 0 || endIndex < total) {\n this.listContainer.addChild(new Text(theme.fg('muted', `(${this.selectedIndex + 1}/${total})`), 0, 0));\n }\n\n if (total === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No matching models'), 0, 0));\n }\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n const total = this.filteredModels.length;\n\n if (kb.matches(data, 'selectUp')) {\n if (total === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? total - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(data, 'selectDown')) {\n if (total === 0) return;\n this.selectedIndex = this.selectedIndex === total - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(data, 'selectConfirm')) {\n const selected = this.filteredModels[this.selectedIndex];\n if (selected) this.onSelect(selected.id);\n } else if (kb.matches(data, 'selectCancel')) {\n this.onCancel();\n } else {\n const normalized = normalizeSearchInput(data);\n this.searchInput.handleInput(normalized);\n this.filterModels(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n}\n\n// =============================================================================\n// OM Settings Component\n// =============================================================================\n\nexport class OMSettingsComponent extends Box implements Focusable {\n private settingsList: SettingsList;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(config: OMSettingsConfig, callbacks: OMSettingsCallbacks, models: ModelOption[], tui: TUI) {\n super(2, 1, (text: string) => theme.bg('overlayBg', text));\n\n // Title\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Observational Memory Settings')), 0, 0));\n this.addChild(new Spacer(1));\n\n // Build settings items\n const items: SettingItem[] = [\n {\n id: 'observer-model',\n label: 'Observer model',\n description: 'Model used for observing and summarizing message history',\n currentValue: getShortModelName(config.observerModelId),\n submenu: (_currentValue, done) =>\n new ModelSelectSubmenu(\n 'Observer Model',\n models,\n config.observerModelId,\n modelId => {\n config.observerModelId = modelId;\n callbacks.onObserverModelChange(modelId);\n done(getShortModelName(modelId));\n },\n () => done(),\n tui,\n ),\n },\n {\n id: 'reflector-model',\n label: 'Reflector model',\n description: 'Model used for compressing observations when they grow too large',\n currentValue: getShortModelName(config.reflectorModelId),\n submenu: (_currentValue, done) =>\n new ModelSelectSubmenu(\n 'Reflector Model',\n models,\n config.reflectorModelId,\n modelId => {\n config.reflectorModelId = modelId;\n callbacks.onReflectorModelChange(modelId);\n done(getShortModelName(modelId));\n },\n () => done(),\n tui,\n ),\n },\n {\n id: 'obs-threshold',\n label: 'Observation threshold',\n description:\n 'Token count before triggering observation. ' +\n 'Lower = more frequent, higher = more context before observing',\n currentValue: formatTokens(config.observationThreshold),\n submenu: (_currentValue, done) =>\n new ThresholdSubmenu(\n 'Observation Threshold',\n config.observationThreshold,\n OBSERVATION_THRESHOLDS,\n value => {\n config.observationThreshold = value;\n callbacks.onObservationThresholdChange(value);\n done(formatTokens(value));\n },\n () => done(),\n ),\n },\n {\n id: 'ref-threshold',\n label: 'Reflection threshold',\n description:\n 'Token count of observations before triggering compression. ' +\n 'Lower = more frequent, higher = more observations before compressing',\n currentValue: formatTokens(config.reflectionThreshold),\n submenu: (_currentValue, done) =>\n new ThresholdSubmenu(\n 'Reflection Threshold',\n config.reflectionThreshold,\n REFLECTION_THRESHOLDS,\n value => {\n config.reflectionThreshold = value;\n callbacks.onReflectionThresholdChange(value);\n done(formatTokens(value));\n },\n () => done(),\n ),\n },\n ];\n\n this.settingsList = new SettingsList(\n items,\n 10,\n getSettingsListTheme(),\n (_id, _newValue) => {\n // All changes handled via submenu callbacks\n },\n callbacks.onClose,\n );\n\n this.addChild(this.settingsList);\n }\n\n handleInput(data: string): void {\n this.settingsList.handleInput(data);\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getShortModelName(modelId: string): string {\n if (!modelId) return '(none)';\n const parts = modelId.split('/');\n return parts.length > 1 ? parts.slice(1).join('/') : modelId;\n}\n","import { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport { OMSettingsComponent } from '../components/om-settings.js';\nimport type { SlashCommandContext } from './types.js';\n\nfunction persistOmModelOverride(modelId: string): void {\n const settings = loadSettingsCached();\n settings.models.activeOmPackId = 'custom';\n settings.models.omModelOverride = modelId;\n saveSettings(settings);\n}\n\nexport async function handleOMCommand(ctx: SlashCommandContext): Promise<void> {\n const availableModels = await ctx.state.harness.listAvailableModels();\n const modelOptions = availableModels.map(m => ({\n id: m.id,\n label: m.id,\n }));\n\n const config = {\n observerModelId: ctx.state.harness.getObserverModelId() ?? '',\n reflectorModelId: ctx.state.harness.getReflectorModelId() ?? '',\n observationThreshold: ctx.state.harness.getObservationThreshold() ?? 30000,\n reflectionThreshold: ctx.state.harness.getReflectionThreshold() ?? 40000,\n };\n\n return new Promise<void>(resolve => {\n const settings = new OMSettingsComponent(\n config,\n {\n onObserverModelChange: async modelId => {\n await ctx.state.harness.switchObserverModel({ modelId });\n persistOmModelOverride(modelId);\n ctx.showInfo(`Observer model → ${modelId}`);\n },\n onReflectorModelChange: async modelId => {\n await ctx.state.harness.switchReflectorModel({ modelId });\n persistOmModelOverride(modelId);\n ctx.showInfo(`Reflector model → ${modelId}`);\n },\n onObservationThresholdChange: value => {\n ctx.state.harness.setState({ observationThreshold: value } as any);\n },\n onReflectionThresholdChange: value => {\n ctx.state.harness.setState({ reflectionThreshold: value } as any);\n },\n onClose: () => {\n ctx.state.ui.hideOverlay();\n ctx.updateStatusLine();\n resolve();\n },\n },\n modelOptions,\n ctx.state.ui,\n );\n\n ctx.state.ui.showOverlay(settings, {\n width: '80%',\n maxHeight: '70%',\n anchor: 'center',\n });\n settings.focused = true;\n });\n}\n","/**\n * General settings component.\n * Uses pi-tui's SettingsList for a clean overlay with\n * notifications, YOLO mode, and thinking level configuration.\n *\n * Changes apply immediately — Esc closes the panel.\n */\n\nimport { Box, Container, Input, SelectList, SettingsList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, SettingItem } from '@mariozechner/pi-tui';\nimport type { StorageBackend } from '../../onboarding/settings.js';\nimport type { NotificationMode } from '../notify.js';\nimport { theme, getSettingsListTheme, getSelectListTheme } from '../theme.js';\nimport { getThinkingLevelsForModel } from './thinking-settings.js';\n\n// =============================================================================\n// Types\n// =============================================================================\nexport interface SettingsConfig {\n notifications: NotificationMode;\n yolo: boolean;\n thinkingLevel: string;\n currentModelId: string;\n escapeAsCancel: boolean;\n quietMode: boolean;\n storageBackend: StorageBackend;\n pgConnectionString: string;\n libsqlUrl: string;\n}\n\nexport interface SettingsCallbacks {\n onNotificationsChange: (mode: NotificationMode) => void;\n onYoloChange: (enabled: boolean) => void;\n onThinkingLevelChange: (level: string) => void;\n onEscapeAsCancelChange: (enabled: boolean) => void;\n onQuietModeChange: (enabled: boolean) => void;\n onStorageBackendChange: (backend: StorageBackend, connectionUrl?: string) => void;\n onClose: () => void;\n}\n\n// =============================================================================\n// Select Submenu (reusable for any enum-style setting)\n// =============================================================================\n\nclass SelectSubmenu extends SelectList {\n constructor(items: SelectItem[], currentValue: string, onSelect: (value: string) => void, onBack: () => void) {\n super(items, Math.min(items.length, 8), getSelectListTheme());\n\n const currentIndex = items.findIndex(i => i.value === currentValue);\n if (currentIndex !== -1) {\n this.setSelectedIndex(currentIndex);\n }\n\n this.onSelect = (item: SelectItem) => {\n onSelect(item.value);\n };\n this.onCancel = onBack;\n }\n}\n\n// =============================================================================\n// Storage Backend Submenu (backend selector → optional PG connection input)\n// =============================================================================\n\nclass StorageBackendSubmenu extends Container {\n private phase: 'select' | 'connection' = 'select';\n private pendingBackend: StorageBackend = 'libsql';\n private selectList: SelectList;\n private input!: Input;\n private onDone: (backend: StorageBackend, connectionUrl?: string) => void;\n private onBack: () => void;\n private currentPgConnectionString: string;\n private currentLibsqlUrl: string;\n\n constructor(\n currentBackend: StorageBackend,\n currentPgConnectionString: string,\n currentLibsqlUrl: string,\n onDone: (backend: StorageBackend, connectionUrl?: string) => void,\n onBack: () => void,\n ) {\n super();\n this.onDone = onDone;\n this.onBack = onBack;\n this.currentPgConnectionString = currentPgConnectionString;\n this.currentLibsqlUrl = currentLibsqlUrl;\n\n // Phase 1: backend selection\n const items: SelectItem[] = [\n {\n value: 'libsql',\n label: ' LibSQL',\n description: 'Local file-based SQLite or remote Turso URL',\n },\n {\n value: 'pg',\n label: ' PostgreSQL',\n description: 'Remote PostgreSQL (requires connection string)',\n },\n ];\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n const currentIndex = items.findIndex(i => i.value === currentBackend);\n if (currentIndex !== -1) this.selectList.setSelectedIndex(currentIndex);\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.pendingBackend = item.value as StorageBackend;\n this.showConnectionInput();\n };\n this.selectList.onCancel = onBack;\n\n this.addChild(this.selectList);\n }\n\n private showConnectionInput(): void {\n this.phase = 'connection';\n this.clear();\n\n if (this.pendingBackend === 'pg') {\n this.addChild(new Text(theme.bold(theme.fg('accent', 'PostgreSQL Connection')), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Enter a connection string:'), 0, 0));\n this.addChild(new Text(theme.fg('dim', 'e.g. postgresql://user:pass@localhost:5432/mydb'), 0, 0));\n } else {\n this.addChild(new Text(theme.bold(theme.fg('accent', 'LibSQL Connection')), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Enter a URL or leave empty for default local file:'), 0, 0));\n this.addChild(new Text(theme.fg('dim', 'e.g. libsql://your-db.turso.io'), 0, 0));\n }\n this.addChild(new Spacer(1));\n\n this.input = new Input();\n const currentValue = this.pendingBackend === 'pg' ? this.currentPgConnectionString : this.currentLibsqlUrl;\n if (currentValue) {\n this.input.setValue(currentValue);\n }\n this.addChild(this.input);\n\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('dim', 'Enter to save · Esc to go back'), 0, 0));\n }\n\n handleInput(data: string): void {\n if (this.phase === 'select') {\n this.selectList.handleInput(data);\n return;\n }\n\n // Connection string input phase\n if (data === '\\r' || data === '\\n') {\n const value = this.input.getValue().trim();\n if (this.pendingBackend === 'pg') {\n // PG requires a connection string\n if (value) {\n this.onDone('pg', value);\n }\n } else {\n // LibSQL: empty = default local file, non-empty = custom URL\n this.onDone('libsql', value || undefined);\n }\n return;\n }\n\n if (data === '\\x1b' || data === '\\x1b\\x1b') {\n this.onBack();\n return;\n }\n\n this.input.handleInput(data);\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction storageLabel(config: SettingsConfig): string {\n if (config.storageBackend === 'pg') return 'PostgreSQL';\n if (config.libsqlUrl) return `LibSQL (${config.libsqlUrl})`;\n return 'LibSQL (local file)';\n}\n\n// =============================================================================\n// Settings Component\n// =============================================================================\n\nexport class SettingsComponent extends Box implements Focusable {\n private settingsList: SettingsList;\n private _focused = false;\n\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n super(2, 1, (text: string) => theme.bg('overlayBg', text));\n\n // Title\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Settings')), 0, 0));\n this.addChild(new Spacer(1));\n\n // Build settings items\n const notificationModes: {\n value: NotificationMode;\n label: string;\n desc: string;\n }[] = [\n { value: 'off', label: 'Off', desc: 'No notifications' },\n { value: 'bell', label: 'Bell', desc: 'Terminal bell (\\\\x07)' },\n { value: 'system', label: 'System', desc: 'Native OS notification' },\n { value: 'both', label: 'Both', desc: 'Bell + system notification' },\n ];\n\n const thinkingLevels = getThinkingLevelsForModel(config.currentModelId).map(level => ({\n value: level.id,\n label: level.label,\n desc: level.description,\n }));\n\n const getNotifLabel = (mode: NotificationMode) => notificationModes.find(m => m.value === mode)?.label ?? mode;\n\n const getThinkingLabel = (level: string) => thinkingLevels.find(l => l.value === level)?.label ?? level;\n\n const items: SettingItem[] = [\n {\n id: 'notifications',\n label: 'Notifications',\n description: 'How to alert when the agent needs attention',\n currentValue: getNotifLabel(config.notifications),\n submenu: (_currentValue, done) =>\n new SelectSubmenu(\n notificationModes.map(m => ({\n value: m.value,\n label: ` ${m.label}`,\n description: m.desc,\n })),\n config.notifications,\n value => {\n config.notifications = value as NotificationMode;\n callbacks.onNotificationsChange(config.notifications);\n done(getNotifLabel(config.notifications));\n },\n () => done(),\n ),\n },\n {\n id: 'yolo',\n label: 'YOLO mode',\n description: 'Auto-approve all tool calls without confirmation',\n currentValue: config.yolo ? 'On' : 'Off',\n submenu: (_currentValue, done) =>\n new SelectSubmenu(\n [\n {\n value: 'on',\n label: ' On',\n description: 'Auto-approve all tools',\n },\n {\n value: 'off',\n label: ' Off',\n description: 'Require approval for tools',\n },\n ],\n config.yolo ? 'on' : 'off',\n value => {\n config.yolo = value === 'on';\n callbacks.onYoloChange(config.yolo);\n done(config.yolo ? 'On' : 'Off');\n },\n () => done(),\n ),\n },\n {\n id: 'thinking',\n label: 'Thinking level',\n description: 'Reasoning depth level',\n currentValue: getThinkingLabel(config.thinkingLevel),\n submenu: (_currentValue, done) =>\n new SelectSubmenu(\n thinkingLevels.map(l => ({\n value: l.value,\n label: ` ${l.label}`,\n description: l.desc,\n })),\n config.thinkingLevel,\n value => {\n config.thinkingLevel = value;\n callbacks.onThinkingLevelChange(value);\n done(getThinkingLabel(value));\n },\n () => done(),\n ),\n },\n {\n id: 'escapeAsCancel',\n label: 'Escape cancels',\n description: 'Use Escape to cancel/clear (Ctrl+C always works).',\n currentValue: config.escapeAsCancel ? 'On' : 'Off',\n submenu: (_currentValue, done) =>\n new SelectSubmenu(\n [\n {\n value: 'on',\n label: ' On',\n description: 'Escape clears input / aborts',\n },\n {\n value: 'off',\n label: ' Off',\n description: 'Only Ctrl+C clears / aborts',\n },\n ],\n config.escapeAsCancel ? 'on' : 'off',\n value => {\n config.escapeAsCancel = value === 'on';\n callbacks.onEscapeAsCancelChange(config.escapeAsCancel);\n done(config.escapeAsCancel ? 'On' : 'Off');\n },\n () => done(),\n ),\n },\n {\n id: 'quietMode',\n label: 'Quiet mode',\n description: 'Collapse subagent output to a single line after completion.',\n currentValue: config.quietMode ? 'On' : 'Off',\n submenu: (_currentValue, done) =>\n new SelectSubmenu(\n [\n {\n value: 'on',\n label: ' On',\n description: 'Auto-collapse subagent output when done',\n },\n {\n value: 'off',\n label: ' Off',\n description: 'Keep subagent output visible when done',\n },\n ],\n config.quietMode ? 'on' : 'off',\n value => {\n config.quietMode = value === 'on';\n callbacks.onQuietModeChange(config.quietMode);\n done(config.quietMode ? 'On' : 'Off');\n },\n () => done(),\n ),\n },\n {\n id: 'storageBackend',\n label: 'Storage backend',\n description: 'Database backend for threads, memory, and agent data (restart required)',\n currentValue: storageLabel(config),\n submenu: (_currentValue, done) =>\n new StorageBackendSubmenu(\n config.storageBackend,\n config.pgConnectionString,\n config.libsqlUrl,\n (backend: StorageBackend, connectionUrl?: string) => {\n config.storageBackend = backend;\n if (backend === 'pg' && connectionUrl !== undefined) {\n config.pgConnectionString = connectionUrl;\n } else if (backend === 'libsql') {\n config.libsqlUrl = connectionUrl ?? '';\n }\n callbacks.onStorageBackendChange(backend, connectionUrl);\n done(storageLabel(config));\n },\n () => done(),\n ),\n },\n ];\n\n this.settingsList = new SettingsList(\n items,\n 10,\n getSettingsListTheme(),\n (_id, _newValue) => {\n // All changes handled via submenu callbacks\n },\n callbacks.onClose,\n );\n\n this.addChild(this.settingsList);\n }\n\n handleInput(data: string): void {\n this.settingsList.handleInput(data);\n }\n}\n","import type { StorageBackend, ThinkingLevelSetting } from '../../onboarding/settings.js';\nimport { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport { SettingsComponent } from '../components/settings.js';\nimport type { NotificationMode } from '../notify.js';\nimport type { SlashCommandContext } from './types.js';\n\nexport async function handleSettingsCommand(ctx: SlashCommandContext): Promise<void> {\n const state = ctx.state.harness.getState() as any;\n const globalSettings = loadSettingsCached();\n const config = {\n notifications: (state?.notifications ?? 'off') as NotificationMode,\n yolo: state?.yolo === true,\n thinkingLevel: (state?.thinkingLevel ?? 'off') as string,\n currentModelId: ctx.state.harness.getCurrentModelId() ?? '',\n escapeAsCancel: ctx.state.editor.escapeEnabled,\n quietMode: globalSettings.preferences.quietMode,\n storageBackend: globalSettings.storage.backend,\n pgConnectionString: globalSettings.storage.pg?.connectionString ?? '',\n libsqlUrl: globalSettings.storage.libsql?.url ?? '',\n };\n\n return new Promise<void>(resolve => {\n const settings = new SettingsComponent(config, {\n onNotificationsChange: async mode => {\n await ctx.state.harness.setState({ notifications: mode });\n ctx.showInfo(`Notifications: ${mode}`);\n },\n onYoloChange: async enabled => {\n await ctx.state.harness.setState({ yolo: enabled } as any);\n },\n onThinkingLevelChange: async level => {\n await ctx.state.harness.setState({ thinkingLevel: level } as any);\n const current = loadSettingsCached();\n current.preferences.thinkingLevel = level as ThinkingLevelSetting;\n saveSettings(current);\n },\n onEscapeAsCancelChange: async enabled => {\n ctx.state.editor.escapeEnabled = enabled;\n await ctx.state.harness.setState({ escapeAsCancel: enabled });\n await ctx.state.harness.setThreadSetting({ key: 'escapeAsCancel', value: enabled });\n },\n onQuietModeChange: enabled => {\n const current = loadSettingsCached();\n current.preferences.quietMode = enabled;\n saveSettings(current);\n ctx.state.quietMode = enabled;\n },\n onStorageBackendChange: (backend: StorageBackend, connectionUrl?: string) => {\n const current = loadSettingsCached();\n current.storage.backend = backend;\n if (backend === 'pg' && connectionUrl !== undefined) {\n current.storage.pg = { ...current.storage.pg, connectionString: connectionUrl };\n } else if (backend === 'libsql') {\n current.storage.libsql = { ...current.storage.libsql, url: connectionUrl || undefined };\n }\n saveSettings(current);\n ctx.state.ui.hideOverlay();\n ctx.stop();\n const label = backend === 'pg' ? 'PostgreSQL' : 'LibSQL';\n console.info(`\\nStorage backend changed to ${label}. Restarting is required.\\n`);\n process.exit(0);\n },\n onClose: () => {\n ctx.state.ui.hideOverlay();\n resolve();\n },\n });\n\n ctx.state.ui.showOverlay(settings, {\n width: '60%',\n maxHeight: '50%',\n anchor: 'center',\n });\n settings.focused = true;\n });\n}\n","/**\n * Login dialog component - handles OAuth login flow UI\n */\n\nimport { exec } from 'node:child_process';\nimport { Box, Container, getEditorKeybindings, Input, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport { getOAuthProviders } from '../../auth/index.js';\nimport { theme } from '../theme.js';\n\nexport class LoginDialogComponent extends Box implements Focusable {\n private contentContainer: Container;\n private input: Input;\n private tui: TUI;\n private abortController = new AbortController();\n private inputResolver?: (value: string) => void;\n private inputRejecter?: (error: Error) => void;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n this.input.focused = value;\n }\n\n constructor(\n tui: TUI,\n providerId: string,\n private onComplete: (success: boolean, message?: string) => void,\n ) {\n // Box with padding and background\n super(2, 1, text => theme.bg('overlayBg', text));\n this.tui = tui;\n\n const providerInfo = getOAuthProviders().find(p => p.id === providerId);\n const providerName = providerInfo?.name || providerId;\n\n // Title\n this.addChild(new Text(theme.fg('warning', `Login to ${providerName}`)));\n this.addChild(new Spacer(1));\n\n // Dynamic content area\n this.contentContainer = new Container();\n this.addChild(this.contentContainer);\n\n // Input (always present, used when needed)\n this.input = new Input();\n this.input.onSubmit = () => {\n if (this.inputResolver) {\n this.inputResolver(this.input.getValue());\n this.inputResolver = undefined;\n this.inputRejecter = undefined;\n }\n };\n this.input.onEscape = () => {\n this.cancel();\n };\n }\n\n get signal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private cancel(): void {\n try {\n this.abortController.abort();\n } catch {}\n if (this.inputRejecter) {\n this.inputRejecter(new Error('Login cancelled'));\n this.inputResolver = undefined;\n this.inputRejecter = undefined;\n }\n this.onComplete(false, 'Login cancelled');\n }\n\n /**\n * Called by onAuth callback - show URL and optional instructions\n */\n showAuth(url: string, instructions?: string): void {\n this.contentContainer.clear();\n\n this.contentContainer.addChild(new Text(theme.fg('accent', url)));\n\n const clickHint = process.platform === 'darwin' ? 'Cmd+click to open' : 'Ctrl+click to open';\n const hyperlink = `\\x1b]8;;${url}\\x07${clickHint}\\x1b]8;;\\x07`;\n this.contentContainer.addChild(new Text(theme.fg('muted', hyperlink)));\n\n if (instructions) {\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('warning', instructions)));\n }\n\n // Try to open browser\n const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${openCmd} \"${url}\"`);\n\n this.tui.requestRender();\n }\n\n /**\n * Called by onPrompt callback - show prompt and wait for input\n */\n showPrompt(message: string, placeholder?: string): Promise<string> {\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('text', message)));\n if (placeholder) {\n this.contentContainer.addChild(new Text(theme.fg('muted', `e.g., ${placeholder}`)));\n }\n this.contentContainer.addChild(this.input);\n this.contentContainer.addChild(new Text(theme.fg('muted', '(Escape to cancel, Enter to submit)')));\n\n this.input.setValue('');\n this.tui.requestRender();\n\n return new Promise((resolve, reject) => {\n this.inputResolver = resolve;\n this.inputRejecter = reject;\n });\n }\n\n /**\n * Show progress message\n */\n showProgress(message: string): void {\n this.contentContainer.addChild(new Text(theme.fg('muted', message)));\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n\n if (kb.matches(data, 'selectCancel')) {\n this.cancel();\n return;\n }\n\n // Pass to input\n this.input.handleInput(data);\n }\n}\n","import { Spacer } from '@mariozechner/pi-tui';\nimport { ANTHROPIC_OAUTH_PROVIDER_ID } from '../../auth/claude-max-warning.js';\nimport { getOAuthProviders, PROVIDER_DEFAULT_MODELS } from '../../auth/storage.js';\nimport { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport { getApiKeyProviderOptions, getStoredAuthDescription, runApiKeyLoginFlow } from '../api-key-auth.js';\nimport { showClaudeMaxOAuthWarning } from '../claude-max-warning.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { LoginDialogComponent } from '../components/login-dialog.js';\nimport type { SlashCommandContext } from './types.js';\n\ntype LoginAction =\n | { kind: 'oauth'; providerId: string; label: string; description?: string }\n | { kind: 'api-key'; label: string; description: string };\n\nasync function performLogin(ctx: SlashCommandContext, providerId: string): Promise<void> {\n const provider = getOAuthProviders().find(p => p.id === providerId);\n const providerName = provider?.name || providerId;\n\n if (!ctx.authStorage) {\n ctx.showError('Auth storage not configured');\n return;\n }\n\n // Show Claude Max OAuth warning every time the user attempts Anthropic login\n if (providerId === ANTHROPIC_OAUTH_PROVIDER_ID) {\n const warningResult = await showClaudeMaxOAuthWarning(ctx.state, 'login');\n if (warningResult !== 'continue') {\n return; // cancel — caller returns to provider selection\n }\n const settings = loadSettingsCached();\n settings.onboarding.claudeMaxOAuthWarningAcknowledgedAt = new Date().toISOString();\n saveSettings(settings);\n }\n\n return new Promise(resolve => {\n const dialog = new LoginDialogComponent(ctx.state.ui, providerId, (success, message) => {\n ctx.state.ui.hideOverlay();\n if (success) {\n ctx.showInfo(`Successfully logged in to ${providerName}`);\n } else if (message) {\n ctx.showInfo(message);\n }\n resolve();\n });\n\n ctx.state.ui.showOverlay(dialog, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n dialog.focused = true;\n\n ctx\n .authStorage!.login(providerId, {\n onAuth: (info: { url: string; instructions?: string }) => {\n dialog.showAuth(info.url, info.instructions);\n },\n onPrompt: async (prompt: { message: string; placeholder?: string }) => {\n return dialog.showPrompt(prompt.message, prompt.placeholder);\n },\n onProgress: (message: string) => {\n dialog.showProgress(message);\n },\n signal: dialog.signal,\n })\n .then(async () => {\n ctx.state.ui.hideOverlay();\n\n const defaultModel = PROVIDER_DEFAULT_MODELS[providerId as keyof typeof PROVIDER_DEFAULT_MODELS];\n if (defaultModel) {\n await ctx.state.harness.switchModel({ modelId: defaultModel });\n ctx.showInfo(`Logged in to ${providerName} - switched to ${defaultModel}`);\n } else {\n ctx.showInfo(`Successfully logged in to ${providerName}`);\n }\n\n resolve();\n })\n .catch((error: Error) => {\n ctx.state.ui.hideOverlay();\n if (error.message !== 'Login cancelled') {\n ctx.showError(`Failed to login: ${error.message}`);\n }\n resolve();\n });\n });\n}\n\nexport async function handleLoginCommand(ctx: SlashCommandContext, mode: 'login' | 'logout'): Promise<void> {\n const allProviders = getOAuthProviders();\n let actions: LoginAction[];\n if (mode === 'login') {\n actions = [\n ...allProviders.map(provider => ({\n kind: 'oauth' as const,\n providerId: provider.id,\n label: provider.name,\n description: ctx.authStorage?.isLoggedIn(provider.id) ? '(logged in)' : undefined,\n })),\n {\n kind: 'api-key' as const,\n label: 'Set API key',\n description: 'Store a named Anthropic, OpenAI, or Google API key locally',\n },\n ];\n } else {\n const providerLabels = new Map<string, string>();\n for (const provider of allProviders) {\n providerLabels.set(provider.id, provider.name);\n }\n for (const option of getApiKeyProviderOptions(allProviders)) {\n if (!providerLabels.has(option.providerId)) {\n providerLabels.set(option.providerId, option.label);\n }\n }\n\n actions = Array.from(providerLabels.entries()).reduce<LoginAction[]>((acc, [providerId, label]) => {\n const description = getStoredAuthDescription(ctx.authStorage, providerId as any, allProviders);\n if (!description) {\n return acc;\n }\n acc.push({\n kind: 'oauth',\n providerId,\n label,\n description: `(${description})`,\n });\n return acc;\n }, []);\n }\n\n if (actions.length === 0) {\n ctx.showInfo(mode === 'login' ? 'No login methods available.' : 'No stored provider credentials. Use /login first.');\n return;\n }\n\n const action = mode === 'login' ? 'Use which login method?' : 'Remove credentials for which provider?';\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: action,\n options: actions.map(actionItem => ({\n label: actionItem.label,\n description: actionItem.description,\n })),\n formatResult: answer => (mode === 'login' ? `${answer} selected` : `Removed credentials for ${answer}`),\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n const selectedAction = actions.find(actionItem => actionItem.label === answer);\n if (selectedAction) {\n if (mode === 'login' && selectedAction.kind === 'api-key') {\n await runApiKeyLoginFlow({\n state: ctx.state,\n authStorage: ctx.authStorage,\n showInfo: ctx.showInfo,\n showError: ctx.showError,\n switchModel: modelId => ctx.state.harness.switchModel({ modelId }),\n providerDefaults: PROVIDER_DEFAULT_MODELS,\n oauthProviders: allProviders,\n });\n } else if (selectedAction.kind === 'oauth') {\n if (mode === 'login') {\n await performLogin(ctx, selectedAction.providerId);\n } else if (ctx.authStorage) {\n ctx.authStorage.logout(selectedAction.providerId);\n ctx.showInfo(`Removed stored credentials for ${selectedAction.label}`);\n } else {\n ctx.showError('Auth storage not configured');\n }\n }\n }\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleReviewCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n if (!ctx.state.harness.hasModelSelected()) {\n ctx.showInfo('No model selected. Use /models to select a model, or /login to authenticate.');\n return;\n }\n\n // Ensure thread exists\n if (ctx.state.pendingNewThread) {\n await ctx.state.harness.createThread();\n ctx.state.pendingNewThread = false;\n }\n\n const prNumber = args[0];\n const focusArea = args.slice(1).join(' ');\n\n let prompt: string;\n\n if (!prNumber) {\n prompt =\n `List the open pull requests for this repository using \\`gh pr list --limit 20\\`. ` +\n `Present them in a clear table with PR number, title, and author. ` +\n `Then ask me which PR I'd like you to review.`;\n } else {\n prompt =\n `Do a thorough code review of PR #${prNumber}. Follow these steps:\\n\\n` +\n `1. Run \\`gh pr view ${prNumber}\\` to get the PR description and metadata.\\n` +\n `2. Run \\`gh pr diff ${prNumber}\\` to get the full diff.\\n` +\n `3. Run \\`gh pr checks ${prNumber}\\` to check CI status.\\n` +\n `4. Read any relevant source files for full context on the changes.\\n` +\n `5. Provide a detailed code review covering:\\n` +\n ` - Overview of what the PR does\\n` +\n ` - Root cause analysis (if it's a fix)\\n` +\n ` - Code quality assessment\\n` +\n ` - Potential concerns or edge cases\\n` +\n ` - CI status\\n` +\n ` - Suggestions for improvement\\n` +\n ` - Final verdict (approve/request changes/comment)\\n`;\n\n if (focusArea) {\n prompt += `\\nPay special attention to: ${focusArea}\\n`;\n }\n }\n\n ctx.addUserMessage({\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n {\n type: 'text',\n text: prNumber ? `/review ${args.join(' ')}` : '/review',\n },\n ],\n createdAt: new Date(),\n });\n ctx.state.ui.requestRender();\n\n ctx.state.harness.sendMessage({ content: prompt }).catch(error => {\n ctx.showError(error instanceof Error ? error.message : 'Review failed');\n });\n}\n","import type { SlashCommandContext } from './types.js';\n\nconst ULICODE_REPO = 'ngandugilbert/ulicode';\nconst ULICODE_LABEL = 'ulicode';\n\nexport async function handleReportIssueCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n if (!ctx.state.harness.hasModelSelected()) {\n ctx.showInfo('No model selected. Use /models to select a model, or /login to authenticate.');\n return;\n }\n\n // Ensure thread exists\n if (ctx.state.pendingNewThread) {\n await ctx.state.harness.createThread();\n ctx.state.pendingNewThread = false;\n }\n\n const extraContext = args.join(' ').trim();\n\n const prompt =\n `The user wants to report a GitHub issue on ${ULICODE_REPO}. Help them through this process.\\n\\n` +\n (extraContext ? `The user provided this initial context: \"${extraContext}\"\\n\\n` : '') +\n `## Step 1: Understand the problem\\n\\n` +\n `Ask the user to describe the issue in their own words. Ask follow-up questions to gather:\\n` +\n `- What happened / what's wrong\\n` +\n `- What they expected to happen\\n` +\n `- Steps to reproduce (if applicable)\\n\\n` +\n `Also gather environment info by running:\\n` +\n '```\\n' +\n `ulicode --version 2>/dev/null || echo \"unknown\"\\n` +\n `node --version\\n` +\n `uname -s\\n` +\n '```\\n\\n' +\n `Use the conversation history for additional context about what the user was working on when they hit this issue.\\n\\n` +\n `## Step 2: Check for duplicates\\n\\n` +\n `Once you understand the problem, search for similar existing issues:\\n` +\n '```\\n' +\n `gh issue list --repo ${ULICODE_REPO} --label ${ULICODE_LABEL} --state open --limit 50 --json number,title,body\\n` +\n '```\\n\\n' +\n `Also search more broadly:\\n` +\n '```\\n' +\n `gh search issues --repo ${ULICODE_REPO} --state open \"<relevant keywords>\" --limit 20 --json number,title,body,labels\\n` +\n '```\\n\\n' +\n `If you find similar issue(s):\\n` +\n `- Present them with their number, title, and a brief summary\\n` +\n `- Ask the user whether they'd like to add a comment on an existing issue instead of opening a new one\\n` +\n `- If they choose to comment, draft the comment, show it to the user for approval, then run:\\n` +\n '```\\n' +\n `gh issue comment <number> --repo ${ULICODE_REPO} --body \"<comment>\"\\n` +\n '```\\n' +\n `Then stop here.\\n\\n` +\n `## Step 3: Draft the issue\\n\\n` +\n `Based on what you've gathered, write a clear, well-structured issue with:\\n` +\n `- A concise, descriptive title\\n` +\n `- A body covering: description, expected behavior, steps to reproduce, and environment info\\n\\n` +\n `**Show the full title and body to the user and ask for their approval before creating it.** Let them suggest edits.\\n\\n` +\n `## Step 4: Create the issue\\n\\n` +\n `Only after the user approves, create the issue:\\n` +\n '```\\n' +\n `gh issue create --repo ${ULICODE_REPO} --label ${ULICODE_LABEL} --title \"<title>\" --body \"<body>\"\\n` +\n '```\\n\\n' +\n `Report the created issue URL back to the user.`;\n\n ctx.addUserMessage({\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n {\n type: 'text',\n text: extraContext ? `/report-issue ${extraContext}` : '/report-issue',\n },\n ],\n createdAt: new Date(),\n });\n ctx.state.ui.requestRender();\n\n ctx.state.harness.sendMessage({ content: prompt }).catch(error => {\n ctx.showError(error instanceof Error ? error.message : 'Report issue command failed');\n });\n}\n","import type { SlashCommandContext } from './types.js';\n\nexport async function handleSetupCommand(ctx: SlashCommandContext): Promise<void> {\n await ctx.showOnboarding();\n}\n","/**\n * Terminal theme detection for Mastra Code TUI.\n *\n * Detection priority:\n * 1. MASTRA_THEME env var (explicit override)\n * 2. OSC 11 query — asks the terminal for its actual background color\n * 3. COLORFGBG env var (set by some terminal emulators)\n * 4. Default: 'dark'\n */\n\nimport type { ThemeMode } from './theme.js';\n\n/**\n * Query the terminal's background color via OSC 11 and compute luminance.\n * Returns 'dark' or 'light', or null if the terminal doesn't respond.\n *\n * The query sends `\\x1b]11;?\\x07` to stdout. Terminals that support\n * xterm-style OSC queries reply on stdin with something like:\n * \\x1b]11;rgb:0000/0000/0000\\x07 (black background → dark)\n * \\x1b]11;rgb:ffff/ffff/ffff\\x07 (white background → light)\n *\n * We parse the rgb components, compute relative luminance (WCAG),\n * and classify as dark (luma < 0.5) or light (luma >= 0.5).\n */\nfunction queryTerminalBackground(timeoutMs = 200): Promise<ThemeMode | null> {\n return new Promise(resolve => {\n // Can't query if stdin isn't a TTY\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n resolve(null);\n return;\n }\n\n let settled = false;\n let buffer = '';\n let wasRaw: boolean;\n let wasResumed = false;\n let timer: NodeJS.Timeout | undefined;\n\n const cleanup = () => {\n if (settled) return;\n settled = true;\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n process.stdin.removeListener('data', onData);\n // Restore original raw mode state\n try {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(wasRaw);\n }\n } catch {\n // ignore\n }\n // Only pause stdin if we were the ones who resumed it\n if (wasResumed) {\n process.stdin.pause();\n }\n };\n\n const onData = (data: Buffer) => {\n buffer += data.toString();\n\n // Look for the OSC 11 response: \\x1b]11;rgb:RRRR/GGGG/BBBB\\x07 or \\x1b]11;rgb:RRRR/GGGG/BBBB\\x1b\\\\\n const match = buffer.match(/\\x1b\\]11;rgb:([0-9a-fA-F]+)\\/([0-9a-fA-F]+)\\/([0-9a-fA-F]+)/);\n if (match) {\n cleanup();\n\n // Parse RGB components — terminals may respond with 2 or 4 hex digits per component\n const rHex = match[1]!;\n const gHex = match[2]!;\n const bHex = match[3]!;\n\n // Normalize to 0–1 range. If 4 digits: max is 0xFFFF. If 2 digits: max is 0xFF.\n const normalize = (hex: string) => {\n const val = parseInt(hex, 16);\n return hex.length <= 2 ? val / 0xff : val / 0xffff;\n };\n\n const r = normalize(rHex);\n const g = normalize(gHex);\n const b = normalize(bHex);\n\n // WCAG relative luminance\n const linearize = (c: number) => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n const luma = 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n\n resolve(luma >= 0.5 ? 'light' : 'dark');\n return;\n }\n };\n\n // Timeout — terminal didn't respond (or doesn't support OSC 11)\n timer = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeoutMs);\n\n // Ensure the timeout doesn't keep the process alive\n if (timer.unref) timer.unref();\n\n try {\n // Save current state and switch to raw mode for reading the response\n wasRaw = process.stdin.isRaw ?? false;\n process.stdin.setRawMode(true);\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n wasResumed = true;\n }\n process.stdin.on('data', onData);\n\n // Send OSC 11 query — use BEL (\\x07) terminator for broadest compatibility\n process.stdout.write('\\x1b]11;?\\x07');\n } catch {\n // If we can't set raw mode, give up on this method\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * Detect COLORFGBG env var.\n * Format: \"fg;bg\" where bg is an ANSI color index.\n * Color indices 0-6 are dark, 7+ are light.\n */\nfunction detectFromColorFgBg(): ThemeMode | null {\n const colorFgBg = process.env.COLORFGBG;\n if (!colorFgBg) return null;\n\n const parts = colorFgBg.split(';');\n const bgPart = parts[parts.length - 1];\n if (bgPart === undefined) return null;\n\n const bgIndex = parseInt(bgPart, 10);\n if (isNaN(bgIndex)) return null;\n\n // Standard ANSI: 0-6 are dark colors, 7+ are light (7 = white/light gray, 15 = bright white)\n return bgIndex >= 7 ? 'light' : 'dark';\n}\n\n/**\n * Detect the terminal's color scheme.\n * Returns 'dark' or 'light'. Does not check persisted settings —\n * the caller should check settings first and only call this for 'auto' mode.\n */\nexport async function detectTerminalTheme(): Promise<ThemeMode> {\n // 1. Explicit env var override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n if (envTheme === 'light') return 'light';\n if (envTheme === 'dark') return 'dark';\n\n // 2. OSC 11 query — ask the terminal for its actual background color\n const oscResult = await queryTerminalBackground(200);\n if (oscResult) return oscResult;\n\n // 3. COLORFGBG env var fallback\n const fgbgResult = detectFromColorFgBg();\n if (fgbgResult) return fgbgResult;\n\n // 4. Default to dark\n return 'dark';\n}\n","import { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport { detectTerminalTheme } from '../detect-theme.js';\nimport { applyThemeMode, getThemeMode } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\n/**\n * /theme [auto|dark|light] — show or change the color theme.\n */\nexport async function handleThemeCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const arg = args[0]?.toLowerCase();\n\n if (!arg) {\n const mode = getThemeMode();\n const settings = loadSettingsCached();\n const pref = settings.preferences.theme ?? 'auto';\n ctx.showInfo(`Theme: ${mode} (preference: ${pref})`);\n return;\n }\n\n if (arg !== 'auto' && arg !== 'dark' && arg !== 'light') {\n ctx.showError('Usage: /theme [auto|dark|light]');\n return;\n }\n\n // Persist the preference\n const settings = loadSettingsCached();\n settings.preferences.theme = arg;\n saveSettings(settings);\n\n // Apply immediately\n const resolved = arg === 'auto' ? await detectTerminalTheme() : arg;\n applyThemeMode(resolved);\n\n ctx.showInfo(`Theme set to ${arg}${arg === 'auto' ? ` (detected: ${resolved})` : ''}`);\n ctx.state.ui.requestRender();\n}\n","import { Spacer } from '@mariozechner/pi-tui';\n\nimport { loadSettingsCached, saveSettings } from '../../onboarding/settings.js';\nimport {\n detectPackageManager,\n fetchLatestVersion,\n getInstallCommand,\n isNewerVersion,\n runUpdate,\n} from '../../utils/update-check.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { SlashCommandContext } from './types.js';\n\nexport async function handleUpdateCommand(ctx: SlashCommandContext): Promise<void> {\n const currentVersion = ctx.state.options.version;\n if (!currentVersion) {\n ctx.showError('Could not determine the current version.');\n return;\n }\n\n ctx.showInfo('Checking for updates…');\n\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion) {\n ctx.showError('Could not reach GitHub Releases. Check your network connection.');\n return;\n }\n\n if (!isNewerVersion(currentVersion, latestVersion)) {\n ctx.showInfo(`You are already on the latest version (v${currentVersion}).`);\n return;\n }\n\n const pm = await detectPackageManager();\n\n // Clear any previously dismissed version so the prompt always shows\n const settings = loadSettingsCached();\n if (settings.updateDismissedVersion) {\n settings.updateDismissedVersion = null;\n saveSettings(settings);\n }\n\n // Show interactive prompt\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `A new version is available: v${latestVersion} (current: v${currentVersion}). Would you like to update now?`,\n options: [\n { label: 'Yes', description: 'Update and restart' },\n { label: 'No', description: 'Skip this version' },\n ],\n formatResult: answer => (answer === 'Yes' ? 'Updating…' : 'Update skipped.'),\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n if (answer === 'Yes') {\n ctx.showInfo(`Updating to v${latestVersion}…`);\n const ok = await runUpdate(pm, latestVersion);\n if (ok) {\n ctx.showInfo(`Updated to v${latestVersion}. Please restart Ulicode.`);\n ctx.stop();\n process.exit(0);\n } else {\n const cmd = getInstallCommand(pm, latestVersion);\n ctx.showError(`Auto-update failed. Run \\`${cmd}\\` manually.`);\n }\n } else {\n const s = loadSettingsCached();\n s.updateDismissedVersion = latestVersion;\n saveSettings(s);\n ctx.showInfo('Update skipped.');\n }\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n ctx.state.activeInlineQuestion = questionComponent;\n ctx.state.chatContainer.addChild(questionComponent);\n ctx.state.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n","/**\n * SlashCommandComponent - renders a bordered box for slash command messages\n * showing the command name as a heading and truncated content that can be\n * expanded with ctrl+e. The full content is still sent to the assistant.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { mastra, projectTheme } from '../theme.js';\n\nconst MAX_COLLAPSED_LINES = 3;\nconst BORDER_COLOR = projectTheme.accent;\n\nexport class SlashCommandComponent extends Container {\n private commandName: string;\n private contentLines: string[];\n private expanded = false;\n\n constructor(commandName: string, content?: string) {\n super();\n this.commandName = commandName;\n this.contentLines = content ? content.split('\\n').filter(l => l.trim()) : [];\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n if (this.expanded === expanded) return;\n this.expanded = expanded;\n this.rebuild();\n }\n\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const border = (char: string) => chalk.bold.hex(BORDER_COLOR)(char);\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n // Top border with command name\n const heading = chalk.hex(mastra.specialGray)(`/${this.commandName}`);\n this.addChild(new Text(`${border('┌──')} ${heading}`, 0, 0));\n\n if (this.contentLines.length === 0) {\n this.addChild(new Text(`${border('└──')}`, 0, 0));\n return;\n }\n\n // Word-wrap content lines\n const wrappedLines: string[] = [];\n for (const line of this.contentLines) {\n if (line.length > maxLineWidth) {\n let remaining = line;\n while (remaining.length > maxLineWidth) {\n const breakAt = remaining.lastIndexOf(' ', maxLineWidth);\n const splitAt = breakAt > 0 ? breakAt : maxLineWidth;\n wrappedLines.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n if (remaining) wrappedLines.push(remaining);\n } else {\n wrappedLines.push(line);\n }\n }\n\n const truncated = !this.expanded && wrappedLines.length > MAX_COLLAPSED_LINES + 1;\n const displayLines = truncated ? wrappedLines.slice(0, MAX_COLLAPSED_LINES) : wrappedLines;\n\n const contentText = displayLines\n .map(\n line =>\n `${border('│')} ${chalk.hex(mastra.mainGray)(line.length > maxLineWidth ? line.slice(0, maxLineWidth - 1) + '…' : line)}`,\n )\n .join('\\n');\n this.addChild(new Text(contentText, 0, 0));\n\n if (truncated) {\n const moreText = chalk.hex(mastra.darkGray)(\n `... ${wrappedLines.length - MAX_COLLAPSED_LINES} more lines (ctrl+e to expand)`,\n );\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n\n // Bottom border\n this.addChild(new Text(`${border('└──')}`, 0, 0));\n }\n}\n","/**\n * Error handling utilities for the Mastra Code TUI.\n * Parses API errors and provides user-friendly messages.\n */\n\nexport interface ParsedError {\n /** User-friendly error message */\n message: string;\n /** Error type for categorization */\n type: ErrorType;\n /** Whether this error is retryable */\n retryable: boolean;\n /** Suggested retry delay in ms (if retryable) */\n retryDelay?: number;\n /** Original error for debugging */\n originalError: Error;\n}\n\nexport type ErrorType =\n | 'rate_limit'\n | 'auth'\n | 'network'\n | 'timeout'\n | 'invalid_request'\n | 'server_error'\n | 'model_not_found'\n | 'context_length'\n | 'content_filter'\n | 'unknown';\n\n/**\n * Parse an error and return a user-friendly representation.\n */\nexport function parseError(error: unknown): ParsedError {\n const err = error instanceof Error ? error : new Error(String(error));\n const message = err.message.toLowerCase();\n const errorObj = error as Record<string, unknown>;\n\n // Check for rate limiting\n if (\n message.includes('rate limit') ||\n message.includes('rate_limit') ||\n message.includes('429') ||\n errorObj.statusCode === 429 ||\n errorObj.status === 429\n ) {\n const retryAfter = extractRetryAfter(errorObj);\n return {\n message: 'Rate limited. Please wait a moment before trying again.',\n type: 'rate_limit',\n retryable: true,\n retryDelay: retryAfter || 5000,\n originalError: err,\n };\n }\n\n // Check for authentication errors\n if (\n message.includes('unauthorized') ||\n message.includes('authentication') ||\n message.includes('invalid api key') ||\n message.includes('invalid_api_key') ||\n message.includes('api key') ||\n errorObj.statusCode === 401 ||\n errorObj.status === 401\n ) {\n return {\n message: 'Authentication failed. Please check your API key or login with /login.',\n type: 'auth',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for forbidden/permission errors\n if (errorObj.statusCode === 403 || errorObj.status === 403) {\n return {\n message: 'Access denied. You may not have permission to use this model.',\n type: 'auth',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for network errors\n if (\n message.includes('network') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('fetch failed') ||\n message.includes('connection')\n ) {\n return {\n message: 'Network error. Please check your internet connection.',\n type: 'network',\n retryable: true,\n retryDelay: 2000,\n originalError: err,\n };\n }\n\n // Check for timeout errors\n if (message.includes('timeout') || message.includes('timed out') || message.includes('etimedout')) {\n return {\n message: 'Request timed out. The server may be overloaded.',\n type: 'timeout',\n retryable: true,\n retryDelay: 3000,\n originalError: err,\n };\n }\n\n // Check for model not found\n if (\n message.includes('model not found') ||\n message.includes('model_not_found') ||\n message.includes('does not exist') ||\n message.includes('invalid model')\n ) {\n return {\n message: 'Model not found. Please select a different model with /models.',\n type: 'model_not_found',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for context length errors\n if (\n message.includes('context length') ||\n message.includes('context_length') ||\n message.includes('too many tokens') ||\n message.includes('maximum context') ||\n message.includes('token limit')\n ) {\n return {\n message: 'Message too long. Try starting a new thread with /new.',\n type: 'context_length',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for content filter errors\n if (\n message.includes('content filter') ||\n message.includes('content_filter') ||\n message.includes('content policy') ||\n message.includes('safety') ||\n message.includes('prohibited')\n ) {\n return {\n message: \"Content was filtered by the model's safety system.\",\n type: 'content_filter',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for server errors\n if (\n message.includes('internal server') ||\n message.includes('server error') ||\n errorObj.statusCode === 500 ||\n errorObj.status === 500 ||\n errorObj.statusCode === 502 ||\n errorObj.status === 502 ||\n errorObj.statusCode === 503 ||\n errorObj.status === 503\n ) {\n return {\n message: 'Server error. The API may be experiencing issues.',\n type: 'server_error',\n retryable: true,\n retryDelay: 5000,\n originalError: err,\n };\n }\n\n // Check for invalid request errors\n if (\n message.includes('invalid request') ||\n message.includes('bad request') ||\n errorObj.statusCode === 400 ||\n errorObj.status === 400\n ) {\n return {\n message: `Invalid request: ${extractErrorDetail(err)}`,\n type: 'invalid_request',\n retryable: false,\n originalError: err,\n };\n }\n\n // Unknown error - try to extract useful info\n return {\n message: extractErrorDetail(err),\n type: 'unknown',\n retryable: false,\n originalError: err,\n };\n}\n\n/**\n * Extract retry-after header value from error.\n */\nfunction extractRetryAfter(error: Record<string, unknown>): number | undefined {\n const headers = error.headers as Record<string, unknown> | undefined;\n const retryAfter = error.retryAfter || headers?.['retry-after'];\n if (typeof retryAfter === 'number') {\n return retryAfter * 1000; // Convert seconds to ms\n }\n if (typeof retryAfter === 'string') {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n return seconds * 1000;\n }\n }\n return undefined;\n}\n\n/**\n * Extract a useful error detail from an error object.\n */\nfunction extractErrorDetail(error: Error): string {\n const errorObj = error as unknown as Record<string, unknown>;\n\n // Try to get a specific error message from common API error formats\n if (errorObj.error && typeof errorObj.error === 'object') {\n const apiError = errorObj.error as Record<string, unknown>;\n if (apiError.message) return String(apiError.message);\n }\n\n if (errorObj.message) return String(errorObj.message);\n if (errorObj.detail) return String(errorObj.detail);\n if (errorObj.reason) return String(errorObj.reason);\n\n // Clean up the error message\n let message = error.message;\n\n // Remove common prefixes\n message = message.replace(/^(error|exception|failed):\\s*/i, '');\n\n // Truncate very long messages\n if (message.length > 200) {\n message = message.substring(0, 200) + '...';\n }\n\n return message || 'An unknown error occurred';\n}\n\n/**\n * Sleep for a given number of milliseconds.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n onRetry?: (error: ParsedError, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { maxRetries = 3, initialDelay = 1000, maxDelay = 30000, onRetry } = options;\n\n let lastError: ParsedError | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = parseError(error);\n\n // Don't retry non-retryable errors\n if (!lastError.retryable || attempt === maxRetries) {\n throw lastError.originalError;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(lastError.retryDelay || initialDelay * Math.pow(2, attempt), maxDelay);\n\n if (onRetry) {\n onRetry(lastError, attempt + 1);\n }\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs this\n throw lastError?.originalError || new Error('Retry failed');\n}\n","/**\n * Notification utility for alerting the user when the TUI needs attention.\n * Sends a terminal bell and optionally a native OS notification.\n */\n\nimport { exec } from 'node:child_process';\nimport type { HookManager } from '../hooks/manager.js';\n\nexport type NotificationMode = 'bell' | 'system' | 'both' | 'off';\n\nexport type NotificationReason = 'agent_done' | 'ask_question' | 'tool_approval' | 'plan_approval' | 'sandbox_access';\n\n/**\n * Send a notification to the user.\n * - \"bell\": writes \\x07 to stdout (terminal bell)\n * - \"system\": sends a native OS notification (macOS only for now)\n * - \"both\": bell + system\n * - \"off\": no-op\n *\n * Also fires Notification hooks if a hookManager is provided.\n */\nexport function sendNotification(\n reason: NotificationReason,\n opts: {\n mode: NotificationMode;\n message?: string;\n hookManager?: HookManager;\n },\n): void {\n const { mode, message, hookManager } = opts;\n\n if (mode === 'off') {\n // Still fire hooks even when built-in notifications are off\n hookManager?.runNotification(reason, message);\n return;\n }\n\n if (mode === 'bell' || mode === 'both') {\n process.stdout.write('\\x07');\n }\n\n if (mode === 'system' || mode === 'both') {\n sendSystemNotification(reason, message);\n }\n\n hookManager?.runNotification(reason, message);\n}\n\nfunction sendSystemNotification(reason: NotificationReason, message?: string): void {\n if (process.platform === 'darwin') {\n const title = 'Ulicode';\n const body = message || reasonToMessage(reason);\n const escaped = body.replace(/\"/g, '\\\\\"');\n exec(`osascript -e 'display notification \"${escaped}\" with title \"${title}\"'`);\n }\n // Linux/Windows: could add notify-send / powershell in the future\n}\n\nfunction reasonToMessage(reason: NotificationReason): string {\n switch (reason) {\n case 'agent_done':\n return 'Agent finished — waiting for your input';\n case 'ask_question':\n return 'Agent has a question for you';\n case 'tool_approval':\n return 'Tool requires your approval';\n case 'plan_approval':\n return 'Plan requires your approval';\n case 'sandbox_access':\n return 'Sandbox access requested';\n }\n}\n","/**\n * Display helpers for the TUI: error messages, info messages, notifications.\n */\nimport { Spacer, Text } from '@mariozechner/pi-tui';\n\nimport { parseError } from '../utils/errors.js';\nimport type { NotificationMode, NotificationReason } from './notify.js';\nimport { sendNotification } from './notify.js';\nimport type { TUIState } from './state.js';\nimport { theme } from './theme.js';\n\nexport function showError(state: TUIState, message: string): void {\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(new Text(theme.fg('error', `Error: ${message}`), 1, 0));\n state.ui.requestRender();\n}\n\nexport function showInfo(state: TUIState, message: string): void {\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(new Text(theme.fg('muted', message), 1, 0));\n state.ui.requestRender();\n}\n\nexport function showFormattedError(\n state: TUIState,\n event:\n | {\n error: Error;\n errorType?: string;\n retryable?: boolean;\n retryDelay?: number;\n }\n | Error,\n): void {\n const error = 'error' in event ? event.error : event;\n const parsed = parseError(error);\n\n state.chatContainer.addChild(new Spacer(1));\n\n // Show the main error message\n let errorText = `Error: ${parsed.message}`;\n\n // Add retry info if applicable\n const retryable = 'retryable' in event ? event.retryable : parsed.retryable;\n const retryDelay = 'retryDelay' in event ? event.retryDelay : parsed.retryDelay;\n if (retryable && retryDelay) {\n const seconds = Math.ceil(retryDelay / 1000);\n errorText += theme.fg('muted', ` (retry in ${seconds}s)`);\n }\n\n state.chatContainer.addChild(new Text(theme.fg('error', errorText), 1, 0));\n\n // Add helpful hints based on error type\n const hint = getErrorHint(parsed.type);\n if (hint) {\n state.chatContainer.addChild(new Text(theme.fg('muted', ` Hint: ${hint}`), 1, 0));\n }\n\n state.ui.requestRender();\n}\n\nfunction getErrorHint(errorType: string): string | null {\n switch (errorType) {\n case 'auth':\n return 'Use /login to authenticate with a provider';\n case 'model_not_found':\n return 'Use /models to select a different model';\n case 'context_length':\n return 'Use /new to start a fresh conversation';\n case 'rate_limit':\n return 'Wait a moment and try again';\n case 'network':\n return 'Check your internet connection';\n default:\n return null;\n }\n}\n\nexport function notify(state: TUIState, reason: NotificationReason, message?: string): void {\n const mode = ((state.harness.getState() as any)?.notifications ?? 'off') as NotificationMode;\n sendNotification(reason, {\n mode,\n message,\n hookManager: state.hookManager,\n });\n}\n","/**\n * Slash command dispatcher: routes command strings to extracted handlers.\n */\nimport { processSlashCommand } from '../utils/slash-command-processor.js';\nimport {\n handleHelpCommand,\n handleCostCommand,\n handleYoloCommand,\n handleThinkCommand,\n handlePermissionsCommand,\n handleNameCommand,\n handleExitCommand,\n handleHooksCommand,\n handleMcpCommand,\n handleModeCommand,\n handleSkillsCommand,\n handleNewCommand,\n handleCloneCommand,\n handleResourceCommand,\n handleDiffCommand,\n handleThreadsCommand,\n handleThreadTagDirCommand,\n handleSandboxCommand as handleSandboxCmd,\n handleModelsPackCommand,\n handleCustomProvidersCommand,\n handleSubagentsCommand,\n handleOMCommand,\n handleSettingsCommand,\n handleLoginCommand,\n handleReviewCommand as handleReviewCmd,\n handleReportIssueCommand as handleReportIssueCmd,\n handleSetupCommand,\n handleThemeCommand,\n handleUpdateCommand,\n} from './commands/index.js';\nimport type { SlashCommandContext } from './commands/types.js';\nimport { SlashCommandComponent } from './components/slash-command.js';\nimport { showError, showInfo } from './display.js';\nimport type { TUIState } from './state.js';\n\n/**\n * Dispatch a slash command input to the appropriate handler.\n * Returns true if the command was handled (or was unknown), false if not a command.\n */\nexport async function dispatchSlashCommand(\n input: string,\n state: TUIState,\n buildCtx: () => SlashCommandContext,\n): Promise<boolean> {\n const trimmedInput = input.trim();\n\n const slashMatch = trimmedInput.match(/^(\\/\\/?)(.*)$/);\n const slashPrefix = slashMatch?.[1] ?? '';\n const withoutSlashes = slashMatch?.[2] ?? trimmedInput;\n\n if (slashPrefix === '//') {\n const [cmdName, ...cmdArgs] = withoutSlashes.split(' ');\n const customCommand = state.customSlashCommands.find(cmd => cmd.name === cmdName);\n if (customCommand) {\n await handleCustomSlashCommand(state, customCommand, cmdArgs);\n return true;\n }\n\n showError(state, `Unknown custom command: ${cmdName}`);\n return true;\n }\n\n const [command, ...args] = withoutSlashes.split(' ');\n\n switch (command) {\n case 'new':\n handleNewCommand(buildCtx());\n return true;\n case 'clone':\n await handleCloneCommand(buildCtx());\n return true;\n case 'threads':\n await handleThreadsCommand(buildCtx());\n return true;\n case 'skills':\n await handleSkillsCommand(buildCtx());\n return true;\n case 'thread:tag-dir':\n await handleThreadTagDirCommand(buildCtx());\n return true;\n case 'sandbox':\n await handleSandboxCmd(buildCtx(), args);\n return true;\n case 'mode':\n await handleModeCommand(buildCtx(), args);\n return true;\n case 'models':\n await handleModelsPackCommand(buildCtx());\n return true;\n case 'custom-providers':\n await handleCustomProvidersCommand(buildCtx());\n return true;\n case 'subagents':\n await handleSubagentsCommand(buildCtx());\n return true;\n case 'om':\n await handleOMCommand(buildCtx());\n return true;\n case 'think':\n await handleThinkCommand(buildCtx(), args);\n return true;\n case 'permissions':\n await handlePermissionsCommand(buildCtx(), args);\n return true;\n case 'yolo':\n handleYoloCommand(buildCtx());\n return true;\n case 'settings':\n await handleSettingsCommand(buildCtx());\n return true;\n case 'login':\n await handleLoginCommand(buildCtx(), 'login');\n return true;\n case 'logout':\n await handleLoginCommand(buildCtx(), 'logout');\n return true;\n case 'cost':\n handleCostCommand(buildCtx());\n return true;\n case 'diff':\n await handleDiffCommand(buildCtx(), args[0]);\n return true;\n case 'name':\n await handleNameCommand(buildCtx(), args);\n return true;\n case 'resource':\n await handleResourceCommand(buildCtx(), args);\n return true;\n case 'exit':\n handleExitCommand(buildCtx());\n return true;\n case 'help':\n handleHelpCommand(buildCtx());\n return true;\n case 'hooks':\n handleHooksCommand(buildCtx(), args);\n return true;\n case 'mcp':\n await handleMcpCommand(buildCtx(), args);\n return true;\n case 'review':\n await handleReviewCmd(buildCtx(), args);\n return true;\n case 'report-issue':\n await handleReportIssueCmd(buildCtx(), args);\n return true;\n case 'setup':\n await handleSetupCommand(buildCtx());\n return true;\n case 'theme':\n await handleThemeCommand(buildCtx(), args);\n return true;\n case 'update':\n await handleUpdateCommand(buildCtx());\n return true;\n default: {\n const customCommand = state.customSlashCommands.find(cmd => cmd.name === command);\n if (customCommand) {\n await handleCustomSlashCommand(state, customCommand, args);\n return true;\n }\n showError(state, `Unknown command: ${command}`);\n return true;\n }\n }\n}\n\n/**\n * Handle a custom slash command by processing its template and adding to context.\n */\nasync function handleCustomSlashCommand(\n state: TUIState,\n command: { name: string; template: string; description?: string },\n args: string[],\n): Promise<void> {\n try {\n // Process the command template\n const processedContent = await processSlashCommand(command as any, args, process.cwd());\n // Add the processed content as a system message / context\n if (processedContent.trim()) {\n // Show bordered indicator immediately with content\n const slashComp = new SlashCommandComponent(command.name, processedContent.trim());\n state.allSlashCommandComponents.push(slashComp);\n state.chatContainer.addChild(slashComp);\n state.ui.requestRender();\n\n // Wrap in <slash-command> tags so the assistant sees the full\n // content but addUserMessage won't double-render it.\n const wrapped = `<slash-command name=\"${command.name}\">\\n${processedContent.trim()}\\n</slash-command>`;\n await state.harness.sendMessage({ content: wrapped });\n } else {\n showInfo(state, `Executed //${command.name} (no output)`);\n }\n } catch (error) {\n showError(state, `Error executing //${command.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","import { Box, Container, fuzzyFilter, getEditorKeybindings, Input, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\n\nexport interface ProjectFileSelectorOptions {\n tui: TUI;\n files: string[];\n onSelect: (relativePath: string) => void;\n onCancel: () => void;\n}\n\nexport class ProjectFileSelectorComponent extends Box implements Focusable {\n private searchInput!: Input;\n private listContainer!: Container;\n private readonly allFiles: string[];\n private filteredFiles: string[];\n private selectedIndex = 0;\n private readonly tui: TUI;\n private readonly onSelectCallback: (relativePath: string) => void;\n private readonly onCancelCallback: () => void;\n private _focused = false;\n\n get focused(): boolean {\n return this._focused;\n }\n\n set focused(value: boolean) {\n this._focused = value;\n this.searchInput.focused = value;\n }\n\n constructor(options: ProjectFileSelectorOptions) {\n super(2, 1, text => theme.bg('overlayBg', text));\n this.tui = options.tui;\n this.onSelectCallback = options.onSelect;\n this.onCancelCallback = options.onCancel;\n this.allFiles = [...options.files];\n this.filteredFiles = this.allFiles;\n this.buildUI();\n }\n\n private buildUI(): void {\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Attach Project File')), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Type to filter • ↑↓ navigate • Enter attach • Esc cancel'), 0, 0));\n this.addChild(new Spacer(1));\n\n this.searchInput = new Input();\n this.searchInput.onSubmit = () => {\n const selected = this.filteredFiles[this.selectedIndex];\n if (selected) {\n this.onSelectCallback(selected);\n }\n };\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n this.updateList();\n }\n\n private filterFiles(query: string): void {\n this.filteredFiles = query ? fuzzyFilter(this.allFiles, query, file => file) : this.allFiles;\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredFiles.length - 1));\n this.updateList();\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n if (this.filteredFiles.length === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No matching files'), 0, 0));\n return;\n }\n\n const maxVisible = 12;\n const startIndex = Math.max(\n 0,\n Math.min(this.selectedIndex - Math.floor(maxVisible / 2), Math.max(0, this.filteredFiles.length - maxVisible)),\n );\n const endIndex = Math.min(startIndex + maxVisible, this.filteredFiles.length);\n\n for (let index = startIndex; index < endIndex; index++) {\n const filePath = this.filteredFiles[index];\n if (!filePath) continue;\n\n const line = index === this.selectedIndex ? theme.fg('accent', `→ ${filePath}`) : ` ${filePath}`;\n this.listContainer.addChild(new Text(line, 0, 0));\n }\n\n if (startIndex > 0 || endIndex < this.filteredFiles.length) {\n this.listContainer.addChild(new Text(theme.fg('muted', `(${this.selectedIndex + 1}/${this.filteredFiles.length})`), 0, 0));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n if (kb.matches(keyData, 'selectUp')) {\n if (this.filteredFiles.length === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? this.filteredFiles.length - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n return;\n }\n\n if (kb.matches(keyData, 'selectDown')) {\n if (this.filteredFiles.length === 0) return;\n this.selectedIndex = this.selectedIndex === this.filteredFiles.length - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n return;\n }\n\n if (kb.matches(keyData, 'selectConfirm')) {\n const selected = this.filteredFiles[this.selectedIndex];\n if (selected) {\n this.onSelectCallback(selected);\n }\n return;\n }\n\n if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n return;\n }\n\n this.searchInput.handleInput(keyData);\n this.filterFiles(this.searchInput.getValue());\n this.tui.requestRender();\n }\n}","import { execFileSync } from 'node:child_process';\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { extname, join, relative, sep } from 'node:path';\nimport chalk from 'chalk';\nimport { getContrastText, theme } from './theme.js';\n\nexport interface PendingFileAttachment {\n absolutePath: string;\n relativePath: string;\n}\n\nconst MAX_FILE_ATTACHMENT_BYTES = 24_000;\nconst MAX_TOTAL_ATTACHMENT_BYTES = 72_000;\nconst DEFAULT_OMITTED_DIRS = new Set(['.git', 'node_modules', 'dist', 'coverage']);\nconst FILE_LIST_CACHE = new Map<string, string[]>();\n\nfunction normalizeRelativePath(filePath: string): string {\n return filePath.split(sep).join('/');\n}\n\nfunction detectBinaryContent(buffer: Buffer): boolean {\n return buffer.subarray(0, Math.min(buffer.length, 8_192)).includes(0);\n}\n\nfunction inferFenceLanguage(filePath: string): string {\n const extension = extname(filePath).replace(/^\\./, '');\n return /^[a-z0-9+-]+$/i.test(extension) ? extension.toLowerCase() : '';\n}\n\nfunction listFilesWithRipgrep(projectRoot: string): string[] {\n const output = execFileSync(\n 'rg',\n ['--files', '--hidden', '-g', '!.git', '-g', '!node_modules', '-g', '!dist', '-g', '!coverage'],\n {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n return output\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(Boolean)\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction listFilesWithGit(projectRoot: string): string[] {\n const output = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {\n cwd: projectRoot,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return output\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(Boolean)\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction listFilesWithFilesystem(projectRoot: string, currentDir = projectRoot): string[] {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n const results: string[] = [];\n\n for (const entry of entries) {\n if (DEFAULT_OMITTED_DIRS.has(entry.name)) {\n continue;\n }\n\n const absolutePath = join(currentDir, entry.name);\n if (entry.isDirectory()) {\n results.push(...listFilesWithFilesystem(projectRoot, absolutePath));\n continue;\n }\n\n if (entry.isFile()) {\n results.push(normalizeRelativePath(relative(projectRoot, absolutePath)));\n }\n }\n\n return results.sort((left, right) => left.localeCompare(right));\n}\n\nexport function listProjectFiles(projectRoot: string): string[] {\n const cached = FILE_LIST_CACHE.get(projectRoot);\n if (cached) {\n return [...cached];\n }\n\n let files: string[];\n try {\n files = listFilesWithRipgrep(projectRoot);\n } catch {\n try {\n files = listFilesWithGit(projectRoot);\n } catch {\n files = listFilesWithFilesystem(projectRoot);\n }\n }\n\n FILE_LIST_CACHE.set(projectRoot, files);\n return [...files];\n}\n\nexport function renderComposerAttachmentChips(files: PendingFileAttachment[]): string {\n if (files.length === 0) {\n return '';\n }\n\n const accent = theme.getTheme().accent;\n const chips = files\n .map(file => chalk.bgHex(accent).hex(getContrastText(accent))(` ${file.relativePath} `))\n .join(' ');\n\n return `${theme.fg('muted', 'Attached files ')}${chips}`;\n}\n\nexport function buildComposerDisplayContent(text: string, files: PendingFileAttachment[]): string {\n const trimmedText = text.trim();\n if (files.length === 0) {\n return trimmedText;\n }\n\n const attachmentLines = files.map(file => `- ${file.relativePath}`).join('\\n');\n if (!trimmedText) {\n return `Attached files:\\n${attachmentLines}`;\n }\n\n return `${trimmedText}\\n\\nAttached files:\\n${attachmentLines}`;\n}\n\nexport function buildPromptContentWithAttachments(text: string, files: PendingFileAttachment[]): string {\n const trimmedText = text.trim();\n if (files.length === 0) {\n return trimmedText;\n }\n\n let totalBytes = 0;\n const attachmentBlocks = files.map(file => {\n try {\n const fileStats = statSync(file.absolutePath);\n if (!fileStats.isFile()) {\n return `Path: ${file.relativePath}\\n[Skipped: not a regular file]`;\n }\n\n const buffer = readFileSync(file.absolutePath);\n if (detectBinaryContent(buffer)) {\n return `Path: ${file.relativePath}\\n[Binary or non-text file not inlined]`;\n }\n\n const remainingBudget = MAX_TOTAL_ATTACHMENT_BYTES - totalBytes;\n if (remainingBudget <= 0) {\n return `Path: ${file.relativePath}\\n[Omitted: total attachment budget exceeded]`;\n }\n\n const allowedBytes = Math.min(buffer.length, MAX_FILE_ATTACHMENT_BYTES, remainingBudget);\n totalBytes += allowedBytes;\n\n const content = buffer.subarray(0, allowedBytes).toString('utf-8').trimEnd();\n const truncatedNote =\n buffer.length > allowedBytes ? `\\n[Truncated after ${allowedBytes.toLocaleString()} bytes]` : '';\n const language = inferFenceLanguage(file.relativePath);\n const openingFence = language ? `\\`\\`\\`${language}` : '```';\n\n return `Path: ${file.relativePath}\\n${openingFence}\\n${content}\\n\\`\\`\\`${truncatedNote}`;\n } catch (error) {\n return `Path: ${file.relativePath}\\n[Skipped: ${error instanceof Error ? error.message : 'Unable to read file'}]`;\n }\n });\n\n const attachmentSection = attachmentBlocks.join('\\n\\n');\n if (!trimmedText) {\n return `The user attached these project files for context:\\n\\n${attachmentSection}`;\n }\n\n return `${trimmedText}\\n\\nThe user attached these project files for context:\\n\\n${attachmentSection}`;\n}","/**\n * Event handlers for agent lifecycle events:\n * agent_start, agent_end (normal / aborted / error).\n */\nimport { Spacer, Text } from '@mariozechner/pi-tui';\n\nimport { getCurrentGitBranch } from '../../utils/project.js';\nimport { requestRenderSoon } from '../chat-layout.js';\nimport { GradientAnimator } from '../components/obi-loader.js';\nimport { theme } from '../theme.js';\n\nimport type { EventHandlerContext } from './types.js';\n\nexport function handleAgentStart(ctx: EventHandlerContext): void {\n const { state } = ctx;\n\n // Refresh git branch so status line reflects the current branch\n const freshBranch = getCurrentGitBranch(state.projectInfo.rootPath);\n if (freshBranch) {\n state.projectInfo.gitBranch = freshBranch;\n }\n\n if (!state.gradientAnimator) {\n state.gradientAnimator = new GradientAnimator(() => {\n ctx.updateStatusLine();\n });\n }\n state.gradientAnimator.start();\n}\n\nexport function handleAgentEnd(ctx: EventHandlerContext): void {\n const { state } = ctx;\n if (state.gradientAnimator) {\n state.gradientAnimator.fadeOut();\n }\n\n // Refresh git branch — tool calls during this turn may have switched branches\n const freshBranch = getCurrentGitBranch(state.projectInfo.rootPath);\n if (freshBranch) {\n state.projectInfo.gitBranch = freshBranch;\n }\n\n if (state.streamingComponent) {\n state.streamingComponent = undefined;\n state.streamingMessage = undefined;\n }\n state.followUpComponents = [];\n state.pendingTools.clear();\n ctx.updateStatusLine();\n state.ui.requestRender();\n // Keep allToolComponents so Ctrl+E continues to work after agent completes\n\n ctx.notify('agent_done');\n\n // Drain queued follow-up actions once all harness-level follow-ups are done.\n // Each queued action that starts a new agent operation will eventually trigger\n // handleAgentEnd again, which drains the next FIFO item.\n if (state.harness.getFollowUpCount() > 0) {\n return;\n }\n\n const nextAction = state.pendingQueuedActions.shift();\n ctx.updateStatusLine();\n if (!nextAction) {\n return;\n }\n\n if (nextAction === 'message') {\n const nextMessage = state.pendingFollowUpMessages.shift();\n if (!nextMessage) {\n return;\n }\n\n ctx.addUserMessage({\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n { type: 'text', text: nextMessage.displayContent },\n ...(nextMessage.images?.map(img => ({\n type: 'image' as const,\n data: img.data,\n mimeType: img.mimeType,\n })) ?? []),\n ],\n createdAt: new Date(),\n });\n requestRenderSoon(state.ui);\n ctx.fireMessage(nextMessage.content, nextMessage.images);\n return;\n }\n\n const nextCommand = state.pendingSlashCommands.shift();\n if (!nextCommand) {\n return;\n }\n\n ctx.handleSlashCommand(nextCommand).catch(error => {\n ctx.showError(error instanceof Error ? error.message : 'Queued slash command failed');\n });\n}\n\nexport function handleAgentAborted(ctx: EventHandlerContext): void {\n const { state } = ctx;\n if (state.gradientAnimator) {\n state.gradientAnimator.fadeOut();\n }\n\n // Update streaming message to show it was interrupted\n if (state.streamingComponent && state.streamingMessage) {\n state.streamingMessage.stopReason = 'aborted';\n state.streamingMessage.errorMessage = 'Interrupted';\n state.streamingComponent.updateContent(state.streamingMessage);\n state.streamingComponent = undefined;\n state.streamingMessage = undefined;\n } else if (state.userInitiatedAbort) {\n // Show standalone \"Interrupted\" if user pressed Ctrl+C but no streaming component\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(new Text(theme.fg('error', 'Interrupted'), 1, 0));\n }\n state.userInitiatedAbort = false;\n\n state.followUpComponents = [];\n state.pendingFollowUpMessages = [];\n state.pendingQueuedActions = [];\n state.pendingSlashCommands = [];\n state.pendingTools.clear();\n // Keep allToolComponents so Ctrl+E continues to work after interruption\n ctx.updateStatusLine();\n requestRenderSoon(state.ui);\n}\n\nexport function handleAgentError(ctx: EventHandlerContext): void {\n const { state } = ctx;\n if (state.gradientAnimator) {\n state.gradientAnimator.fadeOut();\n }\n\n if (state.streamingComponent) {\n state.streamingComponent = undefined;\n state.streamingMessage = undefined;\n }\n\n state.followUpComponents = [];\n state.pendingFollowUpMessages = [];\n state.pendingQueuedActions = [];\n state.pendingSlashCommands = [];\n state.pendingTools.clear();\n // Keep allToolComponents so Ctrl+E continues to work after errors\n ctx.updateStatusLine();\n requestRenderSoon(state.ui);\n}\n","/**\n * Component that renders an assistant message with streaming support.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Container, Markdown, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { MarkdownTheme } from '@mariozechner/pi-tui';\nimport type { HarnessMessage } from '@mastra/core/harness';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nlet _compId = 0;\nfunction asmDebugLog(...args: unknown[]) {\n if (!['true', '1'].includes(process.env.MASTRA_TUI_DEBUG!)) {\n return;\n }\n const line = `[ASM ${new Date().toISOString()}] ${args.map(a => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ')}\\n`;\n try {\n fs.appendFileSync(path.join(process.cwd(), 'tui-debug.log'), line);\n } catch {}\n}\n\nexport class AssistantMessageComponent extends Container {\n private contentContainer: Container;\n private hideThinkingBlock: boolean;\n private markdownTheme: MarkdownTheme;\n private lastMessage?: HarnessMessage;\n private _id: number;\n\n constructor(message?: HarnessMessage, hideThinkingBlock = false, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n super();\n this._id = ++_compId;\n\n this.hideThinkingBlock = hideThinkingBlock;\n this.markdownTheme = markdownTheme;\n\n // Container for text/thinking content\n this.contentContainer = new Container();\n this.addChild(this.contentContainer);\n\n asmDebugLog(`COMP#${this._id} CREATED`);\n\n if (message) {\n this.updateContent(message);\n }\n }\n\n override invalidate(): void {\n super.invalidate();\n if (this.lastMessage) {\n const summary = this.lastMessage.content\n .map(c => (c.type === 'text' ? `text(${c.text.length}ch)` : c.type))\n .join(', ');\n asmDebugLog(`COMP#${this._id} INVALIDATE lastMessage=[${summary}]`);\n this.updateContent(this.lastMessage);\n }\n }\n\n setHideThinkingBlock(hide: boolean): void {\n this.hideThinkingBlock = hide;\n }\n\n updateContent(message: HarnessMessage): void {\n // Deep copy the message to prevent mutation from the harness's shared content array\n this.lastMessage = {\n ...message,\n content: message.content.map(c => ({ ...c })),\n };\n\n // Clear content container\n this.contentContainer.clear();\n\n const hasVisibleContent = message.content.some(\n c => (c.type === 'text' && c.text.trim()) || (c.type === 'thinking' && c.thinking.trim()),\n );\n\n if (hasVisibleContent) {\n this.contentContainer.addChild(new Spacer(1));\n }\n // Render content in order\n for (let i = 0; i < message.content.length; i++) {\n const content = message.content[i]!;\n\n if (content.type === 'text' && (content as any).text.trim()) {\n // Assistant text messages - trim the text\n this.contentContainer.addChild(new Markdown((content as any).text.trim(), 1, 0, this.markdownTheme));\n } else if (content.type === 'thinking' && (content as any).thinking.trim()) {\n // Check if there's text content after this thinking block\n const hasTextAfter = message.content.slice(i + 1).some(c => c.type === 'text' && (c as any).text.trim());\n\n if (this.hideThinkingBlock) {\n // Show static \"Thinking...\" label when hidden\n this.contentContainer.addChild(new Text(theme.italic(theme.fg('thinkingText', 'Thinking...')), 1, 0));\n if (hasTextAfter) {\n this.contentContainer.addChild(new Spacer(1));\n }\n } else {\n // Thinking traces in thinkingText color, italic\n this.contentContainer.addChild(\n new Markdown((content as any).thinking.trim(), 1, 0, this.markdownTheme, {\n color: (text: string) => theme.fg('thinkingText', text),\n italic: true,\n }),\n );\n this.contentContainer.addChild(new Spacer(1));\n }\n }\n // Skip tool_call and tool_result - those are rendered by ToolExecutionComponent\n }\n\n // Check if aborted or error - show after partial content\n if (message.stopReason === 'aborted') {\n const abortMessage = message.errorMessage || 'Interrupted';\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('error', abortMessage), 1, 0));\n } else if (message.stopReason === 'error') {\n const errorMsg = message.errorMessage || 'Unknown error';\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('error', `Error: ${errorMsg}`), 1, 0));\n }\n }\n}\n","/**\n * Generic collapsible container component.\n * Can be used to wrap any content that should be expandable/collapsible.\n */\n\nimport { Container, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { highlight } from 'cli-highlight';\nimport { theme } from '../theme.js';\n\nexport interface CollapsibleOptions {\n /** Initial expanded state */\n expanded?: boolean;\n /** Header text or component */\n header: string | Container;\n /** Summary shown when collapsed */\n summary?: string;\n /** Max lines to show when collapsed (0 = fully collapsed) */\n collapsedLines?: number;\n /** Max lines to show when expanded */\n expandedLines?: number;\n /** Whether to show line count in header */\n showLineCount?: boolean;\n}\n\nexport class CollapsibleComponent extends Container {\n private expanded: boolean;\n private header: string | Container;\n protected summary?: string;\n private content: string[] = [];\n private options: CollapsibleOptions;\n private ui: TUI;\n\n constructor(options: CollapsibleOptions, ui: TUI) {\n super();\n this.options = {\n expanded: false,\n collapsedLines: 10,\n expandedLines: 100,\n showLineCount: true,\n ...options,\n };\n this.expanded = this.options.expanded ?? false;\n this.header = options.header;\n this.summary = options.summary;\n this.ui = ui;\n this.updateDisplay();\n }\n\n setContent(content: string | string[]): void {\n this.content = Array.isArray(content) ? content : content.split('\\n');\n this.updateDisplay();\n }\n\n isExpanded(): boolean {\n return this.expanded;\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.updateDisplay();\n }\n\n toggle(): void {\n this.expanded = !this.expanded;\n this.updateDisplay();\n }\n\n private updateDisplay(): void {\n this.clear();\n\n const lineCount =\n this.options.showLineCount && this.content.length > 0 ? theme.fg('muted', ` (${this.content.length} lines)`) : '';\n\n const headerText = typeof this.header === 'string' ? `${this.header}${lineCount}` : this.header;\n\n if (typeof headerText === 'string') {\n this.addChild(new Text(headerText, 0, 0));\n } else {\n this.addChild(headerText);\n }\n\n // Show summary when collapsed if provided\n if (!this.expanded && this.summary) {\n this.addChild(new Text(theme.fg('muted', this.summary), 0, 0));\n return;\n }\n\n // Show content\n if (this.content.length === 0) return;\n\n const maxLines = this.expanded ? this.options.expandedLines! : this.options.collapsedLines!;\n\n if (maxLines === 0 && !this.expanded) {\n // Fully collapsed, show nothing\n return;\n }\n\n const linesToShow = Math.min(this.content.length, maxLines);\n const hasMore = this.content.length > maxLines;\n\n // Add content lines\n for (let i = 0; i < linesToShow; i++) {\n this.addChild(new Text(this.content[i], 0, 0));\n }\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = this.content.length - linesToShow;\n const action = this.expanded ? 'collapse' : 'expand';\n const hint = theme.fg('muted', `... ${remaining} more lines (Ctrl+E to ${action} all)`);\n this.addChild(new Text(hint, 0, 0));\n }\n }\n}\n\n/**\n * File viewer with collapsible content\n */\nexport class CollapsibleFileViewer extends CollapsibleComponent {\n constructor(path: string, content: string, options: Partial<CollapsibleOptions>, ui: TUI) {\n let lines = content.split('\\n').map(line => line.trimEnd());\n\n // Remove \"Here's the result of running `cat -n`...\" header if present\n if (lines.length > 0 && lines[0]!.includes(\"Here's the result of running\")) {\n lines = lines.slice(1);\n }\n\n // Strip line numbers from cat -n format: \" 123\\tcode\" -> \"code\"\n const lineNumberRegex = /^\\s*\\d+\\t/;\n const codeLines = lines.map(line => line.replace(lineNumberRegex, ''));\n\n // Remove trailing empty lines\n while (codeLines.length > 0 && codeLines[codeLines.length - 1] === '') {\n codeLines.pop();\n }\n\n // Apply syntax highlighting\n let highlightedLines = codeLines;\n try {\n const highlighted = highlight(codeLines.join('\\n'), {\n language: getLanguageFromPath(path),\n ignoreIllegals: true,\n });\n highlightedLines = highlighted.split('\\n');\n } catch {\n // If highlighting fails, use original content\n }\n\n const header = `${theme.bold(theme.fg('toolTitle', '📄 view'))} ${theme.fg('accent', path)}`;\n\n super(\n {\n header,\n collapsedLines: 20,\n expandedLines: 200,\n showLineCount: true,\n ...options,\n },\n ui,\n );\n\n this.setContent(highlightedLines);\n }\n}\n\n/** Map file extensions to highlight.js language names */\nfunction getLanguageFromPath(path: string): string | undefined {\n const ext = path.split('.').pop()?.toLowerCase();\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n json: 'json',\n md: 'markdown',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n go: 'go',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'c',\n hpp: 'cpp',\n cs: 'csharp',\n php: 'php',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'bash',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'ini',\n ini: 'ini',\n xml: 'xml',\n html: 'html',\n htm: 'html',\n css: 'css',\n scss: 'scss',\n sass: 'scss',\n less: 'less',\n sql: 'sql',\n graphql: 'graphql',\n gql: 'graphql',\n dockerfile: 'dockerfile',\n makefile: 'makefile',\n cmake: 'cmake',\n vue: 'vue',\n svelte: 'xml',\n };\n return ext ? langMap[ext] : undefined;\n}\n\n/**\n * Diff viewer with collapsible hunks\n */\nexport class CollapsibleDiffViewer extends CollapsibleComponent {\n private oldContent: string;\n private newContent: string;\n\n constructor(path: string, oldContent: string, newContent: string, options: Partial<CollapsibleOptions>, ui: TUI) {\n const header = `${theme.bold(theme.fg('toolTitle', '✏️ edit'))} ${theme.fg('accent', path)}`;\n\n super(\n {\n header,\n collapsedLines: 15,\n expandedLines: 100,\n showLineCount: false,\n ...options,\n },\n ui,\n );\n\n this.oldContent = oldContent;\n this.newContent = newContent;\n this.generateDiff();\n }\n\n private generateDiff(): void {\n const oldLines = this.oldContent.split('\\n');\n const newLines = this.newContent.split('\\n');\n const diff: string[] = [];\n\n // Simple line-by-line diff (in production, use a proper diff algorithm)\n const maxLines = Math.max(oldLines.length, newLines.length);\n let addedCount = 0;\n let removedCount = 0;\n\n for (let i = 0; i < maxLines; i++) {\n if (i >= oldLines.length) {\n diff.push(theme.fg('success', `+ ${newLines[i]}`));\n addedCount++;\n } else if (i >= newLines.length) {\n diff.push(theme.fg('error', `- ${oldLines[i]}`));\n removedCount++;\n } else if (oldLines[i] !== newLines[i]) {\n diff.push(theme.fg('error', `- ${oldLines[i]}`));\n diff.push(theme.fg('success', `+ ${newLines[i]}`));\n addedCount++;\n removedCount++;\n } else {\n // Context line\n diff.push(theme.fg('muted', ` ${oldLines[i]}`));\n }\n }\n\n this.summary = `+${addedCount} -${removedCount} lines changed`;\n this.setContent(diff);\n }\n}\n\n/**\n * Command output viewer with collapsible sections\n */\nexport class CollapsibleCommandOutput extends CollapsibleComponent {\n constructor(command: string, output: string, exitCode: number, options: Partial<CollapsibleOptions>, ui: TUI) {\n const status = exitCode === 0 ? theme.fg('success', '✓') : theme.fg('error', `✗ (exit ${exitCode})`);\n\n const header = `${theme.bold(theme.fg('toolTitle', 'command'))} ${theme.fg('accent', command)} ${status}`;\n\n // Clean up output\n const lines = output.split('\\n').map(line => line.trimEnd());\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n super(\n {\n header,\n collapsedLines: exitCode === 0 ? 10 : 50, // Show more on error\n expandedLines: 500,\n showLineCount: true,\n ...options,\n },\n ui,\n );\n\n this.setContent(lines);\n }\n}\n","/**\n * Enhanced error display component with collapsible stack traces,\n * syntax highlighting, and smart summarization.\n */\n\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\nimport { CollapsibleComponent } from './collapsible.js';\n\nexport interface ErrorInfo {\n message: string;\n name?: string;\n stack?: string;\n code?: string;\n file?: string;\n line?: number;\n column?: number;\n context?: {\n before?: string[];\n line?: string;\n after?: string[];\n };\n}\n\n/**\n * Parse error information from various error formats\n */\nfunction parseErrorInfo(error: Error | string): ErrorInfo {\n if (typeof error === 'string') {\n // Try to parse error-like string\n const lines = error.split('\\n').filter(line => line.trim());\n const firstLine = lines[0] || '';\n\n // Check for shell command errors\n if (firstLine.includes('command not found')) {\n const cmdMatch = firstLine.match(/(\\w+):\\s*command not found/);\n return {\n name: 'CommandNotFoundError',\n message: cmdMatch ? `'${cmdMatch[1]}' is not a recognized command` : firstLine,\n };\n }\n\n // Check for \"Output:\" prefix (from tool execution)\n const cleanedError = error.replace(/^Output:\\s*/m, '');\n const cleanedLines = cleanedError.split('\\n').filter(line => line.trim());\n\n // Match Node.js error patterns\n const nodeErrorMatch = cleanedError.match(/^([A-Z][a-zA-Z]*Error):\\s*(.+)$/m);\n if (nodeErrorMatch) {\n // Extract stack trace\n const stackLines = cleanedLines.filter(line => line.match(/^\\s*at\\s+/));\n return {\n name: nodeErrorMatch[1]!,\n message: nodeErrorMatch[2]!,\n stack: stackLines.length > 0 ? stackLines.join('\\n') : undefined,\n };\n }\n\n // Match common error patterns\n const errorMatch = firstLine.match(/^([A-Z][a-zA-Z]*Error):\\s*(.+)$/);\n if (errorMatch) {\n return {\n name: errorMatch[1]!,\n message: errorMatch[2]!,\n stack: lines.slice(1).join('\\n'),\n };\n }\n\n // Extract file location if present\n const fileMatch = error.match(/at\\s+(.+?):(\\d+):?(\\d+)?/);\n\n return {\n message: cleanedLines[0] || firstLine,\n stack: cleanedLines.length > 1 ? cleanedLines.slice(1).join('\\n') : undefined,\n file: fileMatch?.[1],\n line: fileMatch?.[2] ? parseInt(fileMatch[2]) : undefined,\n column: fileMatch?.[3] ? parseInt(fileMatch[3]) : undefined,\n };\n }\n\n // Error object\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: (error as any).code,\n };\n}\n\n/**\n * Format stack trace lines with syntax highlighting\n */\nfunction formatStackTrace(stack: string): string[] {\n const lines = stack.split('\\n');\n return lines.map(line => {\n // Highlight file paths\n if (line.match(/^\\s*at\\s+/)) {\n return line.replace(\n /(\\s+at\\s+)([^(]+)(\\s*\\()([^)]+)(\\))/,\n (match, at, fn, open, loc, close) =>\n `${theme.fg('muted', at)}${theme.fg('function', fn)}${theme.fg('muted', open)}${theme.fg('path', loc)}${theme.fg('muted', close)}`,\n );\n }\n\n // Mute empty lines and framework traces\n if (!line.trim() || line.includes('node_modules')) {\n return theme.fg('muted', line);\n }\n\n return line;\n });\n}\n\n/**\n * Collapsible stack trace component\n */\nclass CollapsibleStackTrace extends CollapsibleComponent {\n constructor(stack: string, options: { expanded?: boolean } = {}, ui: TUI) {\n super(\n {\n header: 'Stack Trace',\n expanded: options.expanded ?? false,\n collapsedLines: 5,\n expandedLines: 100,\n showLineCount: true,\n },\n ui,\n );\n\n // Format and set the content\n const formattedLines = formatStackTrace(stack);\n this.setContent(formattedLines.join('\\n'));\n }\n}\n\n/**\n * Enhanced error display component\n */\nexport class ErrorDisplayComponent extends Container {\n constructor(\n private error: Error | string,\n private options: {\n showStack?: boolean;\n showContext?: boolean;\n expanded?: boolean;\n } = {},\n private ui: TUI,\n ) {\n super();\n this.build();\n }\n\n private build(): void {\n const info = parseErrorInfo(this.error);\n\n // Add a visible border around the entire error display\n const borderTop = new Text(theme.fg('error', '┌─ Error ─' + '─'.repeat(50) + '┐'), 0, 0);\n this.addChild(borderTop);\n\n // Error header container with background\n const errorContainer = new Container();\n\n // Add a colored background to the error message\n const errorBg = (text: string) => theme.bg('errorBg', text);\n\n // Error type and message with proper formatting\n if (info.name && info.name !== 'Error') {\n const typeLine = new Container();\n typeLine.addChild(new Text('│ ', 0, 0));\n typeLine.addChild(new Text(errorBg(` ${theme.bold(theme.fg('error', info.name))} `), 0, 0));\n errorContainer.addChild(typeLine);\n }\n\n // Error message\n const msgLine = new Container();\n msgLine.addChild(new Text('│ ', 0, 0));\n msgLine.addChild(new Text(theme.bold(info.message), 0, 0));\n errorContainer.addChild(msgLine);\n\n // File location if available\n if (info.file && info.line) {\n const location = `${info.file}:${info.line}${info.column ? `:${info.column}` : ''}`;\n errorContainer.addChild(new Text(theme.fg('muted', ` at ${location}`), 0, 0));\n }\n\n this.addChild(errorContainer);\n\n // Code context if available\n if (this.options.showContext && info.context) {\n this.addChild(new Spacer(1));\n this.addChild(this.createCodeContext(info.context, info.line));\n }\n\n // Stack trace (collapsible)\n if (this.options.showStack && info.stack) {\n this.addChild(new Spacer(1));\n this.addChild(new CollapsibleStackTrace(info.stack, { expanded: this.options.expanded }, this.ui));\n }\n\n // Add bottom border\n const borderBottom = new Text(theme.fg('error', '└' + '─'.repeat(60) + '┘'), 0, 0);\n this.addChild(borderBottom);\n }\n\n private createCodeContext(context: NonNullable<ErrorInfo['context']>, errorLine?: number): Container {\n const container = new Container();\n const codeBlock = new Container();\n\n // Add a header\n codeBlock.addChild(new Text(theme.fg('muted', 'Code context:'), 0, 0));\n\n // Before lines\n if (context.before) {\n context.before.forEach((line, i) => {\n const lineNum = errorLine ? errorLine - context.before!.length + i : i + 1;\n codeBlock.addChild(new Text(theme.fg('muted', `${lineNum.toString().padStart(4)} │ ${line}`), 0, 0));\n });\n }\n\n // Error line (highlighted)\n if (context.line && errorLine) {\n codeBlock.addChild(new Text(theme.fg('error', `${errorLine.toString().padStart(4)} │ ${context.line}`), 0, 0));\n }\n\n // After lines\n if (context.after) {\n context.after.forEach((line, i) => {\n const lineNum = errorLine ? errorLine + i + 1 : i + 1;\n codeBlock.addChild(new Text(theme.fg('muted', `${lineNum.toString().padStart(4)} │ ${line}`), 0, 0));\n });\n }\n\n container.addChild(codeBlock);\n return container;\n }\n}\n","/**\n * Enhanced display component for tool validation errors.\n * Provides clear, actionable feedback when tool inputs are invalid.\n */\n\nimport { Container, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { MC_TOOLS } from '../../tool-names.js';\nimport { theme } from '../theme.js';\n\nexport interface ValidationError {\n field: string;\n message: string;\n expected?: string;\n received?: string;\n}\n\nexport interface ToolValidationErrorOptions {\n toolName: string;\n errors: ValidationError[];\n args?: unknown;\n schema?: unknown;\n}\n\n/**\n * Parse validation errors from various error formats\n */\nexport function parseValidationErrors(error: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (typeof error === 'string') {\n // Try to parse Zod-style errors\n const zodMatch = error.match(/at \"([^\"]+)\".*?: (.+?)(?:\\n|$)/g);\n if (zodMatch) {\n zodMatch.forEach(match => {\n const [, field, message] = match.match(/at \"([^\"]+)\".*?: (.+?)(?:\\n|$)/) || [];\n if (field && message) {\n errors.push({ field, message });\n }\n });\n }\n\n // Try to parse \"missing required parameter\" errors\n const missingMatch = error.match(/missing required.*?[\"`'](\\w+)[\"`']/i);\n if (missingMatch) {\n errors.push({\n field: missingMatch[1]!,\n message: 'Required parameter is missing',\n });\n }\n\n // Generic fallback\n if (errors.length === 0) {\n errors.push({\n field: 'unknown',\n message: error,\n });\n }\n } else if (typeof error === 'object' && error !== null) {\n // Handle structured error objects\n const err = error as any;\n\n // Zod error format\n if (err.issues && Array.isArray(err.issues)) {\n err.issues.forEach((issue: any) => {\n errors.push({\n field: issue.path?.join('.') || 'unknown',\n message: issue.message,\n expected: issue.expected,\n received: issue.received,\n });\n });\n }\n // Generic error with message\n else if (err.message) {\n errors.push({\n field: err.field || 'unknown',\n message: err.message,\n });\n }\n }\n\n return errors.length > 0 ? errors : [{ field: 'unknown', message: String(error) }];\n}\n\n/**\n * Format tool arguments for display\n */\nfunction formatArgs(args: unknown): string[] {\n if (!args || typeof args !== 'object') return [];\n\n const lines: string[] = [];\n const obj = args as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(obj)) {\n let valueStr: string;\n if (value === null || value === undefined) {\n valueStr = theme.fg('muted', 'undefined');\n } else if (typeof value === 'string') {\n valueStr = value.length > 50 ? `\"${value.slice(0, 47)}...\"` : `\"${value}\"`;\n } else if (typeof value === 'object') {\n valueStr = JSON.stringify(value);\n if (valueStr.length > 50) {\n valueStr = valueStr.slice(0, 47) + '...';\n }\n } else {\n valueStr = String(value);\n }\n\n lines.push(` ${theme.fg('accent', key)}: ${valueStr}`);\n }\n\n return lines;\n}\n\n/**\n * Enhanced tool validation error display component\n */\nexport class ToolValidationErrorComponent extends Container {\n constructor(options: ToolValidationErrorOptions, _ui: TUI) {\n super();\n\n const { toolName, errors, args } = options;\n\n // Header\n this.addChild(\n new Text(\n `${theme.fg('error', '✗ Tool validation failed: ')}${theme.bold(theme.fg('toolTitle', toolName))}`,\n 0,\n 0,\n ),\n );\n this.addChild(new Text('', 0, 0));\n\n // Error details\n errors.forEach((error, index) => {\n if (index > 0) {\n this.addChild(new Text('', 0, 0));\n }\n\n if (error.field !== 'unknown') {\n this.addChild(new Text(`${theme.fg('muted', ' Parameter: ')}${theme.fg('accent', error.field)}`, 0, 0));\n }\n\n this.addChild(new Text(`${theme.fg('muted', ' Issue: ')}${theme.fg('error', error.message)}`, 0, 0));\n\n if (error.expected || error.received) {\n let detail = '';\n if (error.expected) {\n detail += `${theme.fg('muted', ' Expected: ')}${theme.fg('success', error.expected)}`;\n if (error.received) detail += theme.fg('muted', ', ');\n }\n if (error.received) {\n detail += `${theme.fg('muted', 'Received: ')}${theme.fg('error', error.received)}`;\n }\n this.addChild(new Text(detail, 0, 0));\n }\n });\n\n // Show provided arguments if available\n if (args && Object.keys(args as any).length > 0) {\n this.addChild(new Text('', 0, 0));\n this.addChild(new Text(theme.fg('muted', 'Provided arguments:'), 0, 0));\n const argsLines = formatArgs(args);\n argsLines.forEach(line => {\n this.addChild(new Text(line, 0, 0));\n });\n }\n\n // Suggestions\n const suggestions = this.generateSuggestions(toolName, errors);\n if (suggestions.length > 0) {\n this.addChild(new Text('', 0, 0));\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Suggestions:')), 0, 0));\n suggestions.forEach(suggestion => {\n this.addChild(new Text(` • ${suggestion}`, 0, 0));\n });\n }\n }\n\n private generateSuggestions(toolName: string, errors: ValidationError[]): string[] {\n const suggestions: string[] = [];\n\n const missingParams = errors.filter(\n e => e.message.toLowerCase().includes('required') || e.message.toLowerCase().includes('missing'),\n );\n\n if (missingParams.length > 0) {\n const params = missingParams.map(e => e.field).filter(f => f !== 'unknown');\n if (params.length > 0) {\n suggestions.push(`Add the required parameter${params.length > 1 ? 's' : ''}: ${params.join(', ')}`);\n }\n }\n\n const typeErrors = errors.filter(\n e => e.message.toLowerCase().includes('type') || e.message.toLowerCase().includes('expected'),\n );\n\n if (typeErrors.length > 0) {\n suggestions.push('Check that parameter types match the expected format');\n }\n\n if (toolName === 'ask_user' && errors.some(e => e.field === 'question')) {\n suggestions.push('Make sure to provide a \"question\" parameter with your question text');\n }\n\n if (toolName === MC_TOOLS.EXECUTE_COMMAND && errors.some(e => e.field === 'command')) {\n suggestions.push('Provide a \"command\" parameter with the command to execute');\n }\n\n if (toolName === MC_TOOLS.VIEW && errors.some(e => e.field === 'path')) {\n suggestions.push('Provide a \"path\" parameter with the file or directory path');\n }\n\n return suggestions;\n }\n}\n","/**\n * Enhanced tool execution component with better collapsible support.\n * This will replace the existing tool-execution.ts\n */\n\nimport * as os from 'node:os';\nimport { Box, Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport type { TaskItem } from '@mastra/core/harness';\nimport chalk from 'chalk';\nimport { highlight } from 'cli-highlight';\nimport { MC_TOOLS } from '../../tool-names.js';\nimport { theme, mastra } from '../theme.js';\nimport { CollapsibleComponent } from './collapsible.js';\nimport { ErrorDisplayComponent } from './error-display.js';\nimport type { IToolExecutionComponent, ToolResult } from './tool-execution-interface.js';\nimport { ToolValidationErrorComponent, parseValidationErrors } from './tool-validation-error.js';\n\nexport type { ToolResult };\n\nexport interface ToolExecutionOptions {\n showImages?: boolean;\n autoCollapse?: boolean;\n collapsedByDefault?: boolean;\n}\n/**\n * Convert absolute path to tilde notation if it's in home directory\n */\nfunction shortenPath(path: string): string {\n const home = os.homedir();\n if (path.startsWith(home)) {\n return `~${path.slice(home.length)}`;\n }\n return path;\n}\n\n/**\n * Resolve a file path to an absolute path for use in file:// URLs.\n */\nfunction resolveAbsolutePath(filePath: string): string {\n if (filePath.startsWith('/')) return filePath;\n if (filePath.startsWith('~')) {\n return os.homedir() + filePath.slice(1);\n }\n return process.cwd() + '/' + filePath;\n}\n\n/**\n * Wrap text in an OSC 8 hyperlink to a file path.\n * Terminals that support OSC 8 (iTerm2, WezTerm, Kitty, etc.) will\n * render the text as a clickable link that opens the file.\n * Other terminals will just show the visible text.\n */\nfunction fileLink(displayText: string, filePath: string, line?: number): string {\n const absPath = resolveAbsolutePath(filePath);\n const lineFragment = line ? `#${line}` : '';\n // OSC 8: \\x1b]8;params;URI\\x07 ... \\x1b]8;;\\x07\n return `\\x1b]8;;file://${absPath}${lineFragment}\\x07${displayText}\\x1b]8;;\\x07`;\n}\n\n/** Check if a tool name is a web search provider tool (e.g. web_search, web_search_20250305) */\nfunction isWebSearchTool(name: string): boolean {\n return name === 'web_search' || /^web_search_\\d+$/.test(name);\n}\n\n/**\n * Extract the actual content from tool result text.\n */\nfunction extractContent(text: string): { content: string; isError: boolean } {\n try {\n const parsed = JSON.parse(text);\n if (typeof parsed === 'object' && parsed !== null) {\n if ('content' in parsed) {\n const content = parsed.content;\n let contentStr: string;\n\n if (typeof content === 'string') {\n contentStr = content;\n } else if (Array.isArray(content)) {\n contentStr = content\n .filter(\n (part: unknown) =>\n typeof part === 'object' && part !== null && (part as Record<string, unknown>).type === 'text',\n )\n .map((part: unknown) => (part as Record<string, unknown>).text || '')\n .join('');\n } else {\n contentStr = JSON.stringify(content, null, 2);\n }\n\n return {\n content: contentStr,\n isError: Boolean(parsed.isError),\n };\n }\n return { content: JSON.stringify(parsed, null, 2), isError: false };\n }\n } catch {\n // Not JSON, use as-is\n }\n return { content: text, isError: false };\n}\n\n/**\n * Enhanced tool execution component with collapsible sections\n */\nexport class ToolExecutionComponentEnhanced extends Container implements IToolExecutionComponent {\n private contentBox: Box;\n private toolName: string;\n private args: unknown;\n private expanded = false;\n private isPartial = true;\n private ui: TUI;\n private result?: ToolResult;\n private options: ToolExecutionOptions;\n private collapsible?: CollapsibleComponent;\n private startTime = Date.now();\n private streamingOutput = ''; // Buffer for streaming shell output\n\n constructor(toolName: string, args: unknown, options: ToolExecutionOptions = {}, ui: TUI) {\n super();\n this.toolName = toolName;\n this.args = args;\n this.ui = ui;\n this.options = {\n autoCollapse: true,\n collapsedByDefault: true,\n ...options,\n };\n this.expanded = !this.options.collapsedByDefault;\n\n this.addChild(new Spacer(1));\n\n // Content box with background\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n this.rebuild();\n }\n\n updateArgs(args: unknown): void {\n this.args = args;\n this.rebuild();\n }\n\n updateResult(result: ToolResult, isPartial = false): void {\n this.result = result;\n this.isPartial = isPartial;\n // Keep streaming output for colored display in final result\n this.rebuild();\n }\n\n /**\n * Append streaming shell output.\n * Only for execute_command tool - shows live output while command runs.\n */\n appendStreamingOutput(output: string): void {\n if (\n this.toolName !== MC_TOOLS.EXECUTE_COMMAND &&\n this.toolName !== MC_TOOLS.GET_PROCESS_OUTPUT &&\n this.toolName !== MC_TOOLS.KILL_PROCESS\n ) {\n return;\n }\n this.streamingOutput += output;\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n if (this.collapsible) {\n this.collapsible.setExpanded(expanded);\n this.updateBgColor();\n super.invalidate();\n return;\n }\n // No collapsible — need a full rebuild (e.g. write tool, header-only tools)\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.setExpanded(!this.expanded);\n }\n\n override invalidate(): void {\n super.invalidate();\n // invalidate is called by the layout system — only update bg, don't rebuild\n this.updateBgColor();\n }\n\n private updateBgColor(): void {\n // For shell, view, edit, and process commands, skip background - we use bordered box style instead\n const isShellCommand = this.toolName === MC_TOOLS.EXECUTE_COMMAND;\n const isViewCommand = this.toolName === MC_TOOLS.VIEW;\n const isEditCommand = this.toolName === MC_TOOLS.STRING_REPLACE_LSP;\n const isWriteCommand = this.toolName === MC_TOOLS.WRITE_FILE;\n const isProcessCommand = this.toolName === MC_TOOLS.GET_PROCESS_OUTPUT || this.toolName === MC_TOOLS.KILL_PROCESS;\n const isTaskWrite = this.toolName === 'task_write';\n const isWebSearch = isWebSearchTool(this.toolName);\n\n if (\n isShellCommand ||\n isViewCommand ||\n isEditCommand ||\n isWriteCommand ||\n isProcessCommand ||\n isTaskWrite ||\n isWebSearch\n ) {\n // No background - let terminal colors show through\n this.contentBox.setBgFn((text: string) => text);\n return;\n }\n\n const bgColor = this.isPartial ? 'toolPendingBg' : this.result?.isError ? 'toolErrorBg' : 'toolSuccessBg';\n this.contentBox.setBgFn((text: string) => theme.bg(bgColor, text));\n }\n\n /**\n * Full clear-and-rebuild. Called when:\n * - args change (updateArgs)\n * - result arrives or changes (updateResult)\n * - expand/collapse on a tool with no collapsible child\n * - initial construction\n */\n private rebuild(): void {\n this.updateBgColor();\n this.contentBox.clear();\n this.collapsible = undefined;\n\n switch (this.toolName) {\n case MC_TOOLS.VIEW:\n this.renderViewToolEnhanced();\n break;\n case MC_TOOLS.EXECUTE_COMMAND:\n this.renderBashToolEnhanced();\n break;\n case MC_TOOLS.STRING_REPLACE_LSP:\n this.renderEditToolEnhanced();\n break;\n case MC_TOOLS.WRITE_FILE:\n this.renderWriteToolEnhanced();\n break;\n case MC_TOOLS.FIND_FILES:\n this.renderListFilesEnhanced();\n break;\n case MC_TOOLS.GET_PROCESS_OUTPUT:\n case MC_TOOLS.KILL_PROCESS:\n this.renderProcessToolEnhanced();\n break;\n case 'task_write':\n this.renderTaskWriteEnhanced();\n break;\n default:\n if (isWebSearchTool(this.toolName)) {\n this.renderWebSearchEnhanced();\n } else {\n this.renderGenericToolEnhanced();\n }\n }\n }\n\n private renderViewToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const viewRange = argsObj?.view_range as [number, number] | undefined;\n // view tool uses view_range[0], workspace read_file uses offset\n const startLine = viewRange?.[0] ?? (argsObj?.offset as number | undefined) ?? 1;\n // Don't show border until we have a result\n if (!this.result || this.isPartial) {\n // Just show pending indicator\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const rangeDisplay = viewRange ? theme.fg('muted', `:${viewRange[0]},${viewRange[1]}`) : '';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath, startLine) : theme.fg('accent', path);\n const headerText = `${theme.bold(theme.fg('toolTitle', 'view'))} ${pathDisplay}${rangeDisplay}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const rangeDisplay = viewRange ? theme.fg('muted', `:${viewRange[0]},${viewRange[1]}`) : '';\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = process.stdout.columns || 80;\n const fixedParts = '└── view ' + (rangeDisplay ? `:XXX,XXX` : '') + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6; // buffer\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath, startLine) : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'view'))} ${pathDisplay}${rangeDisplay}${status}`;\n\n // Empty line padding above\n this.contentBox.addChild(new Text('', 0, 0));\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // Syntax-highlighted content with left border, truncated to prevent soft wrap\n const output = this.getFormattedOutput();\n if (output) {\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // Account for border \"│ \" (2) + padding (2) + buffer (2)\n const highlighted = highlightCode(output, fullPath, startLine);\n let lines = highlighted.split('\\n');\n\n // Limit lines when collapsed\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n\n if (hasMore) {\n lines = lines.slice(0, collapsedLines);\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = totalLines - collapsedLines;\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (ctrl+e to expand)`), 0, 0),\n );\n }\n }\n\n // Bottom border with tool info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n\n private renderBashToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n let command = argsObj?.command ? String(argsObj.command) : '...';\n const timeout = argsObj?.timeout as number | undefined;\n const cwd = argsObj?.cwd ? shortenPath(String(argsObj.cwd)) : '';\n\n // Strip \"cd $CWD && \" from the start since we show cwd in the footer\n const cdPattern = /^cd\\s+[^\\s]+\\s+&&\\s+/;\n command = command.replace(cdPattern, '');\n\n // Extract tail value from command (e.g., \"| tail -5\" or \"| tail -n 5\")\n let maxStreamLines: number | undefined;\n const tailMatch = command.match(/\\|\\s*tail\\s+(?:-n\\s+)?(-?\\d+)\\s*$/);\n if (tailMatch) {\n maxStreamLines = Math.abs(parseInt(tailMatch[1]!, 10));\n }\n\n const timeoutSuffix = timeout ? theme.fg('muted', ` (timeout ${timeout}s)`) : '';\n const cwdSuffix = cwd ? theme.fg('muted', ` in ${cwd}`) : '';\n const timeSuffix = this.isPartial ? timeoutSuffix : this.getDurationSuffix();\n\n // Helper to render shell command with bordered box\n const renderBorderedShell = (status: string, outputLines: string[]) => {\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const footerText = `${theme.bold(theme.fg('toolTitle', '$'))} ${theme.fg('accent', command)}${cwdSuffix}${timeSuffix}${status}`;\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // Output lines with left border, truncated to prevent soft wrap\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // Account for border \"│ \" (2) + buffer (4)\n const borderedLines = outputLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.contentBox.addChild(new Text(displayOutput, 0, 0));\n }\n\n // Bottom border with command info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n };\n\n if (!this.result || this.isPartial) {\n const status = this.getStatusIndicator();\n let lines = this.streamingOutput ? this.streamingOutput.split('\\n') : [];\n // Remove leading empty lines during streaming\n while (lines.length > 0 && lines[0] === '') {\n lines.shift();\n }\n // Remove trailing empty lines during streaming (from trailing newline)\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n // Apply tail limit to streaming output to match final result\n if (maxStreamLines && lines.length > maxStreamLines) {\n lines = lines.slice(-maxStreamLines);\n }\n renderBorderedShell(status, lines);\n return;\n }\n\n // Helper to apply tail limit and clean up lines\n const prepareOutputLines = (output: string): string[] => {\n let lines = output.split('\\n');\n // Remove leading/trailing empty lines\n while (lines.length > 0 && lines[0] === '') {\n lines.shift();\n }\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n // Apply tail limit to match streaming display\n if (maxStreamLines && lines.length > maxStreamLines) {\n lines = lines.slice(-maxStreamLines);\n }\n return lines;\n };\n\n // For errors, use bordered box with error status\n if (this.result.isError) {\n const status = theme.fg('error', ' ✗');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n return;\n }\n\n // Also check if output contains common error patterns\n const outputText = this.getFormattedOutput();\n const looksLikeError = outputText.match(\n /Error:|TypeError:|SyntaxError:|ReferenceError:|command not found|fatal:|error:/i,\n );\n if (looksLikeError) {\n const status = theme.fg('error', ' ✗');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n return;\n }\n\n // Success - use bordered box with checkmark\n const status = theme.fg('success', ' ✓');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n }\n\n private renderProcessToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const pid = argsObj?.pid ? Number(argsObj.pid) : 0;\n const isKill = this.toolName === MC_TOOLS.KILL_PROCESS;\n const isWait = !isKill && argsObj?.wait === true;\n\n const timeSuffix = this.isPartial ? '' : this.getDurationSuffix();\n const label = isKill ? 'kill' : isWait ? 'wait' : 'output';\n\n const renderBorderedProcess = (status: string, outputLines: string[]) => {\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const footerText = `${theme.fg('toolTitle', label)} ${theme.fg('accent', `PID ${pid}`)}${timeSuffix}${status}`;\n\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n const borderedLines = outputLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.contentBox.addChild(new Text(displayOutput, 0, 0));\n }\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n };\n\n const prepareOutputLines = (output: string): string[] => {\n let lines = output.split('\\n');\n while (lines.length > 0 && lines[0] === '') lines.shift();\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n return lines;\n };\n\n if (!this.result || this.isPartial) {\n const status = this.getStatusIndicator();\n let lines = this.streamingOutput ? this.streamingOutput.split('\\n') : [];\n while (lines.length > 0 && lines[0] === '') lines.shift();\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n renderBorderedProcess(status, lines);\n return;\n }\n\n const status = this.result.isError ? theme.fg('error', ' ✗') : theme.fg('success', ' ✓');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedProcess(status, prepareOutputLines(output));\n }\n\n private renderEditToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const startLineNum = argsObj?.start_line ? Number(argsObj.start_line) : undefined;\n const startLine = startLineNum ? `:${String(startLineNum)}` : '';\n\n // While streaming / pending — show diff preview if old_str + new_str available\n if (!this.result || this.isPartial) {\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, startLineNum)\n : theme.fg('accent', path);\n\n // If both old_str/old_string and new_str/new_string are available, show a bordered diff preview\n const oldStr = argsObj?.old_str ?? argsObj?.old_string;\n const newStr = argsObj?.new_str ?? argsObj?.new_string;\n if (oldStr != null && newStr != null) {\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n const footerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n const { lines: diffLines } = this.generateDiffLines(String(oldStr), String(newStr));\n\n // While streaming, show the tail so new content scrolls in at the bottom\n const collapsedLines = 15;\n const totalLines = diffLines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let linesToShow = diffLines;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n linesToShow = diffLines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = linesToShow.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n return;\n }\n\n // No diff args yet — just show header\n const headerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = process.stdout.columns || 80;\n const fixedParts = '└── edit ' + startLine + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6; // buffer\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, startLineNum)\n : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n\n // Empty line padding above\n this.contentBox.addChild(new Text('', 0, 0));\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // For edits, show the diff\n const finalOldStr = argsObj?.old_str ?? argsObj?.old_string;\n const finalNewStr = argsObj?.new_str ?? argsObj?.new_string;\n if (finalOldStr != null && finalNewStr != null && !this.result.isError) {\n const { lines: diffLines, firstChangeIndex } = this.generateDiffLines(String(finalOldStr), String(finalNewStr));\n\n // Limit lines when collapsed, windowed around first change\n const collapsedLines = 15;\n const totalLines = diffLines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n\n let linesToShow = diffLines;\n let skippedBefore = 0;\n if (hasMore) {\n // Show 3 context lines before the first change, rest after\n const contextBefore = 3;\n const start = Math.max(0, firstChangeIndex - contextBefore);\n linesToShow = diffLines.slice(start, start + collapsedLines);\n skippedBefore = start;\n }\n // Render diff lines with border, truncated to prevent wrap\n const maxLineWidth = termWidth - 6;\n\n // Show \"skipped above\" indicator\n if (skippedBefore > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedBefore} lines above`), 0, 0),\n );\n }\n\n const borderedLines = linesToShow.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = totalLines - (skippedBefore + linesToShow.length);\n if (remaining > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (ctrl+e to expand)`), 0, 0),\n );\n }\n }\n } else if (this.result.isError) {\n // Show error output\n const output = this.getFormattedOutput();\n if (output) {\n const maxLineWidth = termWidth - 6;\n const lines = output.split('\\n').map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('error', truncated);\n });\n this.contentBox.addChild(new Text(lines.join('\\n'), 0, 0));\n }\n }\n\n // Bottom border with tool info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n\n // LSP diagnostics below the box\n const diagnostics = this.parseLSPDiagnostics();\n if (diagnostics && !diagnostics.hasIssues) {\n this.contentBox.addChild(new Text(theme.fg('muted', ` ✓ No LSP issues`), 0, 0));\n } else if (diagnostics && diagnostics.hasIssues) {\n const COLLAPSED_DIAG_LINES = 3;\n const shouldCollapse = !this.expanded && diagnostics.entries.length > COLLAPSED_DIAG_LINES + 1;\n const maxDiags = shouldCollapse ? COLLAPSED_DIAG_LINES : diagnostics.entries.length;\n const entriesToShow = diagnostics.entries.slice(0, maxDiags);\n for (const diag of entriesToShow) {\n const t = theme.getTheme();\n const color = diag.severity === 'error' ? t.error : diag.severity === 'warning' ? t.warning : t.muted;\n const icon = diag.severity === 'error' ? '✗' : diag.severity === 'warning' ? '⚠' : 'ℹ';\n const location = diag.location ? chalk.hex(color)(diag.location) + ' ' : '';\n const line = ` ${chalk.hex(color)(icon)} ${location}${theme.fg('thinkingText', diag.message)}`;\n this.contentBox.addChild(new Text(line, 0, 0));\n }\n if (shouldCollapse) {\n const remaining = diagnostics.entries.length - COLLAPSED_DIAG_LINES;\n this.contentBox.addChild(\n new Text(\n theme.fg('muted', ` ... ${remaining} more diagnostic${remaining > 1 ? 's' : ''} (ctrl+e to expand)`),\n 0,\n 0,\n ),\n );\n }\n }\n }\n\n private parseLSPDiagnostics(): {\n hasIssues: boolean;\n entries: Array<{\n severity: 'error' | 'warning' | 'info' | 'hint';\n location: string;\n message: string;\n }>;\n } | null {\n const output = this.getFormattedOutput();\n const lspIdx = output.indexOf('LSP Diagnostics:');\n if (lspIdx === -1) return null;\n\n const lspText = output.slice(lspIdx + 'LSP Diagnostics:'.length);\n if (lspText.includes('No errors or warnings')) {\n return { hasIssues: false, entries: [] };\n }\n\n const entries: Array<{\n severity: 'error' | 'warning' | 'info' | 'hint';\n location: string;\n message: string;\n }> = [];\n let currentSeverity: 'error' | 'warning' | 'info' | 'hint' = 'error';\n\n for (const line of lspText.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed === 'Errors:') {\n currentSeverity = 'error';\n } else if (trimmed === 'Warnings:') {\n currentSeverity = 'warning';\n } else if (trimmed === 'Info:') {\n currentSeverity = 'info';\n } else if (trimmed === 'Hints:') {\n currentSeverity = 'hint';\n } else {\n const match = trimmed.match(/^((?:.*:)?\\d+:\\d+)\\s*-\\s*(.+)$/);\n if (match) {\n entries.push({\n severity: currentSeverity,\n location: match[1]!,\n message: match[2]!,\n });\n }\n }\n }\n\n return { hasIssues: entries.length > 0, entries };\n }\n private generateDiffLines(oldStr: string, newStr: string): { lines: string[]; firstChangeIndex: number } {\n const oldLines = oldStr.split('\\n');\n const newLines = newStr.split('\\n');\n const lines: string[] = [];\n let firstChangeIndex = -1;\n\n // Use soft red for removed, green for added\n const removedColor = chalk.hex(mastra.red); // soft red\n const addedColor = chalk.hex(theme.getTheme().success); // soft green\n\n const maxLines = Math.max(oldLines.length, newLines.length);\n\n for (let i = 0; i < maxLines; i++) {\n if (i >= oldLines.length) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(addedColor(newLines[i]));\n } else if (i >= newLines.length) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(removedColor(oldLines[i]));\n } else if (oldLines[i] !== newLines[i]) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(removedColor(oldLines[i]!));\n lines.push(addedColor(newLines[i]!));\n } else {\n // Context line\n lines.push(theme.fg('muted', oldLines[i]!));\n }\n }\n\n return {\n lines,\n firstChangeIndex: firstChangeIndex === -1 ? 0 : firstChangeIndex,\n };\n }\n private renderWriteToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const content = argsObj?.content ? String(argsObj.content) : '';\n\n // While streaming args (no result yet), show bordered box with content as it arrives\n if (!this.result || this.isPartial) {\n if (!content) {\n // No content yet — just show pending header\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const headerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n // Content is streaming in — show bordered box with syntax-highlighted preview\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '└── write ⋯';\n const availableForPath = termWidth - fixedParts.length - 6;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n const highlighted = highlightCode(content, fullPath);\n let lines = highlighted.split('\\n');\n\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n lines = lines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n return;\n }\n\n // Complete — show final bordered result\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '└── write ✓';\n const availableForPath = termWidth - fixedParts.length - 6;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n if (this.result.isError) {\n const output = this.getFormattedOutput();\n if (output) {\n const lines = output.split('\\n').map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('error', truncated);\n });\n this.contentBox.addChild(new Text(lines.join('\\n'), 0, 0));\n }\n } else if (content) {\n const highlighted = highlightCode(content, fullPath);\n let lines = highlighted.split('\\n');\n\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n lines = lines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n }\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n private renderListFilesEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '/';\n const pattern = argsObj?.pattern ? String(argsObj.pattern) : '';\n const patternDisplay = pattern ? ' ' + theme.fg('muted', pattern) : '';\n\n if (!this.result || this.isPartial) {\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const header = `${theme.bold(theme.fg('toolTitle', 'list'))} ${pathDisplay}${patternDisplay}${status}`;\n this.contentBox.addChild(new Text(header, 0, 0));\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n const listStatus = this.getStatusIndicator();\n\n // Extract summary line (e.g. \"5 directories, 9 files\") from tree output for the header\n const lines = output.split('\\n');\n const lastLine = lines[lines.length - 1]?.trim() || '';\n const summaryMatch = lastLine.match(/^\\d+\\s+directories?,\\s+\\d+\\s+files?$/);\n const summaryDisplay = summaryMatch ? ' ' + theme.fg('muted', lastLine) : '';\n\n this.collapsible = new CollapsibleComponent(\n {\n header: `${theme.bold(theme.fg('toolTitle', 'list'))} ${theme.fg('accent', path)}${patternDisplay}${summaryDisplay}${listStatus}`,\n expanded: this.expanded,\n collapsedLines: 15,\n expandedLines: 100,\n showLineCount: false,\n },\n this.ui,\n );\n\n this.collapsible.setContent(output);\n this.contentBox.addChild(this.collapsible);\n }\n }\n\n private renderTaskWriteEnhanced(): void {\n const argsObj = this.args as { tasks?: TaskItem[] } | undefined;\n const tasks = argsObj?.tasks;\n const status = this.getStatusIndicator();\n\n // Show a compact header — the pinned TaskProgressComponent handles live rendering\n const count = tasks?.length ?? 0;\n const countSuffix = count > 0 ? theme.fg('muted', ` (${count} tasks)`) : '';\n const header = `${theme.bold(theme.fg('toolTitle', 'task_write'))}${countSuffix}${status}`;\n this.contentBox.addChild(new Text(header, 0, 0));\n\n // Surface error details when the tool call fails\n if (!this.isPartial && this.result?.isError) {\n const output = this.getFormattedOutput();\n if (output) {\n this.contentBox.addChild(new Text(theme.fg('error', output), 0, 0));\n }\n }\n }\n\n private renderWebSearchEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const query = argsObj?.query ? String(argsObj.query) : '';\n const status = this.getStatusIndicator();\n\n const queryDisplay = query ? ` ${theme.fg('accent', `\"${query}\"`)}` : '';\n const footerText = `${theme.bold(theme.fg('toolTitle', 'web_search'))}${queryDisplay}${status}`;\n\n // Don't show border until we have a result\n if (!this.result || this.isPartial) {\n this.contentBox.addChild(new Text(footerText, 0, 0));\n return;\n }\n\n if (this.result.isError) {\n this.renderErrorResult(footerText);\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n\n // Parse search results and format as a clean list of titles + URLs\n const output = this.formatWebSearchResults();\n if (output) {\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n // Empty line padding above\n this.contentBox.addChild(new Text('', 0, 0));\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n let lines = output.split('\\n');\n\n // Limit lines when collapsed\n const collapsedLines = 10;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n\n if (hasMore) {\n lines = lines.slice(0, collapsedLines);\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = totalLines - collapsedLines;\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (ctrl+e to expand)`), 0, 0),\n );\n }\n\n // Bottom border with tool info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n } else {\n this.contentBox.addChild(new Text(footerText, 0, 0));\n }\n }\n\n /**\n * Format web search results as a clean list of titles + URLs.\n * Handles both Anthropic provider results (JSON array with encryptedContent)\n * and Tavily results (markdown-formatted text).\n */\n private formatWebSearchResults(): string {\n const raw = this.getFormattedOutput();\n if (!raw) return '';\n\n // Try to parse as JSON array (Anthropic provider format)\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const lines: string[] = [];\n for (const item of parsed) {\n if (typeof item !== 'object' || item === null) continue;\n const url = typeof item.url === 'string' ? item.url : '';\n if (!url) continue;\n const title = typeof item.title === 'string' && item.title ? item.title : url;\n const age = typeof item.pageAge === 'string' && item.pageAge ? theme.fg('muted', ` (${item.pageAge})`) : '';\n lines.push(` ${theme.fg('accent', title)}${age}`);\n lines.push(` ${theme.fg('muted', url)}`);\n }\n if (lines.length > 0) return lines.join('\\n');\n\n // Parsed as JSON array but couldn't extract results — strip encryptedContent\n // before falling through, so we never dump huge base64 blobs to the terminal\n const stripped = parsed.map((item: unknown) => {\n if (typeof item !== 'object' || item === null) return item;\n const { encryptedContent, ...rest } = item as Record<string, unknown>;\n return rest;\n });\n return JSON.stringify(stripped, null, 2);\n }\n } catch {\n // Not JSON — fall through to raw text (Tavily format)\n }\n\n // Not JSON (e.g. Tavily format) — already readable text, return as-is\n return raw;\n }\n\n private renderGenericToolEnhanced(): void {\n const status = this.getStatusIndicator();\n\n let argsSummary = '';\n if (this.args && typeof this.args === 'object') {\n const argsObj = this.args as Record<string, unknown>;\n const keys = Object.keys(argsObj);\n if (keys.length > 0) {\n argsSummary = theme.fg('muted', ` (${keys.length} args)`);\n }\n }\n\n const header = `${theme.bold(theme.fg('toolTitle', this.toolName))}${argsSummary}${status}`;\n\n if (!this.result || this.isPartial) {\n this.contentBox.addChild(new Text(header, 0, 0));\n // Show live key=value preview of args as they stream in\n const preview = this.formatArgsPreview();\n if (preview.length > 0) {\n this.contentBox.addChild(new Text(preview.join('\\n'), 0, 0));\n }\n return;\n }\n\n // Use enhanced error display for errors\n if (this.result.isError) {\n this.renderErrorResult(header);\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n this.collapsible = new CollapsibleComponent(\n {\n header,\n expanded: this.expanded,\n collapsedLines: 10,\n expandedLines: 200,\n showLineCount: true,\n },\n this.ui,\n );\n\n this.collapsible.setContent(output);\n this.contentBox.addChild(this.collapsible);\n }\n }\n\n /**\n * Format a compact args preview as key=\"value\" pairs.\n * Long values are truncated, multiline values show first line + count.\n * Returns an array of formatted lines.\n */\n private formatArgsPreview(maxLines = 4, maxValueLen = 60): string[] {\n if (!this.args || typeof this.args !== 'object') return [];\n const argsObj = this.args as Record<string, unknown>;\n const keys = Object.keys(argsObj);\n if (keys.length === 0) return [];\n\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 4; // small margin\n const lines: string[] = [];\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!;\n if (lines.length >= maxLines) {\n const remaining = keys.length - i;\n lines.push(theme.fg('muted', ` ... ${remaining} more`));\n break;\n }\n const raw = argsObj[key];\n let val: string;\n if (typeof raw === 'string') {\n const strLines = raw.split('\\n');\n if (strLines.length > 1) {\n val = strLines[0]!.slice(0, maxValueLen) + theme.fg('muted', ` (${strLines.length} lines)`);\n } else {\n val = raw.length > maxValueLen ? raw.slice(0, maxValueLen) + '…' : raw;\n }\n val = `\"${val}\"`;\n } else if (raw === undefined) {\n continue;\n } else if (Array.isArray(raw)) {\n val = `[${raw.length} items]`;\n } else if (typeof raw === 'object' && raw !== null) {\n const objKeys = Object.keys(raw as Record<string, unknown>);\n val = `{${objKeys.slice(0, 3).join(', ')}${objKeys.length > 3 ? ', …' : ''}}`;\n } else {\n val = String(raw);\n }\n const line = truncateAnsi(` ${theme.fg('muted', key + '=')}${val}`, maxLineWidth);\n lines.push(line);\n }\n return lines;\n }\n\n private getStatusIndicator(): string {\n return this.isPartial\n ? theme.fg('muted', ' ⋯')\n : this.result?.isError\n ? theme.fg('error', ' ✗')\n : theme.fg('success', ' ✓');\n }\n\n private getDurationSuffix(): string {\n if (this.isPartial) return '';\n const ms = Date.now() - this.startTime;\n if (ms < 1000) return theme.fg('muted', ` ${ms}ms`);\n return theme.fg('muted', ` ${(ms / 1000).toFixed(1)}s`);\n }\n\n private getFormattedOutput(): string {\n if (!this.result) return '';\n\n const textContent = this.result.content\n .filter(c => c.type === 'text' && c.text)\n .map(c => c.text!)\n .join('\\n');\n\n if (!textContent) return '';\n\n const { content } = extractContent(textContent);\n // Remove excessive blank lines while preserving intentional formatting\n return content.trim().replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n');\n }\n\n /**\n * Render an error result using the enhanced error display component\n */\n private renderErrorResult(header: string): void {\n if (!this.result) return;\n\n // First add the header\n this.contentBox.addChild(new Text(header, 0, 0));\n\n // Extract error text from result\n const errorText = this.result.content\n .filter(c => c.type === 'text' && c.text)\n .map(c => c.text!)\n .join('\\n');\n\n if (!errorText) return;\n\n // Check if this is a validation error\n const isValidationError =\n errorText.toLowerCase().includes('validation') ||\n errorText.toLowerCase().includes('required parameter') ||\n errorText.toLowerCase().includes('missing required') ||\n errorText.match(/at \"\\w+\"/i) || // Zod-style errors\n (errorText.includes('Expected') && errorText.includes('Received'));\n\n if (isValidationError) {\n // Use specialized validation error component\n const validationErrors = parseValidationErrors(errorText);\n const validationDisplay = new ToolValidationErrorComponent(\n {\n toolName: this.toolName,\n errors: validationErrors,\n args: this.args,\n },\n this.ui,\n );\n this.contentBox.addChild(validationDisplay);\n return;\n }\n\n // Try to parse as an error object\n let error: Error | string = errorText;\n try {\n const { content } = extractContent(errorText);\n error = content;\n\n // Try to create an Error object with better structure\n const errorMatch = content.match(/^([A-Z][a-zA-Z]*Error):\\s*(.+)$/m);\n if (errorMatch) {\n const err = new Error(errorMatch[2]!);\n err.name = errorMatch[1]!;\n // Try to extract stack trace\n const stackMatch = content.match(/\\n\\s+at\\s+.+/g);\n if (stackMatch) {\n err.stack = `${err.name}: ${err.message}\\n${stackMatch.join('\\n')}`;\n }\n error = err;\n }\n } catch {\n // Keep as string\n }\n\n // Create error display component\n const errorDisplay = new ErrorDisplayComponent(\n error,\n {\n showStack: true,\n showContext: true,\n expanded: this.expanded,\n },\n this.ui,\n );\n\n this.contentBox.addChild(errorDisplay);\n }\n}\n\n/** Map file extensions to highlight.js language names */\nfunction getLanguageFromPath(path: string): string | undefined {\n const ext = path.split('.').pop()?.toLowerCase();\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n json: 'json',\n md: 'markdown',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n go: 'go',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'c',\n hpp: 'cpp',\n cs: 'csharp',\n php: 'php',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'bash',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'ini',\n ini: 'ini',\n xml: 'xml',\n html: 'html',\n htm: 'html',\n css: 'css',\n scss: 'scss',\n sass: 'scss',\n less: 'less',\n sql: 'sql',\n graphql: 'graphql',\n gql: 'graphql',\n dockerfile: 'dockerfile',\n makefile: 'makefile',\n cmake: 'cmake',\n vue: 'vue',\n svelte: 'xml',\n };\n return ext ? langMap[ext] : undefined;\n}\n\n/** Strip line number formatting (cat -n or workspace →) and apply syntax highlighting */\nfunction highlightCode(content: string, path: string, startLine?: number): string {\n let lines = content.split('\\n').map(line => line.trimEnd());\n // Remove known headers:\n // - \"[Truncated N tokens]\" from token truncation\n // - \"Here's the result of running `cat -n`...\" from view tool\n // - \"/path/to/file (NNN bytes)\" or \"/path/to/file (lines N-M of T, NNN bytes)\" from workspace read_file\n while (\n lines.length > 0 &&\n (lines[0]!.includes(\"Here's the result of running\") ||\n lines[0]!.match(/^\\[Truncated \\d+ tokens\\]$/) ||\n lines[0]!.match(/^.*\\(\\d+ bytes\\)$/) ||\n lines[0]!.match(/^.*\\(lines \\d+-\\d+ of \\d+, \\d+ bytes\\)$/))\n ) {\n lines = lines.slice(1);\n }\n\n // Strip line numbers - we know they're sequential starting from startLine\n // Supports two formats:\n // view tool: \" 123\\tcode\" (tab separator)\n // workspace read_file: \" 123→code\" (arrow separator)\n // Separator is optional because trimEnd() strips trailing tabs on blank lines\n let expectedLineNum = startLine ?? 1;\n const codeLines = lines.map(line => {\n const numStr = String(expectedLineNum);\n const match = line.match(/^(\\s*)(\\d+)[\\t→]?(.*)$/);\n if (match && match[2] === numStr) {\n expectedLineNum++;\n return match[3]; // Return just the code part after the separator\n }\n return line;\n });\n\n // Remove trailing empty lines\n while (codeLines.length > 0 && codeLines[codeLines.length - 1] === '') {\n codeLines.pop();\n }\n\n // Apply syntax highlighting\n try {\n return highlight(codeLines.join('\\n'), {\n language: getLanguageFromPath(path),\n ignoreIllegals: true,\n });\n } catch {\n return codeLines.join('\\n');\n }\n}\n/** Truncate a string with ANSI codes to a visible width.\n * Handles both SGR sequences (\\x1b[...m) and OSC 8 hyperlinks (\\x1b]8;...;\\x07).\n */\nfunction truncateAnsi(str: string, maxWidth: number): string {\n const ansiRegex = /\\x1b\\[[0-9;]*m|\\x1b\\]8;[^\\x07]*\\x07/g;\n let visibleLength = 0;\n let result = '';\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = ansiRegex.exec(str)) !== null) {\n // Add text before this ANSI code\n const textBefore = str.slice(lastIndex, match.index);\n const remaining = maxWidth - visibleLength;\n if (textBefore.length <= remaining) {\n result += textBefore;\n visibleLength += textBefore.length;\n } else {\n result += textBefore.slice(0, remaining - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close any open hyperlink + reset styles\n return result;\n }\n // Add the ANSI code (doesn't count toward visible length)\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text after last ANSI code\n const remaining = str.slice(lastIndex);\n const spaceLeft = maxWidth - visibleLength;\n if (remaining.length <= spaceLeft) {\n result += remaining;\n } else {\n result += remaining.slice(0, spaceLeft - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close hyperlink + reset\n }\n\n return result;\n}\n","/**\n * Event handlers for message streaming events:\n * message_start, message_update, message_end.\n *\n * Also includes pure helper functions for content partitioning.\n */\nimport { Text } from '@mariozechner/pi-tui';\nimport type { HarnessMessage } from '@mastra/core/harness';\n\nimport { requestRenderSoon } from '../chat-layout.js';\nimport { AssistantMessageComponent } from '../components/assistant-message.js';\nimport { ToolExecutionComponentEnhanced } from '../components/tool-execution-enhanced.js';\nimport { getMarkdownTheme } from '../theme.js';\nimport { logRuntimeProfile } from '../../utils/debug-log.js';\n\nimport type { EventHandlerContext } from './types.js';\n\ntype ToolCallContent = Extract<HarnessMessage['content'][number], { type: 'tool_call' }>;\n\ninterface MessageAnalysis {\n trailingParts: HarnessMessage['content'];\n newToolCalls: Array<{\n content: ToolCallContent;\n preContent: HarnessMessage['content'];\n }>;\n}\n\nlet messageUpdateCount = 0;\n\nfunction filterRenderableParts(parts: HarnessMessage['content']): HarnessMessage['content'] {\n return parts.filter(c => c.type === 'text' || c.type === 'thinking');\n}\n\n/**\n * Get content parts after the last tool_call/tool_result in the message.\n * These are the parts that should be rendered in the current streaming component.\n */\nfunction getTrailingContentParts(message: HarnessMessage): HarnessMessage['content'] {\n let lastToolIndex = -1;\n for (let i = message.content.length - 1; i >= 0; i--) {\n const c = message.content[i]!;\n if (c.type === 'tool_call' || c.type === 'tool_result') {\n lastToolIndex = i;\n break;\n }\n }\n if (lastToolIndex === -1) {\n // No tool calls — return all content\n return message.content;\n }\n // Return everything after the last tool-related part\n return message.content.slice(lastToolIndex + 1);\n}\n\nfunction analyzeMessageContent(message: HarnessMessage, seenToolCallIds: Set<string>): MessageAnalysis {\n const trackedToolCallIds = new Set(seenToolCallIds);\n const newToolCalls: MessageAnalysis['newToolCalls'] = [];\n let lastProcessedBoundary = 0;\n let trailingStart = 0;\n\n for (let i = 0; i < message.content.length; i++) {\n const content = message.content[i]!;\n const isToolRelated = content.type === 'tool_call' || content.type === 'tool_result';\n\n if (isToolRelated) {\n trailingStart = i + 1;\n }\n\n if (content.type === 'tool_call' && !trackedToolCallIds.has(content.id)) {\n newToolCalls.push({\n content,\n preContent: filterRenderableParts(message.content.slice(lastProcessedBoundary, i)),\n });\n trackedToolCallIds.add(content.id);\n lastProcessedBoundary = i + 1;\n continue;\n }\n\n if (isToolRelated && 'id' in content && trackedToolCallIds.has(content.id)) {\n lastProcessedBoundary = i + 1;\n }\n }\n\n return {\n trailingParts: message.content.slice(trailingStart),\n newToolCalls,\n };\n}\n\nexport function handleMessageStart(ctx: EventHandlerContext, message: HarnessMessage): void {\n const { state } = ctx;\n if (message.role === 'user') {\n ctx.addUserMessage(message);\n } else if (message.role === 'assistant') {\n // Clear tool component references when starting a new assistant message\n state.lastAskUserComponent = undefined;\n state.lastSubmitPlanComponent = undefined;\n if (!state.streamingComponent) {\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n state.streamingMessage = message;\n const trailingParts = getTrailingContentParts(message);\n state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n }\n state.ui.requestRender();\n }\n}\n\nexport function handleMessageUpdate(ctx: EventHandlerContext, message: HarnessMessage): void {\n const startTime = performance.now();\n const { state } = ctx;\n if (!state.streamingComponent || message.role !== 'assistant') return;\n\n state.streamingMessage = message;\n const analysis = analyzeMessageContent(message, state.seenToolCallIds);\n\n for (const toolCall of analysis.newToolCalls) {\n const content = toolCall.content;\n\n // For subagent calls, freeze the current streaming component\n // with content before the tool call, then create a new one.\n // SubagentExecutionComponent handles the visual rendering.\n // Check subagentToolCallIds separately since handleToolStart\n // may have already added the ID to seenToolCallIds.\n if (content.name === 'subagent' && !state.subagentToolCallIds.has(content.id)) {\n state.seenToolCallIds.add(content.id);\n state.subagentToolCallIds.add(content.id);\n state.streamingComponent.updateContent({\n ...message,\n content: toolCall.preContent,\n });\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n continue;\n }\n\n if (!state.seenToolCallIds.has(content.id)) {\n state.seenToolCallIds.add(content.id);\n\n ctx.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n content.name,\n content.args,\n { showImages: false, collapsedByDefault: !state.toolOutputExpanded },\n state.ui,\n );\n component.setExpanded(state.toolOutputExpanded);\n ctx.addChildBeforeFollowUps(component);\n state.pendingTools.set(content.id, component);\n state.allToolComponents.push(component);\n\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n }\n\n const component = state.pendingTools.get(content.id);\n if (component) {\n component.updateArgs(content.args);\n }\n }\n\n // Avoid replacing visible assistant text with an empty trailing segment\n // (commonly happens immediately after tool_result-only updates).\n if (analysis.trailingParts.length > 0) {\n state.streamingComponent.updateContent({\n ...message,\n content: analysis.trailingParts,\n });\n }\n\n requestRenderSoon(state.ui);\n messageUpdateCount += 1;\n const durationMs = performance.now() - startTime;\n if (messageUpdateCount === 1 || messageUpdateCount % 50 === 0 || durationMs >= 8) {\n logRuntimeProfile('tui.message_update', durationMs, {\n count: messageUpdateCount,\n contentParts: message.content.length,\n newToolCalls: analysis.newToolCalls.length,\n trailingParts: analysis.trailingParts.length,\n });\n }\n}\n\nexport function handleMessageEnd(ctx: EventHandlerContext, message: HarnessMessage): void {\n const { state } = ctx;\n if (message.role === 'user') return;\n\n if (state.streamingComponent && message.role === 'assistant') {\n state.streamingMessage = message;\n const trailingParts = getTrailingContentParts(message);\n // If the final assistant chunk has no trailing text/thinking after tools,\n // keep the last rendered content instead of blanking the component.\n if (trailingParts.length > 0 || message.stopReason === 'aborted' || message.stopReason === 'error') {\n state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n }\n\n if (message.stopReason === 'aborted' || message.stopReason === 'error') {\n const errorMessage = message.errorMessage || 'Operation aborted';\n for (const [, component] of state.pendingTools) {\n component.updateResult(\n {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n false,\n );\n }\n state.pendingTools.clear();\n }\n\n state.streamingComponent = undefined;\n state.streamingMessage = undefined;\n state.seenToolCallIds.clear();\n state.subagentToolCallIds.clear();\n }\n state.ui.requestRender();\n}\n","/**\n * TUI component for rendering OM observation markers in chat history.\n * Supports updating in-place (start → end/failed).\n */\n\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\n\n/**\n * Format token count for display (e.g., 7234 -> \"7.2k\", 234 -> \"0.2k\", 0 -> \"0\")\n */\nfunction formatTokens(tokens: number): string {\n if (tokens === 0) return '0';\n const k = tokens / 1000;\n return k % 1 === 0 ? `${k}k` : `${k.toFixed(1)}k`;\n}\nexport type OMMarkerData =\n | {\n type: 'om_observation_start';\n tokensToObserve: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_end';\n tokensObserved: number;\n observationTokens: number;\n durationMs: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_failed';\n error: string;\n tokensAttempted?: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_buffering_start';\n operationType: 'observation' | 'reflection';\n tokensToBuffer: number;\n }\n | {\n type: 'om_buffering_end';\n operationType: 'observation' | 'reflection';\n tokensBuffered: number;\n bufferedTokens: number;\n observations?: string;\n }\n | {\n type: 'om_buffering_failed';\n operationType: 'observation' | 'reflection';\n error: string;\n }\n | {\n type: 'om_activation';\n operationType: 'observation' | 'reflection';\n tokensActivated: number;\n observationTokens: number;\n };\n\n/**\n * Renders an inline OM observation marker in the chat history.\n * Can be updated in-place to transition from start → end/failed.\n */\nexport class OMMarkerComponent extends Container {\n private textChild: Text;\n\n constructor(data: OMMarkerData) {\n super();\n // Add 1 line of padding above\n this.addChild(new Spacer(1));\n this.textChild = new Text(formatMarker(data), 0, 0);\n this.addChild(this.textChild);\n }\n\n /**\n * Update the marker in-place (e.g., from start → end).\n */\n update(data: OMMarkerData): void {\n this.textChild.setText(formatMarker(data));\n }\n}\nfunction formatMarker(data: OMMarkerData): string {\n const isReflection = data.operationType === 'reflection';\n const label = isReflection ? 'Reflection' : 'Observation';\n\n switch (data.type) {\n case 'om_observation_start': {\n const tokens = data.tokensToObserve > 0 ? ` ~${formatTokens(data.tokensToObserve)} tokens` : '';\n return theme.fg('muted', ` 🧠 ${label} in progress${tokens}...`);\n }\n case 'om_observation_end': {\n const observed = formatTokens(data.tokensObserved);\n const compressed = formatTokens(data.observationTokens);\n const ratio =\n data.tokensObserved > 0 && data.observationTokens > 0\n ? `${Math.round(data.tokensObserved / data.observationTokens)}x`\n : '';\n const duration = (data.durationMs / 1000).toFixed(1);\n const ratioStr = ratio ? ` (${ratio} compression)` : '';\n return theme.fg('success', ` 🧠 Observed: ${observed} → ${compressed} tokens${ratioStr} in ${duration}s ✓`);\n }\n case 'om_observation_failed': {\n const tokens = data.tokensAttempted ? ` (${formatTokens(data.tokensAttempted)} tokens)` : '';\n return theme.fg('error', ` ✗ ${label} failed${tokens}: ${data.error}`);\n }\n case 'om_buffering_start': {\n const tokens = data.tokensToBuffer > 0 ? ` ~${formatTokens(data.tokensToBuffer)} tokens` : '';\n return theme.fg('muted', ` ⟳ Buffering ${label.toLowerCase()}${tokens}...`);\n }\n case 'om_buffering_end': {\n const input = formatTokens(data.tokensBuffered);\n // For observations: bufferedTokens is cumulative total, not this cycle's output.\n // Estimate output from observations string (~4 chars/token).\n // For reflections: bufferedTokens IS the output token count.\n const outputTokens =\n data.operationType === 'observation' && data.observations\n ? Math.round(data.observations.length / 4)\n : data.bufferedTokens;\n const output = formatTokens(outputTokens);\n const ratio =\n data.tokensBuffered > 0 && outputTokens > 0 ? ` (${Math.round(data.tokensBuffered / outputTokens)}x)` : '';\n return theme.fg('success', ` ✓ Buffered ${label.toLowerCase()}: ${input} → ${output} tokens${ratio}`);\n }\n case 'om_buffering_failed': {\n return theme.fg('error', ` ✗ Buffering ${label.toLowerCase()} failed: ${data.error}`);\n }\n case 'om_activation': {\n const kind = data.operationType === 'reflection' ? 'reflection' : 'observations';\n const msgTokens = formatTokens(data.tokensActivated);\n const obsTokens = formatTokens(data.observationTokens);\n return theme.fg('success', ` ✓ Activated ${kind}: -${msgTokens} msg tokens, +${obsTokens} obs tokens`);\n }\n }\n}\n","/**\n * TUI component for rendering OM observation/reflection output in a bordered box.\n * Uses observer (amber) color for observations and reflector (red) color for reflections.\n * Collapsed to COLLAPSED_LINES by default, expandable with ctrl+e.\n * Includes marker info (emoji, compression stats) in the footer.\n */\n\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { mastra } from '../theme.js';\n\nconst OBSERVER_COLOR = mastra.orange;\nconst REFLECTOR_COLOR = mastra.red;\nconst COLLAPSED_LINES = 10;\n\nfunction formatTokens(tokens: number): string {\n if (tokens === 0) return '0';\n const k = tokens / 1000;\n return k % 1 === 0 ? `${k}k` : `${k.toFixed(1)}k`;\n}\n\n/** Truncate a string with ANSI codes to a visible width */\nfunction truncateAnsi(str: string, maxWidth: number): string {\n const ansiRegex = /\\x1b\\[[0-9;]*m/g;\n let visibleLength = 0;\n let result = '';\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = ansiRegex.exec(str)) !== null) {\n const textBefore = str.slice(lastIndex, match.index);\n for (const char of textBefore) {\n if (visibleLength >= maxWidth) break;\n result += char;\n visibleLength++;\n }\n if (visibleLength >= maxWidth) break;\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n\n const remaining = str.slice(lastIndex);\n for (const char of remaining) {\n if (visibleLength >= maxWidth) break;\n result += char;\n visibleLength++;\n }\n\n if (visibleLength >= maxWidth) {\n result += '\\x1b[0m';\n }\n return result;\n}\n\n/**\n * Soft-wrap an array of lines to fit within maxWidth, preserving words where possible.\n * Returns groups where each group corresponds to one original line split into wrapped segments.\n */\nfunction softWrapLines(lines: string[], maxWidth: number): { groups: string[][]; flat: string[] } {\n const groups: string[][] = [];\n const flat: string[] = [];\n for (const line of lines) {\n if (line.length <= maxWidth) {\n groups.push([line]);\n flat.push(line);\n continue;\n }\n // Word-wrap: break at spaces when possible\n const group: string[] = [];\n let remaining = line;\n while (remaining.length > maxWidth) {\n let breakAt = remaining.lastIndexOf(' ', maxWidth);\n if (breakAt <= 0) {\n breakAt = maxWidth;\n }\n const segment = remaining.slice(0, breakAt);\n group.push(segment);\n flat.push(segment);\n remaining = remaining.slice(breakAt).replace(/^ /, '');\n }\n if (remaining.length > 0) {\n group.push(remaining);\n flat.push(remaining);\n }\n groups.push(group);\n }\n return { groups, flat };\n}\n\nexport type OMOutputType = 'observation' | 'reflection';\n\nexport interface OMOutputData {\n type: OMOutputType;\n observations: string;\n currentTask?: string;\n suggestedResponse?: string;\n durationMs?: number;\n tokensObserved?: number;\n observationTokens?: number;\n compressedTokens?: number;\n}\n\nexport class OMOutputComponent extends Container {\n private data: OMOutputData;\n private expanded: boolean = false;\n\n constructor(data: OMOutputData) {\n super();\n this.data = data;\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.setExpanded(!this.expanded);\n }\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const isReflection = this.data.type === 'reflection';\n const color = isReflection ? REFLECTOR_COLOR : OBSERVER_COLOR;\n const border = (char: string) => chalk.bold.hex(color)(char);\n\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // \"│ \" prefix + buffer\n // Soft-wrap all original lines to terminal width\n const originalLines = this.data.observations.split('\\n');\n const { groups, flat: wrappedLines } = softWrapLines(originalLines, maxLineWidth);\n const originalLineCount = originalLines.length;\n const wrappedLineCount = wrappedLines.length;\n\n // Build footer text with marker info (emoji + compression stats)\n const footerText = this.buildFooterText(color);\n\n // Top border\n this.addChild(new Text(border('┌──'), 0, 0));\n\n // Content lines with left border\n let truncated = false;\n const borderedLines: string[] = [];\n if (!this.expanded && wrappedLineCount > COLLAPSED_LINES + 1) {\n // Collect head groups until we hit ~half the budget\n const headBudget = Math.ceil(COLLAPSED_LINES / 2);\n const headLines: string[] = [];\n let headGroupCount = 0;\n for (const group of groups) {\n if (headLines.length + group.length > headBudget && headLines.length > 0) break;\n headLines.push(...group);\n headGroupCount++;\n }\n\n // Collect tail groups from the end until we hit the other half\n const tailBudget = COLLAPSED_LINES - headLines.length;\n const tailLines: string[] = [];\n let tailGroupStart = groups.length;\n for (let i = groups.length - 1; i >= headGroupCount; i--) {\n if (tailLines.length + groups[i]!.length > tailBudget && tailLines.length > 0) break;\n tailLines.unshift(...groups[i]!);\n tailGroupStart = i;\n }\n\n const hiddenGroups = tailGroupStart - headGroupCount;\n truncated = hiddenGroups > 0;\n\n if (truncated) {\n for (const line of headLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n borderedLines.push(\n border('│') + ' ' + chalk.hex(mastra.mainGray)(`... ${originalLineCount} lines total (ctrl+e to expand)`),\n );\n for (const line of tailLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n } else {\n // Edge case: all groups fit when snapped to boundaries\n for (const line of wrappedLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n }\n } else {\n for (const line of wrappedLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n }\n\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.addChild(new Text(displayOutput, 0, 0));\n }\n\n // Current task / suggested response sections\n if (this.data.currentTask && (this.expanded || !truncated)) {\n const taskLine =\n border('│') +\n ' ' +\n chalk.hex(color).bold('Current task: ') +\n chalk.hex(mastra.specialGray)(this.data.currentTask);\n this.addChild(new Text(truncateAnsi(taskLine, termWidth - 2), 0, 0));\n }\n\n if (this.data.suggestedResponse && (this.expanded || !truncated)) {\n const sugLine =\n border('│') +\n ' ' +\n chalk.hex(color).bold('Suggested response: ') +\n chalk.hex(mastra.specialGray)(this.data.suggestedResponse);\n this.addChild(new Text(truncateAnsi(sugLine, termWidth - 2), 0, 0));\n }\n\n // Bottom border with footer\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n\n private buildFooterText(color: string): string {\n const isReflection = this.data.type === 'reflection';\n const emoji = '🧠';\n\n if (isReflection) {\n // Reflection: \"🧠 Reflected: Xk → Yk tokens (Zx compression) in Ns ✓\"\n const observed = formatTokens(this.data.tokensObserved ?? 0);\n const compressed = formatTokens(this.data.compressedTokens ?? this.data.observationTokens ?? 0);\n const ratio =\n (this.data.tokensObserved ?? 0) > 0 && (this.data.compressedTokens ?? this.data.observationTokens ?? 0) > 0\n ? `${Math.round((this.data.tokensObserved ?? 0) / (this.data.compressedTokens ?? this.data.observationTokens ?? 1))}x`\n : '';\n const durationStr = this.data.durationMs ? ` in ${(this.data.durationMs / 1000).toFixed(1)}s` : '';\n const ratioStr = ratio ? ` (${ratio} compression)` : '';\n return `${emoji} ${chalk.hex(color)(`Reflected: ${observed} → ${compressed} tokens${ratioStr}${durationStr}`)} ${chalk.hex(mastra.green)('✓')}`;\n } else {\n // Observation: \"🧠 Observed: Xk → Yk tokens (Zx compression) in Ns ✓\"\n const observed = formatTokens(this.data.tokensObserved ?? 0);\n const compressed = formatTokens(this.data.observationTokens ?? 0);\n const ratio =\n (this.data.tokensObserved ?? 0) > 0 && (this.data.observationTokens ?? 0) > 0\n ? `${Math.round((this.data.tokensObserved ?? 0) / (this.data.observationTokens ?? 1))}x`\n : '';\n const durationStr = this.data.durationMs ? ` in ${(this.data.durationMs / 1000).toFixed(1)}s` : '';\n const ratioStr = ratio ? ` (${ratio} compression)` : '';\n return `${emoji} ${chalk.hex(color)(`Observed: ${observed} → ${compressed} tokens${ratioStr}${durationStr}`)} ${chalk.hex(mastra.green)('✓')}`;\n }\n }\n}\n","/**\n * Event handlers for Observational Memory (OM) events:\n * om_status, om_observation_start/end, om_reflection_start/end,\n * om_buffering_start/end/failed, om_activation, and om_*_failed.\n *\n * All omProgress state updates are handled by the Harness display state.\n * These handlers focus on UI component creation/removal.\n */\nimport type { Component } from '@mariozechner/pi-tui';\n\nimport { OMMarkerComponent } from '../components/om-marker.js';\nimport type { OMMarkerData } from '../components/om-marker.js';\nimport { OMOutputComponent } from '../components/om-output.js';\nimport { insertChildBeforeAnchor, removeChild } from '../chat-layout.js';\n\nimport type { EventHandlerContext } from './types.js';\n\n/**\n * Insert a child component *before* the current streaming component so it\n * doesn't get pushed down as text streams in. Falls back to a normal\n * append when nothing is streaming.\n */\nfunction addChildBeforeStreaming(ctx: EventHandlerContext, child: Component): void {\n const { state } = ctx;\n insertChildBeforeAnchor(state.chatContainer, child, state.streamingComponent);\n}\n\nexport function handleOMObservationStart(ctx: EventHandlerContext, cycleId: string, tokensToObserve: number): void {\n const { state } = ctx;\n // Show in-progress marker in chat\n state.activeOMMarker = new OMMarkerComponent({\n type: 'om_observation_start',\n tokensToObserve,\n operationType: 'observation',\n });\n addChildBeforeStreaming(ctx, state.activeOMMarker);\n state.ui.requestRender();\n}\n\nexport function handleOMObservationEnd(\n ctx: EventHandlerContext,\n _cycleId: string,\n durationMs: number,\n tokensObserved: number,\n observationTokens: number,\n observations?: string,\n currentTask?: string,\n suggestedResponse?: string,\n): void {\n const { state } = ctx;\n // Remove in-progress marker — the output box replaces it\n if (state.activeOMMarker) {\n removeChild(state.chatContainer, state.activeOMMarker);\n state.activeOMMarker = undefined;\n }\n // Show observation output in a bordered box (includes marker info in footer)\n const outputComponent = new OMOutputComponent({\n type: 'observation',\n observations: observations ?? '',\n currentTask,\n suggestedResponse,\n durationMs,\n tokensObserved,\n observationTokens,\n });\n addChildBeforeStreaming(ctx, outputComponent);\n state.ui.requestRender();\n}\n\nexport function handleOMReflectionStart(ctx: EventHandlerContext, cycleId: string, tokensToReflect: number): void {\n const { state } = ctx;\n // Show in-progress marker in chat\n state.activeOMMarker = new OMMarkerComponent({\n type: 'om_observation_start',\n tokensToObserve: tokensToReflect,\n operationType: 'reflection',\n });\n addChildBeforeStreaming(ctx, state.activeOMMarker);\n state.ui.requestRender();\n}\n\nexport function handleOMReflectionEnd(\n ctx: EventHandlerContext,\n _cycleId: string,\n durationMs: number,\n compressedTokens: number,\n observations?: string,\n): void {\n const { state } = ctx;\n // Read pre-compression tokens from display state (set during om_reflection_start)\n // Note: Harness has already updated observationTokens to compressedTokens,\n // so we use tokensToReflect from the start event via the cycleId context.\n // For display purposes, we read the event parameter directly.\n const ds = state.harness.getDisplayState();\n // Remove in-progress marker — the output box replaces it\n if (state.activeOMMarker) {\n removeChild(state.chatContainer, state.activeOMMarker);\n state.activeOMMarker = undefined;\n }\n // Show reflection output in a bordered box (includes marker info in footer)\n const outputComponent = new OMOutputComponent({\n type: 'reflection',\n observations: observations ?? '',\n durationMs,\n compressedTokens,\n // preReflectionTokens captures observationTokens before compression started\n tokensObserved: ds.omProgress.preReflectionTokens,\n });\n addChildBeforeStreaming(ctx, outputComponent);\n state.ui.requestRender();\n}\n\nexport function handleOMFailed(\n ctx: EventHandlerContext,\n _cycleId: string,\n error: string,\n operation: 'observation' | 'reflection',\n): void {\n const { state } = ctx;\n // Update existing marker in-place, or create new one\n const failData: OMMarkerData = {\n type: 'om_observation_failed',\n error,\n operationType: operation,\n };\n if (state.activeOMMarker) {\n state.activeOMMarker.update(failData);\n state.activeOMMarker = undefined;\n } else {\n addChildBeforeStreaming(ctx, new OMMarkerComponent(failData));\n }\n state.ui.requestRender();\n}\n\nexport function handleOMBufferingStart(\n ctx: EventHandlerContext,\n operationType: 'observation' | 'reflection',\n tokensToBuffer: number,\n): void {\n const { state } = ctx;\n state.activeActivationMarker = undefined;\n state.activeBufferingMarker = new OMMarkerComponent({\n type: 'om_buffering_start',\n operationType,\n tokensToBuffer,\n });\n addChildBeforeStreaming(ctx, state.activeBufferingMarker);\n state.ui.requestRender();\n}\n\nexport function handleOMBufferingEnd(\n ctx: EventHandlerContext,\n operationType: 'observation' | 'reflection',\n tokensBuffered: number,\n bufferedTokens: number,\n observations?: string,\n): void {\n const { state } = ctx;\n if (state.activeBufferingMarker) {\n state.activeBufferingMarker.update({\n type: 'om_buffering_end',\n operationType,\n tokensBuffered,\n bufferedTokens,\n observations,\n });\n }\n state.activeBufferingMarker = undefined;\n state.ui.requestRender();\n}\n\nexport function handleOMBufferingFailed(\n ctx: EventHandlerContext,\n operationType: 'observation' | 'reflection',\n error: string,\n): void {\n const { state } = ctx;\n if (state.activeBufferingMarker) {\n state.activeBufferingMarker.update({\n type: 'om_buffering_failed',\n operationType,\n error,\n });\n }\n state.activeBufferingMarker = undefined;\n state.ui.requestRender();\n}\n\nexport function handleOMActivation(\n ctx: EventHandlerContext,\n operationType: 'observation' | 'reflection',\n tokensActivated: number,\n observationTokens: number,\n): void {\n const { state } = ctx;\n const activationData: OMMarkerData = {\n type: 'om_activation',\n operationType,\n tokensActivated,\n observationTokens,\n };\n state.activeActivationMarker = new OMMarkerComponent(activationData);\n addChildBeforeStreaming(ctx, state.activeActivationMarker);\n state.activeBufferingMarker = undefined;\n state.ui.requestRender();\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getAppDataDir } from './project.js';\n\nfunction slugify(str: string): string {\n const slug = str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return slug || 'untitled';\n}\n\nexport async function savePlanToDisk(opts: {\n title: string;\n plan: string;\n resourceId: string;\n plansDir?: string;\n}): Promise<void> {\n const { title, plan, resourceId } = opts;\n const plansDir =\n opts.plansDir ??\n process.env.ULICODE_PLANS_DIR ??\n process.env.ULI_PLANS_DIR ??\n process.env.PULSE_PLANS_DIR ??\n process.env.MASTRA_PLANS_DIR ??\n path.join(getAppDataDir(), 'plans');\n const dir = path.join(plansDir, resourceId);\n\n await fs.mkdir(dir, { recursive: true });\n\n const now = new Date();\n const timestamp = now.toISOString().replace(/:/g, '-');\n const slug = slugify(title);\n const filename = `${timestamp}-${slug}.md`;\n\n const content = `# ${title}\\n\\nApproved: ${now.toISOString()}\\n\\n${plan}\\n`;\n\n await fs.writeFile(path.join(dir, filename), content, 'utf-8');\n}\n","/**\n * Ask question dialog component.\n * Shows a question with either selectable options or free-text input.\n * Used by the ask_user tool to collect structured answers from the user.\n */\n\nimport { Box, getEditorKeybindings, Input, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme } from '../theme.js';\n\nexport interface AskQuestionDialogOptions {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n onSubmit: (answer: string) => void;\n onCancel: () => void;\n}\n\nexport class AskQuestionDialogComponent extends Box implements Focusable {\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit: (answer: string) => void;\n private onCancel: () => void;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (this.input) this.input.focused = value;\n }\n\n constructor(options: AskQuestionDialogOptions) {\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n\n // Title\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Question')), 0, 0));\n this.addChild(new Spacer(1));\n\n // Question text (may be multi-line)\n for (const line of options.question.split('\\n')) {\n this.addChild(new Text(theme.fg('text', line), 0, 0));\n }\n this.addChild(new Spacer(1));\n\n if (options.options && options.options.length > 0) {\n this.buildSelectMode(options.options);\n } else {\n this.buildInputMode();\n }\n }\n\n private buildSelectMode(opts: Array<{ label: string; description?: string }>): void {\n const items: SelectItem[] = opts.map(opt => ({\n value: opt.label,\n label: opt.description ? ` ${opt.label} ${theme.fg('dim', opt.description)}` : ` ${opt.label}`,\n }));\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.onSubmit(item.value);\n };\n this.selectList.onCancel = this.onCancel;\n\n this.addChild(this.selectList);\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('dim', ' ↑↓ to navigate · Enter to select · Esc to skip'), 0, 0));\n }\n\n private buildInputMode(): void {\n this.input = new Input();\n this.input.onSubmit = (value: string) => {\n const trimmed = value.trim();\n if (trimmed) {\n this.onSubmit(trimmed);\n }\n };\n\n this.addChild(this.input);\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('dim', ' Enter to submit · Esc to skip'), 0, 0));\n }\n\n handleInput(data: string): void {\n if (this.selectList) {\n this.selectList.handleInput(data);\n } else if (this.input) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.onCancel();\n return;\n }\n this.input.handleInput(data);\n }\n }\n}\n","/**\n * Inline plan approval component.\n * Shows a submitted plan as rendered markdown with Approve/Reject/Request Changes options\n * directly in the conversation flow.\n */\n\nimport { Box, Container, getEditorKeybindings, Input, Markdown, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme, getMarkdownTheme } from '../theme.js';\n\nexport interface PlanApprovalInlineOptions {\n planId: string;\n title: string;\n plan: string;\n onApprove: () => void;\n onReject: (feedback?: string) => void;\n}\n\nexport class PlanApprovalInlineComponent extends Container implements Focusable {\n private contentBox: Box;\n private selectList?: SelectList;\n private feedbackInput?: Input;\n private onApprove: () => void;\n private onReject: (feedback?: string) => void;\n private resolved = false;\n private mode: 'select' | 'feedback' = 'select';\n private planTitle: string;\n private planContent: string;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (this.mode === 'feedback' && this.feedbackInput) {\n this.feedbackInput.focused = value;\n }\n }\n\n constructor(options: PlanApprovalInlineOptions, _ui: TUI) {\n super();\n this.onApprove = options.onApprove;\n this.onReject = options.onReject;\n this.planTitle = options.title;\n this.planContent = options.plan;\n\n this.addChild(new Spacer(1));\n\n // Main content box with pending background\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n // Plan title header\n this.contentBox.addChild(new Text(theme.bold(theme.fg('accent', `Plan: ${options.title}`)), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n // Render plan as markdown\n const md = new Markdown(options.plan, 1, 0, getMarkdownTheme());\n this.contentBox.addChild(md);\n this.contentBox.addChild(new Spacer(1));\n\n // Action selector\n const items: SelectItem[] = [\n {\n value: 'approve',\n label: ` ${theme.fg('success', 'Approve')} ${theme.fg('dim', '— switch to Build mode and implement')}`,\n },\n {\n value: 'reject',\n label: ` ${theme.fg('error', 'Reject')} ${theme.fg('dim', '— stay in Plan mode')}`,\n },\n {\n value: 'edit',\n label: ` ${theme.fg('warning', 'Request changes')} ${theme.fg('dim', '— provide feedback')}`,\n },\n ];\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.handleSelection(item.value);\n };\n this.selectList.onCancel = () => {\n this.handleReject();\n };\n\n this.contentBox.addChild(this.selectList);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', 'Up/Down navigate Enter select Esc reject'), 0, 0));\n }\n\n private handleSelection(value: string): void {\n if (this.resolved) return;\n\n switch (value) {\n case 'approve':\n this.handleApprove();\n break;\n case 'reject':\n this.handleReject();\n break;\n case 'edit':\n this.switchToFeedbackMode();\n break;\n }\n }\n\n private handleApprove(): void {\n if (this.resolved) return;\n this.resolved = true;\n this.showResult('Approved', true);\n this.onApprove();\n }\n\n private handleReject(feedback?: string): void {\n if (this.resolved) return;\n this.resolved = true;\n this.showResult(feedback ? `Rejected — ${feedback}` : 'Rejected', false);\n this.onReject(feedback);\n }\n\n private switchToFeedbackMode(): void {\n this.mode = 'feedback';\n this.selectList = undefined;\n\n // Rebuild content box with feedback input while keeping the plan visible\n this.contentBox.clear();\n this.contentBox.addChild(new Text(theme.bold(theme.fg('accent', `Plan: ${this.planTitle}`)), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n const md = new Markdown(this.planContent, 1, 0, getMarkdownTheme());\n this.contentBox.addChild(md);\n this.contentBox.addChild(new Spacer(1));\n\n this.contentBox.addChild(new Text(theme.fg('accent', 'Provide feedback for revision:'), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n this.feedbackInput = new Input();\n this.feedbackInput.focused = this._focused;\n this.feedbackInput.onSubmit = (value: string) => {\n const trimmed = value.trim();\n this.handleReject(trimmed || undefined);\n };\n this.feedbackInput.onEscape = () => {\n this.handleReject();\n };\n\n this.contentBox.addChild(this.feedbackInput);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(\n new Text(theme.fg('dim', 'Enter to submit feedback Esc to reject without feedback'), 0, 0),\n );\n }\n\n private showResult(status: string, isApproved: boolean): void {\n this.contentBox.clear();\n const bgColor = isApproved ? 'toolSuccessBg' : 'toolErrorBg';\n this.contentBox.setBgFn((text: string) => theme.bg(bgColor, text));\n\n // Status header with icon\n const icon = isApproved ? theme.fg('success', '✓') : theme.fg('error', '✗');\n this.contentBox.addChild(\n new Text(\n `${icon} ${theme.bold(theme.fg('accent', `Plan: ${this.planTitle}`))} ${theme.fg('dim', `— ${status}`)}`,\n 0,\n 0,\n ),\n );\n this.contentBox.addChild(new Spacer(1));\n\n // Re-render plan as markdown\n const md = new Markdown(this.planContent, 1, 0, getMarkdownTheme());\n this.contentBox.addChild(md);\n }\n\n handleInput(data: string): void {\n if (this.resolved) return;\n\n if (this.mode === 'feedback' && this.feedbackInput) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.handleReject();\n return;\n }\n this.feedbackInput.handleInput(data);\n } else if (this.selectList) {\n this.selectList.handleInput(data);\n }\n }\n}\n\n/**\n * Static component for rendering a resolved plan in history.\n * Shows the plan content with approval/rejection status.\n */\nexport interface PlanResultOptions {\n title: string;\n plan: string;\n isApproved: boolean;\n feedback?: string;\n}\n\nexport class PlanResultComponent extends Container {\n constructor(options: PlanResultOptions) {\n super();\n\n this.addChild(new Spacer(1));\n\n const bgColor = options.isApproved ? 'toolSuccessBg' : 'toolErrorBg';\n const contentBox = new Box(1, 1, (text: string) => theme.bg(bgColor, text));\n this.addChild(contentBox);\n\n // Status header with icon\n const icon = options.isApproved ? theme.fg('success', '✓') : theme.fg('error', '✗');\n const status = options.isApproved ? 'Approved' : options.feedback ? `Rejected — ${options.feedback}` : 'Rejected';\n\n contentBox.addChild(\n new Text(\n `${icon} ${theme.bold(theme.fg('accent', `Plan: ${options.title}`))} ${theme.fg('dim', `— ${status}`)}`,\n 0,\n 0,\n ),\n );\n contentBox.addChild(new Spacer(1));\n\n // Render plan as markdown\n const md = new Markdown(options.plan, 1, 0, getMarkdownTheme());\n contentBox.addChild(md);\n }\n}\n","/**\n * Event handlers for interactive prompt events:\n * ask_question, sandbox_access_request, plan_approval_required.\n */\nimport { Spacer } from '@mariozechner/pi-tui';\n\nimport { savePlanToDisk } from '../../utils/plans.js';\nimport { insertChildrenAfterAnchor } from '../chat-layout.js';\nimport { AskQuestionDialogComponent } from '../components/ask-question-dialog.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { PlanApprovalInlineComponent } from '../components/plan-approval-inline.js';\nimport type { TUIState } from '../state.js';\nimport { theme } from '../theme.js';\n\nimport type { EventHandlerContext } from './types.js';\n\n/**\n * Process the next pending inline question from the queue.\n * Called when the current active question is resolved (submitted or cancelled).\n */\nfunction processNextInlineQuestion(state: TUIState): void {\n const next = state.pendingInlineQuestions.shift();\n if (next) {\n next();\n }\n}\n\nfunction addInlineComponentAfterAnchor(\n state: TUIState,\n component: AskQuestionInlineComponent | PlanApprovalInlineComponent,\n anchor?: object,\n): void {\n insertChildrenAfterAnchor(state.chatContainer, [new Spacer(1), component, new Spacer(1)], anchor as any);\n state.ui.requestRender();\n state.chatContainer.invalidate();\n component.focused = true;\n}\n\n/**\n * Handle an ask_question event from the ask_user tool.\n * Shows a dialog overlay and resolves the tool's pending promise.\n *\n * If another inline question is already active, the new question is queued\n * and will be shown once the current one is answered.\n */\nexport async function handleAskQuestion(\n ctx: EventHandlerContext,\n questionId: string,\n question: string,\n options?: Array<{ label: string; description?: string }>,\n): Promise<void> {\n const { state } = ctx;\n return new Promise(resolve => {\n if (state.options.inlineQuestions) {\n // Capture the current ask_user component reference now, before it can be\n // overwritten by a subsequent parallel tool call.\n const askUserComponent = state.lastAskUserComponent;\n\n const activate = () => {\n // Inline mode: Add question component to chat\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\n options,\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n state.harness.respondToQuestion({ questionId, answer });\n resolve();\n processNextInlineQuestion(state);\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n state.harness.respondToQuestion({ questionId, answer: '(skipped)' });\n resolve();\n processNextInlineQuestion(state);\n },\n },\n state.ui,\n );\n\n // Store as active question\n state.activeInlineQuestion = questionComponent;\n\n // Insert the question right after the ask_user tool component\n if (askUserComponent) {\n addInlineComponentAfterAnchor(state, questionComponent, askUserComponent);\n } else {\n addInlineComponentAfterAnchor(state, questionComponent);\n }\n };\n\n // If another inline question is already active, queue this one\n if (state.activeInlineQuestion) {\n state.pendingInlineQuestions.push(activate);\n } else {\n activate();\n }\n } else {\n // Dialog mode: Show overlay\n const dialog = new AskQuestionDialogComponent({\n question,\n options,\n onSubmit: answer => {\n state.ui.hideOverlay();\n state.harness.respondToQuestion({ questionId, answer });\n resolve();\n },\n onCancel: () => {\n state.ui.hideOverlay();\n state.harness.respondToQuestion({ questionId, answer: '(skipped)' });\n resolve();\n },\n });\n state.ui.showOverlay(dialog, { width: '70%', anchor: 'center' });\n dialog.focused = true;\n }\n\n ctx.notify('ask_question', question);\n });\n}\n\n/**\n * Handle a sandbox_access_request event from the request_access tool.\n * Shows an inline prompt for the user to approve or deny directory access.\n *\n * If another inline question is already active, the new prompt is queued\n * and will be shown once the current one is answered.\n */\nexport async function handleSandboxAccessRequest(\n ctx: EventHandlerContext,\n questionId: string,\n requestedPath: string,\n reason: string,\n): Promise<void> {\n const { state } = ctx;\n return new Promise(resolve => {\n const activate = () => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Grant sandbox access to \"${requestedPath}\"?\\n${theme.fg('dim', `Reason: ${reason}`)}`,\n options: [\n { label: 'Yes', description: 'Allow access to this directory' },\n { label: 'No', description: 'Deny access' },\n ],\n onSubmit: answer => {\n state.activeInlineQuestion = undefined;\n state.harness.respondToQuestion({ questionId, answer });\n resolve();\n processNextInlineQuestion(state);\n },\n onCancel: () => {\n state.activeInlineQuestion = undefined;\n state.harness.respondToQuestion({ questionId, answer: 'No' });\n resolve();\n processNextInlineQuestion(state);\n },\n formatResult: answer => {\n const approved = answer.toLowerCase().startsWith('y');\n return approved ? `Granted access to ${requestedPath}` : `Denied access to ${requestedPath}`;\n },\n isNegativeAnswer: answer => !answer.toLowerCase().startsWith('y'),\n },\n state.ui,\n );\n\n // Store as active question so input routing works\n state.activeInlineQuestion = questionComponent;\n\n // Add to chat\n addInlineComponentAfterAnchor(state, questionComponent);\n };\n\n // If another inline question is already active, queue this one\n if (state.activeInlineQuestion) {\n state.pendingInlineQuestions.push(activate);\n } else {\n activate();\n }\n\n ctx.notify('sandbox_access', `Sandbox access requested: ${requestedPath}`);\n });\n}\n\n/**\n * Handle a plan_approval_required event from the submit_plan tool.\n * Shows the plan inline with Approve/Reject/Request Changes options.\n */\nexport async function handlePlanApproval(\n ctx: EventHandlerContext,\n planId: string,\n title: string,\n plan: string,\n): Promise<void> {\n const { state } = ctx;\n return new Promise(resolve => {\n const approvalComponent = new PlanApprovalInlineComponent(\n {\n planId,\n title,\n plan,\n onApprove: async () => {\n state.activeInlinePlanApproval = undefined;\n // Store the approved plan in harness state\n await state.harness.setState({\n activePlan: {\n title,\n plan,\n approvedAt: new Date().toISOString(),\n },\n });\n // Persist plan to disk (fire-and-forget, best-effort)\n savePlanToDisk({\n title,\n plan,\n resourceId: state.harness.getResourceId(),\n }).catch(() => {});\n // Wait for plan approval to complete (switches mode, aborts stream)\n await state.harness.respondToPlanApproval({\n planId,\n response: { action: 'approved' },\n });\n\n // Now that mode switch is complete, add system reminder and trigger build agent\n // Use setTimeout to ensure the plan approval component has fully rendered\n setTimeout(() => {\n const reminderText = '<system-reminder>The user has approved the plan, begin executing.</system-reminder>';\n ctx.addUserMessage({\n id: `system-${Date.now()}`,\n role: 'user',\n content: [{ type: 'text', text: reminderText }],\n createdAt: new Date(),\n });\n ctx.fireMessage(reminderText);\n }, 50);\n\n resolve();\n },\n onReject: async (feedback?: string) => {\n state.activeInlinePlanApproval = undefined;\n await state.harness.respondToPlanApproval({\n planId,\n response: { action: 'rejected', feedback },\n });\n resolve();\n },\n },\n state.ui,\n );\n\n // Store as active plan approval\n state.activeInlinePlanApproval = approvalComponent;\n\n // Insert after the submit_plan tool component (same pattern as ask_user)\n if (state.lastSubmitPlanComponent) {\n addInlineComponentAfterAnchor(state, approvalComponent, state.lastSubmitPlanComponent);\n } else {\n addInlineComponentAfterAnchor(state, approvalComponent);\n }\n\n ctx.notify('plan_approval', `Plan \"${title}\" requires approval`);\n });\n}\n","/**\n * Subagent execution rendering component.\n * Shows real-time activity from a delegated subagent task using\n * the same bordered box style as shell/view tools:\n * - Top border\n * - Task description (always visible)\n * - Streaming tool call activity (capped rolling window)\n * - Bottom border with agent type, model, status, duration\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\nimport type { IToolExecutionComponent } from './tool-execution-interface.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SubagentToolCall {\n name: string;\n args: unknown;\n result?: string;\n isError?: boolean;\n done: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst MAX_ACTIVITY_LINES = 15;\nconst COLLAPSED_LINES = 15;\n\nexport interface SubagentExecutionOptions {\n /** When true, auto-collapse to a single summary line on completion. Default false. */\n collapseOnComplete?: boolean;\n}\n\nexport class SubagentExecutionComponent extends Container implements IToolExecutionComponent {\n private ui: TUI;\n\n // State\n private agentType: string;\n private task: string;\n private modelId?: string;\n private toolCalls: SubagentToolCall[] = [];\n private done = false;\n private isError = false;\n private startTime = Date.now();\n private durationMs = 0;\n private finalResult?: string;\n private expanded = false;\n private collapseOnComplete: boolean;\n\n constructor(agentType: string, task: string, ui: TUI, modelId?: string, options?: SubagentExecutionOptions) {\n super();\n this.agentType = agentType;\n this.task = task;\n this.modelId = modelId;\n this.ui = ui;\n this.collapseOnComplete = options?.collapseOnComplete ?? false;\n\n this.rebuild();\n }\n\n // ── Mutation API ──────────────────────────────────────────────────────\n\n addToolStart(name: string, args: unknown): void {\n this.toolCalls.push({ name, args, done: false });\n this.rebuild();\n }\n addToolEnd(name: string, result: unknown, isError: boolean): void {\n for (let i = this.toolCalls.length - 1; i >= 0; i--) {\n const toolCall = this.toolCalls[i]!;\n if (toolCall.name === name && !toolCall.done) {\n toolCall.done = true;\n toolCall.isError = isError;\n toolCall.result = typeof result === 'string' ? result : JSON.stringify(result ?? '');\n break;\n }\n }\n this.rebuild();\n }\n\n finish(isError: boolean, durationMs: number, result?: string): void {\n this.done = true;\n this.isError = isError;\n this.durationMs = durationMs;\n this.finalResult = result;\n if (this.collapseOnComplete) {\n this.expanded = false;\n }\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.expanded = !this.expanded;\n this.rebuild();\n }\n\n // IToolExecutionComponent interface methods\n updateArgs(_args: unknown): void {}\n updateResult(_result: unknown, _isPartial: boolean): void {}\n\n // ── Rendering ──────────────────────────────────────────────────────────\n\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n // ── Bottom border with info (always rendered) ──\n const typeLabel = theme.bold(theme.fg('accent', this.agentType));\n const modelLabel = this.modelId ? theme.fg('muted', ` ${this.modelId}`) : '';\n const statusIcon = this.done\n ? this.isError\n ? theme.fg('error', ' ✗')\n : theme.fg('success', ' ✓')\n : theme.fg('muted', ' ⋯');\n const durationStr = this.done ? theme.fg('muted', ` ${formatDuration(this.durationMs)}`) : '';\n const footerText = `${theme.bold(theme.fg('toolTitle', 'subagent'))} ${typeLabel}${modelLabel}${durationStr}${statusIcon}`;\n\n // When collapse-on-complete is enabled, render only the single-line footer summary\n if (this.collapseOnComplete && this.done && !this.expanded) {\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n this.invalidate();\n this.ui.requestRender();\n return;\n }\n\n // ── Top border ──\n this.addChild(new Text(border('┌──'), 0, 0));\n\n // ── Task description (capped when collapsed) ──\n const taskLines = this.task.split('\\n');\n const wrappedTaskLines: string[] = [];\n for (const line of taskLines) {\n if (line.length > maxLineWidth) {\n let remaining = line;\n while (remaining.length > maxLineWidth) {\n const breakAt = remaining.lastIndexOf(' ', maxLineWidth);\n const splitAt = breakAt > 0 ? breakAt : maxLineWidth;\n wrappedTaskLines.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n if (remaining) wrappedTaskLines.push(remaining);\n } else {\n wrappedTaskLines.push(line);\n }\n }\n const maxTaskLines = 5;\n const taskTruncated = !this.expanded && wrappedTaskLines.length > maxTaskLines + 1;\n const displayTaskLines = taskTruncated ? wrappedTaskLines.slice(0, maxTaskLines) : wrappedTaskLines;\n\n const taskContent = displayTaskLines.map(line => `${border('│')} ${line}`).join('\\n');\n this.addChild(new Text(taskContent, 0, 0));\n\n if (taskTruncated) {\n const moreText = theme.fg('muted', `... ${wrappedTaskLines.length - maxTaskLines} more lines (ctrl+e to expand)`);\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n\n // ── Activity lines (tool calls — capped rolling window) ──\n if (this.toolCalls.length > 0) {\n // Separator between task and activity\n this.addChild(new Text(`${border('│')} ${theme.fg('muted', '───')}`, 0, 0));\n\n const activityLines = this.toolCalls.map(tc => formatToolCallLine(tc, maxLineWidth));\n\n // While streaming: rolling window. When done: collapsible.\n const cap = this.done ? COLLAPSED_LINES : MAX_ACTIVITY_LINES;\n let displayLines = activityLines;\n let hiddenCount = 0;\n const minHidden = this.done ? 2 : 1;\n if (!this.expanded && activityLines.length > cap + minHidden - 1) {\n hiddenCount = activityLines.length - cap;\n if (this.done) {\n // Show first N lines when collapsed (completed)\n displayLines = activityLines.slice(0, cap);\n } else {\n // Show last N lines while streaming\n displayLines = activityLines.slice(-cap);\n }\n }\n\n if (!this.done && hiddenCount > 0) {\n const hiddenText = theme.fg('muted', ` ... ${hiddenCount} more above`);\n this.addChild(new Text(`${border('│')} ${hiddenText}`, 0, 0));\n }\n\n const activityContent = displayLines.map(line => `${border('│')} ${line}`).join('\\n');\n this.addChild(new Text(activityContent, 0, 0));\n\n if (this.done && hiddenCount > 0) {\n const moreText = theme.fg('muted', `... ${hiddenCount} more (ctrl+e to expand)`);\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n }\n\n // ── Final result (shown after completion, only when expanded) ──\n if (this.done && this.finalResult && this.expanded) {\n this.addChild(new Text(`${border('│')} ${theme.fg('muted', '───')}`, 0, 0));\n const resultLines = this.finalResult!.split('\\n');\n\n const resultContent = resultLines\n .map(line => {\n const truncatedLine = line.length > maxLineWidth ? line.slice(0, maxLineWidth - 1) + '…' : line;\n return `${border('│')} ${theme.fg('muted', truncatedLine)}`;\n })\n .join('\\n');\n if (resultContent.trim()) {\n this.addChild(new Text(resultContent, 0, 0));\n }\n }\n\n // ── Bottom border ──\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n\n this.invalidate();\n this.ui.requestRender();\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction formatToolCallLine(tc: SubagentToolCall, _maxWidth: number): string {\n const icon = tc.done ? (tc.isError ? theme.fg('error', '✗') : theme.fg('success', '✓')) : theme.fg('muted', '⋯');\n const name = theme.fg('toolTitle', tc.name);\n const argsSummary = summarizeArgs(tc.args);\n return `${icon} ${name} ${argsSummary}`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = (ms / 1000).toFixed(1);\n return `${s}s`;\n}\n\nfunction summarizeArgs(args: unknown): string {\n if (!args || typeof args !== 'object') return '';\n const obj = args as Record<string, unknown>;\n const parts: string[] = [];\n\n // Special handling for task_write tool\n if (obj.tasks && Array.isArray(obj.tasks)) {\n const tasks = obj.tasks as Array<{\n content?: string;\n status?: string;\n activeForm?: string;\n }>;\n const taskSummaries = tasks.map(t => {\n const icon = t.status === 'completed' ? '✓' : t.status === 'in_progress' ? '→' : '○';\n const content = t.content || t.activeForm || 'task';\n return `${icon} ${content}`;\n });\n return theme.fg('muted', taskSummaries.join(', '));\n }\n\n for (const [_key, val] of Object.entries(obj)) {\n if (typeof val === 'string') {\n const short = val.length > 40 ? val.slice(0, 40) + '…' : val;\n parts.push(theme.fg('muted', short));\n } else if (Array.isArray(val)) {\n parts.push(theme.fg('muted', `${val.length} items`));\n } else if (typeof val === 'object' && val !== null) {\n parts.push(theme.fg('muted', '{...}'));\n }\n }\n return parts.join(' ');\n}\n","/**\n * Event handlers for subagent delegation events:\n * subagent_start, subagent_tool_start, subagent_tool_end, subagent_end.\n */\nimport { insertChildBeforeAnchor, requestRenderSoon } from '../chat-layout.js';\nimport { SubagentExecutionComponent } from '../components/subagent-execution.js';\n\nimport type { EventHandlerContext } from './types.js';\n\nexport function handleSubagentStart(\n ctx: EventHandlerContext,\n toolCallId: string,\n agentType: string,\n task: string,\n modelId?: string,\n): void {\n const { state } = ctx;\n const component = new SubagentExecutionComponent(agentType, task, state.ui, modelId, {\n collapseOnComplete: state.quietMode,\n });\n state.pendingSubagents.set(toolCallId, component);\n state.allToolComponents.push(component as any);\n\n // Insert before the current streamingComponent so subagent box\n // appears between pre-subagent text and post-subagent text\n insertChildBeforeAnchor(state.chatContainer, component, state.streamingComponent);\n\n state.ui.requestRender();\n}\n\nexport function handleSubagentToolStart(\n ctx: EventHandlerContext,\n toolCallId: string,\n subToolName: string,\n subToolArgs: unknown,\n): void {\n const component = ctx.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.addToolStart(subToolName, subToolArgs);\n requestRenderSoon(ctx.state.ui);\n }\n}\n\nexport function handleSubagentToolEnd(\n ctx: EventHandlerContext,\n toolCallId: string,\n subToolName: string,\n subToolResult: unknown,\n isError: boolean,\n): void {\n const component = ctx.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.addToolEnd(subToolName, subToolResult, isError);\n requestRenderSoon(ctx.state.ui);\n }\n}\n\nexport function handleSubagentEnd(\n ctx: EventHandlerContext,\n toolCallId: string,\n isError: boolean,\n durationMs: number,\n result?: string,\n): void {\n const component = ctx.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.finish(isError, durationMs, result);\n ctx.state.pendingSubagents.delete(toolCallId);\n requestRenderSoon(ctx.state.ui);\n }\n}\n","/**\n * Tool approval dialog component.\n * Shows tool details and prompts user to approve or decline execution.\n *\n * Keyboard shortcuts:\n * y — approve this one call\n * n / Esc — decline this call\n * a — always allow this category for the session\n * Y — switch to YOLO mode (approve all)\n */\nimport { Box, getEditorKeybindings, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { theme } from '../theme.js';\n\nexport type ApprovalAction =\n | { type: 'approve' }\n | { type: 'decline' }\n | { type: 'always_allow_category' }\n | { type: 'yolo' };\n\nexport interface ToolApprovalDialogOptions {\n toolCallId: string;\n toolName: string;\n args: unknown;\n /** Human-readable category label, e.g. \"Edit\" or \"Execute\" */\n categoryLabel?: string;\n onAction: (action: ApprovalAction) => void;\n}\n\nexport class ToolApprovalDialogComponent extends Box implements Focusable {\n private toolName: string;\n private args: unknown;\n private categoryLabel: string | undefined;\n private onAction: (action: ApprovalAction) => void;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(options: ToolApprovalDialogOptions) {\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.toolName = options.toolName;\n this.args = options.args;\n this.categoryLabel = options.categoryLabel;\n this.onAction = options.onAction;\n\n this.buildUI();\n }\n\n private buildUI(): void {\n // Title\n this.addChild(new Text(theme.fg('warning', '⚠ Tool Approval Required'), 0, 0));\n this.addChild(new Spacer(1));\n\n // Tool name\n this.addChild(new Text(theme.fg('accent', `Tool: `) + theme.fg('text', this.toolName), 0, 0));\n if (this.categoryLabel) {\n this.addChild(new Text(theme.fg('accent', `Category: `) + theme.fg('text', this.categoryLabel), 0, 0));\n }\n this.addChild(new Spacer(1));\n\n // Arguments (formatted)\n this.addChild(new Text(theme.fg('muted', 'Arguments:'), 0, 0));\n const argsText = this.formatArgs(this.args);\n for (const line of argsText.split('\\n').slice(0, 10)) {\n this.addChild(new Text(theme.fg('text', ' ' + line), 0, 0));\n }\n if (argsText.split('\\n').length > 10) {\n this.addChild(new Text(theme.fg('muted', ' ... (truncated)'), 0, 0));\n }\n\n this.addChild(new Spacer(1));\n // Prompt text with keyboard shortcuts\n const categoryHint = this.categoryLabel\n ? `lways allow ${this.categoryLabel.toLowerCase()}`\n : 'lways allow category';\n const dimColor = chalk.hex(theme.getTheme().dim);\n const key = chalk.hex(theme.getTheme().text).bold;\n this.addChild(\n new Text(\n theme.fg('accent', 'Allow? ') +\n key('y') +\n dimColor('es ') +\n key('n') +\n dimColor('o ') +\n key('a') +\n dimColor(categoryHint + ' ') +\n key('Y') +\n dimColor('olo'),\n 0,\n 0,\n ),\n );\n }\n\n private formatArgs(args: unknown): string {\n if (args === null || args === undefined) {\n return '(none)';\n }\n\n if (typeof args !== 'object') {\n return String(args);\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) return '(none)';\n\n const lines: string[] = [];\n for (const [key, value] of entries) {\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n const maxLen = 120;\n const firstLine = str.split('\\n')[0] ?? '';\n const lineCount = typeof value === 'string' ? str.split('\\n').length : 0;\n const suffix = lineCount > 1 ? ` (${lineCount} lines)` : '';\n const display = firstLine.length > maxLen ? firstLine.slice(0, maxLen) + '…' : firstLine;\n lines.push(`${key}: ${display}${suffix}`);\n }\n return lines.join('\\n');\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n\n // Escape to decline\n if (kb.matches(data, 'selectCancel')) {\n this.onAction({ type: 'decline' });\n return;\n }\n\n // Single keypress shortcuts\n if (data === 'y') {\n this.onAction({ type: 'approve' });\n } else if (data === 'n') {\n this.onAction({ type: 'decline' });\n } else if (data === 'a') {\n this.onAction({ type: 'always_allow_category' });\n } else if (data === 'Y') {\n this.onAction({ type: 'yolo' });\n }\n }\n\n render(maxWidth: number): string[] {\n return super.render(maxWidth);\n }\n}\n","/**\n * Event handlers for tool execution events:\n * tool_start, tool_approval_required, tool_update, shell_output,\n * tool_input_start, tool_input_delta, tool_input_end, tool_end.\n *\n * Also includes formatToolResult helper.\n */\nimport { Text } from '@mariozechner/pi-tui';\nimport type { TaskItem } from '@mastra/core/harness';\nimport { parse as parsePartialJson } from 'partial-json';\n\nimport { getToolCategory, TOOL_CATEGORIES } from '../../permissions.js';\nimport { requestRenderSoon } from '../chat-layout.js';\nimport { AssistantMessageComponent } from '../components/assistant-message.js';\nimport { ToolApprovalDialogComponent } from '../components/tool-approval-dialog.js';\nimport type { ApprovalAction } from '../components/tool-approval-dialog.js';\nimport { ToolExecutionComponentEnhanced } from '../components/tool-execution-enhanced.js';\nimport type { ToolResult } from '../components/tool-execution-enhanced.js';\nimport { getMarkdownTheme } from '../theme.js';\n\nimport type { EventHandlerContext } from './types.js';\n\n/**\n * Format a tool result for display.\n * Handles objects, strings, and other types.\n * Extracts content from common tool return structures like { content: \"...\", isError: false }\n */\nexport function formatToolResult(result: unknown): string {\n if (result === null || result === undefined) {\n return '';\n }\n if (typeof result === 'string') {\n return result;\n }\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n // Handle common tool return format: { content: \"...\", isError: boolean }\n if ('content' in obj && typeof obj.content === 'string') {\n return obj.content;\n }\n // Handle content array format: { content: [{ type: \"text\", text: \"...\" }] }\n if ('content' in obj && Array.isArray(obj.content)) {\n const textParts = obj.content\n .filter(\n (part: unknown) =>\n typeof part === 'object' && part !== null && (part as Record<string, unknown>).type === 'text',\n )\n .map((part: unknown) => (part as Record<string, unknown>).text || '');\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n }\n try {\n return JSON.stringify(result, null, 2);\n } catch {\n return String(result);\n }\n }\n return String(result);\n}\n\nexport function handleToolApprovalRequired(\n ctx: EventHandlerContext,\n toolCallId: string,\n toolName: string,\n args: unknown,\n): void {\n const { state } = ctx;\n // Compute category label for the dialog\n const category = getToolCategory(toolName);\n const categoryLabel = category ? TOOL_CATEGORIES[category]?.label : undefined;\n\n // Send notification to alert the user\n ctx.notify('tool_approval', `Approve ${toolName}?`);\n\n const dialog = new ToolApprovalDialogComponent({\n toolCallId,\n toolName,\n args,\n categoryLabel,\n onAction: (action: ApprovalAction) => {\n state.ui.hideOverlay();\n state.pendingApprovalDismiss = null;\n if (action.type === 'approve') {\n state.harness.respondToToolApproval({ decision: 'approve' });\n } else if (action.type === 'always_allow_category') {\n state.harness.respondToToolApproval({ decision: 'always_allow_category' });\n } else if (action.type === 'yolo') {\n state.harness.setState({ yolo: true } as any);\n state.harness.respondToToolApproval({ decision: 'approve' });\n } else {\n state.harness.respondToToolApproval({ decision: 'decline' });\n }\n },\n });\n\n // Set up Ctrl+C dismiss to decline\n state.pendingApprovalDismiss = () => {\n state.ui.hideOverlay();\n state.pendingApprovalDismiss = null;\n state.harness.respondToToolApproval({ decision: 'decline' });\n };\n\n // Show the dialog as an overlay\n state.ui.showOverlay(dialog, {\n width: '70%',\n anchor: 'center',\n });\n dialog.focused = true;\n state.ui.requestRender();\n}\n\nexport function handleToolStart(ctx: EventHandlerContext, toolCallId: string, toolName: string, args: unknown): void {\n const { state } = ctx;\n // Component may already exist if created early by handleToolInputStart\n const existingComponent = state.pendingTools.get(toolCallId);\n\n if (existingComponent) {\n // Component was created during input streaming — update with final args\n existingComponent.updateArgs(args);\n } else if (!state.seenToolCallIds.has(toolCallId)) {\n state.seenToolCallIds.add(toolCallId);\n\n // Skip creating the regular tool component for subagent calls\n // The SubagentExecutionComponent will handle all the rendering\n if (toolName === 'subagent') {\n return;\n }\n\n ctx.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n toolName,\n args,\n { showImages: false, collapsedByDefault: !state.toolOutputExpanded },\n state.ui,\n );\n component.setExpanded(state.toolOutputExpanded);\n ctx.addChildBeforeFollowUps(component);\n state.pendingTools.set(toolCallId, component);\n state.allToolComponents.push(component);\n\n // Create a new post-tool AssistantMessageComponent so pre-tool text is preserved\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n\n state.ui.requestRender();\n }\n\n // Track ask_user tool components for inline question placement\n const component = state.pendingTools.get(toolCallId);\n if (component) {\n if (toolName === 'ask_user') {\n state.lastAskUserComponent = component;\n }\n // Track submit_plan tool components for inline plan approval placement\n if (toolName === 'submit_plan') {\n state.lastSubmitPlanComponent = component;\n }\n }\n\n // File modification tracking is handled by the Harness display state\n}\n\nexport function handleToolUpdate(ctx: EventHandlerContext, toolCallId: string, partialResult: unknown): void {\n const { state } = ctx;\n const component = state.pendingTools.get(toolCallId);\n if (component) {\n const result: ToolResult = {\n content: [{ type: 'text', text: formatToolResult(partialResult) }],\n isError: false,\n };\n component.updateResult(result, true);\n requestRenderSoon(state.ui);\n }\n}\n\n/**\n * Handle streaming shell output from execute_command tool.\n */\nexport function handleShellOutput(\n ctx: EventHandlerContext,\n toolCallId: string,\n output: string,\n _stream: 'stdout' | 'stderr',\n): void {\n const { state } = ctx;\n const component = state.pendingTools.get(toolCallId);\n if (component?.appendStreamingOutput) {\n component.appendStreamingOutput(output);\n requestRenderSoon(state.ui);\n }\n}\n\n/**\n * Handle the start of streaming tool call input arguments.\n * Creates the tool component early so partial args can render as they arrive.\n */\nexport function handleToolInputStart(ctx: EventHandlerContext, toolCallId: string, toolName: string): void {\n const { state } = ctx;\n\n // Mark as seen so handleMessageUpdate doesn't create a duplicate component\n if (!state.seenToolCallIds.has(toolCallId)) {\n state.seenToolCallIds.add(toolCallId);\n }\n\n // Create the component early so deltas can update it\n // Skip for subagent (handled by SubagentExecutionComponent) and task_write (streams to pinned TaskProgressComponent)\n if (toolName === 'task_write') {\n // Record position so task_updated can place inline completed/cleared display here\n state.taskWriteInsertIndex = state.chatContainer.children.length;\n\n // Create a new post-tool AssistantMessageComponent so pre-tool text is preserved\n // (even though task_write doesn't render a tool component inline, we still need\n // to split the streaming component so getTrailingContentParts doesn't overwrite it)\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n state.ui.requestRender();\n } else if (toolName !== 'subagent') {\n ctx.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n toolName,\n {},\n { showImages: false, collapsedByDefault: !state.toolOutputExpanded },\n state.ui,\n );\n component.setExpanded(state.toolOutputExpanded);\n ctx.addChildBeforeFollowUps(component);\n state.pendingTools.set(toolCallId, component);\n state.allToolComponents.push(component);\n\n // Create a new post-tool AssistantMessageComponent so pre-tool text is preserved\n state.streamingComponent = new AssistantMessageComponent(undefined, state.hideThinkingBlock, getMarkdownTheme());\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n\n state.ui.requestRender();\n }\n}\n\n/**\n * Handle an incremental delta of tool call input arguments.\n * Buffers the partial JSON text and attempts to parse it, updating the component's args.\n */\nexport function handleToolInputDelta(ctx: EventHandlerContext, toolCallId: string, _argsTextDelta: string): void {\n const { state } = ctx;\n const ds = state.harness.getDisplayState();\n const buffer = ds.toolInputBuffers.get(toolCallId);\n if (buffer === undefined) return;\n\n const updatedText = buffer.text;\n\n try {\n const partialArgs = parsePartialJson(updatedText);\n if (partialArgs && typeof partialArgs === 'object') {\n // Update inline tool component if it exists\n const component = state.pendingTools.get(toolCallId);\n if (component) {\n component.updateArgs(partialArgs);\n }\n\n // For task_write, stream partial tasks into the pinned TaskProgressComponent.\n // The last array item is actively being written so its content is unstable.\n // If all existing pinned items are already completed, the list is stable and\n // we can stream in new items immediately (including the last one).\n // Otherwise, exclude the last item to avoid jumpy partial-content matches.\n if (buffer.toolName === 'task_write' && state.taskProgress) {\n const tasks = (partialArgs as { tasks?: TaskItem[] }).tasks;\n if (tasks && tasks.length > 0) {\n const existing = state.taskProgress.getTasks();\n const allExistingDone = existing.length === 0 || existing.every(t => t.status === 'completed');\n if (allExistingDone) {\n // Old list is done — start fresh, stream new items immediately\n state.taskProgress.updateTasks(tasks as TaskItem[]);\n } else if (tasks.length > 1) {\n // Merge only completed items (exclude the last still-streaming one)\n const merged = [...existing];\n for (const task of tasks.slice(0, -1)) {\n if (!task.content) continue;\n const idx = merged.findIndex(t => t.content === task.content);\n if (idx >= 0) {\n merged[idx] = task;\n } else {\n merged.push(task);\n }\n }\n state.taskProgress.updateTasks(merged);\n }\n }\n }\n\n requestRenderSoon(state.ui);\n }\n } catch {\n // Malformed or incomplete JSON — partial-json throws MalformedJSON for invalid input\n }\n}\n\n/**\n * Clean up the input buffer when tool input streaming ends.\n */\nexport function handleToolInputEnd(_ctx: EventHandlerContext, _toolCallId: string): void {\n // Buffer cleanup handled by Harness display state\n}\n\nexport function handleToolEnd(ctx: EventHandlerContext, toolCallId: string, result: unknown, isError: boolean): void {\n const { state } = ctx;\n // If this is a subagent tool, store the result in the SubagentExecutionComponent\n const subagentComponent = state.pendingSubagents.get(toolCallId);\n if (subagentComponent) {\n // The final result is available here\n const resultText = formatToolResult(result);\n // We'll need to wait for subagent_end to set this\n // Store it temporarily\n (subagentComponent as any)._pendingResult = resultText;\n }\n\n // File modification tracking is handled by the Harness display state\n\n const component = state.pendingTools.get(toolCallId);\n if (component) {\n const toolResult: ToolResult = {\n content: [{ type: 'text', text: formatToolResult(result) }],\n isError,\n };\n component.updateResult(toolResult, false);\n\n state.pendingTools.delete(toolCallId);\n requestRenderSoon(state.ui);\n }\n}\n","/**\n * Event dispatcher: maps HarnessEvent types to extracted handler functions.\n */\nimport type { HarnessEvent, TaskItem } from '@mastra/core/harness';\n\nimport { getCurrentGitBranch } from '../utils/project.js';\nimport {\n handleAgentStart,\n handleAgentEnd,\n handleAgentAborted,\n handleAgentError,\n handleMessageStart,\n handleMessageUpdate,\n handleMessageEnd,\n handleOMObservationStart,\n handleOMObservationEnd,\n handleOMReflectionStart,\n handleOMReflectionEnd,\n handleOMFailed,\n handleOMBufferingStart,\n handleOMBufferingEnd,\n handleOMBufferingFailed,\n handleOMActivation,\n handleAskQuestion,\n handleSandboxAccessRequest,\n handlePlanApproval,\n handleSubagentStart,\n handleSubagentToolStart,\n handleSubagentToolEnd,\n handleSubagentEnd,\n handleToolApprovalRequired,\n handleToolStart,\n handleToolUpdate,\n handleShellOutput,\n handleToolInputStart,\n handleToolInputDelta,\n handleToolInputEnd,\n handleToolEnd,\n} from './handlers/index.js';\nimport { removeChild, requestRenderSoon } from './chat-layout.js';\nimport type { EventHandlerContext } from './handlers/types.js';\nimport type { TUIState } from './state.js';\n\n/**\n * Dispatch a HarnessEvent to the appropriate handler.\n */\nexport async function dispatchEvent(event: HarnessEvent, ectx: EventHandlerContext, state: TUIState): Promise<void> {\n switch (event.type) {\n case 'agent_start':\n handleAgentStart(ectx);\n break;\n\n case 'agent_end':\n if (event.reason === 'aborted') {\n handleAgentAborted(ectx);\n } else if (event.reason === 'error') {\n handleAgentError(ectx);\n } else {\n handleAgentEnd(ectx);\n }\n break;\n\n case 'message_start':\n handleMessageStart(ectx, event.message);\n break;\n\n case 'message_update':\n handleMessageUpdate(ectx, event.message);\n break;\n\n case 'message_end':\n handleMessageEnd(ectx, event.message);\n break;\n\n case 'tool_start':\n handleToolStart(ectx, event.toolCallId, event.toolName, event.args);\n break;\n\n case 'tool_approval_required':\n handleToolApprovalRequired(ectx, event.toolCallId, event.toolName, event.args);\n break;\n\n case 'tool_update':\n handleToolUpdate(ectx, event.toolCallId, event.partialResult);\n break;\n\n case 'shell_output':\n handleShellOutput(ectx, event.toolCallId, event.output, event.stream);\n break;\n\n case 'tool_input_start':\n handleToolInputStart(ectx, event.toolCallId, event.toolName);\n break;\n\n case 'tool_input_delta':\n handleToolInputDelta(ectx, event.toolCallId, event.argsTextDelta);\n break;\n\n case 'tool_input_end':\n handleToolInputEnd(ectx, event.toolCallId);\n break;\n\n case 'tool_end':\n handleToolEnd(ectx, event.toolCallId, event.result, event.isError);\n break;\n\n case 'info':\n ectx.showInfo(event.message);\n break;\n\n case 'error':\n ectx.showFormattedError(event);\n break;\n\n case 'mode_changed':\n await ectx.refreshModelAuthStatus();\n break;\n\n case 'model_changed':\n await ectx.refreshModelAuthStatus();\n break;\n\n case 'thread_changed': {\n ectx.showInfo(`Switched to thread: ${event.threadId}`);\n await ectx.renderExistingMessages();\n await state.harness.loadOMProgress();\n // Refresh git branch so TUI status line reflects the current branch\n const freshBranch = getCurrentGitBranch(state.projectInfo.rootPath);\n if (freshBranch) {\n state.projectInfo.gitBranch = freshBranch;\n }\n // Restore tasks from thread state\n const threadState = state.harness.getState() as {\n tasks?: TaskItem[];\n };\n if (state.taskProgress) {\n state.taskProgress.updateTasks(threadState.tasks ?? []);\n state.ui.requestRender();\n }\n break;\n }\n\n case 'thread_created': {\n ectx.showInfo(`Created thread: ${event.thread.id}`);\n // Sync inherited resource-level settings\n const tState = state.harness.getState() as any;\n if (typeof tState?.escapeAsCancel === 'boolean') {\n state.editor.escapeEnabled = tState.escapeAsCancel;\n }\n // Clear stale tasks from the previous thread\n if (state.taskProgress) {\n state.taskProgress.updateTasks([]);\n }\n state.taskWriteInsertIndex = -1;\n break;\n }\n\n case 'usage_update':\n // Token accumulation handled by Harness display state\n break;\n\n // Observational Memory events\n case 'om_status':\n // All state updates handled by Harness applyDisplayStateUpdate\n break;\n\n case 'om_observation_start':\n handleOMObservationStart(ectx, event.cycleId, event.tokensToObserve);\n break;\n\n case 'om_observation_end':\n handleOMObservationEnd(\n ectx,\n event.cycleId,\n event.durationMs,\n event.tokensObserved,\n event.observationTokens,\n event.observations,\n event.currentTask,\n event.suggestedResponse,\n );\n break;\n\n case 'om_observation_failed':\n handleOMFailed(ectx, event.cycleId, event.error, 'observation');\n break;\n\n case 'om_reflection_start':\n handleOMReflectionStart(ectx, event.cycleId, event.tokensToReflect);\n break;\n\n case 'om_reflection_end':\n handleOMReflectionEnd(ectx, event.cycleId, event.durationMs, event.compressedTokens, event.observations);\n break;\n\n case 'om_reflection_failed':\n handleOMFailed(ectx, event.cycleId, event.error, 'reflection');\n break;\n\n case 'om_buffering_start':\n handleOMBufferingStart(ectx, event.operationType, event.tokensToBuffer);\n break;\n\n case 'om_buffering_end':\n handleOMBufferingEnd(ectx, event.operationType, event.tokensBuffered, event.bufferedTokens, event.observations);\n break;\n\n case 'om_buffering_failed':\n handleOMBufferingFailed(ectx, event.operationType, event.error);\n break;\n\n case 'om_activation':\n handleOMActivation(ectx, event.operationType, event.tokensActivated, event.observationTokens);\n break;\n\n case 'follow_up_queued': {\n ectx.updateStatusLine();\n break;\n }\n\n case 'workspace_ready':\n // Workspace initialized successfully - silent unless verbose\n break;\n\n case 'workspace_error':\n ectx.showError(`Workspace: ${event.error.message}`);\n break;\n\n case 'workspace_status_changed':\n if (event.status === 'error' && event.error) {\n ectx.showError(`Workspace: ${event.error.message}`);\n }\n break;\n\n // Subagent / Task delegation events\n case 'subagent_start':\n handleSubagentStart(ectx, event.toolCallId, event.agentType, event.task, event.modelId);\n break;\n\n case 'subagent_tool_start':\n handleSubagentToolStart(ectx, event.toolCallId, event.subToolName, event.subToolArgs);\n break;\n\n case 'subagent_tool_end':\n handleSubagentToolEnd(ectx, event.toolCallId, event.subToolName, event.subToolResult, event.isError);\n break;\n\n case 'subagent_text_delta':\n // Text deltas are streamed but we don't render them incrementally\n // (the final result is shown via tool_end for the parent tool call)\n break;\n\n case 'subagent_end':\n handleSubagentEnd(ectx, event.toolCallId, event.isError, event.durationMs, event.result);\n break;\n\n case 'task_updated': {\n const tasks = event.tasks as TaskItem[];\n if (state.taskProgress) {\n state.taskProgress.updateTasks(tasks ?? []);\n\n // Find the most recent task_write tool component and get its position\n let insertIndex = -1;\n for (let i = state.allToolComponents.length - 1; i >= 0; i--) {\n const comp = state.allToolComponents[i];\n if ((comp as any).toolName === 'task_write') {\n insertIndex = state.chatContainer.children.indexOf(comp as any);\n removeChild(state.chatContainer, comp as any);\n state.allToolComponents.splice(i, 1);\n break;\n }\n }\n // Fall back to the position recorded during streaming (when no inline component was created)\n if (insertIndex === -1 && state.taskWriteInsertIndex >= 0) {\n insertIndex = state.taskWriteInsertIndex;\n state.taskWriteInsertIndex = -1;\n }\n\n // Check if all tasks are completed\n const allCompleted = tasks && tasks.length > 0 && tasks.every(t => t.status === 'completed');\n if (allCompleted) {\n // Show collapsed completed list (pinned/live)\n ectx.renderCompletedTasksInline(tasks, insertIndex, true);\n } else if (state.harness.getDisplayState().previousTasks.length > 0 && (!tasks || tasks.length === 0)) {\n // Tasks were cleared\n ectx.renderClearedTasksInline(state.harness.getDisplayState().previousTasks, insertIndex);\n }\n\n requestRenderSoon(state.ui);\n }\n break;\n }\n\n case 'ask_question':\n await handleAskQuestion(ectx, event.questionId, event.question, event.options);\n break;\n\n case 'sandbox_access_request':\n await handleSandboxAccessRequest(ectx, event.questionId, event.path, event.reason);\n break;\n\n case 'plan_approval_required':\n await handlePlanApproval(ectx, event.planId, event.title, event.plan);\n break;\n\n case 'plan_approved':\n // Handled directly in onApprove callback to ensure proper sequencing\n break;\n\n case 'display_state_changed':\n // The Harness emits this after every event with the updated display state.\n // Use it as the single trigger for status-line re-renders since all the\n // fields it reads (isRunning, omProgress, buffering flags) are now\n // maintained by the Harness.\n ectx.updateStatusLine();\n break;\n }\n}\n","/**\n * SystemReminderComponent - renders system-generated reminder messages\n * with a distinct orange/dim style to differentiate from user messages.\n */\n\nimport { Container, Markdown } from '@mariozechner/pi-tui';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nexport interface SystemReminderOptions {\n message: string;\n}\n\nexport class SystemReminderComponent extends Container {\n constructor(options: SystemReminderOptions) {\n super();\n\n // Title and message combined with full-width background\n const title = theme.fg('warning', '⚡ System Notice');\n const content = `${title}\\n${options.message.trim()}`;\n\n this.addChild(\n new Markdown(content, 1, 1, getMarkdownTheme(), {\n bgColor: (text: string) => theme.bg('systemReminderBg', text),\n color: (text: string) => theme.fg('muted', text),\n }),\n );\n }\n}\n","/**\n * Component that renders a user message.\n */\n\nimport { Container, Markdown, Spacer } from '@mariozechner/pi-tui';\nimport type { MarkdownTheme } from '@mariozechner/pi-tui';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nexport class UserMessageComponent extends Container {\n constructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n super();\n this.addChild(new Spacer(1));\n this.addChild(\n new Markdown(text, 1, 1, markdownTheme, {\n bgColor: (text: string) => theme.bg('userMessageBg', text),\n color: (text: string) => theme.fg('userMessageText', text),\n }),\n );\n }\n}\n","/**\n * Message rendering helpers extracted from MastraTUI.\n *\n * Pure functions that operate on TUIState — no class dependency.\n */\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { HarnessMessage, HarnessMessageContent, TaskItem } from '@mastra/core/harness';\nimport { parseSubagentMeta } from '@mastra/core/harness';\nimport chalk from 'chalk';\nimport { AssistantMessageComponent } from './components/assistant-message.js';\nimport { OMMarkerComponent } from './components/om-marker.js';\nimport { OMOutputComponent } from './components/om-output.js';\nimport { PlanResultComponent } from './components/plan-approval-inline.js';\nimport { SlashCommandComponent } from './components/slash-command.js';\nimport { SubagentExecutionComponent } from './components/subagent-execution.js';\nimport { SystemReminderComponent } from './components/system-reminder.js';\nimport { ToolExecutionComponentEnhanced } from './components/tool-execution-enhanced.js';\nimport { UserMessageComponent } from './components/user-message.js';\nimport { formatToolResult } from './handlers/tool.js';\nimport type { TUIState } from './state.js';\nimport { getMarkdownTheme, theme, mastra } from './theme.js';\n\n// Re-export so existing consumers can still import from here\nexport { formatToolResult };\n\n// =============================================================================\n// renderCompletedTasksInline / renderClearedTasksInline\n// =============================================================================\n\n/**\n * Render a completed task list inline in the chat history.\n */\nexport function renderCompletedTasksInline(\n state: TUIState,\n tasks: TaskItem[],\n insertIndex = -1,\n collapsed = false,\n): void {\n const headerText =\n theme.bold(theme.fg('accent', 'Tasks')) + theme.fg('dim', ` [${tasks.length}/${tasks.length} completed]`);\n\n const container = new Container();\n container.addChild(new Spacer(1));\n container.addChild(new Text(headerText, 0, 0));\n const MAX_VISIBLE = 4;\n const shouldCollapse = collapsed && tasks.length > MAX_VISIBLE + 1;\n const visible = shouldCollapse ? tasks.slice(0, MAX_VISIBLE) : tasks;\n const remaining = shouldCollapse ? tasks.length - MAX_VISIBLE : 0;\n\n for (const task of visible) {\n const icon = chalk.hex(mastra.green)('✓');\n const text = chalk.hex(mastra.green)(task.content);\n container.addChild(new Text(` ${icon} ${text}`, 0, 0));\n }\n if (remaining > 0) {\n container.addChild(\n new Text(\n theme.fg('dim', ` ... ${remaining} more completed task${remaining > 1 ? 's' : ''} (ctrl+e to expand)`),\n 0,\n 0,\n ),\n );\n }\n\n if (insertIndex >= 0) {\n state.chatContainer.children.splice(insertIndex, 0, container);\n state.chatContainer.invalidate();\n } else {\n state.chatContainer.addChild(container);\n }\n}\n\n/**\n * Render inline display when tasks are cleared.\n */\nexport function renderClearedTasksInline(state: TUIState, clearedTasks: TaskItem[], insertIndex = -1): void {\n const container = new Container();\n container.addChild(new Spacer(1));\n const count = clearedTasks.length;\n const label = count === 1 ? 'Task' : 'Tasks';\n container.addChild(new Text(theme.fg('accent', `${label} cleared`), 0, 0));\n for (const task of clearedTasks) {\n const icon = task.status === 'completed' ? chalk.hex(mastra.green)('✓') : chalk.hex(mastra.darkGray)('○');\n const text = chalk.hex(theme.getTheme().dim).strikethrough(task.content);\n container.addChild(new Text(` ${icon} ${text}`, 0, 0));\n }\n if (insertIndex >= 0) {\n state.chatContainer.children.splice(insertIndex, 0, container);\n state.chatContainer.invalidate();\n } else {\n state.chatContainer.addChild(container);\n }\n}\n\n// =============================================================================\n// addUserMessage\n// =============================================================================\n\n/**\n * Add a user message to the chat container.\n */\nexport function addUserMessage(state: TUIState, message: HarnessMessage): void {\n const textContent = message.content\n .filter(c => c.type === 'text')\n .map(c => (c as { type: 'text'; text: string }).text)\n .join('\\n');\n\n const imageCount = message.content.filter(c => c.type === 'image').length;\n\n // Strip [image] markers from text since we show count separately\n const displayText = imageCount > 0 ? textContent.replace(/\\[image\\]\\s*/g, '').trim() : textContent.trim();\n // Check for system reminder tags\n const systemReminderMatch = displayText.match(/<system-reminder>([\\s\\S]*?)<\\/system-reminder>/);\n if (systemReminderMatch) {\n const reminderText = systemReminderMatch[1]!.trim();\n const reminderComponent = new SystemReminderComponent({\n message: reminderText,\n });\n\n // System reminders always go at the end (after plan approval)\n state.chatContainer.addChild(new Spacer(1));\n state.chatContainer.addChild(reminderComponent);\n state.ui.requestRender();\n return;\n }\n\n // Check for slash command tags\n const slashCommandMatch = displayText.match(/<slash-command\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/slash-command>/);\n if (slashCommandMatch) {\n const commandName = slashCommandMatch[1]!;\n const commandContent = slashCommandMatch[2]!.trim();\n const slashComp = new SlashCommandComponent(commandName, commandContent);\n state.allSlashCommandComponents.push(slashComp);\n state.chatContainer.addChild(slashComp);\n state.ui.requestRender();\n return;\n }\n\n const prefix = imageCount > 0 ? `[${imageCount} image${imageCount > 1 ? 's' : ''}] ` : '';\n if (displayText || prefix) {\n const userComponent = new UserMessageComponent(prefix + displayText);\n\n // Always append to end — follow-ups should stay at the bottom\n state.chatContainer.addChild(userComponent);\n\n // Track follow-up components sent while streaming so tool calls\n // can be inserted before them (keeping them anchored at bottom).\n // Only track if the agent is already streaming a response — otherwise\n // this is the initial message that triggers the response, not a follow-up.\n if (state.harness.getDisplayState().isRunning && state.streamingComponent) {\n state.followUpComponents.push(userComponent);\n }\n }\n}\n\n// =============================================================================\n// renderExistingMessages\n// =============================================================================\n\n/**\n * Re-render all existing messages from the harness thread into the chat container.\n * Called on thread switch and initial load.\n */\nexport async function renderExistingMessages(state: TUIState): Promise<void> {\n const messages = await state.harness.listMessages({ limit: 40 });\n\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n state.allSlashCommandComponents = [];\n\n // Local accumulator for detecting task clears during history reconstruction\n let previousTasksAcc: TaskItem[] = [];\n\n for (const message of messages) {\n if (message.role === 'user') {\n addUserMessage(state, message);\n } else if (message.role === 'assistant') {\n // Render content in order - interleaving text and tool calls\n // Accumulate text/thinking until we hit a tool call, then render both\n let accumulatedContent: HarnessMessageContent[] = [];\n\n for (const content of message.content) {\n if (content.type === 'text' || content.type === 'thinking') {\n accumulatedContent.push(content);\n } else if (content.type === 'tool_call') {\n // Render accumulated text first if any\n if (accumulatedContent.length > 0) {\n const textMessage: HarnessMessage = {\n ...message,\n content: accumulatedContent,\n };\n const textComponent = new AssistantMessageComponent(\n textMessage,\n state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n state.chatContainer.addChild(textComponent);\n accumulatedContent = [];\n }\n\n // Find matching tool result\n const toolResult = message.content.find(c => c.type === 'tool_result' && c.id === content.id);\n\n // Render subagent tool calls with dedicated component\n if (content.name === 'subagent') {\n const subArgs = content.args as\n | {\n agentType?: string;\n task?: string;\n modelId?: string;\n }\n | undefined;\n const rawResult = toolResult?.type === 'tool_result' ? formatToolResult(toolResult.result) : undefined;\n const isErr = toolResult?.type === 'tool_result' && toolResult.isError;\n\n // Parse embedded metadata for model ID, duration, tool calls\n const meta = rawResult ? parseSubagentMeta(rawResult) : null;\n const resultText = meta?.text ?? rawResult;\n const modelId = meta?.modelId ?? subArgs?.modelId;\n const durationMs = meta?.durationMs ?? 0;\n\n const subComponent = new SubagentExecutionComponent(\n subArgs?.agentType ?? 'unknown',\n subArgs?.task ?? '',\n state.ui,\n modelId,\n { collapseOnComplete: state.quietMode },\n );\n // Populate tool calls from metadata\n if (meta?.toolCalls) {\n for (const tc of meta.toolCalls) {\n subComponent.addToolStart(tc.name, {});\n subComponent.addToolEnd(tc.name, '', tc.isError);\n }\n }\n // Mark as finished with result\n subComponent.finish(isErr ?? false, durationMs, resultText);\n state.chatContainer.addChild(subComponent);\n state.allToolComponents.push(subComponent as any);\n continue;\n }\n\n // Render the tool call\n const toolComponent = new ToolExecutionComponentEnhanced(\n content.name,\n content.args,\n {\n showImages: false,\n collapsedByDefault: !state.toolOutputExpanded,\n },\n state.ui,\n );\n\n if (toolResult && toolResult.type === 'tool_result') {\n toolComponent.updateResult(\n {\n content: [\n {\n type: 'text',\n text: formatToolResult(toolResult.result),\n },\n ],\n isError: toolResult.isError,\n },\n false,\n );\n }\n\n // If this was task_write with all completed or cleared, show inline instead of tool component\n let replacedWithInline = false;\n if (content.name === 'task_write' && toolResult?.type === 'tool_result' && !toolResult.isError) {\n const args = content.args as { tasks?: TaskItem[] } | undefined;\n const tasks = args?.tasks;\n if (tasks && tasks.length > 0 && tasks.every(t => t.status === 'completed')) {\n renderCompletedTasksInline(state, tasks);\n replacedWithInline = true;\n } else if (!tasks || tasks.length === 0) {\n // Tasks were cleared - show with previous tasks if we have them\n if (previousTasksAcc.length > 0) {\n renderClearedTasksInline(state, previousTasksAcc);\n previousTasksAcc = [];\n replacedWithInline = true;\n }\n } else {\n // Track for detecting clears\n previousTasksAcc = [...tasks];\n }\n }\n\n // If this was submit_plan, show the plan with approval status\n if (content.name === 'submit_plan' && toolResult?.type === 'tool_result') {\n const args = content.args as { title?: string; plan?: string } | undefined;\n // Result could be a string or an object with content property\n let resultText = '';\n if (typeof toolResult.result === 'string') {\n resultText = toolResult.result;\n } else if (\n typeof toolResult.result === 'object' &&\n toolResult.result !== null &&\n 'content' in toolResult.result &&\n typeof (toolResult.result as any).content === 'string'\n ) {\n resultText = (toolResult.result as any).content;\n }\n const isApproved = resultText.toLowerCase().includes('approved');\n // Extract feedback if rejected with feedback\n let feedback: string | undefined;\n if (!isApproved && resultText.includes('Feedback:')) {\n const feedbackMatch = resultText.match(/Feedback:\\s*(.+)/);\n feedback = feedbackMatch?.[1];\n }\n\n if (args?.title && args?.plan) {\n const planResult = new PlanResultComponent({\n title: args.title,\n plan: args.plan,\n isApproved,\n feedback,\n });\n state.chatContainer.addChild(planResult);\n replacedWithInline = true;\n }\n }\n\n if (!replacedWithInline) {\n state.chatContainer.addChild(toolComponent);\n state.allToolComponents.push(toolComponent);\n }\n } else if (\n content.type === 'om_observation_start' ||\n content.type === 'om_observation_end' ||\n content.type === 'om_observation_failed'\n ) {\n // Skip start markers in history — only show completed/failed results\n if (content.type === 'om_observation_start') continue;\n\n // Render accumulated text first if any\n if (accumulatedContent.length > 0) {\n const textMessage: HarnessMessage = {\n ...message,\n content: accumulatedContent,\n };\n const textComponent = new AssistantMessageComponent(\n textMessage,\n state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n state.chatContainer.addChild(textComponent);\n accumulatedContent = [];\n }\n\n if (content.type === 'om_observation_end') {\n // Render bordered output box with marker info in footer\n const isReflection = content.operationType === 'reflection';\n const outputComponent = new OMOutputComponent({\n type: isReflection ? 'reflection' : 'observation',\n observations: content.observations ?? '',\n currentTask: content.currentTask,\n suggestedResponse: content.suggestedResponse,\n durationMs: content.durationMs,\n tokensObserved: content.tokensObserved,\n observationTokens: content.observationTokens,\n compressedTokens: isReflection ? content.observationTokens : undefined,\n });\n state.chatContainer.addChild(outputComponent);\n } else {\n // Failed marker\n state.chatContainer.addChild(new OMMarkerComponent(content));\n }\n }\n // Skip tool_result - it's handled with tool_call above\n }\n\n // Render any remaining text after the last tool call\n if (accumulatedContent.length > 0) {\n const textMessage: HarnessMessage = {\n ...message,\n content: accumulatedContent,\n };\n const textComponent = new AssistantMessageComponent(textMessage, state.hideThinkingBlock, getMarkdownTheme());\n state.chatContainer.addChild(textComponent);\n }\n }\n }\n\n // Restore pinned task list from the last active task_write in history\n if (previousTasksAcc.length > 0 && state.taskProgress) {\n state.taskProgress.updateTasks(previousTasksAcc);\n }\n\n state.ui.requestRender();\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport * as yaml from 'js-yaml';\n\n/**\n * Metadata for a slash command\n */\nexport interface SlashCommandMetadata {\n /** Command name (e.g., \"git:commit\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** The command template with variables */\n template: string;\n /** Source file path */\n sourcePath: string;\n /** Namespace derived from directory structure */\n namespace?: string;\n}\n\n/**\n * Parse a command file and extract metadata and template\n * Supports both frontmatter-based and plain markdown files\n */\nexport async function parseCommandFile(filePath: string, baseDir?: string): Promise<SlashCommandMetadata | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const trimmedContent = content.trim();\n\n // Check if file has frontmatter (starts with ---)\n if (!trimmedContent.startsWith('---')) {\n // No frontmatter - treat entire file as template\n // Derive name from file path\n const name = baseDir ? extractCommandName(filePath, baseDir) : path.basename(filePath, '.md');\n\n return {\n name,\n description: '',\n template: content,\n sourcePath: filePath,\n };\n }\n\n // Split frontmatter and template\n const parts = content.split('---');\n if (parts.length < 3) {\n return null;\n }\n\n const frontmatter = parts[1]!.trim();\n const template = parts.slice(2).join('---').trim();\n\n // Parse YAML frontmatter\n const metadata = yaml.load(frontmatter) as Record<string, string>;\n\n // Derive name from file path if not specified in frontmatter\n let name: string;\n if (metadata?.name) {\n name = metadata.name;\n } else if (baseDir) {\n name = extractCommandName(filePath, baseDir);\n } else {\n name = path.basename(filePath, '.md');\n }\n\n return {\n name,\n description: metadata?.description || '',\n template,\n sourcePath: filePath,\n namespace: metadata?.namespace,\n };\n } catch (error) {\n console.error(`Error parsing command file ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Extract command name from file path\n * Converts path like \"git/commit.md\" to \"git:commit\"\n */\nexport function extractCommandName(filePath: string, baseDir: string): string {\n const relativePath = path.relative(baseDir, filePath);\n const dirName = path.dirname(relativePath);\n const baseName = path.basename(relativePath, '.md');\n\n if (dirName === '.' || dirName === '') {\n return baseName;\n }\n\n // Replace path separators with colons for namespacing\n const namespace = dirName.replace(/[\\\\/]/g, ':');\n return `${namespace}:${baseName}`;\n}\n\n/**\n * Recursively scan a directory for command files\n */\nexport async function scanCommandDirectory(dirPath: string): Promise<SlashCommandMetadata[]> {\n const commands: SlashCommandMetadata[] = [];\n\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n const subCommands = await scanCommandDirectory(fullPath);\n commands.push(...subCommands);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n // Parse markdown command files, passing dirPath as baseDir for name derivation\n const command = await parseCommandFile(fullPath, dirPath);\n if (command) {\n commands.push(command);\n }\n }\n }\n } catch {\n // Directory doesn't exist or can't be read - silently skip\n }\n\n return commands;\n}\n/**\n * Load custom slash commands from all configured directories\n * Priority: mastra project > claude project > opencode project > mastra user > claude user > opencode user\n */\nexport async function loadCustomCommands(projectDir?: string): Promise<SlashCommandMetadata[]> {\n const commands: SlashCommandMetadata[] = [];\n const seenNames = new Set<string>();\n\n // Helper to add commands without duplicates (later commands override earlier ones)\n const addCommands = (newCommands: SlashCommandMetadata[]) => {\n for (const cmd of newCommands) {\n if (!seenNames.has(cmd.name)) {\n seenNames.add(cmd.name);\n commands.push(cmd);\n }\n }\n };\n\n const homeDir = process.env.HOME || process.env.USERPROFILE;\n\n // 1. Load from opencode user directory ~/.opencode/command (lowest priority)\n if (homeDir) {\n const opencodeUserDir = path.join(homeDir, '.opencode', 'command');\n const opencodeUserCommands = await scanCommandDirectory(opencodeUserDir);\n addCommands(opencodeUserCommands);\n }\n\n // 2. Load from claude user directory ~/.claude/commands (Claude Code compat)\n if (homeDir) {\n const claudeUserDir = path.join(homeDir, '.claude', 'commands');\n const claudeUserCommands = await scanCommandDirectory(claudeUserDir);\n addCommands(claudeUserCommands);\n }\n\n // 3. Load from Ulicode user directory ~/.ulicode/commands, then temporary and legacy paths\n if (homeDir) {\n const ulicodeUserDir = path.join(homeDir, '.ulicode', 'commands');\n const ulicodeUserCommands = await scanCommandDirectory(ulicodeUserDir);\n addCommands(ulicodeUserCommands);\n\n const uliUserDir = path.join(homeDir, '.uli-cli', 'commands');\n const uliUserCommands = await scanCommandDirectory(uliUserDir);\n addCommands(uliUserCommands);\n\n const pulseUserDir = path.join(homeDir, '.pulse', 'commands');\n const pulseUserCommands = await scanCommandDirectory(pulseUserDir);\n addCommands(pulseUserCommands);\n\n const mastraUserDir = path.join(homeDir, '.mastracode', 'commands');\n const mastraUserCommands = await scanCommandDirectory(mastraUserDir);\n addCommands(mastraUserCommands);\n }\n\n // 4. Load from opencode project directory .opencode/command\n if (projectDir) {\n const opencodeProjectDir = path.join(projectDir, '.opencode', 'command');\n const opencodeProjectCommands = await scanCommandDirectory(opencodeProjectDir);\n addCommands(opencodeProjectCommands);\n }\n\n // 5. Load from claude project directory .claude/commands (Claude Code compat)\n if (projectDir) {\n const claudeProjectDir = path.join(projectDir, '.claude', 'commands');\n const claudeProjectCommands = await scanCommandDirectory(claudeProjectDir);\n addCommands(claudeProjectCommands);\n }\n\n // 6. Load from Ulicode project directory .ulicode/commands (highest priority), then temporary and legacy paths\n if (projectDir) {\n const ulicodeProjectDir = path.join(projectDir, '.ulicode', 'commands');\n const ulicodeProjectCommands = await scanCommandDirectory(ulicodeProjectDir);\n addCommands(ulicodeProjectCommands);\n\n const uliProjectDir = path.join(projectDir, '.uli-cli', 'commands');\n const uliProjectCommands = await scanCommandDirectory(uliProjectDir);\n addCommands(uliProjectCommands);\n\n const pulseProjectDir = path.join(projectDir, '.pulse', 'commands');\n const pulseProjectCommands = await scanCommandDirectory(pulseProjectDir);\n addCommands(pulseProjectCommands);\n\n const mastraProjectDir = path.join(projectDir, '.mastracode', 'commands');\n const mastraProjectCommands = await scanCommandDirectory(mastraProjectDir);\n addCommands(mastraProjectCommands);\n }\n\n return commands;\n}\n\n/**\n * Get the commands directory path for a project\n */\nexport function getProjectCommandsDir(projectDir: string): string {\n return path.join(projectDir, '.ulicode', 'commands');\n}\n\n/**\n * Initialize a commands directory with an example command\n */\nexport async function initCommandsDirectory(projectDir: string): Promise<void> {\n const commandsDir = getProjectCommandsDir(projectDir);\n\n try {\n await fs.mkdir(commandsDir, { recursive: true });\n\n // Create an example command\n const examplePath = path.join(commandsDir, 'example.md');\n const exampleContent = `---\nname: example\ndescription: An example slash command\n---\n\nThis is an example slash command template.\nYou can use variables like \\$ARGUMENTS or \\$1, \\$2 for positional args.\nYou can also include file content with @filename.\nShell commands with !command will be executed and output included.\n`;\n\n try {\n await fs.access(examplePath);\n // File already exists, don't overwrite\n } catch {\n await fs.writeFile(examplePath, exampleContent, 'utf-8');\n }\n } catch (error) {\n console.error('Error initializing commands directory:', error);\n }\n}\n","/**\n * ASCII art banner for the TUI header.\n * Legacy Pulse branding keeps the block art; current app names use a compact title.\n */\nimport chalk from 'chalk';\n\nimport { projectTheme, theme } from '../theme.js';\n\n// Project accent gradient stops (left → right)\nconst GRADIENT_STOPS = projectTheme.accentGradientStops;\n\n// Full \"ULICODE\" banner\nconst ULICODE_ART = [\n \"██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗\",\n \"██║ ██║██║ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝\",\n \"██║ ██║██║ ██║██║ ██║ ██║██║ ██║█████╗ \",\n \"██║ ██║██║ ██║██║ ██║ ██║██║ ██║██╔══╝ \",\n \"╚██████╔╝███████╗██║╚██████╗╚██████╔╝██████╔╝███████╗\",\n \" ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝\"\n];\n\n\n// Short \"PULSE\" banner\nconst SHORT_ART = ULICODE_ART.map(line => line.replace(/ULICODE/g, 'PULSE'));\n\n/**\n * Interpolate between two hex colors.\n */\nfunction lerpColor(hex1: string, hex2: string, t: number): [number, number, number] {\n const r1 = parseInt(hex1.slice(1, 3), 16);\n const g1 = parseInt(hex1.slice(3, 5), 16);\n const b1 = parseInt(hex1.slice(5, 7), 16);\n const r2 = parseInt(hex2.slice(1, 3), 16);\n const g2 = parseInt(hex2.slice(3, 5), 16);\n const b2 = parseInt(hex2.slice(5, 7), 16);\n return [Math.round(r1 + (r2 - r1) * t), Math.round(g1 + (g2 - g1) * t), Math.round(b1 + (b2 - b1) * t)];\n}\n\n/**\n * Color a single character based on its horizontal position in the gradient.\n */\nfunction gradientChar(ch: string, colIdx: number, totalCols: number): string {\n if (ch === ' ') return ' ';\n const t = totalCols <= 1 ? 0.5 : colIdx / (totalCols - 1);\n const segmentCount = GRADIENT_STOPS.length - 1;\n const segment = Math.min(Math.floor(t * segmentCount), segmentCount - 1);\n const frac = t * segmentCount - segment;\n const [r, g, b] = lerpColor(GRADIENT_STOPS[segment]!, GRADIENT_STOPS[segment + 1]!, frac);\n return chalk.rgb(r, g, b)(ch);\n}\n\n/**\n * Apply left-to-right accent gradient to a line of text.\n */\nfunction colorLine(line: string): string {\n const chars = [...line];\n return chars.map((ch, i) => gradientChar(ch, i, chars.length)).join('');\n}\n\n/**\n * Render the banner header for the TUI.\n *\n * @param version - App version string (e.g. \"0.2.0\")\n * @param appName - App name. Legacy Pulse branding uses block art; current names use compact text.\n * @returns Styled multi-line string ready for display.\n */\nexport function renderBanner(version: string, appName?: string): string {\n const name = appName || 'Ulicode';\n\n // New app names get the simple text format; legacy Pulse keeps block art.\n if (name !== 'Pulse') {\n return theme.fg('accent', '◆') + ' ' + theme.bold(theme.fg('accent', name)) + theme.fg('dim', ` v${version}`);\n }\n\n const cols = process.stdout.columns || 80;\n\n // Narrow terminal — compact single line\n if (cols < 30) {\n return (\n theme.fg('accent', '◆') + ' ' + theme.bold(theme.fg('accent', 'Pulse')) + theme.fg('dim', ` v${version}`)\n );\n }\n\n // Select art based on available width\n const art = cols >= 50 ? ULICODE_ART : SHORT_ART;\n const coloredLines = art.map(line => colorLine(line));\n\n // Append version below the art\n coloredLines.push(theme.fg('dim', `v${version}`));\n\n return coloredLines.join('\\n');\n}\n","/**\n * Task progress component for the TUI.\n * Shows a persistent, compact display of the current task list.\n * Hidden when no tasks exist OR when all tasks are completed.\n * Renders between status and editor.\n */\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport type { TaskItem } from '@mastra/core/harness';\nimport chalk from 'chalk';\nimport { theme } from '../theme.js';\n\nexport class TaskProgressComponent extends Container {\n private tasks: TaskItem[] = [];\n\n constructor() {\n super();\n }\n\n /**\n * Replace the entire task list and re-render.\n */\n updateTasks(tasks: TaskItem[]): void {\n this.tasks = tasks;\n this.rebuildDisplay();\n }\n\n /**\n * Get the current task list (read-only copy).\n */\n getTasks(): TaskItem[] {\n return [...this.tasks];\n }\n\n private rebuildDisplay(): void {\n this.clear();\n\n // No tasks = no render (component takes zero vertical space)\n if (this.tasks.length === 0) return;\n\n // Progress header\n const completed = this.tasks.filter(t => t.status === 'completed').length;\n const total = this.tasks.length;\n\n // Hide the component when all tasks are completed\n if (completed === total) return;\n const headerText =\n ' ' + theme.bold(theme.fg('accent', 'Tasks')) + theme.fg('dim', ` [${completed}/${total} completed]`);\n\n this.addChild(new Spacer(1));\n this.addChild(new Text(headerText, 0, 0));\n\n // Render each task\n for (const task of this.tasks) {\n this.addChild(new Text(this.formatTaskLine(task), 0, 0));\n }\n }\n\n private formatTaskLine(task: TaskItem): string {\n const indent = ' ';\n\n switch (task.status) {\n case 'completed': {\n const icon = theme.fg('success', '\\u2713');\n const text = chalk.hex(theme.getTheme().success).strikethrough(task.content);\n return `${indent}${icon} ${text}`;\n }\n case 'in_progress': {\n const icon = theme.fg('warning', '\\u25B6');\n const text = theme.bold(theme.fg('warning', task.activeForm));\n return `${indent}${icon} ${text}`;\n }\n case 'pending': {\n const icon = theme.fg('dim', '\\u25CB');\n const text = theme.fg('dim', task.content);\n return `${indent}${icon} ${text}`;\n }\n }\n }\n}\n","/**\n * TUI setup: keyboard shortcuts, layout building, autocomplete, key handlers.\n */\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\n\nimport { CombinedAutocompleteProvider, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { SlashCommand } from '@mariozechner/pi-tui';\nimport type { HarnessEventListener, TaskItem } from '@mastra/core/harness';\n\nimport { getUserId } from '../utils/project.js';\nimport { loadCustomCommands } from '../utils/slash-command-loader.js';\nimport { ThreadLockError } from '../utils/thread-lock.js';\nimport { APP_VERSION } from '../version.js';\nimport { renderBanner } from './components/banner.js';\nimport { TaskProgressComponent } from './components/task-progress.js';\nimport { renderComposerAttachmentChips } from './composer-attachments.js';\nimport { showError, showInfo } from './display.js';\nimport type { TUIState } from './state.js';\nimport { updateStatusLine } from './status-line.js';\nimport { theme } from './theme.js';\n\n// =============================================================================\n// Keyboard Shortcuts\n// =============================================================================\n\nexport function setupKeyboardShortcuts(\n state: TUIState,\n callbacks: {\n stop: () => void;\n doubleCtrlCMs: number;\n queueFollowUpMessage: (text: string) => void;\n },\n): void {\n // Ctrl+C / Escape - abort if running, clear input if idle, double-tap always exits\n state.editor.onAction('clear', () => {\n const now = Date.now();\n if (now - state.lastCtrlCTime < callbacks.doubleCtrlCMs) {\n // Double Ctrl+C → exit\n callbacks.stop();\n process.exit(0);\n }\n state.lastCtrlCTime = now;\n\n if (state.pendingApprovalDismiss) {\n // Dismiss active approval dialog and abort\n state.pendingApprovalDismiss();\n state.activeInlinePlanApproval = undefined;\n state.activeInlineQuestion = undefined;\n state.pendingInlineQuestions.length = 0;\n state.userInitiatedAbort = true;\n state.harness.abort();\n } else if (state.harness.isRunning()) {\n // Clean up active inline components on abort\n state.activeInlinePlanApproval = undefined;\n state.activeInlineQuestion = undefined;\n state.pendingInlineQuestions.length = 0;\n state.userInitiatedAbort = true;\n state.harness.abort();\n } else {\n const current = state.editor.getText();\n if (current.length > 0 || state.pendingFileAttachments.length > 0) {\n state.lastClearedText = current;\n state.lastClearedFileAttachments = [...state.pendingFileAttachments];\n }\n state.editor.setText('');\n state.pendingFileAttachments = [];\n updateComposerAttachmentLine(state);\n state.ui.requestRender();\n }\n });\n\n // Ctrl+Z - suspend process (SIGTSTP)\n state.editor.onAction('suspend', () => {\n if (process.platform === 'win32') {\n showInfo(state, 'Suspend is not supported on Windows');\n return;\n }\n\n state.ui.stop();\n const onContinue = () => {\n state.ui.start();\n state.ui.requestRender();\n };\n process.once('SIGCONT', onContinue);\n try {\n process.kill(process.pid, 'SIGTSTP');\n } catch {\n process.off('SIGCONT', onContinue);\n state.ui.start();\n state.ui.requestRender();\n showError(state, 'Unable to suspend in the current terminal');\n }\n });\n\n // Alt+Z - undo last clear (restore editor text)\n state.editor.onAction('undo', () => {\n if (\n (state.lastClearedText || state.lastClearedFileAttachments.length > 0) &&\n state.editor.getText().length === 0 &&\n state.pendingFileAttachments.length === 0\n ) {\n state.editor.setText(state.lastClearedText);\n state.pendingFileAttachments = [...state.lastClearedFileAttachments];\n state.lastClearedText = '';\n state.lastClearedFileAttachments = [];\n updateComposerAttachmentLine(state);\n state.ui.requestRender();\n }\n });\n\n // Ctrl+D - exit when editor is empty\n state.editor.onCtrlD = () => {\n callbacks.stop();\n process.exit(0);\n };\n\n // Ctrl+T - toggle thinking blocks visibility\n state.editor.onAction('toggleThinking', () => {\n state.hideThinkingBlock = !state.hideThinkingBlock;\n state.ui.requestRender();\n });\n\n // Ctrl+E - expand/collapse tool outputs\n state.editor.onAction('expandTools', () => {\n state.toolOutputExpanded = !state.toolOutputExpanded;\n for (const tool of state.allToolComponents) {\n tool.setExpanded(state.toolOutputExpanded);\n }\n for (const sc of state.allSlashCommandComponents) {\n sc.setExpanded(state.toolOutputExpanded);\n }\n state.ui.requestRender();\n });\n\n // Shift+Tab - cycle harness modes\n state.editor.onAction('cycleMode', async () => {\n // Block mode switching while plan approval is active\n if (state.activeInlinePlanApproval) {\n showInfo(state, 'Resolve the plan approval first');\n return;\n }\n\n const modes = state.harness.listModes();\n if (modes.length <= 1) return;\n const currentId = state.harness.getCurrentModeId();\n const currentIndex = modes.findIndex(m => m.id === currentId);\n const nextIndex = (currentIndex + 1) % modes.length;\n const nextMode = modes[nextIndex]!;\n await state.harness.switchMode({ modeId: nextMode.id });\n });\n\n // Ctrl+Y - toggle YOLO mode\n state.editor.onAction('toggleYolo', () => {\n const current = (state.harness.getState() as any).yolo === true;\n state.harness.setState({ yolo: !current } as any);\n showInfo(state, current ? 'YOLO mode off' : 'YOLO mode on');\n });\n\n // Enter - submit immediately when idle, queue follow-up input while streaming\n state.editor.onAction('followUp', () => {\n if (!state.harness.isRunning()) {\n state.editor.onSubmit?.(state.editor.getText());\n return true;\n }\n\n const text = state.editor.getText();\n if (!text.trim() && state.pendingImages.length === 0 && state.pendingFileAttachments.length === 0) {\n return true;\n }\n\n if (text.trim()) {\n state.editor.addToHistory(text.trim());\n }\n state.editor.setText('');\n callbacks.queueFollowUpMessage(text);\n state.ui.requestRender();\n return true;\n });\n}\n\n// =============================================================================\n// Layout\n// =============================================================================\n\nexport function buildLayout(state: TUIState, refreshModelAuthStatus: () => Promise<void>): void {\n // Add header\n const appName = state.options.appName || 'Ulicode';\n const version = state.options.version || APP_VERSION;\n\n const banner = renderBanner(version, appName);\n\n // Project frontmatter\n const frontmatter = [\n `Project: ${state.projectInfo.name}`,\n `Resource ID: ${state.projectInfo.resourceId}`,\n state.projectInfo.gitBranch ? `Branch: ${state.projectInfo.gitBranch}` : null,\n state.projectInfo.isWorktree ? `Worktree of: ${state.projectInfo.mainRepoPath}` : null,\n `User: ${getUserId(state.projectInfo.rootPath)}`,\n ]\n .filter(Boolean)\n .map(line => theme.fg('muted', line as string))\n .join('\\n');\n\n const sep = theme.fg('dim', ' · ');\n const hintParts: string[] = [];\n if (state.harness.listModes().length > 1) {\n hintParts.push(`${theme.fg('accent', '⇧+Tab')} ${theme.fg('muted', 'cycle modes')}`);\n }\n hintParts.push(`${theme.fg('accent', '/help')} ${theme.fg('muted', 'info & shortcuts')}`);\n const instructions = ` ${hintParts.join(sep)}`;\n\n state.ui.addChild(new Spacer(1));\n state.ui.addChild(new Text(banner, 1, 0));\n state.ui.addChild(new Text(frontmatter, 1, 0));\n state.ui.addChild(new Spacer(1));\n state.ui.addChild(new Text(instructions, 0, 0));\n state.ui.addChild(new Spacer(1));\n\n // Add main containers\n state.ui.addChild(state.chatContainer);\n // Task progress (between chat and editor, visible only when tasks exist)\n state.taskProgress = new TaskProgressComponent();\n state.ui.addChild(state.taskProgress);\n state.ui.addChild(state.editorContainer);\n state.composerAttachmentLine = new Text('', 0, 0);\n state.editorContainer.addChild(state.composerAttachmentLine);\n state.editorContainer.addChild(state.editor);\n\n // Add footer with two-line status\n state.statusLine = new Text('', 0, 0);\n state.memoryStatusLine = new Text('', 0, 0);\n state.footer.addChild(state.statusLine);\n state.footer.addChild(state.memoryStatusLine);\n state.ui.addChild(state.footer);\n updateStatusLine(state);\n refreshModelAuthStatus();\n\n // Set focus to editor\n state.ui.setFocus(state.editor);\n}\n\nexport function updateComposerAttachmentLine(state: TUIState): void {\n state.composerAttachmentLine?.setText(renderComposerAttachmentChips(state.pendingFileAttachments));\n}\n\n// =============================================================================\n// Autocomplete\n// =============================================================================\n\n/** Detect the fd binary (fast file finder) for @ fuzzy file autocomplete */\nfunction detectFdPath(): string | null {\n const whichCmd = process.platform === 'win32' ? 'where' : 'which';\n for (const bin of ['fd', 'fdfind']) {\n try {\n const resolved = execFileSync(whichCmd, [bin], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })\n .trim()\n .split(/\\r?\\n/)[0];\n if (resolved) return resolved;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\nexport function setupAutocomplete(state: TUIState): void {\n const slashCommands: SlashCommand[] = [\n { name: 'new', description: 'Start a new thread' },\n { name: 'clone', description: 'Clone the current thread' },\n { name: 'threads', description: 'Switch between threads' },\n { name: 'models', description: 'Switch model pack' },\n { name: 'custom-providers', description: 'Manage custom providers and models' },\n { name: 'subagents', description: 'Configure subagent model defaults' },\n { name: 'om', description: 'Configure Observational Memory models' },\n { name: 'think', description: 'Set thinking (off|low|medium|high|xhigh|status)' },\n { name: 'login', description: 'Login with OAuth provider' },\n { name: 'skills', description: 'List available skills' },\n { name: 'cost', description: 'Show token usage and estimated costs' },\n { name: 'diff', description: 'Show modified files or git diff' },\n { name: 'name', description: 'Rename current thread' },\n {\n name: 'resource',\n description: 'Show/switch resource ID (tag for sharing)',\n },\n { name: 'logout', description: 'Logout from OAuth provider' },\n { name: 'hooks', description: 'Show/reload configured hooks' },\n { name: 'mcp', description: 'Show/reload MCP server connections' },\n {\n name: 'thread:tag-dir',\n description: 'Tag current thread with this directory',\n },\n {\n name: 'sandbox',\n description: 'Manage allowed paths (add/remove directories)',\n },\n {\n name: 'permissions',\n description: 'View/manage tool approval permissions',\n },\n {\n name: 'settings',\n description: 'General settings (notifications, YOLO, thinking)',\n },\n {\n name: 'yolo',\n description: 'Toggle YOLO mode (auto-approve all tools)',\n },\n { name: 'review', description: 'Review a GitHub pull request' },\n { name: 'report-issue', description: 'Open or browse Ulicode issues' },\n { name: 'setup', description: 'Re-run the setup wizard' },\n { name: 'theme', description: 'Switch color theme (auto/dark/light)' },\n { name: 'update', description: 'Check for and install updates' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'help', description: 'Show available commands' },\n ];\n\n // Only show /mode if there's more than one mode\n const modes = state.harness.listModes();\n if (modes.length > 1) {\n slashCommands.push({ name: 'mode', description: 'Switch agent mode' });\n }\n\n // Add custom slash commands to the list with // prefixes so they remain\n // visually distinct from built-in slash commands in autocomplete.\n for (const customCmd of state.customSlashCommands) {\n slashCommands.push({\n name: `/${customCmd.name}`,\n description: customCmd.description || `Custom: ${customCmd.name}`,\n });\n }\n\n const fdPath = detectFdPath();\n state.autocompleteProvider = new CombinedAutocompleteProvider(slashCommands, process.cwd(), fdPath);\n state.editor.setAutocompleteProvider(state.autocompleteProvider);\n}\n\n// =============================================================================\n// Custom Slash Commands Loading\n// =============================================================================\n\nexport async function loadCustomSlashCommands(state: TUIState): Promise<void> {\n try {\n // Load from all sources (global and local)\n const globalCommands = await loadCustomCommands();\n const localCommands = await loadCustomCommands(process.cwd());\n\n // Merge commands, with local taking precedence over global for same names\n const commandMap = new Map<string, (typeof globalCommands)[number]>();\n\n // Add global commands first\n for (const cmd of globalCommands) {\n commandMap.set(cmd.name, cmd);\n }\n\n // Add local commands (will override global if same name)\n for (const cmd of localCommands) {\n commandMap.set(cmd.name, cmd);\n }\n\n state.customSlashCommands = Array.from(commandMap.values());\n } catch {\n state.customSlashCommands = [];\n }\n}\n\n// =============================================================================\n// Key Handlers\n// =============================================================================\n\nexport function setupKeyHandlers(\n state: TUIState,\n callbacks: {\n stop: () => void;\n doubleCtrlCMs: number;\n },\n): void {\n // Handle Ctrl+C via process signal (backup for when editor doesn't capture it)\n process.on('SIGINT', () => {\n const now = Date.now();\n if (now - state.lastCtrlCTime < callbacks.doubleCtrlCMs) {\n callbacks.stop();\n process.exit(0);\n }\n state.lastCtrlCTime = now;\n if (state.pendingApprovalDismiss) {\n state.pendingApprovalDismiss();\n }\n state.activeInlinePlanApproval = undefined;\n state.activeInlineQuestion = undefined;\n state.pendingInlineQuestions.length = 0;\n state.userInitiatedAbort = true;\n state.harness.abort();\n });\n\n // Use onDebug callback for Shift+Ctrl+D\n state.ui.onDebug = () => {\n // Toggle debug mode or show debug info\n // Currently unused - could add debug panel in future\n };\n}\n\n// =============================================================================\n// Harness Subscription\n// =============================================================================\n\nexport function subscribeToHarness(state: TUIState, handleEvent: (event: any) => Promise<void>): void {\n const listener: HarnessEventListener = async event => {\n await handleEvent(event);\n };\n state.unsubscribe = state.harness.subscribe(listener);\n}\n\n// =============================================================================\n// Terminal Title\n// =============================================================================\n\nexport function updateTerminalTitle(state: TUIState): void {\n const appName = state.options.appName || 'Ulicode';\n const cwd = process.cwd().split('/').pop() || '';\n state.ui.terminal.setTitle(`${appName} - ${cwd}`);\n}\n\n// =============================================================================\n// Thread Selection\n// =============================================================================\n\nexport async function promptForThreadSelection(state: TUIState): Promise<void> {\n const allThreads = await state.harness.listThreads();\n\n // Filter to threads matching the current working directory.\n const currentPath = state.projectInfo.rootPath;\n let dirCreatedAt: Date | undefined;\n try {\n const stat = fs.statSync(currentPath);\n dirCreatedAt = stat.birthtime;\n } catch {\n // fall through – treat all untagged threads as candidates\n }\n const threads = allThreads.filter(t => {\n const threadPath = t.metadata?.projectPath as string | undefined;\n if (threadPath) return threadPath === currentPath;\n if (dirCreatedAt) return t.createdAt >= dirCreatedAt;\n return true;\n });\n\n if (threads.length === 0) {\n // No existing threads for this path - defer creation until first message\n state.pendingNewThread = true;\n return;\n }\n\n // Sort by most recent\n const sortedThreads = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n // If there's only one thread, auto-resume it directly\n if (sortedThreads.length === 1) {\n const thread = sortedThreads[0]!;\n try {\n await state.harness.switchThread({ threadId: thread.id });\n if (!thread.metadata?.projectPath) {\n await state.harness.setThreadSetting({ key: 'projectPath', value: currentPath });\n }\n return;\n } catch (error) {\n if (error instanceof ThreadLockError) {\n // Thread is locked by another process — silently start a new thread.\n // The lock prompt only appears when the user intentionally picks a\n // locked thread from the /threads selector.\n state.pendingNewThread = true;\n return;\n }\n throw error;\n }\n }\n\n // Multiple threads — try each in order until one is unlocked\n for (const thread of sortedThreads) {\n try {\n await state.harness.switchThread({ threadId: thread.id });\n if (!thread.metadata?.projectPath) {\n await state.harness.setThreadSetting({ key: 'projectPath', value: currentPath });\n }\n return;\n } catch (error) {\n if (error instanceof ThreadLockError) {\n continue; // Try the next one\n }\n throw error;\n }\n }\n\n // All directory threads are locked — silently start a new thread\n state.pendingNewThread = true;\n}\n\n// =============================================================================\n// Existing Tasks\n// =============================================================================\n\nexport async function renderExistingTasks(state: TUIState): Promise<void> {\n try {\n const harnessState = state.harness.getState() as { tasks?: TaskItem[] };\n const tasks = harnessState.tasks || [];\n\n if (tasks.length > 0 && state.taskProgress) {\n state.taskProgress.updateTasks(tasks);\n state.ui.requestRender();\n }\n } catch {\n // Silently ignore task rendering errors\n }\n}\n","/**\n * Streaming shell output component for the shell passthrough (! command).\n * Shows a bordered box with live stdout/stderr and a status footer.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport stripAnsi from 'strip-ansi';\nimport { theme } from '../theme.js';\n\nconst MAX_LINES = 200;\n\n/** Truncate a string with ANSI codes to a visible width.\n * Handles both SGR sequences (\\x1b[...m) and OSC 8 hyperlinks (\\x1b]8;...;\\x07).\n */\nfunction truncateAnsi(str: string, maxWidth: number): string {\n const plain = stripAnsi(str);\n if (plain.length <= maxWidth) return str;\n\n const ansiRegex = /\\x1b\\[[0-9;]*m|\\x1b\\]8;[^\\x07]*\\x07/g;\n let visibleLength = 0;\n let result = '';\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = ansiRegex.exec(str)) !== null) {\n // Add text before this ANSI code\n const textBefore = str.slice(lastIndex, match.index);\n const remaining = maxWidth - visibleLength;\n if (textBefore.length <= remaining) {\n result += textBefore;\n visibleLength += textBefore.length;\n } else {\n result += textBefore.slice(0, remaining - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close any open hyperlink + reset styles\n return result;\n }\n // Add the ANSI code (doesn't count toward visible length)\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text after last ANSI code\n const remainingText = str.slice(lastIndex);\n const spaceLeft = maxWidth - visibleLength;\n if (remainingText.length <= spaceLeft) {\n result += remainingText;\n } else {\n result += remainingText.slice(0, spaceLeft - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close hyperlink + reset\n }\n\n return result;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const seconds = ms / 1000;\n return seconds < 60 ? `${seconds.toFixed(1)}s` : `${Math.floor(seconds / 60)}m${Math.floor(seconds % 60)}s`;\n}\n\nexport class ShellStreamComponent extends Container {\n private command: string;\n private lines: string[] = [];\n private trailingPartial = '';\n private exitCode?: number;\n private startTime = Date.now();\n\n constructor(command: string) {\n super();\n this.command = command;\n this.rebuild();\n }\n\n appendOutput(text: string): void {\n const combined = this.trailingPartial + text;\n const parts = combined.split('\\n');\n // Last element is either '' (if text ended with \\n) or an incomplete line\n this.trailingPartial = parts.pop()!;\n this.lines.push(...parts);\n if (this.lines.length > MAX_LINES) {\n this.lines = this.lines.slice(-MAX_LINES);\n }\n this.rebuild();\n }\n\n finish(exitCode: number): void {\n // Flush any trailing partial line\n if (this.trailingPartial) {\n this.lines.push(this.trailingPartial);\n this.trailingPartial = '';\n if (this.lines.length > MAX_LINES) {\n this.lines = this.lines.slice(-MAX_LINES);\n }\n }\n this.exitCode = exitCode;\n this.rebuild();\n }\n\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n const done = this.exitCode !== undefined;\n const statusIcon = done\n ? this.exitCode === 0\n ? theme.fg('success', ' ✓')\n : theme.fg('error', ' ✗')\n : theme.fg('muted', ' ⋯');\n\n const durationStr = done ? theme.fg('muted', ` ${formatDuration(Date.now() - this.startTime)}`) : '';\n const footerText = `${theme.bold(theme.fg('toolTitle', '$'))} ${theme.fg('accent', this.command)}${durationStr}${statusIcon}`;\n\n // Top border\n this.addChild(new Text(border('┌──'), 0, 0));\n\n // Output lines with left border\n const displayLines = [...this.lines];\n // Include trailing partial if still streaming\n if (this.trailingPartial && !done) {\n displayLines.push(this.trailingPartial);\n }\n // Remove leading empty lines\n while (displayLines.length > 0 && displayLines[0] === '') displayLines.shift();\n\n if (displayLines.length > 0) {\n const borderedLines = displayLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.addChild(new Text(displayOutput, 0, 0));\n }\n }\n\n // Bottom border with command info\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n\n // Show exit code if non-zero\n if (done && this.exitCode !== 0) {\n this.addChild(new Text(theme.fg('error', ` Exit code: ${this.exitCode}`), 0, 0));\n }\n\n this.invalidate();\n }\n}\n","/**\n * Shell passthrough: execute a shell command and display the output in the TUI.\n * Streams stdout/stderr in real-time using a bordered box that rebuilds on each chunk.\n */\nimport { requestRenderSoon } from './chat-layout.js';\nimport { ShellStreamComponent } from './components/shell-output.js';\nimport { showError, showInfo } from './display.js';\nimport type { TUIState } from './state.js';\n\nexport async function handleShellPassthrough(state: TUIState, command: string): Promise<void> {\n if (!command) {\n showInfo(state, 'Usage: !<command> (e.g., !ls -la)');\n return;\n }\n\n const component = new ShellStreamComponent(command);\n state.chatContainer.addChild(component);\n state.ui.requestRender();\n\n try {\n const { execa } = await import('execa');\n\n const subprocess = execa(command, {\n shell: true,\n cwd: process.cwd(),\n reject: false,\n timeout: 30_000,\n env: {\n ...process.env,\n FORCE_COLOR: '1',\n },\n });\n\n // Stream stdout/stderr as it arrives\n if (subprocess.stdout) {\n subprocess.stdout.setEncoding('utf8');\n subprocess.stdout.on('data', (chunk: string) => {\n component.appendOutput(chunk);\n requestRenderSoon(state.ui);\n });\n }\n if (subprocess.stderr) {\n subprocess.stderr.setEncoding('utf8');\n subprocess.stderr.on('data', (chunk: string) => {\n component.appendOutput(chunk);\n requestRenderSoon(state.ui);\n });\n }\n\n // Wait for the process to complete\n const result = await subprocess;\n\n component.finish(result.exitCode ?? 0);\n state.ui.requestRender();\n } catch (error) {\n component.finish(1);\n state.ui.requestRender();\n showError(state, error instanceof Error ? error.message : 'Shell command failed');\n }\n}\n","/**\n * Platform-specific clipboard image extraction.\n *\n * Checks the system clipboard for image data and returns it as base64.\n * Uses synchronous execution (execSync) since this only runs on paste events.\n */\n\nimport { execSync } from 'node:child_process';\nimport { readFileSync, unlinkSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface ClipboardImage {\n data: string; // base64-encoded image data or a remote image URL\n mimeType: string;\n}\n\n/**\n * Read plain text from the system clipboard.\n * Returns null if clipboard is empty or reading fails.\n */\nexport function getClipboardText(): string | null {\n try {\n if (process.platform === 'darwin') {\n const text = execSync('pbpaste', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return text.length > 0 ? text : null;\n }\n if (process.platform === 'linux') {\n // Try xclip first, then wl-paste\n try {\n const text = execSync('xclip -selection clipboard -o', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return text.length > 0 ? text : null;\n } catch {\n const text = execSync('wl-paste', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return text.length > 0 ? text : null;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check the system clipboard for image data and return it as base64.\n * Returns null if no image data is found or extraction fails.\n */\nexport function getClipboardImage(): ClipboardImage | null {\n try {\n if (process.platform === 'darwin') {\n return getMacClipboardImage();\n }\n if (process.platform === 'linux') {\n return getLinuxClipboardImage();\n }\n return null;\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// macOS\n// =============================================================================\n\nfunction getMacClipboardImage(): ClipboardImage | null {\n return (\n tryReadMacClipboardImage({\n coercion: '«class PNGf»',\n extension: 'png',\n mimeType: 'image/png',\n }) ??\n tryReadMacClipboardImage({\n coercion: 'TIFF picture',\n extension: 'tiff',\n mimeType: 'image/tiff',\n }) ??\n tryReadMacClipboardImage({\n coercion: '«class TIFF»',\n extension: 'tiff',\n mimeType: 'image/tiff',\n })\n );\n}\n\nfunction tryReadMacClipboardImage({\n coercion,\n extension,\n mimeType,\n}: {\n coercion: string;\n extension: string;\n mimeType: string;\n}): ClipboardImage | null {\n const tmpFile = join(tmpdir(), `mastra-clipboard-${Date.now()}.${extension}`);\n\n try {\n const script = `\n\t\t\tset theImage to the clipboard as ${coercion}\n\t\t\tset theFile to open for access POSIX file \"${tmpFile}\" with write permission\n\t\t\twrite theImage to theFile\n\t\t\tclose access theFile\n\t\t`;\n execSync(`osascript -e '${script.replace(/'/g, \"'\\\\''\")}'`, {\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const buffer = readFileSync(tmpFile);\n if (!Buffer.isBuffer(buffer) || buffer.length === 0) {\n return null;\n }\n\n return {\n data: buffer.toString('base64'),\n mimeType,\n };\n } catch {\n return null;\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\n// =============================================================================\n// Linux\n// =============================================================================\n\nfunction getLinuxClipboardImage(): ClipboardImage | null {\n // Try xclip first, then wl-paste (Wayland)\n return getLinuxClipboardImageXclip() ?? getLinuxClipboardImageWlPaste();\n}\n\nfunction getLinuxClipboardImageXclip(): ClipboardImage | null {\n try {\n // Check available targets\n const targets = execSync('xclip -selection clipboard -target TARGETS -o', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!targets.includes('image/png')) {\n return null;\n }\n\n // Extract PNG data\n const buffer = execSync('xclip -selection clipboard -target image/png -o', {\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 50 * 1024 * 1024, // 50MB max\n });\n\n if (!Buffer.isBuffer(buffer) || buffer.length === 0) {\n return null;\n }\n\n return {\n data: buffer.toString('base64'),\n mimeType: 'image/png',\n };\n } catch {\n return null;\n }\n}\n\nfunction getLinuxClipboardImageWlPaste(): ClipboardImage | null {\n try {\n // Check if wl-paste is available and clipboard has image\n const types = execSync('wl-paste --list-types', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!types.includes('image/png')) {\n return null;\n }\n\n // Extract PNG data\n const buffer = execSync('wl-paste --type image/png', {\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 50 * 1024 * 1024,\n });\n\n if (!Buffer.isBuffer(buffer) || buffer.length === 0) {\n return null;\n }\n\n return {\n data: buffer.toString('base64'),\n mimeType: 'image/png',\n };\n } catch {\n return null;\n }\n}\n","/**\n * Custom editor that handles app-level keybindings for Mastra Code.\n */\n\nimport { readFileSync, statSync } from 'node:fs';\nimport { extname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Editor, matchesKey } from '@mariozechner/pi-tui';\nimport type { EditorTheme, TUI } from '@mariozechner/pi-tui';\nimport { getClipboardImage, getClipboardText } from '../../clipboard/index.js';\nimport type { ClipboardImage } from '../../clipboard/index.js';\n\nconst PASTE_START = '\\x1b[200~';\nconst PASTE_END = '\\x1b[201~';\nconst IMAGE_MIME_TYPES_BY_EXTENSION: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tif': 'image/tiff',\n '.tiff': 'image/tiff',\n '.heic': 'image/heic',\n '.heif': 'image/heif',\n};\n\nexport type AppAction =\n | 'clear'\n | 'exit'\n | 'suspend'\n | 'undo'\n | 'toggleThinking'\n | 'expandTools'\n | 'followUp'\n | 'cycleMode'\n | 'toggleYolo';\n\nexport class CustomEditor extends Editor {\n private actionHandlers: Map<AppAction, () => unknown> = new Map();\n\n public onCtrlD?: () => void;\n public escapeEnabled = true;\n public onImagePaste?: (image: ClipboardImage) => void;\n public onOpenFileSelector?: () => void;\n\n private pendingBracketedPaste: string | null = null;\n\n constructor(tui: TUI, theme: EditorTheme) {\n super(tui, theme);\n (this as any).getBestAutocompleteMatchIndex = (items: Array<{ value: string }>, prefix: string): number => {\n if (!prefix) {\n return -1;\n }\n\n const normalizeSlashCommandValue = (value: string) => value.replace(/^\\/+/, '');\n const shouldNormalizeSlashCommand = prefix.startsWith('/');\n const normalizedPrefix = shouldNormalizeSlashCommand ? normalizeSlashCommandValue(prefix) : prefix;\n\n let firstPrefixIndex = -1;\n for (let i = 0; i < items.length; i++) {\n const value = items[i]?.value ?? '';\n const comparableValue = shouldNormalizeSlashCommand ? normalizeSlashCommandValue(value) : value;\n\n if (comparableValue === normalizedPrefix) {\n return i;\n }\n\n if (firstPrefixIndex === -1 && comparableValue.startsWith(normalizedPrefix)) {\n firstPrefixIndex = i;\n }\n }\n\n return firstPrefixIndex;\n };\n }\n\n onAction(action: AppAction, handler: () => unknown): void {\n this.actionHandlers.set(action, handler);\n }\n\n private maybeHandleBracketedPaste(data: string): boolean {\n const pasteStartIndex = this.pendingBracketedPaste ? -1 : data.indexOf(PASTE_START);\n if (!this.pendingBracketedPaste && pasteStartIndex === -1) {\n return false;\n }\n\n const beforePaste = this.pendingBracketedPaste ? '' : data.slice(0, pasteStartIndex);\n const pasteChunk = this.pendingBracketedPaste\n ? `${this.pendingBracketedPaste}${data}`\n : data.slice(pasteStartIndex);\n\n if (beforePaste) {\n super.handleInput(beforePaste);\n }\n\n const pasteEndIndex = pasteChunk.indexOf(PASTE_END);\n if (pasteEndIndex === -1) {\n this.pendingBracketedPaste = pasteChunk;\n return true;\n }\n\n this.pendingBracketedPaste = null;\n\n const pasteContent = pasteChunk.slice(PASTE_START.length, pasteEndIndex);\n const afterPaste = pasteChunk.slice(pasteEndIndex + PASTE_END.length);\n\n if (this.shouldPasteClipboardImage(pasteContent)) {\n const clipboardImage = getClipboardImage();\n if (clipboardImage) {\n this.onImagePaste?.(clipboardImage);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n return true;\n }\n }\n\n const clipboardImageForRemoteUrl = this.getClipboardImageForPastedRemoteImageUrl(pasteContent);\n if (clipboardImageForRemoteUrl) {\n this.onImagePaste?.(clipboardImageForRemoteUrl);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n return true;\n }\n\n const pastedImageSource = this.readPastedImageSource(pasteContent);\n if (pastedImageSource) {\n this.onImagePaste?.(pastedImageSource);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n return true;\n }\n\n super.handleInput(`${PASTE_START}${pasteContent}${PASTE_END}`);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n return true;\n }\n\n private shouldPasteClipboardImage(pasteContent: string): boolean {\n return Boolean(this.onImagePaste) && pasteContent.trim().length === 0;\n }\n\n private getClipboardImageForPastedRemoteImageUrl(pasteContent: string): ClipboardImage | null {\n if (!this.onImagePaste) {\n return null;\n }\n\n if (!this.normalizePastedImageUrl(this.normalizePastedPathLike(pasteContent) ?? '')) {\n return null;\n }\n\n return getClipboardImage();\n }\n\n private readPastedImageSource(pasteContent: string): ClipboardImage | null {\n if (!this.onImagePaste) {\n return null;\n }\n\n const normalizedPaste = this.normalizePastedPathLike(pasteContent);\n if (!normalizedPaste) {\n return null;\n }\n\n const imageUrl = this.normalizePastedImageUrl(normalizedPaste);\n if (imageUrl) {\n const mimeType = this.getImageMimeType(imageUrl);\n return mimeType\n ? {\n data: imageUrl,\n mimeType,\n }\n : null;\n }\n\n const filePath = this.normalizePastedFilePath(normalizedPaste);\n if (!filePath) {\n return null;\n }\n\n const mimeType = this.getImageMimeType(filePath);\n if (!mimeType) {\n return null;\n }\n\n try {\n if (!statSync(filePath).isFile()) {\n return null;\n }\n\n return {\n data: readFileSync(filePath).toString('base64'),\n mimeType,\n };\n } catch {\n return null;\n }\n }\n\n private normalizePastedPathLike(pasteContent: string): string | null {\n const trimmed = pasteContent.trim();\n if (!trimmed || trimmed.includes('\\n')) {\n return null;\n }\n\n const unquoted =\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ? trimmed.slice(1, -1)\n : trimmed;\n\n return unquoted.replace(/\\\\([ !$&'()\\[\\]{}])/g, '$1');\n }\n\n private normalizePastedImageUrl(pasteContent: string): string | null {\n if (!/^https?:\\/\\//i.test(pasteContent)) {\n return null;\n }\n\n try {\n const url = new URL(pasteContent);\n return this.getImageMimeType(url.toString()) ? url.toString() : null;\n } catch {\n return null;\n }\n }\n\n private normalizePastedFilePath(pasteContent: string): string | null {\n if (/^https?:\\/\\//i.test(pasteContent)) {\n return null;\n }\n\n if (/^file:\\/\\//i.test(pasteContent)) {\n try {\n const url = new URL(pasteContent);\n const decodedPath = decodeURIComponent(url.pathname);\n if (/^\\/[A-Za-z]:\\//.test(decodedPath)) {\n return fileURLToPath(url);\n }\n return decodedPath;\n } catch {\n return null;\n }\n }\n\n return pasteContent;\n }\n\n private getImageMimeType(pathOrUrl: string): string | null {\n const extensionSource = /^https?:\\/\\//i.test(pathOrUrl) ? new URL(pathOrUrl).pathname : pathOrUrl;\n return IMAGE_MIME_TYPES_BY_EXTENSION[extname(extensionSource).toLowerCase()] ?? null;\n }\n\n private handleExplicitPaste(): boolean {\n if (this.onImagePaste) {\n const clipboardImage = getClipboardImage();\n if (clipboardImage) {\n this.onImagePaste(clipboardImage);\n return true;\n }\n }\n\n const clipboardText = getClipboardText();\n if (clipboardText) {\n const syntheticPaste = `${PASTE_START}${clipboardText}${PASTE_END}`;\n super.handleInput(syntheticPaste);\n return true;\n }\n\n return true;\n }\n\n handleInput(data: string): void {\n if (this.maybeHandleBracketedPaste(data)) {\n return;\n }\n\n if (data === '#') {\n this.onOpenFileSelector?.();\n return;\n }\n\n if (matchesKey(data, 'ctrl+v') || matchesKey(data, 'alt+v')) {\n this.handleExplicitPaste();\n return;\n }\n\n if (matchesKey(data, 'ctrl+c')) {\n const handler = this.actionHandlers.get('clear');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'escape') && this.escapeEnabled) {\n const handler = this.actionHandlers.get('clear');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'ctrl+d')) {\n if (this.getText().length === 0) {\n const handler = this.onCtrlD ?? this.actionHandlers.get('exit');\n if (handler) handler();\n }\n return;\n }\n\n if (matchesKey(data, 'ctrl+z')) {\n const handler = this.actionHandlers.get('suspend');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'alt+z')) {\n const handler = this.actionHandlers.get('undo');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'ctrl+t')) {\n const handler = this.actionHandlers.get('toggleThinking');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'ctrl+e')) {\n const handler = this.actionHandlers.get('expandTools');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'enter')) {\n const handler = this.actionHandlers.get('followUp');\n if (handler) {\n if (this.isShowingAutocomplete()) {\n super.handleInput('\\t');\n if (this.getText().trimStart().startsWith('/') && handler() !== false) {\n return;\n }\n return;\n }\n if (handler() !== false) {\n return;\n }\n }\n }\n\n if (matchesKey(data, 'shift+tab')) {\n const handler = this.actionHandlers.get('cycleMode');\n if (handler) {\n handler();\n return;\n }\n }\n\n if (matchesKey(data, 'ctrl+y')) {\n const handler = this.actionHandlers.get('toggleYolo');\n if (handler) {\n handler();\n return;\n }\n }\n\n super.handleInput(data);\n }\n}\n","/**\n * Shared TUI state — the single source of truth for all mutable state\n * in the Mastra TUI. Extracted so that slash commands, event handlers,\n * and other modules can operate on the state without coupling to the\n * MastraTUI class.\n */\nimport { Container, TUI, ProcessTerminal } from '@mariozechner/pi-tui';\nimport type { CombinedAutocompleteProvider, Text } from '@mariozechner/pi-tui';\nimport type { Harness, HarnessMessage } from '@mastra/core/harness';\nimport type { Workspace } from '@mastra/core/workspace';\nimport type { AuthStorage } from '../auth/storage.js';\nimport type { HookManager } from '../hooks/index.js';\nimport type { McpManager } from '../mcp/manager.js';\nimport type { OnboardingInlineComponent } from '../onboarding/onboarding-inline.js';\nimport { detectProject } from '../utils/project.js';\nimport type { ProjectInfo } from '../utils/project.js';\nimport type { SlashCommandMetadata } from '../utils/slash-command-loader.js';\nimport type { AskQuestionInlineComponent } from './components/ask-question-inline.js';\nimport type { AssistantMessageComponent } from './components/assistant-message.js';\nimport { CustomEditor } from './components/custom-editor.js';\nimport type { PendingFileAttachment } from './composer-attachments.js';\n\nimport type { GradientAnimator } from './components/obi-loader.js';\nimport type { OMMarkerComponent } from './components/om-marker.js';\nimport type { OMProgressComponent } from './components/om-progress.js';\nimport type { PlanApprovalInlineComponent } from './components/plan-approval-inline.js';\nimport type { SlashCommandComponent } from './components/slash-command.js';\nimport type { SubagentExecutionComponent } from './components/subagent-execution.js';\nimport type { TaskProgressComponent } from './components/task-progress.js';\nimport type { IToolExecutionComponent } from './components/tool-execution-interface.js';\nimport type { UserMessageComponent } from './components/user-message.js';\nimport { getEditorTheme } from './theme.js';\n// =============================================================================\n// MastraTUIOptions\n// =============================================================================\n\nexport interface MastraTUIOptions {\n /** The harness instance to control */\n harness: Harness<any>;\n\n /** Hook manager for session lifecycle hooks */\n hookManager?: HookManager;\n\n /** Auth storage for OAuth login/logout */\n authStorage?: AuthStorage;\n\n /** MCP manager for server status and reload */\n mcpManager?: McpManager;\n\n /**\n * @deprecated Workspace is now obtained from the Harness.\n * Configure workspace via HarnessConfig.workspace instead.\n * Kept as fallback for backward compatibility.\n */\n workspace?: Workspace;\n\n /** Initial message to send on startup */\n initialMessage?: string;\n\n /** Whether to show verbose startup info */\n verbose?: boolean;\n\n /** App name for header */\n appName?: string;\n\n /** App version for header */\n version?: string;\n\n /** Use inline questions instead of dialog overlays */\n inlineQuestions?: boolean;\n}\n\n// =============================================================================\n// TUIState\n// =============================================================================\n\nexport interface TUIState {\n // ── Core dependencies (set once) ──────────────────────────────────────\n harness: Harness<any>;\n options: MastraTUIOptions;\n hookManager?: HookManager;\n authStorage?: AuthStorage;\n mcpManager?: McpManager;\n workspace?: Workspace;\n\n // ── TUI framework (set once) ──────────────────────────────────────────\n ui: TUI;\n chatContainer: Container;\n editorContainer: Container;\n editor: CustomEditor;\n footer: Container;\n terminal: ProcessTerminal;\n\n // ── Agent / streaming ─────────────────────────────────────────────────\n isInitialized: boolean;\n gradientAnimator?: GradientAnimator;\n streamingComponent?: AssistantMessageComponent;\n streamingMessage?: HarnessMessage;\n pendingTools: Map<string, IToolExecutionComponent>;\n /** Position hint for task_write inline rendering when streaming */\n taskWriteInsertIndex: number;\n /** Track all tool IDs seen during current stream (prevents duplicates) */\n seenToolCallIds: Set<string>;\n /** Track subagent tool call IDs to skip in trailing content logic */\n subagentToolCallIds: Set<string>;\n /** Track all tools for expand/collapse */\n allToolComponents: IToolExecutionComponent[];\n /** Track slash command boxes for expand/collapse */\n allSlashCommandComponents: SlashCommandComponent[];\n /** Track active subagent tasks */\n pendingSubagents: Map<string, SubagentExecutionComponent>;\n toolOutputExpanded: boolean;\n hideThinkingBlock: boolean;\n quietMode: boolean;\n\n // ── Thread / conversation ─────────────────────────────────────────────\n /** True when we want a new thread but haven't created it yet */\n pendingNewThread: boolean;\n\n // ── Inline interaction ────────────────────────────────────────────────\n /** Track the most recent ask_user tool for inline question placement */\n lastAskUserComponent?: IToolExecutionComponent;\n /** Saved editor text for Alt+Z undo */\n lastClearedText: string;\n lastClearedFileAttachments: PendingFileAttachment[];\n activeInlineQuestion?: AskQuestionInlineComponent;\n /** Queue of pending inline questions waiting to be shown (when one is already active) */\n pendingInlineQuestions: Array<() => void>;\n activeInlinePlanApproval?: PlanApprovalInlineComponent;\n activeOnboarding?: OnboardingInlineComponent;\n lastSubmitPlanComponent?: IToolExecutionComponent;\n /** User-message follow-ups queued while the agent is running */\n pendingFollowUpMessages: Array<{\n content: string;\n displayContent: string;\n images?: Array<{ data: string; mimeType: string }>;\n }>;\n /** FIFO ordering across queued follow-up messages and slash commands */\n pendingQueuedActions: Array<'message' | 'slash'>;\n /** Follow-up messages rendered while streaming so tool output stays above them */\n followUpComponents: UserMessageComponent[];\n /** Slash commands queued while the agent is running */\n pendingSlashCommands: string[];\n /** Active approval dialog dismiss callback — called on Ctrl+C to unblock the dialog */\n pendingApprovalDismiss: (() => void) | null;\n\n // ── Status line ───────────────────────────────────────────────────────\n projectInfo: ProjectInfo;\n statusLine?: Text;\n memoryStatusLine?: Text;\n modelAuthStatus: { hasAuth: boolean; apiKeyEnvVar?: string };\n\n // ── Observational Memory ──────────────────────────────────────────────\n omProgressComponent?: OMProgressComponent;\n activeOMMarker?: OMMarkerComponent;\n activeBufferingMarker?: OMMarkerComponent;\n activeActivationMarker?: OMMarkerComponent;\n\n // ── Tasks ─────────────────────────────────────────────────────────────\n taskProgress?: TaskProgressComponent;\n\n // ── Input ─────────────────────────────────────────────────────────────\n autocompleteProvider?: CombinedAutocompleteProvider;\n customSlashCommands: SlashCommandMetadata[];\n /** Pending images from clipboard paste */\n pendingImages: Array<{ data: string; mimeType: string }>;\n pendingFileAttachments: PendingFileAttachment[];\n composerAttachmentLine?: Text;\n\n // ── Abort tracking ────────────────────────────────────────────────────\n lastCtrlCTime: number;\n /** Track user-initiated aborts (Ctrl+C/Esc) vs system aborts */\n userInitiatedAbort: boolean;\n\n // ── Cleanup ───────────────────────────────────────────────────────────\n unsubscribe?: () => void;\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create the initial TUIState from options.\n * Instantiates TUI framework objects (terminal, containers, editor)\n * and sets all mutable fields to their defaults.\n */\nexport function createTUIState(options: MastraTUIOptions): TUIState {\n const terminal = new ProcessTerminal();\n const ui = new TUI(terminal);\n const chatContainer = new Container();\n const editorContainer = new Container();\n const footer = new Container();\n const editor = new CustomEditor(ui, getEditorTheme());\n\n return {\n // Core dependencies\n harness: options.harness,\n options,\n hookManager: options.hookManager,\n authStorage: options.authStorage,\n mcpManager: options.mcpManager,\n workspace: options.workspace,\n\n // TUI framework\n ui,\n chatContainer,\n editorContainer,\n editor,\n footer,\n terminal,\n\n // Agent / streaming\n isInitialized: false,\n pendingTools: new Map(),\n taskWriteInsertIndex: -1,\n seenToolCallIds: new Set(),\n subagentToolCallIds: new Set(),\n allToolComponents: [],\n allSlashCommandComponents: [],\n pendingSubagents: new Map(),\n toolOutputExpanded: false,\n hideThinkingBlock: true,\n quietMode: false,\n\n // Thread / conversation\n pendingNewThread: false,\n\n // Inline interaction\n lastClearedText: '',\n lastClearedFileAttachments: [],\n pendingInlineQuestions: [],\n pendingFollowUpMessages: [],\n pendingQueuedActions: [],\n followUpComponents: [],\n pendingSlashCommands: [],\n pendingApprovalDismiss: null,\n\n // Status line\n projectInfo: detectProject(process.cwd()),\n modelAuthStatus: { hasAuth: true },\n\n // Input\n customSlashCommands: [],\n pendingImages: [],\n pendingFileAttachments: [],\n\n // Abort tracking\n lastCtrlCTime: 0,\n userInitiatedAbort: false,\n };\n}\n","/**\n * Main TUI class for Mastra Code.\n * Wires the Harness to pi-tui components for a full interactive experience.\n */\nimport { Spacer } from '@mariozechner/pi-tui';\nimport type { Component } from '@mariozechner/pi-tui';\nimport type { HarnessEvent } from '@mastra/core/harness';\nimport type { Workspace } from '@mastra/core/workspace';\nimport { resolve } from 'node:path';\nimport { getSubagentModeMap, loadAgentDefinitionsCached } from '../agents/agent-definitions.js';\nimport { ANTHROPIC_OAUTH_PROVIDER_ID } from '../auth/claude-max-warning.js';\nimport { getOAuthProviders } from '../auth/storage.js';\nimport { lspManager } from '../lsp/index.js';\nimport {\n OnboardingInlineComponent,\n getAvailableModePacks,\n getAvailableOmPacks,\n getModePackOptions,\n ONBOARDING_VERSION,\n loadSettingsCached,\n saveSettings,\n} from '../onboarding/index.js';\nimport type { OnboardingResult, ProviderAccess, ProviderAccessLevel } from '../onboarding/index.js';\nimport { resolveThreadActiveModelPackId, THREAD_ACTIVE_MODEL_PACK_ID_KEY } from '../onboarding/settings.js';\nimport {\n detectPackageManager,\n fetchLatestVersion,\n getInstallCommand,\n isNewerVersion,\n runUpdate,\n} from '../utils/update-check.js';\nimport { showClaudeMaxOAuthWarning } from './claude-max-warning.js';\nimport { runApiKeyLoginFlow } from './api-key-auth.js';\nimport { insertChildBeforeAnchor } from './chat-layout.js';\nimport { dispatchSlashCommand } from './command-dispatch.js';\n\nimport type { SlashCommandContext } from './commands/types.js';\nimport { AskQuestionInlineComponent } from './components/ask-question-inline.js';\nimport { LoginDialogComponent } from './components/login-dialog.js';\nimport { ModelSelectorComponent } from './components/model-selector.js';\nimport type { ModelItem } from './components/model-selector.js';\nimport { ProjectFileSelectorComponent } from './components/project-file-selector.js';\nimport {\n buildComposerDisplayContent,\n buildPromptContentWithAttachments,\n listProjectFiles,\n} from './composer-attachments.js';\nimport { showError, showInfo, showFormattedError, notify } from './display.js';\nimport { dispatchEvent } from './event-dispatch.js';\nimport type { EventHandlerContext } from './handlers/types.js';\n\nimport {\n addUserMessage,\n renderCompletedTasksInline,\n renderClearedTasksInline,\n renderExistingMessages,\n} from './render-messages.js';\nimport {\n setupKeyboardShortcuts,\n buildLayout,\n setupAutocomplete,\n loadCustomSlashCommands,\n setupKeyHandlers,\n subscribeToHarness,\n updateTerminalTitle,\n promptForThreadSelection,\n renderExistingTasks,\n updateComposerAttachmentLine,\n} from './setup.js';\nimport { handleShellPassthrough } from './shell.js';\nimport type { MastraTUIOptions, TUIState } from './state.js';\nimport { createTUIState } from './state.js';\nimport { updateStatusLine } from './status-line.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type { MastraTUIOptions } from './state.js';\n\n// =============================================================================\n// MastraTUI Class\n// =============================================================================\n\n/** How often to recheck for updates during a long-running session (ms). */\nconst UPDATE_RECHECK_INTERVAL_MS = 45 * 60 * 1_000; // 45 minutes\nconst IMAGE_PLACEHOLDER_PATTERN = /\\[image\\]\\s*/g;\n\nexport function consumePendingImages(\n text: string,\n pendingImages: TUIState['pendingImages'],\n): { content: string; images?: TUIState['pendingImages'] } {\n const imageMarkerCount = text.match(/\\[image\\]/g)?.length ?? 0;\n const images = imageMarkerCount > 0 ? pendingImages.slice(0, imageMarkerCount) : undefined;\n\n return {\n content: text.replace(IMAGE_PLACEHOLDER_PATTERN, '').trim(),\n images: images && images.length > 0 ? images : undefined,\n };\n}\n\nexport class MastraTUI {\n private state: TUIState;\n private updateCheckTimer: ReturnType<typeof setInterval> | null = null;\n private hasShownUpdateBanner = false;\n\n private static readonly DOUBLE_CTRL_C_MS = 500;\n\n constructor(options: MastraTUIOptions) {\n this.state = createTUIState(options);\n\n // Load user preferences\n const savedSettings = loadSettingsCached();\n this.state.quietMode = savedSettings.preferences.quietMode;\n\n // Override editor input handling to check for active inline components\n const originalHandleInput = this.state.editor.handleInput.bind(this.state.editor);\n this.state.editor.handleInput = (data: string) => {\n // If there's an active plan approval, route input to it\n if (this.state.activeInlinePlanApproval) {\n this.state.activeInlinePlanApproval.handleInput(data);\n return;\n }\n // If there's an active inline question, route input to it\n if (this.state.activeInlineQuestion) {\n this.state.activeInlineQuestion.handleInput(data);\n return;\n }\n // If onboarding is active, route input there\n if (this.state.activeOnboarding) {\n // Ctrl+C during onboarding — cancel it\n if (data === '\\x03') {\n this.state.activeOnboarding.cancel();\n this.state.activeOnboarding = undefined;\n // Fall through to let the editor's 'clear' action fire\n } else {\n this.state.activeOnboarding.handleInput(data);\n return;\n }\n }\n // Otherwise, handle normally\n originalHandleInput(data);\n };\n\n // Wire clipboard image paste\n this.state.editor.onImagePaste = image => {\n this.state.pendingImages.push(image);\n this.state.editor.insertTextAtCursor?.('[image] ');\n this.state.ui.requestRender();\n };\n\n this.state.editor.onOpenFileSelector = () => {\n this.openProjectFileSelector();\n };\n\n setupKeyboardShortcuts(this.state, {\n stop: () => this.stop(),\n doubleCtrlCMs: MastraTUI.DOUBLE_CTRL_C_MS,\n queueFollowUpMessage: text => this.queueFollowUpMessage(text),\n });\n }\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Run the TUI. This is the main entry point.\n */\n async run(): Promise<void> {\n await this.init();\n\n // Run SessionStart hooks (fire and forget)\n const hookMgr = this.state.hookManager;\n if (hookMgr) {\n hookMgr.runSessionStart().catch(() => {});\n }\n\n // Process initial message if provided\n if (this.state.options.initialMessage) {\n this.fireMessage(this.state.options.initialMessage);\n }\n\n // Main interactive loop — never blocks on streaming,\n // so the editor stays responsive for queued follow-ups.\n while (true) {\n const userInput = await this.getUserInput();\n if (!userInput.trim() && this.state.pendingImages.length === 0 && this.state.pendingFileAttachments.length === 0) {\n continue;\n }\n\n try {\n // Handle slash commands\n if (userInput.startsWith('/')) {\n const handled = await this.handleSlashCommand(userInput);\n if (handled) continue;\n }\n\n // Handle shell passthrough (! prefix)\n if (userInput.startsWith('!')) {\n await handleShellPassthrough(this.state, userInput.slice(1).trim());\n continue;\n }\n\n // Create thread lazily on first message (may load last-used model)\n if (this.state.pendingNewThread) {\n await this.state.harness.createThread();\n this.state.pendingNewThread = false;\n }\n\n // Check if a model is selected\n if (!this.state.harness.hasModelSelected()) {\n showInfo(this.state, 'No model selected. Use /models to select a model, or /login to authenticate.');\n continue;\n }\n\n const hookInput = buildComposerDisplayContent(userInput, this.state.pendingFileAttachments);\n const allowed = await this.runUserPromptHook(hookInput || userInput);\n if (!allowed) {\n continue;\n }\n\n const { content, images } = consumePendingImages(userInput, this.state.pendingImages);\n const promptContent = buildPromptContentWithAttachments(content, this.state.pendingFileAttachments);\n const displayContent = buildComposerDisplayContent(content, this.state.pendingFileAttachments);\n this.state.pendingImages = [];\n this.state.pendingFileAttachments = [];\n updateComposerAttachmentLine(this.state);\n\n // Add user message to chat immediately\n addUserMessage(this.state, {\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n { type: 'text', text: displayContent },\n ...(images?.map(img => ({\n type: 'image' as const,\n data: img.data,\n mimeType: img.mimeType,\n })) ?? []),\n ],\n createdAt: new Date(),\n });\n this.state.ui.requestRender();\n\n // Normal send — fire and forget; events handle the rest\n this.fireMessage(promptContent, images);\n } catch (error) {\n showError(this.state, error instanceof Error ? error.message : 'Unknown error');\n }\n }\n }\n\n /**\n * Fire off a message without blocking the main loop.\n * Errors are handled via harness events.\n */\n private fireMessage(content: string, images?: Array<{ data: string; mimeType: string }>): void {\n const files = images?.map(img => ({ data: img.data, mediaType: img.mimeType }));\n this.state.harness.sendMessage({ content, files }).catch(error => {\n showError(this.state, error instanceof Error ? error.message : 'Unknown error');\n });\n }\n\n private queueFollowUpMessage(text: string): void {\n if (text.startsWith('/')) {\n this.state.pendingSlashCommands.push(text);\n this.state.pendingQueuedActions.push('slash');\n showInfo(this.state, `Slash command queued: ${text}`);\n updateStatusLine(this.state);\n this.state.ui.requestRender();\n return;\n }\n\n const { content, images } = consumePendingImages(text, this.state.pendingImages);\n const promptContent = buildPromptContentWithAttachments(content, this.state.pendingFileAttachments);\n const displayContent = buildComposerDisplayContent(content, this.state.pendingFileAttachments);\n this.state.pendingImages = [];\n this.state.pendingFileAttachments = [];\n updateComposerAttachmentLine(this.state);\n\n this.state.pendingFollowUpMessages.push({ content: promptContent, displayContent, images });\n this.state.pendingQueuedActions.push('message');\n addUserMessage(this.state, {\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n { type: 'text', text: displayContent },\n ...(images?.map(img => ({\n type: 'image' as const,\n data: img.data,\n mimeType: img.mimeType,\n })) ?? []),\n ],\n createdAt: new Date(),\n });\n updateStatusLine(this.state);\n this.state.ui.requestRender();\n }\n\n private openProjectFileSelector(): void {\n try {\n const files = listProjectFiles(this.state.projectInfo.rootPath);\n if (files.length === 0) {\n showInfo(this.state, 'No project files found to attach.');\n return;\n }\n\n const selector = new ProjectFileSelectorComponent({\n tui: this.state.ui,\n files,\n onSelect: relativePath => {\n this.state.ui.hideOverlay();\n\n if (!this.state.pendingFileAttachments.some(file => file.relativePath === relativePath)) {\n this.state.pendingFileAttachments.push({\n absolutePath: resolve(this.state.projectInfo.rootPath, relativePath),\n relativePath,\n });\n updateComposerAttachmentLine(this.state);\n }\n\n this.state.ui.setFocus(this.state.editor);\n this.state.ui.requestRender();\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n this.state.ui.setFocus(this.state.editor);\n this.state.ui.requestRender();\n },\n });\n\n this.state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n selector.focused = true;\n } catch (error) {\n showError(this.state, error instanceof Error ? error.message : 'Unable to open project file selector');\n }\n }\n\n /**\n * Stop the TUI and clean up.\n */\n stop(): void {\n // Run SessionEnd hooks (best-effort, don't await)\n const hookMgr = this.state.hookManager;\n if (hookMgr) {\n hookMgr.runSessionEnd().catch(() => {});\n }\n\n if (this.updateCheckTimer) {\n clearInterval(this.updateCheckTimer);\n this.updateCheckTimer = null;\n }\n\n if (this.state.unsubscribe) {\n this.state.unsubscribe();\n }\n this.state.ui.stop();\n }\n\n // ===========================================================================\n // Initialization\n // ===========================================================================\n\n private async init(): Promise<void> {\n if (this.state.isInitialized) return;\n\n // Initialize harness (but don't select thread yet)\n await this.state.harness.init();\n\n // Check for existing threads and prompt for resume\n await promptForThreadSelection(this.state);\n\n // Load custom slash commands\n await loadCustomSlashCommands(this.state);\n\n // Setup autocomplete\n setupAutocomplete(this.state);\n\n // Build UI layout\n buildLayout(this.state, () => this.refreshModelAuthStatus());\n\n // Setup key handlers\n setupKeyHandlers(this.state, {\n stop: () => this.stop(),\n doubleCtrlCMs: MastraTUI.DOUBLE_CTRL_C_MS,\n });\n\n // Subscribe to harness events\n subscribeToHarness(this.state, event => this.handleEvent(event));\n const harnessUnsubscribe = this.state.unsubscribe;\n const lspStatusUnsubscribe = lspManager.subscribeStatusChange(() => {\n updateStatusLine(this.state);\n });\n this.state.unsubscribe = () => {\n harnessUnsubscribe?.();\n lspStatusUnsubscribe();\n };\n // Restore escape-as-cancel setting from persisted state\n const escState = this.state.harness.getState() as any;\n if (escState?.escapeAsCancel === false) {\n this.state.editor.escapeEnabled = false;\n }\n\n // Load OM progress now that we're subscribed (the event during\n // thread selection fired before we were listening).\n // This emits om_status → display_state_changed → updateStatusLine.\n await this.state.harness.loadOMProgress();\n\n // Start the UI\n this.state.ui.start();\n this.state.isInitialized = true;\n\n // Set terminal title\n updateTerminalTitle(this.state);\n // Render existing messages\n await renderExistingMessages(this.state);\n // Render existing tasks if any\n await renderExistingTasks(this.state);\n\n // One-time Claude Max OAuth warning at startup\n await this.checkClaudeMaxOAuthWarning();\n\n if (this.shouldShowOnboarding()) {\n await this.showOnboarding();\n }\n\n // Check for updates (after onboarding so it doesn't interfere)\n await this.checkForUpdate();\n\n // Periodically recheck for updates during long-running sessions (passive only)\n this.updateCheckTimer = setInterval(() => {\n void this.checkForUpdate(/* passive */ true);\n }, UPDATE_RECHECK_INTERVAL_MS);\n }\n\n private async refreshModelAuthStatus(): Promise<void> {\n this.state.modelAuthStatus = await this.state.harness.getCurrentModelAuthStatus();\n updateStatusLine(this.state);\n }\n\n // ===========================================================================\n // Event Handling\n // ===========================================================================\n\n /** Cached event context – built once, reused for every event. */\n private _ectx: EventHandlerContext | undefined;\n\n private getEventContext(): EventHandlerContext {\n if (!this._ectx) {\n this._ectx = this.buildEventContext();\n }\n return this._ectx;\n }\n\n private async handleEvent(event: HarnessEvent): Promise<void> {\n await dispatchEvent(event, this.getEventContext(), this.state);\n\n if (event.type === 'thread_created') {\n await this.syncThreadActivePackMetadata(event.thread);\n } else if (event.type === 'thread_changed') {\n await this.syncThreadActivePackMetadata();\n }\n\n if (event.type === 'agent_end') {\n const stopReason = event.reason === 'aborted' ? 'aborted' : event.reason === 'error' ? 'error' : 'complete';\n await this.runStopHook(stopReason);\n }\n }\n\n private async buildProviderAccess(): Promise<ProviderAccess> {\n const models = await this.state.harness.listAvailableModels();\n const hasEnv = (provider: string) => models.some(m => m.provider === provider && m.hasApiKey);\n const accessLevel = (storageProviderId: string): ProviderAccessLevel => {\n const cred = this.state.authStorage?.get(storageProviderId);\n if (cred?.type === 'oauth') return 'oauth';\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) return 'apikey';\n return false;\n };\n const access: ProviderAccess = {\n anthropic: accessLevel('anthropic'),\n openai: accessLevel('openai-codex'),\n cerebras: hasEnv('cerebras') ? ('apikey' as const) : false,\n google: accessLevel('google') || (hasEnv('google') ? ('apikey' as const) : false),\n deepseek: hasEnv('deepseek') ? ('apikey' as const) : false,\n };\n // Include all other providers that have API keys configured\n const seen = new Set(Object.keys(access));\n for (const m of models) {\n if (!seen.has(m.provider) && m.hasApiKey) {\n access[m.provider] = 'apikey';\n seen.add(m.provider);\n }\n }\n return access;\n }\n\n private async syncThreadActivePackMetadata(thread?: {\n id: string;\n metadata?: Record<string, unknown>;\n }): Promise<void> {\n const settings = loadSettingsCached();\n const currentThreadId = this.state.harness.getCurrentThreadId();\n if (!currentThreadId) return;\n\n const resolvedThread =\n thread?.id === currentThreadId\n ? thread\n : (await this.state.harness.listThreads()).find(t => t.id === currentThreadId);\n const access = await this.buildProviderAccess();\n const projectPath = ((this.state.harness.getState() as { projectPath?: string } | undefined)?.projectPath ?? process.cwd()) as string;\n const modeDefinitions = loadAgentDefinitionsCached(projectPath).modes;\n const packs = getAvailableModePacks(access, settings.customModelPacks, modeDefinitions).filter(p => p.id !== 'custom');\n const resolvedPackId = resolveThreadActiveModelPackId(\n settings,\n packs,\n resolvedThread?.metadata as Record<string, unknown> | undefined,\n );\n\n if (resolvedPackId && settings.models.activeModelPackId !== resolvedPackId) {\n // Re-read settings to avoid overwriting concurrent changes\n const fresh = loadSettingsCached();\n if (fresh.models.activeModelPackId !== resolvedPackId) {\n fresh.models.activeModelPackId = resolvedPackId;\n saveSettings(fresh);\n }\n }\n }\n\n private showHookWarnings(event: string, warnings: string[]): void {\n for (const warning of warnings) {\n showInfo(this.state, `[${event}] ${warning}`);\n }\n }\n\n private async runStopHook(stopReason: 'complete' | 'aborted' | 'error'): Promise<void> {\n const hookMgr = this.state.hookManager;\n if (!hookMgr) return;\n\n try {\n const result = await hookMgr.runStop(undefined, stopReason);\n this.showHookWarnings('Stop', result.warnings);\n if (!result.allowed && result.blockReason) {\n showError(this.state, `Stop hook blocked: ${result.blockReason}`);\n }\n } catch (error) {\n showError(this.state, `Stop hook failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private async runUserPromptHook(userInput: string): Promise<boolean> {\n const hookMgr = this.state.hookManager;\n if (!hookMgr) return true;\n\n try {\n const result = await hookMgr.runUserPromptSubmit(userInput);\n this.showHookWarnings('UserPromptSubmit', result.warnings);\n\n if (!result.allowed) {\n showError(this.state, result.blockReason || 'Blocked by UserPromptSubmit hook');\n return false;\n }\n\n return true;\n } catch (error) {\n showError(this.state, `UserPromptSubmit hook failed: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n // ===========================================================================\n /**\n * Insert a child into the chat container before any follow-up user messages.\n * If no follow-ups are pending, appends to end.\n */\n private addChildBeforeFollowUps(child: Component): void {\n if (this.state.followUpComponents.length > 0) {\n const firstFollowUp = this.state.followUpComponents[0];\n insertChildBeforeAnchor(this.state.chatContainer, child, firstFollowUp);\n return;\n }\n this.state.chatContainer.addChild(child);\n }\n\n // ===========================================================================\n // User Input\n // ===========================================================================\n\n private getUserInput(): Promise<string> {\n return new Promise(resolve => {\n this.state.editor.onSubmit = (text: string) => {\n // Add to history for arrow up/down navigation (skip empty)\n if (text.trim()) {\n this.state.editor.addToHistory(text);\n }\n this.state.editor.setText('');\n\n if (this.state.harness.isRunning()) {\n this.queueFollowUpMessage(text);\n return;\n }\n\n resolve(text);\n };\n });\n }\n\n /**\n * One-time startup check: if the user has Anthropic OAuth credentials and\n * hasn't yet acknowledged the Claude Max ToS warning, show it now.\n */\n private async checkClaudeMaxOAuthWarning(): Promise<void> {\n const authStorage = this.state.authStorage;\n if (!authStorage || !authStorage.isLoggedIn(ANTHROPIC_OAUTH_PROVIDER_ID)) return;\n\n const settings = loadSettingsCached();\n if (settings.onboarding.claudeMaxOAuthWarningAcknowledgedAt) return;\n\n const result = await showClaudeMaxOAuthWarning(this.state, 'startup');\n\n if (result === 'continue') {\n settings.onboarding.claudeMaxOAuthWarningAcknowledgedAt = new Date().toISOString();\n saveSettings(settings);\n } else if (result === 'remove') {\n authStorage.logout(ANTHROPIC_OAUTH_PROVIDER_ID);\n settings.onboarding.claudeMaxOAuthWarningAcknowledgedAt = new Date().toISOString();\n saveSettings(settings);\n await this.refreshModelAuthStatus();\n }\n // 'cancel' (Esc) — leave settings unchanged, will show again next startup\n }\n\n /**\n * Get the workspace, preferring harness-owned workspace over the direct option.\n */\n private getResolvedWorkspace(): Workspace | undefined {\n return this.state.harness.getWorkspace() ?? this.state.workspace;\n }\n\n // ===========================================================================\n // Observational Memory Settings\n // ===========================================================================\n\n // ===========================================================================\n // Login Selector\n // ===========================================================================\n\n // ===========================================================================\n // Slash Commands\n // ===========================================================================\n\n private buildCommandContext(): SlashCommandContext {\n return {\n state: this.state,\n harness: this.state.harness,\n hookManager: this.state.hookManager,\n mcpManager: this.state.mcpManager,\n authStorage: this.state.authStorage,\n customSlashCommands: this.state.customSlashCommands,\n showInfo: msg => showInfo(this.state, msg),\n showError: msg => showError(this.state, msg),\n updateStatusLine: () => updateStatusLine(this.state),\n stop: () => this.stop(),\n getResolvedWorkspace: () => this.getResolvedWorkspace(),\n addUserMessage: msg => addUserMessage(this.state, msg),\n renderExistingMessages: () => renderExistingMessages(this.state),\n showOnboarding: () => this.showOnboarding(),\n };\n }\n\n private buildEventContext(): EventHandlerContext {\n return {\n state: this.state,\n showInfo: msg => showInfo(this.state, msg),\n showError: msg => showError(this.state, msg),\n showFormattedError: event => showFormattedError(this.state, event),\n updateStatusLine: () => updateStatusLine(this.state),\n notify: (reason, message) => notify(this.state, reason, message),\n handleSlashCommand: input => this.handleSlashCommand(input),\n addUserMessage: msg => addUserMessage(this.state, msg),\n addChildBeforeFollowUps: child => this.addChildBeforeFollowUps(child),\n fireMessage: (content, images) => this.fireMessage(content, images),\n queueFollowUpMessage: content => this.queueFollowUpMessage(content),\n renderExistingMessages: () => renderExistingMessages(this.state),\n renderCompletedTasksInline: (tasks, insertIndex, collapsed) =>\n renderCompletedTasksInline(this.state, tasks, insertIndex, collapsed),\n renderClearedTasksInline: (clearedTasks, insertIndex) =>\n renderClearedTasksInline(this.state, clearedTasks, insertIndex),\n refreshModelAuthStatus: () => this.refreshModelAuthStatus(),\n };\n }\n\n private async handleSlashCommand(input: string): Promise<boolean> {\n return dispatchSlashCommand(input, this.state, () => this.buildCommandContext());\n }\n\n // ===========================================================================\n // Login (used by onboarding)\n // ===========================================================================\n\n async performLogin(providerId: string): Promise<void> {\n const provider = getOAuthProviders().find(p => p.id === providerId);\n const providerName = provider?.name || providerId;\n\n if (!this.state.authStorage) {\n showError(this.state, 'Auth storage not configured');\n return;\n }\n\n return new Promise(resolve => {\n const dialog = new LoginDialogComponent(this.state.ui, providerId, (success, message) => {\n this.state.ui.hideOverlay();\n if (success) {\n showInfo(this.state, `Successfully logged in to ${providerName}`);\n } else if (message) {\n showInfo(this.state, message);\n }\n resolve();\n });\n\n this.state.ui.showOverlay(dialog, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n dialog.focused = true;\n\n this.state\n .authStorage!.login(providerId, {\n onAuth: (info: { url: string; instructions?: string }) => {\n dialog.showAuth(info.url, info.instructions);\n },\n onPrompt: async (prompt: { message: string; placeholder?: string }) => {\n return dialog.showPrompt(prompt.message, prompt.placeholder);\n },\n onProgress: (message: string) => {\n dialog.showProgress(message);\n },\n signal: dialog.signal,\n })\n .then(async () => {\n this.state.ui.hideOverlay();\n\n const { PROVIDER_DEFAULT_MODELS } = await import('../auth/storage.js');\n const defaultModel = PROVIDER_DEFAULT_MODELS[providerId as keyof typeof PROVIDER_DEFAULT_MODELS];\n if (defaultModel) {\n await this.state.harness.switchModel({ modelId: defaultModel });\n showInfo(this.state, `Logged in to ${providerName} - switched to ${defaultModel}`);\n } else {\n showInfo(this.state, `Successfully logged in to ${providerName}`);\n }\n\n resolve();\n })\n .catch((error: Error) => {\n this.state.ui.hideOverlay();\n if (error.message !== 'Login cancelled') {\n showError(this.state, `Failed to login: ${error.message}`);\n }\n resolve();\n });\n });\n }\n\n async performApiKeyLogin(): Promise<void> {\n const { PROVIDER_DEFAULT_MODELS } = await import('../auth/storage.js');\n await runApiKeyLoginFlow({\n state: this.state,\n authStorage: this.state.authStorage,\n showInfo: message => showInfo(this.state, message),\n showError: message => showError(this.state, message),\n switchModel: modelId => this.state.harness.switchModel({ modelId }),\n providerDefaults: PROVIDER_DEFAULT_MODELS,\n oauthProviders: getOAuthProviders().map(provider => ({ id: provider.id, name: provider.name })),\n });\n }\n\n // ===========================================================================\n // Onboarding\n // ===========================================================================\n\n async showOnboarding(): Promise<void> {\n const allProviders = getOAuthProviders();\n const authProviders = allProviders.map(p => ({\n label: p.name,\n value: p.id,\n loggedIn: this.state.authStorage?.isLoggedIn(p.id) ?? false,\n }));\n\n const access = await this.buildProviderAccess();\n const hasProviderAccess = Object.values(access).some(Boolean);\n\n const savedSettings = loadSettingsCached();\n const projectPath = ((this.state.harness.getState() as { projectPath?: string } | undefined)?.projectPath ?? process.cwd()) as string;\n const modeDefinitions = loadAgentDefinitionsCached(projectPath).modes;\n const modePacks = getAvailableModePacks(access, savedSettings.customModelPacks, modeDefinitions);\n const packModes = getModePackOptions(modeDefinitions);\n const omPacks = getAvailableOmPacks(access);\n\n let prevModePackId = savedSettings.onboarding.modePackId;\n if (prevModePackId === 'custom' && savedSettings.models.activeModelPackId?.startsWith('custom:')) {\n prevModePackId = savedSettings.models.activeModelPackId;\n }\n const previous = savedSettings.onboarding.completedAt\n ? {\n modePackId: prevModePackId,\n omPackId: savedSettings.onboarding.omPackId,\n yolo: savedSettings.preferences.yolo,\n }\n : undefined;\n\n return new Promise<void>(resolve => {\n const component = new OnboardingInlineComponent({\n tui: this.state.ui,\n authProviders,\n allowApiKeyLogin: true,\n modePacks,\n packModes,\n omPacks,\n hasProviderAccess,\n previous,\n onComplete: async (result: OnboardingResult) => {\n this.state.activeOnboarding = undefined;\n await this.applyOnboardingResult(result);\n resolve();\n },\n onCancel: () => {\n this.state.activeOnboarding = undefined;\n const settings = loadSettingsCached();\n if (!settings.onboarding.completedAt) {\n settings.onboarding.skippedAt = new Date().toISOString();\n settings.onboarding.version = ONBOARDING_VERSION;\n saveSettings(settings);\n }\n resolve();\n },\n onLogin: (providerId: string, done: () => void) => {\n // Persist Claude Max OAuth warning acknowledgement when proceeding\n // through onboarding (the warning step already showed in the wizard).\n if (providerId === ANTHROPIC_OAUTH_PROVIDER_ID) {\n const s = loadSettingsCached();\n s.onboarding.claudeMaxOAuthWarningAcknowledgedAt = new Date().toISOString();\n saveSettings(s);\n }\n this.performLogin(providerId).then(async () => {\n try {\n const updatedAccess = await this.buildProviderAccess();\n const updatedHasAccess = Object.values(updatedAccess).some(Boolean);\n component.updateModePacks(getAvailableModePacks(updatedAccess, savedSettings.customModelPacks, modeDefinitions));\n component.updateOmPacks(getAvailableOmPacks(updatedAccess));\n component.updateHasProviderAccess(updatedHasAccess);\n } catch (err) {\n console.error('Failed to refresh provider access after login:', err);\n } finally {\n done();\n }\n });\n },\n onSetApiKey: done => {\n this.performApiKeyLogin().then(async () => {\n try {\n const refreshedSettings = loadSettingsCached();\n const updatedAccess = await this.buildProviderAccess();\n const updatedHasAccess = Object.values(updatedAccess).some(Boolean);\n component.updateModePacks(getAvailableModePacks(updatedAccess, refreshedSettings.customModelPacks, modeDefinitions));\n component.updateOmPacks(getAvailableOmPacks(updatedAccess));\n component.updateHasProviderAccess(updatedHasAccess);\n } catch (err) {\n console.error('Failed to refresh provider access after API key setup:', err);\n } finally {\n done();\n }\n });\n },\n onSelectModel: async (title: string, modeColor?: string): Promise<string | undefined> => {\n const availableModels = await this.state.harness.listAvailableModels();\n if (availableModels.length === 0) return undefined;\n\n return new Promise<string | undefined>(resolveModel => {\n const selector = new ModelSelectorComponent({\n tui: this.state.ui,\n models: availableModels,\n currentModelId: undefined,\n title,\n titleColor: modeColor,\n onSelect: (model: ModelItem) => {\n this.state.ui.hideOverlay();\n resolveModel(model.id);\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n resolveModel(undefined);\n },\n });\n\n this.state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n selector.focused = true;\n });\n },\n });\n\n this.state.activeOnboarding = component;\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(component);\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.ui.requestRender();\n this.state.chatContainer.invalidate();\n });\n }\n\n private async applyOnboardingResult(result: OnboardingResult): Promise<void> {\n const harness = this.state.harness;\n const modePack = result.modePack;\n const modes = harness.listModes();\n\n for (const mode of modes) {\n const modelId = (modePack.models as Record<string, string>)[mode.id];\n if (modelId) {\n (mode as any).defaultModelId = modelId;\n await harness.setThreadSetting({\n key: `modeModelId_${mode.id}`,\n value: modelId,\n });\n }\n }\n\n const currentModeId = harness.getCurrentModeId();\n const currentModeModel = (modePack.models as Record<string, string>)[currentModeId];\n if (currentModeModel) {\n await harness.switchModel({ modelId: currentModeModel });\n }\n\n const projectPath = ((harness.getState() as { projectPath?: string } | undefined)?.projectPath ?? process.cwd()) as string;\n const subagentModeMap = getSubagentModeMap(loadAgentDefinitionsCached(projectPath));\n for (const [agentType, modeId] of Object.entries(subagentModeMap)) {\n const saModelId = (modePack.models as Record<string, string>)[modeId];\n if (saModelId) {\n await harness.setSubagentModelId({ modelId: saModelId, agentType });\n }\n }\n\n const omPack = result.omPack;\n harness.setState({ observerModelId: omPack.modelId, reflectorModelId: omPack.modelId });\n harness.setState({ yolo: result.yolo });\n\n const settings = loadSettingsCached();\n settings.onboarding.completedAt = new Date().toISOString();\n settings.onboarding.skippedAt = null;\n settings.onboarding.version = ONBOARDING_VERSION;\n settings.onboarding.omPackId = omPack.id;\n\n const modeDefaults: Record<string, string> = {};\n for (const mode of modes) {\n const modelId = (modePack.models as Record<string, string>)[mode.id];\n if (modelId) modeDefaults[mode.id] = modelId;\n }\n\n let activeModePackId = modePack.id;\n if (modePack.id === 'custom' || modePack.id.startsWith('custom:')) {\n const customName =\n modePack.id === 'custom' ? modePack.name?.trim() || 'Custom' : modePack.id.slice('custom:'.length) || 'Custom';\n activeModePackId = `custom:${customName}`;\n const entry = { name: customName, models: modeDefaults, createdAt: new Date().toISOString() };\n const idx = settings.customModelPacks.findIndex(p => p.name === customName);\n if (idx >= 0) {\n settings.customModelPacks[idx] = entry;\n } else {\n settings.customModelPacks.push(entry);\n }\n settings.models.modeDefaults = modeDefaults;\n } else {\n settings.models.modeDefaults = {};\n }\n\n settings.onboarding.modePackId = activeModePackId;\n settings.models.activeModelPackId = activeModePackId;\n if (harness.getCurrentThreadId()) {\n await harness.setThreadSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: activeModePackId });\n }\n\n settings.models.activeOmPackId = omPack.id;\n settings.models.omModelOverride = omPack.id === 'custom' ? omPack.modelId : null;\n settings.preferences.yolo = result.yolo;\n\n // Clear any manual subagent overrides so they derive from the active pack\n settings.models.subagentModels = {};\n\n saveSettings(settings);\n\n updateStatusLine(this.state);\n await this.refreshModelAuthStatus();\n }\n\n private shouldShowOnboarding(): boolean {\n const settings = loadSettingsCached();\n const ob = settings.onboarding;\n if (ob.completedAt || ob.skippedAt) {\n return ob.version < ONBOARDING_VERSION;\n }\n return true;\n }\n\n // ===========================================================================\n // Auto-Update\n // ===========================================================================\n\n /**\n * Check GitHub releases for a newer version and prompt the user to update.\n * - If the user previously dismissed this version, show a passive note instead.\n * - If the fetch fails or we're already up-to-date, silently return.\n * @param passive When true, only show an info message (used for periodic rechecks).\n */\n private async checkForUpdate(passive = false): Promise<void> {\n const currentVersion = this.state.options.version;\n if (!currentVersion) return;\n\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion || !isNewerVersion(currentVersion, latestVersion)) return;\n\n // Passive mode or previously dismissed — show info message only once\n if (passive) {\n if (!this.hasShownUpdateBanner) {\n this.hasShownUpdateBanner = true;\n showInfo(\n this.state,\n `Update available: v${latestVersion} (current: v${currentVersion}). Run /update to update.`,\n );\n }\n return;\n }\n\n const settings = loadSettingsCached();\n\n // User previously dismissed this exact version — show passive banner note only once\n if (settings.updateDismissedVersion && !isNewerVersion(settings.updateDismissedVersion, latestVersion)) {\n if (!this.hasShownUpdateBanner) {\n this.hasShownUpdateBanner = true;\n showInfo(\n this.state,\n `Update available: v${latestVersion} (current: v${currentVersion}). Run /update to update.`,\n );\n }\n return;\n }\n\n const pm = await detectPackageManager();\n\n // Prompt the user (and mark banner as shown so periodic checks don't repeat it)\n this.hasShownUpdateBanner = true;\n await this.showUpdatePrompt(currentVersion, latestVersion, pm);\n }\n\n /**\n * Show an inline Y/N prompt offering to auto-update.\n */\n private showUpdatePrompt(\n currentVersion: string,\n latestVersion: string,\n pm: Awaited<ReturnType<typeof detectPackageManager>>,\n ): Promise<void> {\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `A new version of Ulicode is available: v${latestVersion} (current: v${currentVersion}). Would you like to update now?`,\n options: [\n { label: 'Yes', description: 'Update and restart' },\n { label: 'No', description: 'Skip this version' },\n ],\n formatResult: answer => (answer === 'Yes' ? 'Updating…' : 'Update skipped.'),\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n if (answer === 'Yes') {\n showInfo(this.state, `Updating to v${latestVersion}…`);\n const ok = await runUpdate(pm, latestVersion);\n if (ok) {\n showInfo(this.state, `Updated to v${latestVersion}. Please restart Ulicode.`);\n this.stop();\n process.exit(0);\n } else {\n const cmd = getInstallCommand(pm, latestVersion);\n showError(this.state, `Auto-update failed. Run \\`${cmd}\\` manually.`);\n }\n } else {\n // User declined — save the dismissed version\n const settings = loadSettingsCached();\n settings.updateDismissedVersion = latestVersion;\n saveSettings(settings);\n showInfo(this.state, `Update skipped. Run /update to update later.`);\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n // Treat cancel (Esc / Ctrl+C) the same as \"No\"\n const settings = loadSettingsCached();\n settings.updateDismissedVersion = latestVersion;\n saveSettings(settings);\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(questionComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.ui.requestRender();\n this.state.chatContainer.invalidate();\n });\n }\n}\n","/**\n * OAuth provider selector component for /login and /logout commands\n */\n\nimport { Box, Container, getEditorKeybindings, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { OAuthProviderInterface } from '../../auth/types.js';\nimport { theme } from '../theme.js';\n\n/**\n * Interface for auth provider that the selector needs.\n * Can be satisfied by Harness or AuthStorage.\n */\nexport interface AuthProviderSource {\n getOAuthProviders(): OAuthProviderInterface[];\n isLoggedIn(providerId: string): boolean;\n}\n\nexport class LoginSelectorComponent extends Box {\n private listContainer: Container;\n private allProviders: { id: string; name: string }[] = [];\n private selectedIndex: number = 0;\n private mode: 'login' | 'logout';\n private authSource: AuthProviderSource;\n private onSelectCallback: (providerId: string) => void;\n private onCancelCallback: () => void;\n\n constructor(\n mode: 'login' | 'logout',\n authSource: AuthProviderSource,\n onSelect: (providerId: string) => void,\n onCancel: () => void,\n ) {\n // Box with padding and background\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.mode = mode;\n this.authSource = authSource;\n this.onSelectCallback = onSelect;\n this.onCancelCallback = onCancel;\n\n // Load all OAuth providers\n this.loadProviders();\n\n // Add title\n const title = mode === 'login' ? 'Select provider to login:' : 'Select provider to logout:';\n this.addChild(new Text(theme.fg('text', title)));\n this.addChild(new Spacer(1));\n\n // Create list container\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', 'Press Enter to select, Escape to cancel')));\n\n // Initial render\n this.updateList();\n }\n\n private loadProviders(): void {\n this.allProviders = this.authSource.getOAuthProviders().map(p => ({ id: p.id, name: p.name }));\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n for (let i = 0; i < this.allProviders.length; i++) {\n const provider = this.allProviders[i];\n if (!provider) continue;\n\n const isSelected = i === this.selectedIndex;\n\n // Check if user is logged in for this provider\n const isLoggedIn = this.authSource.isLoggedIn(provider.id);\n const statusIndicator = isLoggedIn ? theme.fg('success', ' ✓ logged in') : '';\n\n let line = '';\n if (isSelected) {\n line = theme.fg('accent', '→ ' + provider.name) + statusIndicator;\n } else {\n line = ' ' + provider.name + statusIndicator;\n }\n\n this.listContainer.addChild(new Text(line));\n }\n\n // Show \"no providers\" if empty\n if (this.allProviders.length === 0) {\n const message =\n this.mode === 'login' ? 'No OAuth providers available' : 'No OAuth providers logged in. Use /login first.';\n this.listContainer.addChild(new Text(theme.fg('muted', message)));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n // Up arrow\n if (kb.matches(keyData, 'selectUp')) {\n this.selectedIndex = Math.max(0, this.selectedIndex - 1);\n this.updateList();\n }\n // Down arrow\n else if (kb.matches(keyData, 'selectDown')) {\n this.selectedIndex = Math.min(this.allProviders.length - 1, this.selectedIndex + 1);\n this.updateList();\n }\n // Enter\n else if (kb.matches(keyData, 'selectConfirm')) {\n const selectedProvider = this.allProviders[this.selectedIndex];\n if (selectedProvider) {\n this.onSelectCallback(selectedProvider.id);\n }\n }\n // Escape or Ctrl+C\n else if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n }\n }\n}\n"]}
|