mastracode 0.16.2 → 0.16.3-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/{chunk-GFMNLTYT.js → chunk-ABONQ6TD.js} +34 -5
- package/dist/chunk-ABONQ6TD.js.map +1 -0
- package/dist/{chunk-GN2BAGO2.cjs → chunk-FSEA2HBK.cjs} +34 -5
- package/dist/chunk-FSEA2HBK.cjs.map +1 -0
- package/dist/cli.cjs +100 -9
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +96 -6
- package/dist/cli.js.map +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui.cjs +11 -11
- package/dist/tui.js +1 -1
- package/dist/utils/stdin-pipe.d.ts +33 -0
- package/dist/utils/stdin-pipe.d.ts.map +1 -0
- package/package.json +11 -11
- package/dist/chunk-GFMNLTYT.js.map +0 -1
- package/dist/chunk-GN2BAGO2.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tui/components/ask-question-inline.ts","../src/onboarding/onboarding-inline.ts","../src/utils/update-check.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/components/mcp-selector.ts","../src/utils/errors.ts","../src/tui/notify.ts","../src/tui/display.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.ts","../src/tui/commands/thread-tag-dir.ts","../src/tui/commands/sandbox.ts","../src/clipboard/index.ts","../src/tui/components/model-selector.ts","../src/tui/components/masked-input.ts","../src/tui/components/api-key-dialog.ts","../src/tui/prompt-api-key.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/api-keys.ts","../src/tui/commands/settings.ts","../src/tui/commands/browser.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/commands/memory-gateway.ts","../src/tui/commands/feedback.ts","../src/tui/commands/observability.ts","../src/tui/components/slash-command.ts","../src/tui/command-dispatch.ts","../src/tui/prune-chat.ts","../src/tui/handlers/agent-lifecycle.ts","../src/tui/components/assistant-message.ts","../src/tui/components/system-reminder.ts","../src/tui/components/temporal-gap.ts","../src/tui/components/ansi.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/components/user-message.ts","../src/tui/components/om-marker.ts","../src/tui/components/om-output.ts","../src/tui/components/plan-approval-inline.ts","../src/tui/components/subagent-execution.ts","../src/tui/components/tool-approval-dialog.ts","../src/tui/handlers/tool.ts","../src/tui/render-messages.ts","../src/tui/handlers/message.ts","../src/tui/handlers/om.ts","../src/utils/plans.ts","../src/tui/components/ask-question-dialog.ts","../src/tui/handlers/prompts.ts","../src/tui/handlers/subagent.ts","../src/tui/event-dispatch.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/tui/components/custom-editor.ts","../src/tui/state.ts","../src/tui/mastra-tui.ts","../src/tui/components/login-selector.ts"],"names":["Container","Spacer","chalk","SelectList","resolve","path","fs","Box","Text","TOOL_CATEGORIES","getEditorKeybindings","s","component","Input","lines","execSync","readFileSync","fuzzyFilter","isSelected","line","homedir","visibleWidth","SettingsList","askText","isBrowserbase","nextBrowser","shouldProceed","exec","settings","askSelect","mastra","MAX_COLLAPSED_LINES","process","remaining","status","pathDisplay","footerText","termWidth","output","border","maxLineWidth","fixedParts","availableForPath","highlight","stripAnsi","Markdown","text","formatTokens","getObserverColor","getReflectorColor","truncateAnsi","COLLAPSED_LINES","safeStringify","formatDuration","parsePartialJson","createReminderComponent","name","parseYaml","theme","mimeType","fileURLToPath","PROVIDER_DEFAULT_MODELS"],"mappings":"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","file":"chunk-ABONQ6TD.js","sourcesContent":["/**\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 * Supports three lifecycle phases:\n * 1. **Streaming** — Created early by handleToolInputStart with no args.\n * As partial JSON arrives via handleToolInputDelta, `updateArgs()` feeds\n * the question text and option labels into the bordered box progressively.\n * 2. **Active** — When handleAskQuestion fires, `activate()` wires up the\n * interactive SelectList / Input and the submit/cancel callbacks.\n * 3. **Answered** — After the user responds, the box freezes with ✓/✗ icons.\n */\n\nimport {\n Container,\n getEditorKeybindings,\n Input,\n SelectList,\n Spacer,\n visibleWidth,\n wrapTextWithAnsi,\n} from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport { BOX_INDENT_STR, 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\n/**\n * A renderable that wraps the ask-question content in a full bordered box\n * (┌─┐ / │ │ / └─┘) including the interactive SelectList or Input.\n */\nclass AskQuestionBorderedBox {\n questionLines: string[];\n private selectList?: SelectList;\n private input?: Input;\n private hintText: string;\n items: Array<{ label: string; description?: string }>;\n private answered = false;\n private cancelled = false;\n private selectedValue?: string;\n private answerIsNegative = false;\n /** True when created during streaming, before activate() is called */\n private streaming = false;\n\n constructor(\n questionLines: string[],\n hintText: string,\n items: Array<{ label: string; description?: string }>,\n selectList?: SelectList,\n input?: Input,\n streaming?: boolean,\n ) {\n this.questionLines = questionLines;\n this.hintText = hintText;\n this.items = items;\n this.selectList = selectList;\n this.input = input;\n this.streaming = streaming ?? false;\n }\n\n invalidate() {\n this.selectList?.invalidate();\n }\n\n setInteractive(selectList?: SelectList, input?: Input, hintText?: string) {\n this.streaming = false;\n this.selectList = selectList;\n this.input = input;\n if (hintText) this.hintText = hintText;\n }\n\n setAnswered(selectedValue: string, isNegative: boolean) {\n this.streaming = false;\n this.answered = true;\n this.selectedValue = selectedValue;\n this.answerIsNegative = isNegative;\n }\n\n setCancelled() {\n this.streaming = false;\n this.answered = true;\n this.cancelled = true;\n }\n\n render(width: number): string[] {\n try {\n return this._render(width);\n } catch {\n // Fallback: render a minimal box so the TUI doesn't crash\n return [\n BOX_INDENT_STR + theme.fg('dim', '╭──── Question ────╮'),\n BOX_INDENT_STR + theme.fg('dim', '│ (render error) │'),\n BOX_INDENT_STR + theme.fg('dim', '╰──────────────────╯'),\n ];\n }\n }\n\n private _render(width: number): string[] {\n const border = (s: string) => theme.fg('dim', s);\n\n // Inner width: total width minus indent, minus 4 for \"│ \" + \" │\"\n const innerWidth = Math.max(1, width - BOX_INDENT_STR.length - 4);\n const boxWidth = innerWidth + 4; // \"│ \" + content + \" │\"\n\n const lines: string[] = [];\n\n // Top border: ╭──...──╮\n lines.push(BOX_INDENT_STR + border(`╭${'─'.repeat(boxWidth - 2)}╮`));\n\n // Helper to add a bordered line\n const addLine = (content: string, contentVisWidth: number) => {\n const pad = Math.max(0, innerWidth - contentVisWidth);\n lines.push(BOX_INDENT_STR + border('│') + ' ' + content + ' '.repeat(pad) + ' ' + border('│'));\n };\n\n // Question header\n const header = theme.bold(theme.fg('accent', 'Question'));\n addLine(header, visibleWidth(header));\n\n // Question text (word-wrap to fit inside bordered box)\n for (const qLine of this.questionLines) {\n const wrapped = wrapTextWithAnsi(qLine, innerWidth);\n for (const wLine of wrapped) {\n const text = theme.fg('text', wLine);\n addLine(text, visibleWidth(wLine));\n }\n }\n\n // Empty separator\n addLine('', 0);\n\n if (this.streaming) {\n // Streaming: show option labels as they arrive (dimmed, no interactivity)\n for (const item of this.items) {\n const line = theme.fg('dim', ` ${item.label}`);\n addLine(line, visibleWidth(line));\n }\n // Waiting indicator\n const waiting = theme.fg('dim', '…');\n addLine(waiting, visibleWidth(waiting));\n } else if (this.answered && this.items.length > 0) {\n // Render frozen item list\n if (this.cancelled) {\n // All items dimmed, cancelled notice\n for (const item of this.items) {\n const line = theme.fg('dim', ` ${item.label}`);\n addLine(line, visibleWidth(line));\n }\n const cancelLine = `${theme.fg('error', '✗')} ${theme.fg('dim', '(cancelled)')}`;\n addLine(cancelLine, visibleWidth(cancelLine));\n } else {\n // ✓/✗ on selected, dimmed unselected\n for (const item of this.items) {\n const isSelected = item.label === this.selectedValue;\n if (isSelected) {\n const icon = this.answerIsNegative ? theme.fg('error', '✗') : theme.fg('success', '✓');\n const label = theme.fg('text', item.label);\n const line = `${icon} ${label}`;\n addLine(line, visibleWidth(line));\n } else {\n const line = theme.fg('dim', ` ${item.label}`);\n addLine(line, visibleWidth(line));\n }\n }\n }\n addLine('', 0);\n } else if (this.answered && this.selectedValue != null) {\n // Free-text input answered\n const icon = this.answerIsNegative ? theme.fg('error', '✗') : theme.fg('success', '✓');\n const iconPrefix = `${icon} `;\n const continuationPrefix = ' ';\n const wrappedAnswer = wrapTextWithAnsi(this.selectedValue!, Math.max(1, innerWidth - visibleWidth(iconPrefix)));\n\n wrappedAnswer.forEach((line, index) => {\n const prefix = index === 0 ? iconPrefix : continuationPrefix;\n const content = `${prefix}${theme.fg('text', line)}`;\n addLine(content, visibleWidth(prefix) + visibleWidth(line));\n });\n } else if (this.answered && this.cancelled) {\n // Free-text cancelled\n const cancelLine = `${theme.fg('error', '✗')} ${theme.fg('dim', '(cancelled)')}`;\n addLine(cancelLine, visibleWidth(cancelLine));\n } else {\n // Interactive content (SelectList or Input)\n if (this.selectList) {\n // SelectList renders its own lines — wrap each one with borders\n const selectLines = this.selectList.render(innerWidth);\n for (const sLine of selectLines) {\n addLine(sLine, visibleWidth(sLine));\n }\n } else if (this.input) {\n const inputLines = this.input.render(innerWidth);\n for (const iLine of inputLines) {\n addLine(iLine, visibleWidth(iLine));\n }\n }\n\n // Hint text\n const hint = theme.fg('dim', this.hintText);\n addLine(hint, visibleWidth(hint));\n }\n\n // Bottom border: ╰──...──╯\n lines.push(BOX_INDENT_STR + border(`╰${'─'.repeat(boxWidth - 2)}╯`));\n\n return lines;\n }\n}\n\nexport class AskQuestionInlineComponent extends Container implements Focusable {\n private borderedBox: AskQuestionBorderedBox;\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit?: (answer: string) => void;\n private onCancel?: () => void;\n private isNegativeAnswer?: (answer: string) => boolean;\n private allowEmptyInput = false;\n private answered = false;\n\n /**\n * Create a pre-answered instance for rendering from chat history.\n * No interactive elements — just shows the question and the answer in the bordered box.\n */\n static fromHistory(\n question: string,\n options: Array<{ label: string; description?: string }> | undefined,\n answer: string,\n cancelled: boolean,\n ): AskQuestionInlineComponent {\n const component = AskQuestionInlineComponent.createStreaming();\n component.updateArgs({ question, options });\n component.answered = true;\n if (cancelled) {\n component.borderedBox.setCancelled();\n } else {\n component.borderedBox.setAnswered(answer, false);\n }\n return component;\n }\n\n /**\n * Create a streaming instance for early rendering during tool input streaming.\n * Shows the bordered box with \"…\" indicator. Call updateArgs() as partial JSON\n * arrives, then activate() when the question event fires.\n */\n static createStreaming(): AskQuestionInlineComponent {\n const component = new AskQuestionInlineComponent();\n return component;\n }\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 render(width: number): string[] {\n try {\n return super.render(width);\n } catch {\n return [\n BOX_INDENT_STR + theme.fg('dim', '╭──── Question ────╮'),\n BOX_INDENT_STR + theme.fg('dim', '│ (render error) │'),\n BOX_INDENT_STR + theme.fg('dim', '╰──────────────────╯'),\n ];\n }\n }\n\n /**\n * Private constructor — use static factories or the options constructor.\n */\n constructor(options?: AskQuestionInlineOptions, _ui?: TUI) {\n super();\n\n if (options) {\n // Full construction with interactive elements\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n this.isNegativeAnswer = options.isNegativeAnswer;\n this.allowEmptyInput = Boolean(options.allowEmptyInput);\n\n const questionLines = options.question.split('\\n');\n\n let hintText: string;\n if (options.options && options.options.length > 0) {\n hintText = '↑↓ to navigate · Enter to select · Esc to skip';\n this.buildSelectMode(options.options);\n } else {\n hintText = 'Enter to submit · Esc to skip';\n this.buildInputMode();\n }\n\n this.borderedBox = new AskQuestionBorderedBox(\n questionLines,\n hintText,\n options.options || [],\n this.selectList,\n this.input,\n );\n } else {\n // Streaming mode — empty bordered box, will be populated by updateArgs()\n this.borderedBox = new AskQuestionBorderedBox([], '', [], undefined, undefined, true);\n }\n\n this.addChild(this.borderedBox as any);\n this.addChild(new Spacer(1));\n }\n\n /**\n * Update the question text and options from streaming partial args.\n * Called during tool input delta streaming.\n */\n updateArgs(args: unknown): void {\n if (this.answered) return;\n if (!args || typeof args !== 'object') return;\n const a = args as Record<string, unknown>;\n if (typeof a.question === 'string') {\n this.borderedBox.questionLines = a.question.split('\\n');\n }\n if (Array.isArray(a.options)) {\n this.borderedBox.items = a.options.filter(\n (o: unknown): o is { label: string; description?: string } =>\n typeof o === 'object' && o !== null && typeof (o as any).label === 'string',\n );\n }\n }\n\n /**\n * Activate the interactive elements (SelectList or Input) and wire up callbacks.\n * Called by handleAskQuestion when the question event fires after streaming.\n */\n activate(options: {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n isNegativeAnswer?: (answer: string) => boolean;\n allowEmptyInput?: boolean;\n onSubmit: (answer: string) => void;\n onCancel: () => void;\n }): void {\n if (this.answered) return;\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n this.isNegativeAnswer = options.isNegativeAnswer;\n this.allowEmptyInput = Boolean(options.allowEmptyInput);\n\n // Update question text and items to final values\n this.borderedBox.questionLines = options.question.split('\\n');\n this.borderedBox.items = options.options || [];\n\n // Build interactive elements\n let hintText: string;\n if (options.options && options.options.length > 0) {\n hintText = '↑↓ to navigate · Enter to select · Esc to skip';\n this.buildSelectMode(options.options);\n } else {\n hintText = 'Enter to submit · Esc to skip';\n this.buildInputMode();\n }\n\n // Switch bordered box out of streaming mode\n this.borderedBox.setInteractive(this.selectList, this.input, hintText);\n }\n\n private static readonly CUSTOM_RESPONSE_VALUE = '__custom_response__';\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 // Append a \"Custom response...\" option so the user can type a free-text answer\n items.push({\n value: AskQuestionInlineComponent.CUSTOM_RESPONSE_VALUE,\n label: ` ${theme.fg('dim', '✎ Custom response...')}`,\n });\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n if (item.value === AskQuestionInlineComponent.CUSTOM_RESPONSE_VALUE) {\n this.switchToCustomInput();\n return;\n }\n this.handleAnswer(item.value);\n };\n this.selectList.onCancel = () => {\n this.handleCancel();\n };\n }\n\n private switchToCustomInput(): void {\n // Tear down the select list and switch to free-text input\n this.selectList = undefined;\n this.buildInputMode();\n\n // Clear items so the answered state renders as free-text, not select\n this.borderedBox.items = [];\n this.borderedBox.setInteractive(undefined, this.input, 'Enter to submit · Esc to skip');\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 (this.input as any).keybindings = getEditorKeybindings();\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.borderedBox.setAnswered(answer, isNegative);\n\n this.onSubmit?.(answer);\n }\n\n private handleCancel(): void {\n if (this.answered) return;\n this.answered = true;\n\n this.borderedBox.setCancelled();\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 (build / plan / fast model preset)\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 { AskQuestionInlineComponent } from '../tui/components/ask-question-inline.js';\nimport { BOX_INDENT, theme, getSelectListTheme, mastra } from '../tui/theme.js';\nimport type { ModePack, 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 /** Available mode packs (pre-filtered by provider access). */\n modePacks: ModePack[];\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 /** 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' | '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 '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(BOX_INDENT, 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 Mastra Code')), 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', 'or skip if you have API keys configured as environment variables.'), 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 items.push({\n value: '__skip',\n label: ` ${theme.fg('dim', 'Skip (use API keys or configure later with /login)')}`,\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 {\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: 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 Mastra Code 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 = [\n ` ${chalk.hex(mastra.blue)('plan')} → ${theme.fg('text', pack.models.plan)}`,\n ` ${chalk.hex(mastra.purple)('build')} → ${theme.fg('text', pack.models.build)}`,\n ` ${chalk.hex(mastra.green)('fast')} → ${theme.fg('text', pack.models.fast)}`,\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: Array<{ id: 'plan' | 'build' | 'fast'; label: string; color: string }> = [\n { id: 'plan', label: 'plan', color: mastra.purple },\n { id: 'build', label: 'build', color: mastra.green },\n { id: 'fast', label: 'fast', color: mastra.orange },\n ];\n\n const models: Record<string, string> = { build: '', plan: '', fast: '' };\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: { build: models.build!, plan: models.plan!, fast: models.fast! },\n };\n\n this.collapseStep(\n `Model pack → ${theme.bold(packName)} ` +\n `${chalk.hex(mastra.blue)('plan')} ${models.plan} ` +\n `${chalk.hex(mastra.purple)('build')} ${models.build} ` +\n `${chalk.hex(mastra.green)('fast')} ${models.fast}`,\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 ` ${chalk.hex(mastra.blue)('plan')} → ${this.selectedModePack.models.plan}`,\n ` ${chalk.hex(mastra.purple)('build')} → ${this.selectedModePack.models.build}`,\n ` ${chalk.hex(mastra.green)('fast')} → ${this.selectedModePack.models.fast}`,\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 * Check for newer versions of mastracode on npm.\n */\n\nimport { execFile } from 'node:child_process';\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nconst PACKAGE_NAME = 'mastracode';\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/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 mastracode 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, injected at build time by tsup's `define` option.\n * Falls back to reading package.json at runtime (e.g. when running from source with tsx).\n */\nexport function getCurrentVersion(): string {\n if (typeof MASTRACODE_VERSION !== 'undefined') {\n return MASTRACODE_VERSION;\n }\n // Fallback for running from source (e.g. pnpx tsx mastracode/src/main.ts)\n const dir = dirname(fileURLToPath(import.meta.url));\n const pkgPath = resolve(dir, '../../package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version;\n}\n\n/**\n * Fetch the latest published version from npm.\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_REGISTRY_URL, { signal: controller.signal });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return 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/** Max entries to show in the changelog summary. */\nconst MAX_CHANGELOG_ENTRIES = 10;\n\n/**\n * Fetch the CHANGELOG.md for a specific published version from the npm CDN\n * and extract a human-readable summary of changes.\n * Returns null if the fetch fails or the changelog can't be parsed.\n */\nexport async function fetchChangelog(version: string): Promise<string | null> {\n try {\n const url = `https://unpkg.com/${PACKAGE_NAME}@${version}/CHANGELOG.md`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n const res = await fetch(url, { signal: controller.signal });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const text = await res.text();\n return parseChangelog(text, version);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the changelog section for a specific version and format it\n * as a concise bullet list suitable for terminal display.\n */\nexport function parseChangelog(markdown: string, version: string): string | null {\n const versionHeader = `## ${version}`;\n const startIdx = markdown.indexOf(versionHeader);\n if (startIdx === -1) return null;\n\n const afterHeader = startIdx + versionHeader.length;\n const nextHeaderIdx = markdown.indexOf('\\n## ', afterHeader);\n const section = nextHeaderIdx === -1 ? markdown.slice(afterHeader) : markdown.slice(afterHeader, nextHeaderIdx);\n\n const lines = section.split('\\n');\n const entries: string[] = [];\n let skipIndented = false;\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i]!;\n const trimmed = raw.trim();\n\n // Only match top-level entries (no leading whitespace before \"- \")\n const isTopLevel = raw === trimmed && trimmed.startsWith('- ');\n if (!isTopLevel) {\n // Skip indented sub-items (e.g. dependency list entries)\n if (skipIndented && /^\\s+-\\s/.test(raw)) continue;\n skipIndented = false;\n continue;\n }\n\n // Skip dependency update entries and their sub-items\n if (/^- Updated dependenc/i.test(trimmed)) {\n skipIndented = true;\n continue;\n }\n skipIndented = false;\n\n let entry = trimmed.slice(2);\n // Strip markdown links: [text](url) → text\n entry = entry.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n // Strip PR references like (#15760)\n entry = entry.replace(/\\s*\\(#\\d+\\)\\s*/g, ' ');\n // Strip commit SHA references like (`abc123`)\n entry = entry.replace(/\\s*\\(`[a-f0-9]+`\\)\\s*/g, ' ');\n // Take only the first sentence for long entries\n const sentenceEnd = entry.search(/\\.\\s/);\n if (sentenceEnd !== -1 && sentenceEnd < 100) {\n entry = entry.slice(0, sentenceEnd + 1);\n } else if (entry.length > 120) {\n entry = entry.slice(0, 117).trimEnd() + '…';\n }\n entry = entry.trim();\n if (entry) entries.push(entry);\n if (entries.length >= MAX_CHANGELOG_ENTRIES) break;\n }\n\n if (entries.length === 0) return null;\n return entries.map(e => ` • ${e}`).join('\\n');\n}\n\n/**\n * Run the appropriate global install command to update mastracode.\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","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', description: 'Show current thread info' },\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 mastracode 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: '/browser', description: 'Configure browser automation' },\n { key: '/theme', description: 'Switch color theme (auto/dark/light)' },\n { key: '/update', description: 'Check for and install updates' },\n { key: '/observability', description: 'Configure cloud observability' },\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 { loadSettings, 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 = loadSettings();\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","/**\n * MCP server selector component for managing MCP server connections.\n * Uses pi-tui overlay pattern with navigation.\n */\n\nimport { Box, Container, getEditorKeybindings, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport type { McpServerStatus, McpSkippedServer } from '../../mcp/types.js';\nimport { theme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface McpSelectorOptions {\n /** TUI instance for rendering */\n tui: TUI;\n /** Server statuses */\n statuses: McpServerStatus[];\n /** Skipped servers */\n skipped: McpSkippedServer[];\n /** Config file paths for display */\n configPaths: { project: string; global: string; claude: string };\n /** Get current statuses (for polling during initial connect) */\n getStatuses: () => { statuses: McpServerStatus[]; skipped: McpSkippedServer[] };\n /** Callback to reload all servers — should return fresh statuses/skipped */\n onReloadAll: () => Promise<{ statuses: McpServerStatus[]; skipped: McpSkippedServer[] }>;\n /** Callback to reconnect a single server by name — returns updated status */\n onReconnectServer: (name: string) => Promise<McpServerStatus>;\n /** Get captured stderr logs for a server */\n getServerLogs: (name: string) => string[];\n /** Show an info message in the chat area */\n showInfo: (msg: string) => void;\n /** Callback when selector is dismissed */\n onClose: () => void;\n}\n\n// =============================================================================\n// Sub-menu actions\n// =============================================================================\n\ninterface ServerAction {\n label: string;\n key: string;\n}\n\nconst CONNECTED_ACTIONS: ServerAction[] = [\n { label: 'View tools', key: 'tools' },\n { label: 'View logs', key: 'logs' },\n { label: 'Reconnect', key: 'reconnect' },\n];\n\nconst FAILED_ACTIONS: ServerAction[] = [\n { label: 'View error', key: 'error' },\n { label: 'View logs', key: 'logs' },\n { label: 'Reconnect', key: 'reconnect' },\n];\n\nconst CONNECTING_ACTIONS: ServerAction[] = [{ label: 'Waiting for connection...', key: 'none' }];\n\n// =============================================================================\n// McpSelectorComponent\n// =============================================================================\n\nexport class McpSelectorComponent extends Box implements Focusable {\n private listContainer!: Container;\n private statuses: McpServerStatus[];\n private skipped: McpSkippedServer[];\n private selectedIndex = 0;\n private getStatusesCallback: McpSelectorOptions['getStatuses'];\n private onReloadAllCallback: McpSelectorOptions['onReloadAll'];\n private onReconnectServerCallback: McpSelectorOptions['onReconnectServer'];\n private getServerLogsCallback: McpSelectorOptions['getServerLogs'];\n private showInfoCallback: McpSelectorOptions['showInfo'];\n private onCloseCallback: () => void;\n private tui: TUI;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n\n // Sub-menu state\n private subMenuOpen = false;\n private subMenuIndex = 0;\n private subMenuActions: ServerAction[] = [];\n\n // Detail view state (tool list / error display)\n private _detailView = false;\n\n // Loading state during reload\n private _reloading = false;\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: McpSelectorOptions) {\n super(2, 1, text => theme.bg('overlayBg', text));\n\n this.tui = options.tui;\n this.statuses = options.statuses;\n this.skipped = options.skipped;\n this.getStatusesCallback = options.getStatuses;\n this.onReloadAllCallback = options.onReloadAll;\n this.onReconnectServerCallback = options.onReconnectServer;\n this.getServerLogsCallback = options.getServerLogs;\n this.showInfoCallback = options.showInfo;\n this.onCloseCallback = options.onClose;\n\n this.buildUI();\n this.startPollingIfNeeded();\n }\n\n private buildUI(): void {\n // Title\n const titleText = chalk.bgHex('#16c858').white.bold(' Manage MCP servers ');\n this.addChild(new Text(titleText, 0, 0));\n this.addChild(new Spacer(1));\n\n // List container (includes server count + server list)\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n // Footer spacer + hints\n this.addChild(new Spacer(1));\n this.addChild(new Text(theme.fg('muted', '↑↓ navigate • Enter select • r reload all • Esc close'), 0, 0));\n\n // Initial render\n this.updateList();\n }\n\n private getTotalItems(): number {\n return this.statuses.length + this.skipped.length;\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n // Server count line\n const total = this.getTotalItems();\n const countLabel = this._reloading\n ? `${total} server${total !== 1 ? 's' : ''} — reconnecting...`\n : `${total} server${total !== 1 ? 's' : ''}`;\n this.listContainer.addChild(new Text(theme.fg(this._reloading ? 'warning' : 'muted', countLabel), 0, 0));\n this.listContainer.addChild(new Spacer(1));\n\n const totalItems = this.getTotalItems();\n\n for (let i = 0; i < this.statuses.length; i++) {\n const status = this.statuses[i]!;\n const isSelected = i === this.selectedIndex && !this.subMenuOpen;\n\n let icon: string;\n let stateText: string;\n if (this._reloading) {\n icon = theme.fg('warning', '⟳');\n stateText = theme.fg('warning', 'reconnecting...');\n } else if (status.connecting) {\n icon = theme.fg('warning', '⟳');\n stateText = theme.fg('warning', 'connecting...');\n } else if (status.connected) {\n icon = theme.fg('success', '✔');\n stateText = theme.fg('success', 'connected');\n } else {\n icon = theme.fg('error', '✗');\n stateText = theme.fg('error', 'failed');\n }\n\n const cursor = isSelected ? theme.fg('accent', '› ') : ' ';\n const name = isSelected ? theme.bold(theme.fg('accent', status.name)) : status.name;\n const transport = theme.fg('muted', `[${status.transport}]`);\n const toolInfo =\n !this._reloading && status.toolCount > 0 ? theme.fg('muted', ` · ${status.toolCount} tools`) : '';\n\n this.listContainer.addChild(new Text(`${cursor}${icon} ${name} ${transport} ${stateText}${toolInfo}`, 0, 0));\n\n // Sub-menu for this server\n if (i === this.selectedIndex && this.subMenuOpen) {\n for (let j = 0; j < this.subMenuActions.length; j++) {\n const action = this.subMenuActions[j]!;\n const actionSelected = j === this.subMenuIndex;\n const actionCursor = actionSelected ? theme.fg('accent', ' › ') : ' ';\n const actionText = actionSelected\n ? theme.bold(theme.fg('accent', action.label))\n : theme.fg('muted', action.label);\n this.listContainer.addChild(new Text(`${actionCursor}${actionText}`, 0, 0));\n }\n }\n }\n\n // Skipped servers\n if (this.skipped.length > 0) {\n this.listContainer.addChild(new Spacer(1));\n this.listContainer.addChild(new Text(theme.fg('muted', 'Skipped:'), 0, 0));\n for (let i = 0; i < this.skipped.length; i++) {\n const s = this.skipped[i]!;\n const idx = this.statuses.length + i;\n const isSelected = idx === this.selectedIndex && !this.subMenuOpen;\n const cursor = isSelected ? theme.fg('accent', '› ') : ' ';\n const name = isSelected ? theme.bold(theme.fg('accent', s.name)) : s.name;\n this.listContainer.addChild(\n new Text(`${cursor}${theme.fg('warning', '⊘')} ${name} — ${theme.fg('muted', s.reason)}`, 0, 0),\n );\n }\n }\n\n // Empty state\n if (totalItems === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No MCP servers configured'), 0, 0));\n }\n\n this.tui.requestRender();\n }\n\n private startPollingIfNeeded(): void {\n if (this.pollTimer) return;\n const hasConnecting = this.statuses.some(s => s.connecting);\n if (!hasConnecting) return;\n\n this.pollTimer = setInterval(() => {\n // Don't refresh while in a detail view or mid-reload\n if (this._detailView || this._reloading) return;\n\n const fresh = this.getStatusesCallback();\n this.statuses = fresh.statuses;\n this.skipped = fresh.skipped;\n\n // Clamp index\n const total = this.getTotalItems();\n if (this.selectedIndex >= total) {\n this.selectedIndex = Math.max(0, total - 1);\n }\n\n this.updateList();\n\n // Stop polling when nothing is connecting anymore\n if (!this.statuses.some(s => s.connecting)) {\n this.stopPolling();\n }\n }, 500);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n /** Clean up resources when component is removed. */\n dispose(): void {\n this.stopPolling();\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n\n // During reload, only allow closing the selector\n if (this._reloading) {\n if (kb.matches(data, 'selectCancel')) {\n this.onCloseCallback();\n }\n return;\n }\n const totalItems = this.getTotalItems();\n\n // Detail view (tool list or error) — Esc goes back to server list\n if (this._detailView) {\n if (kb.matches(data, 'selectCancel')) {\n this._detailView = false;\n this.updateList();\n }\n return;\n }\n\n if (this.subMenuOpen) {\n this.handleSubMenuInput(data, kb);\n return;\n }\n\n // Up arrow\n if (kb.matches(data, 'selectUp')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? totalItems - 1 : this.selectedIndex - 1;\n this.updateList();\n }\n // Down arrow\n else if (kb.matches(data, 'selectDown')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === totalItems - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n }\n // Enter — open sub-menu for the selected server\n else if (kb.matches(data, 'selectConfirm')) {\n if (this.selectedIndex < this.statuses.length) {\n this.openSubMenu();\n }\n // Skipped servers have no sub-menu actions\n }\n // 'r' — reload all servers\n else if (data === 'r') {\n this.doReloadAll();\n }\n // Escape or Ctrl+C\n else if (kb.matches(data, 'selectCancel')) {\n this.stopPolling();\n this.onCloseCallback();\n }\n }\n\n private openSubMenu(): void {\n const status = this.statuses[this.selectedIndex];\n if (!status) return;\n\n if (status.connecting) {\n this.subMenuActions = CONNECTING_ACTIONS;\n } else if (status.connected) {\n this.subMenuActions = CONNECTED_ACTIONS;\n } else {\n this.subMenuActions = FAILED_ACTIONS;\n }\n\n this.subMenuOpen = true;\n this.subMenuIndex = 0;\n this.updateList();\n }\n\n private handleSubMenuInput(data: string, kb: ReturnType<typeof getEditorKeybindings>): void {\n // Up arrow\n if (kb.matches(data, 'selectUp')) {\n this.subMenuIndex = this.subMenuIndex === 0 ? this.subMenuActions.length - 1 : this.subMenuIndex - 1;\n this.updateList();\n }\n // Down arrow\n else if (kb.matches(data, 'selectDown')) {\n this.subMenuIndex = this.subMenuIndex === this.subMenuActions.length - 1 ? 0 : this.subMenuIndex + 1;\n this.updateList();\n }\n // Enter — execute action\n else if (kb.matches(data, 'selectConfirm')) {\n const action = this.subMenuActions[this.subMenuIndex];\n if (!action || action.key === 'none') return;\n this.executeAction(action.key);\n }\n // Escape — close sub-menu\n else if (kb.matches(data, 'selectCancel')) {\n this.subMenuOpen = false;\n this.updateList();\n }\n }\n\n private executeAction(actionKey: string): void {\n const status = this.statuses[this.selectedIndex];\n if (!status) return;\n\n switch (actionKey) {\n case 'tools': {\n this.subMenuOpen = false;\n this.showToolList(status);\n break;\n }\n case 'error': {\n this.subMenuOpen = false;\n this.showError(status);\n break;\n }\n case 'logs': {\n this.subMenuOpen = false;\n this.showLogs(status);\n break;\n }\n case 'reconnect': {\n this.subMenuOpen = false;\n this.doReconnectServer(status);\n break;\n }\n }\n }\n\n private doReloadAll(): void {\n this._reloading = true;\n this.updateList();\n\n this.onReloadAllCallback()\n .then((result: { statuses: McpServerStatus[]; skipped: McpSkippedServer[] }) => {\n this.statuses = result.statuses;\n this.skipped = result.skipped;\n // Clamp selected index in case server count changed\n const total = this.getTotalItems();\n if (this.selectedIndex >= total) {\n this.selectedIndex = Math.max(0, total - 1);\n }\n const connected = result.statuses.filter(s => s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n this.showInfoCallback(`MCP: Reloaded. ${connected.length} server(s) connected, ${totalTools} tool(s).`);\n for (const s of result.statuses.filter(s => !s.connected)) {\n this.showInfoCallback(`MCP: Failed to connect to \"${s.name}\": ${s.error ?? 'Unknown error'}`);\n }\n })\n .catch(() => {\n this.showInfoCallback('MCP: Reload failed. Retrying may help.');\n })\n .finally(() => {\n this._reloading = false;\n this.updateList();\n });\n }\n\n private doReconnectServer(status: McpServerStatus): void {\n if (status.connecting) return;\n const name = status.name;\n\n // Mark this server as connecting\n const idx = this.statuses.findIndex(s => s.name === name);\n if (idx >= 0) {\n this.statuses[idx] = {\n name,\n connected: false,\n connecting: true,\n toolCount: 0,\n toolNames: [],\n transport: status.transport,\n };\n }\n this.updateList();\n\n this.onReconnectServerCallback(name)\n .then((updated: McpServerStatus) => {\n // If a reload-all started, ignore stale reconnect results\n if (this._reloading) return;\n const i = this.statuses.findIndex(s => s.name === name);\n if (i >= 0) {\n this.statuses[i] = updated;\n }\n if (updated.connected) {\n this.showInfoCallback(`MCP: Reconnected \"${name}\" — ${updated.toolCount} tool(s)`);\n } else {\n this.showInfoCallback(`MCP: Failed to reconnect \"${name}\": ${updated.error ?? 'Unknown error'}`);\n }\n })\n .catch((err: unknown) => {\n if (this._reloading) return;\n const errMsg = err instanceof Error ? err.message : String(err);\n const i = this.statuses.findIndex(s => s.name === name);\n if (i >= 0) {\n this.statuses[i] = {\n name,\n connected: false,\n connecting: false,\n toolCount: 0,\n toolNames: [],\n transport: status.transport,\n error: errMsg,\n };\n }\n this.showInfoCallback(`MCP: Failed to reconnect \"${name}\": ${errMsg}`);\n })\n .finally(() => {\n if (!this._reloading) {\n this.updateList();\n }\n });\n }\n\n private showToolList(status: McpServerStatus): void {\n this.listContainer.clear();\n\n this.listContainer.addChild(\n new Text(theme.bold(`Tools for ${status.name}`) + theme.fg('muted', ` (${status.toolCount})`), 0, 0),\n );\n this.listContainer.addChild(new Spacer(1));\n\n if (status.toolNames.length === 0) {\n this.listContainer.addChild(new Text(theme.fg('muted', 'No tools available'), 0, 0));\n } else {\n for (const toolName of status.toolNames) {\n this.listContainer.addChild(new Text(` ${theme.fg('muted', '–')} ${toolName}`, 0, 0));\n }\n }\n\n this.listContainer.addChild(new Spacer(1));\n this.listContainer.addChild(new Text(theme.fg('muted', 'Press Esc to go back'), 0, 0));\n\n this._detailView = true;\n this.tui.requestRender();\n }\n\n private showError(status: McpServerStatus): void {\n this.listContainer.clear();\n\n this.listContainer.addChild(new Text(theme.bold(`Error for ${status.name}`), 0, 0));\n this.listContainer.addChild(new Spacer(1));\n this.listContainer.addChild(new Text(theme.fg('error', status.error ?? 'Unknown error'), 0, 0));\n this.listContainer.addChild(new Spacer(1));\n this.listContainer.addChild(new Text(theme.fg('muted', 'Press Esc to go back'), 0, 0));\n\n this._detailView = true;\n this.tui.requestRender();\n }\n\n private showLogs(status: McpServerStatus): void {\n this.listContainer.clear();\n\n const logs = this.getServerLogsCallback(status.name);\n\n this.listContainer.addChild(\n new Text(theme.bold(`Logs for ${status.name}`) + theme.fg('muted', ` (${logs.length} lines)`), 0, 0),\n );\n this.listContainer.addChild(new Spacer(1));\n\n if (logs.length === 0) {\n const hint =\n status.transport === 'http'\n ? 'No logs available (HTTP servers do not produce stderr output)'\n : 'No logs captured yet';\n this.listContainer.addChild(new Text(theme.fg('muted', hint), 0, 0));\n } else {\n // Show last 50 lines to avoid overwhelming the overlay\n const tail = logs.slice(-50);\n if (logs.length > 50) {\n this.listContainer.addChild(\n new Text(theme.fg('muted', ` ... ${logs.length - 50} earlier lines omitted`), 0, 0),\n );\n }\n for (const line of tail) {\n this.listContainer.addChild(new Text(theme.fg('muted', ` ${line}`), 0, 0));\n }\n }\n\n this.listContainer.addChild(new Spacer(1));\n this.listContainer.addChild(new Text(theme.fg('muted', 'Press Esc to go back'), 0, 0));\n\n this._detailView = true;\n this.tui.requestRender();\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 /** Extra diagnostic detail to surface to the user */\n detail?: string;\n /** Request URL involved in the failure, when available */\n requestUrl?: 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 */\nfunction summarizeErrorDetail(error: unknown): string | undefined {\n if (error instanceof Error) {\n if (error.cause instanceof Error && error.cause.message) {\n return error.cause.message;\n }\n\n if (typeof error.cause === 'string' && error.cause.trim().length > 0) {\n return error.cause;\n }\n\n if (error.message.trim().length > 0) {\n return error.message;\n }\n }\n\n if (typeof error === 'string' && error.trim().length > 0) {\n return error;\n }\n\n if (error && typeof error === 'object') {\n const errorObj = error as Record<string, unknown>;\n const candidates = [errorObj['message'], errorObj['cause'], errorObj['code'], errorObj['statusText']];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n return candidate;\n }\n }\n }\n\n return undefined;\n}\n\nfunction extractRequestUrl(error: unknown): string | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidates: unknown[] = [];\n const errorObj = error as Record<string, unknown>;\n candidates.push(errorObj['requestUrl'], errorObj['url']);\n\n if (errorObj['cause'] && typeof errorObj['cause'] === 'object') {\n const causeObj = errorObj['cause'] as Record<string, unknown>;\n candidates.push(causeObj['requestUrl'], causeObj['url']);\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n return candidate;\n }\n }\n\n return undefined;\n}\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 const detail = summarizeErrorDetail(error);\n const requestUrl = extractRequestUrl(error);\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 detail,\n requestUrl,\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 detail,\n requestUrl,\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 while contacting the provider or gateway.',\n detail,\n requestUrl,\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 = 'Mastra Code';\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 if (parsed.detail && parsed.detail !== parsed.message) {\n errorText += theme.fg('muted', ` (${parsed.detail})`);\n }\n if (parsed.requestUrl) {\n errorText += theme.fg('muted', ` [url: ${parsed.requestUrl}]`);\n }\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","import { McpSelectorComponent } from '../components/mcp-selector.js';\nimport { showInfo } from '../display.js';\nimport 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\n // /mcp reload — reconnect all servers (also available from the selector)\n if (subcommand === 'reload') {\n await reloadServers(ctx);\n return;\n }\n\n // /mcp status — text-only status dump (non-interactive fallback)\n if (subcommand === 'status') {\n showTextStatus(ctx);\n return;\n }\n\n const paths = mm.getConfigPaths();\n\n // No servers? Show setup instructions.\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 // Default: show interactive selector overlay\n const statuses = mm.getServerStatuses();\n const skipped = mm.getSkippedServers();\n\n const selector = new McpSelectorComponent({\n tui: ctx.state.ui,\n statuses,\n skipped,\n configPaths: paths,\n getStatuses: () => ({\n statuses: mm.getServerStatuses(),\n skipped: mm.getSkippedServers(),\n }),\n onReloadAll: async () => {\n await mm.reload();\n return {\n statuses: mm.getServerStatuses(),\n skipped: mm.getSkippedServers(),\n };\n },\n onReconnectServer: async (name: string) => {\n return mm.reconnectServer(name);\n },\n getServerLogs: (name: string) => {\n return mm.getServerLogs(name);\n },\n showInfo: (msg: string) => {\n showInfo(ctx.state, msg);\n },\n onClose: () => {\n selector.dispose();\n ctx.state.ui.hideOverlay();\n },\n });\n\n ctx.state.ui.showOverlay(selector, {\n width: '80%',\n maxHeight: '70%',\n anchor: 'center',\n });\n selector.focused = true;\n}\n\nasync function reloadServers(ctx: SlashCommandContext): Promise<void> {\n const mm = ctx.mcpManager;\n if (!mm) return;\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 for (const s of statuses.filter(s => !s.connected)) {\n ctx.showInfo(`MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n } catch (error) {\n ctx.showError(`MCP reload failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nfunction showTextStatus(ctx: SlashCommandContext): void {\n const mm = ctx.mcpManager;\n if (!mm) return;\n const paths = mm.getConfigPaths();\n const statuses = mm.getServerStatuses();\n const skipped = mm.getSkippedServers();\n\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.connecting ? '⟳' : status.connected ? '\\u2713' : '\\u2717';\n const state = status.connecting ? 'connecting...' : 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 ' .mastracode/skills/ (project-local)\\n' +\n ' .claude/skills/ (project-local)\\n' +\n ' .agents/skills/ (project-local)\\n' +\n ' ~/.mastracode/skills/ (global)\\n' +\n ' ~/.claude/skills/ (global)\\n' +\n ' ~/.agents/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 async function handleNewCommand(ctx: SlashCommandContext): Promise<void> {\n const { state } = ctx;\n\n state.pendingNewThread = true;\n state.chatContainer.clear();\n state.pendingTools.clear();\n state.allToolComponents = [];\n state.allSlashCommandComponents = [];\n state.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\n // Clear file tracking in display state (thread_created will also reset this)\n state.harness.getDisplayState().modifiedFiles.clear();\n // Clear per-thread ephemeral state from the global harness state\n await state.harness.setState({ tasks: [], activePlan: null, sandboxAllowedPaths: [] });\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.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\n state.harness.getDisplayState().modifiedFiles.clear();\n // Clear per-thread ephemeral state from the global harness state\n await state.harness.setState({ tasks: [], activePlan: null, sandboxAllowedPaths: [] });\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.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\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.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\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 { BOX_INDENT, 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\n // Added lines\n if (line.startsWith('+')) {\n return addedColor(line);\n }\n\n // Removed lines\n if (line.startsWith('-')) {\n return removedColor(line);\n }\n\n // Hunk headers\n if (line.startsWith('@@')) {\n // Parse the @@ -start,count +start,count @@ format\n const match = line.match(/^(@@ .+? @@)(.*)/);\n if (match) {\n return hunkHeaderColor(match[1]) + metaColor(match[2] || '');\n }\n return hunkHeaderColor(line);\n }\n\n // Binary files, rename markers, etc.\n if (\n line.startsWith('diff ') ||\n line.startsWith('index ') ||\n line.startsWith('new file') ||\n line.startsWith('deleted file') ||\n line.startsWith('similarity index') ||\n line.startsWith('rename ')\n ) {\n return metaColor(line);\n }\n\n return metaColor(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(\n `${theme.fg('success', '✓')} ${theme.bold(theme.fg('muted', '$'))} ${theme.fg('text', command)}`,\n BOX_INDENT,\n 0,\n ),\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)}`, BOX_INDENT, 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 previews for currently visible threads */\n getMessagePreviews?: (threadIds: string[]) => Promise<Map<string, string>>;\n initialMessagePreviews?: Map<string, string>;\n initialAttemptedPreviewThreadIds?: Set<string>;\n onMessagePreviewsLoaded?: (previews: Map<string, string>, attemptedThreadIds: Set<string>) => void;\n}\n\nconst MAX_VISIBLE_THREADS = 12;\nconst INITIAL_PREVIEW_LOAD_COUNT = 24;\nconst PREVIEW_BATCH_SIZE = 2;\nconst INITIAL_PREVIEW_LOAD_DELAY_MS = 150;\nconst INTERACTION_PREVIEW_LOAD_DELAY_MS = 250;\nconst FOLLOW_UP_PREVIEW_LOAD_DELAY_MS = 50;\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 getMessagePreviews: ((threadIds: string[]) => Promise<Map<string, string>>) | undefined;\n private onMessagePreviewsLoaded:\n | ((previews: Map<string, string>, attemptedThreadIds: Set<string>) => void)\n | undefined;\n private messagePreviews: Map<string, string>;\n private attemptedPreviewThreadIds: Set<string>;\n private loadingPreviewThreadIds: Set<string> = new Set();\n private previewLoadVersion = 0;\n private previewLoadTimeout: ReturnType<typeof setTimeout> | null = null;\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.getMessagePreviews = options.getMessagePreviews;\n this.onMessagePreviewsLoaded = options.onMessagePreviewsLoaded;\n this.messagePreviews = new Map(options.initialMessagePreviews ?? []);\n this.attemptedPreviewThreadIds = new Set(options.initialAttemptedPreviewThreadIds ?? []);\n this.filteredThreads = this.allThreads;\n\n this.buildUI();\n this.scheduleMessagePreviewLoad({ initialLoad: true });\n }\n\n private getVisibleRange(): { startIndex: number; endIndex: number } {\n const startIndex = Math.max(\n 0,\n Math.min(\n this.selectedIndex - Math.floor(MAX_VISIBLE_THREADS / 2),\n this.filteredThreads.length - MAX_VISIBLE_THREADS,\n ),\n );\n const endIndex = Math.min(startIndex + MAX_VISIBLE_THREADS, this.filteredThreads.length);\n return { startIndex, endIndex };\n }\n\n private getVisibleThreads(): HarnessThread[] {\n const { startIndex, endIndex } = this.getVisibleRange();\n return this.filteredThreads.slice(startIndex, endIndex);\n }\n\n private getPreviewCandidates(initialLoad: boolean): HarnessThread[] {\n const initialThreads = initialLoad ? this.filteredThreads.slice(0, INITIAL_PREVIEW_LOAD_COUNT) : [];\n const combinedThreads = [...initialThreads, ...this.getVisibleThreads()];\n const uniqueThreads = combinedThreads.filter(\n (thread, index, threads) => threads.findIndex(t => t.id === thread.id) === index,\n );\n\n const prioritizedThreads = uniqueThreads.filter(\n thread =>\n thread.resourceId === this.currentResourceId &&\n typeof thread.metadata?.projectPath === 'string' &&\n thread.metadata.projectPath === this.currentProjectPath,\n );\n const remainingThreads = uniqueThreads.filter(thread => !prioritizedThreads.some(t => t.id === thread.id));\n\n return [...prioritizedThreads, ...remainingThreads].filter(\n thread =>\n !this.messagePreviews.has(thread.id) &&\n !this.attemptedPreviewThreadIds.has(thread.id) &&\n !this.loadingPreviewThreadIds.has(thread.id),\n );\n }\n\n private scheduleMessagePreviewLoad({\n initialLoad = false,\n delayMs,\n }: { initialLoad?: boolean; delayMs?: number } = {}): void {\n const previewDelayMs = delayMs ?? (initialLoad ? INITIAL_PREVIEW_LOAD_DELAY_MS : FOLLOW_UP_PREVIEW_LOAD_DELAY_MS);\n\n if (this.previewLoadTimeout) {\n clearTimeout(this.previewLoadTimeout);\n }\n\n this.previewLoadTimeout = setTimeout(() => {\n this.previewLoadTimeout = null;\n void this.loadMessagePreviews({ initialLoad });\n }, previewDelayMs);\n }\n\n private async loadMessagePreviews({ initialLoad = false }: { initialLoad?: boolean } = {}): Promise<void> {\n if (!this.getMessagePreviews) return;\n\n const version = ++this.previewLoadVersion;\n const candidates = this.getPreviewCandidates(initialLoad);\n const threadIds = candidates.slice(0, PREVIEW_BATCH_SIZE).map(thread => thread.id);\n\n if (threadIds.length === 0) return;\n\n threadIds.forEach(threadId => this.loadingPreviewThreadIds.add(threadId));\n this.updateList();\n this.tui.requestRender();\n\n try {\n const previews = await this.getMessagePreviews(threadIds);\n if (version !== this.previewLoadVersion) return;\n\n threadIds.forEach(threadId => this.attemptedPreviewThreadIds.add(threadId));\n\n for (const [threadId, preview] of previews) {\n if (preview) {\n this.messagePreviews.set(threadId, preview);\n }\n }\n\n this.onMessagePreviewsLoaded?.(new Map(this.messagePreviews), new Set(this.attemptedPreviewThreadIds));\n } catch {\n // Ignore errors, previews will just be empty\n } finally {\n threadIds.forEach(threadId => this.loadingPreviewThreadIds.delete(threadId));\n }\n\n this.updateList();\n this.tui.requestRender();\n\n if (candidates.length > PREVIEW_BATCH_SIZE) {\n this.scheduleMessagePreviewLoad({ initialLoad, delayMs: FOLLOW_UP_PREVIEW_LOAD_DELAY_MS });\n }\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 this.scheduleMessagePreviewLoad({ initialLoad: true });\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 startIndex = Math.max(\n 0,\n Math.min(\n this.selectedIndex - Math.floor(MAX_VISIBLE_THREADS / 2),\n this.filteredThreads.length - MAX_VISIBLE_THREADS,\n ),\n );\n const endIndex = Math.min(startIndex + MAX_VISIBLE_THREADS, 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 // Show thread title when available, except the default placeholder title.\n const displayTitle = thread.title && thread.title !== 'New Thread' ? thread.title : null;\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 if (displayTitle) {\n this.listContainer.addChild(new Text(` ${theme.fg('muted', displayTitle)}`, 0, 0));\n } else {\n const preview = this.messagePreviews.get(thread.id);\n if (preview) {\n this.listContainer.addChild(new Text(` ${theme.fg('dim', `\"${preview}\"`)}`, 0, 0));\n }\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 this.scheduleMessagePreviewLoad({ delayMs: INTERACTION_PREVIEW_LOAD_DELAY_MS });\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 this.scheduleMessagePreviewLoad({ delayMs: INTERACTION_PREVIEW_LOAD_DELAY_MS });\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 this.scheduleMessagePreviewLoad({ delayMs: INTERACTION_PREVIEW_LOAD_DELAY_MS });\n }\n }\n}\n","import { Spacer } from '@mariozechner/pi-tui';\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\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 const threadById = new Map(threads.map(thread => [thread.id, thread] as const));\n\n for (const [threadId, cachedPreview] of [...state.threadPreviewCache.entries()]) {\n const thread = threadById.get(threadId);\n if (!thread || cachedPreview.updatedAt < thread.updatedAt.getTime()) {\n state.threadPreviewCache.delete(threadId);\n state.attemptedThreadPreviewIds.delete(threadId);\n }\n }\n\n for (const threadId of [...state.attemptedThreadPreviewIds]) {\n if (!threadById.has(threadId)) {\n state.attemptedThreadPreviewIds.delete(threadId);\n }\n }\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 initialMessagePreviews: new Map(\n [...state.threadPreviewCache.entries()].map(\n ([threadId, cachedPreview]) => [threadId, cachedPreview.preview] as const,\n ),\n ),\n initialAttemptedPreviewThreadIds: state.attemptedThreadPreviewIds,\n onMessagePreviewsLoaded: (previews, attemptedThreadIds) => {\n state.threadPreviewCache = new Map(\n [...previews.entries()].flatMap(([threadId, preview]) => {\n const thread = threadById.get(threadId);\n return thread ? [[threadId, { preview, updatedAt: thread.updatedAt.getTime() }] as const] : [];\n }),\n );\n state.attemptedThreadPreviewIds = attemptedThreadIds;\n },\n getMessagePreviews: async (threadIds: string[]) => {\n return new Map(\n threadIds.flatMap(threadId => {\n const preview = state.threadPreviewCache.get(threadId)?.preview;\n return preview ? [[threadId, preview] as const] : [];\n }),\n );\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.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\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 type { SlashCommandContext } from './types.js';\n\nfunction formatDateWithLocal(date: Date): string {\n return `${date.toISOString()} [${date.toLocaleString()}]`;\n}\n\nexport async function handleThreadCommand(ctx: SlashCommandContext): Promise<void> {\n const { harness, state } = ctx;\n const currentThreadId = harness.getCurrentThreadId();\n const currentResourceId = harness.getResourceId();\n const isPendingNewThread = state.pendingNewThread;\n\n if (!currentThreadId) {\n const lines = ['No active thread.', `Resource: ${currentResourceId}`];\n\n if (isPendingNewThread) {\n lines.push('Pending new thread: yes');\n }\n\n ctx.showInfo(lines.join('\\n'));\n return;\n }\n\n const threads = await harness.listThreads({ allResources: true });\n const thread = threads.find(t => t.id === currentThreadId);\n\n const cloneMetadata =\n thread?.metadata && typeof thread.metadata === 'object'\n ? (thread.metadata as { clone?: { sourceThreadId?: string; clonedAt?: Date | string } }).clone\n : undefined;\n\n const lines = [\n `Title: ${thread?.title?.trim() || '(untitled)'}`,\n `ID: ${currentThreadId}`,\n `Resource: ${thread?.resourceId ?? currentResourceId}`,\n ];\n\n if (thread) {\n lines.push(`Created: ${formatDateWithLocal(thread.createdAt)}`);\n lines.push(`Updated: ${formatDateWithLocal(thread.updatedAt)}`);\n }\n\n if (isPendingNewThread) {\n lines.push('Pending new thread: yes');\n }\n\n if (cloneMetadata?.sourceThreadId) {\n lines.push(`Forked from: ${cloneMetadata.sourceThreadId}`);\n if (cloneMetadata.clonedAt) {\n const clonedAt =\n cloneMetadata.clonedAt instanceof Date ? cloneMetadata.clonedAt : new Date(cloneMetadata.clonedAt);\n lines.push(`Forked at: ${formatDateWithLocal(clonedAt)}`);\n }\n }\n\n ctx.showInfo(lines.join('\\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 * 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 * Write plain text to the system clipboard.\n * Returns true on success, false on failure.\n */\nexport function setClipboardText(text: string): boolean {\n try {\n if (process.platform === 'darwin') {\n execSync('pbcopy', {\n input: text,\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return true;\n }\n if (process.platform === 'linux') {\n try {\n execSync('xclip -selection clipboard', {\n input: text,\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return true;\n } catch {\n execSync('wl-copy', {\n input: text,\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return true;\n }\n }\n return false;\n } catch {\n return false;\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 * 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// Helpers\n// =============================================================================\n\n/**\n * Build a synthetic \"Use: <id>\" ModelItem for an arbitrary model id typed by\n * the user. The provider prefix is parsed from the id; key metadata is\n * derived from any sibling model that already lives under the same provider\n * so the API-key prompt still fires for known providers without a key.\n *\n * If no sibling is found (truly novel provider), we default `hasApiKey: false`\n * so the user is still prompted for a key by provider name.\n */\nexport function makeCustomModelItem(id: string, models: ModelItem[]): 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 const sibling = models.find(m => m.provider === provider);\n return {\n id,\n provider,\n modelName,\n hasApiKey: sibling?.hasApiKey ?? false,\n apiKeyEnvVar: sibling?.apiKeyEnvVar,\n };\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 return makeCustomModelItem(id, this.allModels);\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","/**\n * MaskedInput - wraps pi-tui's Input to obscure displayed text with asterisks.\n * The actual value is preserved; only the rendered output is masked.\n */\n\nimport { Input } from '@mariozechner/pi-tui';\nimport type { Component, Focusable } from '@mariozechner/pi-tui';\n\nexport class MaskedInput implements Component, Focusable {\n private input: Input;\n\n get focused(): boolean {\n return this.input.focused;\n }\n set focused(value: boolean) {\n this.input.focused = value;\n }\n\n set onSubmit(fn: ((value: string) => void) | undefined) {\n this.input.onSubmit = fn;\n }\n\n set onEscape(fn: (() => void) | undefined) {\n this.input.onEscape = fn;\n }\n\n constructor() {\n this.input = new Input();\n }\n\n getValue(): string {\n return this.input.getValue();\n }\n\n setValue(value: string): void {\n this.input.setValue(value);\n }\n\n handleInput(data: string): void {\n this.input.handleInput(data);\n }\n\n invalidate(): void {\n this.input.invalidate();\n }\n\n render(width: number): string[] {\n // Temporarily swap the value to masked characters, render, then restore.\n const real = this.input.getValue();\n try {\n this.input.setValue('*'.repeat(real.length));\n return this.input.render(width);\n } finally {\n this.input.setValue(real);\n }\n }\n}\n","/**\n * API key input dialog component.\n * Shown when a user selects a model that doesn't have an API key configured.\n * Allows entering a key or cancelling to proceed without one.\n */\n\nimport { Box, getEditorKeybindings, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\nimport { MaskedInput } from './masked-input.js';\n\nexport interface ApiKeyDialogOptions {\n /** Provider name shown in the title (e.g., \"Google\") */\n providerName: string;\n /** Environment variable name hint (e.g., \"GOOGLE_GENERATIVE_AI_API_KEY\") */\n apiKeyEnvVar?: string;\n /** Called with the entered key when the user submits */\n onSubmit: (key: string) => void;\n /** Called when the user cancels */\n onCancel: () => void;\n}\n\nexport class ApiKeyDialogComponent extends Box implements Focusable {\n private input: MaskedInput;\n private onSubmit: (key: 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 this.input.focused = value;\n }\n\n constructor(options: ApiKeyDialogOptions) {\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', `API Key Required`)), 0, 0));\n this.addChild(new Spacer(1));\n\n // Description\n this.addChild(new Text(theme.fg('text', `Enter an API key for ${options.providerName}:`), 0, 0));\n if (options.apiKeyEnvVar) {\n this.addChild(new Text(theme.fg('dim', `You can also set ${options.apiKeyEnvVar} in your environment.`), 0, 0));\n }\n this.addChild(new Spacer(1));\n\n // Input\n this.input = new MaskedInput();\n this.input.onSubmit = (value: string) => {\n const trimmed = value.trim();\n if (trimmed) {\n this.onSubmit(trimmed);\n } else {\n this.onCancel();\n }\n };\n this.addChild(this.input);\n this.addChild(new Spacer(1));\n\n // Hints\n this.addChild(new Text(theme.fg('dim', ' Enter to submit · Esc to cancel'), 0, 0));\n }\n\n handleInput(data: string): void {\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 * Shared helper: prompt user for an API key when they select a model without one.\n */\n\nimport type { TUI } from '@mariozechner/pi-tui';\nimport type { AuthStorage } from '../auth/storage.js';\nimport { ApiKeyDialogComponent } from './components/api-key-dialog.js';\nimport type { ModelItem } from './components/model-selector.js';\n\n/**\n * If the selected model doesn't have an API key, show a dialog to enter one.\n * Returns the model ID on success or when cancelled (same behavior — cancelling\n * just means no key was stored, but the model is still selected).\n *\n * Resolves after the user submits or cancels the dialog.\n */\nexport function promptForApiKeyIfNeeded(\n ui: TUI,\n model: ModelItem,\n authStorage: AuthStorage | undefined,\n): Promise<void> {\n // Model already has a key (env var or stored) — nothing to do\n if (model.hasApiKey || !authStorage) {\n return Promise.resolve();\n }\n\n return new Promise<void>(resolve => {\n const dialog = new ApiKeyDialogComponent({\n providerName: model.provider,\n apiKeyEnvVar: model.apiKeyEnvVar,\n onSubmit: (key: string) => {\n ui.hideOverlay();\n // Store the key and set env var so model resolution picks it up\n authStorage.setStoredApiKey(model.provider, key, model.apiKeyEnvVar);\n resolve();\n },\n onCancel: () => {\n ui.hideOverlay();\n resolve();\n },\n });\n\n ui.showOverlay(dialog, {\n width: '70%',\n maxHeight: '50%',\n anchor: 'center',\n });\n dialog.focused = true;\n });\n}\n","import chalk from 'chalk';\nimport { getThemeMode } from '../theme.js';\n\nconst GRADIENT_WIDTH = 30; // Width of the bright spot as percentage of total text\nconst BASE_COLOR = [22, 200, 88]; // Brand green #16c858\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 green 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 const halfGradient = GRADIENT_WIDTH / 2;\n const minBrightness = getMinBrightness();\n const brightnessRange = 1 - minBrightness;\n\n // Batch consecutive chars with same RGB to reduce chalk.rgb() calls\n let result = '';\n let batchChars = '';\n let batchR = -1,\n batchG = -1,\n batchB = -1;\n\n for (let i = 0; i < totalChars; i++) {\n const char = chars[i]!;\n if (char === ' ') {\n // Flush current batch before space\n if (batchChars) {\n result += chalk.rgb(batchR, batchG, batchB)(batchChars);\n batchChars = '';\n }\n result += ' ';\n continue;\n }\n\n const charPosition = (i / totalChars) * 100;\n let distance = Math.abs(charPosition - gradientCenter);\n if (distance > 50) distance = 100 - distance;\n\n const normalizedDistance = Math.min(distance / halfGradient, 1);\n const animBrightness = minBrightness + brightnessRange * (1 - normalizedDistance);\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 // If same color as current batch, append; otherwise flush and start new batch\n if (r === batchR && g === batchG && b === batchB) {\n batchChars += char;\n } else {\n if (batchChars) {\n result += chalk.rgb(batchR, batchG, batchB)(batchChars);\n }\n batchChars = char;\n batchR = r;\n batchG = g;\n batchB = b;\n }\n }\n\n if (batchChars) {\n result += chalk.rgb(batchR, batchG, batchB)(batchChars);\n }\n\n return result;\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._isFadingIn = false;\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._isFadingIn = 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 isFadingIn(): boolean {\n return this._isFadingIn;\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('#71717a')(text); // Zinc-500\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 buffered =\n compact !== 'noBuffer' && state.buffered.observations.projectedMessageRemoval > 0\n ? chalk.italic(\n theme.fg('muted', ` ↓${formatTokensThreshold(state.buffered.observations.projectedMessageRemoval)}`),\n )\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 savings = state.buffered.reflection.inputObservationTokens - state.buffered.reflection.observationTokens;\n const buffered =\n compact !== 'noBuffer' && state.buffered.reflection.status === 'complete' && savings > 0\n ? chalk.italic(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 { applyGradientSweep } from './components/obi-loader.js';\nimport { formatObservationStatus, formatReflectionStatus } from './components/om-progress.js';\nimport type { TUIState } from './state.js';\nimport { theme, mastra, tintHex, getTermWidth } from './theme.js';\n\n// Colors for OM modes — read from proxy at render time so they pick up contrast adaptation\nconst getObserverColor = () => mastra.orange;\nconst getReflectorColor = () => mastra.pink;\n\n/** Returns true if a thread title is generic/auto-generated and should not be displayed. */\nfunction isGenericTitle(title: string): boolean {\n const lower = title.toLowerCase().trim();\n return (\n lower === 'new thread' ||\n lower.startsWith('new thread') ||\n lower.startsWith('clone of') ||\n lower.startsWith('untitled')\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 = getTermWidth();\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 ? getObserverColor() : getReflectorColor()) : mainModeColor;\n // Tinted near-black background from mode color (shared between badge and model ID)\n const tintBg = modeColor ? tintHex(modeColor, 0.15) : undefined;\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 const easedFade = fade * fade * (3 - 2 * fade); // smoothstep\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) * easedFade;\n }\n const mr = Math.floor(mcr * badgeBrightness);\n const mg = Math.floor(mcg * badgeBrightness);\n const mb = Math.floor(mcb * badgeBrightness);\n const rightHalf = tintBg ? chalk.rgb(mr, mg, mb).bgHex(tintBg)('▌') : chalk.rgb(mr, mg, mb)('▌');\n modeBadge =\n chalk.rgb(mr, mg, mb)('▐') + chalk.bgRgb(mr, mg, mb).hex('#000000').bold(badgeName.toLowerCase()) + rightHalf;\n modeBadgeWidth = badgeName.length + 2;\n } else if (badgeName) {\n modeBadge = ' ' + theme.fg('dim', badgeName) + ' ';\n modeBadgeWidth = badgeName.length + 2;\n }\n\n // --- Collect raw data ---\n // Show OM model when observing/reflecting, otherwise main model\n const rawModelId =\n (showOMMode\n ? isObserving\n ? state.harness.getObserverModelId()\n : state.harness.getReflectorModelId()\n : state.harness.getFullModelId()) ?? '';\n // Rewrite Fireworks AI long paths: fireworks-ai/accounts/fireworks/models/<name> → fireworks/<name>\n let fullModelId = rawModelId.startsWith('fireworks-ai/accounts/fireworks/models/')\n ? 'fireworks/' + rawModelId.slice('fireworks-ai/accounts/fireworks/models/'.length)\n : rawModelId;\n // Rewrite version separators where 'p' stands for '.': e.g. kimi-k2p6 → kimi-k2.6, minimax-m2p7 → minimax-m2.7\n fullModelId = fullModelId.replace(/\\b([a-z]+-[a-z])(\\d+)p(\\d+)\\b/g, '$1$2.$3');\n const compactModelId = (modelId: string): string => {\n const parts = modelId.split('/');\n if (parts.length >= 3) {\n return `${parts[0]}/${parts.at(-1)!}`;\n }\n if (parts.length === 2) {\n return parts[1] ?? modelId;\n }\n return modelId;\n };\n\n // e.g. \"anthropic/claude-sonnet-4-20250514\" → \"claude-sonnet-4-20250514\"\n // e.g. \"mastra/anthropic/claude-opus-4.6\" → \"mastra/claude-opus-4.6\"\n const shortModelId = compactModelId(fullModelId);\n // e.g. \"claude-opus-4-6\" → \"opus 4.6\", \"mastra/anthropic/claude-opus-4.6\" → \"mastra/claude-opus-4.6\"\n const tinyModelId = shortModelId.includes('/')\n ? shortModelId\n : shortModelId.replace(/^claude-/, '').replace(/^(\\w+)-(\\d+)-(\\d{1,2})$/, '$1 $2.$3');\n\n const homedir = process.env.HOME || process.env.USERPROFILE || '';\n // Use thread title if available and not generic, otherwise use project root path\n const threadTitle =\n state.currentThreadTitle && !isGenericTitle(state.currentThreadTitle) ? state.currentThreadTitle : null;\n let displayPath = threadTitle || state.projectInfo.rootPath;\n if (!threadTitle && 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 // Only show branch when not showing thread title (thread title takes priority)\n const dirFull = !threadTitle && branch ? `${displayPath} (${branch})` : displayPath;\n const dirBranchOnly = !threadTitle && branch ? branch : null;\n // Abbreviate long branches: keep first 12 + last 8 chars with \"..\" in between\n const dirBranchShort =\n !threadTitle && branch && branch.length > 24 ? branch.slice(0, 12) + '..' + branch.slice(-8) : dirBranchOnly;\n\n // --- Helper to style the model ID ---\n const modelTrail = tintBg ? chalk.hex(tintBg)('▌') : '';\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\n if (state.gradientAnimator?.isRunning() && modeColor) {\n const fade = state.gradientAnimator.getFadeProgress();\n const easedFade = fade * fade * (3 - 2 * fade); // smoothstep\n const text = applyGradientSweep(id, state.gradientAnimator.getOffset(), modeColor, easedFade);\n const styled = chalk.italic(text);\n const bg = tintBg ? chalk.bgHex(tintBg)(styled) : styled;\n return bg + modelTrail;\n }\n if (modeColor) {\n // Use same idle brightness as gradient animation convergence (0.8)\n // so there's no color jump when animation stops\n const [cr, cg, cb] = [\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n ];\n const idleBright = 0.8;\n const fgStyled = chalk\n .rgb(Math.floor(cr * idleBright), Math.floor(cg * idleBright), Math.floor(cb * idleBright))\n .bold.italic(id);\n const bg = tintBg ? chalk.bgHex(tintBg)(fgStyled) : fgStyled;\n return bg + modelTrail;\n }\n return chalk.hex(mastra.specialGray).bold.italic(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 = Math.floor(mcr * sBadgeBrightness);\n const sg = Math.floor(mcg * sBadgeBrightness);\n const sb = Math.floor(mcb * sBadgeBrightness);\n const shortRightHalf = tintBg ? chalk.rgb(sr, sg, sb).bgHex(tintBg)('▌') : chalk.rgb(sr, sg, sb)('▌');\n shortModeBadge =\n chalk.rgb(sr, sg, sb)('▐') + chalk.bgRgb(sr, sg, sb).hex('#000000').bold(shortName) + shortRightHalf;\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 + 2;\n }\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 parts.push({\n plain: `${opts.modelId}${tintBg ? ' ' : ''}`,\n styled: styleModelId(opts.modelId),\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 getObserverColor(),\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 getReflectorColor(),\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 / thread title (lowest priority on line 1)\n let dirText = opts.dir !== undefined ? opts.dir : opts.showDir ? dirFull : null;\n\n // Measure width of everything except dir to know how much space remains\n const nonDirWidth =\n useBadgeWidth + parts.reduce((sum, p, i) => sum + visibleWidth(p.plain) + (i > 0 ? SEP.length : 0), 0);\n\n if (dirText) {\n const availableForDir = termWidth - nonDirWidth - SEP.length - 1; // -1 buffer for ambiguous-width chars\n const dirWidth = visibleWidth(dirText);\n const MIN_TRUNCATED_DIR = 10; // don't show a tiny sliver\n if (dirWidth > availableForDir && availableForDir >= MIN_TRUNCATED_DIR) {\n // Truncate to fit the remaining space\n dirText = dirText.slice(0, availableForDir - 1) + '…';\n } else if (dirWidth > availableForDir) {\n // Not enough room even for a truncated version — drop it\n dirText = null;\n }\n }\n\n if (dirText) {\n parts.push({\n plain: dirText,\n styled: theme.fg('dim', dirText),\n });\n }\n const totalPlain =\n useBadgeWidth + parts.reduce((sum, p, i) => sum + visibleWidth(p.plain) + (i > 0 ? SEP.length : 0), 0);\n\n if (totalPlain + 1 > termWidth) return null; // +1 buffer for ambiguous-width chars (▐▌)\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 = 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 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 = 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 = 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(result?.styled ?? shortModeBadge + styleModelId(tinyModelId));\n\n // Line 2: hidden — dir only shows on line 1 when it fits\n if (state.memoryStatusLine) {\n state.memoryStatusLine.setText('');\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 { setClipboardText } from '../../clipboard/index.js';\nimport type { ModePack, ProviderAccess, ProviderAccessLevel } from '../../onboarding/packs.js';\nimport { getAvailableModePacks } from '../../onboarding/packs.js';\nimport {\n loadSettings,\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 { promptForApiKeyIfNeeded } from '../prompt-api-key.js';\nimport { updateStatusLine } from '../status-line.js';\nimport { getSelectListTheme, mastra, theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Pack sharing — serialize/deserialize\n// ---------------------------------------------------------------------------\n\nconst SHARE_PREFIX = 'mastra-pack:';\n\ninterface SharedPackPayload {\n name: string;\n models: { build: string; plan: string; fast: string };\n}\n\nexport function serializePack(pack: ModePack): string {\n const payload: SharedPackPayload = {\n name: pack.name,\n models: { build: pack.models.build, plan: pack.models.plan, fast: pack.models.fast },\n };\n return SHARE_PREFIX + Buffer.from(JSON.stringify(payload), 'utf-8').toString('base64');\n}\n\nexport function deserializePack(input: string): ModePack | null {\n try {\n const trimmed = input.trim();\n if (!trimmed.startsWith(SHARE_PREFIX)) return null;\n const json = Buffer.from(trimmed.slice(SHARE_PREFIX.length), 'base64').toString('utf-8');\n const parsed = JSON.parse(json) as Record<string, unknown>;\n\n const name = typeof parsed.name === 'string' ? parsed.name.trim() : '';\n if (!name) return null;\n\n const models = parsed.models as Record<string, unknown> | undefined;\n if (!models || typeof models !== 'object') return null;\n\n const build = typeof models.build === 'string' ? models.build : '';\n const plan = typeof models.plan === 'string' ? models.plan : '';\n const fast = typeof models.fast === 'string' ? models.fast : '';\n if (!build || !plan || !fast) return null;\n\n return {\n id: `custom:${name}`,\n name,\n description: 'Imported custom pack',\n models: { build, plan, fast },\n };\n } catch {\n return null;\n }\n}\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: async (model: ModelItem) => {\n ctx.state.ui.hideOverlay();\n await promptForApiKeyIfNeeded(ctx.state.ui, model, ctx.authStorage);\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): Promise<'activate' | 'edit' | 'share' | '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: 'share', label: 'Share', description: 'Copy to clipboard' },\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),\n edit: theme.fg('dim', ' Edit one setting at a time (Rename, plan, build, fast).'),\n share: theme.fg('dim', ' Copy shareable config to clipboard. Paste it to import elsewhere.'),\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' | 'share' | '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): Promise<'rename' | 'plan' | 'build' | 'fast' | 'save' | 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 { value: 'plan', label: ` ${chalk.hex(mastra.purple)('plan')} → ${theme.fg('text', pack.models.plan)}` },\n { value: 'build', label: ` ${chalk.hex(mastra.green)('build')} → ${theme.fg('text', pack.models.build)}` },\n { value: 'fast', label: ` ${chalk.hex(mastra.orange)('fast')} → ${theme.fg('text', pack.models.fast)}` },\n { value: 'save', label: ` ${theme.fg('success', 'Save')}` },\n ],\n 5,\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' | 'plan' | 'build' | 'fast' | 'save');\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 options?: { name?: string; models?: ModePack['models']; skipNamePrompt?: boolean },\n): Promise<ModePack | null> {\n const modes: Array<{ id: 'plan' | 'build' | 'fast'; label: string; color: string }> = [\n { id: 'plan', label: 'plan', color: mastra.purple },\n { id: 'build', label: 'build', color: mastra.green },\n { id: 'fast', label: 'fast', color: mastra.orange },\n ];\n\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 existing = options?.models ?? { build: '', plan: '', fast: '' };\n const models: Record<string, string> = {\n build: existing.build ?? '',\n plan: existing.plan ?? '',\n fast: existing.fast ?? '',\n };\n\n for (const mode of modes) {\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): 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);\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 modeColors: Record<'plan' | 'build' | 'fast', string> = {\n plan: mastra.purple,\n build: mastra.green,\n fast: mastra.orange,\n };\n\n const modelId = await selectModel(\n ctx,\n `Select model for ${editTarget} mode`,\n modeColors[editTarget],\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 =\n !!removedPack &&\n settings.models.modeDefaults.plan === removedPack.models.plan &&\n settings.models.modeDefaults.build === removedPack.models.build &&\n settings.models.modeDefaults.fast === removedPack.models.fast;\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\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 subagentModeMap: Record<string, string> = { explore: 'fast', plan: 'plan', execute: 'build' };\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 = loadSettings();\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): 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 [\n ` ${chalk.hex(mastra.purple)('plan')} → ${theme.fg('text', pack.models.plan)}`,\n ` ${chalk.hex(mastra.green)('build')} → ${theme.fg('text', pack.models.build)}`,\n ` ${chalk.hex(mastra.orange)('fast')} → ${theme.fg('text', pack.models.fast)}`,\n ].join('\\n');\n}\n\nasync function saveCustomPackEdits(ctx: SlashCommandContext, pack: ModePack, previousPackId?: string): Promise<void> {\n const settings = loadSettings();\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> = {\n plan: pack.models.plan,\n build: pack.models.build,\n fast: pack.models.fast,\n };\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 = loadSettings();\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\nfunction sharePack(ctx: SlashCommandContext, pack: ModePack): void {\n const serialized = serializePack(pack);\n const copied = setClipboardText(serialized);\n if (copied) {\n ctx.showInfo(`Copied ${pack.name} pack to clipboard`);\n } else {\n ctx.showInfo(`Share string for ${pack.name}:\\n${serialized}`);\n }\n}\n\nasync function askImportPackString(ctx: SlashCommandContext): Promise<string | null> {\n return new Promise(resolve => {\n const question = new AskQuestionInlineComponent(\n {\n question: 'Paste the shared model pack string',\n formatResult: answer => `Import: ${answer.slice(0, 40)}${answer.length > 40 ? '…' : ''}`,\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 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 askImportCollision(\n ctx: SlashCommandContext,\n existingName: string,\n): Promise<'overwrite' | 'rename' | 'cancel'> {\n const actions = [\n { id: 'overwrite', label: 'Overwrite', description: `Replace the existing \"${existingName}\" pack` },\n { id: 'rename', label: 'Rename', description: 'Choose a different name for the imported pack' },\n { id: 'cancel', label: 'Cancel', description: 'Abort import' },\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', `A pack named \"${existingName}\" already exists`)), 0, 0));\n container.addChild(new Spacer(1));\n\n const items: SelectItem[] = actions.map(a => ({\n value: a.id,\n label: ` ${a.label} ${theme.fg('dim', a.description)}`,\n }));\n\n const selectList = new SelectList(items, items.length, getSelectListTheme());\n\n selectList.onSelect = (selected: SelectItem) => {\n ctx.state.activeInlineQuestion = undefined;\n container.clear();\n container.addChild(new Text(theme.fg('dim', `${existingName}: ${selected.value}`), 0, 0));\n ctx.state.ui.requestRender();\n resolve(selected.value as 'overwrite' | 'rename' | 'cancel');\n };\n\n selectList.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n container.clear();\n container.addChild(new Text(theme.fg('dim', `${existingName}: cancelled`), 0, 0));\n ctx.state.ui.requestRender();\n resolve('cancel');\n };\n\n container.addChild(selectList);\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.chatContainer.addChild(new Spacer(1));\n ctx.state.ui.requestRender();\n ctx.state.chatContainer.invalidate();\n });\n}\n\nexport async function handleModelsPackCommand(ctx: SlashCommandContext): Promise<void> {\n const harness = ctx.state.harness;\n const models = await harness.listAvailableModels();\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 = loadSettings();\n const packs = getAvailableModePacks(access, settings.customModelPacks);\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 items.push({\n value: '__import__',\n label: ` Import Pack ${theme.fg('dim', 'Paste a shared pack config')}`,\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 if (packId === '__import__') {\n detailText.setText(theme.fg('dim', ' Paste a mastra-pack:... string from someone else to import their pack.'));\n ctx.state.ui.requestRender();\n return;\n }\n const pack = packs.find(p => p.id === packId);\n if (!pack) return;\n detailText.setText(getPackDetail(pack));\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 if (item.value === '__import__') {\n collapseResult(null);\n const importStr = await askImportPackString(ctx);\n if (!importStr) {\n collapseResult('cancelled');\n resolve();\n return;\n }\n const imported = deserializePack(importStr);\n if (!imported) {\n collapseResult('cancelled');\n ctx.showInfo('Invalid pack string. Expected a mastra-pack:... value.');\n resolve();\n return;\n }\n\n // Validate that the imported model IDs are available in this environment\n const availableModelIds = new Set(models.map(m => m.id));\n const unavailable = Object.entries(imported.models)\n .filter(([, modelId]) => !availableModelIds.has(modelId))\n .map(([mode, modelId]) => `${mode}: ${modelId}`);\n if (unavailable.length > 0) {\n collapseResult('cancelled');\n ctx.showInfo(`Can't import — these models aren't available:\\n${unavailable.join('\\n')}`);\n resolve();\n return;\n }\n\n // Handle name collision with existing custom pack\n const s = loadSettings();\n const existing = s.customModelPacks.find(p => p.name === imported.name);\n if (existing) {\n const collision = await askImportCollision(ctx, imported.name);\n if (collision === 'cancel') {\n collapseResult('cancelled');\n resolve();\n return;\n }\n if (collision === 'rename') {\n const newName = await askCustomPackName(ctx, imported.name);\n if (!newName) {\n collapseResult('cancelled');\n resolve();\n return;\n }\n if (s.customModelPacks.some(p => p.name === newName)) {\n collapseResult('cancelled');\n ctx.showInfo(`A custom pack named \"${newName}\" already exists. Rename or delete it first.`);\n resolve();\n return;\n }\n imported.name = newName;\n imported.id = `custom:${newName}`;\n }\n // collision === 'overwrite' falls through\n }\n\n await applyPack(ctx, imported);\n collapseResult(`Imported pack → ${theme.bold(imported.name)}`);\n ctx.showInfo(`Imported and activated ${imported.name} pack`);\n resolve();\n return;\n }\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);\n } else if (pack.id.startsWith('custom:')) {\n while (true) {\n const action = await askCustomPackAction(ctx, pack);\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 === 'share') {\n sharePack(ctx, pack);\n continue;\n }\n\n if (action === 'activate') {\n break;\n }\n\n const edited = await runCustomPackEditFlow(ctx, pack);\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, loadSettings, 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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\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 { loadSettings, 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 { promptForApiKeyIfNeeded } from '../prompt-api-key.js';\nimport type { SlashCommandContext } from './types.js';\n\nconst BUILT_IN_SUBAGENT_TYPES: Array<{ id: string; label: string; description: string }> = [\n {\n id: 'explore',\n label: 'Explore',\n description: 'Read-only codebase exploration',\n },\n {\n id: 'plan',\n label: 'Plan',\n description: 'Read-only analysis and planning',\n },\n {\n id: 'execute',\n label: 'Execute',\n description: 'Task execution with write access',\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 = 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 await promptForApiKeyIfNeeded(ctx.state.ui, model, ctx.authStorage);\n try {\n await ctx.state.harness.setSubagentModelId({ modelId: model.id, agentType });\n if (scope === 'global') {\n const settings = loadSettings();\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\nfunction getConfiguredSubagentTypes(\n ctx: SlashCommandContext,\n): Array<{ id: string; label: string; description: string }> {\n const harnessWithConfig = ctx.state.harness as unknown as {\n config?: {\n subagents?: Array<{ id: string; name: string; description: string }>;\n };\n };\n const configuredSubagents = harnessWithConfig.config?.subagents;\n\n return configuredSubagents && configuredSubagents.length > 0\n ? configuredSubagents.map(subagent => ({\n id: subagent.id,\n label: subagent.name,\n description: subagent.description,\n }))\n : BUILT_IN_SUBAGENT_TYPES;\n}\n\nexport async function handleSubagentsCommand(ctx: SlashCommandContext): Promise<void> {\n const agentTypes = getConfiguredSubagentTypes(ctx);\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: 'Select subagent type',\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 { Box, Container, Input, SelectList, SettingsList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, SettingItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSettingsListTheme, getSelectListTheme } from '../theme.js';\nimport { ModelSelectorComponent } from './model-selector.js';\nimport type { ModelItem } from './model-selector.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: (model: ModelItem) => void | Promise<void>;\n onReflectorModelChange: (model: ModelItem) => void | Promise<void>;\n onObservationThresholdChange: (value: number) => void;\n onReflectionThresholdChange: (value: number) => void;\n onClose: () => void;\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\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// 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: ModelItem[], 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 ModelSelectorComponent({\n tui,\n models,\n currentModelId: config.observerModelId,\n title: 'Observer Model',\n onSelect: async model => {\n await callbacks.onObserverModelChange(model);\n config.observerModelId = model.id;\n done(getShortModelName(model.id));\n },\n onCancel: () => done(),\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 ModelSelectorComponent({\n tui,\n models,\n currentModelId: config.reflectorModelId,\n title: 'Reflector Model',\n onSelect: async model => {\n await callbacks.onReflectorModelChange(model);\n config.reflectorModelId = model.id;\n done(getShortModelName(model.id));\n },\n onCancel: () => done(),\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 type { GlobalSettings } from '../../onboarding/settings.js';\nimport { loadSettings, saveSettings } from '../../onboarding/settings.js';\nimport { OMSettingsComponent } from '../components/om-settings.js';\nimport { promptForApiKeyIfNeeded } from '../prompt-api-key.js';\nimport type { SlashCommandContext } from './types.js';\n\n/**\n * Apply a role-specific OM model override to an in-memory `GlobalSettings`.\n *\n * When switching `activeOmPackId` from a built-in pack to `'custom'` we also\n * snapshot the *other* role's currently-resolved model into its override\n * field. Without this, the other role would silently lose its model on next\n * startup because `resolveOmRoleModel` would no longer resolve it from the\n * (now-overridden) pack.\n *\n * Exported for unit testing; `persistOmRoleOverride` is the disk-backed wrapper.\n */\nexport function applyOmRoleOverride(\n settings: GlobalSettings,\n role: 'observer' | 'reflector',\n modelId: string,\n otherRoleCurrentModelId: string | null,\n): void {\n const wasBuiltinPack = settings.models.activeOmPackId !== null && settings.models.activeOmPackId !== 'custom';\n\n if (role === 'observer') {\n if (wasBuiltinPack && otherRoleCurrentModelId && !settings.models.reflectorModelOverride) {\n settings.models.reflectorModelOverride = otherRoleCurrentModelId;\n }\n settings.models.observerModelOverride = modelId;\n } else {\n if (wasBuiltinPack && otherRoleCurrentModelId && !settings.models.observerModelOverride) {\n settings.models.observerModelOverride = otherRoleCurrentModelId;\n }\n settings.models.reflectorModelOverride = modelId;\n }\n\n settings.models.activeOmPackId = 'custom';\n}\n\nfunction persistOmRoleOverride(\n role: 'observer' | 'reflector',\n modelId: string,\n otherRoleCurrentModelId: string | null,\n): void {\n const settings = loadSettings();\n applyOmRoleOverride(settings, role, modelId, otherRoleCurrentModelId);\n saveSettings(settings);\n}\n\nfunction persistOmThresholds({\n observationThreshold,\n reflectionThreshold,\n}: {\n observationThreshold?: number;\n reflectionThreshold?: number;\n}): void {\n const settings = loadSettings();\n if (observationThreshold !== undefined) {\n settings.models.omObservationThreshold = observationThreshold;\n }\n if (reflectionThreshold !== undefined) {\n settings.models.omReflectionThreshold = reflectionThreshold;\n }\n saveSettings(settings);\n}\n\nexport async function handleOMCommand(ctx: SlashCommandContext): Promise<void> {\n const availableModels = await ctx.state.harness.listAvailableModels();\n\n const config = {\n observerModelId: ctx.state.harness.getObserverModelId() ?? '',\n reflectorModelId: ctx.state.harness.getReflectorModelId() ?? '',\n observationThreshold: ctx.state.harness.getObservationThreshold() ?? 30_000,\n reflectionThreshold: ctx.state.harness.getReflectionThreshold() ?? 40_000,\n };\n\n return new Promise<void>(resolve => {\n const settings = new OMSettingsComponent(\n config,\n {\n onObserverModelChange: async model => {\n await promptForApiKeyIfNeeded(ctx.state.ui, model, ctx.authStorage);\n const currentReflector = ctx.state.harness.getReflectorModelId() ?? null;\n await ctx.state.harness.switchObserverModel({ modelId: model.id });\n persistOmRoleOverride('observer', model.id, currentReflector);\n ctx.showInfo(`Observer model → ${model.id}`);\n },\n onReflectorModelChange: async model => {\n await promptForApiKeyIfNeeded(ctx.state.ui, model, ctx.authStorage);\n const currentObserver = ctx.state.harness.getObserverModelId() ?? null;\n await ctx.state.harness.switchReflectorModel({ modelId: model.id });\n persistOmRoleOverride('reflector', model.id, currentObserver);\n ctx.showInfo(`Reflector model → ${model.id}`);\n },\n onObservationThresholdChange: async value => {\n await ctx.state.harness.setState({ observationThreshold: value } as any);\n await ctx.state.harness.setThreadSetting({ key: 'observationThreshold', value });\n persistOmThresholds({ observationThreshold: value });\n },\n onReflectionThresholdChange: async value => {\n await ctx.state.harness.setState({ reflectionThreshold: value } as any);\n await ctx.state.harness.setThreadSetting({ key: 'reflectionThreshold', value });\n persistOmThresholds({ reflectionThreshold: value });\n },\n onClose: () => {\n ctx.state.ui.hideOverlay();\n ctx.updateStatusLine();\n resolve();\n },\n },\n availableModels,\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, 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 { MaskedInput } from './masked-input.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 onApiKeys?: () => 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!: MaskedInput;\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 MaskedInput();\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 if (callbacks.onApiKeys) {\n items.push({\n id: 'apiKeys',\n label: 'API Keys',\n description: 'Add, update, or remove API keys for model providers',\n currentValue: 'Manage →',\n submenu: (_currentValue, done) => {\n done();\n callbacks.onApiKeys!();\n return new Text('', 0, 0);\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 * /api-keys command: manage API keys for model providers.\n * Lists known providers with their key status and allows adding, updating, or removing keys.\n */\n\nimport { Box, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { SelectItem } from '@mariozechner/pi-tui';\n\nimport { ApiKeyDialogComponent } from '../components/api-key-dialog.js';\nimport type { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { getSelectListTheme, theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\ninterface InlineInputHandler {\n handleInput(data: string): void;\n}\n\ninterface ProviderInfo {\n provider: string;\n envVar?: string;\n source: 'env' | 'stored' | 'none';\n}\n\n/**\n * Build a deduplicated list of providers from available models,\n * annotated with their current key source.\n */\nfunction getProviderList(\n ctx: SlashCommandContext,\n models: { provider: string; hasApiKey: boolean; apiKeyEnvVar?: string }[],\n): ProviderInfo[] {\n const seen = new Map<string, ProviderInfo>();\n\n for (const model of models) {\n if (seen.has(model.provider)) continue;\n\n let source: ProviderInfo['source'] = 'none';\n if (ctx.authStorage?.hasStoredApiKey(model.provider)) {\n source = 'stored';\n } else if (model.apiKeyEnvVar && process.env[model.apiKeyEnvVar]) {\n source = 'env';\n } else if (model.hasApiKey) {\n source = 'env';\n }\n\n seen.set(model.provider, {\n provider: model.provider,\n envVar: model.apiKeyEnvVar,\n source,\n });\n }\n\n return Array.from(seen.values()).sort((a, b) => a.provider.localeCompare(b.provider));\n}\n\nfunction statusLabel(info: ProviderInfo): string {\n switch (info.source) {\n case 'env':\n return theme.fg('success', '✓') + theme.fg('dim', ' (env)');\n case 'stored':\n return theme.fg('success', '✓') + theme.fg('dim', ' (stored)');\n case 'none':\n return theme.fg('error', '✗') + theme.fg('dim', ' (not set)');\n }\n}\n\nfunction buildItems(providers: ProviderInfo[]): SelectItem[] {\n return providers.map(info => ({\n value: info.provider,\n label: ` ${info.provider} ${statusLabel(info)}${info.envVar ? theme.fg('dim', ` ${info.envVar}`) : ''}`,\n }));\n}\n\nexport async function handleApiKeysCommand(ctx: SlashCommandContext): Promise<void> {\n const models = await ctx.state.harness.listAvailableModels();\n let providers = getProviderList(ctx, models);\n\n if (providers.length === 0) {\n ctx.showInfo('No model providers found.');\n return;\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', 'API Keys')), 0, 0));\n container.addChild(new Spacer(1));\n\n const detailText = new Text('', 0, 0);\n\n // Track which provider is currently highlighted\n let currentSelection = providers[0]!.provider;\n\n const updateDetail = (providerName: string) => {\n const info = providers.find(p => p.provider === providerName);\n if (!info) return;\n if (info.source === 'env') {\n detailText.setText(\n theme.fg('dim', ' Key set via environment variable. To change it, update your shell environment.'),\n );\n } else if (info.source === 'stored') {\n detailText.setText(theme.fg('dim', ' Key stored locally. Press Enter to update or Delete to remove.'));\n } else {\n detailText.setText(theme.fg('dim', ' No key configured. Press Enter to add one.'));\n }\n ctx.state.ui.requestRender();\n };\n\n // Build a SelectList with all event handlers wired up.\n // Called on initial render and again after save/remove to refresh status labels.\n let selectList: SelectList;\n const buildSelectList = (): SelectList => {\n const items = buildItems(providers);\n const list = new SelectList(items, Math.min(items.length, 15), getSelectListTheme());\n\n list.onSelect = (item: SelectItem) => {\n const info = providers.find(p => p.provider === item.value);\n if (!info) return;\n\n if (info.source === 'env') {\n ctx.showInfo(\n `${info.provider} key is set via environment variable${info.envVar ? ` (${info.envVar})` : ''}. Update it in your shell environment.`,\n );\n return;\n }\n\n showKeyDialog(info);\n };\n\n list.onCancel = () => {\n ctx.state.activeInlineQuestion = undefined;\n container.clear();\n container.addChild(new Text(theme.fg('dim', `${theme.fg('error', '✗')} API Keys (closed)`), 0, 0));\n ctx.state.ui.requestRender();\n resolve();\n };\n\n list.onSelectionChange = (item: SelectItem) => {\n currentSelection = item.value;\n updateDetail(item.value);\n };\n\n // Handle Delete key to remove stored keys\n const originalHandleInput = list.handleInput.bind(list);\n list.handleInput = (data: string) => {\n // Delete or Backspace\n if (data === '\\x7f' || data === '\\x1b[3~') {\n const info = providers.find(p => p.provider === currentSelection);\n if (info?.source === 'stored' && ctx.authStorage) {\n ctx.authStorage.remove(`apikey:${info.provider}`);\n if (info.envVar) {\n delete process.env[info.envVar];\n }\n providers = getProviderList(ctx, models);\n ctx.showInfo(`API key removed for ${info.provider}`);\n rebuildList();\n }\n return;\n }\n originalHandleInput(data);\n };\n\n return list;\n };\n\n const rebuildList = () => {\n const selectedIdx = Math.max(\n 0,\n providers.findIndex(p => p.provider === currentSelection),\n );\n container.clear();\n container.addChild(new Text(theme.bold(theme.fg('accent', 'API Keys')), 0, 0));\n container.addChild(new Spacer(1));\n selectList = buildSelectList();\n selectList.setSelectedIndex(selectedIdx);\n currentSelection = providers[selectedIdx]?.provider ?? providers[0]!.provider;\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 add/update · Delete remove · Esc close'), 0, 0));\n updateDetail(currentSelection);\n ctx.state.ui.requestRender();\n };\n\n const showKeyDialog = (info: ProviderInfo) => {\n const dialog = new ApiKeyDialogComponent({\n providerName: info.provider,\n apiKeyEnvVar: info.envVar,\n onSubmit: (key: string) => {\n ctx.state.ui.hideOverlay();\n if (ctx.authStorage) {\n ctx.authStorage.setStoredApiKey(info.provider, key, info.envVar);\n ctx.showInfo(`API key saved for ${info.provider}`);\n providers = getProviderList(ctx, models);\n rebuildList();\n } else {\n ctx.showError('Unable to save API key: storage unavailable');\n }\n },\n onCancel: () => {\n ctx.state.ui.hideOverlay();\n },\n });\n\n ctx.state.ui.showOverlay(dialog, {\n width: '70%',\n maxHeight: '50%',\n anchor: 'center',\n });\n dialog.focused = true;\n };\n\n selectList = buildSelectList();\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 add/update · Delete remove · Esc close'), 0, 0));\n\n updateDetail(providers[0]!.provider);\n\n const inputShim: InlineInputHandler = { handleInput: (data: string) => selectList.handleInput(data) };\n ctx.state.activeInlineQuestion = inputShim as unknown as AskQuestionInlineComponent;\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 { StorageBackend, ThinkingLevelSetting } from '../../onboarding/settings.js';\nimport { loadSettings, saveSettings } from '../../onboarding/settings.js';\nimport { SettingsComponent } from '../components/settings.js';\nimport type { NotificationMode } from '../notify.js';\nimport { handleApiKeysCommand } from './api-keys.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 = loadSettings();\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 = loadSettings();\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 = loadSettings();\n current.preferences.quietMode = enabled;\n saveSettings(current);\n ctx.state.quietMode = enabled;\n },\n onStorageBackendChange: (backend: StorageBackend, connectionUrl?: string) => {\n const current = loadSettings();\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 onApiKeys: () => {\n ctx.state.ui.hideOverlay();\n resolve();\n handleApiKeysCommand(ctx);\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","import { Spacer } from '@mariozechner/pi-tui';\n\nimport type { MastraBrowser } from '@mastra/core/browser';\n\nimport type { BrowserProvider, BrowserSettings, StagehandEnv } from '../../onboarding/settings.js';\nimport {\n checkProfileProviderMismatch,\n createBrowserFromSettings,\n loadSettings,\n saveSettings,\n setProfileProvider,\n} from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { SlashCommandContext } from './types.js';\n\n/**\n * Key used to store the active browser settings in harness state.\n * This tracks what browser config is actually running in this instance,\n * which may differ from the settings file if another instance changed it.\n */\nconst ACTIVE_BROWSER_KEY = 'activeBrowserSettings';\n\n/**\n * /browser command - Configure browser automation for agents.\n *\n * Usage:\n * /browser - Interactive setup wizard\n * /browser status - Show current browser configuration\n * /browser on - Enable browser with current settings\n * /browser off - Disable browser\n * /browser set <k> <v> - Set a specific setting (profile, executablePath, storageState, cdpUrl)\n */\n\n/**\n * Helper to show an inline question and return the answer.\n */\nfunction askInline(\n ctx: SlashCommandContext,\n question: string,\n options: Array<{ label: string; description?: string }>,\n): Promise<string | null> {\n return new Promise(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\n options,\n formatResult: answer => answer,\n onSubmit: answer => {\n ctx.state.activeInlineQuestion = undefined;\n resolve(answer);\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve(null);\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/**\n * Helper to show an inline text input and return the answer.\n */\nfunction askText(ctx: SlashCommandContext, question: string, defaultValue?: string): Promise<string | null> {\n return new Promise(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\n allowEmptyInput: true,\n formatResult: answer => answer || '(empty)',\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 // Set default value if provided\n if (defaultValue) {\n (questionComponent as any).input?.setValue?.(defaultValue);\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/**\n * Check for provider mismatch in profile and prompt for confirmation.\n * Returns true if we should proceed, false if user cancelled.\n */\nasync function checkAndConfirmProviderMismatch(\n ctx: SlashCommandContext,\n profile: string | undefined,\n targetProvider: BrowserProvider,\n): Promise<boolean> {\n if (!profile) return true;\n\n const existingProvider = checkProfileProviderMismatch(profile, targetProvider);\n if (!existingProvider) return true;\n\n const targetLabel = targetProvider === 'stagehand' ? 'Stagehand' : 'AgentBrowser';\n const existingLabel = existingProvider === 'stagehand' ? 'Stagehand' : 'AgentBrowser';\n\n ctx.showInfo(\n `⚠️ Warning: This profile was last used by ${existingLabel}, but you're now using ${targetLabel}.\\n` +\n 'Using the same profile across different providers can cause compatibility issues.',\n );\n\n const proceed = await askInline(ctx, 'Continue anyway?', [\n { label: 'No', description: 'Cancel and use a different profile' },\n { label: 'Yes', description: 'Proceed (may cause issues)' },\n ]);\n\n return proceed === 'Yes';\n}\n\n/**\n * Apply browser settings to all mode agents and track the active settings.\n */\nfunction applyBrowserToAgents(\n ctx: SlashCommandContext,\n browser: MastraBrowser | undefined,\n browserSettings?: BrowserSettings,\n): void {\n const modes = ctx.harness.listModes();\n for (const mode of modes) {\n const agent = typeof mode.agent === 'function' ? mode.agent(ctx.state.harness.getState()) : mode.agent;\n agent.setBrowser(browser);\n }\n // Track the active browser settings in harness state\n ctx.harness.setState({ [ACTIVE_BROWSER_KEY]: browserSettings } as any);\n}\n\n/**\n * Get a summary key for browser settings to detect config drift.\n */\nfunction getBrowserConfigKey(settings: BrowserSettings): string {\n if (!settings.enabled) return 'disabled';\n const parts: string[] = [settings.provider];\n if (settings.provider === 'stagehand' && settings.stagehand?.env) {\n parts.push(settings.stagehand.env);\n }\n parts.push(settings.headless ? 'headless' : 'headed');\n if (settings.profile) parts.push(`profile:${settings.profile}`);\n if (settings.executablePath) parts.push(`exec:${settings.executablePath}`);\n if (settings.cdpUrl) parts.push(`cdp:${settings.cdpUrl}`);\n if (settings.agentBrowser?.storageState) parts.push(`storage:${settings.agentBrowser.storageState}`);\n return parts.join(':');\n}\n\n/**\n * /browser — Configure browser automation settings.\n *\n * Interactive flow to set up browser provider (Stagehand or AgentBrowser),\n * headless mode, and provider-specific options.\n *\n * Changes are applied immediately to the current session.\n */\nexport async function handleBrowserCommand(ctx: SlashCommandContext, args: string[] = []): Promise<void> {\n const settings = loadSettings();\n const browser = settings.browser;\n\n // Handle quick commands\n const arg = args[0]?.toLowerCase();\n\n // /browser set <key> <value> - set a specific setting\n if (arg === 'set') {\n const key = args[1]?.toLowerCase();\n const value = args.slice(2).join(' '); // Allow spaces in paths\n\n if (!key) {\n ctx.showInfo(\n 'Usage: /browser set <key> <value>\\n\\n' +\n 'Keys:\\n' +\n ' profile <path> - Browser profile directory\\n' +\n ' executablePath <path> - Browser executable path\\n' +\n ' storageState <path> - Playwright storage state file (agent-browser only)\\n' +\n ' cdpUrl <url> - CDP WebSocket URL\\n\\n' +\n 'To remove a setting, use: /browser clear <key>\\n\\n' +\n 'Examples:\\n' +\n ' /browser set profile ~/.mastracode/browser-profile-stagehand\\n' +\n ' /browser set executablePath /Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n );\n return;\n }\n\n const validKeys = ['profile', 'executablepath', 'storagestate', 'cdpurl'];\n if (!validKeys.includes(key)) {\n ctx.showError(`Unknown key: ${args[1]}. Valid keys: profile, executablePath, storageState, cdpUrl`);\n return;\n }\n\n if (!value) {\n ctx.showError(\n `Missing value. Use: /browser set ${args[1]} <value>\\nTo remove a setting, use: /browser clear ${args[1]}`,\n );\n return;\n }\n\n const expandedValue = value.trim().replace(/^~/, process.env.HOME || '~');\n\n switch (key) {\n case 'profile':\n settings.browser.profile = expandedValue;\n // Auto-set preserveUserDataDir for Stagehand when profile is configured\n settings.browser.stagehand = {\n ...settings.browser.stagehand,\n env: settings.browser.stagehand?.env ?? 'LOCAL',\n preserveUserDataDir: true,\n };\n // Profile is a launch option — incompatible with CDP connection\n if (settings.browser.cdpUrl) {\n delete settings.browser.cdpUrl;\n ctx.showInfo(`Note: Cleared cdpUrl (incompatible with profile).`);\n }\n break;\n case 'executablepath':\n settings.browser.executablePath = expandedValue;\n // ExecutablePath is a launch option — incompatible with CDP connection\n if (settings.browser.cdpUrl) {\n delete settings.browser.cdpUrl;\n ctx.showInfo(`Note: Cleared cdpUrl (incompatible with executablePath).`);\n }\n break;\n case 'storagestate':\n if (browser.provider !== 'agent-browser') {\n ctx.showError('storageState is only supported by agent-browser provider.');\n return;\n }\n settings.browser.agentBrowser = {\n ...settings.browser.agentBrowser,\n storageState: expandedValue,\n };\n break;\n case 'cdpurl':\n settings.browser.cdpUrl = expandedValue;\n // CDP connects to an existing browser — launch options are ignored\n if (settings.browser.profile || settings.browser.executablePath) {\n delete settings.browser.profile;\n delete settings.browser.executablePath;\n if (settings.browser.stagehand) {\n delete settings.browser.stagehand.preserveUserDataDir;\n }\n ctx.showInfo(`Note: Cleared profile and executablePath (ignored when using cdpUrl).`);\n }\n if (settings.browser.agentBrowser?.storageState) {\n delete settings.browser.agentBrowser.storageState;\n }\n break;\n }\n\n saveSettings(settings);\n ctx.showInfo(`Set ${args[1]} = ${expandedValue}\\nRun /browser on to apply.`);\n return;\n }\n\n if (arg === 'status') {\n // Get the active browser settings from harness state (what's actually running)\n const state = ctx.harness.getState() as any;\n const activeSettings = state?.[ACTIVE_BROWSER_KEY] as BrowserSettings | undefined;\n\n // Check for config drift between file and active instance\n const hasDrift = activeSettings && getBrowserConfigKey(browser) !== getBrowserConfigKey(activeSettings);\n\n if (hasDrift && activeSettings) {\n // Show both active and file settings when they differ\n const lines: string[] = [];\n\n // Active session settings\n const activeProvider =\n activeSettings.provider === 'stagehand' ? 'Stagehand (AI-powered)' : 'AgentBrowser (deterministic)';\n const activeIsBrowserbase =\n activeSettings.provider === 'stagehand' && activeSettings.stagehand?.env === 'BROWSERBASE';\n lines.push('Browser (active):');\n lines.push(` Provider: ${activeProvider}`);\n if (activeSettings.provider === 'stagehand' && activeSettings.stagehand) {\n lines.push(` Environment: ${activeSettings.stagehand.env}`);\n }\n if (!activeIsBrowserbase) {\n lines.push(` Headless: ${activeSettings.headless ? 'yes' : 'no'}`);\n }\n if (activeSettings.executablePath) lines.push(` Executable: ${activeSettings.executablePath}`);\n if (activeSettings.profile) lines.push(` Profile: ${activeSettings.profile}`);\n if (activeSettings.agentBrowser?.storageState)\n lines.push(` Storage State: ${activeSettings.agentBrowser.storageState}`);\n if (activeSettings.cdpUrl) lines.push(` CDP URL: ${activeSettings.cdpUrl}`);\n\n lines.push('');\n\n // Pending changes from file\n const fileProvider = browser.provider === 'stagehand' ? 'Stagehand (AI-powered)' : 'AgentBrowser (deterministic)';\n const fileIsBrowserbase = browser.provider === 'stagehand' && browser.stagehand?.env === 'BROWSERBASE';\n lines.push('Pending changes (not yet applied):');\n lines.push(` Provider: ${fileProvider}`);\n if (browser.provider === 'stagehand' && browser.stagehand) {\n lines.push(` Environment: ${browser.stagehand.env}`);\n }\n if (!fileIsBrowserbase) {\n lines.push(` Headless: ${browser.headless ? 'yes' : 'no'}`);\n }\n if (browser.executablePath) lines.push(` Executable: ${browser.executablePath}`);\n if (browser.profile) lines.push(` Profile: ${browser.profile}`);\n if (browser.agentBrowser?.storageState) lines.push(` Storage State: ${browser.agentBrowser.storageState}`);\n if (browser.cdpUrl) lines.push(` CDP URL: ${browser.cdpUrl}`);\n\n lines.push('');\n lines.push('⚠️ /browser on to apply, /browser to reconfigure, or restart.');\n\n ctx.showInfo(lines.join('\\n'));\n } else if (!browser.enabled) {\n ctx.showInfo('Browser: disabled');\n } else {\n // Normal status (no drift)\n const providerLabel =\n browser.provider === 'stagehand' ? 'Stagehand (AI-powered)' : 'AgentBrowser (deterministic)';\n const isBrowserbase = browser.provider === 'stagehand' && browser.stagehand?.env === 'BROWSERBASE';\n const lines = [`Browser: enabled`, ` Provider: ${providerLabel}`];\n if (browser.provider === 'stagehand' && browser.stagehand) {\n lines.push(` Environment: ${browser.stagehand.env}`);\n }\n if (!isBrowserbase) {\n lines.push(` Headless: ${browser.headless ? 'yes' : 'no'}`);\n }\n if (browser.executablePath) {\n lines.push(` Executable: ${browser.executablePath}`);\n }\n if (browser.profile) {\n lines.push(` Profile: ${browser.profile}`);\n }\n if (browser.agentBrowser?.storageState) {\n lines.push(` Storage State: ${browser.agentBrowser.storageState}`);\n }\n if (browser.cdpUrl) {\n lines.push(` CDP URL: ${browser.cdpUrl}`);\n }\n ctx.showInfo(lines.join('\\n'));\n }\n return;\n }\n\n if (arg === 'off' || arg === 'disable') {\n const disabledSettings = { ...settings.browser, enabled: false };\n settings.browser = disabledSettings;\n saveSettings(settings);\n applyBrowserToAgents(ctx, undefined, disabledSettings);\n ctx.showInfo('Browser disabled.');\n return;\n }\n\n if (arg === 'on' || arg === 'enable') {\n const nextBrowser = { ...settings.browser, enabled: true };\n\n // Check for provider mismatch in profile\n const shouldProceed = await checkAndConfirmProviderMismatch(ctx, nextBrowser.profile, nextBrowser.provider);\n if (!shouldProceed) {\n ctx.showInfo('Browser enable cancelled.');\n return;\n }\n\n try {\n const browserInstance = await createBrowserFromSettings(nextBrowser);\n applyBrowserToAgents(ctx, browserInstance, nextBrowser);\n if (nextBrowser.profile && nextBrowser.provider) {\n setProfileProvider(nextBrowser.profile, nextBrowser.provider);\n }\n settings.browser = nextBrowser;\n saveSettings(settings);\n const providerLabel = browser.provider === 'stagehand' ? 'Stagehand' : 'AgentBrowser';\n ctx.showInfo(`Browser enabled (${providerLabel}).`);\n } catch (err) {\n ctx.showError(`Failed to enable browser: ${err instanceof Error ? err.message : String(err)}`);\n }\n return;\n }\n\n // /browser clear [field] - reset all or specific setting (preserves enabled state)\n if (arg === 'clear') {\n const field = args[1]?.toLowerCase();\n\n if (!field) {\n // Clear all - reset to defaults but preserve enabled state\n const wasEnabled = settings.browser.enabled;\n settings.browser = {\n enabled: wasEnabled,\n provider: 'stagehand',\n headless: false,\n viewport: { width: 1280, height: 720 },\n };\n saveSettings(settings);\n // If it was enabled, we need to recreate the browser with new settings\n if (wasEnabled) {\n try {\n const browserInstance = await createBrowserFromSettings(settings.browser);\n applyBrowserToAgents(ctx, browserInstance, settings.browser);\n } catch (err) {\n // If recreation fails, disable and report\n settings.browser.enabled = false;\n saveSettings(settings);\n applyBrowserToAgents(ctx, undefined);\n ctx.showError(\n `Browser settings reset, but failed to restart: ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n } else {\n applyBrowserToAgents(ctx, undefined);\n }\n ctx.showInfo('Browser settings reset to defaults.');\n return;\n }\n\n // Clear specific field\n switch (field) {\n case 'profile':\n delete settings.browser.profile;\n if (settings.browser.stagehand) {\n delete settings.browser.stagehand.preserveUserDataDir;\n }\n break;\n case 'executablepath':\n delete settings.browser.executablePath;\n break;\n case 'storagestate':\n if (settings.browser.agentBrowser) {\n delete settings.browser.agentBrowser.storageState;\n }\n break;\n case 'cdpurl':\n delete settings.browser.cdpUrl;\n break;\n default:\n ctx.showError(`Unknown field: ${field}. Valid fields: profile, executablePath, storageState, cdpUrl`);\n return;\n }\n\n saveSettings(settings);\n ctx.showInfo(`Cleared ${field}. Run /browser on to apply.`);\n return;\n }\n\n // /browser export storageState <path> - export current session's storage state\n if (arg === 'export') {\n const what = args[1]?.toLowerCase();\n const exportPath = args.slice(2).join(' ').trim();\n\n if (what !== 'storagestate' && what !== 'storage-state') {\n ctx.showError('Usage: /browser export storageState <path>');\n return;\n }\n\n if (!exportPath) {\n ctx.showError('Missing path. Usage: /browser export storageState <path>');\n return;\n }\n\n if (browser.provider !== 'agent-browser') {\n ctx.showError('export storageState is only supported by agent-browser provider.');\n return;\n }\n\n // Get browser instance from the current mode's agent\n const currentMode = ctx.harness.getCurrentMode();\n const agent =\n typeof currentMode.agent === 'function' ? currentMode.agent(ctx.state.harness.getState()) : currentMode.agent;\n const browserInstance = agent.browser;\n\n if (!browserInstance) {\n ctx.showError('Browser not enabled. Run /browser on first.');\n return;\n }\n\n const { AgentBrowser } = await import('@mastra/agent-browser');\n if (!(browserInstance instanceof AgentBrowser)) {\n ctx.showError('Current browser instance does not support exporting storage state.');\n return;\n }\n\n const expandedPath = exportPath.replace(/^~/, process.env.HOME || '~');\n\n try {\n await browserInstance.exportStorageState(expandedPath);\n ctx.showInfo(`Storage state exported to: ${expandedPath}`);\n } catch (error) {\n ctx.showError(`Failed to export storage state: ${error instanceof Error ? error.message : String(error)}`);\n }\n return;\n }\n\n // /browser help, --help, -h, or unrecognized command\n if (arg && !['set', 'status', 'on', 'off', 'enable', 'disable', 'export'].includes(arg)) {\n const help = [\n 'usage: /browser <command> [options]',\n '',\n ' (no command) Interactive setup wizard',\n ' on, enable Enable browser with current settings',\n ' off, disable Disable browser',\n ' status Show current configuration',\n ' clear Reset all settings to defaults',\n ' clear <key> Clear: profile, executablePath, storageState, cdpUrl',\n ' set <key> <v> Set: profile, executablePath, storageState, cdpUrl',\n ' export storageState <path> Export session cookies/localStorage (agent-browser)',\n ];\n ctx.showInfo(help.join('\\n'));\n return;\n }\n\n // Step 1: Enable/disable browser (interactive)\n const enableChoice = await askInline(ctx, 'Enable browser automation?', [\n { label: 'Yes', description: 'Give the agent browser tools for web automation' },\n { label: 'No', description: 'Disable browser automation' },\n ]);\n\n // Cancel preserves current state\n if (!enableChoice) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n if (enableChoice === 'No') {\n if (browser.enabled) {\n settings.browser.enabled = false;\n saveSettings(settings);\n applyBrowserToAgents(ctx, undefined);\n ctx.showInfo('Browser automation disabled.');\n } else {\n ctx.showInfo('Browser automation remains disabled.');\n }\n return;\n }\n\n // Step 2: Select provider\n const providerChoice = await askInline(ctx, 'Select browser provider:', [\n { label: 'Stagehand', description: 'AI-powered (natural language instructions, recommended)' },\n { label: 'AgentBrowser', description: 'Deterministic (explicit selectors, requires Playwright)' },\n ]);\n\n if (!providerChoice) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n const provider: BrowserProvider = providerChoice === 'AgentBrowser' ? 'agent-browser' : 'stagehand';\n\n // Step 3: Stagehand-specific settings (ask environment first)\n let stagehandSettings: BrowserSettings['stagehand'];\n let isBrowserbase = false;\n if (provider === 'stagehand') {\n const envChoice = await askInline(ctx, 'Stagehand environment:', [\n { label: 'LOCAL', description: 'Run browser locally' },\n { label: 'BROWSERBASE', description: 'Use Browserbase cloud (requires API key)' },\n ]);\n\n if (!envChoice) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n const env = envChoice as StagehandEnv;\n isBrowserbase = env === 'BROWSERBASE';\n\n if (isBrowserbase) {\n ctx.showInfo(\n 'Browserbase requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID.\\n' +\n 'Set these in your shell profile (~/.zshrc) or pass them when starting MastraCode.',\n );\n }\n\n stagehandSettings = { env };\n }\n\n // Step 4: Headless mode (skip for Browserbase - runs in cloud)\n let headless = false;\n if (!isBrowserbase) {\n const headlessChoice = await askInline(ctx, 'Run in headless mode?', [\n { label: 'No', description: 'Show browser window (easier to debug)' },\n { label: 'Yes', description: 'Hide browser window (faster, less resource usage)' },\n ]);\n\n if (!headlessChoice) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n headless = headlessChoice === 'Yes';\n }\n\n // Step 5: Launch mode (bundled, custom executable, or CDP)\n let profile = browser.profile;\n let executablePath = browser.executablePath;\n let storageState = browser.agentBrowser?.storageState;\n let cdpUrl = browser.cdpUrl;\n\n // Only show launch mode options for local browsers (not Browserbase)\n if (!isBrowserbase) {\n const launchMode = await askInline(ctx, 'How do you want to launch the browser?', [\n { label: 'Bundled browser', description: 'Use built-in Chromium (recommended)' },\n { label: 'Custom executable', description: 'Use Chrome, Brave, Edge, etc.' },\n { label: 'Connect via CDP', description: 'Connect to an already-running browser' },\n ]);\n\n if (!launchMode) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n if (launchMode === 'Custom executable') {\n // Clear cdpUrl when using custom browser (mutually exclusive)\n cdpUrl = undefined;\n\n const execPath = await askText(ctx, 'Browser executable path:', executablePath);\n if (execPath === null) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n executablePath = execPath.replace(/^~/, process.env.HOME || '~');\n } else if (launchMode === 'Connect via CDP') {\n const cdpUrlInput = await askText(ctx, 'CDP WebSocket URL (e.g., ws://localhost:9222):', cdpUrl);\n if (cdpUrlInput === null) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n cdpUrl = cdpUrlInput;\n // Clear launch options when using CDP (they don't apply)\n profile = undefined;\n executablePath = undefined;\n storageState = undefined;\n } else {\n // Bundled browser - clear custom paths\n cdpUrl = undefined;\n executablePath = undefined;\n }\n\n // Step 6: Profile option (only for bundled or custom executable, not CDP)\n if (launchMode !== 'Connect via CDP') {\n const useProfile = await askInline(ctx, 'Use a browser profile?', [\n { label: 'No', description: 'Fresh session each time' },\n { label: 'Yes', description: 'Persist logins, cookies, extensions' },\n ]);\n\n if (!useProfile) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n if (useProfile === 'Yes') {\n const defaultProfile = `~/.mastracode/browser-profile-${provider}`;\n const profilePath = await askText(ctx, 'Profile directory path:', profile || defaultProfile);\n if (profilePath === null) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n profile = profilePath.replace(/^~/, process.env.HOME || '~');\n } else {\n profile = undefined;\n }\n }\n }\n\n // Build new browser settings\n // Auto-set preserveUserDataDir when profile is configured for Stagehand\n if (provider === 'stagehand' && profile && stagehandSettings) {\n stagehandSettings.preserveUserDataDir = true;\n }\n\n const nextBrowser: BrowserSettings = {\n enabled: true,\n provider,\n headless,\n viewport: browser.viewport ?? { width: 1280, height: 720 },\n cdpUrl,\n profile,\n executablePath,\n stagehand: stagehandSettings,\n agentBrowser: storageState ? { storageState } : undefined,\n };\n\n // Check for provider mismatch in profile\n const shouldProceed = await checkAndConfirmProviderMismatch(ctx, profile, provider);\n if (!shouldProceed) {\n ctx.showInfo('Browser setup cancelled.');\n return;\n }\n\n // Apply browser to agents first, then persist on success\n try {\n const browserInstance = await createBrowserFromSettings(nextBrowser);\n applyBrowserToAgents(ctx, browserInstance, nextBrowser);\n if (nextBrowser.profile && nextBrowser.provider) {\n setProfileProvider(nextBrowser.profile, nextBrowser.provider);\n }\n settings.browser = nextBrowser;\n saveSettings(settings);\n } catch (err) {\n ctx.showError(`Failed to create browser: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n\n // Summary\n const summary = [\n 'Browser automation enabled:',\n ` Provider: ${provider === 'stagehand' ? 'Stagehand (AI-powered)' : 'AgentBrowser (deterministic)'}`,\n ];\n\n if (provider === 'stagehand' && stagehandSettings) {\n summary.push(` Environment: ${stagehandSettings.env}`);\n }\n\n // Only show headless for local browsers\n if (!isBrowserbase) {\n summary.push(` Headless: ${headless ? 'yes' : 'no'}`);\n }\n\n // Show advanced options if configured\n if (cdpUrl) {\n summary.push(` CDP URL: ${cdpUrl}`);\n }\n if (executablePath) {\n summary.push(` Executable: ${executablePath}`);\n }\n if (profile) {\n summary.push(` Profile: ${profile}`);\n }\n if (storageState) {\n summary.push(` Storage State: ${storageState}`);\n }\n\n ctx.showInfo(summary.join('\\n'));\n}\n","/**\n * Login dialog component - handles OAuth login flow UI\n */\n\nimport { exec } from 'node:child_process';\nimport { Box, Container, getEditorKeybindings, 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';\nimport { MaskedInput } from './masked-input.js';\n\nexport class LoginDialogComponent extends Box implements Focusable {\n private contentContainer: Container;\n private input: MaskedInput;\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 MaskedInput();\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 { getOAuthProviders, PROVIDER_DEFAULT_MODELS } from '../../auth/storage.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { LoginDialogComponent } from '../components/login-dialog.js';\nimport type { SlashCommandContext } from './types.js';\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 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 const loggedInIds = allProviders.filter(p => ctx.authStorage?.isLoggedIn(p.id)).map(p => p.id);\n\n if (mode === 'logout') {\n if (loggedInIds.length === 0) {\n ctx.showInfo('No OAuth providers logged in. Use /login first.');\n return;\n }\n }\n\n const providers = mode === 'logout' ? allProviders.filter(p => loggedInIds.includes(p.id)) : allProviders;\n\n if (providers.length === 0) {\n ctx.showInfo('No OAuth providers available.');\n return;\n }\n\n const action = mode === 'login' ? 'Log in to' : 'Log out from';\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `${action} which provider?`,\n options: providers.map(p => ({\n label: p.name,\n description: loggedInIds.includes(p.id) ? '(logged in)' : '',\n })),\n formatResult: answer => (mode === 'login' ? `Logging in to ${answer}…` : `Logged out from ${answer}`),\n onSubmit: async answer => {\n ctx.state.activeInlineQuestion = undefined;\n const provider = providers.find(p => p.name === answer);\n if (provider) {\n if (mode === 'login') {\n await performLogin(ctx, provider.id);\n } else {\n if (ctx.authStorage) {\n ctx.authStorage.logout(provider.id);\n ctx.showInfo(`Logged out from ${provider.name}`);\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 MASTRA_REPO = 'mastra-ai/mastra';\nconst MASTRA_LABEL = 'mastracode';\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 ${MASTRA_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 `mastracode --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 ${MASTRA_REPO} --label ${MASTRA_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 ${MASTRA_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 ${MASTRA_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 ${MASTRA_REPO} --label ${MASTRA_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 { luminance } from './theme.js';\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<ThemeDetectionResult | 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 // Convert to hex and compute WCAG relative luminance\n const toHexByte = (v: number) =>\n Math.round(v * 255)\n .toString(16)\n .padStart(2, '0');\n const detectedBgHex = `#${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`;\n const luma = luminance(detectedBgHex);\n\n resolve({ mode: luma >= 0.5 ? 'light' : 'dark', detectedBgHex });\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 interface ThemeDetectionResult {\n mode: ThemeMode;\n /** The actual terminal background hex color, if detected via OSC 11. */\n detectedBgHex?: string;\n}\n\nexport async function detectTerminalTheme(): Promise<ThemeDetectionResult> {\n // 1. Explicit env var override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n if (envTheme === 'light') return { mode: 'light' };\n if (envTheme === 'dark') return { mode: '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 { mode: fgbgResult };\n\n // 4. Default to dark\n return { mode: 'dark' };\n}\n","import { loadSettings, 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 = loadSettings();\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 = loadSettings();\n settings.preferences.theme = arg;\n saveSettings(settings);\n\n // Apply immediately\n if (arg === 'auto') {\n const detection = await detectTerminalTheme();\n applyThemeMode(detection.mode, detection.detectedBgHex);\n ctx.showInfo(`Theme set to auto (detected: ${detection.mode})`);\n } else {\n applyThemeMode(arg);\n ctx.showInfo(`Theme set to ${arg}`);\n }\n ctx.state.ui.requestRender();\n}\n","import { Spacer } from '@mariozechner/pi-tui';\n\nimport { loadSettings, saveSettings } from '../../onboarding/settings.js';\nimport {\n detectPackageManager,\n fetchChangelog,\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 the npm registry. 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, changelog] = await Promise.all([detectPackageManager(), fetchChangelog(latestVersion)]);\n\n // Clear any previously dismissed version so the prompt always shows\n const settings = loadSettings();\n if (settings.updateDismissedVersion) {\n settings.updateDismissedVersion = null;\n saveSettings(settings);\n }\n\n // Build question text with optional changelog\n let question = `A new version is available: v${latestVersion} (current: v${currentVersion}).`;\n if (changelog) {\n question += `\\n\\nWhat's new:\\n${changelog}`;\n }\n question += `\\n\\nWould you like to update now?`;\n\n // Show interactive prompt\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\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 Mastra Code.`);\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 = loadSettings();\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","import { Spacer } from '@mariozechner/pi-tui';\nimport { GatewayRegistry } from '@mastra/core/llm';\nimport {\n loadSettings,\n saveSettings,\n MEMORY_GATEWAY_PROVIDER,\n MEMORY_GATEWAY_DEFAULT_URL,\n} from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport type { SlashCommandContext } from './types.js';\n\nfunction askText(ctx: SlashCommandContext, question: string, defaultValue?: string): Promise<string | null> {\n return new Promise(resolve => {\n const component = new AskQuestionInlineComponent(\n {\n question,\n allowEmptyInput: false,\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\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 const trimmed = answer.trim();\n resolve(selected?.value ?? (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 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 refreshGatewayModels(ctx: SlashCommandContext): Promise<void> {\n try {\n await GatewayRegistry.getInstance({ useDynamicLoading: true }).syncGateways(true);\n } catch (error) {\n ctx.showError(`Failed to refresh gateway models: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport async function handleMemoryGatewayCommand(ctx: SlashCommandContext): Promise<void> {\n const authStorage = ctx.authStorage;\n if (!authStorage) {\n ctx.showError('Auth storage not available');\n return;\n }\n\n // Resolve effective state from storage + env\n const currentKey = authStorage.getStoredApiKey(MEMORY_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n const settings = loadSettings();\n const effectiveUrl =\n settings.memoryGateway?.baseUrl ?? process.env['MASTRA_GATEWAY_URL'] ?? MEMORY_GATEWAY_DEFAULT_URL;\n\n if (currentKey) {\n const masked = currentKey.length > 6 ? `****${currentKey.slice(-4)}` : '****';\n ctx.showInfo(`Current API key: ${masked} | URL: ${effectiveUrl}`);\n } else {\n ctx.showInfo(`No API key set | URL: ${effectiveUrl}`);\n }\n\n // Ask for API key\n const keyAnswer = await askText(\n ctx,\n currentKey\n ? `API key (ENTER to keep current, 'clear' to remove, ESC to skip):`\n : `API key (or 'clear' to remove, ESC to cancel):`,\n currentKey,\n );\n if (keyAnswer === null) {\n // ESC with no key — abort; ESC with existing key — proceed to URL prompt\n if (!currentKey) return;\n } else if (keyAnswer.toLowerCase() === 'clear') {\n authStorage.remove(`apikey:${MEMORY_GATEWAY_PROVIDER}`);\n delete process.env['MASTRA_GATEWAY_API_KEY'];\n delete process.env['MASTRA_GATEWAY_URL'];\n settings.memoryGateway = {};\n saveSettings(settings);\n await refreshGatewayModels(ctx);\n ctx.showInfo('Memory gateway cleared. Memory mode changes take effect on next restart.');\n return;\n } else if (keyAnswer.length > 0) {\n authStorage.setStoredApiKey(MEMORY_GATEWAY_PROVIDER, keyAnswer, 'MASTRA_GATEWAY_API_KEY');\n }\n\n const urlChoice = await askSelect(ctx, 'Gateway URL', [\n {\n label: MEMORY_GATEWAY_DEFAULT_URL,\n value: MEMORY_GATEWAY_DEFAULT_URL,\n description: effectiveUrl === MEMORY_GATEWAY_DEFAULT_URL ? 'current' : 'hosted default',\n },\n {\n label: 'http://localhost:4111',\n value: 'http://localhost:4111',\n description: effectiveUrl === 'http://localhost:4111' ? 'current' : 'local development',\n },\n ]);\n\n if (urlChoice === null) {\n return;\n }\n\n const urlAnswer = urlChoice;\n\n if (urlAnswer && urlAnswer !== MEMORY_GATEWAY_DEFAULT_URL) {\n settings.memoryGateway = { baseUrl: urlAnswer };\n process.env['MASTRA_GATEWAY_URL'] = urlAnswer;\n } else {\n settings.memoryGateway = {};\n delete process.env['MASTRA_GATEWAY_URL'];\n }\n saveSettings(settings);\n await refreshGatewayModels(ctx);\n\n ctx.showInfo('Memory gateway configured. Memory mode changes take effect on next restart.');\n}\n","import { getUserName } from '../../utils/project.js';\nimport type { SlashCommandContext } from './types.js';\n\n/**\n * /feedback command — annotate the most recent trace with user feedback.\n *\n * Feedback is emitted through the observability event bus so it reaches all\n * configured exporters (DuckDB, cloud, Langfuse, etc.) without requiring\n * direct storage access. A minimal correlationContext is supplied so the\n * observability layer does not need to re-hydrate the trace from storage —\n * this keeps the command working even when the local DuckDB is locked by\n * another process.\n *\n * Usage:\n * /feedback up — thumbs up\n * /feedback down — thumbs down\n * /feedback down Bad tool selection — thumbs down with comment\n * /feedback 4 — numeric rating (0–10)\n * /feedback comment Great response — text comment only\n */\nexport async function handleFeedbackCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n if (args.length === 0) {\n ctx.showInfo(`Usage:\n /feedback up — thumbs up\n /feedback down — thumbs down\n /feedback down <comment> — thumbs down with comment\n /feedback <0-10> — numeric rating\n /feedback comment <text> — text comment only`);\n return;\n }\n\n // Resolve trace context.\n // getCurrentTraceId() returns the actual observability traceId (OTel 32-hex-char ID)\n // captured from the stream response. getCurrentRunId() returns the agent's runId (UUID).\n // We pass both so the cloud endpoint can correlate feedback to the correct trace.\n const traceId = ctx.harness.getCurrentTraceId() ?? undefined;\n const runId = ctx.harness.getCurrentRunId() ?? undefined;\n const threadId = ctx.harness.getCurrentThreadId() ?? undefined;\n\n if (!traceId && !runId && !threadId) {\n ctx.showError('No active session to attach feedback to.');\n return;\n }\n\n // Get observability from the Mastra instance so feedback flows through the\n // event bus to all exporters (cloud, DuckDB, etc.).\n const mastra = ctx.harness.getMastra();\n const observability = mastra?.observability;\n if (!observability?.addFeedback) {\n ctx.showError('Observability not configured — cannot save feedback.');\n return;\n }\n\n // Parse the feedback input\n const subcommand = args[0]!.toLowerCase();\n const rest = args.slice(1).join(' ').trim();\n\n let feedbackType: string;\n let value: number | string;\n let comment: string | undefined;\n\n if (subcommand === 'up') {\n feedbackType = 'thumbs';\n value = 1;\n comment = rest || undefined;\n } else if (subcommand === 'down') {\n feedbackType = 'thumbs';\n value = 0;\n comment = rest || undefined;\n } else if (subcommand === 'comment') {\n if (!rest) {\n ctx.showError('Please provide a comment: /feedback comment <text>');\n return;\n }\n feedbackType = 'comment';\n value = rest;\n comment = rest;\n } else {\n // Try numeric rating\n const num = Number(subcommand);\n if (!Number.isNaN(num) && num >= 0 && num <= 10) {\n feedbackType = 'rating';\n value = num;\n comment = rest || undefined;\n } else {\n ctx.showError(`Unknown feedback type: \"${subcommand}\". Use up, down, comment, or a number 0-10.`);\n return;\n }\n }\n\n try {\n await observability.addFeedback({\n // Pass the actual traceId so the feedback is correlated to the trace.\n traceId,\n // Supply a correlationContext so the observability layer emits the event\n // directly without looking up the trace from storage (which may be locked).\n correlationContext: {\n traceId,\n runId,\n },\n feedback: {\n feedbackType,\n feedbackSource: 'mastracode',\n feedbackUserId: getUserName(),\n value,\n comment,\n metadata: {\n ...(threadId ? { threadId } : {}),\n ...(runId ? { runId } : {}),\n },\n },\n });\n\n // Build confirmation message\n let msg: string;\n if (feedbackType === 'thumbs') {\n msg = value === 1 ? 'Feedback recorded: 👍' : 'Feedback recorded: 👎';\n } else if (feedbackType === 'rating') {\n msg = `Feedback recorded: ${value}/10`;\n } else {\n msg = 'Comment recorded.';\n }\n if (comment && feedbackType !== 'comment') {\n msg += ` — \"${comment}\"`;\n }\n\n ctx.showInfo(msg);\n } catch (err) {\n ctx.showError(`Failed to save feedback: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n","import { Spacer } from '@mariozechner/pi-tui';\n\nimport { loadSettings, OBSERVABILITY_AUTH_PREFIX, saveSettings } from '../../onboarding/settings.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.js';\nimport { theme } from '../theme.js';\nimport type { SlashCommandContext } from './types.js';\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction showStatus(ctx: SlashCommandContext): void {\n const resourceId = ctx.harness.getResourceId();\n const settings = loadSettings();\n const resourceConfig = settings.observability.resources[resourceId];\n const hasToken = ctx.authStorage?.hasStoredApiKey(`${OBSERVABILITY_AUTH_PREFIX}${resourceId}`) ?? false;\n\n const lines: string[] = [theme.bold(theme.fg('accent', 'Observability')), ''];\n\n // Cloud status\n lines.push(theme.bold('Cloud'));\n if (resourceConfig && hasToken) {\n lines.push(` ${theme.fg('success', '●')} Connected`);\n lines.push(` Project: ${resourceConfig.projectId}`);\n lines.push(` Resource: ${resourceId}`);\n lines.push(` Since: ${new Date(resourceConfig.configuredAt).toLocaleDateString()}`);\n } else if (resourceConfig && !hasToken) {\n lines.push(` ${theme.fg('warning', '●')} Partially configured (missing token)`);\n lines.push(` Project: ${resourceConfig.projectId}`);\n lines.push('');\n lines.push(theme.fg('dim', ' Run /observability connect to re-enter credentials.'));\n } else {\n const envToken = process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n const envProject = process.env.MASTRA_PROJECT_ID;\n if (envToken) {\n lines.push(` ${theme.fg('success', '●')} Connected ${theme.fg('dim', '(via environment variables)')}`);\n if (envProject) {\n lines.push(` Project: ${envProject}`);\n }\n lines.push(` Resource: ${resourceId}`);\n } else {\n lines.push(` ${theme.fg('dim', '●')} Not configured`);\n lines.push(` Resource: ${resourceId}`);\n }\n }\n\n // Local tracing status\n lines.push('');\n lines.push(theme.bold('Local tracing (DuckDB)'));\n if (settings.observability.localTracing) {\n lines.push(` ${theme.fg('success', '●')} Enabled`);\n } else {\n lines.push(` ${theme.fg('dim', '●')} Disabled`);\n }\n\n lines.push('');\n lines.push(theme.fg('dim', 'Commands:'));\n lines.push(theme.fg('dim', ' /observability connect — configure cloud project'));\n lines.push(theme.fg('dim', ' /observability disconnect — remove cloud configuration'));\n lines.push(theme.fg('dim', ' /observability local on — enable local DuckDB tracing'));\n lines.push(theme.fg('dim', ' /observability local off — disable local DuckDB tracing'));\n\n ctx.showInfo(lines.join('\\n'));\n}\n\nfunction showInlineQuestion(ctx: SlashCommandContext, component: AskQuestionInlineComponent): void {\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\nfunction handleConnect(ctx: SlashCommandContext): Promise<void> {\n if (!ctx.authStorage) {\n ctx.showError('Auth storage not available. Cannot store credentials.');\n return Promise.resolve();\n }\n\n const resourceId = ctx.harness.getResourceId();\n\n return new Promise<void>(resolve => {\n const projectIdQuestion = new AskQuestionInlineComponent(\n {\n question: 'Enter your cloud project ID:',\n formatResult: (answer: string) => `Project ID: ${answer}`,\n onSubmit: (projectId: string) => {\n ctx.state.activeInlineQuestion = undefined;\n\n if (!VALID_PROJECT_ID.test(projectId)) {\n ctx.showError('Invalid project ID. Only letters, numbers, hyphens, and underscores are allowed.');\n resolve();\n return;\n }\n\n const tokenQuestion = new AskQuestionInlineComponent(\n {\n question: 'Enter your cloud access token:',\n formatResult: () => 'Token: ••••••••',\n onSubmit: (token: string) => {\n ctx.state.activeInlineQuestion = undefined;\n\n const settings = loadSettings();\n settings.observability.resources[resourceId] = {\n projectId,\n configuredAt: new Date().toISOString(),\n };\n saveSettings(settings);\n\n ctx.authStorage!.setStoredApiKey(`${OBSERVABILITY_AUTH_PREFIX}${resourceId}`, token);\n\n ctx.showInfo(\n `${theme.fg('success', '✓')} Cloud observability configured.\\n` +\n ` Project: ${projectId}\\n` +\n ` Resource: ${resourceId}\\n\\n` +\n theme.fg('dim', 'Restart MastraCode for the new configuration to take effect.'),\n );\n resolve();\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n showInlineQuestion(ctx, tokenQuestion);\n },\n onCancel: () => {\n ctx.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n ctx.state.ui,\n );\n\n showInlineQuestion(ctx, projectIdQuestion);\n });\n}\n\nfunction handleLocal(ctx: SlashCommandContext, args: string[]): void {\n const toggle = args[1]?.trim().toLowerCase();\n if (toggle !== 'on' && toggle !== 'off') {\n const settings = loadSettings();\n const current = settings.observability.localTracing ? 'on' : 'off';\n ctx.showInfo(\n `Local DuckDB tracing is currently ${theme.bold(current)}.\\n\\n` +\n theme.fg('dim', 'Usage:\\n /observability local on — enable\\n /observability local off — disable'),\n );\n return;\n }\n\n const enable = toggle === 'on';\n const settings = loadSettings();\n if (settings.observability.localTracing === enable) {\n ctx.showInfo(`Local tracing is already ${theme.bold(toggle)}.`);\n return;\n }\n\n settings.observability.localTracing = enable;\n saveSettings(settings);\n\n if (enable) {\n ctx.showInfo(\n `${theme.fg('success', '✓')} Local DuckDB tracing enabled.\\n` +\n theme.fg('dim', 'Restart MastraCode for changes to take effect.'),\n );\n } else {\n ctx.showInfo(\n `${theme.fg('success', '✓')} Local DuckDB tracing disabled.\\n` +\n theme.fg(\n 'dim',\n 'Restart MastraCode for changes to take effect.\\nExisting data remains at the DuckDB path — delete manually if needed.',\n ),\n );\n }\n}\n\nfunction handleDisconnect(ctx: SlashCommandContext): void {\n const resourceId = ctx.harness.getResourceId();\n const settings = loadSettings();\n\n const hadConfig = resourceId in settings.observability.resources;\n const hadToken = ctx.authStorage?.hasStoredApiKey(`${OBSERVABILITY_AUTH_PREFIX}${resourceId}`) ?? false;\n\n if (!hadConfig && !hadToken) {\n ctx.showInfo(`No cloud observability configured for resource \"${resourceId}\".`);\n return;\n }\n\n delete settings.observability.resources[resourceId];\n saveSettings(settings);\n\n if (ctx.authStorage) {\n ctx.authStorage.remove(`apikey:${OBSERVABILITY_AUTH_PREFIX}${resourceId}`);\n }\n\n ctx.showInfo(\n `${theme.fg('success', '✓')} Cloud observability disconnected for resource \"${resourceId}\".\\n` +\n theme.fg('dim', 'Restart MastraCode for changes to take effect.'),\n );\n}\n\nexport async function handleObservabilityCommand(ctx: SlashCommandContext, args: string[]): Promise<void> {\n const sub = args[0]?.trim().toLowerCase();\n\n switch (sub) {\n case 'connect':\n await handleConnect(ctx);\n break;\n case 'disconnect':\n handleDisconnect(ctx);\n break;\n case 'local':\n handleLocal(ctx, args);\n break;\n case 'status':\n case undefined:\n showStatus(ctx);\n break;\n default:\n ctx.showInfo(\n 'Usage:\\n' +\n ' /observability — show current status\\n' +\n ' /observability connect — configure cloud observability\\n' +\n ' /observability disconnect — remove cloud configuration\\n' +\n ' /observability local on — enable local DuckDB tracing\\n' +\n ' /observability local off — disable local DuckDB tracing',\n );\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 { BOX_INDENT, getTermWidth, mastra } from '../theme.js';\n\nconst MAX_COLLAPSED_LINES = 3;\nconst getBorderColor = () => mastra.green;\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\n const border = (char: string) => chalk.bold.hex(getBorderColor())(char);\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 6 - BOX_INDENT * 2;\n\n const heading = chalk.hex(mastra.specialGray)(`/${this.commandName}`);\n\n if (this.contentLines.length === 0) {\n this.addChild(new Text(`${border('╰──')} ${heading}`, BOX_INDENT, 0));\n return;\n }\n\n // Top border\n this.addChild(new Text(`${border('╭──')}`, BOX_INDENT, 0));\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, BOX_INDENT, 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}`, BOX_INDENT, 0));\n }\n\n // Bottom border with command name\n this.addChild(new Text(`${border('╰──')} ${heading}`, BOX_INDENT, 0));\n this.addChild(new Spacer(1));\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 handleThreadCommand,\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 handleBrowserCommand,\n handleThemeCommand,\n handleUpdateCommand,\n handleMemoryGatewayCommand,\n handleApiKeysCommand,\n handleFeedbackCommand,\n handleObservabilityCommand,\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 await 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 'thread':\n await handleThreadCommand(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 'browser':\n await handleBrowserCommand(buildCtx(), args);\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 case 'memory-gateway':\n await handleMemoryGatewayCommand(buildCtx());\n return true;\n case 'api-keys':\n await handleApiKeysCommand(buildCtx());\n return true;\n case 'feedback':\n await handleFeedbackCommand(buildCtx(), args);\n return true;\n case 'observability':\n await handleObservabilityCommand(buildCtx(), args);\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 if (state.pendingNewThread) {\n await state.harness.createThread();\n state.pendingNewThread = false;\n }\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 type { Component } from '@mariozechner/pi-tui';\n\nimport type { TUIState } from './state.js';\n\nconst MAX_CHILDREN = 200;\nconst KEEP_CHILDREN = 100;\n\nexport function pruneChatContainer(state: TUIState): void {\n const children = state.chatContainer.children as Component[];\n if (children.length <= MAX_CHILDREN) {\n return;\n }\n\n const removeCount = children.length - KEEP_CHILDREN;\n const removed = new Set(children.slice(0, removeCount));\n\n children.splice(0, removeCount);\n state.chatContainer.invalidate();\n\n state.allToolComponents = state.allToolComponents.filter(\n component => !removed.has(component as unknown as Component),\n );\n state.allSlashCommandComponents = state.allSlashCommandComponents.filter(component => !removed.has(component));\n state.allSystemReminderComponents = state.allSystemReminderComponents.filter(component => !removed.has(component));\n state.allShellComponents = state.allShellComponents.filter(\n component => !removed.has(component as unknown as Component),\n );\n}\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 { GradientAnimator } from '../components/obi-loader.js';\nimport { pruneChatContainer } from '../prune-chat.js';\nimport { BOX_INDENT, 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 pruneChatContainer(state);\n ctx.updateStatusLine();\n state.ui.requestRender();\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.content },\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 state.ui.requestRender();\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 Text(theme.fg('error', 'Interrupted'), BOX_INDENT, 0));\n state.chatContainer.addChild(new Spacer(1));\n }\n state.userInitiatedAbort = false;\n\n state.followUpComponents = [];\n state.pendingFollowUpMessages = [];\n state.pendingQueuedActions = [];\n state.pendingSlashCommands = [];\n state.pendingTools.clear();\n pruneChatContainer(state);\n ctx.updateStatusLine();\n state.ui.requestRender();\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 pruneChatContainer(state);\n ctx.updateStatusLine();\n state.ui.requestRender();\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 { CHAT_INDENT, 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 this.addChild(new Spacer(1));\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 // 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(\n new Markdown((content as any).text.trim(), CHAT_INDENT, 0, this.markdownTheme, {\n color: (text: string) => theme.fg('text', text),\n }),\n );\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(\n new Text(theme.italic(theme.fg('thinkingText', 'Thinking...')), CHAT_INDENT, 0),\n );\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(), CHAT_INDENT, 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 Text(theme.fg('error', abortMessage), CHAT_INDENT, 0));\n } else if (message.stopReason === 'error') {\n const errorMsg = message.errorMessage || 'Unknown error';\n this.contentContainer.addChild(new Text(theme.fg('error', `Error: ${errorMsg}`), CHAT_INDENT, 0));\n }\n }\n}\n","/**\n * SystemReminderComponent - renders system-generated reminder messages\n * inline with a bordered amber notice style.\n */\n\nimport { readFileSync } from 'node:fs';\nimport process from 'node:process';\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport stripAnsi from 'strip-ansi';\nimport { BOX_INDENT, getTermWidth, theme } from '../theme.js';\n\nconst MAX_COLLAPSED_LINES = 10;\nconst GENERIC_DYNAMIC_REMINDER_PREFIX = 'When using guidance from a discovered instruction file';\n\nexport interface SystemReminderOptions {\n message?: string;\n reminderType?: string;\n path?: string;\n}\n\nexport class SystemReminderComponent extends Container {\n private readonly messageLines: string[];\n private readonly reminderType?: string;\n private readonly path?: string;\n private expanded = false;\n\n isExpanded(): boolean {\n return this.expanded;\n }\n\n constructor(options: SystemReminderOptions) {\n super();\n\n const resolvedMessage = resolveReminderMessage(options.message, options.path);\n this.messageLines = resolvedMessage.length\n ? resolvedMessage\n .split('\\n')\n .map(line => line.trimEnd())\n .filter(line => line.length > 0)\n : [getLoadingMessage(options.reminderType, options.path)];\n this.reminderType = options.reminderType;\n this.path = options.path;\n\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n if (this.expanded === expanded) {\n return;\n }\n\n this.expanded = expanded;\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.setExpanded(!this.expanded);\n }\n\n private rebuild(): void {\n this.clear();\n\n const border = (char: string) => theme.bold(theme.fg('toolTitle', char));\n const title = theme.bold(theme.fg('toolTitle', getReminderTitle(this.reminderType, this.path)));\n const metadataColor = (text: string) => theme.fg('dim', text);\n const bodyColor = (text: string) => theme.fg('text', text);\n const hintColor = (text: string) => theme.fg('dim', text);\n const termWidth = getTermWidth();\n const innerWidth = Math.max(20, termWidth - BOX_INDENT * 2 - 4);\n const horizontal = '─'.repeat(innerWidth + 1);\n\n const metadataLines = [this.path ? formatReminderPath(this.path) : undefined].filter((line): line is string =>\n Boolean(line),\n );\n\n const wrappedMessageLines = wrapLines(this.messageLines, innerWidth);\n const shouldCollapse = wrappedMessageLines.length > MAX_COLLAPSED_LINES;\n const visibleMessageLines =\n shouldCollapse && !this.expanded ? wrappedMessageLines.slice(0, MAX_COLLAPSED_LINES) : wrappedMessageLines;\n\n this.addChild(new Text(`${border('╭')}${border(horizontal)}${border('╮')}`, BOX_INDENT, 0));\n this.addChild(new Text(renderRow(title, innerWidth, border), BOX_INDENT, 0));\n\n for (const line of metadataLines) {\n this.addChild(new Text(renderRow(metadataColor(line), innerWidth, border), BOX_INDENT, 0));\n }\n\n if (metadataLines.length > 0 && visibleMessageLines.length > 0) {\n this.addChild(new Text(renderRow('', innerWidth, border), BOX_INDENT, 0));\n }\n\n for (const line of visibleMessageLines) {\n this.addChild(new Text(renderRow(bodyColor(line), innerWidth, border), BOX_INDENT, 0));\n }\n\n if (shouldCollapse && !this.expanded) {\n const remaining = wrappedMessageLines.length - visibleMessageLines.length;\n const hint = hintColor(`... ${remaining} more lines (ctrl+e to expand)`);\n this.addChild(new Text(renderRow(hint, innerWidth, border), BOX_INDENT, 0));\n }\n\n this.addChild(new Text(`${border('╰')}${border(horizontal)}${border('╯')}`, BOX_INDENT, 0));\n this.addChild(new Spacer(1));\n }\n}\n\nfunction renderRow(text: string, width: number, border: (char: string) => string): string {\n const content = padLine(text, width);\n const rightPadding = hasWideGlyph(stripAnsi(text)) ? ' ' : '';\n return `${border('│')} ${content}${rightPadding}${border('│')}`;\n}\n\nfunction resolveReminderMessage(message: string | undefined, path: string | undefined): string {\n const trimmedMessage = message?.trim();\n if (trimmedMessage && trimmedMessage !== 'undefined' && !trimmedMessage.startsWith(GENERIC_DYNAMIC_REMINDER_PREFIX)) {\n return trimmedMessage;\n }\n\n if (!path) {\n return trimmedMessage && trimmedMessage !== 'undefined' ? trimmedMessage : '';\n }\n\n try {\n const fileContent = readFileSync(path, 'utf-8').trim();\n if (fileContent.length > 0) {\n return fileContent;\n }\n } catch {\n // Fall back to streamed/persisted message when local file content is unavailable.\n }\n\n return trimmedMessage && trimmedMessage !== 'undefined' ? trimmedMessage : '';\n}\n\nfunction getReminderTitle(reminderType: string | undefined, path: string | undefined): string {\n return reminderType === 'dynamic-agents-md' || isAgentsInstructionPath(path) ? 'Loaded AGENTS.md' : 'System Reminder';\n}\n\nfunction getLoadingMessage(reminderType: string | undefined, path: string | undefined): string {\n return reminderType === 'dynamic-agents-md' || isAgentsInstructionPath(path)\n ? 'Loading instruction file contents…'\n : 'Loading reminder…';\n}\n\nfunction isAgentsInstructionPath(path: string | undefined): boolean {\n return typeof path === 'string' && /(?:^|\\/)AGENTS\\.md$/i.test(path);\n}\n\nfunction formatReminderPath(path: string): string {\n const cwd = process.cwd();\n if (path === cwd) {\n return '.';\n }\n\n const cwdPrefix = `${cwd}/`;\n return path.startsWith(cwdPrefix) ? path.slice(cwdPrefix.length) : path;\n}\n\nfunction hasWideGlyph(text: string): boolean {\n return [...text].some(char =>\n /[\\p{Extended_Pictographic}\\u1100-\\u115F\\u2329\\u232A\\u2E80-\\uA4CF\\uAC00-\\uD7A3\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE6F\\uFF00-\\uFF60\\uFFE0-\\uFFE6]/u.test(\n char,\n ),\n );\n}\n\nfunction wrapLines(lines: string[], maxLineWidth: number): string[] {\n if (lines.length === 0) {\n return [''];\n }\n\n const wrappedLines: string[] = [];\n\n for (const line of lines) {\n if (line.length <= maxLineWidth) {\n wrappedLines.push(line);\n continue;\n }\n\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\n if (remaining.length > 0) {\n wrappedLines.push(remaining);\n }\n }\n\n return wrappedLines;\n}\n\nfunction padLine(text: string, width: number): string {\n const visibleLength = stripAnsi(text).length;\n if (visibleLength === width) {\n return text;\n }\n\n if (visibleLength > width) {\n return truncateLine(text, width);\n }\n\n return text + ' '.repeat(width - visibleLength);\n}\n\nfunction truncateLine(text: string, width: number): string {\n const plain = stripAnsi(text);\n return plain.length <= width ? text : plain.slice(0, Math.max(0, width - 1)) + '…';\n}\n","/**\n * Lightweight inline indicator for temporal gaps between messages.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport { BOX_INDENT, theme } from '../theme.js';\n\nexport interface TemporalGapOptions {\n message?: string;\n gapText?: string;\n}\n\nexport class TemporalGapComponent extends Container {\n constructor(options: TemporalGapOptions) {\n super();\n\n this.addChild(new Text(theme.fg('dim', ` ⏳ ${resolveGapText(options)}`), BOX_INDENT, 0));\n this.addChild(new Spacer(1));\n }\n\n setExpanded(_expanded: boolean): void {}\n}\n\nfunction resolveGapText(options: TemporalGapOptions): string {\n const gapText = options.gapText?.trim();\n if (gapText) {\n return gapText;\n }\n\n const message = options.message?.trim();\n if (!message) {\n return 'Time passed';\n }\n\n const separatorIndex = message.indexOf(' — ');\n return separatorIndex >= 0 ? message.slice(0, separatorIndex).trim() : message;\n}\n","/**\n * Shared ANSI text-handling helpers for TUI components.\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 */\nexport function truncateAnsi(str: string, maxWidth: number): string {\n // The OSC 8 hyperlink body is terminated by BEL (\\x07). We also\n // break on a new ESC (\\x1b) so a missing terminator cannot scan\n // unbounded input and amplify polynomial backtracking.\n const ansiRegex = /\\x1b\\[[0-9;]{0,32}m|\\x1b\\]8;[^\\x07\\x1b]{0,8192}\\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 * 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 { Box, Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { BOX_INDENT, 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 // Wrap everything in a box (borders provide structure, no extra padding)\n const box = new Box(BOX_INDENT, 0, (text: string) => text);\n this.addChild(box);\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 box.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 box.addChild(errorContainer);\n\n // Code context if available\n if (this.options.showContext && info.context) {\n box.addChild(new Spacer(1));\n box.addChild(this.createCodeContext(info.context, info.line));\n }\n\n // Stack trace (collapsible)\n if (this.options.showStack && info.stack) {\n box.addChild(new Spacer(1));\n box.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(59) + '╯'), 0, 0);\n box.addChild(borderBottom);\n\n this.addChild(new Spacer(1));\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 { safeStringify } from '@mastra/core/utils';\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. Restrict the gap between the field\n // name and the ': ' separator to non-newline characters and bound it\n // to avoid the polynomial backtracking CodeQL flagged on\n // attacker-crafted repetitions of `at \"!\"`.\n const zodMatch = error.match(/at \"([^\"\\n]{1,256})\"[^:\\n]{0,256}: ([^\\n]{1,4096})/g);\n if (zodMatch) {\n zodMatch.forEach(match => {\n const [, field, message] = match.match(/at \"([^\"\\n]{1,256})\"[^:\\n]{0,256}: ([^\\n]{1,4096})/) || [];\n if (field && message) {\n errors.push({ field, message });\n }\n });\n }\n\n // Try to parse \"missing required parameter\" errors. Bound the gap\n // so the lazy quantifier cannot drive O(n^2) behaviour on large\n // inputs without a closing quote.\n const missingMatch = error.match(/missing required[^\"`'\\n]{0,256}[\"`'](\\w{1,128})[\"`']/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 = safeStringify(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 { BOX_INDENT, getTermWidth, theme, mastra } from '../theme.js';\nimport { truncateAnsi } from './ansi.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 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 // Content box - left indent for chat history alignment, no background\n this.contentBox = new Box(BOX_INDENT, 0, (text: string) => text);\n this.addChild(this.contentBox);\n this.addChild(new Spacer(2));\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 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 // No background for any tools - use bordered box style instead\n this.contentBox.setBgFn((text: string) => 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\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.LSP_INSPECT:\n this.renderLspInspectEnhanced();\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 const offset = argsObj?.offset as number | undefined;\n const limit = argsObj?.limit as number | undefined;\n // view tool uses view_range[0], workspace read_file uses offset\n const startLine = viewRange?.[0] ?? offset ?? 1;\n\n // Build range display from view_range or offset/limit\n let rangeDisplay = '';\n if (viewRange) {\n rangeDisplay = theme.fg('muted', `:${viewRange[0]}-${viewRange[1]}`);\n } else if (offset || limit) {\n const from = offset ?? 1;\n const to = limit ? from + limit - 1 : undefined;\n rangeDisplay = theme.fg('muted', to ? `:${from}-${to}` : `:${from}`);\n }\n\n const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n\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('toolArgs', path), fullPath, startLine)\n : theme.fg('toolArgs', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'view'))} ${pathDisplay}${rangeDisplay}${status}`;\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n const status = this.getStatusIndicator();\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = getTermWidth();\n const fixedParts = '╰── view ' + (rangeDisplay ? `:XXX,XXX` : '') + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6 - BOX_INDENT * 2; // 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('toolArgs', path), fullPath, startLine)\n : theme.fg('toolArgs', 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 = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2; // Account for border \"│ \" (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('│') + ' ' + theme.fg('toolOutput', 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('toolBorderSuccess', char));\n const footerText = `${theme.bold(theme.fg('toolTitle', '$'))} ${theme.fg('toolArgs', 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 = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2; // Account for border \"│ \" (2) + buffer (2)\n const borderedLines = outputLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('toolOutput', 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('toolBorderSuccess', char));\n const footerText = `${theme.bold(theme.fg('toolTitle', label))} ${theme.fg('toolArgs', `PID ${pid}`)}${timeSuffix}${status}`;\n\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\n const borderedLines = outputLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('toolOutput', 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('toolArgs', path), fullPath, startLineNum)\n : theme.fg('toolArgs', 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('toolBorderSuccess', char));\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\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('│') + ' ' + theme.fg('toolOutput', 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 — show bordered header\n const editBorder = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const headerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n this.contentBox.addChild(new Text(editBorder('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${editBorder('╰──')} ${headerText}`, 0, 0));\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = getTermWidth();\n const fixedParts = '╰── edit ' + startLine + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6 - BOX_INDENT * 2; // 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('toolArgs', path), fullPath, startLineNum)\n : theme.fg('toolArgs', 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 - 4 - BOX_INDENT * 2;\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('│') + ' ' + theme.fg('toolOutput', 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 - 4 - BOX_INDENT * 2;\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 — show bordered pending header\n const writeBorder = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('toolArgs', path), fullPath) : theme.fg('toolArgs', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n this.contentBox.addChild(new Text(writeBorder('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${writeBorder('╰──')} ${footerText}`, 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('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '╰── write ⋯';\n const availableForPath = termWidth - fixedParts.length - 6 - BOX_INDENT * 2;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('toolArgs', path), fullPath) : theme.fg('toolArgs', 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('│') + ' ' + theme.fg('toolOutput', 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('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '╰── write ✓';\n const availableForPath = termWidth - fixedParts.length - 6 - BOX_INDENT * 2;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('toolArgs', path), fullPath) : theme.fg('toolArgs', 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('│') + ' ' + theme.fg('toolOutput', 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 const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\n\n if (!this.result || this.isPartial) {\n const pathDisplay = fullPath ? fileLink(theme.fg('toolArgs', path), fullPath) : theme.fg('toolArgs', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'list'))} ${pathDisplay}${patternDisplay}${status}`;\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n // Extract summary line (e.g. \"5 directories, 9 files\") from tree output for the footer\n let 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 // Remove the summary line from content if it matched\n if (summaryMatch) {\n lines = lines.slice(0, -1);\n }\n\n const collapsedLines = 15;\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 const pathDisplay = fullPath ? fileLink(theme.fg('toolArgs', path), fullPath) : theme.fg('toolArgs', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'list'))} ${pathDisplay}${patternDisplay}${summaryDisplay}${status}`;\n\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\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('│') + ' ' + theme.fg('toolOutput', 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 }\n }\n\n private renderLspInspectEnhanced(): void {\n const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\n const argsObj = this.args as { path?: string; line?: number; match?: string } | undefined;\n const path_ = argsObj?.path;\n const line = argsObj?.line;\n const match = argsObj?.match;\n\n // Build args summary for footer\n const argsSummary = [\n path_ ? shortenPath(path_.replace(process.cwd() + '/', '')) : null,\n line ? `L${line}` : null,\n match ? truncateAnsi(match.replace(/<<</g, '‹‹‹'), 40) : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (!this.result || this.isPartial) {\n const footerText = `${theme.bold(theme.fg('toolTitle', 'lsp_inspect'))}${argsSummary ? ' ' + theme.fg('toolArgs', argsSummary) : ''}${status}`;\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n // Extract raw text from result\n const rawText = this.result.content\n .filter(c => c.type === 'text' && c.text)\n .map(c => c.text!)\n .join('\\n');\n\n if (this.result.isError || !rawText.trim()) {\n const footerText = `${theme.bold(theme.fg('toolTitle', 'lsp_inspect'))}${argsSummary ? ' ' + theme.fg('toolArgs', argsSummary) : ''}${status}`;\n const output = this.getFormattedOutput();\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n if (output) {\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('error', output), 0, 0));\n }\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n // Parse lsp_inspect result\n let parsed: {\n hover?: { value: string; kind: string };\n diagnostics?: Array<{ severity: string; message: string; source: string | null }>;\n definition?: Array<{ location: string; preview: string | null }>;\n implementation?: string[];\n error?: string;\n };\n try {\n parsed = JSON.parse(rawText);\n } catch {\n // Fall back to generic rendering if not valid JSON\n this.renderGenericToolEnhanced();\n return;\n }\n\n if (parsed.error) {\n const footerText = `${theme.bold(theme.fg('toolTitle', 'lsp_inspect'))}${argsSummary ? ' ' + theme.fg('toolArgs', argsSummary) : ''}${status}`;\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('error', parsed.error), 0, 0));\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n const footerText = `${theme.bold(theme.fg('toolTitle', 'lsp_inspect'))}${argsSummary ? ' ' + theme.fg('toolArgs', argsSummary) : ''}${status}`;\n\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n\n // Render hover content\n if (parsed.hover) {\n const hoverValue = parsed.hover.value || '';\n const hoverLines = hoverValue.split('\\n').filter(line => line.trim() !== '');\n if (hoverLines.length > 0) {\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('toolArgs', 'hover:'), 0, 0));\n }\n for (const line of hoverLines) {\n const truncated = truncateAnsi(line, maxLineWidth - 2);\n const prefix = border('│') + ' ';\n this.contentBox.addChild(new Text(prefix + theme.fg('text', truncated), 0, 0));\n }\n }\n\n // Render line diagnostics\n if (parsed.diagnostics && parsed.diagnostics.length > 0) {\n this.contentBox.addChild(new Text(border('│'), 0, 0));\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('toolArgs', 'diagnostics:'), 0, 0));\n\n for (const diagnostic of parsed.diagnostics) {\n const label = diagnostic.source ? `${diagnostic.severity} (${diagnostic.source})` : diagnostic.severity;\n const diagLine = `${label}: ${diagnostic.message}`;\n this.contentBox.addChild(\n new Text(\n border('│') +\n ' ' +\n theme.fg(diagnostic.severity === 'error' ? 'error' : 'text', truncateAnsi(diagLine, maxLineWidth - 2)),\n 0,\n 0,\n ),\n );\n }\n }\n\n // Render definition entries\n if (parsed.definition && parsed.definition.length > 0) {\n // Add blank line before definition section for visual separation\n this.contentBox.addChild(new Text(border('│'), 0, 0));\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('toolArgs', 'definition:'), 0, 0));\n\n for (const def of parsed.definition) {\n const location = def.location || '';\n const preview = def.preview || '';\n // Parse location: \"$cwd/path:Lline:Cchar\" or just \"path:Lline:Cchar\"\n const parsedLoc = this.parseLspLocation(location);\n const displayLoc = parsedLoc\n ? fileLink(\n theme.fg('toolOutput', parsedLoc.shortPath + ':' + parsedLoc.lineCol),\n parsedLoc.absPath,\n parsedLoc.line,\n )\n : theme.fg('toolOutput', location);\n\n const defLine = border('│') + ' ' + displayLoc;\n this.contentBox.addChild(new Text(truncateAnsi(defLine, maxLineWidth), 0, 0));\n\n if (preview) {\n const previewLine = border('│') + ' ' + theme.fg('text', truncateAnsi(preview, maxLineWidth - 3));\n this.contentBox.addChild(new Text(previewLine, 0, 0));\n }\n }\n }\n\n // Render implementation entries\n if (parsed.implementation && parsed.implementation.length > 0) {\n const implCount = parsed.implementation.length;\n const implLabel = implCount === 1 ? 'implementation:' : `implementations (${implCount}):`;\n\n // Add blank line before implementation section for visual separation\n this.contentBox.addChild(new Text(border('│'), 0, 0));\n\n // Show first few implementations inline, collapse rest\n const maxShow = this.expanded ? parsed.implementation.length : 5;\n const shown = parsed.implementation.slice(0, maxShow);\n const remaining = parsed.implementation.length - maxShow;\n\n this.contentBox.addChild(new Text(border('│') + ' ' + theme.fg('toolArgs', implLabel), 0, 0));\n\n for (const loc of shown) {\n const parsedLoc = this.parseLspLocation(loc);\n const displayLoc = parsedLoc\n ? fileLink(\n theme.fg('toolOutput', parsedLoc.shortPath + ':' + parsedLoc.lineCol),\n parsedLoc.absPath,\n parsedLoc.line,\n )\n : theme.fg('toolOutput', loc);\n const implLine = border('│') + ' ' + displayLoc;\n this.contentBox.addChild(new Text(truncateAnsi(implLine, maxLineWidth), 0, 0));\n }\n\n if (remaining > 0 && !this.expanded) {\n const moreLine = border('│') + ' ' + theme.fg('toolOutput', `... ${remaining} more (ctrl+e to expand)`);\n this.contentBox.addChild(new Text(moreLine, 0, 0));\n }\n }\n\n // Show message if no results found\n if (!parsed.hover && !parsed.diagnostics?.length && !parsed.definition?.length && !parsed.implementation?.length) {\n this.contentBox.addChild(\n new Text(\n border('│') + ' ' + theme.fg('muted', 'No hover, diagnostics, definition, or implementation results'),\n 0,\n 0,\n ),\n );\n }\n\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n }\n\n /**\n * Parse an LSP location string like \"$cwd/path:Lline:Cchar\" into components.\n */\n private parseLspLocation(\n location: string,\n ): { absPath: string; shortPath: string; line: number; lineCol: string } | null {\n // Match patterns like:\n // - \"$cwd/packages/core/src/foo.ts:L10:C5\"\n // - \"/absolute/path/to/file.ts:L1:C1\"\n // - \"path/to/file.ts:L10:C5\"\n const match = location.match(/^(.+?):L(\\d+):C(\\d+)$/);\n if (!match) return null;\n\n const rawPath = match[1]!;\n const line = parseInt(match[2]!, 10);\n const lineCol = `L${match[2]}:C${match[3]}`;\n\n // Resolve to absolute path\n let absPath: string;\n let shortPath: string;\n if (rawPath.startsWith('$cwd/')) {\n absPath = process.cwd() + '/' + rawPath.slice(5);\n shortPath = rawPath.slice(5); // Strip $cwd/ prefix\n } else if (rawPath.startsWith('~')) {\n absPath = os.homedir() + rawPath.slice(1);\n shortPath = shortenPath(absPath);\n } else if (rawPath.startsWith('/')) {\n absPath = rawPath;\n shortPath = absPath.startsWith(process.cwd() + '/')\n ? absPath.slice(process.cwd().length + 1)\n : shortenPath(absPath);\n } else {\n absPath = process.cwd() + '/' + rawPath;\n shortPath = rawPath;\n }\n\n return { absPath, shortPath, line, lineCol };\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 const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n\n // Show a compact bordered 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 footerText = `${theme.bold(theme.fg('toolTitle', 'task_write'))}${countSuffix}${status}`;\n\n this.contentBox.addChild(new Text(border('╭──'), 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(border('│') + ' ' + theme.fg('error', output), 0, 0));\n }\n }\n\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n }\n\n private renderWebSearchEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const action = argsObj?.action as Record<string, unknown> | undefined;\n let query = argsObj?.query ? String(argsObj.query) : action?.query ? String(action.query) : '';\n // Fallback: extract query from result content (OpenAI format: { action: { query } })\n if (!query && this.result) {\n try {\n const raw = this.getFormattedOutput();\n const parsed = JSON.parse(raw);\n if (parsed?.action?.query) query = String(parsed.action.query);\n } catch {\n /* ignore */\n }\n }\n const status = this.getStatusIndicator();\n\n const queryDisplay = query ? ` ${theme.fg('toolArgs', `\"${query}\"`)}` : '';\n const footerText = `${theme.bold(theme.fg('toolTitle', 'web_search'))}${queryDisplay}${status}`;\n const border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n\n if (!this.result || this.isPartial) {\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n if (this.result.isError) {\n this.renderErrorResult(footerText);\n return;\n }\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 = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\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('│') + ' ' + theme.fg('toolOutput', 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\n try {\n const parsed = JSON.parse(raw);\n\n // Anthropic provider format: JSON array of { url, title, pageAge, ... }\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 : '';\n const age = typeof item.pageAge === 'string' && item.pageAge ? theme.fg('muted', ` (${item.pageAge})`) : '';\n if (title) {\n lines.push(` ${theme.fg('toolOutput', title)}${age}`);\n lines.push(` ${theme.fg('muted', url)}`);\n } else {\n lines.push(` ${theme.fg('toolOutput', url)}${age}`);\n }\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\n // OpenAI provider format: { action: { query }, sources: [{ url, title }, ...] }\n if (typeof parsed === 'object' && parsed !== null && Array.isArray(parsed.sources)) {\n const lines: string[] = [];\n for (const source of parsed.sources) {\n if (typeof source !== 'object' || source === null) continue;\n const url = typeof source.url === 'string' ? source.url : '';\n if (!url) continue;\n const title = typeof source.title === 'string' && source.title ? source.title : '';\n if (title) {\n lines.push(` ${theme.fg('toolOutput', title)}`);\n lines.push(` ${theme.fg('muted', url)}`);\n } else {\n lines.push(` ${theme.fg('toolOutput', url)}`);\n }\n }\n if (lines.length > 0) return lines.join('\\n');\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 border = (char: string) => theme.bold(theme.fg('toolBorderSuccess', char));\n const status = this.getStatusIndicator();\n\n const argsSummary = this.formatArgsSummary();\n\n const footerText = `${theme.bold(theme.fg('toolTitle', this.toolName))}${argsSummary}${status}`;\n\n if (!this.result || this.isPartial) {\n // Pending: show bordered header with args preview\n const preview = this.formatArgsPreview();\n this.contentBox.addChild(new Text(border('╭──'), 0, 0));\n if (preview.length > 0) {\n const previewLines = preview.map(line => border('│') + ' ' + theme.fg('toolOutput', line));\n this.contentBox.addChild(new Text(previewLines.join('\\n'), 0, 0));\n }\n this.contentBox.addChild(new Text(`${border('╰──')} ${footerText}`, 0, 0));\n return;\n }\n\n // Use enhanced error display for errors\n if (this.result.isError) {\n this.renderErrorResult(footerText);\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2;\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 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('│') + ' ' + theme.fg('toolOutput', truncated);\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\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 // No output - just show the footer line\n this.contentBox.addChild(new Text(footerText, 0, 0));\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 = getTermWidth();\n const maxLineWidth = termWidth - 4 - BOX_INDENT * 2 - 2; // -2 for \"│ \" border prefix\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 /**\n * Compact inline args summary for the footer line.\n * Shows key=value pairs truncated to fit on one line.\n */\n private formatArgsSummary(): string {\n if (!this.args || typeof this.args !== 'object') return '';\n const argsObj = this.args as Record<string, unknown>;\n const entries = Object.entries(argsObj).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return '';\n\n const termWidth = getTermWidth();\n // Leave room for tool name, status indicator, borders\n const maxLen = Math.max(20, termWidth - this.toolName.length - 15 - BOX_INDENT * 2);\n const parts: string[] = [];\n let currentLen = 0;\n\n for (const [key, raw] of entries) {\n let val: string;\n if (typeof raw === 'string') {\n const firstLine = raw.split('\\n')[0]!;\n val = firstLine.length > 40 ? firstLine.slice(0, 40) + '…' : firstLine;\n val = `\"${val}\"`;\n } else if (Array.isArray(raw)) {\n val = `[${raw.length}]`;\n } else if (typeof raw === 'object' && raw !== null) {\n val = '{…}';\n } else {\n val = String(raw);\n }\n const part = `${key}=${val}`;\n if (currentLen + part.length + 2 > maxLen && parts.length > 0) {\n parts.push('…');\n break;\n }\n parts.push(part);\n currentLen += part.length + 2;\n }\n\n return ' ' + theme.fg('toolArgs', parts.join(', '));\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 const parsed = parseErrorFromContent(content);\n if (parsed) error = parsed;\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/** Parse a `Name: message\\n at ...` error string into an Error object.\n * Returns null if the content does not look like a JavaScript Error.\n * Preserves the behaviour of the original `/^([A-Z][a-zA-Z]*Error):\\s*(.+)$/m`\n * pattern (same captures for well-formed inputs) while using bounded\n * quantifiers and `[ \\t]` separators to avoid the polynomial backtracking\n * CodeQL flagged on pathological inputs.\n * Exported for unit testing.\n */\nexport function parseErrorFromContent(content: string): Error | null {\n const errorMatch = content.match(/^([A-Z][A-Za-z]{0,64}Error):[ \\t]*(.{1,8192})$/m);\n if (!errorMatch) return null;\n const err = new Error(errorMatch[2]!);\n err.name = errorMatch[1]!;\n // Stack frames are always space/tab-indented — never vertical whitespace.\n const stackMatch = content.match(/\\n[ \\t]+at[ \\t]+.+/g);\n if (stackMatch) {\n err.stack = `${err.name}: ${err.message}\\n${stackMatch.join('\\n')}`;\n }\n return err;\n}\n","/**\n * Component that renders a user message with a thin border that fits the content.\n */\n\nimport { Container, Markdown, Spacer, visibleWidth } from '@mariozechner/pi-tui';\nimport type { MarkdownTheme } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { BOX_INDENT_STR, getMarkdownTheme, mastra, tintHex, theme } from '../theme.js';\n\n/**\n * Strip ANSI escape sequences from a string.\n */\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n/**\n * A renderable wrapper that adds a thin box-drawing border sized to content.\n */\nclass BorderedBox {\n private child: { render(width: number): string[]; invalidate?(): void };\n\n constructor(child: { render(width: number): string[]; invalidate?(): void }) {\n this.child = child;\n }\n\n invalidate() {\n this.child.invalidate?.();\n }\n\n render(width: number): string[] {\n const borderColor = (s: string) => chalk.hex(tintHex(mastra.green, 1))(s);\n\n // Border uses 4 chars: \"│ \" (2) on left + \" │\" (2) on right\n // Plus 2 for the \"› \" prompt prefix on the first line\n // Plus BOX_INDENT_STR.length for the left indent\n // Use the tightest constraint (first line with prompt) for Markdown width\n const maxInnerWidth = Math.max(1, width - 6 - 2 - BOX_INDENT_STR.length - 1);\n const childLines = this.child.render(maxInnerWidth);\n\n if (childLines.length === 0) {\n return [];\n }\n\n // Trim trailing whitespace padding that Markdown adds, and measure true content width\n const trimmedLines: string[] = [];\n let maxContentWidth = 0;\n for (const line of childLines) {\n // Markdown appends plain spaces to pad to full width — trim them\n const trimmed = line.replace(/\\s+$/, '');\n trimmedLines.push(trimmed);\n const w = visibleWidth(stripAnsi(trimmed));\n if (w > maxContentWidth) maxContentWidth = w;\n }\n\n // Box inner width = content width + prompt prefix (the \"│ \" and \" │\" add the padding)\n const boxInner = maxContentWidth + 2;\n // Total box width: \"│\" + \" \" + content + \" \" + \"│\" = boxInner + 4\n const boxWidth = boxInner + 4;\n\n const lines: string[] = [];\n\n const promptPrefix = chalk.hex(tintHex(mastra.green, 1))('»') + ' ';\n const promptWidth = 2;\n\n // Top border: ╭──...──╮\n lines.push(borderColor(`╭${'─'.repeat(boxWidth - 2)}╮`));\n\n // Content lines with side borders, first line gets \"> \" prefix\n for (let i = 0; i < trimmedLines.length; i++) {\n const trimmed = trimmedLines[i]!;\n const vis = visibleWidth(stripAnsi(trimmed));\n if (i === 0) {\n const padNeeded = Math.max(0, boxInner - vis - promptWidth);\n lines.push(borderColor('│') + ' ' + promptPrefix + trimmed + ' '.repeat(padNeeded) + ' ' + borderColor('│'));\n } else {\n const padNeeded = Math.max(0, boxInner - vis);\n lines.push(borderColor('│') + ' ' + trimmed + ' '.repeat(padNeeded) + ' ' + borderColor('│'));\n }\n }\n\n // Bottom border: ╰──...──╯\n lines.push(borderColor(`╰${'─'.repeat(boxWidth - 2)}╯`));\n\n return lines.map(l => BOX_INDENT_STR + l);\n }\n}\n\nexport class UserMessageComponent extends Container {\n constructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n super();\n\n const md = new Markdown(text, 0, 0, markdownTheme, {\n color: (text: string) => theme.fg('text', text),\n italic: false,\n });\n\n this.addChild(new BorderedBox(md));\n this.addChild(new Spacer(1));\n }\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 { BOX_INDENT, 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}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n\n const totalMinutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (totalMinutes < 60) return seconds === 0 ? `${totalMinutes}m` : `${totalMinutes}m${seconds}s`;\n\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return minutes === 0 ? `${hours}h` : `${hours}h${minutes}m`;\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 type: 'om_activation_ttl';\n activateAfterIdle: number;\n ttlExpiredMs: number;\n }\n | {\n type: 'om_activation_provider_change';\n previousModel: string;\n currentModel: string;\n }\n | {\n type: 'om_thread_title_updated';\n oldTitle?: string;\n newTitle: string;\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 this.textChild = new Text(formatMarker(data), BOX_INDENT, 0);\n this.addChild(this.textChild);\n this.addChild(new Spacer(1));\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 = 'operationType' in data && 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 if (data.operationType === 'reflection') {\n // For reflection, tokensActivated = obs tokens before, observationTokens = obs tokens after.\n // Reflection compresses observations in place — no message tokens move.\n const before = formatTokens(data.tokensActivated);\n const after = formatTokens(data.observationTokens);\n const delta = data.tokensActivated - data.observationTokens;\n const deltaStr = delta > 0 ? ` (-${formatTokens(delta)})` : delta < 0 ? ` (+${formatTokens(-delta)})` : '';\n return theme.fg('success', ` ✓ Activated reflection: ${before} → ${after} obs tokens${deltaStr}`);\n }\n const msgTokens = formatTokens(data.tokensActivated);\n const obsTokens = formatTokens(data.observationTokens);\n return theme.fg('success', ` ✓ Activated observations: -${msgTokens} msg tokens, +${obsTokens} obs tokens`);\n }\n case 'om_activation_ttl': {\n return theme.fg(\n 'muted',\n ` Idle timeout (${formatDuration(data.activateAfterIdle)}) exceeded by ${formatDuration(data.ttlExpiredMs)}, activating observations`,\n );\n }\n case 'om_activation_provider_change': {\n return theme.fg('muted', ` Model changed ${data.previousModel} → ${data.currentModel}, activating observations`);\n }\n case 'om_thread_title_updated': {\n return theme.fg('muted', ` thread title updated: ${data.newTitle}`);\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 { BOX_INDENT, getTermWidth, mastra } from '../theme.js';\n\n// Read from proxy at render time so they pick up contrast adaptation\nconst getObserverColor = () => mastra.orange;\nconst getReflectorColor = () => 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;]{0,32}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\n const isReflection = this.data.type === 'reflection';\n const color = isReflection ? getReflectorColor() : getObserverColor();\n const border = (char: string) => chalk.bold.hex(color)(char);\n\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 6 - BOX_INDENT * 2; // \"│ \" prefix + buffer + indent\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('╭──'), BOX_INDENT, 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, BOX_INDENT, 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 - BOX_INDENT * 2), BOX_INDENT, 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 - BOX_INDENT * 2), BOX_INDENT, 0));\n }\n\n // Bottom border with footer\n this.addChild(new Text(`${border('╰──')} ${footerText}`, BOX_INDENT, 0));\n this.addChild(new Spacer(1));\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 * 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 { BOX_INDENT, 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 // Main content box - no background, paddingX=1 to align with user message box\n this.contentBox = new Box(BOX_INDENT, 0, (text: string) => text);\n this.addChild(this.contentBox);\n this.addChild(new Spacer(1));\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 color: (text: string) => theme.fg('text', text),\n });\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 color: (text: string) => theme.fg('text', text),\n });\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\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 color: (text: string) => theme.fg('text', text),\n });\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 const contentBox = new Box(BOX_INDENT, 0, (text: string) => 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 color: (text: string) => theme.fg('text', text),\n });\n contentBox.addChild(md);\n this.addChild(new Spacer(1));\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 { safeStringify } from '@mastra/core/utils';\nimport { BOX_INDENT, getTermWidth, 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 /** True when this subagent is running on a forked copy of the parent thread. */\n forked?: 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 private forked: 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 this.forked = options?.forked ?? 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 : safeStringify(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\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = getTermWidth();\n const maxLineWidth = termWidth - 6 - BOX_INDENT * 2;\n\n // ── Bottom border with info (always rendered) ──\n const typeLabelText = this.forked ? 'fork' : this.agentType;\n const typeLabel = theme.bold(theme.fg('accent', typeLabelText));\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}`, BOX_INDENT, 0));\n this.invalidate();\n this.ui.requestRender();\n return;\n }\n\n // ── Top border ──\n this.addChild(new Text(border('╭──'), BOX_INDENT, 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, BOX_INDENT, 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}`, BOX_INDENT, 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', '───')}`, BOX_INDENT, 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}`, BOX_INDENT, 0));\n }\n\n const activityContent = displayLines.map(line => `${border('│')} ${line}`).join('\\n');\n this.addChild(new Text(activityContent, BOX_INDENT, 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}`, BOX_INDENT, 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', '───')}`, BOX_INDENT, 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, BOX_INDENT, 0));\n }\n }\n\n // ── Bottom border ──\n this.addChild(new Text(`${border('╰──')} ${footerText}`, BOX_INDENT, 0));\n this.addChild(new Spacer(1));\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 * 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 { safeStringify } from '@mastra/core/utils';\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 let str: string;\n if (typeof value === 'string') {\n str = value;\n } else {\n str = safeStringify(value);\n }\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 */\n\nimport type { TaskItem } from '@mastra/core/harness';\nimport { safeStringify } from '@mastra/core/utils';\nimport { parse as parsePartialJson } from 'partial-json';\n\nimport { getToolCategory, TOOL_CATEGORIES } from '../../permissions.js';\nimport { AskQuestionInlineComponent } from '../components/ask-question-inline.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 safeStringify(result, 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 // Skip creating regular component for ask_user — it uses AskQuestionInlineComponent\n // (normally created by handleToolInputStart, but handleToolStart may fire first)\n if (toolName === 'ask_user') {\n return;\n }\n\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 submit_plan tool components for inline plan approval placement\n const component = state.pendingTools.get(toolCallId);\n if (component && toolName === 'submit_plan') {\n state.lastSubmitPlanComponent = component;\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 state.ui.requestRender();\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 state.ui.requestRender();\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),\n // task_write (streams to pinned TaskProgressComponent),\n // and ask_user (uses AskQuestionInlineComponent)\n if (toolName === 'ask_user') {\n const askComponent = AskQuestionInlineComponent.createStreaming();\n ctx.addChildBeforeFollowUps(askComponent);\n state.lastAskUserComponent = askComponent;\n state.pendingAskUserComponents.set(toolCallId, askComponent);\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 } else 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 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 ask_user, stream partial args into the question component\n if (buffer.toolName === 'ask_user') {\n const askComponent = state.pendingAskUserComponents.get(toolCallId);\n if (askComponent) {\n try {\n askComponent.updateArgs(partialArgs);\n } catch {\n // Don't crash on malformed partial args\n }\n }\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 state.ui.requestRender();\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 // Clean up ask_user component tracking\n state.pendingAskUserComponents.delete(toolCallId);\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 state.ui.requestRender();\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 { Component } from '@mariozechner/pi-tui';\nimport type { HarnessMessage, HarnessMessageContent, TaskItem } from '@mastra/core/harness';\nimport { parseSubagentMeta } from '@mastra/core/harness';\nimport chalk from 'chalk';\nimport { AskQuestionInlineComponent } from './components/ask-question-inline.js';\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 { TemporalGapComponent } from './components/temporal-gap.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 { BOX_INDENT, 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 Text(headerText, BOX_INDENT, 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}`, BOX_INDENT, 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 BOX_INDENT,\n 0,\n ),\n );\n }\n container.addChild(new Spacer(1));\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 const count = clearedTasks.length;\n const label = count === 1 ? 'Task' : 'Tasks';\n container.addChild(new Text(theme.fg('accent', `${label} cleared`), BOX_INDENT, 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}`, BOX_INDENT, 0));\n }\n container.addChild(new Spacer(1));\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\nfunction createReminderComponent(\n reminderType: string | undefined,\n options: { message?: string; path?: string; gapText?: string },\n): SystemReminderComponent | TemporalGapComponent {\n if (reminderType === 'temporal-gap') {\n return new TemporalGapComponent({\n message: options.message,\n gapText: options.gapText,\n });\n }\n\n return new SystemReminderComponent({\n message: options.message,\n reminderType,\n path: options.path,\n });\n}\n\nfunction addChildBeforeFollowUps(state: TUIState, child: Component): void {\n if (state.followUpComponents.length > 0) {\n const firstFollowUp = state.followUpComponents[0];\n const idx = state.chatContainer.children.indexOf(firstFollowUp as never);\n if (idx >= 0) {\n (state.chatContainer.children as unknown[]).splice(idx, 0, child);\n state.chatContainer.invalidate();\n return;\n }\n }\n\n state.chatContainer.addChild(child);\n}\n\nexport function addChildBeforeMessageOrFollowUps(state: TUIState, child: Component, precedesMessageId?: string): void {\n if (precedesMessageId) {\n const anchor = state.messageComponentsById.get(precedesMessageId);\n if (anchor) {\n const idx = state.chatContainer.children.indexOf(anchor as never);\n if (idx >= 0) {\n (state.chatContainer.children as unknown[]).splice(idx, 0, child);\n state.chatContainer.invalidate();\n return;\n }\n }\n }\n\n addChildBeforeFollowUps(state, child);\n}\n\n/**\n * Add a user message to the chat container.\n */\nexport function addUserMessage(state: TUIState, message: HarnessMessage): void {\n const reminderPart = message.content.find(\n (content): content is Extract<HarnessMessageContent, { type: 'system_reminder' }> =>\n content.type === 'system_reminder',\n );\n\n if (reminderPart) {\n const reminderComponent = createReminderComponent(reminderPart.reminderType, {\n message: reminderPart.message,\n path: reminderPart.path,\n gapText: reminderPart.gapText,\n });\n reminderComponent.setExpanded(state.toolOutputExpanded);\n state.allSystemReminderComponents.push(reminderComponent);\n\n addChildBeforeMessageOrFollowUps(state, reminderComponent, reminderPart.precedesMessageId);\n state.ui.requestRender();\n return;\n }\n\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 const exactDisplayText = displayText.trim();\n\n const legacyReminderMatch = exactDisplayText.match(\n /^<system-reminder(?<attrs>\\s+[^>]*)?>(?<body>[\\s\\S]*?)<\\/system-reminder>$/,\n );\n if (legacyReminderMatch?.groups?.body) {\n const attrs = legacyReminderMatch.groups.attrs ?? '';\n const reminderType = attrs.match(/\\stype=\"([^\"]+)\"/)?.[1];\n const path = attrs.match(/\\spath=\"([^\"]+)\"/)?.[1];\n const precedesMessageId = attrs.match(/\\sprecedesMessageId=\"([^\"]+)\"/)?.[1];\n const reminderText = legacyReminderMatch.groups.body.trim();\n const reminderComponent = createReminderComponent(reminderType, {\n message: reminderText,\n path,\n gapText: reminderType === 'temporal-gap' ? reminderText.split(' — ')[0]?.trim() : undefined,\n });\n reminderComponent.setExpanded(state.toolOutputExpanded);\n state.allSystemReminderComponents.push(reminderComponent);\n\n addChildBeforeMessageOrFollowUps(state, reminderComponent, precedesMessageId);\n state.ui.requestRender();\n return;\n }\n\n // Check for persisted slash command tags.\n const slashCommandMatch = exactDisplayText.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 state.messageComponentsById.set(message.id, userComponent);\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 state.allSystemReminderComponents = [];\n state.messageComponentsById.clear();\n state.allShellComponents = [];\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 forked?: boolean;\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 currentModelId =\n typeof (state.harness as { getFullModelId?: () => string }).getFullModelId === 'function'\n ? (state.harness as { getFullModelId: () => string }).getFullModelId()\n : undefined;\n const modelId = meta?.modelId ?? subArgs?.modelId ?? (subArgs?.forked ? currentModelId : undefined);\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, forked: subArgs?.forked },\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 ask_user with the proper question component\n if (content.name === 'ask_user' && toolResult?.type === 'tool_result') {\n const askArgs = content.args as\n | { question?: string; options?: Array<{ label: string; description?: string }> }\n | undefined;\n const answer =\n typeof toolResult.result === 'string' ? toolResult.result : formatToolResult(toolResult.result);\n const cancelled = answer === '(skipped)';\n if (askArgs?.question) {\n const askComponent = AskQuestionInlineComponent.fromHistory(\n askArgs.question,\n askArgs.options,\n answer,\n cancelled,\n );\n state.chatContainer.addChild(askComponent);\n continue;\n }\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 } else if (content.type === 'om_thread_title_updated') {\n // Render thread title update marker in history\n state.chatContainer.addChild(\n new OMMarkerComponent({\n type: 'om_thread_title_updated',\n newTitle: content.newTitle,\n oldTitle: content.oldTitle,\n }),\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","/**\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 type { HarnessMessage, HarnessMessageContent } from '@mastra/core/harness';\n\nimport { AssistantMessageComponent } from '../components/assistant-message.js';\nimport { SystemReminderComponent } from '../components/system-reminder.js';\nimport { TemporalGapComponent } from '../components/temporal-gap.js';\nimport { ToolExecutionComponentEnhanced } from '../components/tool-execution-enhanced.js';\nimport { UserMessageComponent } from '../components/user-message.js';\nimport { addChildBeforeMessageOrFollowUps } from '../render-messages.js';\nimport { getMarkdownTheme } from '../theme.js';\n\nimport type { EventHandlerContext } from './types.js';\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 (isInlineBoundary(c)) {\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\n/**\n * Get content parts between the last processed tool call and this one (text/thinking only).\n */\ntype StreamedSystemReminderPart = {\n type: 'system_reminder';\n message?: string;\n reminderType?: string;\n path?: string;\n precedesMessageId?: string;\n gapText?: string;\n};\n\nfunction isInlineBoundary(part: HarnessMessageContent): boolean {\n return (\n part.type === 'tool_call' || part.type === 'tool_result' || (part as { type?: string }).type === 'system_reminder'\n );\n}\n\nfunction isSystemReminderPart(part: HarnessMessageContent): boolean {\n return (part as { type?: string }).type === 'system_reminder';\n}\n\nfunction toStreamedSystemReminderPart(part: HarnessMessageContent): StreamedSystemReminderPart | undefined {\n if (!isSystemReminderPart(part)) return undefined;\n const reminder = part as unknown as Partial<StreamedSystemReminderPart>;\n\n return {\n type: 'system_reminder',\n message: typeof reminder.message === 'string' ? reminder.message : undefined,\n reminderType: reminder.reminderType,\n path: reminder.path,\n precedesMessageId: typeof reminder.precedesMessageId === 'string' ? reminder.precedesMessageId : undefined,\n gapText: typeof reminder.gapText === 'string' ? reminder.gapText : undefined,\n };\n}\n\nfunction createReminderComponent(reminder: StreamedSystemReminderPart): SystemReminderComponent | TemporalGapComponent {\n if (reminder.reminderType === 'temporal-gap') {\n return new TemporalGapComponent({\n message: reminder.message,\n gapText: reminder.gapText,\n });\n }\n\n return new SystemReminderComponent({\n message: reminder.message,\n reminderType: reminder.reminderType,\n path: reminder.path,\n });\n}\n\nfunction addInlineReminder(ctx: EventHandlerContext, reminder: StreamedSystemReminderPart): void {\n const { state } = ctx;\n const component = createReminderComponent(reminder);\n component.setExpanded(state.toolOutputExpanded);\n state.allSystemReminderComponents.push(component);\n\n if (reminder.precedesMessageId && !state.messageComponentsById.has(reminder.precedesMessageId)) {\n const latestUserComponent = [...state.chatContainer.children]\n .reverse()\n .find(child => child instanceof UserMessageComponent);\n\n if (latestUserComponent) {\n const idx = state.chatContainer.children.indexOf(latestUserComponent as never);\n if (idx >= 0) {\n (state.chatContainer.children as unknown[]).splice(idx, 0, component);\n state.chatContainer.invalidate();\n return;\n }\n }\n }\n\n if (state.streamingComponent && !reminder.precedesMessageId) {\n const idx = state.chatContainer.children.indexOf(state.streamingComponent as never);\n if (idx >= 0) {\n (state.chatContainer.children as unknown[]).splice(idx, 0, component);\n state.chatContainer.invalidate();\n return;\n }\n }\n\n addChildBeforeMessageOrFollowUps(state, component, reminder.precedesMessageId);\n}\n\nfunction getContentBeforeToolCall(\n message: HarnessMessage,\n toolCallId: string,\n seenToolCallIds: Set<string>,\n): HarnessMessage['content'] {\n const idx = message.content.findIndex(c => c.type === 'tool_call' && c.id === toolCallId);\n if (idx === -1) return message.content;\n // Find the start: after the last tool_call/tool_result that we've already seen\n let startIdx = 0;\n for (let i = idx - 1; i >= 0; i--) {\n const c = message.content[i]!;\n if (\n (c.type === 'tool_call' && 'id' in c && seenToolCallIds.has(c.id)) ||\n (c.type === 'tool_result' && 'id' in c && seenToolCallIds.has(c.id))\n ) {\n startIdx = i + 1;\n break;\n }\n }\n\n return message.content.slice(startIdx, idx).filter(c => c.type === 'text' || c.type === 'thinking');\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 { state } = ctx;\n if (message.role !== 'assistant') return;\n\n const systemReminderParts = message.content\n .map(toStreamedSystemReminderPart)\n .filter((part): part is StreamedSystemReminderPart => part !== undefined);\n\n for (const reminder of systemReminderParts) {\n const reminderKey = `${message.id}:${reminder.reminderType ?? ''}:${reminder.path ?? ''}:${reminder.message}`;\n if (!state.currentRunSystemReminderKeys.has(reminderKey)) {\n state.currentRunSystemReminderKeys.add(reminderKey);\n addInlineReminder(ctx, reminder);\n }\n }\n\n if (!state.streamingComponent) {\n if (systemReminderParts.length > 0) {\n state.ui.requestRender();\n }\n return;\n }\n\n state.streamingMessage = message;\n // Check for new tool calls\n for (const content of message.content) {\n if (content.type === 'tool_call') {\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 // Freeze current component with pre-subagent content\n const preContent = getContentBeforeToolCall(message, content.id, state.seenToolCallIds);\n state.streamingComponent.updateContent({\n ...message,\n content: preContent,\n });\n state.streamingComponent = new AssistantMessageComponent(\n undefined,\n state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n continue;\n }\n\n if (!state.seenToolCallIds.has(content.id)) {\n state.seenToolCallIds.add(content.id);\n\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(\n undefined,\n state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n ctx.addChildBeforeFollowUps(state.streamingComponent);\n } else {\n const component = state.pendingTools.get(content.id);\n if (component) {\n component.updateArgs(content.args);\n }\n }\n }\n }\n\n const trailingParts = getTrailingContentParts(message);\n // Avoid replacing visible assistant text with an empty trailing segment\n // (commonly happens immediately after tool_result-only updates).\n if (trailingParts.length > 0) {\n state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n }\n\n state.ui.requestRender();\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 state.currentRunSystemReminderKeys.clear();\n }\n state.ui.requestRender();\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';\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 if (state.streamingComponent) {\n const idx = state.chatContainer.children.indexOf(state.streamingComponent);\n if (idx >= 0) {\n state.chatContainer.children.splice(idx, 0, child);\n state.chatContainer.invalidate();\n return;\n }\n }\n state.chatContainer.addChild(child);\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 const idx = state.chatContainer.children.indexOf(state.activeOMMarker);\n if (idx >= 0) {\n state.chatContainer.children.splice(idx, 1);\n state.chatContainer.invalidate();\n }\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 const idx = state.chatContainer.children.indexOf(state.activeOMMarker);\n if (idx >= 0) {\n state.chatContainer.children.splice(idx, 1);\n state.chatContainer.invalidate();\n }\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.activeActivationTTLMarker = undefined;\n state.activeActivationProviderChangeMarker = 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 triggeredBy?: 'threshold' | 'ttl' | 'provider_change',\n activateAfterIdle?: number,\n ttlExpiredMs?: number,\n previousModel?: string,\n currentModel?: string,\n): void {\n const { state } = ctx;\n\n if (triggeredBy === 'ttl' && activateAfterIdle !== undefined && ttlExpiredMs !== undefined) {\n const ttlData: OMMarkerData = {\n type: 'om_activation_ttl',\n activateAfterIdle,\n ttlExpiredMs,\n };\n\n if (state.activeActivationTTLMarker) {\n state.activeActivationTTLMarker.update(ttlData);\n } else {\n state.activeActivationTTLMarker = new OMMarkerComponent(ttlData);\n addChildBeforeStreaming(ctx, state.activeActivationTTLMarker);\n }\n }\n\n if (triggeredBy === 'provider_change' && previousModel && currentModel) {\n const providerChangeData: OMMarkerData = {\n type: 'om_activation_provider_change',\n previousModel,\n currentModel,\n };\n\n if (state.activeActivationProviderChangeMarker) {\n state.activeActivationProviderChangeMarker.update(providerChangeData);\n } else {\n state.activeActivationProviderChangeMarker = new OMMarkerComponent(providerChangeData);\n addChildBeforeStreaming(ctx, state.activeActivationProviderChangeMarker);\n }\n }\n\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\nexport function handleOMThreadTitleUpdated(ctx: EventHandlerContext, newTitle: string, oldTitle?: string): void {\n const marker = new OMMarkerComponent({\n type: 'om_thread_title_updated',\n newTitle,\n oldTitle,\n });\n addChildBeforeStreaming(ctx, marker);\n ctx.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 = opts.plansDir ?? process.env.MASTRA_PLANS_DIR ?? 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, Component } 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 static readonly CUSTOM_RESPONSE_VALUE = '__custom_response__';\n\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit: (answer: string) => void;\n private onCancel: () => void;\n\n /** Children added by buildSelectMode/buildInputMode, tracked for removal on mode switch */\n private modeChildren: Component[] = [];\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 // Append a \"Custom response...\" option so the user can type a free-text answer\n items.push({\n value: AskQuestionDialogComponent.CUSTOM_RESPONSE_VALUE,\n label: ` ${theme.fg('dim', '✎ Custom response...')}`,\n });\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n if (item.value === AskQuestionDialogComponent.CUSTOM_RESPONSE_VALUE) {\n this.switchToCustomInput();\n return;\n }\n this.onSubmit(item.value);\n };\n this.selectList.onCancel = this.onCancel;\n\n this.modeChildren = [];\n const selectChild = this.selectList;\n this.addChild(selectChild);\n this.modeChildren.push(selectChild);\n const spacer = new Spacer(1);\n this.addChild(spacer);\n this.modeChildren.push(spacer);\n const hint = new Text(theme.fg('dim', ' ↑↓ to navigate · Enter to select · Esc to skip'), 0, 0);\n this.addChild(hint);\n this.modeChildren.push(hint);\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.modeChildren = [];\n const inputChild = this.input;\n this.addChild(inputChild);\n this.modeChildren.push(inputChild);\n const spacer = new Spacer(1);\n this.addChild(spacer);\n this.modeChildren.push(spacer);\n const hint = new Text(theme.fg('dim', ' Enter to submit · Esc to skip'), 0, 0);\n this.addChild(hint);\n this.modeChildren.push(hint);\n }\n\n private switchToCustomInput(): void {\n // Remove select mode children\n for (const child of this.modeChildren) {\n this.removeChild(child);\n }\n this.selectList = undefined;\n this.buildInputMode();\n if (this.input) this.input.focused = this._focused;\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 * Event handlers for interactive prompt events:\n * ask_question, sandbox_access_request, plan_approval_required.\n */\nimport { savePlanToDisk } from '../../utils/plans.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\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 try {\n let questionComponent: AskQuestionInlineComponent;\n\n if (askUserComponent) {\n // Activate the existing streaming component with interactive elements\n askUserComponent.activate({\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 questionComponent = askUserComponent;\n } else {\n // Fallback: create a new component if no streaming one exists\n 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 state.chatContainer.addChild(questionComponent);\n }\n\n // Store as active question\n state.activeInlineQuestion = questionComponent;\n\n state.ui.requestRender();\n\n // Ensure the chat scrolls to show the question\n state.chatContainer.invalidate();\n\n // Focus the question component\n questionComponent.focused = true;\n } catch {\n // Don't let ask_user errors crash the process — skip the question\n state.activeInlineQuestion = undefined;\n state.harness.respondToQuestion({ questionId, answer: '(skipped)' });\n resolve();\n processNextInlineQuestion(state);\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 state.chatContainer.addChild(questionComponent);\n questionComponent.focused = true;\n state.ui.requestRender();\n state.chatContainer.invalidate();\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 const children = [...state.chatContainer.children];\n const submitPlanIndex = children.indexOf(state.lastSubmitPlanComponent as any);\n if (submitPlanIndex >= 0) {\n state.chatContainer.clear();\n for (let i = 0; i <= submitPlanIndex; i++) {\n state.chatContainer.addChild(children[i]!);\n }\n state.chatContainer.addChild(approvalComponent);\n for (let i = submitPlanIndex + 1; i < children.length; i++) {\n state.chatContainer.addChild(children[i]!);\n }\n } else {\n state.chatContainer.addChild(approvalComponent);\n }\n } else {\n state.chatContainer.addChild(approvalComponent);\n }\n state.ui.requestRender();\n state.chatContainer.invalidate();\n approvalComponent.focused = true;\n\n ctx.notify('plan_approval', `Plan \"${title}\" requires approval`);\n });\n}\n","/**\n * Event handlers for subagent delegation events:\n * subagent_start, subagent_tool_start, subagent_tool_end, subagent_end.\n */\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 forked?: boolean,\n): void {\n const { state } = ctx;\n const component = new SubagentExecutionComponent(agentType, task, state.ui, modelId, {\n collapseOnComplete: state.quietMode,\n forked,\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 if (state.streamingComponent) {\n const idx = state.chatContainer.children.indexOf(state.streamingComponent as any);\n if (idx >= 0) {\n (state.chatContainer.children as unknown[]).splice(idx, 0, component);\n state.chatContainer.invalidate();\n } else {\n state.chatContainer.addChild(component);\n }\n } else {\n state.chatContainer.addChild(component);\n }\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 ctx.state.ui.requestRender();\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 ctx.state.ui.requestRender();\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 ctx.state.ui.requestRender();\n }\n}\n","/**\n * Event dispatcher: maps HarnessEvent types to extracted handler functions.\n */\nimport type { HarnessEvent, HarnessThread, 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 handleOMThreadTitleUpdated,\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 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 // Clear per-thread ephemeral state first so renderExistingMessages\n // and other downstream observers see clean state.\n await state.harness.setState({ tasks: [], activePlan: null, sandboxAllowedPaths: [] });\n if (state.taskProgress) {\n state.taskProgress.updateTasks([]);\n state.ui.requestRender();\n }\n state.taskWriteInsertIndex = -1;\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 // Update current thread title for status line display\n const threads = await state.harness.listThreads();\n const currentThread = threads.find((t: HarnessThread) => t.id === event.threadId);\n if (currentThread) {\n state.currentThreadTitle = currentThread.title;\n }\n break;\n }\n\n case 'thread_created': {\n ectx.showInfo(`Created thread: ${event.thread.id}`);\n // Update current thread title for status line display\n state.currentThreadTitle = event.thread.title;\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 per-thread ephemeral state so new threads start clean.\n await state.harness.setState({ tasks: [], activePlan: null, sandboxAllowedPaths: [] });\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 const activationEvent = event as Extract<HarnessEvent, { type: 'om_activation' }> & {\n triggeredBy?: 'threshold' | 'ttl' | 'provider_change';\n lastActivityAt?: number;\n ttlExpiredMs?: number;\n activateAfterIdle?: number;\n previousModel?: string;\n currentModel?: string;\n };\n handleOMActivation(\n ectx,\n activationEvent.operationType,\n activationEvent.tokensActivated,\n activationEvent.observationTokens,\n activationEvent.triggeredBy,\n activationEvent.activateAfterIdle,\n activationEvent.ttlExpiredMs,\n activationEvent.previousModel,\n activationEvent.currentModel,\n );\n break;\n }\n\n case 'om_thread_title_updated':\n state.currentThreadTitle = event.newTitle;\n handleOMThreadTitleUpdated(ectx, event.newTitle, event.oldTitle);\n ectx.updateStatusLine();\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, event.forked);\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 state.chatContainer.removeChild(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 state.ui.requestRender();\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","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { parse as parseYaml } from '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 = parseYaml(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 * @param dirPath - Current directory to scan\n * @param rootDir - Original root commands directory (used for namespace derivation).\n * When omitted the first call sets it to dirPath.\n */\nexport async function scanCommandDirectory(dirPath: string, rootDir?: string): Promise<SlashCommandMetadata[]> {\n const baseDir = rootDir ?? dirPath;\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, preserving the root directory for namespace derivation\n const subCommands = await scanCommandDirectory(fullPath, baseDir);\n commands.push(...subCommands);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n // Parse markdown command files, passing the root commands dir as baseDir for name derivation\n const command = await parseCommandFile(fullPath, baseDir);\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 // Use a Map so later (higher priority) sources override earlier ones with the same name\n const commandMap = new Map<string, SlashCommandMetadata>();\n\n const addCommands = (newCommands: SlashCommandMetadata[]) => {\n for (const cmd of newCommands) {\n commandMap.set(cmd.name, cmd);\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 mastra user directory ~/.mastracode/commands\n if (homeDir) {\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 mastra project directory .mastracode/commands (highest priority)\n if (projectDir) {\n const mastraProjectDir = path.join(projectDir, '.mastracode', 'commands');\n const mastraProjectCommands = await scanCommandDirectory(mastraProjectDir);\n addCommands(mastraProjectCommands);\n }\n\n return Array.from(commandMap.values());\n}\n\n/**\n * Get the commands directory path for a project\n */\nexport function getProjectCommandsDir(projectDir: string): string {\n return path.join(projectDir, '.mastracode', '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 Mastra Code TUI header.\n * Renders \"MASTRA CODE\" or \"MASTRA\" in block-letter art with a green gradient.\n */\nimport chalk from 'chalk';\n\nimport { theme } from '../theme.js';\n\n// Mastra brand green gradient stops (left → right)\nconst GRADIENT_STOPS = ['#085314', '#0d8020', '#16c858', '#62f69d', '#a1fac7'];\n\n// Full \"MASTRA CODE\" banner (42 chars wide)\nconst FULL_ART = [\n '█▀▄▀█ ▄▀█ █▀ ▀█▀ █▀█ ▄▀█ █▀▀ █▀█ █▀▄ █▀▀',\n '█ ▀ █ █▀█ ▀█ █ █▀▄ █▀█ █ █ █ █ █ █▀▀',\n '▀ ▀ ▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀ ▀▀▀',\n];\n\n// Short \"MASTRA\" banner (24 chars wide)\nconst SHORT_ART = ['█▀▄▀█ ▄▀█ █▀ ▀█▀ █▀█ ▄▀█', '█ ▀ █ █▀█ ▀█ █ █▀▄ █▀█', '▀ ▀ ▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀'];\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 purple 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. Block art is only used for \"Mastra Code\" (default).\n * @returns Styled multi-line string ready for display.\n */\nexport function renderBanner(version: string, appName?: string): string {\n const name = appName || 'Mastra Code';\n\n // Custom app names get the simple text format (no Mastra branding)\n if (name !== 'Mastra Code') {\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', 'Mastra Code')) + theme.fg('dim', ` v${version}`)\n );\n }\n\n // Select art based on available width\n const art = cols >= 50 ? FULL_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 } 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 { renderBanner } from './components/banner.js';\nimport { TaskProgressComponent } from './components/task-progress.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) {\n state.lastClearedText = current;\n }\n state.editor.setText('');\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 (state.lastClearedText && state.editor.getText().length === 0) {\n state.editor.setText(state.lastClearedText);\n state.lastClearedText = '';\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 for (const reminder of state.allSystemReminderComponents) {\n reminder.setExpanded(state.toolOutputExpanded);\n }\n for (const shell of state.allShellComponents) {\n shell.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.getExpandedText());\n return true;\n }\n\n const text = state.editor.getExpandedText().trim();\n if (!text) {\n return true;\n }\n\n state.editor.addToHistory(text);\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 || 'Mastra Code';\n const version = state.options.version || '0.1.0';\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.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\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: 'thread', description: 'Show current thread info' },\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 mastracode issues' },\n { name: 'setup', description: 'Re-run the setup wizard' },\n { name: 'browser', description: 'Configure browser automation' },\n { name: 'theme', description: 'Switch color theme (auto/dark/light)' },\n { name: 'update', description: 'Check for and install updates' },\n { name: 'api-keys', description: 'Manage API keys for model providers' },\n { name: 'observability', description: 'Configure cloud observability' },\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 try {\n await handleEvent(event);\n } catch (err) {\n // Log but don't crash — individual event errors shouldn't kill the process\n const msg = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n process.stderr.write(`[event error] ${event.type}: ${msg}\\n`);\n if (stack) process.stderr.write(stack + '\\n');\n }\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 || 'Mastra Code';\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 tasks = state.harness.getDisplayState().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 { getTermWidth, theme } from '../theme.js';\nimport { truncateAnsi } from './ansi.js';\n\nconst MAX_LINES = 200;\nconst COLLAPSED_LINES = 20;\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 private expanded = false;\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 setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.rebuild();\n }\n\n isExpanded(): boolean {\n return this.expanded;\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 = getTermWidth();\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 maxVisible = this.expanded ? MAX_LINES : COLLAPSED_LINES;\n const truncated = displayLines.length > maxVisible;\n const visibleLines = truncated ? displayLines.slice(-maxVisible) : displayLines;\n\n const borderedLines = visibleLines.map(line => {\n const truncatedLine = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncatedLine;\n });\n\n if (truncated) {\n const remaining = displayLines.length - maxVisible;\n const action = this.expanded ? 'collapse' : 'expand';\n borderedLines.push(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (Ctrl+E to ${action})`));\n }\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 { 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 if (state.toolOutputExpanded) {\n component.setExpanded(true);\n }\n state.allShellComponents.push(component);\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 state.ui.requestRender();\n });\n }\n if (subprocess.stderr) {\n subprocess.stderr.setEncoding('utf8');\n subprocess.stderr.on('data', (chunk: string) => {\n component.appendOutput(chunk);\n state.ui.requestRender();\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 * 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 chalk from 'chalk';\nimport { getClipboardImage, getClipboardText } from '../../clipboard/index.js';\nimport type { ClipboardImage } from '../../clipboard/index.js';\nimport { mastra, theme } from '../theme.js';\nimport type { GradientAnimator } from './obi-loader.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\n// Pre-compiled constants (avoid re-creation per render)\nconst ANSI_STRIP_RE = /\\x1b\\[[0-9;]*m/g;\nconst SLASH_CURSOR_RE = /\\x1b\\[7m\\/\\x1b\\[0m/;\nconst AT_CURSOR_RE = /\\x1b\\[7m@\\x1b\\[0m/;\nfunction parseHex(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\nconst DEFAULT_PROMPT_ICON = '•';\nconst PROMPT_ICON_CHOICES = [\n '☯',\n '✺',\n '☻',\n '✿',\n '◒',\n '◓',\n '♞',\n '☘',\n '☸',\n '❂',\n '❁',\n '✽',\n '❉',\n '✹',\n '❨',\n '❩',\n '✚',\n '⚉',\n '❣',\n '❥',\n '♫',\n '❤',\n] as const;\n\nfunction getRandomPromptIcon(currentIcon: string): string {\n if (Math.random() < 0.99) {\n return DEFAULT_PROMPT_ICON;\n }\n\n const nextChoices = PROMPT_ICON_CHOICES.filter(icon => icon !== currentIcon);\n const choices = nextChoices.length > 0 ? nextChoices : PROMPT_ICON_CHOICES;\n return choices[Math.floor(Math.random() * choices.length)]!;\n}\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 getModeColor?: () => string | undefined;\n public getPromptAnimator?: () => GradientAnimator | undefined;\n private pendingBracketedPaste: string | null = null;\n\n private _cachedModeColorHex?: string;\n private _cachedColorFn?: (s: string) => string;\n private promptIcon = DEFAULT_PROMPT_ICON;\n private lastPromptWasInvisible = false;\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 render(width: number): string[] {\n const text = this.getText().trimStart();\n const isSlash = text.startsWith('/');\n const isAt = text.startsWith('@');\n const color = this.getModeColor?.() || mastra.green;\n const promptAnimator = this.getPromptAnimator?.();\n const shouldAnimatePrompt = !isSlash && !isAt;\n const isPromptAnimated = shouldAnimatePrompt && Boolean(promptAnimator?.isRunning());\n const fadeProgress = isPromptAnimated ? promptAnimator!.getFadeProgress() : 1;\n const isTransitioningIn = isPromptAnimated && promptAnimator!.isFadingIn();\n const isTransitioningOut = isPromptAnimated && promptAnimator!.isFadingOut();\n const promptOffset = isPromptAnimated ? promptAnimator!.getOffset() : 0;\n const pulseWave = isPromptAnimated ? (Math.sin(promptOffset * Math.PI * 2) + 1) / 2 : 0;\n const transitionPhase = isTransitioningIn || isTransitioningOut ? 1 - fadeProgress : 1;\n const chevronBrightness = isPromptAnimated\n ? isTransitioningIn\n ? transitionPhase < 0.5\n ? Math.max(0, 1 - transitionPhase * 2)\n : 0\n : isTransitioningOut\n ? transitionPhase <= 0.5\n ? Math.max(0, 1 - transitionPhase * 2)\n : 0\n : 0\n : 1;\n const dotBrightness = isPromptAnimated\n ? isTransitioningIn\n ? transitionPhase <= 0.5\n ? 0\n : Math.max(0, (transitionPhase - 0.5) * 2)\n : isTransitioningOut\n ? transitionPhase < 0.5\n ? 0\n : Math.max(0, (transitionPhase - 0.5) * 2)\n : pulseWave\n : 0;\n\n const isSteadyPulse = isPromptAnimated && !isTransitioningIn && !isTransitioningOut;\n if (!isPromptAnimated) {\n this.promptIcon = DEFAULT_PROMPT_ICON;\n this.lastPromptWasInvisible = false;\n } else if (!isSteadyPulse) {\n this.lastPromptWasInvisible = false;\n }\n\n const promptIsInvisible = isSteadyPulse && dotBrightness <= 0.05;\n if (promptIsInvisible && !this.lastPromptWasInvisible) {\n this.promptIcon = getRandomPromptIcon(this.promptIcon);\n }\n this.lastPromptWasInvisible = promptIsInvisible;\n\n const promptChar = isSlash\n ? '/'\n : isAt\n ? '@'\n : chevronBrightness > 0.05\n ? '›'\n : dotBrightness > 0.05\n ? this.promptIcon\n : ' ';\n const promptBrightness = isPromptAnimated ? Math.max(chevronBrightness, dotBrightness) : 1;\n\n // Cache colorFn and prompt — only recreate when color changes\n if (this._cachedModeColorHex !== color) {\n this._cachedModeColorHex = color;\n this._cachedColorFn = chalk.hex(color);\n }\n const colorFn = this._cachedColorFn!;\n const b = colorFn;\n const [r, g, bValue] = parseHex(color);\n const prompt = chalk.bold.rgb(\n Math.round(r * promptBrightness),\n Math.round(g * promptBrightness),\n Math.round(bValue * promptBrightness),\n )(promptChar);\n\n // Box structure: \"│ > content │\" or \"│ content │\"\n // Left: \"│ > \" (4) or \"│ \" (4), Right: \" │\" (2) = 6 chars total\n const promptWidth = 4; // \"│ > \" or \"│ \"\n const contentWidth = width - 6;\n // Editor renders at content width (prompt char space is separate)\n const editorLines = super.render(contentWidth);\n\n // Extract content lines (skip editor's invisible borders)\n const contentLines: string[] = [];\n const scrollIndicators: string[] = [];\n let isTop = true;\n for (const line of editorLines) {\n const stripped = line.replace(ANSI_STRIP_RE, '');\n if (stripped.length > 0 && stripped[0] === '─') {\n if (isTop) {\n isTop = false;\n continue;\n }\n if (stripped.includes('↑') || stripped.includes('↓')) {\n scrollIndicators.push(b(stripped));\n continue;\n }\n continue;\n }\n contentLines.push(line);\n }\n\n // Strip leading \"/\" or \"@\" from first content line when shown in prompt\n if ((isSlash || isAt) && contentLines.length > 0) {\n let l = contentLines[0]!;\n const char = isSlash ? '/' : '@';\n // Handle cursor-highlighted char (reverse video)\n l = l.replace(isSlash ? SLASH_CURSOR_RE : AT_CURSOR_RE, '');\n // Remove the first plain occurrence\n const idx = l.indexOf(char);\n if (idx !== -1) {\n l = l.slice(0, idx) + l.slice(idx + 1);\n }\n contentLines[0] = l;\n }\n\n // Build rounded box\n const result: string[] = [];\n const hBarLen = width - 2;\n\n // Solid mode-color border\n const top = b('╭') + b('─').repeat(hBarLen) + b('╮');\n const leftBorder = b('│');\n const rightBorder = b('│');\n const bottom = b('╰') + b('─').repeat(hBarLen) + b('╯');\n\n // Assemble box\n const textColorOpen = `\\x1b[38;2;${parseHex(theme.getTheme().text).join(';')}m`;\n const textColorClose = '\\x1b[39m';\n result.push(top);\n\n for (let i = 0; i < contentLines.length; i++) {\n const line = `${textColorOpen}${contentLines[i]!}${textColorClose}`;\n if (i === 0) {\n result.push(`${leftBorder} ${prompt} ${line} ${rightBorder}`);\n } else {\n result.push(`${leftBorder}${' '.repeat(promptWidth - 1)}${line} ${rightBorder}`);\n }\n }\n\n result.push(bottom);\n\n // Scroll indicators below the box\n for (const ind of scrollIndicators) {\n result.push(ind);\n }\n\n return result;\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 return fileURLToPath(pasteContent);\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 (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 // Let pi-tui handle \\+Enter newline workaround\n const lines = (this as any).state?.lines;\n const cursorCol = (this as any).state?.cursorCol;\n const currentLine = lines?.[(this as any).state?.cursorLine] || '';\n if (cursorCol > 0 && currentLine[cursorCol - 1] === '\\\\') {\n super.handleInput(data);\n return;\n }\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, Component, 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';\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 { ShellStreamComponent } from './components/shell-output.js';\nimport type { SlashCommandComponent } from './components/slash-command.js';\nimport type { SubagentExecutionComponent } from './components/subagent-execution.js';\nimport type { SystemReminderComponent } from './components/system-reminder.js';\nimport type { TaskProgressComponent } from './components/task-progress.js';\nimport type { TemporalGapComponent } from './components/temporal-gap.js';\nimport type { IToolExecutionComponent } from './components/tool-execution-interface.js';\nimport type { UserMessageComponent } from './components/user-message.js';\nimport { getEditorTheme, TERM_WIDTH_BUFFER } 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 streamed system reminders for the active assistant run */\n currentRunSystemReminderKeys: 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 inline system reminders for expand/collapse */\n allSystemReminderComponents: Array<SystemReminderComponent | TemporalGapComponent>;\n /** Track rendered message components by message id for anchored inserts */\n messageComponentsById: Map<string, Component>;\n /** Track shell passthrough components for expand/collapse */\n allShellComponents: ShellStreamComponent[];\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 /** Current thread title (for display in status line) */\n currentThreadTitle?: string;\n /** Cached thread previews for the current TUI session */\n threadPreviewCache: Map<string, { preview: string; updatedAt: number }>;\n /** Threads whose preview lookup already returned empty during this session */\n attemptedThreadPreviewIds: Set<string>;\n\n // ── Inline interaction ────────────────────────────────────────────────\n /** Track the most recent ask_user component for inline question activation */\n lastAskUserComponent?: AskQuestionInlineComponent;\n /** Map toolCallId → AskQuestionInlineComponent for streaming arg updates */\n pendingAskUserComponents: Map<string, AskQuestionInlineComponent>;\n /** Saved editor text for Alt+Z undo */\n lastClearedText: string;\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<{ content: string; images?: Array<{ data: string; mimeType: string }> }>;\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 activeActivationTTLMarker?: OMMarkerComponent;\n activeActivationProviderChangeMarker?: 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\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 // Override columns getter to prevent line wrapping in nested terminal emulators\n Object.defineProperty(terminal, 'columns', {\n get: () => (process.stdout.columns || 80) - TERM_WIDTH_BUFFER,\n });\n const ui = new TUI(terminal);\n\n // Perf profiling removed\n\n const chatContainer = new Container();\n const editorContainer = new Container();\n const footer = new Container();\n const editor = new CustomEditor(ui, getEditorTheme());\n editor.getModeColor = () => options.harness.getCurrentMode()?.color;\n const result: TUIState = {\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 currentRunSystemReminderKeys: new Set(),\n allToolComponents: [],\n allSlashCommandComponents: [],\n allSystemReminderComponents: [],\n messageComponentsById: new Map(),\n allShellComponents: [],\n pendingSubagents: new Map(),\n toolOutputExpanded: false,\n hideThinkingBlock: true,\n quietMode: false,\n\n // Thread / conversation\n pendingNewThread: false,\n currentThreadTitle: undefined,\n threadPreviewCache: new Map(),\n attemptedThreadPreviewIds: new Set(),\n\n // Inline interaction\n lastClearedText: '',\n pendingAskUserComponents: new Map(),\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\n // Abort tracking\n lastCtrlCTime: 0,\n userInitiatedAbort: false,\n };\n return result;\n}\n","/**\n * Main TUI class for Mastra Code.\n * Wires the Harness to pi-tui components for a full interactive experience.\n */\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\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 { getOAuthProviders } from '../auth/storage.js';\nimport {\n OnboardingInlineComponent,\n getAvailableModePacks,\n getAvailableOmPacks,\n ONBOARDING_VERSION,\n loadSettings,\n saveSettings,\n} from '../onboarding/index.js';\nimport type { OnboardingResult, ProviderAccess, ProviderAccessLevel } from '../onboarding/index.js';\nimport {\n resolveThreadActiveModelPackId,\n THREAD_ACTIVE_MODEL_PACK_ID_KEY,\n MEMORY_GATEWAY_PROVIDER,\n} from '../onboarding/settings.js';\nimport {\n detectPackageManager,\n fetchChangelog,\n fetchLatestVersion,\n getInstallCommand,\n isNewerVersion,\n runUpdate,\n} from '../utils/update-check.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 { showError, showInfo, showFormattedError, notify } from './display.js';\nimport { dispatchEvent } from './event-dispatch.js';\nimport type { EventHandlerContext } from './handlers/types.js';\nimport { promptForApiKeyIfNeeded } from './prompt-api-key.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} 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;\nconst CAFFEINATE_ARGS = ['-i', '-m'];\n\nfunction shouldUseCaffeinate(): boolean {\n return process.platform === 'darwin' && process.env.MASTRACODE_DISABLE_CAFFEINATE !== '1';\n}\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 private caffeinateProcess: ChildProcess | null = null;\n private lastStreamError: string | null = null;\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 = loadSettings();\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 this.state.editor.getPromptAnimator = () => this.state.gradientAnimator;\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 (e.g. piped stdin content).\n // Runs the same validation as interactive input: model check, prompt hooks.\n if (this.state.options.initialMessage) {\n const msg = this.state.options.initialMessage;\n\n if (!this.state.harness.hasModelSelected()) {\n showInfo(this.state, 'No model selected. Use /models to select a model, or /login to authenticate.');\n } else {\n const messageId = `user-${Date.now()}`;\n addUserMessage(this.state, {\n id: messageId,\n role: 'user',\n content: [{ type: 'text', text: msg }],\n createdAt: new Date(),\n });\n this.state.ui.requestRender();\n\n const allowed = await this.runUserPromptHook(msg);\n if (!allowed) {\n const comp = this.state.messageComponentsById.get(messageId);\n if (comp) {\n this.state.chatContainer.removeChild(comp as never);\n this.state.messageComponentsById.delete(messageId);\n this.state.ui.requestRender();\n }\n } else {\n try {\n if (this.state.pendingNewThread) {\n await this.state.harness.createThread();\n this.state.pendingNewThread = false;\n }\n this.fireMessage(msg);\n } catch (error) {\n this.state.pendingNewThread = false;\n showError(this.state, error instanceof Error ? error.message : 'Failed to start thread');\n }\n }\n }\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 // allow space as transparent continue (for recovering from api errors manually)\n if (!userInput.trim() && userInput !== ' ') continue;\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 // Check if a model is selected (sync — fast, no reason to defer)\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 { content, images } = consumePendingImages(userInput, this.state.pendingImages);\n this.state.pendingImages = [];\n\n // Show the user message in the TUI right away — before any async work\n // (thread creation, hooks, sending) so the UI feels instant even when\n // GC pauses or I/O slow things down.\n const messageId = `user-${Date.now()}`;\n addUserMessage(this.state, {\n id: messageId,\n role: 'user',\n content: [\n { type: 'text', text: content },\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 const allowed = await this.runUserPromptHook(userInput);\n if (!allowed) {\n // Hook blocked the message — remove it from the chat\n const comp = this.state.messageComponentsById.get(messageId);\n if (comp) {\n this.state.chatContainer.removeChild(comp as never);\n this.state.messageComponentsById.delete(messageId);\n this.state.ui.requestRender();\n }\n continue;\n }\n\n // Create thread lazily on first message (may load last-used model).\n // Runs after the hook check so we don't create a thread for blocked messages.\n if (this.state.pendingNewThread) {\n await this.state.harness.createThread();\n this.state.pendingNewThread = false;\n }\n\n // Normal send — fire and forget; events handle the rest\n this.fireMessage(content, 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 updateStatusLine(this.state);\n this.state.ui.requestRender();\n return;\n }\n\n const { content, images } = consumePendingImages(text, this.state.pendingImages);\n this.state.pendingImages = [];\n\n this.state.pendingFollowUpMessages.push({ content, images });\n this.state.pendingQueuedActions.push('message');\n updateStatusLine(this.state);\n this.state.ui.requestRender();\n }\n\n /**\n * Stop the TUI and clean up.\n */\n stop(): void {\n this.stopCaffeinate();\n\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 // 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 // Sync current thread title — the thread_changed event from\n // promptForThreadSelection fired before we subscribed above.\n const initThreadId = this.state.harness.getCurrentThreadId();\n if (initThreadId) {\n const initThreads = await this.state.harness.listThreads();\n const initThread = initThreads.find(t => t.id === initThreadId);\n if (initThread?.title) {\n this.state.currentThreadTitle = initThread.title;\n }\n }\n\n // Start the UI\n this.state.ui.start();\n this.state.isInitialized = true;\n\n // Start MCP connections now that the TUI owns the terminal.\n // Using showInfo() instead of console.info() avoids corrupting the display.\n if (this.state.mcpManager?.hasServers()) {\n const serverCount = Object.keys(this.state.mcpManager.getConfig().mcpServers ?? {}).length;\n showInfo(this.state, `MCP: Connecting to ${serverCount} server(s)...`);\n this.state.mcpManager\n .initInBackground()\n .then(result => {\n if (result.connected.length > 0) {\n showInfo(this.state, `MCP: ${result.connected.length} server(s) connected, ${result.totalTools} tool(s)`);\n }\n for (const s of result.failed) {\n showInfo(this.state, `MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n for (const s of result.skipped) {\n showInfo(this.state, `MCP: Skipped \"${s.name}\": ${s.reason}`);\n }\n })\n .catch(error => {\n showInfo(this.state, `MCP: Initialization failed: ${error instanceof Error ? error.message : String(error)}`);\n });\n }\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 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 if (event.type === 'agent_start') {\n this.startCaffeinate();\n this.lastStreamError = null;\n }\n\n if (event.type === 'error' && 'error' in event && !event.retryable) {\n // Only capture errors that look like stream/agent failures, not OM or tool errors\n const msg = event.error?.message || String(event.error);\n const isOmError = /observational memory/i.test(msg);\n if (!isOmError) {\n this.lastStreamError = msg;\n }\n }\n\n try {\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 if (event.reason === 'error' && this.lastStreamError) {\n this.emitErrorFeedback(this.lastStreamError);\n this.lastStreamError = null;\n }\n }\n } finally {\n if (event.type === 'agent_end') {\n this.stopCaffeinate();\n }\n }\n }\n\n private emitErrorFeedback(errorMessage: string): void {\n const harness = this.state.harness;\n const traceId = harness.getCurrentTraceId() ?? undefined;\n const runId = harness.getCurrentRunId() ?? undefined;\n const threadId = harness.getCurrentThreadId() ?? undefined;\n\n if (!traceId && !runId && !threadId) return;\n\n const mastra = harness.getMastra();\n const observability = mastra?.observability;\n if (!observability?.addFeedback) return;\n\n const comment = errorMessage.length > 500 ? errorMessage.slice(0, 500) + '…' : errorMessage;\n\n observability\n .addFeedback({\n traceId,\n correlationContext: { traceId, runId },\n feedback: {\n feedbackType: 'thumbs',\n feedbackSource: 'mastracode',\n feedbackUserId: 'system',\n value: 0,\n comment: `Stream error: ${comment}`,\n metadata: {\n ...(threadId ? { threadId } : {}),\n ...(runId ? { runId } : {}),\n autoGenerated: true,\n },\n },\n })\n .catch(() => {\n // Fire-and-forget — don't let feedback failures affect the TUI\n });\n }\n\n private startCaffeinate(): void {\n if (!shouldUseCaffeinate() || this.caffeinateProcess) {\n return;\n }\n\n try {\n const child = spawn('caffeinate', CAFFEINATE_ARGS, {\n stdio: 'ignore',\n });\n\n child.once('error', () => {\n if (this.caffeinateProcess === child) {\n this.caffeinateProcess = null;\n }\n });\n\n child.once('exit', () => {\n if (this.caffeinateProcess === child) {\n this.caffeinateProcess = null;\n }\n });\n\n this.caffeinateProcess = child;\n } catch {\n this.caffeinateProcess = null;\n }\n }\n\n private stopCaffeinate(): void {\n const child = this.caffeinateProcess;\n if (!child) {\n return;\n }\n\n this.caffeinateProcess = null;\n child.kill();\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: hasEnv('google') ? ('apikey' as const) : false,\n deepseek: hasEnv('deepseek') ? ('apikey' as const) : false,\n };\n // Gateway covers all providers\n const mgKey =\n this.state.authStorage?.getStoredApiKey(MEMORY_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n if (mgKey) {\n if (!access.anthropic) access.anthropic = 'apikey';\n if (!access.openai) access.openai = 'apikey';\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 = loadSettings();\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 packs = getAvailableModePacks(access, settings.customModelPacks).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 = loadSettings();\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 const idx = this.state.chatContainer.children.indexOf(firstFollowUp as any);\n if (idx >= 0) {\n (this.state.chatContainer.children as unknown[]).splice(idx, 0, child);\n this.state.chatContainer.invalidate();\n return;\n }\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 * 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 // ===========================================================================\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 = loadSettings();\n const modePacks = getAvailableModePacks(access, savedSettings.customModelPacks);\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 modePacks,\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 = loadSettings();\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 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));\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 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: async (model: ModelItem) => {\n this.state.ui.hideOverlay();\n await promptForApiKeyIfNeeded(this.state.ui, model, this.state.authStorage);\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 subagentModeMap: Record<string, string> = { explore: 'fast', plan: 'plan', execute: 'build' };\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 = loadSettings();\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 // Clear any per-role overrides from prior /om use so the newly-selected\n // pack (or custom modelId above) applies to both observer and reflector.\n settings.models.observerModelOverride = null;\n settings.models.reflectorModelOverride = 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 = loadSettings();\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 npm 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 = loadSettings();\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, changelog] = await Promise.all([detectPackageManager(), fetchChangelog(latestVersion)]);\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, changelog);\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 changelog: string | null,\n ): Promise<void> {\n let question = `A new version of Mastra Code is available: v${latestVersion} (current: v${currentVersion}).`;\n if (changelog) {\n question += `\\n\\nWhat's new:\\n${changelog}`;\n }\n question += `\\n\\nWould you like to update now?`;\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\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 Mastra Code.`);\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 = loadSettings();\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 = loadSettings();\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"]}
|