mastracode 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/README.md +9 -1
  3. package/dist/agents/instructions.d.ts.map +1 -1
  4. package/dist/agents/prompts/base.d.ts +2 -0
  5. package/dist/agents/prompts/base.d.ts.map +1 -1
  6. package/dist/agents/prompts/build.d.ts +1 -1
  7. package/dist/agents/prompts/build.d.ts.map +1 -1
  8. package/dist/agents/prompts/index.d.ts +1 -2
  9. package/dist/agents/prompts/index.d.ts.map +1 -1
  10. package/dist/agents/prompts/plan.d.ts +1 -1
  11. package/dist/agents/prompts/plan.d.ts.map +1 -1
  12. package/dist/agents/prompts/tool-guidance.d.ts +11 -0
  13. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
  14. package/dist/agents/workspace.d.ts.map +1 -1
  15. package/dist/auth/storage.d.ts +0 -48
  16. package/dist/auth/storage.d.ts.map +1 -1
  17. package/dist/{chunk-LVGWM7ZS.cjs → chunk-7K5VFY2N.cjs} +768 -1373
  18. package/dist/chunk-7K5VFY2N.cjs.map +1 -0
  19. package/dist/chunk-7TFV3VBB.cjs +8823 -0
  20. package/dist/chunk-7TFV3VBB.cjs.map +1 -0
  21. package/dist/chunk-C6XKRHRK.cjs +853 -0
  22. package/dist/chunk-C6XKRHRK.cjs.map +1 -0
  23. package/dist/{chunk-7V6U7OKQ.js → chunk-HHX6BKLR.js} +234 -121
  24. package/dist/chunk-HHX6BKLR.js.map +1 -0
  25. package/dist/{chunk-FYTZFUHD.js → chunk-LYETHS2L.js} +6389 -5481
  26. package/dist/chunk-LYETHS2L.js.map +1 -0
  27. package/dist/{chunk-BYMDWH2E.js → chunk-V4HZ2AVV.js} +729 -1332
  28. package/dist/chunk-V4HZ2AVV.js.map +1 -0
  29. package/dist/chunk-VRZZSUQE.js +835 -0
  30. package/dist/chunk-VRZZSUQE.js.map +1 -0
  31. package/dist/{chunk-QDLLGD43.cjs → chunk-VZFPT5N7.cjs} +274 -161
  32. package/dist/chunk-VZFPT5N7.cjs.map +1 -0
  33. package/dist/cli.cjs +64 -21
  34. package/dist/cli.cjs.map +1 -1
  35. package/dist/cli.js +61 -18
  36. package/dist/cli.js.map +1 -1
  37. package/dist/index.cjs +2 -2
  38. package/dist/index.d.ts +6 -7
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/onboarding/index.d.ts +7 -0
  42. package/dist/onboarding/index.d.ts.map +1 -0
  43. package/dist/onboarding/onboarding-inline.d.ts +95 -0
  44. package/dist/onboarding/onboarding-inline.d.ts.map +1 -0
  45. package/dist/onboarding/packs.d.ts +46 -0
  46. package/dist/onboarding/packs.d.ts.map +1 -0
  47. package/dist/onboarding/settings.d.ts +110 -0
  48. package/dist/onboarding/settings.d.ts.map +1 -0
  49. package/dist/storage-52Y5MKTG.js +3 -0
  50. package/dist/storage-52Y5MKTG.js.map +1 -0
  51. package/dist/storage-JFFX7LJJ.cjs +24 -0
  52. package/dist/storage-JFFX7LJJ.cjs.map +1 -0
  53. package/dist/tools/string-replace-lsp.d.ts.map +1 -1
  54. package/dist/tui/command-dispatch.d.ts +8 -0
  55. package/dist/tui/command-dispatch.d.ts.map +1 -0
  56. package/dist/tui/commands/cost.d.ts +3 -0
  57. package/dist/tui/commands/cost.d.ts.map +1 -0
  58. package/dist/tui/commands/diff.d.ts +3 -0
  59. package/dist/tui/commands/diff.d.ts.map +1 -0
  60. package/dist/tui/commands/exit.d.ts +3 -0
  61. package/dist/tui/commands/exit.d.ts.map +1 -0
  62. package/dist/tui/commands/help.d.ts +3 -0
  63. package/dist/tui/commands/help.d.ts.map +1 -0
  64. package/dist/tui/commands/hooks.d.ts +3 -0
  65. package/dist/tui/commands/hooks.d.ts.map +1 -0
  66. package/dist/tui/commands/index.d.ts +27 -0
  67. package/dist/tui/commands/index.d.ts.map +1 -0
  68. package/dist/tui/commands/login.d.ts +3 -0
  69. package/dist/tui/commands/login.d.ts.map +1 -0
  70. package/dist/tui/commands/mcp.d.ts +3 -0
  71. package/dist/tui/commands/mcp.d.ts.map +1 -0
  72. package/dist/tui/commands/mode.d.ts +3 -0
  73. package/dist/tui/commands/mode.d.ts.map +1 -0
  74. package/dist/tui/commands/models-pack.d.ts +3 -0
  75. package/dist/tui/commands/models-pack.d.ts.map +1 -0
  76. package/dist/tui/commands/models.d.ts +3 -0
  77. package/dist/tui/commands/models.d.ts.map +1 -0
  78. package/dist/tui/commands/name.d.ts +3 -0
  79. package/dist/tui/commands/name.d.ts.map +1 -0
  80. package/dist/tui/commands/new.d.ts +3 -0
  81. package/dist/tui/commands/new.d.ts.map +1 -0
  82. package/dist/tui/commands/om.d.ts +3 -0
  83. package/dist/tui/commands/om.d.ts.map +1 -0
  84. package/dist/tui/commands/permissions.d.ts +3 -0
  85. package/dist/tui/commands/permissions.d.ts.map +1 -0
  86. package/dist/tui/commands/resource.d.ts +3 -0
  87. package/dist/tui/commands/resource.d.ts.map +1 -0
  88. package/dist/tui/commands/review.d.ts +3 -0
  89. package/dist/tui/commands/review.d.ts.map +1 -0
  90. package/dist/tui/commands/sandbox.d.ts +3 -0
  91. package/dist/tui/commands/sandbox.d.ts.map +1 -0
  92. package/dist/tui/commands/settings.d.ts +3 -0
  93. package/dist/tui/commands/settings.d.ts.map +1 -0
  94. package/dist/tui/commands/setup.d.ts +3 -0
  95. package/dist/tui/commands/setup.d.ts.map +1 -0
  96. package/dist/tui/commands/skills.d.ts +3 -0
  97. package/dist/tui/commands/skills.d.ts.map +1 -0
  98. package/dist/tui/commands/subagents.d.ts +3 -0
  99. package/dist/tui/commands/subagents.d.ts.map +1 -0
  100. package/dist/tui/commands/think.d.ts +3 -0
  101. package/dist/tui/commands/think.d.ts.map +1 -0
  102. package/dist/tui/commands/thread-tag-dir.d.ts +3 -0
  103. package/dist/tui/commands/thread-tag-dir.d.ts.map +1 -0
  104. package/dist/tui/commands/threads.d.ts +3 -0
  105. package/dist/tui/commands/threads.d.ts.map +1 -0
  106. package/dist/tui/commands/types.d.ts +28 -0
  107. package/dist/tui/commands/types.d.ts.map +1 -0
  108. package/dist/tui/commands/yolo.d.ts +3 -0
  109. package/dist/tui/commands/yolo.d.ts.map +1 -0
  110. package/dist/tui/components/banner.d.ts +9 -0
  111. package/dist/tui/components/banner.d.ts.map +1 -0
  112. package/dist/tui/components/help-overlay.d.ts +15 -0
  113. package/dist/tui/components/help-overlay.d.ts.map +1 -0
  114. package/dist/tui/components/model-selector.d.ts +3 -0
  115. package/dist/tui/components/model-selector.d.ts.map +1 -1
  116. package/dist/tui/components/om-progress.d.ts +4 -30
  117. package/dist/tui/components/om-progress.d.ts.map +1 -1
  118. package/dist/tui/components/settings.d.ts +5 -0
  119. package/dist/tui/components/settings.d.ts.map +1 -1
  120. package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
  121. package/dist/tui/display.d.ts +12 -0
  122. package/dist/tui/display.d.ts.map +1 -0
  123. package/dist/tui/event-dispatch.d.ts +11 -0
  124. package/dist/tui/event-dispatch.d.ts.map +1 -0
  125. package/dist/tui/handlers/agent-lifecycle.d.ts +6 -0
  126. package/dist/tui/handlers/agent-lifecycle.d.ts.map +1 -0
  127. package/dist/tui/handlers/index.d.ts +8 -0
  128. package/dist/tui/handlers/index.d.ts.map +1 -0
  129. package/dist/tui/handlers/message.d.ts +6 -0
  130. package/dist/tui/handlers/message.d.ts.map +1 -0
  131. package/dist/tui/handlers/om.d.ts +11 -0
  132. package/dist/tui/handlers/om.d.ts.map +1 -0
  133. package/dist/tui/handlers/prompts.d.ts +20 -0
  134. package/dist/tui/handlers/prompts.d.ts.map +1 -0
  135. package/dist/tui/handlers/subagent.d.ts +6 -0
  136. package/dist/tui/handlers/subagent.d.ts.map +1 -0
  137. package/dist/tui/handlers/tool.d.ts +30 -0
  138. package/dist/tui/handlers/tool.d.ts.map +1 -0
  139. package/dist/tui/handlers/types.d.ts +33 -0
  140. package/dist/tui/handlers/types.d.ts.map +1 -0
  141. package/dist/tui/mastra-tui.d.ts +9 -221
  142. package/dist/tui/mastra-tui.d.ts.map +1 -1
  143. package/dist/tui/render-messages.d.ts +22 -0
  144. package/dist/tui/render-messages.d.ts.map +1 -0
  145. package/dist/tui/setup.d.ts +17 -0
  146. package/dist/tui/setup.d.ts.map +1 -0
  147. package/dist/tui/shell.d.ts +3 -0
  148. package/dist/tui/shell.d.ts.map +1 -0
  149. package/dist/tui/state.d.ts +4 -24
  150. package/dist/tui/state.d.ts.map +1 -1
  151. package/dist/tui/status-line.d.ts +7 -0
  152. package/dist/tui/status-line.d.ts.map +1 -0
  153. package/dist/tui.cjs +17 -17
  154. package/dist/tui.js +2 -2
  155. package/dist/utils/project.d.ts +37 -9
  156. package/dist/utils/project.d.ts.map +1 -1
  157. package/dist/utils/storage-factory.d.ts +21 -0
  158. package/dist/utils/storage-factory.d.ts.map +1 -0
  159. package/package.json +7 -6
  160. package/dist/chunk-7V6U7OKQ.js.map +0 -1
  161. package/dist/chunk-BQ4ZKTYN.cjs +0 -7915
  162. package/dist/chunk-BQ4ZKTYN.cjs.map +0 -1
  163. package/dist/chunk-BYMDWH2E.js.map +0 -1
  164. package/dist/chunk-FYTZFUHD.js.map +0 -1
  165. package/dist/chunk-LVGWM7ZS.cjs.map +0 -1
  166. package/dist/chunk-QDLLGD43.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/utils/slash-command-loader.ts","../src/utils/slash-command-processor.ts","../src/tui/components/ask-question-dialog.ts","../src/tui/components/ask-question-inline.ts","../src/tui/components/assistant-message.ts","../src/tui/components/diff-output.ts","../src/tui/components/login-dialog.ts","../src/tui/components/model-selector.ts","../src/tui/components/obi-loader.ts","../src/tui/components/om-marker.ts","../src/tui/components/om-output.ts","../src/tui/components/om-progress.ts","../src/tui/components/om-settings.ts","../src/tui/components/plan-approval-inline.ts","../src/tui/components/settings.ts","../src/tui/components/shell-output.ts","../src/tui/components/slash-command.ts","../src/tui/components/subagent-execution.ts","../src/tui/components/system-reminder.ts","../src/tui/components/task-progress.ts","../src/tui/components/thread-selector.ts","../src/tui/components/tool-approval-dialog.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/notify.ts","../src/clipboard/index.ts","../src/tui/components/custom-editor.ts","../src/tui/state.ts","../src/tui/mastra-tui.ts","../src/tui/components/login-selector.ts"],"names":["fs","name","path2","Spacer","Box","Text","SelectList","Input","getEditorKeybindings","path","Container","chalk","resolve","isSelected","line","formatTokens","fuzzyFilter","Markdown","SettingsList","COLLAPSED_LINES","rangeDisplay","status","pathDisplay","termWidth","truncateAnsi","output","border","footerText","removedColor","addedColor","maxLineWidth","fixedParts","availableForPath","highlight","remaining","text","exec","execSync","join","theme","OBSERVER_COLOR","REFLECTOR_COLOR","bg","homedir","fg","component","parsePartialJson","TOOL_CATEGORIES","statuses","filePath"],"mappings":"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","file":"chunk-FYTZFUHD.js","sourcesContent":["/**\n * Error handling utilities for the Mastra Code TUI.\n * Parses API errors and provides user-friendly messages.\n */\n\nexport interface ParsedError {\n /** User-friendly error message */\n message: string;\n /** Error type for categorization */\n type: ErrorType;\n /** Whether this error is retryable */\n retryable: boolean;\n /** Suggested retry delay in ms (if retryable) */\n retryDelay?: number;\n /** Original error for debugging */\n originalError: Error;\n}\n\nexport type ErrorType =\n | 'rate_limit'\n | 'auth'\n | 'network'\n | 'timeout'\n | 'invalid_request'\n | 'server_error'\n | 'model_not_found'\n | 'context_length'\n | 'content_filter'\n | 'unknown';\n\n/**\n * Parse an error and return a user-friendly representation.\n */\nexport function parseError(error: unknown): ParsedError {\n const err = error instanceof Error ? error : new Error(String(error));\n const message = err.message.toLowerCase();\n const errorObj = error as Record<string, unknown>;\n\n // Check for rate limiting\n if (\n message.includes('rate limit') ||\n message.includes('rate_limit') ||\n message.includes('429') ||\n errorObj.statusCode === 429 ||\n errorObj.status === 429\n ) {\n const retryAfter = extractRetryAfter(errorObj);\n return {\n message: 'Rate limited. Please wait a moment before trying again.',\n type: 'rate_limit',\n retryable: true,\n retryDelay: retryAfter || 5000,\n originalError: err,\n };\n }\n\n // Check for authentication errors\n if (\n message.includes('unauthorized') ||\n message.includes('authentication') ||\n message.includes('invalid api key') ||\n message.includes('invalid_api_key') ||\n message.includes('api key') ||\n errorObj.statusCode === 401 ||\n errorObj.status === 401\n ) {\n return {\n message: 'Authentication failed. Please check your API key or login with /login.',\n type: 'auth',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for forbidden/permission errors\n if (errorObj.statusCode === 403 || errorObj.status === 403) {\n return {\n message: 'Access denied. You may not have permission to use this model.',\n type: 'auth',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for network errors\n if (\n message.includes('network') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('fetch failed') ||\n message.includes('connection')\n ) {\n return {\n message: 'Network error. Please check your internet connection.',\n type: 'network',\n retryable: true,\n retryDelay: 2000,\n originalError: err,\n };\n }\n\n // Check for timeout errors\n if (message.includes('timeout') || message.includes('timed out') || message.includes('etimedout')) {\n return {\n message: 'Request timed out. The server may be overloaded.',\n type: 'timeout',\n retryable: true,\n retryDelay: 3000,\n originalError: err,\n };\n }\n\n // Check for model not found\n if (\n message.includes('model not found') ||\n message.includes('model_not_found') ||\n message.includes('does not exist') ||\n message.includes('invalid model')\n ) {\n return {\n message: 'Model not found. Please select a different model with /models.',\n type: 'model_not_found',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for context length errors\n if (\n message.includes('context length') ||\n message.includes('context_length') ||\n message.includes('too many tokens') ||\n message.includes('maximum context') ||\n message.includes('token limit')\n ) {\n return {\n message: 'Message too long. Try starting a new thread with /new.',\n type: 'context_length',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for content filter errors\n if (\n message.includes('content filter') ||\n message.includes('content_filter') ||\n message.includes('content policy') ||\n message.includes('safety') ||\n message.includes('prohibited')\n ) {\n return {\n message: \"Content was filtered by the model's safety system.\",\n type: 'content_filter',\n retryable: false,\n originalError: err,\n };\n }\n\n // Check for server errors\n if (\n message.includes('internal server') ||\n message.includes('server error') ||\n errorObj.statusCode === 500 ||\n errorObj.status === 500 ||\n errorObj.statusCode === 502 ||\n errorObj.status === 502 ||\n errorObj.statusCode === 503 ||\n errorObj.status === 503\n ) {\n return {\n message: 'Server error. The API may be experiencing issues.',\n type: 'server_error',\n retryable: true,\n retryDelay: 5000,\n originalError: err,\n };\n }\n\n // Check for invalid request errors\n if (\n message.includes('invalid request') ||\n message.includes('bad request') ||\n errorObj.statusCode === 400 ||\n errorObj.status === 400\n ) {\n return {\n message: `Invalid request: ${extractErrorDetail(err)}`,\n type: 'invalid_request',\n retryable: false,\n originalError: err,\n };\n }\n\n // Unknown error - try to extract useful info\n return {\n message: extractErrorDetail(err),\n type: 'unknown',\n retryable: false,\n originalError: err,\n };\n}\n\n/**\n * Extract retry-after header value from error.\n */\nfunction extractRetryAfter(error: Record<string, unknown>): number | undefined {\n const headers = error.headers as Record<string, unknown> | undefined;\n const retryAfter = error.retryAfter || headers?.['retry-after'];\n if (typeof retryAfter === 'number') {\n return retryAfter * 1000; // Convert seconds to ms\n }\n if (typeof retryAfter === 'string') {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n return seconds * 1000;\n }\n }\n return undefined;\n}\n\n/**\n * Extract a useful error detail from an error object.\n */\nfunction extractErrorDetail(error: Error): string {\n const errorObj = error as unknown as Record<string, unknown>;\n\n // Try to get a specific error message from common API error formats\n if (errorObj.error && typeof errorObj.error === 'object') {\n const apiError = errorObj.error as Record<string, unknown>;\n if (apiError.message) return String(apiError.message);\n }\n\n if (errorObj.message) return String(errorObj.message);\n if (errorObj.detail) return String(errorObj.detail);\n if (errorObj.reason) return String(errorObj.reason);\n\n // Clean up the error message\n let message = error.message;\n\n // Remove common prefixes\n message = message.replace(/^(error|exception|failed):\\s*/i, '');\n\n // Truncate very long messages\n if (message.length > 200) {\n message = message.substring(0, 200) + '...';\n }\n\n return message || 'An unknown error occurred';\n}\n\n/**\n * Sleep for a given number of milliseconds.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n onRetry?: (error: ParsedError, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { maxRetries = 3, initialDelay = 1000, maxDelay = 30000, onRetry } = options;\n\n let lastError: ParsedError | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = parseError(error);\n\n // Don't retry non-retryable errors\n if (!lastError.retryable || attempt === maxRetries) {\n throw lastError.originalError;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(lastError.retryDelay || initialDelay * Math.pow(2, attempt), maxDelay);\n\n if (onRetry) {\n onRetry(lastError, attempt + 1);\n }\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs this\n throw lastError?.originalError || new Error('Retry failed');\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport * as yaml from 'js-yaml';\n\n/**\n * Metadata for a slash command\n */\nexport interface SlashCommandMetadata {\n /** Command name (e.g., \"git:commit\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** The command template with variables */\n template: string;\n /** Source file path */\n sourcePath: string;\n /** Namespace derived from directory structure */\n namespace?: string;\n}\n\n/**\n * Parse a command file and extract metadata and template\n * Supports both frontmatter-based and plain markdown files\n */\nexport async function parseCommandFile(filePath: string, baseDir?: string): Promise<SlashCommandMetadata | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const trimmedContent = content.trim();\n\n // Check if file has frontmatter (starts with ---)\n if (!trimmedContent.startsWith('---')) {\n // No frontmatter - treat entire file as template\n // Derive name from file path\n const name = baseDir ? extractCommandName(filePath, baseDir) : path.basename(filePath, '.md');\n\n return {\n name,\n description: '',\n template: content,\n sourcePath: filePath,\n };\n }\n\n // Split frontmatter and template\n const parts = content.split('---');\n if (parts.length < 3) {\n return null;\n }\n\n const frontmatter = parts[1]!.trim();\n const template = parts.slice(2).join('---').trim();\n\n // Parse YAML frontmatter\n const metadata = yaml.load(frontmatter) as Record<string, string>;\n\n // Derive name from file path if not specified in frontmatter\n let name: string;\n if (metadata?.name) {\n name = metadata.name;\n } else if (baseDir) {\n name = extractCommandName(filePath, baseDir);\n } else {\n name = path.basename(filePath, '.md');\n }\n\n return {\n name,\n description: metadata?.description || '',\n template,\n sourcePath: filePath,\n namespace: metadata?.namespace,\n };\n } catch (error) {\n console.error(`Error parsing command file ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Extract command name from file path\n * Converts path like \"git/commit.md\" to \"git:commit\"\n */\nexport function extractCommandName(filePath: string, baseDir: string): string {\n const relativePath = path.relative(baseDir, filePath);\n const dirName = path.dirname(relativePath);\n const baseName = path.basename(relativePath, '.md');\n\n if (dirName === '.' || dirName === '') {\n return baseName;\n }\n\n // Replace path separators with colons for namespacing\n const namespace = dirName.replace(/[\\\\/]/g, ':');\n return `${namespace}:${baseName}`;\n}\n\n/**\n * Recursively scan a directory for command files\n */\nexport async function scanCommandDirectory(dirPath: string): Promise<SlashCommandMetadata[]> {\n const commands: SlashCommandMetadata[] = [];\n\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n const subCommands = await scanCommandDirectory(fullPath);\n commands.push(...subCommands);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n // Parse markdown command files, passing dirPath as baseDir for name derivation\n const command = await parseCommandFile(fullPath, dirPath);\n if (command) {\n commands.push(command);\n }\n }\n }\n } catch {\n // Directory doesn't exist or can't be read - silently skip\n }\n\n return commands;\n}\n/**\n * Load custom slash commands from all configured directories\n * Priority: mastra project > claude project > opencode project > mastra user > claude user > opencode user\n */\nexport async function loadCustomCommands(projectDir?: string): Promise<SlashCommandMetadata[]> {\n const commands: SlashCommandMetadata[] = [];\n const seenNames = new Set<string>();\n\n // Helper to add commands without duplicates (later commands override earlier ones)\n const addCommands = (newCommands: SlashCommandMetadata[]) => {\n for (const cmd of newCommands) {\n if (!seenNames.has(cmd.name)) {\n seenNames.add(cmd.name);\n commands.push(cmd);\n }\n }\n };\n\n const homeDir = process.env.HOME || process.env.USERPROFILE;\n\n // 1. Load from opencode user directory ~/.opencode/command (lowest priority)\n if (homeDir) {\n const opencodeUserDir = path.join(homeDir, '.opencode', 'command');\n const opencodeUserCommands = await scanCommandDirectory(opencodeUserDir);\n addCommands(opencodeUserCommands);\n }\n\n // 2. Load from claude user directory ~/.claude/commands (Claude Code compat)\n if (homeDir) {\n const claudeUserDir = path.join(homeDir, '.claude', 'commands');\n const claudeUserCommands = await scanCommandDirectory(claudeUserDir);\n addCommands(claudeUserCommands);\n }\n\n // 3. Load from 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 commands;\n}\n\n/**\n * Get the commands directory path for a project\n */\nexport function getProjectCommandsDir(projectDir: string): string {\n return path.join(projectDir, '.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","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 let result = command.template;\n\n // Replace arguments\n result = replaceArguments(result, args);\n\n // Replace shell commands\n result = await replaceShellOutput(result, workingDir);\n\n // Replace file references\n result = await replaceFileReferences(result, workingDir);\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[]): string {\n let result = 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(/\\$\\d+/g, '');\n\n return result;\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 * Ask question dialog component.\n * Shows a question with either selectable options or free-text input.\n * Used by the ask_user tool to collect structured answers from the user.\n */\n\nimport { Box, getEditorKeybindings, Input, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem } from '@mariozechner/pi-tui';\nimport { bg, fg, bold, getSelectListTheme } from '../theme.js';\n\nexport interface AskQuestionDialogOptions {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n onSubmit: (answer: string) => void;\n onCancel: () => void;\n}\n\nexport class AskQuestionDialogComponent extends Box implements Focusable {\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit: (answer: string) => void;\n private onCancel: () => void;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (this.input) this.input.focused = value;\n }\n\n constructor(options: AskQuestionDialogOptions) {\n super(2, 1, text => bg('overlayBg', text));\n\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n\n // Title\n this.addChild(new Text(bold(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(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} ${fg('dim', opt.description)}` : ` ${opt.label}`,\n }));\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.onSubmit(item.value);\n };\n this.selectList.onCancel = this.onCancel;\n\n this.addChild(this.selectList);\n this.addChild(new Spacer(1));\n this.addChild(new Text(fg('dim', ' ↑↓ to navigate · Enter to select · Esc to skip'), 0, 0));\n }\n\n private buildInputMode(): void {\n this.input = new Input();\n this.input.onSubmit = (value: string) => {\n const trimmed = value.trim();\n if (trimmed) {\n this.onSubmit(trimmed);\n }\n };\n\n this.addChild(this.input);\n this.addChild(new Spacer(1));\n this.addChild(new Text(fg('dim', ' Enter to submit · Esc to skip'), 0, 0));\n }\n\n handleInput(data: string): void {\n if (this.selectList) {\n this.selectList.handleInput(data);\n } else if (this.input) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.onCancel();\n return;\n }\n this.input.handleInput(data);\n }\n }\n}\n","/**\n * Inline ask question component.\n * Shows a question with either selectable options or free-text input\n * directly in the conversation flow instead of as an overlay dialog.\n */\n\nimport { Box, Container, getEditorKeybindings, Input, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme } from '../theme.js';\n\nexport interface AskQuestionInlineOptions {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n /** Format the text shown after an answer is selected. Defaults to `question → answer`. */\n formatResult?: (answer: string) => string;\n /** If provided, determines whether an answer should be shown with error styling (red ✗). */\n isNegativeAnswer?: (answer: string) => boolean;\n onSubmit: (answer: string) => void;\n onCancel: () => void;\n}\n\nexport class AskQuestionInlineComponent extends Container implements Focusable {\n private contentBox: Box;\n private selectList?: SelectList;\n private input?: Input;\n private onSubmit: (answer: string) => void;\n private onCancel: () => void;\n private formatResult?: (answer: string) => string;\n private isNegativeAnswer?: (answer: string) => boolean;\n private answered = false;\n private questionText: string;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (!this.answered && this.input) {\n this.input.focused = value;\n }\n }\n\n constructor(options: AskQuestionInlineOptions, _ui: TUI) {\n super();\n\n this.onSubmit = options.onSubmit;\n this.onCancel = options.onCancel;\n this.formatResult = options.formatResult;\n this.isNegativeAnswer = options.isNegativeAnswer;\n this.questionText = options.question;\n\n // Add spacing above\n this.addChild(new Spacer(1));\n\n // Create box with accent border for the question\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n // Question header\n this.contentBox.addChild(new Text(theme.bold(theme.fg('accent', '❓ Question')), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n // Question text (may be multi-line)\n for (const line of options.question.split('\\n')) {\n this.contentBox.addChild(new Text(theme.fg('text', line), 0, 0));\n }\n this.contentBox.addChild(new Spacer(1));\n\n if (options.options && options.options.length > 0) {\n this.buildSelectMode(options.options);\n } else {\n this.buildInputMode();\n }\n }\n\n private buildSelectMode(opts: Array<{ label: string; description?: string }>): void {\n const items: SelectItem[] = opts.map(opt => ({\n value: opt.label,\n label: opt.description ? ` ${opt.label} ${theme.fg('dim', opt.description)}` : ` ${opt.label}`,\n }));\n\n this.selectList = new SelectList(items, Math.min(items.length, 8), getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.handleAnswer(item.value);\n };\n this.selectList.onCancel = () => {\n this.handleCancel();\n };\n\n this.contentBox.addChild(this.selectList);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', '↑↓ to navigate · Enter to select · Esc to skip'), 0, 0));\n }\n\n private buildInputMode(): void {\n this.input = new Input();\n this.input.onSubmit = (value: string) => {\n const trimmed = value.trim();\n if (trimmed) {\n this.handleAnswer(trimmed);\n }\n };\n\n this.contentBox.addChild(this.input);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', 'Enter to submit · Esc to skip'), 0, 0));\n }\n\n private handleAnswer(answer: string): void {\n if (this.answered) return;\n this.answered = true;\n\n const isNegative = this.isNegativeAnswer?.(answer) ?? false;\n\n this.contentBox.clear();\n this.contentBox.setBgFn((text: string) => theme.bg(isNegative ? 'toolErrorBg' : 'toolSuccessBg', text));\n\n const resultText = this.formatResult ? this.formatResult(answer) : `${this.questionText} → ${answer}`;\n\n const icon = isNegative ? theme.fg('error', '✗') : theme.fg('success', '✓');\n\n this.contentBox.addChild(new Text(theme.fg('text', `${icon} ${resultText}`), 0, 0));\n\n this.onSubmit(answer);\n }\n\n private handleCancel(): void {\n if (this.answered) return;\n this.answered = true;\n\n this.contentBox.clear();\n this.contentBox.setBgFn((text: string) => theme.bg('toolErrorBg', text));\n this.contentBox.addChild(\n new Text(theme.fg('dim', `${theme.fg('error', '✗')} ${this.questionText} (cancelled)`), 0, 0),\n );\n\n this.onCancel();\n }\n\n handleInput(data: string): void {\n if (this.answered) return;\n\n if (this.selectList) {\n this.selectList.handleInput(data);\n } else if (this.input) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.handleCancel();\n return;\n }\n this.input.handleInput(data);\n }\n }\n}\n","/**\n * Component that renders an assistant message with streaming support.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Container, Markdown, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { MarkdownTheme } from '@mariozechner/pi-tui';\nimport type { HarnessMessage } from '@mastra/core/harness';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nlet _compId = 0;\nfunction asmDebugLog(...args: unknown[]) {\n if (process.env.DEBUG_MASTRA_CODE !== `true`) {\n return;\n }\n const line = `[ASM ${new Date().toISOString()}] ${args.map(a => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ')}\\n`;\n try {\n fs.appendFileSync(path.join(process.cwd(), 'tui-debug.log'), line);\n } catch {}\n}\n\nexport class AssistantMessageComponent extends Container {\n private contentContainer: Container;\n private hideThinkingBlock: boolean;\n private markdownTheme: MarkdownTheme;\n private lastMessage?: HarnessMessage;\n private _id: number;\n\n constructor(message?: HarnessMessage, hideThinkingBlock = false, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n super();\n this._id = ++_compId;\n\n this.hideThinkingBlock = hideThinkingBlock;\n this.markdownTheme = markdownTheme;\n\n // Container for text/thinking content\n this.contentContainer = new Container();\n this.addChild(this.contentContainer);\n\n asmDebugLog(`COMP#${this._id} CREATED`);\n\n if (message) {\n this.updateContent(message);\n }\n }\n\n override invalidate(): void {\n super.invalidate();\n if (this.lastMessage) {\n const summary = this.lastMessage.content\n .map(c => (c.type === 'text' ? `text(${c.text.length}ch)` : c.type))\n .join(', ');\n asmDebugLog(`COMP#${this._id} INVALIDATE lastMessage=[${summary}]`);\n this.updateContent(this.lastMessage);\n }\n }\n\n setHideThinkingBlock(hide: boolean): void {\n this.hideThinkingBlock = hide;\n }\n\n updateContent(message: HarnessMessage): void {\n // Deep copy the message to prevent mutation from the harness's shared content array\n this.lastMessage = {\n ...message,\n content: message.content.map(c => ({ ...c })),\n };\n\n // Clear content container\n this.contentContainer.clear();\n\n const hasVisibleContent = message.content.some(\n c => (c.type === 'text' && c.text.trim()) || (c.type === 'thinking' && c.thinking.trim()),\n );\n\n if (hasVisibleContent) {\n this.contentContainer.addChild(new Spacer(1));\n }\n // Render content in order\n for (let i = 0; i < message.content.length; i++) {\n const content = message.content[i]!;\n\n if (content.type === 'text' && (content as any).text.trim()) {\n // Assistant text messages - trim the text\n this.contentContainer.addChild(new Markdown((content as any).text.trim(), 1, 0, this.markdownTheme));\n } else if (content.type === 'thinking' && (content as any).thinking.trim()) {\n // Check if there's text content after this thinking block\n const hasTextAfter = message.content.slice(i + 1).some(c => c.type === 'text' && (c as any).text.trim());\n\n if (this.hideThinkingBlock) {\n // Show static \"Thinking...\" label when hidden\n this.contentContainer.addChild(new Text(theme.italic(theme.fg('thinkingText', 'Thinking...')), 1, 0));\n if (hasTextAfter) {\n this.contentContainer.addChild(new Spacer(1));\n }\n } else {\n // Thinking traces in thinkingText color, italic\n this.contentContainer.addChild(\n new Markdown((content as any).thinking.trim(), 1, 0, this.markdownTheme, {\n color: (text: string) => theme.fg('thinkingText', text),\n italic: true,\n }),\n );\n this.contentContainer.addChild(new Spacer(1));\n }\n }\n // Skip tool_call and tool_result - those are rendered by ToolExecutionComponent\n }\n\n // Check if aborted or error - show after partial content\n if (message.stopReason === 'aborted') {\n const abortMessage = message.errorMessage || 'Interrupted';\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('error', abortMessage), 1, 0));\n } else if (message.stopReason === 'error') {\n const errorMsg = message.errorMessage || 'Unknown error';\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(theme.fg('error', `Error: ${errorMsg}`), 1, 0));\n }\n }\n}\n","/**\n * Component that renders git diff output with syntax highlighting.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { fg, bold, mastra } from '../theme.js';\n\n// const removedColor = chalk.hex(\"#dc6868\") // soft red\nconst addedColor = chalk.hex('#5cb85c'); // soft green\nconst hunkHeaderColor = chalk.hex('#61afef'); // cyan-blue\nconst fileHeaderColor = chalk.bold.hex('#c678dd'); // bold purple\nconst removedColor = chalk.hex(mastra.red);\n// const addedColor = chalk.hex(mastra.green)\n// const hunkHeaderColor = chalk.hex(mastra.blue)\n// const fileHeaderColor = chalk.bold.hex(mastra.purple)\nconst metaColor = chalk.hex(mastra.mainGray);\n\nfunction colorizeDiffLine(line: string): string {\n // Unified diff headers\n if (line.startsWith('+++') || line.startsWith('---')) {\n return fileHeaderColor(line);\n }\n if (line.startsWith('diff ')) {\n return fileHeaderColor(line);\n }\n if (line.startsWith('@@')) {\n return hunkHeaderColor(line);\n }\n if (line.startsWith('+')) {\n return addedColor(line);\n }\n if (line.startsWith('-')) {\n return removedColor(line);\n }\n if (\n line.startsWith('index ') ||\n line.startsWith('new file') ||\n line.startsWith('deleted file') ||\n line.startsWith('similarity') ||\n line.startsWith('rename')\n ) {\n return metaColor(line);\n }\n // --stat lines: \" file | 5 +++--\" or summary \"2 files changed, ...\"\n const statMatch = line.match(/^(.+\\|.+?)(\\++)([-]*)$/);\n if (statMatch) {\n return statMatch[1] + addedColor(statMatch[2]) + removedColor(statMatch[3]);\n }\n if (/^\\s*\\d+ files? changed/.test(line)) {\n return line\n .replace(/(\\d+ insertions?\\(\\+\\))/, addedColor('$1'))\n .replace(/(\\d+ deletions?\\(-\\))/, removedColor('$1'));\n }\n return line;\n}\n\nexport class DiffOutputComponent extends Container {\n constructor(command: string, diffOutput: string) {\n super();\n this.addChild(new Spacer(1));\n\n // Command header\n this.addChild(new Text(`${fg('success', '✓')} ${bold(fg('muted', '$'))} ${fg('text', command)}`, 1, 0));\n\n const output = diffOutput.trimEnd();\n if (output) {\n const lines = output.split('\\n');\n for (const line of lines) {\n this.addChild(new Text(` ${colorizeDiffLine(line)}`, 0, 0));\n }\n }\n }\n}\n","/**\n * Login dialog component - handles OAuth login flow UI\n */\n\nimport { exec } from 'node:child_process';\nimport { Box, Container, getEditorKeybindings, Input, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, TUI } from '@mariozechner/pi-tui';\nimport { getOAuthProviders } from '../../auth/index.js';\nimport { bg, fg } from '../theme.js';\n\nexport class LoginDialogComponent extends Box implements Focusable {\n private contentContainer: Container;\n private input: Input;\n private tui: TUI;\n private abortController = new AbortController();\n private inputResolver?: (value: string) => void;\n private inputRejecter?: (error: Error) => void;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n this.input.focused = value;\n }\n\n constructor(\n tui: TUI,\n providerId: string,\n private onComplete: (success: boolean, message?: string) => void,\n ) {\n // Box with padding and background\n super(2, 1, text => 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(fg('warning', `Login to ${providerName}`)));\n this.addChild(new Spacer(1));\n\n // Dynamic content area\n this.contentContainer = new Container();\n this.addChild(this.contentContainer);\n\n // Input (always present, used when needed)\n this.input = new Input();\n this.input.onSubmit = () => {\n if (this.inputResolver) {\n this.inputResolver(this.input.getValue());\n this.inputResolver = undefined;\n this.inputRejecter = undefined;\n }\n };\n this.input.onEscape = () => {\n this.cancel();\n };\n }\n\n get signal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private cancel(): void {\n try {\n this.abortController.abort();\n } catch {}\n if (this.inputRejecter) {\n this.inputRejecter(new Error('Login cancelled'));\n this.inputResolver = undefined;\n this.inputRejecter = undefined;\n }\n this.onComplete(false, 'Login cancelled');\n }\n\n /**\n * Called by onAuth callback - show URL and optional instructions\n */\n showAuth(url: string, instructions?: string): void {\n this.contentContainer.clear();\n\n this.contentContainer.addChild(new Text(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(fg('muted', hyperlink)));\n\n if (instructions) {\n this.contentContainer.addChild(new Spacer(1));\n this.contentContainer.addChild(new Text(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(fg('text', message)));\n if (placeholder) {\n this.contentContainer.addChild(new Text(fg('muted', `e.g., ${placeholder}`)));\n }\n this.contentContainer.addChild(this.input);\n this.contentContainer.addChild(new Text(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(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","/**\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 { bg, fg, bold } 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 /** Callback when a model is selected */\n onSelect: (model: ModelItem) => void;\n /** Callback when selection is cancelled */\n onCancel: () => void;\n}\n\n// =============================================================================\n// ModelSelectorComponent\n// =============================================================================\n\nexport class ModelSelectorComponent extends Box implements Focusable {\n private searchInput!: Input;\n private listContainer!: Container;\n private allModels: ModelItem[];\n private filteredModels: ModelItem[];\n private selectedIndex = 0;\n private currentModelId?: string;\n private onSelectCallback: (model: ModelItem) => void;\n private onCancelCallback: () => void;\n private tui: TUI;\n private title: string;\n\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 => bg('overlayBg', text));\n\n this.tui = options.tui;\n this.title = options.title ?? 'Select Model';\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\n this.addChild(new Text(bold(fg('accent', this.title)), 0, 0));\n this.addChild(new Spacer(1));\n\n // Hint\n this.addChild(new Text(fg('muted', 'Type to search • ↑↓ navigate • Enter select • Esc cancel'), 0, 0));\n this.addChild(new Spacer(1));\n\n // Search input (Input has built-in \"> \" prompt)\n this.searchInput = new Input();\n this.searchInput.onSubmit = () => {\n if (this.hasCustomItem && this.selectedIndex === 0) {\n const query = this.searchInput.getValue().trim();\n if (query) this.handleSelect(this.makeCustomModelItem(query));\n } else {\n const modelIndex = this.hasCustomItem ? this.selectedIndex - 1 : this.selectedIndex;\n const selected = this.filteredModels[modelIndex];\n if (selected) this.handleSelect(selected);\n }\n };\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n // List container\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n // Initial render\n this.updateList();\n }\n\n private sortModels(models: ModelItem[], currentModelId?: string): ModelItem[] {\n const sorted = [...models];\n\n // Sort: current first, then API key available, then by use count (desc), then alphabetical\n sorted.sort((a, b) => {\n // Current model always first\n const aIsCurrent = a.id === currentModelId;\n const bIsCurrent = b.id === currentModelId;\n if (aIsCurrent && !bIsCurrent) return -1;\n if (!aIsCurrent && bIsCurrent) return 1;\n\n // Models with API keys come before those without\n if (a.hasApiKey && !b.hasApiKey) return -1;\n if (!a.hasApiKey && b.hasApiKey) return 1;\n\n // Then by use count (higher = first)\n const aCount = a.useCount ?? 0;\n const bCount = b.useCount ?? 0;\n if (aCount !== bCount) return bCount - aCount;\n\n // Then by provider\n const providerCompare = a.provider.localeCompare(b.provider);\n if (providerCompare !== 0) return providerCompare;\n\n // Then by model name\n return a.modelName.localeCompare(b.modelName);\n });\n\n return sorted;\n }\n\n /** Whether the custom \"Use: ...\" item is showing at the top */\n private hasCustomItem = false;\n\n private filterModels(query: string): void {\n // Apply fuzzy filter if there's a query, otherwise show all\n // Sorting already puts models with API keys first\n this.filteredModels = query\n ? fuzzyFilter(this.allModels, query, m => `${m.id} ${m.provider} ${m.modelName}`)\n : this.allModels;\n\n // Show \"Use: query\" custom item when query looks like a model ID\n // and doesn't exactly match the top result\n const trimmed = query.trim();\n this.hasCustomItem = trimmed.length > 0 && this.filteredModels[0]?.id !== trimmed;\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, totalItems - 1));\n this.updateList();\n }\n\n private makeCustomModelItem(id: string): ModelItem {\n const parts = id.split('/');\n const provider = parts.length > 1 ? parts[0]! : 'custom';\n const modelName = parts.length > 1 ? parts.slice(1).join('/') : id;\n return { id, provider, modelName, hasApiKey: true };\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n const maxVisible = 12;\n const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), totalItems - maxVisible));\n const endIndex = Math.min(startIndex + maxVisible, totalItems);\n\n for (let i = startIndex; i < endIndex; i++) {\n // First item is the custom \"Use: ...\" entry when active\n if (this.hasCustomItem && i === 0) {\n const query = this.searchInput.getValue().trim();\n const isSelected = this.selectedIndex === 0;\n const line = isSelected\n ? fg('accent', '→ ') + bold(fg('accent', `Use: ${query}`))\n : ' ' + 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 ? fg('success', ' ✓') : '';\n const noKeyIndicator = !item.hasApiKey\n ? fg('error', ' ✗') + fg('muted', item.apiKeyEnvVar ? ` (${item.apiKeyEnvVar})` : ' (no key)')\n : '';\n\n let line = '';\n if (isSelected) {\n line = fg('accent', '→ ' + item.id) + checkmark + noKeyIndicator;\n } else {\n const modelText = item.hasApiKey ? item.id : 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 = 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(fg('muted', 'No matching models'), 0, 0));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n const totalItems = this.filteredModels.length + (this.hasCustomItem ? 1 : 0);\n\n // Up arrow\n if (kb.matches(keyData, 'selectUp')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? totalItems - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n }\n // Down arrow\n else if (kb.matches(keyData, 'selectDown')) {\n if (totalItems === 0) return;\n this.selectedIndex = this.selectedIndex === totalItems - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n }\n // Enter\n else if (kb.matches(keyData, 'selectConfirm')) {\n if (this.hasCustomItem && this.selectedIndex === 0) {\n const query = this.searchInput.getValue().trim();\n if (query) this.handleSelect(this.makeCustomModelItem(query));\n } else {\n const modelIndex = this.hasCustomItem ? this.selectedIndex - 1 : this.selectedIndex;\n const selected = this.filteredModels[modelIndex];\n if (selected) this.handleSelect(selected);\n }\n }\n // Escape or Ctrl+C\n else if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n }\n // Pass everything else to search input\n else {\n this.searchInput.handleInput(keyData);\n this.filterModels(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n\n private handleSelect(model: ModelItem): void {\n this.onSelectCallback(model);\n }\n\n getSearchInput(): Input {\n return this.searchInput;\n }\n}\n","import chalk from 'chalk';\n\nconst GRADIENT_WIDTH = 30; // Width of the bright spot as percentage of total text\nconst BASE_COLOR = [124, 58, 237]; // #b588fe Mastra purple is too washed out, using #7c3aed\nconst MIN_BRIGHTNESS = 0.45; // Dimmest characters (0-1)\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 purple accent)\n * @param fadeProgress - 0 = full animation, 1 = fully idle (flattens gradient)\n * @returns Chalk-colored string\n */\nexport function applyGradientSweep(text: string, offset: number, color?: string, fadeProgress = 0): string {\n const chars = [...text];\n const totalChars = chars.length;\n if (totalChars === 0) return text;\n\n const baseColor = color ? hexToRgb(color) : BASE_COLOR;\n const gradientCenter = (offset % 1) * 100;\n\n return chars\n .map((char, i) => {\n if (char === ' ') return ' ';\n\n const charPosition = (i / totalChars) * 100;\n let distance = Math.abs(charPosition - gradientCenter);\n\n // Wrap-around for smooth cycling\n if (distance > 50) {\n distance = 100 - distance;\n }\n\n const normalizedDistance = Math.min(distance / (GRADIENT_WIDTH / 2), 1);\n const animBrightness = MIN_BRIGHTNESS + (1 - MIN_BRIGHTNESS) * (1 - normalizedDistance);\n\n // Interpolate toward idle brightness as fade progresses\n const brightness = animBrightness + (IDLE_BRIGHTNESS - animBrightness) * fadeProgress;\n\n const r = Math.floor(baseColor[0]! * brightness);\n const g = Math.floor(baseColor[1]! * brightness);\n const b = Math.floor(baseColor[2]! * brightness);\n\n return chalk.rgb(r, g, b)(char);\n })\n .join('');\n}\n\n/**\n * Manages the gradient sweep animation state.\n * Call `start()` when agent begins working, `stop()` when idle.\n * On each tick, call `getOffset()` to get the current sweep position.\n */\nexport class GradientAnimator {\n private offset = 0;\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private onTick: () => void;\n private _isFadingOut = false;\n private _isFadingIn = false;\n private _fadeProgress = 0; // 0 = full animation, 1 = fully idle\n\n constructor(onTick: () => void) {\n this.onTick = onTick;\n }\n\n start(): void {\n if (this.intervalId && !this._isFadingOut) return;\n // Cancel any ongoing fade-out\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this._isFadingOut = false;\n this._isFadingIn = true;\n this._fadeProgress = 1; // Start from idle, fade toward full animation\n this.offset = 0;\n this.intervalId = setInterval(() => {\n this.offset += 0.03; // Speed: full sweep in ~55 ticks\n if (this._isFadingIn) {\n this._fadeProgress -= 0.06; // ~17 steps over ~500ms\n if (this._fadeProgress <= 0) {\n this._fadeProgress = 0;\n this._isFadingIn = false;\n }\n }\n this.onTick();\n }, 80);\n }\n\n /**\n * Smoothly fade the gradient to idle state over ~500ms.\n */\n fadeOut(): void {\n if (!this.intervalId) return;\n if (this._isFadingOut) return;\n this._isFadingOut = true;\n this._fadeProgress = 0;\n // Replace the animation interval with a fade interval\n clearInterval(this.intervalId);\n this.intervalId = setInterval(() => {\n this._fadeProgress += 0.08; // ~12 steps over ~500ms\n if (this._fadeProgress >= 1) {\n this._fadeProgress = 1;\n this.stop();\n }\n this.onTick();\n }, 40);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this._isFadingOut = false;\n this._fadeProgress = 0;\n this.offset = 0;\n }\n\n getOffset(): number {\n return this.offset;\n }\n\n /** 0 = full animation, 1 = fully idle. Use to interpolate colors. */\n getFadeProgress(): number {\n return this._fadeProgress;\n }\n\n isFadingOut(): boolean {\n return this._isFadingOut;\n }\n\n isRunning(): boolean {\n return this.intervalId !== null;\n }\n}\n","/**\n * 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 { fg } from '../theme.js';\n\n/**\n * Format token count for display (e.g., 7234 -> \"7.2k\", 234 -> \"0.2k\", 0 -> \"0\")\n */\nfunction formatTokens(tokens: number): string {\n if (tokens === 0) return '0';\n const k = tokens / 1000;\n return k % 1 === 0 ? `${k}k` : `${k.toFixed(1)}k`;\n}\nexport type OMMarkerData =\n | {\n type: 'om_observation_start';\n tokensToObserve: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_end';\n tokensObserved: number;\n observationTokens: number;\n durationMs: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_observation_failed';\n error: string;\n tokensAttempted?: number;\n operationType?: 'observation' | 'reflection';\n }\n | {\n type: 'om_buffering_start';\n operationType: 'observation' | 'reflection';\n tokensToBuffer: number;\n }\n | {\n type: 'om_buffering_end';\n operationType: 'observation' | 'reflection';\n tokensBuffered: number;\n bufferedTokens: number;\n observations?: string;\n }\n | {\n type: 'om_buffering_failed';\n operationType: 'observation' | 'reflection';\n error: string;\n }\n | {\n type: 'om_activation';\n operationType: 'observation' | 'reflection';\n tokensActivated: number;\n observationTokens: number;\n };\n\n/**\n * Renders an inline OM observation marker in the chat history.\n * Can be updated in-place to transition from start → end/failed.\n */\nexport class OMMarkerComponent extends Container {\n private textChild: Text;\n\n constructor(data: OMMarkerData) {\n super();\n // Add 1 line of padding above\n this.addChild(new Spacer(1));\n this.textChild = new Text(formatMarker(data), 0, 0);\n this.addChild(this.textChild);\n }\n\n /**\n * Update the marker in-place (e.g., from start → end).\n */\n update(data: OMMarkerData): void {\n this.textChild.setText(formatMarker(data));\n }\n}\nfunction formatMarker(data: OMMarkerData): string {\n const isReflection = data.operationType === 'reflection';\n const label = isReflection ? 'Reflection' : 'Observation';\n\n switch (data.type) {\n case 'om_observation_start': {\n const tokens = data.tokensToObserve > 0 ? ` ~${formatTokens(data.tokensToObserve)} tokens` : '';\n return 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 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 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 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 fg('success', ` ✓ Buffered ${label.toLowerCase()}: ${input} → ${output} tokens${ratio}`);\n }\n case 'om_buffering_failed': {\n return fg('error', ` ✗ Buffering ${label.toLowerCase()} failed: ${data.error}`);\n }\n case 'om_activation': {\n const kind = data.operationType === 'reflection' ? 'reflection' : 'observations';\n const msgTokens = formatTokens(data.tokensActivated);\n const obsTokens = formatTokens(data.observationTokens);\n return fg('success', ` ✓ Activated ${kind}: -${msgTokens} msg tokens, +${obsTokens} obs tokens`);\n }\n }\n}\n","/**\n * TUI component for rendering OM observation/reflection output in a bordered box.\n * Uses observer (amber) color for observations and reflector (red) color for reflections.\n * Collapsed to COLLAPSED_LINES by default, expandable with ctrl+e.\n * Includes marker info (emoji, compression stats) in the footer.\n */\n\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { mastra } from '../theme.js';\n\nconst OBSERVER_COLOR = '#f59e0b';\nconst REFLECTOR_COLOR = '#ef4444';\nconst COLLAPSED_LINES = 10;\n\nfunction formatTokens(tokens: number): string {\n if (tokens === 0) return '0';\n const k = tokens / 1000;\n return k % 1 === 0 ? `${k}k` : `${k.toFixed(1)}k`;\n}\n\n/** Truncate a string with ANSI codes to a visible width */\nfunction truncateAnsi(str: string, maxWidth: number): string {\n const ansiRegex = /\\x1b\\[[0-9;]*m/g;\n let visibleLength = 0;\n let result = '';\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = ansiRegex.exec(str)) !== null) {\n const textBefore = str.slice(lastIndex, match.index);\n for (const char of textBefore) {\n if (visibleLength >= maxWidth) break;\n result += char;\n visibleLength++;\n }\n if (visibleLength >= maxWidth) break;\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n\n const remaining = str.slice(lastIndex);\n for (const char of remaining) {\n if (visibleLength >= maxWidth) break;\n result += char;\n visibleLength++;\n }\n\n if (visibleLength >= maxWidth) {\n result += '\\x1b[0m';\n }\n return result;\n}\n\n/**\n * Soft-wrap an array of lines to fit within maxWidth, preserving words where possible.\n * Returns groups where each group corresponds to one original line split into wrapped segments.\n */\nfunction softWrapLines(lines: string[], maxWidth: number): { groups: string[][]; flat: string[] } {\n const groups: string[][] = [];\n const flat: string[] = [];\n for (const line of lines) {\n if (line.length <= maxWidth) {\n groups.push([line]);\n flat.push(line);\n continue;\n }\n // Word-wrap: break at spaces when possible\n const group: string[] = [];\n let remaining = line;\n while (remaining.length > maxWidth) {\n let breakAt = remaining.lastIndexOf(' ', maxWidth);\n if (breakAt <= 0) {\n breakAt = maxWidth;\n }\n const segment = remaining.slice(0, breakAt);\n group.push(segment);\n flat.push(segment);\n remaining = remaining.slice(breakAt).replace(/^ /, '');\n }\n if (remaining.length > 0) {\n group.push(remaining);\n flat.push(remaining);\n }\n groups.push(group);\n }\n return { groups, flat };\n}\n\nexport type OMOutputType = 'observation' | 'reflection';\n\nexport interface OMOutputData {\n type: OMOutputType;\n observations: string;\n currentTask?: string;\n suggestedResponse?: string;\n durationMs?: number;\n tokensObserved?: number;\n observationTokens?: number;\n compressedTokens?: number;\n}\n\nexport class OMOutputComponent extends Container {\n private data: OMOutputData;\n private expanded: boolean = false;\n\n constructor(data: OMOutputData) {\n super();\n this.data = data;\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.setExpanded(!this.expanded);\n }\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const isReflection = this.data.type === 'reflection';\n const color = isReflection ? REFLECTOR_COLOR : OBSERVER_COLOR;\n const border = (char: string) => chalk.bold.hex(color)(char);\n\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // \"│ \" prefix + buffer\n // Soft-wrap all original lines to terminal width\n const originalLines = this.data.observations.split('\\n');\n const { groups, flat: wrappedLines } = softWrapLines(originalLines, maxLineWidth);\n const originalLineCount = originalLines.length;\n const wrappedLineCount = wrappedLines.length;\n\n // Build footer text with marker info (emoji + compression stats)\n const footerText = this.buildFooterText(color);\n\n // Top border\n this.addChild(new Text(border('┌──'), 0, 0));\n\n // Content lines with left border\n let truncated = false;\n const borderedLines: string[] = [];\n if (!this.expanded && wrappedLineCount > COLLAPSED_LINES + 1) {\n // Collect head groups until we hit ~half the budget\n const headBudget = Math.ceil(COLLAPSED_LINES / 2);\n const headLines: string[] = [];\n let headGroupCount = 0;\n for (const group of groups) {\n if (headLines.length + group.length > headBudget && headLines.length > 0) break;\n headLines.push(...group);\n headGroupCount++;\n }\n\n // Collect tail groups from the end until we hit the other half\n const tailBudget = COLLAPSED_LINES - headLines.length;\n const tailLines: string[] = [];\n let tailGroupStart = groups.length;\n for (let i = groups.length - 1; i >= headGroupCount; i--) {\n if (tailLines.length + groups[i]!.length > tailBudget && tailLines.length > 0) break;\n tailLines.unshift(...groups[i]!);\n tailGroupStart = i;\n }\n\n const hiddenGroups = tailGroupStart - headGroupCount;\n truncated = hiddenGroups > 0;\n\n if (truncated) {\n for (const line of headLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n borderedLines.push(\n border('│') + ' ' + chalk.hex(mastra.mainGray)(`... ${originalLineCount} lines total (ctrl+e to expand)`),\n );\n for (const line of tailLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n } else {\n // Edge case: all groups fit when snapped to boundaries\n for (const line of wrappedLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n }\n } else {\n for (const line of wrappedLines) {\n borderedLines.push(border('│') + ' ' + chalk.hex(mastra.specialGray)(line));\n }\n }\n\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.addChild(new Text(displayOutput, 0, 0));\n }\n\n // Current task / suggested response sections\n if (this.data.currentTask && (this.expanded || !truncated)) {\n const taskLine =\n border('│') +\n ' ' +\n chalk.hex(color).bold('Current task: ') +\n chalk.hex(mastra.specialGray)(this.data.currentTask);\n this.addChild(new Text(truncateAnsi(taskLine, termWidth - 2), 0, 0));\n }\n\n if (this.data.suggestedResponse && (this.expanded || !truncated)) {\n const sugLine =\n border('│') +\n ' ' +\n chalk.hex(color).bold('Suggested response: ') +\n chalk.hex(mastra.specialGray)(this.data.suggestedResponse);\n this.addChild(new Text(truncateAnsi(sugLine, termWidth - 2), 0, 0));\n }\n\n // Bottom border with footer\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n\n private buildFooterText(color: string): string {\n const isReflection = this.data.type === 'reflection';\n const emoji = '🧠';\n\n if (isReflection) {\n // Reflection: \"🧠 Reflected: Xk → Yk tokens (Zx compression) in Ns ✓\"\n const observed = formatTokens(this.data.tokensObserved ?? 0);\n const compressed = formatTokens(this.data.compressedTokens ?? this.data.observationTokens ?? 0);\n const ratio =\n (this.data.tokensObserved ?? 0) > 0 && (this.data.compressedTokens ?? this.data.observationTokens ?? 0) > 0\n ? `${Math.round((this.data.tokensObserved ?? 0) / (this.data.compressedTokens ?? this.data.observationTokens ?? 1))}x`\n : '';\n const durationStr = this.data.durationMs ? ` in ${(this.data.durationMs / 1000).toFixed(1)}s` : '';\n const ratioStr = ratio ? ` (${ratio} compression)` : '';\n return `${emoji} ${chalk.hex(color)(`Reflected: ${observed} → ${compressed} tokens${ratioStr}${durationStr}`)} ${chalk.hex(mastra.green)('✓')}`;\n } else {\n // Observation: \"🧠 Observed: Xk → Yk tokens (Zx compression) in Ns ✓\"\n const observed = formatTokens(this.data.tokensObserved ?? 0);\n const compressed = formatTokens(this.data.observationTokens ?? 0);\n const ratio =\n (this.data.tokensObserved ?? 0) > 0 && (this.data.observationTokens ?? 0) > 0\n ? `${Math.round((this.data.tokensObserved ?? 0) / (this.data.observationTokens ?? 1))}x`\n : '';\n const durationStr = this.data.durationMs ? ` in ${(this.data.durationMs / 1000).toFixed(1)}s` : '';\n const ratioStr = ratio ? ` (${ratio} compression)` : '';\n return `${emoji} ${chalk.hex(color)(`Observed: ${observed} → ${compressed} tokens${ratioStr}${durationStr}`)} ${chalk.hex(mastra.green)('✓')}`;\n }\n }\n}\n","/**\n * 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 chalk from 'chalk';\nimport { fg, mastra } from '../theme.js';\nexport type OMStatus = 'idle' | 'observing' | 'reflecting';\n\nexport type OMBufferedStatus = 'idle' | 'running' | 'complete';\n\nexport interface OMProgressState {\n status: OMStatus;\n // Active window tokens/thresholds (from data-om-status)\n pendingTokens: number;\n threshold: number;\n thresholdPercent: number;\n observationTokens: number;\n reflectionThreshold: number;\n reflectionThresholdPercent: number;\n // Buffered state (from data-om-status)\n buffered: {\n observations: {\n status: OMBufferedStatus;\n chunks: number;\n messageTokens: number;\n projectedMessageRemoval: number;\n observationTokens: number;\n };\n reflection: {\n status: OMBufferedStatus;\n inputObservationTokens: number;\n observationTokens: number;\n };\n };\n generationCount: number;\n stepNumber: number;\n cycleId?: string;\n startTime?: number;\n}\n\nexport function defaultOMProgressState(): OMProgressState {\n return {\n status: 'idle',\n pendingTokens: 0,\n threshold: 30000,\n thresholdPercent: 0,\n observationTokens: 0,\n reflectionThreshold: 40000,\n reflectionThresholdPercent: 0,\n buffered: {\n observations: {\n status: 'idle',\n chunks: 0,\n messageTokens: 0,\n projectedMessageRemoval: 0,\n observationTokens: 0,\n },\n reflection: {\n status: 'idle',\n inputObservationTokens: 0,\n observationTokens: 0,\n },\n },\n generationCount: 0,\n stepNumber: 0,\n };\n}\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(fg('muted', `OM ${bar} ${percent}%`));\n } else {\n this.statusText.setText('');\n }\n } else if (this.state.status === 'observing') {\n const elapsed = this.state.startTime ? Math.round((Date.now() - this.state.startTime) / 1000) : 0;\n const spinner = this.getSpinner();\n this.statusText.setText(chalk.hex(mastra.orange)(`${spinner} Observing... ${elapsed}s`));\n } else if (this.state.status === 'reflecting') {\n const elapsed = this.state.startTime ? Math.round((Date.now() - this.state.startTime) / 1000) : 0;\n const spinner = this.getSpinner();\n this.statusText.setText(chalk.hex(mastra.pink)(`${spinner} Reflecting... ${elapsed}s`));\n }\n }\n\n private renderProgressBar(percent: number, width: number): string {\n const filled = Math.min(width, Math.round((percent / 100) * width));\n const empty = width - filled;\n const bar = '━'.repeat(filled) + '─'.repeat(empty);\n\n // Color based on threshold proximity — Mastra brand colors\n if (percent >= 90) {\n return chalk.hex(mastra.red)(bar); // Mastra red\n } else if (percent >= 70) {\n return chalk.hex(mastra.orange)(bar); // Mastra orange\n } else {\n return chalk.hex(mastra.darkGray)(bar); // Mastra dark gray\n }\n }\n private spinnerFrame = 0;\n private getSpinner(): string {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n this.spinnerFrame = (this.spinnerFrame + 1) % frames.length;\n return frames[this.spinnerFrame]!;\n }\n\n render(maxWidth: number): string[] {\n this.updateDisplay();\n return this.statusText.render(maxWidth);\n }\n}\n\n/** Format token count without k suffix (e.g., 7234 -> \"7.2\", 200 -> \"0.2\", 0 -> \"0\") */\nfunction formatTokensValue(n: number): string {\n if (n === 0) return '0';\n const k = n / 1000;\n const s = k.toFixed(1);\n return s.endsWith('.0') ? s.slice(0, -2) : s;\n}\n\n/** Format token threshold with k suffix (e.g., 30000 -> \"30k\", 40000 -> \"40k\") */\nfunction formatTokensThreshold(n: number): string {\n const k = n / 1000;\n const s = k.toFixed(1);\n return (s.endsWith('.0') ? s.slice(0, -2) : s) + 'k';\n}\n\nfunction colorByPercent(text: string, percent: number): string {\n if (percent >= 90) return chalk.hex(mastra.red)(text); // Mastra red\n if (percent >= 70) return chalk.hex(mastra.orange)(text); // Mastra orange\n return chalk.hex(mastra.darkGray)(text); // Mastra dark gray\n}\n/**\n * Format OM observation threshold for status bar.\n * Compact levels (most → least info):\n * \"full\": messages 12.5k/30k ↓2.1k\n * undefined: msg 12.5k/30k ↓2.1k\n * \"noBuffer\": msg 12.5k/30k\n * \"percentOnly\": msg 42%\n *\n * @param labelStyler - Optional function to style the label text (for animation).\n * Receives the raw label string, returns styled string.\n */\nexport function formatObservationStatus(\n state: OMProgressState,\n compact?: 'percentOnly' | 'noBuffer' | 'full',\n labelStyler?: (label: string) => string,\n): string {\n // Status is now shown in the mode badge, so just show the metrics\n const percent = Math.round(state.thresholdPercent);\n const pct = colorByPercent(`${percent}%`, percent);\n const defaultStyler = (s: string) => chalk.hex(mastra.specialGray)(s);\n const styleLabel = labelStyler ?? defaultStyler;\n if (compact === 'percentOnly') {\n return styleLabel('msg ') + pct;\n }\n const label = compact === 'full' ? 'messages' : 'msg';\n const fraction = `${formatTokensValue(state.pendingTokens)}/${formatTokensThreshold(state.threshold)}`;\n const buffered =\n compact !== 'noBuffer' && state.buffered.observations.projectedMessageRemoval > 0\n ? chalk.hex('#555')(` ↓${formatTokensThreshold(state.buffered.observations.projectedMessageRemoval)}`)\n : '';\n return styleLabel(`${label} `) + colorByPercent(fraction, percent) + buffered;\n}\n/**\n * Format OM reflection threshold for status bar.\n * Compact levels (most → least info):\n * \"full\": memory 8.2k/40k ↓1.2k\n * undefined: mem 8.2k/40k ↓1.2k\n * \"noBuffer\": mem 8.2k/40k\n * \"percentOnly\": mem 21%\n *\n * @param labelStyler - Optional function to style the label text (for animation).\n * Receives the raw label string, returns styled string.\n */\nexport function formatReflectionStatus(\n state: OMProgressState,\n compact?: 'percentOnly' | 'noBuffer' | 'full',\n labelStyler?: (label: string) => string,\n): string {\n // Status is now shown in the mode badge, so just show the metrics\n const percent = Math.round(state.reflectionThresholdPercent);\n const pct = colorByPercent(`${percent}%`, percent);\n const defaultStyler = (s: string) => chalk.hex(mastra.specialGray)(s);\n const styleLabel = labelStyler ?? defaultStyler;\n const label = styleLabel(compact === 'full' ? 'memory' : 'mem') + ' ';\n if (compact === 'percentOnly') {\n return label + pct;\n }\n const fraction = `${formatTokensValue(state.observationTokens)}/${formatTokensThreshold(state.reflectionThreshold)}`;\n const savings = state.buffered.reflection.inputObservationTokens - state.buffered.reflection.observationTokens;\n const buffered =\n compact !== 'noBuffer' && state.buffered.reflection.status === 'complete'\n ? chalk.hex('#555')(` ↓${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 * Observational Memory settings component.\n * Uses pi-tui's SettingsList for a clean settings UI with\n * threshold configuration and model selection submenus.\n *\n * Changes apply immediately — Esc closes the panel.\n */\n\nimport {\n Box,\n Container,\n fuzzyFilter,\n getEditorKeybindings,\n Input,\n SelectList,\n SettingsList,\n Spacer,\n Text,\n} from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, SettingItem, TUI } from '@mariozechner/pi-tui';\nimport { fg, bg, bold, getSettingsListTheme, getSelectListTheme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface OMSettingsConfig {\n observerModelId: string;\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n}\n\nexport interface OMSettingsCallbacks {\n onObserverModelChange: (modelId: string) => void;\n onReflectorModelChange: (modelId: string) => void;\n onObservationThresholdChange: (value: number) => void;\n onReflectionThresholdChange: (value: number) => void;\n onClose: () => void;\n}\n\nexport interface ModelOption {\n id: string;\n label: string;\n}\n\n// =============================================================================\n// Threshold presets (in tokens)\n// =============================================================================\n\nconst OBSERVATION_THRESHOLDS = [5_000, 10_000, 15_000, 20_000, 30_000, 50_000, 75_000, 100_000];\n\nconst REFLECTION_THRESHOLDS = [10_000, 20_000, 30_000, 40_000, 60_000, 80_000, 100_000, 150_000];\n\nfunction formatTokens(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(0)}k`;\n return String(n);\n}\n\nfunction parseTokenInput(input: string): number | null {\n const trimmed = input.trim().toLowerCase();\n if (!trimmed) return null;\n\n // Match patterns like \"30k\", \"30\", \"30000\", \"1.5k\"\n const match = trimmed.match(/^(\\d+(?:\\.\\d+)?)\\s*k?$/);\n if (!match) return null;\n\n const num = parseFloat(match[1]!);\n if (isNaN(num) || num <= 0) return null;\n\n // \"30k\" → 30,000\n if (trimmed.endsWith('k')) {\n return num * 1000;\n }\n // Small numbers (< 500) assumed to be in thousands: \"30\" → 30,000\n if (num < 500) {\n return num * 1000;\n }\n // Large numbers used as-is: \"30000\" → 30,000\n return num;\n}\n\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(bold(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(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(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(fg('dim', ' Enter to confirm · ↓ for presets · Esc to go back'), 0, 0));\n }\n\n handleInput(data: string): void {\n if (this.inInputMode) {\n // Enter — submit the typed value\n if (data === '\\r' || data === '\\n') {\n const parsed = parseTokenInput(this.input.getValue());\n if (parsed) {\n this.onDone(parsed);\n }\n return;\n }\n\n // Escape\n if (data === '\\x1b' || data === '\\x1b\\x1b') {\n this.onBack();\n return;\n }\n\n // Down arrow — switch to preset list\n if (data === '\\x1b[B') {\n this.inInputMode = false;\n return;\n }\n\n // Delegate to input (numbers, backspace, etc.)\n this.input.handleInput(data);\n } else {\n // In preset list mode\n // Escape — go back (handled by selectList.onCancel)\n this.selectList.handleInput(data);\n }\n }\n}\n\n// =============================================================================\n// Model Select Submenu\n// =============================================================================\n\nclass ModelSelectSubmenu extends Container {\n private searchInput: Input;\n private listContainer: Container;\n private allModels: ModelOption[];\n private filteredModels: ModelOption[];\n private selectedIndex = 0;\n private currentModelId: string;\n private onSelect: (modelId: string) => void;\n private onCancel: () => void;\n private tui: TUI;\n\n constructor(\n title: string,\n models: ModelOption[],\n currentModelId: string,\n onSelect: (modelId: string) => void,\n onCancel: () => void,\n tui: TUI,\n ) {\n super();\n this.allModels = models;\n this.filteredModels = models;\n this.currentModelId = currentModelId;\n this.onSelect = onSelect;\n this.onCancel = onCancel;\n this.tui = tui;\n\n this.addChild(new Text(bold(fg('accent', title)), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(fg('muted', 'Type to search · ↑↓ navigate · Enter select · Esc back'), 0, 0));\n this.addChild(new Spacer(1));\n\n this.searchInput = new Input();\n this.addChild(this.searchInput);\n this.addChild(new Spacer(1));\n\n this.listContainer = new Container();\n this.addChild(this.listContainer);\n\n // Pre-select current model\n const currentIndex = models.findIndex(m => m.id === currentModelId);\n if (currentIndex !== -1) {\n this.selectedIndex = currentIndex;\n }\n\n this.updateList();\n }\n\n private filterModels(query: string): void {\n this.filteredModels = query ? fuzzyFilter(this.allModels, query, m => `${m.id} ${m.label}`) : this.allModels;\n\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredModels.length - 1));\n this.updateList();\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const maxVisible = 10;\n const total = this.filteredModels.length;\n const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), total - maxVisible));\n const endIndex = Math.min(startIndex + maxVisible, total);\n\n for (let i = startIndex; i < endIndex; i++) {\n const item = this.filteredModels[i]!;\n const isSelected = i === this.selectedIndex;\n const isCurrent = item.id === this.currentModelId;\n const checkmark = isCurrent ? fg('success', ' ✓') : '';\n\n const line = isSelected ? fg('accent', `→ ${item.label}`) + checkmark : ` ${item.label}` + checkmark;\n\n this.listContainer.addChild(new Text(line, 0, 0));\n }\n\n if (startIndex > 0 || endIndex < total) {\n this.listContainer.addChild(new Text(fg('muted', `(${this.selectedIndex + 1}/${total})`), 0, 0));\n }\n\n if (total === 0) {\n this.listContainer.addChild(new Text(fg('muted', 'No matching models'), 0, 0));\n }\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n const total = this.filteredModels.length;\n\n if (kb.matches(data, 'selectUp')) {\n if (total === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? total - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(data, 'selectDown')) {\n if (total === 0) return;\n this.selectedIndex = this.selectedIndex === total - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(data, 'selectConfirm')) {\n const selected = this.filteredModels[this.selectedIndex];\n if (selected) this.onSelect(selected.id);\n } else if (kb.matches(data, 'selectCancel')) {\n this.onCancel();\n } else {\n this.searchInput.handleInput(data);\n this.filterModels(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n}\n\n// =============================================================================\n// OM Settings Component\n// =============================================================================\n\nexport class OMSettingsComponent extends Box implements Focusable {\n private settingsList: SettingsList;\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n }\n\n constructor(config: OMSettingsConfig, callbacks: OMSettingsCallbacks, models: ModelOption[], tui: TUI) {\n super(2, 1, (text: string) => bg('overlayBg', text));\n\n // Title\n this.addChild(new Text(bold(fg('accent', 'Observational Memory Settings')), 0, 0));\n this.addChild(new Spacer(1));\n\n // Build settings items\n const items: SettingItem[] = [\n {\n id: 'observer-model',\n label: 'Observer model',\n description: 'Model used for observing and summarizing message history',\n currentValue: getShortModelName(config.observerModelId),\n submenu: (_currentValue, done) =>\n new ModelSelectSubmenu(\n 'Observer Model',\n models,\n config.observerModelId,\n modelId => {\n config.observerModelId = modelId;\n callbacks.onObserverModelChange(modelId);\n done(getShortModelName(modelId));\n },\n () => done(),\n tui,\n ),\n },\n {\n id: 'reflector-model',\n label: 'Reflector model',\n description: 'Model used for compressing observations when they grow too large',\n currentValue: getShortModelName(config.reflectorModelId),\n submenu: (_currentValue, done) =>\n new ModelSelectSubmenu(\n 'Reflector Model',\n models,\n config.reflectorModelId,\n modelId => {\n config.reflectorModelId = modelId;\n callbacks.onReflectorModelChange(modelId);\n done(getShortModelName(modelId));\n },\n () => done(),\n tui,\n ),\n },\n {\n id: 'obs-threshold',\n label: 'Observation threshold',\n description:\n 'Token count before triggering observation. ' +\n 'Lower = more frequent, higher = more context before observing',\n currentValue: formatTokens(config.observationThreshold),\n submenu: (_currentValue, done) =>\n new ThresholdSubmenu(\n 'Observation Threshold',\n config.observationThreshold,\n OBSERVATION_THRESHOLDS,\n value => {\n config.observationThreshold = value;\n callbacks.onObservationThresholdChange(value);\n done(formatTokens(value));\n },\n () => done(),\n ),\n },\n {\n id: 'ref-threshold',\n label: 'Reflection threshold',\n description:\n 'Token count of observations before triggering compression. ' +\n 'Lower = more frequent, higher = more observations before compressing',\n currentValue: formatTokens(config.reflectionThreshold),\n submenu: (_currentValue, done) =>\n new ThresholdSubmenu(\n 'Reflection Threshold',\n config.reflectionThreshold,\n REFLECTION_THRESHOLDS,\n value => {\n config.reflectionThreshold = value;\n callbacks.onReflectionThresholdChange(value);\n done(formatTokens(value));\n },\n () => done(),\n ),\n },\n ];\n\n this.settingsList = new SettingsList(\n items,\n 10,\n getSettingsListTheme(),\n (_id, _newValue) => {\n // All changes handled via submenu callbacks\n },\n callbacks.onClose,\n );\n\n this.addChild(this.settingsList);\n }\n\n handleInput(data: string): void {\n this.settingsList.handleInput(data);\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getShortModelName(modelId: string): string {\n if (!modelId) return '(none)';\n const parts = modelId.split('/');\n return parts.length > 1 ? parts.slice(1).join('/') : modelId;\n}\n","/**\n * Inline plan approval component.\n * Shows a submitted plan as rendered markdown with Approve/Reject/Request Changes options\n * directly in the conversation flow.\n */\n\nimport { Box, Container, getEditorKeybindings, Input, Markdown, SelectList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, TUI } from '@mariozechner/pi-tui';\nimport { theme, getSelectListTheme, getMarkdownTheme } from '../theme.js';\n\nexport interface PlanApprovalInlineOptions {\n planId: string;\n title: string;\n plan: string;\n onApprove: () => void;\n onReject: (feedback?: string) => void;\n}\n\nexport class PlanApprovalInlineComponent extends Container implements Focusable {\n private contentBox: Box;\n private selectList?: SelectList;\n private feedbackInput?: Input;\n private onApprove: () => void;\n private onReject: (feedback?: string) => void;\n private resolved = false;\n private mode: 'select' | 'feedback' = 'select';\n private planTitle: string;\n private planContent: string;\n\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n if (this.mode === 'feedback' && this.feedbackInput) {\n this.feedbackInput.focused = value;\n }\n }\n\n constructor(options: PlanApprovalInlineOptions, _ui: TUI) {\n super();\n this.onApprove = options.onApprove;\n this.onReject = options.onReject;\n this.planTitle = options.title;\n this.planContent = options.plan;\n\n this.addChild(new Spacer(1));\n\n // Main content box with pending background\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n // Plan title header\n this.contentBox.addChild(new Text(theme.bold(theme.fg('accent', `Plan: ${options.title}`)), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n // Render plan as markdown\n const md = new Markdown(options.plan, 1, 0, getMarkdownTheme());\n this.contentBox.addChild(md);\n this.contentBox.addChild(new Spacer(1));\n\n // Action selector\n const items: SelectItem[] = [\n {\n value: 'approve',\n label: ` ${theme.fg('success', 'Approve')} ${theme.fg('dim', '— switch to Build mode and implement')}`,\n },\n {\n value: 'reject',\n label: ` ${theme.fg('error', 'Reject')} ${theme.fg('dim', '— stay in Plan mode')}`,\n },\n {\n value: 'edit',\n label: ` ${theme.fg('warning', 'Request changes')} ${theme.fg('dim', '— provide feedback')}`,\n },\n ];\n\n this.selectList = new SelectList(items, items.length, getSelectListTheme());\n\n this.selectList.onSelect = (item: SelectItem) => {\n this.handleSelection(item.value);\n };\n this.selectList.onCancel = () => {\n this.handleReject();\n };\n\n this.contentBox.addChild(this.selectList);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(new Text(theme.fg('dim', 'Up/Down navigate Enter select Esc reject'), 0, 0));\n }\n\n private handleSelection(value: string): void {\n if (this.resolved) return;\n\n switch (value) {\n case 'approve':\n this.handleApprove();\n break;\n case 'reject':\n this.handleReject();\n break;\n case 'edit':\n this.switchToFeedbackMode();\n break;\n }\n }\n\n private handleApprove(): void {\n if (this.resolved) return;\n this.resolved = true;\n this.showResult('Approved', true);\n this.onApprove();\n }\n\n private handleReject(feedback?: string): void {\n if (this.resolved) return;\n this.resolved = true;\n this.showResult(feedback ? `Rejected — ${feedback}` : 'Rejected', false);\n this.onReject(feedback);\n }\n\n private switchToFeedbackMode(): void {\n this.mode = 'feedback';\n this.selectList = undefined;\n\n // Rebuild content box with feedback input\n this.contentBox.clear();\n this.contentBox.addChild(new Text(theme.fg('accent', 'Provide feedback for revision:'), 0, 0));\n this.contentBox.addChild(new Spacer(1));\n\n this.feedbackInput = new Input();\n this.feedbackInput.focused = this._focused;\n this.feedbackInput.onSubmit = (value: string) => {\n const trimmed = value.trim();\n this.handleReject(trimmed || undefined);\n };\n this.feedbackInput.onEscape = () => {\n this.handleReject();\n };\n\n this.contentBox.addChild(this.feedbackInput);\n this.contentBox.addChild(new Spacer(1));\n this.contentBox.addChild(\n new Text(theme.fg('dim', 'Enter to submit feedback Esc to reject without feedback'), 0, 0),\n );\n }\n\n private showResult(status: string, isApproved: boolean): void {\n this.contentBox.clear();\n const bgColor = isApproved ? 'toolSuccessBg' : 'toolErrorBg';\n this.contentBox.setBgFn((text: string) => theme.bg(bgColor, text));\n\n // Status header with icon\n const icon = isApproved ? theme.fg('success', '✓') : theme.fg('error', '✗');\n this.contentBox.addChild(\n new Text(\n `${icon} ${theme.bold(theme.fg('accent', `Plan: ${this.planTitle}`))} ${theme.fg('dim', `— ${status}`)}`,\n 0,\n 0,\n ),\n );\n this.contentBox.addChild(new Spacer(1));\n\n // Re-render plan as markdown\n const md = new Markdown(this.planContent, 1, 0, getMarkdownTheme());\n this.contentBox.addChild(md);\n }\n\n handleInput(data: string): void {\n if (this.resolved) return;\n\n if (this.mode === 'feedback' && this.feedbackInput) {\n const kb = getEditorKeybindings();\n if (kb.matches(data, 'selectCancel')) {\n this.handleReject();\n return;\n }\n this.feedbackInput.handleInput(data);\n } else if (this.selectList) {\n this.selectList.handleInput(data);\n }\n }\n}\n\n/**\n * Static component for rendering a resolved plan in history.\n * Shows the plan content with approval/rejection status.\n */\nexport interface PlanResultOptions {\n title: string;\n plan: string;\n isApproved: boolean;\n feedback?: string;\n}\n\nexport class PlanResultComponent extends Container {\n constructor(options: PlanResultOptions) {\n super();\n\n this.addChild(new Spacer(1));\n\n const bgColor = options.isApproved ? 'toolSuccessBg' : 'toolErrorBg';\n const contentBox = new Box(1, 1, (text: string) => theme.bg(bgColor, text));\n this.addChild(contentBox);\n\n // Status header with icon\n const icon = options.isApproved ? theme.fg('success', '✓') : theme.fg('error', '✗');\n const status = options.isApproved ? 'Approved' : options.feedback ? `Rejected — ${options.feedback}` : 'Rejected';\n\n contentBox.addChild(\n new Text(\n `${icon} ${theme.bold(theme.fg('accent', `Plan: ${options.title}`))} ${theme.fg('dim', `— ${status}`)}`,\n 0,\n 0,\n ),\n );\n contentBox.addChild(new Spacer(1));\n\n // Render plan as markdown\n const md = new Markdown(options.plan, 1, 0, getMarkdownTheme());\n contentBox.addChild(md);\n }\n}\n","/**\n * 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, SelectList, SettingsList, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable, SelectItem, SettingItem } from '@mariozechner/pi-tui';\nimport type { NotificationMode } from '../notify.js';\nimport { fg, bg, bold, getSettingsListTheme, getSelectListTheme } from '../theme.js';\n\n// =============================================================================\n// Types\n// =============================================================================\nexport interface SettingsConfig {\n notifications: NotificationMode;\n yolo: boolean;\n thinkingLevel: string;\n escapeAsCancel: boolean;\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 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// 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) => bg('overlayBg', text));\n\n // Title\n this.addChild(new Text(bold(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: { value: string; label: string; desc: string }[] = [\n { value: 'off', label: 'Off', desc: 'No extended thinking' },\n { value: 'minimal', label: 'Minimal', desc: '~1k budget tokens' },\n { value: 'low', label: 'Low', desc: '~4k budget tokens' },\n { value: 'medium', label: 'Medium', desc: '~10k budget tokens' },\n { value: 'high', label: 'High', desc: '~32k budget tokens' },\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: 'Extended thinking budget for Anthropic models (currently disabled)',\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). Ctrl+Z undoes a clear.',\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\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 * Component that renders shell command output in the chat view.\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport { fg, bold } from '../theme.js';\n\nexport class ShellOutputComponent extends Container {\n constructor(command: string, stdout: string, stderr: string, exitCode: number) {\n super();\n this.addChild(new Spacer(1));\n\n // Command header\n const statusIcon = exitCode === 0 ? '✓' : '✗';\n const statusColor = exitCode === 0 ? 'success' : 'error';\n this.addChild(new Text(`${fg(statusColor, statusIcon)} ${bold(fg('muted', '$'))} ${fg('text', command)}`, 1, 0));\n\n // Output\n const output = (stdout + (stderr ? (stdout ? '\\n' : '') + stderr : '')).trimEnd();\n if (output) {\n // Indent each line by 2 spaces\n const lines = output.split('\\n');\n for (const line of lines) {\n this.addChild(new Text(fg('toolOutput', ` ${line}`), 0, 0));\n }\n }\n\n // Show exit code if non-zero\n if (exitCode !== 0) {\n this.addChild(new Text(fg('error', ` Exit code: ${exitCode}`), 0, 0));\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 { mastra } from '../theme.js';\n\nconst MAX_COLLAPSED_LINES = 3;\nconst BORDER_COLOR = mastra.purple;\n\nexport class SlashCommandComponent extends Container {\n private commandName: string;\n private contentLines: string[];\n private expanded = false;\n\n constructor(commandName: string, content?: string) {\n super();\n this.commandName = commandName;\n this.contentLines = content ? content.split('\\n').filter(l => l.trim()) : [];\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n if (this.expanded === expanded) return;\n this.expanded = expanded;\n this.rebuild();\n }\n\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const border = (char: string) => chalk.bold.hex(BORDER_COLOR)(char);\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n // Top border with command name\n const heading = chalk.hex(mastra.specialGray)(`/${this.commandName}`);\n this.addChild(new Text(`${border('┌──')} ${heading}`, 0, 0));\n\n if (this.contentLines.length === 0) {\n this.addChild(new Text(`${border('└──')}`, 0, 0));\n return;\n }\n\n // Word-wrap content lines\n const wrappedLines: string[] = [];\n for (const line of this.contentLines) {\n if (line.length > maxLineWidth) {\n let remaining = line;\n while (remaining.length > maxLineWidth) {\n const breakAt = remaining.lastIndexOf(' ', maxLineWidth);\n const splitAt = breakAt > 0 ? breakAt : maxLineWidth;\n wrappedLines.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n if (remaining) wrappedLines.push(remaining);\n } else {\n wrappedLines.push(line);\n }\n }\n\n const truncated = !this.expanded && wrappedLines.length > MAX_COLLAPSED_LINES + 1;\n const displayLines = truncated ? wrappedLines.slice(0, MAX_COLLAPSED_LINES) : wrappedLines;\n\n const contentText = displayLines\n .map(\n line =>\n `${border('│')} ${chalk.hex(mastra.mainGray)(line.length > maxLineWidth ? line.slice(0, maxLineWidth - 1) + '…' : line)}`,\n )\n .join('\\n');\n this.addChild(new Text(contentText, 0, 0));\n\n if (truncated) {\n const moreText = chalk.hex(mastra.darkGray)(\n `... ${wrappedLines.length - MAX_COLLAPSED_LINES} more lines (ctrl+e to expand)`,\n );\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n\n // Bottom border\n this.addChild(new Text(`${border('└──')}`, 0, 0));\n }\n}\n","/**\n * Subagent execution rendering component.\n * Shows real-time activity from a delegated subagent task using\n * the same bordered box style as shell/view tools:\n * - Top border\n * - Task description (always visible)\n * - Streaming tool call activity (capped rolling window)\n * - Bottom border with agent type, model, status, duration\n */\n\nimport { Container, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { theme } from '../theme.js';\nimport type { IToolExecutionComponent } from './tool-execution-interface.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SubagentToolCall {\n name: string;\n args: unknown;\n result?: string;\n isError?: boolean;\n done: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst MAX_ACTIVITY_LINES = 15;\nconst COLLAPSED_LINES = 15;\n\nexport 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\n constructor(agentType: string, task: string, ui: TUI, modelId?: string) {\n super();\n this.agentType = agentType;\n this.task = task;\n this.modelId = modelId;\n this.ui = ui;\n\n this.rebuild();\n }\n\n // ── Mutation API ──────────────────────────────────────────────────────\n\n addToolStart(name: string, args: unknown): void {\n this.toolCalls.push({ name, args, done: false });\n this.rebuild();\n }\n addToolEnd(name: string, result: unknown, isError: boolean): void {\n for (let i = this.toolCalls.length - 1; i >= 0; i--) {\n const toolCall = this.toolCalls[i]!;\n if (toolCall.name === name && !toolCall.done) {\n toolCall.done = true;\n toolCall.isError = isError;\n toolCall.result = typeof result === 'string' ? result : JSON.stringify(result ?? '');\n break;\n }\n }\n this.rebuild();\n }\n\n finish(isError: boolean, durationMs: number, result?: string): void {\n this.done = true;\n this.isError = isError;\n this.durationMs = durationMs;\n this.finalResult = result;\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.expanded = !this.expanded;\n this.rebuild();\n }\n\n // IToolExecutionComponent interface methods\n updateArgs(_args: unknown): void {}\n updateResult(_result: unknown, _isPartial: boolean): void {}\n\n // ── Rendering ──────────────────────────────────────────────────────────\n\n private rebuild(): void {\n this.clear();\n this.addChild(new Spacer(1));\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n // ── Top border ──\n this.addChild(new Text(border('┌──'), 0, 0));\n\n // ── Task description (capped when collapsed) ──\n const taskLines = this.task.split('\\n');\n const wrappedTaskLines: string[] = [];\n for (const line of taskLines) {\n if (line.length > maxLineWidth) {\n let remaining = line;\n while (remaining.length > maxLineWidth) {\n const breakAt = remaining.lastIndexOf(' ', maxLineWidth);\n const splitAt = breakAt > 0 ? breakAt : maxLineWidth;\n wrappedTaskLines.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n if (remaining) wrappedTaskLines.push(remaining);\n } else {\n wrappedTaskLines.push(line);\n }\n }\n const maxTaskLines = 5;\n const taskTruncated = !this.expanded && wrappedTaskLines.length > maxTaskLines + 1;\n const displayTaskLines = taskTruncated ? wrappedTaskLines.slice(0, maxTaskLines) : wrappedTaskLines;\n\n const taskContent = displayTaskLines.map(line => `${border('│')} ${line}`).join('\\n');\n this.addChild(new Text(taskContent, 0, 0));\n\n if (taskTruncated) {\n const moreText = theme.fg('muted', `... ${wrappedTaskLines.length - maxTaskLines} more lines (ctrl+e to expand)`);\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n\n // ── Activity lines (tool calls — capped rolling window) ──\n if (this.toolCalls.length > 0) {\n // Separator between task and activity\n this.addChild(new Text(`${border('│')} ${theme.fg('muted', '───')}`, 0, 0));\n\n const activityLines = this.toolCalls.map(tc => formatToolCallLine(tc, maxLineWidth));\n\n // While streaming: rolling window. When done: collapsible.\n const cap = this.done ? COLLAPSED_LINES : MAX_ACTIVITY_LINES;\n let displayLines = activityLines;\n let hiddenCount = 0;\n const minHidden = this.done ? 2 : 1;\n if (!this.expanded && activityLines.length > cap + minHidden - 1) {\n hiddenCount = activityLines.length - cap;\n if (this.done) {\n // Show first N lines when collapsed (completed)\n displayLines = activityLines.slice(0, cap);\n } else {\n // Show last N lines while streaming\n displayLines = activityLines.slice(-cap);\n }\n }\n\n if (!this.done && hiddenCount > 0) {\n const hiddenText = theme.fg('muted', ` ... ${hiddenCount} more above`);\n this.addChild(new Text(`${border('│')} ${hiddenText}`, 0, 0));\n }\n\n const activityContent = displayLines.map(line => `${border('│')} ${line}`).join('\\n');\n this.addChild(new Text(activityContent, 0, 0));\n\n if (this.done && hiddenCount > 0) {\n const moreText = theme.fg('muted', `... ${hiddenCount} more (ctrl+e to expand)`);\n this.addChild(new Text(`${border('│')} ${moreText}`, 0, 0));\n }\n }\n\n // ── Final result (shown after completion) ──\n // When tool calls exist: only show result when expanded\n // When no tool calls: always show result (capped when collapsed)\n const showResult = this.done && this.finalResult && (this.expanded || this.toolCalls.length === 0);\n if (showResult) {\n this.addChild(new Text(`${border('│')} ${theme.fg('muted', '───')}`, 0, 0));\n const resultLines = this.finalResult!.split('\\n');\n const maxResultLines = this.expanded ? resultLines.length : 10;\n const truncated = !this.expanded && resultLines.length > maxResultLines + 1;\n const displayLines = truncated ? resultLines.slice(-maxResultLines) : resultLines;\n\n if (truncated) {\n const hiddenLine = `${border('│')} ${theme.fg('muted', ` ... ${resultLines.length - maxResultLines} more lines (ctrl+e to expand)`)}`;\n this.addChild(new Text(hiddenLine, 0, 0));\n }\n\n const resultContent = displayLines\n .map(line => {\n const truncatedLine = line.length > maxLineWidth ? line.slice(0, maxLineWidth - 1) + '…' : line;\n return `${border('│')} ${theme.fg('muted', truncatedLine)}`;\n })\n .join('\\n');\n if (resultContent.trim()) {\n this.addChild(new Text(resultContent, 0, 0));\n }\n }\n\n // ── Bottom border with info ──\n const typeLabel = theme.bold(theme.fg('accent', this.agentType));\n const modelLabel = this.modelId ? theme.fg('muted', ` ${this.modelId}`) : '';\n const statusIcon = this.done\n ? this.isError\n ? theme.fg('error', ' ✗')\n : theme.fg('success', ' ✓')\n : theme.fg('muted', ' ⋯');\n const durationStr = this.done ? theme.fg('muted', ` ${formatDuration(this.durationMs)}`) : '';\n\n const footerText = `${theme.bold(theme.fg('toolTitle', 'subagent'))} ${typeLabel}${modelLabel}${durationStr}${statusIcon}`;\n this.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n\n this.invalidate();\n this.ui.requestRender();\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction formatToolCallLine(tc: SubagentToolCall, _maxWidth: number): string {\n const icon = tc.done ? (tc.isError ? theme.fg('error', '✗') : theme.fg('success', '✓')) : theme.fg('muted', '⋯');\n const name = theme.fg('toolTitle', tc.name);\n const argsSummary = summarizeArgs(tc.args);\n return `${icon} ${name} ${argsSummary}`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = (ms / 1000).toFixed(1);\n return `${s}s`;\n}\n\nfunction summarizeArgs(args: unknown): string {\n if (!args || typeof args !== 'object') return '';\n const obj = args as Record<string, unknown>;\n const parts: string[] = [];\n\n // Special handling for task_write tool\n if (obj.tasks && Array.isArray(obj.tasks)) {\n const tasks = obj.tasks as Array<{\n content?: string;\n status?: string;\n activeForm?: string;\n }>;\n const taskSummaries = tasks.map(t => {\n const icon = t.status === 'completed' ? '✓' : t.status === 'in_progress' ? '→' : '○';\n const content = t.content || t.activeForm || 'task';\n return `${icon} ${content}`;\n });\n return theme.fg('muted', taskSummaries.join(', '));\n }\n\n for (const [_key, val] of Object.entries(obj)) {\n if (typeof val === 'string') {\n const short = val.length > 40 ? val.slice(0, 40) + '…' : val;\n parts.push(theme.fg('muted', short));\n } else if (Array.isArray(val)) {\n parts.push(theme.fg('muted', `${val.length} items`));\n } else if (typeof val === 'object' && val !== null) {\n parts.push(theme.fg('muted', '{...}'));\n }\n }\n return parts.join(' ');\n}\n","/**\n * SystemReminderComponent - renders system-generated reminder messages\n * with a distinct orange/dim style to differentiate from user messages.\n */\n\nimport { Container, Markdown } from '@mariozechner/pi-tui';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nexport interface SystemReminderOptions {\n message: string;\n}\n\nexport class SystemReminderComponent extends Container {\n constructor(options: SystemReminderOptions) {\n super();\n\n // Title and message combined with full-width background\n const title = theme.fg('warning', '⚡ System Notice');\n const content = `${title}\\n${options.message.trim()}`;\n\n this.addChild(\n new Markdown(content, 1, 1, getMarkdownTheme(), {\n bgColor: (text: string) => theme.bg('systemReminderBg', text),\n color: (text: string) => theme.fg('muted', text),\n }),\n );\n }\n}\n","/**\n * 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 { fg, bold } 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 = ' ' + bold(fg('accent', 'Tasks')) + 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 = chalk.green('\\u2713');\n const text = chalk.green.strikethrough(task.content);\n return `${indent}${icon} ${text}`;\n }\n case 'in_progress': {\n const icon = chalk.yellow('\\u25B6');\n const text = chalk.yellow.bold(task.activeForm);\n return `${indent}${icon} ${text}`;\n }\n case 'pending': {\n const icon = chalk.dim('\\u25CB');\n const text = chalk.dim(task.content);\n return `${indent}${icon} ${text}`;\n }\n }\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 { bg, fg, bold } 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 onSelect: (thread: HarnessThread) => void;\n onCancel: () => void;\n /** Function to fetch message preview for a thread */\n getMessagePreview?: (threadId: string) => Promise<string | null>;\n}\n\n// =============================================================================\n// ThreadSelectorComponent\n// =============================================================================\n\nexport class ThreadSelectorComponent extends Box implements Focusable {\n private searchInput!: Input;\n private listContainer!: Container;\n private allThreads: HarnessThread[];\n private filteredThreads: HarnessThread[];\n private selectedIndex = 0;\n private currentThreadId: string | null;\n private currentResourceId: string | undefined;\n private onSelectCallback: (thread: HarnessThread) => void;\n private onCancelCallback: () => void;\n private tui: TUI;\n private getMessagePreview: ((threadId: string) => Promise<string | null>) | undefined;\n private messagePreviews: Map<string, string> = new Map();\n\n // Focusable implementation\n private _focused = false;\n get focused(): boolean {\n return this._focused;\n }\n set focused(value: boolean) {\n this._focused = value;\n this.searchInput.focused = value;\n }\n\n constructor(options: ThreadSelectorOptions) {\n super(2, 1, text => bg('overlayBg', text));\n\n this.tui = options.tui;\n this.currentResourceId = options.currentResourceId;\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.getMessagePreview = options.getMessagePreview;\n this.filteredThreads = this.allThreads;\n\n this.buildUI();\n this.loadMessagePreviews();\n }\n\n private async loadMessagePreviews(): Promise<void> {\n if (!this.getMessagePreview) return;\n\n // Load previews for all threads\n for (const thread of this.allThreads) {\n try {\n const preview = await this.getMessagePreview(thread.id);\n if (preview) {\n this.messagePreviews.set(thread.id, preview);\n }\n } catch {\n // Ignore errors, preview will just be empty\n }\n }\n this.updateList();\n this.tui.requestRender();\n }\n\n private buildUI(): void {\n this.addChild(new Text(bold(fg('accent', 'Select Thread')), 0, 0));\n this.addChild(new Spacer(1));\n this.addChild(new Text(fg('muted', 'Type to search • ↑↓ navigate • Enter select • Esc cancel'), 0, 0));\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 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 // 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 => `${t.title ?? ''} ${t.resourceId} ${t.id} ${(t.metadata?.projectPath as string) ?? ''}`,\n )\n : this.allThreads;\n\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredThreads.length - 1));\n this.updateList();\n }\n\n private formatTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n\n private updateList(): void {\n this.listContainer.clear();\n\n const maxVisible = 12;\n const startIndex = Math.max(\n 0,\n Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredThreads.length - maxVisible),\n );\n const endIndex = Math.min(startIndex + maxVisible, this.filteredThreads.length);\n\n for (let i = startIndex; i < endIndex; i++) {\n const thread = this.filteredThreads[i];\n if (!thread) continue;\n\n const isSelected = i === this.selectedIndex;\n const isCurrent = thread.id === this.currentThreadId;\n const checkmark = isCurrent ? fg('success', ' ✓') : '';\n const shortId = thread.id.slice(-6);\n const threadPath = thread.metadata?.projectPath as string | undefined;\n const pathTag = threadPath ? fg('dim', ` [${threadPath.split('/').pop()}]`) : '';\n const displayId = `${thread.resourceId}/${shortId}`;\n const timeAgo = fg('muted', ` (${this.formatTimeAgo(thread.updatedAt)})`);\n\n // Only show custom titles (not auto-generated \"New Thread\")\n const hasCustomTitle = thread.title && thread.title !== 'New Thread';\n\n let line = '';\n if (isSelected) {\n line = fg('accent', `→ ${displayId}`) + pathTag + timeAgo + checkmark;\n } else {\n line = ` ${displayId}` + pathTag + timeAgo + checkmark;\n }\n\n this.listContainer.addChild(new Text(line, 0, 0));\n\n // Show message preview or custom title on second line\n const preview = this.messagePreviews.get(thread.id);\n if (preview) {\n this.listContainer.addChild(new Text(` ${fg('muted', `\"${preview}\"`)}`, 0, 0));\n } else if (hasCustomTitle) {\n this.listContainer.addChild(new Text(` ${fg('muted', `\"${thread.title}\"`)}`, 0, 0));\n }\n }\n\n if (startIndex > 0 || endIndex < this.filteredThreads.length) {\n const scrollInfo = 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(fg('muted', 'No matching threads'), 0, 0));\n }\n }\n\n handleInput(keyData: string): void {\n const kb = getEditorKeybindings();\n\n if (kb.matches(keyData, 'selectUp')) {\n if (this.filteredThreads.length === 0) return;\n this.selectedIndex = this.selectedIndex === 0 ? this.filteredThreads.length - 1 : this.selectedIndex - 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(keyData, 'selectDown')) {\n if (this.filteredThreads.length === 0) return;\n this.selectedIndex = this.selectedIndex === this.filteredThreads.length - 1 ? 0 : this.selectedIndex + 1;\n this.updateList();\n this.tui.requestRender();\n } else if (kb.matches(keyData, 'selectConfirm')) {\n const selected = this.filteredThreads[this.selectedIndex];\n if (selected) {\n this.onSelectCallback(selected);\n }\n } else if (kb.matches(keyData, 'selectCancel')) {\n this.onCancelCallback();\n } else {\n this.searchInput.handleInput(keyData);\n this.filterThreads(this.searchInput.getValue());\n this.tui.requestRender();\n }\n }\n}\n","/**\n * Tool approval dialog component.\n * Shows tool details and prompts user to approve or decline execution.\n *\n * Keyboard shortcuts:\n * y — approve this one call\n * n / Esc — decline this call\n * a — always allow this category for the session\n * Y — switch to YOLO mode (approve all)\n */\nimport { Box, getEditorKeybindings, Spacer, Text } from '@mariozechner/pi-tui';\nimport type { Focusable } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\nimport { bg, fg } 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 => 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(fg('warning', '⚠ Tool Approval Required'), 0, 0));\n this.addChild(new Spacer(1));\n\n // Tool name\n this.addChild(new Text(fg('accent', `Tool: `) + fg('text', this.toolName), 0, 0));\n if (this.categoryLabel) {\n this.addChild(new Text(fg('accent', `Category: `) + fg('text', this.categoryLabel), 0, 0));\n }\n this.addChild(new Spacer(1));\n\n // Arguments (formatted)\n this.addChild(new Text(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(fg('text', ' ' + line), 0, 0));\n }\n if (argsText.split('\\n').length > 10) {\n this.addChild(new Text(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 dim = chalk.hex('#555');\n const key = chalk.white.bold;\n this.addChild(\n new Text(\n fg('accent', 'Allow? ') +\n key('y') +\n dim('es ') +\n key('n') +\n dim('o ') +\n key('a') +\n dim(categoryHint + ' ') +\n key('Y') +\n dim('olo'),\n 0,\n 0,\n ),\n );\n }\n\n private formatArgs(args: unknown): string {\n if (args === null || args === undefined) {\n return '(none)';\n }\n\n if (typeof args !== 'object') {\n return String(args);\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) return '(none)';\n\n const lines: string[] = [];\n for (const [key, value] of entries) {\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n const maxLen = 120;\n const firstLine = str.split('\\n')[0] ?? '';\n const lineCount = typeof value === 'string' ? str.split('\\n').length : 0;\n const suffix = lineCount > 1 ? ` (${lineCount} lines)` : '';\n const display = firstLine.length > maxLen ? firstLine.slice(0, maxLen) + '…' : firstLine;\n lines.push(`${key}: ${display}${suffix}`);\n }\n return lines.join('\\n');\n }\n\n handleInput(data: string): void {\n const kb = getEditorKeybindings();\n\n // Escape to decline\n if (kb.matches(data, 'selectCancel')) {\n this.onAction({ type: 'decline' });\n return;\n }\n\n // Single keypress shortcuts\n if (data === 'y') {\n this.onAction({ type: 'approve' });\n } else if (data === 'n') {\n this.onAction({ type: 'decline' });\n } else if (data === 'a') {\n this.onAction({ type: 'always_allow_category' });\n } else if (data === 'Y') {\n this.onAction({ type: 'yolo' });\n }\n }\n\n render(maxWidth: number): string[] {\n return super.render(maxWidth);\n }\n}\n","/**\n * Generic collapsible container component.\n * Can be used to wrap any content that should be expandable/collapsible.\n */\n\nimport { Container, Text } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { highlight } from 'cli-highlight';\nimport { theme } from '../theme.js';\n\nexport interface CollapsibleOptions {\n /** Initial expanded state */\n expanded?: boolean;\n /** Header text or component */\n header: string | Container;\n /** Summary shown when collapsed */\n summary?: string;\n /** Max lines to show when collapsed (0 = fully collapsed) */\n collapsedLines?: number;\n /** Max lines to show when expanded */\n expandedLines?: number;\n /** Whether to show line count in header */\n showLineCount?: boolean;\n}\n\nexport class CollapsibleComponent extends Container {\n private expanded: boolean;\n private header: string | Container;\n protected summary?: string;\n private content: string[] = [];\n private options: CollapsibleOptions;\n private ui: TUI;\n\n constructor(options: CollapsibleOptions, ui: TUI) {\n super();\n this.options = {\n expanded: false,\n collapsedLines: 10,\n expandedLines: 100,\n showLineCount: true,\n ...options,\n };\n this.expanded = this.options.expanded ?? false;\n this.header = options.header;\n this.summary = options.summary;\n this.ui = ui;\n this.updateDisplay();\n }\n\n setContent(content: string | string[]): void {\n this.content = Array.isArray(content) ? content : content.split('\\n');\n this.updateDisplay();\n }\n\n isExpanded(): boolean {\n return this.expanded;\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n this.updateDisplay();\n }\n\n toggle(): void {\n this.expanded = !this.expanded;\n this.updateDisplay();\n }\n\n private updateDisplay(): void {\n this.clear();\n\n const lineCount =\n this.options.showLineCount && this.content.length > 0 ? theme.fg('muted', ` (${this.content.length} lines)`) : '';\n\n const headerText = typeof this.header === 'string' ? `${this.header}${lineCount}` : this.header;\n\n if (typeof headerText === 'string') {\n this.addChild(new Text(headerText, 0, 0));\n } else {\n this.addChild(headerText);\n }\n\n // Show summary when collapsed if provided\n if (!this.expanded && this.summary) {\n this.addChild(new Text(theme.fg('muted', this.summary), 0, 0));\n return;\n }\n\n // Show content\n if (this.content.length === 0) return;\n\n const maxLines = this.expanded ? this.options.expandedLines! : this.options.collapsedLines!;\n\n if (maxLines === 0 && !this.expanded) {\n // Fully collapsed, show nothing\n return;\n }\n\n const linesToShow = Math.min(this.content.length, maxLines);\n const hasMore = this.content.length > maxLines;\n\n // Add content lines\n for (let i = 0; i < linesToShow; i++) {\n this.addChild(new Text(this.content[i], 0, 0));\n }\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = this.content.length - linesToShow;\n const action = this.expanded ? 'collapse' : 'expand';\n const hint = theme.fg('muted', `... ${remaining} more lines (Ctrl+E to ${action} all)`);\n this.addChild(new Text(hint, 0, 0));\n }\n }\n}\n\n/**\n * File viewer with collapsible content\n */\nexport class CollapsibleFileViewer extends CollapsibleComponent {\n constructor(path: string, content: string, options: Partial<CollapsibleOptions>, ui: TUI) {\n let lines = content.split('\\n').map(line => line.trimEnd());\n\n // Remove \"Here's the result of running `cat -n`...\" header if present\n if (lines.length > 0 && lines[0]!.includes(\"Here's the result of running\")) {\n lines = lines.slice(1);\n }\n\n // Strip line numbers from cat -n format: \" 123\\tcode\" -> \"code\"\n const lineNumberRegex = /^\\s*\\d+\\t/;\n const codeLines = lines.map(line => line.replace(lineNumberRegex, ''));\n\n // Remove trailing empty lines\n while (codeLines.length > 0 && codeLines[codeLines.length - 1] === '') {\n codeLines.pop();\n }\n\n // Apply syntax highlighting\n let highlightedLines = codeLines;\n try {\n const highlighted = highlight(codeLines.join('\\n'), {\n language: getLanguageFromPath(path),\n ignoreIllegals: true,\n });\n highlightedLines = highlighted.split('\\n');\n } catch {\n // If highlighting fails, use original content\n }\n\n const header = `${theme.bold(theme.fg('toolTitle', '📄 view'))} ${theme.fg('accent', path)}`;\n\n super(\n {\n header,\n collapsedLines: 20,\n expandedLines: 200,\n showLineCount: true,\n ...options,\n },\n ui,\n );\n\n this.setContent(highlightedLines);\n }\n}\n\n/** Map file extensions to highlight.js language names */\nfunction getLanguageFromPath(path: string): string | undefined {\n const ext = path.split('.').pop()?.toLowerCase();\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n json: 'json',\n md: 'markdown',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n go: 'go',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'c',\n hpp: 'cpp',\n cs: 'csharp',\n php: 'php',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'bash',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'ini',\n ini: 'ini',\n xml: 'xml',\n html: 'html',\n htm: 'html',\n css: 'css',\n scss: 'scss',\n sass: 'scss',\n less: 'less',\n sql: 'sql',\n graphql: 'graphql',\n gql: 'graphql',\n dockerfile: 'dockerfile',\n makefile: 'makefile',\n cmake: 'cmake',\n vue: 'vue',\n svelte: 'xml',\n };\n return ext ? langMap[ext] : undefined;\n}\n\n/**\n * Diff viewer with collapsible hunks\n */\nexport class CollapsibleDiffViewer extends CollapsibleComponent {\n private oldContent: string;\n private newContent: string;\n\n constructor(path: string, oldContent: string, newContent: string, options: Partial<CollapsibleOptions>, ui: TUI) {\n const header = `${theme.bold(theme.fg('toolTitle', '✏️ edit'))} ${theme.fg('accent', path)}`;\n\n super(\n {\n header,\n collapsedLines: 15,\n expandedLines: 100,\n showLineCount: false,\n ...options,\n },\n ui,\n );\n\n this.oldContent = oldContent;\n this.newContent = newContent;\n this.generateDiff();\n }\n\n private generateDiff(): void {\n const oldLines = this.oldContent.split('\\n');\n const newLines = this.newContent.split('\\n');\n const diff: string[] = [];\n\n // Simple line-by-line diff (in production, use a proper diff algorithm)\n const maxLines = Math.max(oldLines.length, newLines.length);\n let addedCount = 0;\n let removedCount = 0;\n\n for (let i = 0; i < maxLines; i++) {\n if (i >= oldLines.length) {\n diff.push(theme.fg('success', `+ ${newLines[i]}`));\n addedCount++;\n } else if (i >= newLines.length) {\n diff.push(theme.fg('error', `- ${oldLines[i]}`));\n removedCount++;\n } else if (oldLines[i] !== newLines[i]) {\n diff.push(theme.fg('error', `- ${oldLines[i]}`));\n diff.push(theme.fg('success', `+ ${newLines[i]}`));\n addedCount++;\n removedCount++;\n } else {\n // Context line\n diff.push(theme.fg('muted', ` ${oldLines[i]}`));\n }\n }\n\n this.summary = `+${addedCount} -${removedCount} lines changed`;\n this.setContent(diff);\n }\n}\n\n/**\n * Command output viewer with collapsible sections\n */\nexport class CollapsibleCommandOutput extends CollapsibleComponent {\n constructor(command: string, output: string, exitCode: number, options: Partial<CollapsibleOptions>, ui: TUI) {\n const status = exitCode === 0 ? theme.fg('success', '✓') : theme.fg('error', `✗ (exit ${exitCode})`);\n\n const header = `${theme.bold(theme.fg('toolTitle', 'command'))} ${theme.fg('accent', command)} ${status}`;\n\n // Clean up output\n const lines = output.split('\\n').map(line => line.trimEnd());\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n super(\n {\n header,\n collapsedLines: exitCode === 0 ? 10 : 50, // Show more on error\n expandedLines: 500,\n showLineCount: true,\n ...options,\n },\n ui,\n );\n\n this.setContent(lines);\n }\n}\n","/**\n * Enhanced error display component with collapsible stack traces,\n * syntax highlighting, and smart summarization.\n */\n\nimport { Container, Text, Spacer } from '@mariozechner/pi-tui';\nimport type { TUI } from '@mariozechner/pi-tui';\nimport { fg, bold, bg } 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 `${fg('muted', at)}${fg('function', fn)}${fg('muted', open)}${fg('path', loc)}${fg('muted', close)}`,\n );\n }\n\n // Mute empty lines and framework traces\n if (!line.trim() || line.includes('node_modules')) {\n return fg('muted', line);\n }\n\n return line;\n });\n}\n\n/**\n * Collapsible stack trace component\n */\nclass CollapsibleStackTrace extends CollapsibleComponent {\n constructor(stack: string, options: { expanded?: boolean } = {}, ui: TUI) {\n super(\n {\n header: 'Stack Trace',\n expanded: options.expanded ?? false,\n collapsedLines: 5,\n expandedLines: 100,\n showLineCount: true,\n },\n ui,\n );\n\n // Format and set the content\n const formattedLines = formatStackTrace(stack);\n this.setContent(formattedLines.join('\\n'));\n }\n}\n\n/**\n * Enhanced error display component\n */\nexport class ErrorDisplayComponent extends Container {\n constructor(\n private error: Error | string,\n private options: {\n showStack?: boolean;\n showContext?: boolean;\n expanded?: boolean;\n } = {},\n private ui: TUI,\n ) {\n super();\n this.build();\n }\n\n private build(): void {\n const info = parseErrorInfo(this.error);\n\n // Add a visible border around the entire error display\n const borderTop = new Text(fg('error', '┌─ Error ─' + '─'.repeat(50) + '┐'), 0, 0);\n this.addChild(borderTop);\n\n // Error header container with background\n const errorContainer = new Container();\n\n // Add a colored background to the error message\n const errorBg = (text: string) => 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(` ${bold(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(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(fg('muted', ` at ${location}`), 0, 0));\n }\n\n this.addChild(errorContainer);\n\n // Code context if available\n if (this.options.showContext && info.context) {\n this.addChild(new Spacer(1));\n this.addChild(this.createCodeContext(info.context, info.line));\n }\n\n // Stack trace (collapsible)\n if (this.options.showStack && info.stack) {\n this.addChild(new Spacer(1));\n this.addChild(new CollapsibleStackTrace(info.stack, { expanded: this.options.expanded }, this.ui));\n }\n\n // Add bottom border\n const borderBottom = new Text(fg('error', '└' + '─'.repeat(60) + '┘'), 0, 0);\n this.addChild(borderBottom);\n }\n\n private createCodeContext(context: NonNullable<ErrorInfo['context']>, errorLine?: number): Container {\n const container = new Container();\n const codeBlock = new Container();\n\n // Add a header\n codeBlock.addChild(new Text(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(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(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(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 { theme } from '../theme.js';\n\nexport interface ValidationError {\n field: string;\n message: string;\n expected?: string;\n received?: string;\n}\n\nexport interface ToolValidationErrorOptions {\n toolName: string;\n errors: ValidationError[];\n args?: unknown;\n schema?: unknown;\n}\n\n/**\n * Parse validation errors from various error formats\n */\nexport function parseValidationErrors(error: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (typeof error === 'string') {\n // Try to parse Zod-style errors\n const zodMatch = error.match(/at \"([^\"]+)\".*?: (.+?)(?:\\n|$)/g);\n if (zodMatch) {\n zodMatch.forEach(match => {\n const [, field, message] = match.match(/at \"([^\"]+)\".*?: (.+?)(?:\\n|$)/) || [];\n if (field && message) {\n errors.push({ field, message });\n }\n });\n }\n\n // Try to parse \"missing required parameter\" errors\n const missingMatch = error.match(/missing required.*?[\"`'](\\w+)[\"`']/i);\n if (missingMatch) {\n errors.push({\n field: missingMatch[1]!,\n message: 'Required parameter is missing',\n });\n }\n\n // Generic fallback\n if (errors.length === 0) {\n errors.push({\n field: 'unknown',\n message: error,\n });\n }\n } else if (typeof error === 'object' && error !== null) {\n // Handle structured error objects\n const err = error as any;\n\n // Zod error format\n if (err.issues && Array.isArray(err.issues)) {\n err.issues.forEach((issue: any) => {\n errors.push({\n field: issue.path?.join('.') || 'unknown',\n message: issue.message,\n expected: issue.expected,\n received: issue.received,\n });\n });\n }\n // Generic error with message\n else if (err.message) {\n errors.push({\n field: err.field || 'unknown',\n message: err.message,\n });\n }\n }\n\n return errors.length > 0 ? errors : [{ field: 'unknown', message: String(error) }];\n}\n\n/**\n * Format tool arguments for display\n */\nfunction formatArgs(args: unknown): string[] {\n if (!args || typeof args !== 'object') return [];\n\n const lines: string[] = [];\n const obj = args as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(obj)) {\n let valueStr: string;\n if (value === null || value === undefined) {\n valueStr = theme.fg('muted', 'undefined');\n } else if (typeof value === 'string') {\n valueStr = value.length > 50 ? `\"${value.slice(0, 47)}...\"` : `\"${value}\"`;\n } else if (typeof value === 'object') {\n valueStr = JSON.stringify(value);\n if (valueStr.length > 50) {\n valueStr = valueStr.slice(0, 47) + '...';\n }\n } else {\n valueStr = String(value);\n }\n\n lines.push(` ${theme.fg('accent', key)}: ${valueStr}`);\n }\n\n return lines;\n}\n\n/**\n * Enhanced tool validation error display component\n */\nexport class ToolValidationErrorComponent extends Container {\n constructor(options: ToolValidationErrorOptions, _ui: TUI) {\n super();\n\n const { toolName, errors, args } = options;\n\n // Header\n this.addChild(\n new Text(\n `${theme.fg('error', '✗ Tool validation failed: ')}${theme.bold(theme.fg('toolTitle', toolName))}`,\n 0,\n 0,\n ),\n );\n this.addChild(new Text('', 0, 0));\n\n // Error details\n errors.forEach((error, index) => {\n if (index > 0) {\n this.addChild(new Text('', 0, 0));\n }\n\n if (error.field !== 'unknown') {\n this.addChild(new Text(`${theme.fg('muted', ' Parameter: ')}${theme.fg('accent', error.field)}`, 0, 0));\n }\n\n this.addChild(new Text(`${theme.fg('muted', ' Issue: ')}${theme.fg('error', error.message)}`, 0, 0));\n\n if (error.expected || error.received) {\n let detail = '';\n if (error.expected) {\n detail += `${theme.fg('muted', ' Expected: ')}${theme.fg('success', error.expected)}`;\n if (error.received) detail += theme.fg('muted', ', ');\n }\n if (error.received) {\n detail += `${theme.fg('muted', 'Received: ')}${theme.fg('error', error.received)}`;\n }\n this.addChild(new Text(detail, 0, 0));\n }\n });\n\n // Show provided arguments if available\n if (args && Object.keys(args as any).length > 0) {\n this.addChild(new Text('', 0, 0));\n this.addChild(new Text(theme.fg('muted', 'Provided arguments:'), 0, 0));\n const argsLines = formatArgs(args);\n argsLines.forEach(line => {\n this.addChild(new Text(line, 0, 0));\n });\n }\n\n // Suggestions\n const suggestions = this.generateSuggestions(toolName, errors);\n if (suggestions.length > 0) {\n this.addChild(new Text('', 0, 0));\n this.addChild(new Text(theme.bold(theme.fg('accent', 'Suggestions:')), 0, 0));\n suggestions.forEach(suggestion => {\n this.addChild(new Text(` • ${suggestion}`, 0, 0));\n });\n }\n }\n\n private generateSuggestions(toolName: string, errors: ValidationError[]): string[] {\n const suggestions: string[] = [];\n\n const missingParams = errors.filter(\n e => e.message.toLowerCase().includes('required') || e.message.toLowerCase().includes('missing'),\n );\n\n if (missingParams.length > 0) {\n const params = missingParams.map(e => e.field).filter(f => f !== 'unknown');\n if (params.length > 0) {\n suggestions.push(`Add the required parameter${params.length > 1 ? 's' : ''}: ${params.join(', ')}`);\n }\n }\n\n const typeErrors = errors.filter(\n e => e.message.toLowerCase().includes('type') || e.message.toLowerCase().includes('expected'),\n );\n\n if (typeErrors.length > 0) {\n suggestions.push('Check that parameter types match the expected format');\n }\n\n if (toolName === 'ask_user' && errors.some(e => e.field === 'question')) {\n suggestions.push('Make sure to provide a \"question\" parameter with your question text');\n }\n\n if (toolName === '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 === '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 { theme, mastra } from '../theme.js';\nimport { CollapsibleComponent } from './collapsible.js';\nimport { ErrorDisplayComponent } from './error-display.js';\nimport type { IToolExecutionComponent, ToolResult } from './tool-execution-interface.js';\nimport { ToolValidationErrorComponent, parseValidationErrors } from './tool-validation-error.js';\n\nexport type { ToolResult };\n\nexport interface ToolExecutionOptions {\n showImages?: boolean;\n autoCollapse?: boolean;\n collapsedByDefault?: boolean;\n}\n/**\n * Convert absolute path to tilde notation if it's in home directory\n */\nfunction shortenPath(path: string): string {\n const home = os.homedir();\n if (path.startsWith(home)) {\n return `~${path.slice(home.length)}`;\n }\n return path;\n}\n\n/**\n * Resolve a file path to an absolute path for use in file:// URLs.\n */\nfunction resolveAbsolutePath(filePath: string): string {\n if (filePath.startsWith('/')) return filePath;\n if (filePath.startsWith('~')) {\n return os.homedir() + filePath.slice(1);\n }\n return process.cwd() + '/' + filePath;\n}\n\n/**\n * Wrap text in an OSC 8 hyperlink to a file path.\n * Terminals that support OSC 8 (iTerm2, WezTerm, Kitty, etc.) will\n * render the text as a clickable link that opens the file.\n * Other terminals will just show the visible text.\n */\nfunction fileLink(displayText: string, filePath: string, line?: number): string {\n const absPath = resolveAbsolutePath(filePath);\n const lineFragment = line ? `#${line}` : '';\n // OSC 8: \\x1b]8;params;URI\\x07 ... \\x1b]8;;\\x07\n return `\\x1b]8;;file://${absPath}${lineFragment}\\x07${displayText}\\x1b]8;;\\x07`;\n}\n\n/**\n * Extract the actual content from tool result text.\n */\nfunction extractContent(text: string): { content: string; isError: boolean } {\n try {\n const parsed = JSON.parse(text);\n if (typeof parsed === 'object' && parsed !== null) {\n if ('content' in parsed) {\n const content = parsed.content;\n let contentStr: string;\n\n if (typeof content === 'string') {\n contentStr = content;\n } else if (Array.isArray(content)) {\n contentStr = content\n .filter(\n (part: unknown) =>\n typeof part === 'object' && part !== null && (part as Record<string, unknown>).type === 'text',\n )\n .map((part: unknown) => (part as Record<string, unknown>).text || '')\n .join('');\n } else {\n contentStr = JSON.stringify(content, null, 2);\n }\n\n return {\n content: contentStr,\n isError: Boolean(parsed.isError),\n };\n }\n return { content: JSON.stringify(parsed, null, 2), isError: false };\n }\n } catch {\n // Not JSON, use as-is\n }\n return { content: text, isError: false };\n}\n\n/**\n * Enhanced tool execution component with collapsible sections\n */\nexport class ToolExecutionComponentEnhanced extends Container implements IToolExecutionComponent {\n private contentBox: Box;\n private toolName: string;\n private args: unknown;\n private expanded = false;\n private isPartial = true;\n private ui: TUI;\n private result?: ToolResult;\n private options: ToolExecutionOptions;\n private collapsible?: CollapsibleComponent;\n private startTime = Date.now();\n private streamingOutput = ''; // Buffer for streaming shell output\n\n constructor(toolName: string, args: unknown, options: ToolExecutionOptions = {}, ui: TUI) {\n super();\n this.toolName = toolName;\n this.args = args;\n this.ui = ui;\n this.options = {\n autoCollapse: true,\n collapsedByDefault: true,\n ...options,\n };\n this.expanded = !this.options.collapsedByDefault;\n\n this.addChild(new Spacer(1));\n\n // Content box with background\n this.contentBox = new Box(1, 1, (text: string) => theme.bg('toolPendingBg', text));\n this.addChild(this.contentBox);\n\n this.rebuild();\n }\n\n updateArgs(args: unknown): void {\n this.args = args;\n this.rebuild();\n }\n\n updateResult(result: ToolResult, isPartial = false): void {\n this.result = result;\n this.isPartial = isPartial;\n // Keep streaming output for colored display in final result\n this.rebuild();\n }\n\n /**\n * Append streaming shell output.\n * Only for execute_command tool - shows live output while command runs.\n */\n appendStreamingOutput(output: string): void {\n if (this.toolName !== 'execute_command' && this.toolName !== 'mastra_workspace_execute_command') {\n return;\n }\n this.streamingOutput += output;\n this.rebuild();\n }\n\n setExpanded(expanded: boolean): void {\n this.expanded = expanded;\n if (this.collapsible) {\n this.collapsible.setExpanded(expanded);\n this.updateBgColor();\n super.invalidate();\n return;\n }\n // No collapsible — need a full rebuild (e.g. write tool, header-only tools)\n this.rebuild();\n }\n\n toggleExpanded(): void {\n this.setExpanded(!this.expanded);\n }\n\n override invalidate(): void {\n super.invalidate();\n // invalidate is called by the layout system — only update bg, don't rebuild\n this.updateBgColor();\n }\n\n private updateBgColor(): void {\n // For shell, view, and edit commands, skip background - we use bordered box style instead\n const isShellCommand = this.toolName === 'execute_command' || this.toolName === 'mastra_workspace_execute_command';\n const isViewCommand = this.toolName === 'view' || this.toolName === 'mastra_workspace_read_file';\n const isEditCommand = this.toolName === 'string_replace_lsp' || this.toolName === 'mastra_workspace_edit_file';\n const isWriteCommand = this.toolName === 'write_file' || this.toolName === 'mastra_workspace_write_file';\n const isTaskWrite = this.toolName === 'task_write';\n\n if (isShellCommand || isViewCommand || isEditCommand || isWriteCommand || isTaskWrite) {\n // No background - let terminal colors show through\n this.contentBox.setBgFn((text: string) => text);\n return;\n }\n\n const bgColor = this.isPartial ? 'toolPendingBg' : this.result?.isError ? 'toolErrorBg' : 'toolSuccessBg';\n this.contentBox.setBgFn((text: string) => theme.bg(bgColor, text));\n }\n\n /**\n * Full clear-and-rebuild. Called when:\n * - args change (updateArgs)\n * - result arrives or changes (updateResult)\n * - expand/collapse on a tool with no collapsible child\n * - initial construction\n */\n private rebuild(): void {\n this.updateBgColor();\n this.contentBox.clear();\n this.collapsible = undefined;\n\n switch (this.toolName) {\n case 'view':\n case 'mastra_workspace_read_file':\n this.renderViewToolEnhanced();\n break;\n case 'execute_command':\n case 'mastra_workspace_execute_command':\n this.renderBashToolEnhanced();\n break;\n case 'string_replace_lsp':\n case 'mastra_workspace_edit_file':\n this.renderEditToolEnhanced();\n break;\n case 'write_file':\n case 'mastra_workspace_write_file':\n this.renderWriteToolEnhanced();\n break;\n case 'find_files':\n case 'mastra_workspace_list_files':\n this.renderListFilesEnhanced();\n break;\n case 'task_write':\n this.renderTaskWriteEnhanced();\n break;\n default:\n this.renderGenericToolEnhanced();\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 startLine = viewRange?.[0] ?? 1;\n // Don't show border until we have a result\n if (!this.result || this.isPartial) {\n // Just show pending indicator\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const rangeDisplay = viewRange ? theme.fg('muted', `:${viewRange[0]},${viewRange[1]}`) : '';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, viewRange?.[0])\n : theme.fg('accent', path);\n const headerText = `${theme.bold(theme.fg('toolTitle', 'view'))} ${pathDisplay}${rangeDisplay}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const rangeDisplay = viewRange ? theme.fg('muted', `:${viewRange[0]},${viewRange[1]}`) : '';\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = process.stdout.columns || 80;\n const fixedParts = '└── view ' + (rangeDisplay ? `:XXX,XXX` : '') + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6; // buffer\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, viewRange?.[0])\n : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'view'))} ${pathDisplay}${rangeDisplay}${status}`;\n\n // Empty line padding above\n this.contentBox.addChild(new Text('', 0, 0));\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // Syntax-highlighted content with left border, truncated to prevent soft wrap\n const output = this.getFormattedOutput();\n if (output) {\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // Account for border \"│ \" (2) + padding (2) + buffer (2)\n const highlighted = highlightCode(output, fullPath, startLine);\n let lines = highlighted.split('\\n');\n\n // Limit lines when collapsed\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n\n if (hasMore) {\n lines = lines.slice(0, collapsedLines);\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = totalLines - collapsedLines;\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (ctrl+e to expand)`), 0, 0),\n );\n }\n }\n\n // Bottom border with tool info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n\n private renderBashToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n let command = argsObj?.command ? String(argsObj.command) : '...';\n const timeout = argsObj?.timeout as number | undefined;\n const cwd = argsObj?.cwd ? shortenPath(String(argsObj.cwd)) : '';\n\n // Strip \"cd $CWD && \" from the start since we show cwd in the footer\n const cdPattern = /^cd\\s+[^\\s]+\\s+&&\\s+/;\n command = command.replace(cdPattern, '');\n\n // Extract tail value from command (e.g., \"| tail -5\" or \"| tail -n 5\")\n let maxStreamLines: number | undefined;\n const tailMatch = command.match(/\\|\\s*tail\\s+(?:-n\\s+)?(-?\\d+)\\s*$/);\n if (tailMatch) {\n maxStreamLines = Math.abs(parseInt(tailMatch[1]!, 10));\n }\n\n const timeoutSuffix = timeout ? theme.fg('muted', ` (timeout ${timeout}s)`) : '';\n const cwdSuffix = cwd ? theme.fg('muted', ` in ${cwd}`) : '';\n const timeSuffix = this.isPartial ? timeoutSuffix : this.getDurationSuffix();\n\n // Helper to render shell command with bordered box\n const renderBorderedShell = (status: string, outputLines: string[]) => {\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const footerText = `${theme.bold(theme.fg('toolTitle', '$'))} ${theme.fg('accent', command)}${cwdSuffix}${timeSuffix}${status}`;\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // Output lines with left border, truncated to prevent soft wrap\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6; // Account for border \"│ \" (2) + buffer (4)\n const borderedLines = outputLines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n const displayOutput = borderedLines.join('\\n');\n if (displayOutput.trim()) {\n this.contentBox.addChild(new Text(displayOutput, 0, 0));\n }\n\n // Bottom border with command info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n };\n\n if (!this.result || this.isPartial) {\n const status = this.getStatusIndicator();\n let lines = this.streamingOutput ? this.streamingOutput.split('\\n') : [];\n // Remove leading empty lines during streaming\n while (lines.length > 0 && lines[0] === '') {\n lines.shift();\n }\n // Remove trailing empty lines during streaming (from trailing newline)\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n // Apply tail limit to streaming output to match final result\n if (maxStreamLines && lines.length > maxStreamLines) {\n lines = lines.slice(-maxStreamLines);\n }\n renderBorderedShell(status, lines);\n return;\n }\n\n // Helper to apply tail limit and clean up lines\n const prepareOutputLines = (output: string): string[] => {\n let lines = output.split('\\n');\n // Remove leading/trailing empty lines\n while (lines.length > 0 && lines[0] === '') {\n lines.shift();\n }\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n // Apply tail limit to match streaming display\n if (maxStreamLines && lines.length > maxStreamLines) {\n lines = lines.slice(-maxStreamLines);\n }\n return lines;\n };\n\n // For errors, use bordered box with error status\n if (this.result.isError) {\n const status = theme.fg('error', ' ✗');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n return;\n }\n\n // Also check if output contains common error patterns\n const outputText = this.getFormattedOutput();\n const looksLikeError = outputText.match(\n /Error:|TypeError:|SyntaxError:|ReferenceError:|command not found|fatal:|error:/i,\n );\n if (looksLikeError) {\n const status = theme.fg('error', ' ✗');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n return;\n }\n\n // Success - use bordered box with checkmark\n const status = theme.fg('success', ' ✓');\n const output = this.streamingOutput.trim() || this.getFormattedOutput();\n renderBorderedShell(status, prepareOutputLines(output));\n }\n private renderEditToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const startLineNum = argsObj?.start_line ? Number(argsObj.start_line) : undefined;\n const startLine = startLineNum ? `:${String(startLineNum)}` : '';\n\n // While streaming / pending — show diff preview if old_str + new_str available\n if (!this.result || this.isPartial) {\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, startLineNum)\n : theme.fg('accent', path);\n\n // If both old_str and new_str are available, show a bordered diff preview\n if (argsObj?.old_str && argsObj?.new_str) {\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n const footerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n const oldStr = String(argsObj.old_str);\n const newStr = String(argsObj.new_str);\n const { lines: diffLines } = this.generateDiffLines(oldStr, newStr);\n\n // While streaming, show the tail so new content scrolls in at the bottom\n const collapsedLines = 15;\n const totalLines = diffLines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let linesToShow = diffLines;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n linesToShow = diffLines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = linesToShow.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n return;\n }\n\n // No diff args yet — just show header\n const headerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n\n // Calculate available width for path and truncate from beginning if needed\n const termWidth = process.stdout.columns || 80;\n const fixedParts = '└── edit ' + startLine + ' ✓'; // approximate fixed width\n const availableForPath = termWidth - fixedParts.length - 6; // buffer\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n\n const pathDisplay = fullPath\n ? fileLink(theme.fg('accent', path), fullPath, startLineNum)\n : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'edit'))} ${pathDisplay}${theme.fg('muted', startLine)}${status}`;\n\n // Empty line padding above\n this.contentBox.addChild(new Text('', 0, 0));\n\n // Top border\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n // For edits, show the diff\n if (argsObj?.old_str && argsObj?.new_str && !this.result.isError) {\n const oldStr = String(argsObj.old_str);\n const newStr = String(argsObj.new_str);\n const { lines: diffLines, firstChangeIndex } = this.generateDiffLines(oldStr, newStr);\n\n // Limit lines when collapsed, windowed around first change\n const collapsedLines = 15;\n const totalLines = diffLines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n\n let linesToShow = diffLines;\n let skippedBefore = 0;\n if (hasMore) {\n // Show 3 context lines before the first change, rest after\n const contextBefore = 3;\n const start = Math.max(0, firstChangeIndex - contextBefore);\n linesToShow = diffLines.slice(start, start + collapsedLines);\n skippedBefore = start;\n }\n // Render diff lines with border, truncated to prevent wrap\n const maxLineWidth = termWidth - 6;\n\n // Show \"skipped above\" indicator\n if (skippedBefore > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedBefore} lines above`), 0, 0),\n );\n }\n\n const borderedLines = linesToShow.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n // Show truncation indicator\n if (hasMore) {\n const remaining = totalLines - (skippedBefore + linesToShow.length);\n if (remaining > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${remaining} more lines (ctrl+e to expand)`), 0, 0),\n );\n }\n }\n } else if (this.result.isError) {\n // Show error output\n const output = this.getFormattedOutput();\n if (output) {\n const maxLineWidth = termWidth - 6;\n const lines = output.split('\\n').map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('error', truncated);\n });\n this.contentBox.addChild(new Text(lines.join('\\n'), 0, 0));\n }\n }\n\n // Bottom border with tool info\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n\n // LSP diagnostics below the box\n const diagnostics = this.parseLSPDiagnostics();\n if (diagnostics && diagnostics.hasIssues) {\n 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 color = diag.severity === 'error' ? '#e06c75' : diag.severity === 'warning' ? '#f59e0b' : '#71717a';\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}${chalk.hex('#a1a1aa')(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 chalk.hex('#71717a')(` ... ${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('#5cb85c'); // soft green\n\n const maxLines = Math.max(oldLines.length, newLines.length);\n\n for (let i = 0; i < maxLines; i++) {\n if (i >= oldLines.length) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(addedColor(newLines[i]));\n } else if (i >= newLines.length) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(removedColor(oldLines[i]));\n } else if (oldLines[i] !== newLines[i]) {\n if (firstChangeIndex === -1) firstChangeIndex = lines.length;\n lines.push(removedColor(oldLines[i]!));\n lines.push(addedColor(newLines[i]!));\n } else {\n // Context line\n lines.push(theme.fg('muted', oldLines[i]!));\n }\n }\n\n return {\n lines,\n firstChangeIndex: firstChangeIndex === -1 ? 0 : firstChangeIndex,\n };\n }\n private renderWriteToolEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const content = argsObj?.content ? String(argsObj.content) : '';\n\n // While streaming args (no result yet), show bordered box with content as it arrives\n if (!this.result || this.isPartial) {\n if (!content) {\n // No content yet — just show pending header\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const headerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n this.contentBox.addChild(new Text(headerText, 0, 0));\n return;\n }\n\n // Content is streaming in — show bordered box with syntax-highlighted preview\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '└── write ⋯';\n const availableForPath = termWidth - fixedParts.length - 6;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n const highlighted = highlightCode(content, fullPath);\n let lines = highlighted.split('\\n');\n\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n lines = lines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n return;\n }\n\n // Complete — show final bordered result\n const border = (char: string) => theme.bold(theme.fg('accent', char));\n const status = this.getStatusIndicator();\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 6;\n\n let path = argsObj?.path ? shortenPath(String(argsObj.path)) : '...';\n const fixedParts = '└── write ✓';\n const availableForPath = termWidth - fixedParts.length - 6;\n if (path.length > availableForPath && availableForPath > 10) {\n path = '…' + path.slice(-(availableForPath - 1));\n }\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const footerText = `${theme.bold(theme.fg('toolTitle', 'write'))} ${pathDisplay}${status}`;\n\n this.contentBox.addChild(new Text('', 0, 0));\n this.contentBox.addChild(new Text(border('┌──'), 0, 0));\n\n if (this.result.isError) {\n const output = this.getFormattedOutput();\n if (output) {\n const lines = output.split('\\n').map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + theme.fg('error', truncated);\n });\n this.contentBox.addChild(new Text(lines.join('\\n'), 0, 0));\n }\n } else if (content) {\n const highlighted = highlightCode(content, fullPath);\n let lines = highlighted.split('\\n');\n\n const collapsedLines = 20;\n const totalLines = lines.length;\n const hasMore = !this.expanded && totalLines > collapsedLines + 1;\n let skippedAbove = 0;\n if (hasMore) {\n skippedAbove = totalLines - collapsedLines;\n lines = lines.slice(-collapsedLines);\n }\n\n if (skippedAbove > 0) {\n this.contentBox.addChild(\n new Text(border('│') + ' ' + theme.fg('muted', `... ${skippedAbove} lines above (ctrl+e to expand)`), 0, 0),\n );\n }\n\n const borderedLines = lines.map(line => {\n const truncated = truncateAnsi(line, maxLineWidth);\n return border('│') + ' ' + truncated;\n });\n this.contentBox.addChild(new Text(borderedLines.join('\\n'), 0, 0));\n }\n\n this.contentBox.addChild(new Text(`${border('└──')} ${footerText}`, 0, 0));\n }\n private renderListFilesEnhanced(): void {\n const argsObj = this.args as Record<string, unknown> | undefined;\n const fullPath = argsObj?.path ? String(argsObj.path) : '';\n const path = argsObj?.path ? shortenPath(String(argsObj.path)) : '/';\n const pattern = argsObj?.pattern ? String(argsObj.pattern) : '';\n const patternDisplay = pattern ? ' ' + theme.fg('muted', pattern) : '';\n\n if (!this.result || this.isPartial) {\n const status = this.getStatusIndicator();\n const pathDisplay = fullPath ? fileLink(theme.fg('accent', path), fullPath) : theme.fg('accent', path);\n const header = `${theme.bold(theme.fg('toolTitle', 'list'))} ${pathDisplay}${patternDisplay}${status}`;\n this.contentBox.addChild(new Text(header, 0, 0));\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n const lines = output.split('\\n');\n const fileCount = lines.filter(l => l.trim() && !l.includes('└') && !l.includes('├') && !l.includes('│')).length;\n const listStatus = this.getStatusIndicator();\n\n this.collapsible = new CollapsibleComponent(\n {\n header: `${theme.bold(theme.fg('toolTitle', 'list'))} ${theme.fg('accent', path)}${patternDisplay}${listStatus}`,\n summary: `${fileCount} items`,\n expanded: this.expanded,\n collapsedLines: 15,\n expandedLines: 100,\n showLineCount: false,\n },\n this.ui,\n );\n\n this.collapsible.setContent(output);\n this.contentBox.addChild(this.collapsible);\n }\n }\n\n private renderTaskWriteEnhanced(): void {\n const argsObj = this.args as { tasks?: TaskItem[] } | undefined;\n const tasks = argsObj?.tasks;\n const status = this.getStatusIndicator();\n\n // Show a compact header — the pinned TaskProgressComponent handles live rendering\n const count = tasks?.length ?? 0;\n const countSuffix = count > 0 ? theme.fg('muted', ` (${count} tasks)`) : '';\n const header = `${theme.bold(theme.fg('toolTitle', 'task_write'))}${countSuffix}${status}`;\n this.contentBox.addChild(new Text(header, 0, 0));\n\n // Surface error details when the tool call fails\n if (!this.isPartial && this.result?.isError) {\n const output = this.getFormattedOutput();\n if (output) {\n this.contentBox.addChild(new Text(theme.fg('error', output), 0, 0));\n }\n }\n }\n\n private renderGenericToolEnhanced(): void {\n const status = this.getStatusIndicator();\n\n let argsSummary = '';\n if (this.args && typeof this.args === 'object') {\n const argsObj = this.args as Record<string, unknown>;\n const keys = Object.keys(argsObj);\n if (keys.length > 0) {\n argsSummary = theme.fg('muted', ` (${keys.length} args)`);\n }\n }\n\n const header = `${theme.bold(theme.fg('toolTitle', this.toolName))}${argsSummary}${status}`;\n\n if (!this.result || this.isPartial) {\n this.contentBox.addChild(new Text(header, 0, 0));\n // Show live key=value preview of args as they stream in\n const preview = this.formatArgsPreview();\n if (preview.length > 0) {\n this.contentBox.addChild(new Text(preview.join('\\n'), 0, 0));\n }\n return;\n }\n\n // Use enhanced error display for errors\n if (this.result.isError) {\n this.renderErrorResult(header);\n return;\n }\n\n const output = this.getFormattedOutput();\n if (output) {\n this.collapsible = new CollapsibleComponent(\n {\n header,\n expanded: this.expanded,\n collapsedLines: 10,\n expandedLines: 200,\n showLineCount: true,\n },\n this.ui,\n );\n\n this.collapsible.setContent(output);\n this.contentBox.addChild(this.collapsible);\n }\n }\n\n /**\n * Format a compact args preview as key=\"value\" pairs.\n * Long values are truncated, multiline values show first line + count.\n * Returns an array of formatted lines.\n */\n private formatArgsPreview(maxLines = 4, maxValueLen = 60): string[] {\n if (!this.args || typeof this.args !== 'object') return [];\n const argsObj = this.args as Record<string, unknown>;\n const keys = Object.keys(argsObj);\n if (keys.length === 0) return [];\n\n const termWidth = process.stdout.columns || 80;\n const maxLineWidth = termWidth - 4; // small margin\n const lines: string[] = [];\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!;\n if (lines.length >= maxLines) {\n const remaining = keys.length - i;\n lines.push(theme.fg('muted', ` ... ${remaining} more`));\n break;\n }\n const raw = argsObj[key];\n let val: string;\n if (typeof raw === 'string') {\n const strLines = raw.split('\\n');\n if (strLines.length > 1) {\n val = strLines[0]!.slice(0, maxValueLen) + theme.fg('muted', ` (${strLines.length} lines)`);\n } else {\n val = raw.length > maxValueLen ? raw.slice(0, maxValueLen) + '…' : raw;\n }\n val = `\"${val}\"`;\n } else if (raw === undefined) {\n continue;\n } else if (Array.isArray(raw)) {\n val = `[${raw.length} items]`;\n } else if (typeof raw === 'object' && raw !== null) {\n const objKeys = Object.keys(raw as Record<string, unknown>);\n val = `{${objKeys.slice(0, 3).join(', ')}${objKeys.length > 3 ? ', …' : ''}}`;\n } else {\n val = String(raw);\n }\n const line = truncateAnsi(` ${theme.fg('muted', key + '=')}${val}`, maxLineWidth);\n lines.push(line);\n }\n return lines;\n }\n\n private getStatusIndicator(): string {\n return this.isPartial\n ? theme.fg('muted', ' ⋯')\n : this.result?.isError\n ? theme.fg('error', ' ✗')\n : theme.fg('success', ' ✓');\n }\n\n private getDurationSuffix(): string {\n if (this.isPartial) return '';\n const ms = Date.now() - this.startTime;\n if (ms < 1000) return theme.fg('muted', ` ${ms}ms`);\n return theme.fg('muted', ` ${(ms / 1000).toFixed(1)}s`);\n }\n\n private getFormattedOutput(): string {\n if (!this.result) return '';\n\n const textContent = this.result.content\n .filter(c => c.type === 'text' && c.text)\n .map(c => c.text!)\n .join('\\n');\n\n if (!textContent) return '';\n\n const { content } = extractContent(textContent);\n // Remove excessive blank lines while preserving intentional formatting\n return content.trim().replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n');\n }\n\n /**\n * Render an error result using the enhanced error display component\n */\n private renderErrorResult(header: string): void {\n if (!this.result) return;\n\n // First add the header\n this.contentBox.addChild(new Text(header, 0, 0));\n\n // Extract error text from result\n const errorText = this.result.content\n .filter(c => c.type === 'text' && c.text)\n .map(c => c.text!)\n .join('\\n');\n\n if (!errorText) return;\n\n // Check if this is a validation error\n const isValidationError =\n errorText.toLowerCase().includes('validation') ||\n errorText.toLowerCase().includes('required parameter') ||\n errorText.toLowerCase().includes('missing required') ||\n errorText.match(/at \"\\w+\"/i) || // Zod-style errors\n (errorText.includes('Expected') && errorText.includes('Received'));\n\n if (isValidationError) {\n // Use specialized validation error component\n const validationErrors = parseValidationErrors(errorText);\n const validationDisplay = new ToolValidationErrorComponent(\n {\n toolName: this.toolName,\n errors: validationErrors,\n args: this.args,\n },\n this.ui,\n );\n this.contentBox.addChild(validationDisplay);\n return;\n }\n\n // Try to parse as an error object\n let error: Error | string = errorText;\n try {\n const { content } = extractContent(errorText);\n error = content;\n\n // Try to create an Error object with better structure\n const errorMatch = content.match(/^([A-Z][a-zA-Z]*Error):\\s*(.+)$/m);\n if (errorMatch) {\n const err = new Error(errorMatch[2]!);\n err.name = errorMatch[1]!;\n // Try to extract stack trace\n const stackMatch = content.match(/\\n\\s+at\\s+.+/g);\n if (stackMatch) {\n err.stack = `${err.name}: ${err.message}\\n${stackMatch.join('\\n')}`;\n }\n error = err;\n }\n } catch {\n // Keep as string\n }\n\n // Create error display component\n const errorDisplay = new ErrorDisplayComponent(\n error,\n {\n showStack: true,\n showContext: true,\n expanded: this.expanded,\n },\n this.ui,\n );\n\n this.contentBox.addChild(errorDisplay);\n }\n}\n\n/** Map file extensions to highlight.js language names */\nfunction getLanguageFromPath(path: string): string | undefined {\n const ext = path.split('.').pop()?.toLowerCase();\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n json: 'json',\n md: 'markdown',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n go: 'go',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'c',\n hpp: 'cpp',\n cs: 'csharp',\n php: 'php',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'bash',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'ini',\n ini: 'ini',\n xml: 'xml',\n html: 'html',\n htm: 'html',\n css: 'css',\n scss: 'scss',\n sass: 'scss',\n less: 'less',\n sql: 'sql',\n graphql: 'graphql',\n gql: 'graphql',\n dockerfile: 'dockerfile',\n makefile: 'makefile',\n cmake: 'cmake',\n vue: 'vue',\n svelte: 'xml',\n };\n return ext ? langMap[ext] : undefined;\n}\n\n/** Strip cat -n formatting 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 \"[Truncated N tokens]\" and \"Here's the result of running `cat -n`...\" headers\n while (\n lines.length > 0 &&\n (lines[0]!.includes(\"Here's the result of running\") || lines[0]!.match(/^\\[Truncated \\d+ tokens\\]$/))\n ) {\n lines = lines.slice(1);\n }\n\n // Strip line numbers - we know they're sequential starting from startLine\n let expectedLineNum = startLine ?? 1;\n const codeLines = lines.map(line => {\n const numStr = String(expectedLineNum);\n // Line format is like \" 123\\tcode\" or \" 123\" for blank lines\n // Check if line starts with spaces + our expected number\n const match = line.match(/^(\\s*)(\\d+)(\\t?)(.*)$/);\n if (match && match[2] === numStr) {\n expectedLineNum++;\n return match[4]; // Return just the code part after the tab\n }\n return line;\n });\n\n // Remove trailing empty lines\n while (codeLines.length > 0 && codeLines[codeLines.length - 1] === '') {\n codeLines.pop();\n }\n\n // Apply syntax highlighting\n try {\n return highlight(codeLines.join('\\n'), {\n language: getLanguageFromPath(path),\n ignoreIllegals: true,\n });\n } catch {\n return codeLines.join('\\n');\n }\n}\n/** Truncate a string with ANSI codes to a visible width.\n * Handles both SGR sequences (\\x1b[...m) and OSC 8 hyperlinks (\\x1b]8;...;\\x07).\n */\nfunction truncateAnsi(str: string, maxWidth: number): string {\n const ansiRegex = /\\x1b\\[[0-9;]*m|\\x1b\\]8;[^\\x07]*\\x07/g;\n let visibleLength = 0;\n let result = '';\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = ansiRegex.exec(str)) !== null) {\n // Add text before this ANSI code\n const textBefore = str.slice(lastIndex, match.index);\n const remaining = maxWidth - visibleLength;\n if (textBefore.length <= remaining) {\n result += textBefore;\n visibleLength += textBefore.length;\n } else {\n result += textBefore.slice(0, remaining - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close any open hyperlink + reset styles\n return result;\n }\n // Add the ANSI code (doesn't count toward visible length)\n result += match[0];\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text after last ANSI code\n const remaining = str.slice(lastIndex);\n const spaceLeft = maxWidth - visibleLength;\n if (remaining.length <= spaceLeft) {\n result += remaining;\n } else {\n result += remaining.slice(0, spaceLeft - 1) + '…';\n result += '\\x1b]8;;\\x07\\x1b[0m'; // Close hyperlink + reset\n }\n\n return result;\n}\n","/**\n * Component that renders a user message.\n */\n\nimport { Container, Markdown, Spacer } from '@mariozechner/pi-tui';\nimport type { MarkdownTheme } from '@mariozechner/pi-tui';\nimport { getMarkdownTheme, theme } from '../theme.js';\n\nexport class UserMessageComponent extends Container {\n constructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n super();\n this.addChild(new Spacer(1));\n this.addChild(\n new Markdown(text, 1, 1, markdownTheme, {\n bgColor: (text: string) => theme.bg('userMessageBg', text),\n color: (text: string) => theme.fg('userMessageText', text),\n }),\n );\n }\n}\n","/**\n * 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 * 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\n mimeType: string;\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 // Check clipboard types\n let clipInfo: string;\n try {\n clipInfo = execSync(\"osascript -e 'clipboard info'\", {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n return null;\n }\n\n // Look for image types: PNGf (PNG), TIFF, or public.png\n const hasPng = clipInfo.includes('PNGf') || clipInfo.includes('public.png');\n const hasTiff = clipInfo.includes('TIFF');\n\n if (!hasPng && !hasTiff) {\n return null;\n }\n\n // Extract image data to temp file\n const tmpFile = join(tmpdir(), `mastra-clipboard-${Date.now()}.png`);\n\n try {\n // Prefer PNG if available, otherwise convert TIFF\n const clipboardClass = hasPng ? 'PNGf' : 'TIFF';\n const script = `\n\t\t\tset theImage to the clipboard as «class ${clipboardClass}»\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 // Read the file as base64\n const buffer = readFileSync(tmpFile);\n const base64 = buffer.toString('base64');\n\n return {\n data: base64,\n mimeType: hasPng ? 'image/png' : 'image/tiff',\n };\n } catch {\n return null;\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\n// =============================================================================\n// Linux\n// =============================================================================\n\nfunction getLinuxClipboardImage(): ClipboardImage | null {\n // Try xclip first, then wl-paste (Wayland)\n return getLinuxClipboardImageXclip() ?? getLinuxClipboardImageWlPaste();\n}\n\nfunction getLinuxClipboardImageXclip(): ClipboardImage | null {\n try {\n // Check available targets\n const targets = execSync('xclip -selection clipboard -target TARGETS -o', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!targets.includes('image/png')) {\n return null;\n }\n\n // Extract PNG data\n const buffer = execSync('xclip -selection clipboard -target image/png -o', {\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 50 * 1024 * 1024, // 50MB max\n });\n\n if (!Buffer.isBuffer(buffer) || buffer.length === 0) {\n return null;\n }\n\n return {\n data: buffer.toString('base64'),\n mimeType: 'image/png',\n };\n } catch {\n return null;\n }\n}\n\nfunction getLinuxClipboardImageWlPaste(): ClipboardImage | null {\n try {\n // Check if wl-paste is available and clipboard has image\n const types = execSync('wl-paste --list-types', {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!types.includes('image/png')) {\n return null;\n }\n\n // Extract PNG data\n const buffer = execSync('wl-paste --type image/png', {\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 50 * 1024 * 1024,\n });\n\n if (!Buffer.isBuffer(buffer) || buffer.length === 0) {\n return null;\n }\n\n return {\n data: buffer.toString('base64'),\n mimeType: 'image/png',\n };\n } catch {\n return null;\n }\n}\n","/**\n * Custom editor that handles app-level keybindings for Mastra Code.\n */\n\nimport { Editor, matchesKey } from '@mariozechner/pi-tui';\nimport type { EditorTheme, TUI } from '@mariozechner/pi-tui';\nimport { getClipboardImage } from '../../clipboard/index.js';\nimport type { ClipboardImage } from '../../clipboard/index.js';\n\nconst PASTE_START = '\\x1b[200~';\nconst PASTE_END = '\\x1b[201~';\nexport type AppAction =\n | 'clear' // Ctrl+C or Escape - interrupt\n | 'exit' // Ctrl+D - exit when empty\n | 'undo' // Ctrl+Z - undo last clear\n | 'toggleThinking' // Ctrl+T\n | 'expandTools' // Ctrl+E\n | 'followUp' // Alt+Enter - queue follow-up while streaming\n | 'cycleMode' // Shift+Tab - cycle harness modes\n | 'toggleYolo'; // Ctrl+Y - toggle YOLO mode\n\nexport class CustomEditor extends Editor {\n private actionHandlers: Map<AppAction, () => void> = new Map();\n\n /** Handler for Ctrl+D when editor is empty */\n public onCtrlD?: () => void;\n\n /** Whether Escape triggers clear (default true) */\n public escapeEnabled = true;\n\n /** Called when clipboard image data is pasted */\n public onImagePaste?: (image: ClipboardImage) => void;\n\n /** Tracks when we're swallowing paste content that was intercepted as an image */\n private _imagePasteIntercepted = false;\n\n constructor(tui: TUI, theme: EditorTheme) {\n super(tui, theme);\n }\n\n /**\n * Register a handler for an app action.\n */\n onAction(action: AppAction, handler: () => void): void {\n this.actionHandlers.set(action, handler);\n }\n\n handleInput(data: string): void {\n // If we intercepted a paste as image, swallow remaining paste data\n if (this._imagePasteIntercepted) {\n if (data.includes(PASTE_END)) {\n this._imagePasteIntercepted = false;\n const afterPaste = data.substring(data.indexOf(PASTE_END) + PASTE_END.length);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n }\n return;\n }\n\n // Detect paste start → check clipboard for image\n if (data.includes(PASTE_START) && this.onImagePaste) {\n const clipboardImage = getClipboardImage();\n if (clipboardImage) {\n this.onImagePaste(clipboardImage);\n // Swallow the paste text content\n if (data.includes(PASTE_END)) {\n const afterPaste = data.substring(data.indexOf(PASTE_END) + PASTE_END.length);\n if (afterPaste.length > 0) {\n this.handleInput(afterPaste);\n }\n } else {\n this._imagePasteIntercepted = true;\n }\n return;\n }\n }\n\n // Ctrl+C - interrupt\n if (matchesKey(data, 'ctrl+c')) {\n const handler = this.actionHandlers.get('clear');\n if (handler) {\n handler();\n return;\n }\n }\n // Escape - same as Ctrl+C (abort generation) if enabled\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 // Ctrl+D - exit when editor is empty\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; // Always consume\n }\n // Ctrl+Z - undo last clear\n if (matchesKey(data, 'ctrl+z')) {\n const handler = this.actionHandlers.get('undo');\n if (handler) {\n handler();\n return;\n }\n }\n\n // Ctrl+T - toggle thinking\n if (matchesKey(data, 'ctrl+t')) {\n const handler = this.actionHandlers.get('toggleThinking');\n if (handler) {\n handler();\n return;\n }\n }\n\n // Ctrl+E - expand tools\n if (matchesKey(data, 'ctrl+e')) {\n const handler = this.actionHandlers.get('expandTools');\n if (handler) {\n handler();\n return;\n }\n }\n\n // Ctrl+F - follow-up (queue message while streaming)\n if (matchesKey(data, 'ctrl+f')) {\n // Accept autocomplete suggestion if one is showing, so the resolved\n // text (e.g. \"/review\" instead of \"/rev\") is read by the handler.\n if (this.isShowingAutocomplete()) {\n super.handleInput('\\t');\n }\n const handler = this.actionHandlers.get('followUp');\n if (handler) {\n handler();\n return;\n }\n }\n // Shift+Tab - cycle harness modes\n if (matchesKey(data, 'shift+tab')) {\n const handler = this.actionHandlers.get('cycleMode');\n if (handler) {\n handler();\n return;\n }\n }\n\n // Ctrl+Y - toggle YOLO mode\n if (matchesKey(data, 'ctrl+y')) {\n const handler = this.actionHandlers.get('toggleYolo');\n if (handler) {\n handler();\n return;\n }\n }\n\n // Pass to parent for editor handling\n super.handleInput(data);\n }\n}\n","/**\n * Shared TUI state — the single source of truth for all mutable state\n * in the Mastra TUI. Extracted so that slash commands, event handlers,\n * and other modules can operate on the state without coupling to the\n * MastraTUI class.\n */\nimport { Container, TUI, ProcessTerminal } from '@mariozechner/pi-tui';\nimport type { CombinedAutocompleteProvider, Text } from '@mariozechner/pi-tui';\nimport type { Harness, HarnessMessage, TokenUsage, TaskItem } 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 { 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 { defaultOMProgressState } from './components/om-progress.js';\nimport type { OMProgressComponent, OMProgressState } from './components/om-progress.js';\nimport type { PlanApprovalInlineComponent } from './components/plan-approval-inline.js';\nimport type { SlashCommandComponent } from './components/slash-command.js';\nimport type { SubagentExecutionComponent } from './components/subagent-execution.js';\nimport type { TaskProgressComponent } from './components/task-progress.js';\nimport type { IToolExecutionComponent } from './components/tool-execution-interface.js';\nimport type { UserMessageComponent } from './components/user-message.js';\nimport { getEditorTheme } from './theme.js';\n// =============================================================================\n// MastraTUIOptions\n// =============================================================================\n\nexport interface MastraTUIOptions {\n /** The harness instance to control */\n harness: Harness<any>;\n\n /** Hook manager for session lifecycle hooks */\n hookManager?: HookManager;\n\n /** Auth storage for OAuth login/logout */\n authStorage?: AuthStorage;\n\n /** MCP manager for server status and reload */\n mcpManager?: McpManager;\n\n /**\n * @deprecated Workspace is now obtained from the Harness.\n * Configure workspace via HarnessConfig.workspace instead.\n * Kept as fallback for backward compatibility.\n */\n workspace?: Workspace;\n\n /** Initial message to send on startup */\n initialMessage?: string;\n\n /** Whether to show verbose startup info */\n verbose?: boolean;\n\n /** App name for header */\n appName?: string;\n\n /** App version for header */\n version?: string;\n\n /** Use inline questions instead of dialog overlays */\n inlineQuestions?: boolean;\n}\n\n// =============================================================================\n// TUIState\n// =============================================================================\n\nexport interface TUIState {\n // ── Core dependencies (set once) ──────────────────────────────────────\n harness: Harness<any>;\n options: MastraTUIOptions;\n hookManager?: HookManager;\n authStorage?: AuthStorage;\n mcpManager?: McpManager;\n workspace?: Workspace;\n\n // ── TUI framework (set once) ──────────────────────────────────────────\n ui: TUI;\n chatContainer: Container;\n editorContainer: Container;\n editor: CustomEditor;\n footer: Container;\n terminal: ProcessTerminal;\n\n // ── Agent / streaming ─────────────────────────────────────────────────\n isInitialized: boolean;\n isAgentActive: boolean;\n gradientAnimator?: GradientAnimator;\n streamingComponent?: AssistantMessageComponent;\n streamingMessage?: HarnessMessage;\n pendingTools: Map<string, IToolExecutionComponent>;\n /** Buffer partial JSON args text per toolCallId for streaming input */\n toolInputBuffers: Map<string, { text: string; toolName: string }>;\n /** Position hint for task_write inline rendering when streaming */\n taskWriteInsertIndex: number;\n /** Track all tool IDs seen during current stream (prevents duplicates) */\n seenToolCallIds: Set<string>;\n /** Track subagent tool call IDs to skip in trailing content logic */\n subagentToolCallIds: Set<string>;\n /** Track all tools for expand/collapse */\n allToolComponents: IToolExecutionComponent[];\n /** Track slash command boxes for expand/collapse */\n allSlashCommandComponents: SlashCommandComponent[];\n /** Track active subagent tasks */\n pendingSubagents: Map<string, SubagentExecutionComponent>;\n toolOutputExpanded: boolean;\n hideThinkingBlock: boolean;\n\n // ── Thread / conversation ─────────────────────────────────────────────\n /** True when we want a new thread but haven't created it yet */\n pendingNewThread: boolean;\n pendingLockConflict: { threadTitle: string; ownerPid: number } | null;\n\n // ── Inline interaction ────────────────────────────────────────────────\n /** Track the most recent ask_user tool for inline question placement */\n lastAskUserComponent?: IToolExecutionComponent;\n /** Saved editor text for Ctrl+Z undo */\n lastClearedText: string;\n activeInlineQuestion?: AskQuestionInlineComponent;\n activeInlinePlanApproval?: PlanApprovalInlineComponent;\n lastSubmitPlanComponent?: IToolExecutionComponent;\n /** Follow-up messages sent via Ctrl+F while streaming */\n followUpComponents: UserMessageComponent[];\n /** Slash commands queued via Ctrl+F 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 tokenUsage: TokenUsage;\n statusLine?: Text;\n memoryStatusLine?: Text;\n modelAuthStatus: { hasAuth: boolean; apiKeyEnvVar?: string };\n\n // ── Observational Memory ──────────────────────────────────────────────\n omProgress: OMProgressState;\n omProgressComponent?: OMProgressComponent;\n activeOMMarker?: OMMarkerComponent;\n activeBufferingMarker?: OMMarkerComponent;\n activeActivationMarker?: OMMarkerComponent;\n /** Drives statusline label animation */\n bufferingMessages: boolean;\n bufferingObservations: boolean;\n\n // ── Tasks ─────────────────────────────────────────────────────────────\n taskProgress?: TaskProgressComponent;\n /** Track previous state for diff */\n previousTasks: TaskItem[];\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 // ── File tracking (for /diff) ─────────────────────────────────────────\n modifiedFiles: Map<string, { operations: string[]; firstModified: Date }>;\n /** Map toolCallId -> { toolName, filePath } for pending tool calls that modify files */\n pendingFileTools: Map<string, { toolName: string; filePath: string }>;\n\n // ── Cleanup ───────────────────────────────────────────────────────────\n unsubscribe?: () => void;\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create the initial TUIState from options.\n * Instantiates TUI framework objects (terminal, containers, editor)\n * and sets all mutable fields to their defaults.\n */\nexport function createTUIState(options: MastraTUIOptions): TUIState {\n const terminal = new ProcessTerminal();\n const ui = new TUI(terminal);\n const chatContainer = new Container();\n const editorContainer = new Container();\n const footer = new Container();\n const editor = new CustomEditor(ui, getEditorTheme());\n\n return {\n // Core dependencies\n harness: options.harness,\n options,\n hookManager: options.hookManager,\n authStorage: options.authStorage,\n mcpManager: options.mcpManager,\n workspace: options.workspace,\n\n // TUI framework\n ui,\n chatContainer,\n editorContainer,\n editor,\n footer,\n terminal,\n\n // Agent / streaming\n isInitialized: false,\n isAgentActive: false,\n pendingTools: new Map(),\n toolInputBuffers: new Map(),\n taskWriteInsertIndex: -1,\n seenToolCallIds: new Set(),\n subagentToolCallIds: new Set(),\n allToolComponents: [],\n allSlashCommandComponents: [],\n pendingSubagents: new Map(),\n toolOutputExpanded: false,\n hideThinkingBlock: true,\n\n // Thread / conversation\n pendingNewThread: false,\n pendingLockConflict: null,\n\n // Inline interaction\n lastClearedText: '',\n followUpComponents: [],\n pendingSlashCommands: [],\n pendingApprovalDismiss: null,\n\n // Status line\n projectInfo: detectProject(process.cwd()),\n tokenUsage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n modelAuthStatus: { hasAuth: true },\n\n // Observational Memory\n omProgress: defaultOMProgressState(),\n bufferingMessages: false,\n bufferingObservations: false,\n\n // Tasks\n previousTasks: [],\n\n // Input\n customSlashCommands: [],\n pendingImages: [],\n\n // Abort tracking\n lastCtrlCTime: 0,\n userInitiatedAbort: false,\n\n // File tracking\n modifiedFiles: new Map(),\n pendingFileTools: new Map(),\n };\n}\n","/**\n * Main TUI class for Mastra Code.\n * Wires the Harness to pi-tui components for a full interactive experience.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CombinedAutocompleteProvider, Container, Spacer, Text, visibleWidth } from '@mariozechner/pi-tui';\nimport type { Component, SlashCommand } from '@mariozechner/pi-tui';\nimport type {\n HarnessEvent,\n HarnessMessage,\n HarnessMessageContent,\n HarnessEventListener,\n TokenUsage,\n TaskItem,\n} from '@mastra/core/harness';\nimport type { Workspace } from '@mastra/core/workspace';\nimport chalk from 'chalk';\nimport { parse as parsePartialJson } from 'partial-json';\nimport { getOAuthProviders } from '../auth/storage.js';\nimport { getToolCategory, TOOL_CATEGORIES } from '../permissions.js';\nimport { parseSubagentMeta } from '../tools/subagent.js';\nimport { parseError } from '../utils/errors.js';\nimport { loadCustomCommands } from '../utils/slash-command-loader.js';\nimport type { SlashCommandMetadata } from '../utils/slash-command-loader.js';\nimport { processSlashCommand } from '../utils/slash-command-processor.js';\nimport { ThreadLockError } from '../utils/thread-lock.js';\nimport { AskQuestionDialogComponent } from './components/ask-question-dialog.js';\nimport { AskQuestionInlineComponent } from './components/ask-question-inline.js';\nimport { AssistantMessageComponent } from './components/assistant-message.js';\nimport { DiffOutputComponent } from './components/diff-output.js';\nimport { LoginDialogComponent } from './components/login-dialog.js';\nimport { ModelSelectorComponent } from './components/model-selector.js';\nimport type { ModelItem } from './components/model-selector.js';\nimport { GradientAnimator, applyGradientSweep } from './components/obi-loader.js';\n\nimport { OMMarkerComponent } from './components/om-marker.js';\nimport type { OMMarkerData } from './components/om-marker.js';\nimport { OMOutputComponent } from './components/om-output.js';\nimport { defaultOMProgressState, formatObservationStatus, formatReflectionStatus } from './components/om-progress.js';\nimport { OMSettingsComponent } from './components/om-settings.js';\nimport { PlanApprovalInlineComponent, PlanResultComponent } from './components/plan-approval-inline.js';\nimport { SettingsComponent } from './components/settings.js';\nimport { ShellOutputComponent } from './components/shell-output.js';\nimport { SlashCommandComponent } from './components/slash-command.js';\nimport { SubagentExecutionComponent } from './components/subagent-execution.js';\nimport { SystemReminderComponent } from './components/system-reminder.js';\nimport { TaskProgressComponent } from './components/task-progress.js';\nimport { ThreadSelectorComponent } from './components/thread-selector.js';\n\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 { UserMessageComponent } from './components/user-message.js';\nimport { sendNotification } from './notify.js';\nimport type { NotificationMode, NotificationReason } from './notify.js';\nimport type { MastraTUIOptions, TUIState } from './state.js';\nimport { createTUIState } from './state.js';\nimport { getMarkdownTheme, fg, bold, theme, mastra, tintHex } from './theme.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Tools that modify files, used for /diff tracking */\nconst FILE_TOOLS = ['string_replace_lsp', 'write_file', 'ast_smart_edit'];\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type { MastraTUIOptions } from './state.js';\n\n// =============================================================================\n// MastraTUI Class\n// =============================================================================\n\nexport class MastraTUI {\n private state: TUIState;\n\n private static readonly DOUBLE_CTRL_C_MS = 500;\n\n constructor(options: MastraTUIOptions) {\n this.state = createTUIState(options);\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 // Otherwise, handle normally\n originalHandleInput(data);\n };\n\n // Wire clipboard image paste\n this.state.editor.onImagePaste = image => {\n this.state.pendingImages.push(image);\n this.state.editor.insertTextAtCursor?.('[image] ');\n this.state.ui.requestRender();\n };\n\n this.setupKeyboardShortcuts();\n }\n\n /**\n * Setup keyboard shortcuts for the custom editor.\n */\n private setupKeyboardShortcuts(): void {\n // Ctrl+C / Escape - abort if running, clear input if idle, double-tap always exits\n this.state.editor.onAction('clear', () => {\n const now = Date.now();\n if (now - this.state.lastCtrlCTime < MastraTUI.DOUBLE_CTRL_C_MS) {\n // Double Ctrl+C → exit\n this.stop();\n process.exit(0);\n }\n this.state.lastCtrlCTime = now;\n\n if (this.state.pendingApprovalDismiss) {\n // Dismiss active approval dialog and abort\n this.state.pendingApprovalDismiss();\n this.state.activeInlinePlanApproval = undefined;\n this.state.activeInlineQuestion = undefined;\n this.state.userInitiatedAbort = true;\n this.state.harness.abort();\n } else if (this.state.harness.isRunning()) {\n // Clean up active inline components on abort\n this.state.activeInlinePlanApproval = undefined;\n this.state.activeInlineQuestion = undefined;\n this.state.userInitiatedAbort = true;\n this.state.harness.abort();\n } else {\n const current = this.state.editor.getText();\n if (current.length > 0) {\n this.state.lastClearedText = current;\n }\n this.state.editor.setText('');\n this.state.ui.requestRender();\n }\n });\n\n // Ctrl+Z - undo last clear (restore editor text)\n this.state.editor.onAction('undo', () => {\n if (this.state.lastClearedText && this.state.editor.getText().length === 0) {\n this.state.editor.setText(this.state.lastClearedText);\n this.state.lastClearedText = '';\n this.state.ui.requestRender();\n }\n });\n\n // Ctrl+D - exit when editor is empty\n this.state.editor.onCtrlD = () => {\n this.stop();\n process.exit(0);\n };\n\n // Ctrl+T - toggle thinking blocks visibility\n this.state.editor.onAction('toggleThinking', () => {\n this.state.hideThinkingBlock = !this.state.hideThinkingBlock;\n this.state.ui.requestRender();\n });\n // Ctrl+E - expand/collapse tool outputs\n this.state.editor.onAction('expandTools', () => {\n this.state.toolOutputExpanded = !this.state.toolOutputExpanded;\n for (const tool of this.state.allToolComponents) {\n tool.setExpanded(this.state.toolOutputExpanded);\n }\n for (const sc of this.state.allSlashCommandComponents) {\n sc.setExpanded(this.state.toolOutputExpanded);\n }\n this.state.ui.requestRender();\n });\n\n // Shift+Tab - cycle harness modes\n this.state.editor.onAction('cycleMode', async () => {\n // Block mode switching while plan approval is active\n if (this.state.activeInlinePlanApproval) {\n this.showInfo('Resolve the plan approval first');\n return;\n }\n\n const modes = this.state.harness.listModes();\n if (modes.length <= 1) return;\n const currentId = this.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 this.state.harness.switchMode({ modeId: nextMode.id });\n // The mode_changed event handler will show the info message\n this.updateStatusLine();\n });\n // Ctrl+Y - toggle YOLO mode\n this.state.editor.onAction('toggleYolo', () => {\n const current = (this.state.harness.getState() as any).yolo === true;\n this.state.harness.setState({ yolo: !current } as any);\n this.updateStatusLine();\n this.showInfo(current ? 'YOLO mode off' : 'YOLO mode on');\n });\n\n // Ctrl+F - queue follow-up message while streaming\n this.state.editor.onAction('followUp', () => {\n const text = this.state.editor.getText().trim();\n if (!text) return;\n if (!this.state.harness.isRunning()) return; // Only relevant while streaming\n\n // Clear editor\n this.state.editor.setText('');\n this.state.ui.requestRender();\n\n if (text.startsWith('/')) {\n // Queue slash command for processing after the agent completes\n this.state.pendingSlashCommands.push(text);\n this.showInfo(`Slash command queued: ${text}`);\n } else {\n // Queue as a regular follow-up message\n this.addUserMessage({\n id: `user-${Date.now()}`,\n role: 'user',\n content: [{ type: 'text', text }],\n createdAt: new Date(),\n });\n this.state.ui.requestRender();\n\n this.state.harness.followUp({ content: text }).catch(error => {\n this.showError(error instanceof Error ? error.message : 'Follow-up failed');\n });\n }\n });\n }\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Run the TUI. This is the main entry point.\n */\n async run(): Promise<void> {\n await this.init();\n\n // Run SessionStart hooks (fire and forget)\n const hookMgr = this.state.hookManager;\n if (hookMgr) {\n hookMgr.runSessionStart().catch(() => {});\n }\n\n // Process initial message if provided\n if (this.state.options.initialMessage) {\n this.fireMessage(this.state.options.initialMessage);\n }\n\n // Main interactive loop — never blocks on streaming,\n // so the editor stays responsive for steer / follow-up.\n while (true) {\n const userInput = await this.getUserInput();\n if (!userInput.trim()) 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 this.handleShellPassthrough(userInput.slice(1).trim());\n continue;\n }\n\n // Create thread lazily on first message (may load last-used model)\n if (this.state.pendingNewThread) {\n await this.state.harness.createThread();\n this.state.pendingNewThread = false;\n this.updateStatusLine();\n }\n\n // Check if a model is selected\n if (!this.state.harness.hasModelSelected()) {\n this.showInfo('No model selected. Use /models to select a model, or /login to authenticate.');\n continue;\n }\n\n // Collect any pending images from clipboard paste\n const images = this.state.pendingImages.length > 0 ? [...this.state.pendingImages] : undefined;\n this.state.pendingImages = [];\n\n // Add user message to chat immediately\n this.addUserMessage({\n id: `user-${Date.now()}`,\n role: 'user',\n content: [\n { type: 'text', text: userInput },\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 if (this.state.harness.isRunning()) {\n // Agent is streaming → steer (abort + resend)\n // Clear follow-up tracking since steer replaces the current response\n this.state.followUpComponents = [];\n this.state.pendingSlashCommands = [];\n this.state.harness.steer({ content: userInput }).catch(error => {\n this.showError(error instanceof Error ? error.message : 'Steer failed');\n });\n } else {\n // Normal send — fire and forget; events handle the rest\n this.fireMessage(userInput, images);\n }\n } catch (error) {\n this.showError(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 this.state.harness.sendMessage({ content, images: images ? images : undefined }).catch(error => {\n this.showError(error instanceof Error ? error.message : 'Unknown error');\n });\n }\n\n /**\n * Stop the TUI and clean up.\n */\n stop(): void {\n // Run SessionEnd hooks (best-effort, don't await)\n const hookMgr = this.state.hookManager;\n if (hookMgr) {\n hookMgr.runSessionEnd().catch(() => {});\n }\n\n if (this.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 this.promptForThreadSelection();\n\n // Load initial token usage from harness (persisted from previous session)\n this.state.tokenUsage = this.state.harness.getTokenUsage();\n\n // Load custom slash commands\n await this.loadCustomSlashCommands();\n\n // Setup autocomplete\n this.setupAutocomplete();\n\n // Build UI layout\n this.buildLayout();\n\n // Setup key handlers\n this.setupKeyHandlers();\n\n // Setup editor submit handler\n this.setupEditorSubmitHandler();\n\n // Subscribe to harness events\n this.subscribeToHarness();\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 await this.state.harness.loadOMProgress();\n\n // Sync OM thresholds from thread metadata (may differ from OM defaults)\n this.syncOMThresholdsFromHarness();\n\n // Start the UI\n this.state.ui.start();\n this.state.isInitialized = true;\n\n // Set terminal title\n this.updateTerminalTitle();\n // Render existing messages\n await this.renderExistingMessages();\n // Render existing tasks if any\n await this.renderExistingTasks();\n\n // Show deferred thread lock prompt (must happen after TUI is started)\n if (this.state.pendingLockConflict) {\n this.showThreadLockPrompt(this.state.pendingLockConflict.threadTitle, this.state.pendingLockConflict.ownerPid);\n this.state.pendingLockConflict = null;\n }\n }\n\n /**\n * Render existing tasks from the harness state on startup\n */\n private async renderExistingTasks(): Promise<void> {\n try {\n // Access the harness state using the public method\n const state = this.state.harness.getState() as { tasks?: TaskItem[] };\n const tasks = state.tasks || [];\n\n if (tasks.length > 0 && this.state.taskProgress) {\n // Update the existing task progress component\n this.state.taskProgress.updateTasks(tasks);\n this.state.ui.requestRender();\n }\n } catch {\n // Silently ignore task rendering errors\n }\n }\n /**\n * Prompt user to continue existing thread or start new one.\n * This runs before the TUI is fully initialized.\n * Threads are scoped to the current resourceId by listThreads(),\n * then further filtered by projectPath to avoid resuming threads\n * from other worktrees of the same repo.\n */\n private async promptForThreadSelection(): Promise<void> {\n const allThreads = await this.state.harness.listThreads();\n\n // Filter to threads matching the current working directory.\n // This prevents worktrees (which share the same resourceId) from\n // resuming each other's threads.\n const currentPath = this.state.projectInfo.rootPath;\n // TEMPORARY: Threads created before auto-tagging don't have projectPath\n // metadata. To avoid resuming another worktree's untagged threads, we\n // compare against the directory's birthtime — if the thread predates the\n // directory it can't belong here. Once all legacy threads have been\n // retroactively tagged (see below), this check can be removed.\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 this.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 const mostRecent = sortedThreads[0]!;\n // Auto-resume the most recent thread for this directory\n try {\n await this.state.harness.switchThread({ threadId: mostRecent.id });\n // Retroactively tag untagged legacy threads so the birthtime check\n // above can eventually be removed.\n if (!mostRecent.metadata?.projectPath) {\n await this.state.harness.setThreadSetting({ key: 'projectPath', value: currentPath });\n }\n } catch (error) {\n if (error instanceof ThreadLockError) {\n // Defer the lock conflict prompt until after the TUI is started\n this.state.pendingNewThread = true;\n this.state.pendingLockConflict = {\n threadTitle: mostRecent.title || mostRecent.id,\n ownerPid: error.ownerPid,\n };\n return;\n }\n throw error;\n }\n }\n /**\n * Extract text content from a harness message.\n */\n private extractTextContent(message: HarnessMessage): string {\n return message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n .trim();\n }\n\n /**\n * Truncate text for preview display.\n */\n private truncatePreview(text: string, maxLength = 50): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n }\n\n private buildLayout(): void {\n // Add header\n const appName = this.state.options.appName || 'Mastra Code';\n const version = this.state.options.version || '0.1.0';\n\n const logo = fg('accent', '◆') + ' ' + bold(fg('accent', appName)) + fg('dim', ` v${version}`);\n\n const keyStyle = (k: string) => fg('accent', k);\n const sep = fg('dim', ' · ');\n const instructions = [\n ` ${keyStyle('Ctrl+C')} ${fg('muted', 'interrupt/clear')}${sep}${keyStyle('Ctrl+C×2')} ${fg('muted', 'exit')}`,\n ` ${keyStyle('Enter')} ${fg('muted', 'while working → steer')}${sep}${keyStyle('Ctrl+F')} ${fg('muted', '→ queue follow-up')}`,\n ` ${keyStyle('/')} ${fg('muted', 'commands')}${sep}${keyStyle('!')} ${fg('muted', 'shell')}${sep}${keyStyle('Ctrl+T')} ${fg('muted', 'thinking')}${sep}${keyStyle('Ctrl+E')} ${fg('muted', 'tools')}${this.state.harness.listModes().length > 1 ? `${sep}${keyStyle('⇧Tab')} ${fg('muted', 'mode')}` : ''}`,\n ].join('\\n');\n\n this.state.ui.addChild(new Spacer(1));\n this.state.ui.addChild(\n new Text(\n `${logo}\n${instructions}`,\n 1,\n 0,\n ),\n );\n this.state.ui.addChild(new Spacer(1));\n\n // Add main containers\n this.state.ui.addChild(this.state.chatContainer);\n // Task progress (between chat and editor, visible only when tasks exist)\n this.state.taskProgress = new TaskProgressComponent();\n this.state.ui.addChild(this.state.taskProgress);\n this.state.ui.addChild(this.state.editorContainer);\n this.state.editorContainer.addChild(this.state.editor);\n\n // Add footer with two-line status\n this.state.statusLine = new Text('', 0, 0);\n this.state.memoryStatusLine = new Text('', 0, 0);\n this.state.footer.addChild(this.state.statusLine);\n this.state.footer.addChild(this.state.memoryStatusLine);\n this.state.ui.addChild(this.state.footer);\n this.updateStatusLine();\n this.refreshModelAuthStatus();\n\n // Set focus to editor\n this.state.ui.setFocus(this.state.editor);\n }\n\n /**\n * Update the two-line status bar.\n * Line 1: [MODE] provider/model memory tokens think:level\n * Line 2: ~/path/to/project (branch)\n */\n private updateStatusLine(): void {\n if (!this.state.statusLine) return;\n const termWidth = (process.stdout.columns || 80) - 1; // buffer to prevent jitter\n const SEP = ' '; // double-space separator between parts\n\n // --- Determine if we're showing observer/reflector instead of main mode ---\n const omStatus = this.state.omProgress.status;\n const isObserving = omStatus === 'observing';\n const isReflecting = omStatus === 'reflecting';\n const showOMMode = isObserving || isReflecting;\n\n // Colors for OM modes\n const OBSERVER_COLOR = mastra.orange; // Mastra orange\n const REFLECTOR_COLOR = mastra.pink; // Mastra pink\n\n // --- Mode badge ---\n let modeBadge = '';\n let modeBadgeWidth = 0;\n const modes = this.state.harness.listModes();\n const currentMode = modes.length > 1 ? this.state.harness.getCurrentMode() : undefined;\n // Use OM color when observing/reflecting, otherwise mode color\n const mainModeColor = currentMode?.color;\n const modeColor = showOMMode ? (isObserving ? OBSERVER_COLOR : REFLECTOR_COLOR) : mainModeColor;\n // Badge name: use OM mode name when observing/reflecting, otherwise main mode name\n const badgeName = showOMMode\n ? isObserving\n ? 'observe'\n : 'reflect'\n : currentMode\n ? currentMode.name || currentMode.id || 'unknown'\n : undefined;\n if (badgeName && modeColor) {\n const [mcr, mcg, mcb] = [\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n ];\n // Pulse the badge bg brightness opposite to the gradient sweep\n let badgeBrightness = 0.9;\n if (this.state.gradientAnimator?.isRunning()) {\n const fade = this.state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n const offset = this.state.gradientAnimator.getOffset() % 1;\n // Inverted phase (+ PI), range 0.65-0.95\n const animBrightness = 0.65 + 0.3 * (0.5 + 0.5 * Math.sin(offset * Math.PI * 2 + Math.PI));\n // Interpolate toward idle (0.9) as fade progresses\n badgeBrightness = animBrightness + (0.9 - animBrightness) * fade;\n }\n }\n const [mr, mg, mb] = [\n Math.floor(mcr * badgeBrightness),\n Math.floor(mcg * badgeBrightness),\n Math.floor(mcb * badgeBrightness),\n ];\n modeBadge = chalk.bgRgb(mr, mg, mb).hex(mastra.bg).bold(` ${badgeName.toLowerCase()} `);\n modeBadgeWidth = badgeName.length + 2;\n } else if (badgeName) {\n modeBadge = fg('dim', badgeName) + ' ';\n modeBadgeWidth = badgeName.length + 1;\n }\n\n // --- Update editor border to match mode color (not OM color) ---\n if (mainModeColor) {\n const [br, bg, bb] = [\n parseInt(mainModeColor.slice(1, 3), 16),\n parseInt(mainModeColor.slice(3, 5), 16),\n parseInt(mainModeColor.slice(5, 7), 16),\n ];\n const dim = 0.35;\n this.state.editor.borderColor = (text: string) =>\n chalk.rgb(Math.floor(br * dim), Math.floor(bg * dim), Math.floor(bb * dim))(text);\n }\n\n // --- Collect raw data ---\n // Show OM model when observing/reflecting, otherwise main model\n const fullModelId = showOMMode\n ? isObserving\n ? this.state.harness.getObserverModelId()\n : this.state.harness.getReflectorModelId()\n : this.state.harness.getFullModelId();\n // e.g. \"anthropic/claude-sonnet-4-20250514\" → \"claude-sonnet-4-20250514\"\n const shortModelId = fullModelId.includes('/') ? fullModelId.slice(fullModelId.indexOf('/') + 1) : fullModelId;\n // e.g. \"claude-opus-4-6\" → \"opus 4.6\", \"claude-sonnet-4-20250514\" → \"sonnet-4-20250514\"\n const tinyModelId = shortModelId.replace(/^claude-/, '').replace(/^(\\w+)-(\\d+)-(\\d{1,2})$/, '$1 $2.$3');\n\n const homedir = process.env.HOME || process.env.USERPROFILE || '';\n let displayPath = this.state.projectInfo.rootPath;\n if (homedir && displayPath.startsWith(homedir)) {\n displayPath = '~' + displayPath.slice(homedir.length);\n }\n if (this.state.projectInfo.gitBranch) {\n displayPath = `${displayPath} (${this.state.projectInfo.gitBranch})`;\n }\n\n // --- Helper to style the model ID ---\n const isYolo = (this.state.harness.getState() as any).yolo === true;\n const styleModelId = (id: string): string => {\n if (!this.state.modelAuthStatus.hasAuth) {\n const envVar = this.state.modelAuthStatus.apiKeyEnvVar;\n return fg('dim', id) + fg('error', ' ✗') + fg('muted', envVar ? ` (${envVar})` : ' (no key)');\n }\n // Tinted near-black background from mode color\n const tintBg = modeColor ? tintHex(modeColor, 0.15) : undefined;\n const padded = ` ${id} `;\n\n if (this.state.gradientAnimator?.isRunning() && modeColor) {\n const fade = this.state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n // During active or fade-out: interpolate gradient toward idle color\n const text = applyGradientSweep(\n padded,\n this.state.gradientAnimator.getOffset(),\n modeColor,\n fade, // pass fade progress to flatten the gradient\n );\n return tintBg ? chalk.bgHex(tintBg)(text) : text;\n }\n }\n if (modeColor) {\n // Idle state\n const [r, g, b] = [\n parseInt(modeColor.slice(1, 3), 16),\n parseInt(modeColor.slice(3, 5), 16),\n parseInt(modeColor.slice(5, 7), 16),\n ];\n const dim = 0.8;\n const fg = chalk.rgb(Math.floor(r * dim), Math.floor(g * dim), Math.floor(b * dim)).bold(padded);\n return tintBg ? chalk.bgHex(tintBg)(fg) : fg;\n }\n return chalk.hex(mastra.specialGray).bold(id);\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 (this.state.gradientAnimator?.isRunning()) {\n const fade = this.state.gradientAnimator.getFadeProgress();\n if (fade < 1) {\n const offset = this.state.gradientAnimator.getOffset() % 1;\n const animBrightness = 0.65 + 0.3 * (0.5 + 0.5 * Math.sin(offset * Math.PI * 2 + Math.PI));\n sBadgeBrightness = animBrightness + (0.9 - animBrightness) * fade;\n }\n }\n const [sr, sg, sb] = [\n Math.floor(mcr * sBadgeBrightness),\n Math.floor(mcg * sBadgeBrightness),\n Math.floor(mcb * sBadgeBrightness),\n ];\n shortModeBadge = chalk.bgRgb(sr, sg, sb).hex(mastra.bg).bold(` ${shortName} `);\n shortModeBadgeWidth = shortName.length + 2;\n } else if (badgeName) {\n const shortName = badgeName.toLowerCase().charAt(0);\n shortModeBadge = fg('dim', shortName) + ' ';\n shortModeBadgeWidth = shortName.length + 1;\n }\n\n const buildLine = (opts: {\n modelId: string;\n memCompact?: 'percentOnly' | 'noBuffer' | 'full';\n showDir: boolean;\n badge?: 'full' | 'short';\n }): { plain: string; styled: string } | null => {\n const parts: Array<{ plain: string; styled: string }> = [];\n // Model ID (always present) — styleModelId adds padding spaces\n // When YOLO, append ⚒ box flush (no SEP gap)\n if (isYolo && modeColor) {\n const yBox = chalk.bgHex(tintHex(modeColor, 0.25)).hex(tintHex(modeColor, 0.9)).bold(' ⚒ ');\n parts.push({\n plain: ` ${opts.modelId} ⚒ `,\n styled: styleModelId(opts.modelId) + yBox,\n });\n } else {\n parts.push({\n plain: ` ${opts.modelId} `,\n styled: styleModelId(opts.modelId),\n });\n }\n const useBadge = opts.badge === 'short' ? shortModeBadge : modeBadge;\n const useBadgeWidth = opts.badge === 'short' ? shortModeBadgeWidth : modeBadgeWidth;\n // Memory info — animate label text when buffering is active\n const msgLabelStyler =\n this.state.bufferingMessages && this.state.gradientAnimator?.isRunning()\n ? (label: string) =>\n applyGradientSweep(\n label,\n this.state.gradientAnimator!.getOffset(),\n OBSERVER_COLOR,\n this.state.gradientAnimator!.getFadeProgress(),\n )\n : undefined;\n const obsLabelStyler =\n this.state.bufferingObservations && this.state.gradientAnimator?.isRunning()\n ? (label: string) =>\n applyGradientSweep(\n label,\n this.state.gradientAnimator!.getOffset(),\n REFLECTOR_COLOR,\n this.state.gradientAnimator!.getFadeProgress(),\n )\n : undefined;\n const obs = formatObservationStatus(this.state.omProgress, opts.memCompact, msgLabelStyler);\n const ref = formatReflectionStatus(this.state.omProgress, 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 // Directory (lowest priority on line 1)\n if (opts.showDir) {\n parts.push({\n plain: displayPath,\n styled: fg('dim', displayPath),\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 > termWidth) return null;\n\n let styledLine: string;\n if (opts.showDir && 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(\n (sum, p, i) => sum + visibleWidth(p.plain) + (i > 0 ? SEP.length : 0),\n 0,\n );\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 (opts.showDir && 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 + fractions + buffer + dir\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: true }) ??\n // 2. Drop directory\n buildLine({ modelId: fullModelId, memCompact: 'full', showDir: false }) ??\n // 3. Drop provider + \"claude-\" prefix, keep full labels + fractions + buffer\n buildLine({ modelId: tinyModelId, memCompact: 'full', showDir: false }) ??\n // 4. Short labels (msg/mem) + fractions + buffer\n buildLine({ modelId: tinyModelId, showDir: false }) ??\n // 5. Short badge + short labels + fractions + buffer\n buildLine({ modelId: tinyModelId, showDir: false, badge: 'short' }) ??\n // 6. Short badge + fractions (drop buffer indicator)\n buildLine({\n modelId: tinyModelId,\n memCompact: 'noBuffer',\n showDir: false,\n badge: 'short',\n }) ??\n // 7. Full badge + percent only\n buildLine({\n modelId: tinyModelId,\n memCompact: 'percentOnly',\n showDir: false,\n }) ??\n // 8. Short badge + percent only\n buildLine({\n modelId: tinyModelId,\n memCompact: 'percentOnly',\n showDir: false,\n badge: 'short',\n });\n\n this.state.statusLine.setText(\n result?.styled ??\n shortModeBadge +\n styleModelId(tinyModelId) +\n (isYolo && modeColor ? chalk.bgHex(tintHex(modeColor, 0.25)).hex(tintHex(modeColor, 0.9)).bold(' ⚒ ') : ''),\n );\n\n // Line 2: hidden — dir only shows on line 1 when it fits\n if (this.state.memoryStatusLine) {\n this.state.memoryStatusLine.setText('');\n }\n\n this.state.ui.requestRender();\n }\n\n private async refreshModelAuthStatus(): Promise<void> {\n this.state.modelAuthStatus = await this.state.harness.getCurrentModelAuthStatus();\n this.updateStatusLine();\n }\n\n private setupAutocomplete(): void {\n const slashCommands: SlashCommand[] = [\n { name: 'new', description: 'Start a new thread' },\n { name: 'threads', description: 'Switch between threads' },\n { name: 'models', description: 'Configure model (global/thread/mode)' },\n { name: 'subagents', description: 'Configure subagent model defaults' },\n { name: 'om', description: 'Configure Observational Memory models' },\n { name: 'think', description: 'Set thinking level (Anthropic)' },\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: '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 = this.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\n for (const customCmd of this.state.customSlashCommands) {\n // Prefix with extra / to distinguish from built-in commands (//command-name)\n slashCommands.push({\n name: `/${customCmd.name}`,\n description: customCmd.description || `Custom: ${customCmd.name}`,\n });\n }\n\n this.state.autocompleteProvider = new CombinedAutocompleteProvider(slashCommands, process.cwd());\n this.state.editor.setAutocompleteProvider(this.state.autocompleteProvider);\n }\n /**\n * Load custom slash commands from all sources:\n * - Global: ~/.opencode/command, ~/.claude/commands, and ~/.mastracode/commands\n * - Local: .opencode/command, .claude/commands, and .mastracode/commands\n */\n private async loadCustomSlashCommands(): 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, SlashCommandMetadata>();\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 this.state.customSlashCommands = Array.from(commandMap.values());\n } catch {\n this.state.customSlashCommands = [];\n }\n }\n\n private setupKeyHandlers(): 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 - this.state.lastCtrlCTime < MastraTUI.DOUBLE_CTRL_C_MS) {\n this.stop();\n process.exit(0);\n }\n this.state.lastCtrlCTime = now;\n if (this.state.pendingApprovalDismiss) {\n this.state.pendingApprovalDismiss();\n }\n this.state.userInitiatedAbort = true;\n this.state.harness.abort();\n });\n\n // Use onDebug callback for Shift+Ctrl+D\n this.state.ui.onDebug = () => {\n // Toggle debug mode or show debug info\n // Currently unused - could add debug panel in future\n };\n }\n\n private setupEditorSubmitHandler(): void {\n // The editor's onSubmit is handled via getUserInput promise\n }\n\n private subscribeToHarness(): void {\n const listener: HarnessEventListener = async event => {\n await this.handleEvent(event);\n };\n this.state.unsubscribe = this.state.harness.subscribe(listener);\n }\n\n private updateTerminalTitle(): void {\n const appName = this.state.options.appName || 'Mastra Code';\n const cwd = process.cwd().split('/').pop() || '';\n this.state.ui.terminal.setTitle(`${appName} - ${cwd}`);\n }\n\n // ===========================================================================\n // Event Handling\n // ===========================================================================\n\n private async handleEvent(event: HarnessEvent): Promise<void> {\n switch (event.type) {\n case 'agent_start':\n this.handleAgentStart();\n break;\n\n case 'agent_end':\n if (event.reason === 'aborted') {\n this.handleAgentAborted();\n } else if (event.reason === 'error') {\n this.handleAgentError();\n } else {\n this.handleAgentEnd();\n }\n break;\n\n case 'message_start':\n this.handleMessageStart(event.message);\n break;\n\n case 'message_update':\n this.handleMessageUpdate(event.message);\n break;\n\n case 'message_end':\n this.handleMessageEnd(event.message);\n break;\n case 'tool_start':\n this.handleToolStart(event.toolCallId, event.toolName, event.args);\n break;\n\n case 'tool_approval_required':\n this.handleToolApprovalRequired(event.toolCallId, event.toolName, event.args);\n break;\n\n case 'tool_update':\n this.handleToolUpdate(event.toolCallId, event.partialResult);\n break;\n\n case 'shell_output':\n this.handleShellOutput(event.toolCallId, event.output, event.stream);\n break;\n\n case 'tool_input_start':\n this.handleToolInputStart(event.toolCallId, event.toolName);\n break;\n\n case 'tool_input_delta':\n this.handleToolInputDelta(event.toolCallId, event.argsTextDelta);\n break;\n\n case 'tool_input_end':\n this.handleToolInputEnd(event.toolCallId);\n break;\n\n case 'tool_end':\n this.handleToolEnd(event.toolCallId, event.result, event.isError);\n break;\n case 'info':\n this.showInfo(event.message);\n break;\n\n case 'error':\n this.showFormattedError(event);\n break;\n\n case 'mode_changed': {\n // Mode is already visible in status line, no need to log it\n await this.refreshModelAuthStatus();\n break;\n }\n\n case 'model_changed':\n // Update status line to reflect new model and auth status\n await this.refreshModelAuthStatus();\n break;\n\n case 'thread_changed': {\n this.showInfo(`Switched to thread: ${event.threadId}`);\n this.resetStatusLineState();\n await this.renderExistingMessages();\n await this.state.harness.loadOMProgress();\n this.syncOMThresholdsFromHarness();\n this.state.tokenUsage = this.state.harness.getTokenUsage();\n this.updateStatusLine();\n // Restore tasks from thread state\n const threadState = this.state.harness.getState() as {\n tasks?: TaskItem[];\n };\n if (this.state.taskProgress) {\n this.state.taskProgress.updateTasks(threadState.tasks ?? []);\n this.state.ui.requestRender();\n }\n break;\n }\n case 'thread_created': {\n this.showInfo(`Created thread: ${event.thread.id}`);\n // Sync inherited resource-level settings\n const tState = this.state.harness.getState() as any;\n if (typeof tState?.escapeAsCancel === 'boolean') {\n this.state.editor.escapeEnabled = tState.escapeAsCancel;\n }\n // Clear stale tasks from the previous thread\n if (this.state.taskProgress) {\n this.state.taskProgress.updateTasks([]);\n }\n this.state.previousTasks = [];\n this.state.taskWriteInsertIndex = -1;\n this.updateStatusLine();\n break;\n }\n\n case 'usage_update':\n this.handleUsageUpdate(event.usage);\n break;\n // Observational Memory events\n case 'om_status':\n this.handleOMStatus(event);\n break;\n\n case 'om_observation_start':\n this.handleOMObservationStart(event.cycleId, event.tokensToObserve);\n break;\n case 'om_observation_end':\n this.handleOMObservationEnd(\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 this.handleOMFailed(event.cycleId, event.error, 'observation');\n break;\n\n case 'om_reflection_start':\n this.handleOMReflectionStart(event.cycleId, event.tokensToReflect);\n break;\n case 'om_reflection_end':\n this.handleOMReflectionEnd(event.cycleId, event.durationMs, event.compressedTokens, event.observations);\n break;\n case 'om_reflection_failed':\n this.handleOMFailed(event.cycleId, event.error, 'reflection');\n break;\n // Buffering lifecycle\n case 'om_buffering_start':\n if (event.operationType === 'observation') {\n this.state.bufferingMessages = true;\n } else {\n this.state.bufferingObservations = true;\n }\n this.state.activeActivationMarker = undefined;\n this.state.activeBufferingMarker = new OMMarkerComponent({\n type: 'om_buffering_start',\n operationType: event.operationType,\n tokensToBuffer: event.tokensToBuffer,\n });\n this.addOMMarkerToChat(this.state.activeBufferingMarker);\n this.updateStatusLine();\n this.state.ui.requestRender();\n break;\n case 'om_buffering_end':\n if (event.operationType === 'observation') {\n this.state.bufferingMessages = false;\n } else {\n this.state.bufferingObservations = false;\n }\n if (this.state.activeBufferingMarker) {\n this.state.activeBufferingMarker.update({\n type: 'om_buffering_end',\n operationType: event.operationType,\n tokensBuffered: event.tokensBuffered,\n bufferedTokens: event.bufferedTokens,\n observations: event.observations,\n });\n }\n this.state.activeBufferingMarker = undefined;\n this.updateStatusLine();\n this.state.ui.requestRender();\n break;\n\n case 'om_buffering_failed':\n if (event.operationType === 'observation') {\n this.state.bufferingMessages = false;\n } else {\n this.state.bufferingObservations = false;\n }\n if (this.state.activeBufferingMarker) {\n this.state.activeBufferingMarker.update({\n type: 'om_buffering_failed',\n operationType: event.operationType,\n error: event.error,\n });\n }\n this.state.activeBufferingMarker = undefined;\n this.updateStatusLine();\n this.state.ui.requestRender();\n break;\n case 'om_activation':\n if (event.operationType === 'observation') {\n this.state.bufferingMessages = false;\n } else {\n this.state.bufferingObservations = false;\n }\n const activationData: OMMarkerData = {\n type: 'om_activation',\n operationType: event.operationType,\n tokensActivated: event.tokensActivated,\n observationTokens: event.observationTokens,\n };\n this.state.activeActivationMarker = new OMMarkerComponent(activationData);\n this.addOMMarkerToChat(this.state.activeActivationMarker);\n this.state.activeBufferingMarker = undefined;\n this.updateStatusLine();\n this.state.ui.requestRender();\n break;\n\n case 'follow_up_queued': {\n const totalPending = (event.count as number) + this.state.pendingSlashCommands.length;\n this.showInfo(`Follow-up queued (${totalPending} pending)`);\n break;\n }\n\n case 'workspace_ready':\n // Workspace initialized successfully - silent unless verbose\n break;\n\n case 'workspace_error':\n this.showError(`Workspace: ${event.error.message}`);\n break;\n\n case 'workspace_status_changed':\n if (event.status === 'error' && event.error) {\n this.showError(`Workspace: ${event.error.message}`);\n }\n break;\n\n // Subagent / Task delegation events\n case 'subagent_start':\n this.handleSubagentStart(event.toolCallId, event.agentType, event.task, event.modelId);\n break;\n\n case 'subagent_tool_start':\n this.handleSubagentToolStart(event.toolCallId, event.subToolName, event.subToolArgs);\n break;\n\n case 'subagent_tool_end':\n this.handleSubagentToolEnd(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 this.handleSubagentEnd(event.toolCallId, event.isError, event.durationMs, event.result);\n break;\n\n case 'task_updated': {\n const tasks = event.tasks as TaskItem[];\n if (this.state.taskProgress) {\n this.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 = this.state.allToolComponents.length - 1; i >= 0; i--) {\n const comp = this.state.allToolComponents[i];\n if ((comp as any).toolName === 'task_write') {\n insertIndex = this.state.chatContainer.children.indexOf(comp as any);\n this.state.chatContainer.removeChild(comp as any);\n this.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 && this.state.taskWriteInsertIndex >= 0) {\n insertIndex = this.state.taskWriteInsertIndex;\n this.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 this.renderCompletedTasksInline(tasks, insertIndex, true);\n } else if (this.state.previousTasks.length > 0 && (!tasks || tasks.length === 0)) {\n // Tasks were cleared\n this.renderClearedTasksInline(this.state.previousTasks, insertIndex);\n }\n\n // Track for next diff\n this.state.previousTasks = tasks ? [...tasks] : [];\n\n this.state.ui.requestRender();\n }\n break;\n }\n\n case 'ask_question':\n await this.handleAskQuestion(event.questionId, event.question, event.options);\n break;\n\n case 'sandbox_access_request':\n await this.handleSandboxAccessRequest(event.questionId, event.path, event.reason);\n break;\n\n case 'plan_approval_required':\n await this.handlePlanApproval(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 }\n\n private handleUsageUpdate(usage: TokenUsage): void {\n // Accumulate token usage\n this.state.tokenUsage.promptTokens += usage.promptTokens;\n this.state.tokenUsage.completionTokens += usage.completionTokens;\n this.state.tokenUsage.totalTokens += usage.totalTokens;\n this.updateStatusLine();\n }\n\n // ===========================================================================\n // Status Line Reset\n // ===========================================================================\n\n /**\n * Sync omProgress thresholds from harness state (thread metadata).\n * Called after thread load to pick up per-thread threshold overrides.\n */\n private syncOMThresholdsFromHarness(): void {\n const obsThreshold = this.state.harness.getObservationThreshold();\n const refThreshold = this.state.harness.getReflectionThreshold();\n this.state.omProgress.threshold = obsThreshold;\n this.state.omProgress.thresholdPercent =\n obsThreshold > 0 ? (this.state.omProgress.pendingTokens / obsThreshold) * 100 : 0;\n this.state.omProgress.reflectionThreshold = refThreshold;\n this.state.omProgress.reflectionThresholdPercent =\n refThreshold > 0 ? (this.state.omProgress.observationTokens / refThreshold) * 100 : 0;\n this.updateStatusLine();\n }\n private resetStatusLineState(): void {\n const prev = this.state.omProgress;\n this.state.omProgress = {\n ...defaultOMProgressState(),\n // Preserve thresholds across resets\n threshold: prev.threshold,\n reflectionThreshold: prev.reflectionThreshold,\n };\n this.state.tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n this.state.bufferingMessages = false;\n this.state.bufferingObservations = false;\n this.updateStatusLine();\n }\n\n // ===========================================================================\n // Observational Memory Event Handlers\n // ===========================================================================\n\n /**\n * Add an OM marker to the chat container, inserting it *before* the\n * current streaming component so it doesn't get pushed down as text\n * streams in. Falls back to a normal append when nothing is streaming.\n */\n private addOMMarkerToChat(marker: OMMarkerComponent): void {\n if (this.state.streamingComponent) {\n const idx = this.state.chatContainer.children.indexOf(this.state.streamingComponent);\n if (idx >= 0) {\n this.state.chatContainer.children.splice(idx, 0, marker);\n this.state.chatContainer.invalidate();\n return;\n }\n }\n this.state.chatContainer.addChild(marker);\n }\n\n private addOMOutputToChat(output: OMOutputComponent): void {\n if (this.state.streamingComponent) {\n const idx = this.state.chatContainer.children.indexOf(this.state.streamingComponent);\n if (idx >= 0) {\n this.state.chatContainer.children.splice(idx, 0, output);\n this.state.chatContainer.invalidate();\n return;\n }\n }\n this.state.chatContainer.addChild(output);\n }\n private handleOMStatus(event: Extract<HarnessEvent, { type: 'om_status' }>): void {\n const { windows, generationCount, stepNumber } = event;\n const { active, buffered } = windows;\n\n // Update active window state\n this.state.omProgress.pendingTokens = active.messages.tokens;\n this.state.omProgress.threshold = active.messages.threshold;\n this.state.omProgress.thresholdPercent =\n active.messages.threshold > 0 ? (active.messages.tokens / active.messages.threshold) * 100 : 0;\n this.state.omProgress.observationTokens = active.observations.tokens;\n this.state.omProgress.reflectionThreshold = active.observations.threshold;\n this.state.omProgress.reflectionThresholdPercent =\n active.observations.threshold > 0 ? (active.observations.tokens / active.observations.threshold) * 100 : 0;\n\n // Update buffered state\n this.state.omProgress.buffered = {\n observations: { ...buffered.observations },\n reflection: { ...buffered.reflection },\n };\n this.state.omProgress.generationCount = generationCount;\n this.state.omProgress.stepNumber = stepNumber;\n\n // Drive buffering animation from status fields\n this.state.bufferingMessages = buffered.observations.status === 'running';\n this.state.bufferingObservations = buffered.reflection.status === 'running';\n\n this.updateStatusLine();\n }\n\n private handleOMObservationStart(cycleId: string, tokensToObserve: number): void {\n this.state.omProgress.status = 'observing';\n this.state.omProgress.cycleId = cycleId;\n this.state.omProgress.startTime = Date.now();\n // Show in-progress marker in chat\n this.state.activeOMMarker = new OMMarkerComponent({\n type: 'om_observation_start',\n tokensToObserve,\n operationType: 'observation',\n });\n this.addOMMarkerToChat(this.state.activeOMMarker);\n this.updateStatusLine();\n this.state.ui.requestRender();\n }\n private handleOMObservationEnd(\n _cycleId: string,\n durationMs: number,\n tokensObserved: number,\n observationTokens: number,\n observations?: string,\n currentTask?: string,\n suggestedResponse?: string,\n ): void {\n this.state.omProgress.status = 'idle';\n this.state.omProgress.cycleId = undefined;\n this.state.omProgress.startTime = undefined;\n this.state.omProgress.observationTokens = observationTokens;\n // Messages have been observed — reset pending tokens\n this.state.omProgress.pendingTokens = 0;\n this.state.omProgress.thresholdPercent = 0;\n // Remove in-progress marker — the output box replaces it\n if (this.state.activeOMMarker) {\n const idx = this.state.chatContainer.children.indexOf(this.state.activeOMMarker);\n if (idx >= 0) {\n this.state.chatContainer.children.splice(idx, 1);\n this.state.chatContainer.invalidate();\n }\n this.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 this.addOMOutputToChat(outputComponent);\n this.updateStatusLine();\n this.state.ui.requestRender();\n }\n\n private handleOMReflectionStart(cycleId: string, tokensToReflect: number): void {\n this.state.omProgress.status = 'reflecting';\n this.state.omProgress.cycleId = cycleId;\n this.state.omProgress.startTime = Date.now();\n // Update observation tokens to show the total being reflected\n this.state.omProgress.observationTokens = tokensToReflect;\n this.state.omProgress.reflectionThresholdPercent =\n this.state.omProgress.reflectionThreshold > 0\n ? (tokensToReflect / this.state.omProgress.reflectionThreshold) * 100\n : 0;\n // Show in-progress marker in chat\n this.state.activeOMMarker = new OMMarkerComponent({\n type: 'om_observation_start',\n tokensToObserve: tokensToReflect,\n operationType: 'reflection',\n });\n this.addOMMarkerToChat(this.state.activeOMMarker);\n this.updateStatusLine();\n this.state.ui.requestRender();\n }\n private handleOMReflectionEnd(\n _cycleId: string,\n durationMs: number,\n compressedTokens: number,\n observations?: string,\n ): void {\n // Capture the pre-compression observation tokens for the marker display\n const preCompressionTokens = this.state.omProgress.observationTokens;\n this.state.omProgress.status = 'idle';\n this.state.omProgress.cycleId = undefined;\n this.state.omProgress.startTime = undefined;\n // Observations were compressed — update token count\n this.state.omProgress.observationTokens = compressedTokens;\n this.state.omProgress.reflectionThresholdPercent =\n this.state.omProgress.reflectionThreshold > 0\n ? (compressedTokens / this.state.omProgress.reflectionThreshold) * 100\n : 0;\n // Remove in-progress marker — the output box replaces it\n if (this.state.activeOMMarker) {\n const idx = this.state.chatContainer.children.indexOf(this.state.activeOMMarker);\n if (idx >= 0) {\n this.state.chatContainer.children.splice(idx, 1);\n this.state.chatContainer.invalidate();\n }\n this.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 tokensObserved: preCompressionTokens,\n });\n this.addOMOutputToChat(outputComponent);\n // Revert spinner to \"Working...\"\n this.updateLoaderText('Working...');\n this.state.ui.requestRender();\n this.updateStatusLine();\n }\n\n private handleOMFailed(_cycleId: string, error: string, operation: 'observation' | 'reflection'): void {\n this.state.omProgress.status = 'idle';\n this.state.omProgress.cycleId = undefined;\n this.state.omProgress.startTime = undefined;\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 (this.state.activeOMMarker) {\n this.state.activeOMMarker.update(failData);\n this.state.activeOMMarker = undefined;\n } else {\n this.addOMMarkerToChat(new OMMarkerComponent(failData));\n }\n this.updateStatusLine();\n this.state.ui.requestRender();\n }\n\n /** Update the loading animation text (e.g., \"Working...\" → \"Observing...\") */\n private updateLoaderText(_text: string): void {\n // Status text changes are now reflected via updateStatusLine gradient\n this.updateStatusLine();\n }\n\n private handleAgentStart(): void {\n this.state.isAgentActive = true;\n if (!this.state.gradientAnimator) {\n this.state.gradientAnimator = new GradientAnimator(() => {\n this.updateStatusLine();\n });\n }\n this.state.gradientAnimator.start();\n this.updateStatusLine();\n }\n private handleAgentEnd(): void {\n this.state.isAgentActive = false;\n if (this.state.gradientAnimator) {\n this.state.gradientAnimator.fadeOut();\n }\n this.updateStatusLine();\n\n if (this.state.streamingComponent) {\n this.state.streamingComponent = undefined;\n this.state.streamingMessage = undefined;\n }\n this.state.followUpComponents = [];\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n // Keep allToolComponents so Ctrl+E continues to work after agent completes\n\n this.notify('agent_done');\n\n // Drain queued slash commands once all harness-level follow-ups are done.\n // Each slash command that triggers sendMessage will start a new agent\n // operation, and handleAgentEnd will fire again to drain the next one.\n if (this.state.pendingSlashCommands.length > 0 && this.state.harness.getFollowUpCount() === 0) {\n const nextCommand = this.state.pendingSlashCommands.shift()!;\n this.handleSlashCommand(nextCommand).catch(error => {\n this.showError(error instanceof Error ? error.message : 'Queued slash command failed');\n });\n }\n }\n\n private handleAgentAborted(): void {\n this.state.isAgentActive = false;\n if (this.state.gradientAnimator) {\n this.state.gradientAnimator.fadeOut();\n }\n this.updateStatusLine();\n\n // Update streaming message to show it was interrupted\n if (this.state.streamingComponent && this.state.streamingMessage) {\n this.state.streamingMessage.stopReason = 'aborted';\n this.state.streamingMessage.errorMessage = 'Interrupted';\n this.state.streamingComponent.updateContent(this.state.streamingMessage);\n this.state.streamingComponent = undefined;\n this.state.streamingMessage = undefined;\n } else if (this.state.userInitiatedAbort) {\n // Show standalone \"Interrupted\" if user pressed Ctrl+C but no streaming component\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(new Text(theme.fg('error', 'Interrupted'), 1, 0));\n }\n this.state.userInitiatedAbort = false;\n\n this.state.followUpComponents = [];\n this.state.pendingSlashCommands = [];\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n // Keep allToolComponents so Ctrl+E continues to work after interruption\n this.state.ui.requestRender();\n }\n\n private handleAgentError(): void {\n this.state.isAgentActive = false;\n if (this.state.gradientAnimator) {\n this.state.gradientAnimator.fadeOut();\n }\n this.updateStatusLine();\n\n if (this.state.streamingComponent) {\n this.state.streamingComponent = undefined;\n this.state.streamingMessage = undefined;\n }\n\n this.state.followUpComponents = [];\n this.state.pendingSlashCommands = [];\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n // Keep allToolComponents so Ctrl+E continues to work after errors\n }\n\n private handleMessageStart(message: HarnessMessage): void {\n if (message.role === 'user') {\n this.addUserMessage(message);\n } else if (message.role === 'assistant') {\n // Clear tool component references when starting a new assistant message\n this.state.lastAskUserComponent = undefined;\n this.state.lastSubmitPlanComponent = undefined;\n if (!this.state.streamingComponent) {\n this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n this.state.streamingMessage = message;\n const trailingParts = this.getTrailingContentParts(message);\n this.state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n }\n this.state.ui.requestRender();\n }\n }\n\n private handleMessageUpdate(message: HarnessMessage): void {\n if (!this.state.streamingComponent || message.role !== 'assistant') return;\n\n this.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' && !this.state.subagentToolCallIds.has(content.id)) {\n this.state.seenToolCallIds.add(content.id);\n this.state.subagentToolCallIds.add(content.id);\n // Freeze current component with pre-subagent content\n const preContent = this.getContentBeforeToolCall(message, content.id);\n this.state.streamingComponent.updateContent({\n ...message,\n content: preContent,\n });\n this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n continue;\n }\n\n if (!this.state.seenToolCallIds.has(content.id)) {\n this.state.seenToolCallIds.add(content.id);\n\n this.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n content.name,\n content.args,\n { showImages: false, collapsedByDefault: !this.state.toolOutputExpanded },\n this.state.ui,\n );\n component.setExpanded(this.state.toolOutputExpanded);\n this.addChildBeforeFollowUps(component);\n this.state.pendingTools.set(content.id, component);\n this.state.allToolComponents.push(component);\n\n this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n } else {\n const component = this.state.pendingTools.get(content.id);\n if (component) {\n component.updateArgs(content.args);\n }\n }\n }\n }\n\n const trailingParts = this.getTrailingContentParts(message);\n this.state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n\n this.state.ui.requestRender();\n }\n\n /**\n * Get content parts after the last tool_call/tool_result in the message.\n * These are the parts that should be rendered in the current streaming component.\n */\n private getTrailingContentParts(message: HarnessMessage): HarnessMessage['content'] {\n let lastToolIndex = -1;\n for (let i = message.content.length - 1; i >= 0; i--) {\n const c = message.content[i]!;\n if (c.type === 'tool_call' || c.type === 'tool_result') {\n lastToolIndex = i;\n break;\n }\n }\n if (lastToolIndex === -1) {\n // No tool calls — return all content\n return message.content;\n }\n // Return everything after the last tool-related part\n return message.content.slice(lastToolIndex + 1);\n }\n /**\n * Get content parts between the last processed tool call and this one (text/thinking only).\n */\n private getContentBeforeToolCall(message: HarnessMessage, toolCallId: string): 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 && this.state.seenToolCallIds.has(c.id)) ||\n (c.type === 'tool_result' && 'id' in c && this.state.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\n private handleMessageEnd(message: HarnessMessage): void {\n if (message.role === 'user') return;\n\n if (this.state.streamingComponent && message.role === 'assistant') {\n this.state.streamingMessage = message;\n const trailingParts = this.getTrailingContentParts(message);\n this.state.streamingComponent.updateContent({\n ...message,\n content: trailingParts,\n });\n\n if (message.stopReason === 'aborted' || message.stopReason === 'error') {\n const errorMessage = message.errorMessage || 'Operation aborted';\n for (const [, component] of this.state.pendingTools) {\n component.updateResult({\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n });\n }\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n }\n\n this.state.streamingComponent = undefined;\n this.state.streamingMessage = undefined;\n this.state.seenToolCallIds.clear();\n this.state.subagentToolCallIds.clear();\n }\n this.state.ui.requestRender();\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 private handleToolApprovalRequired(toolCallId: string, toolName: string, args: unknown): void {\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 this.notify('tool_approval', `Approve ${toolName}?`);\n\n const dialog = new ToolApprovalDialogComponent({\n toolCallId,\n toolName,\n args,\n categoryLabel,\n onAction: (action: ApprovalAction) => {\n this.state.ui.hideOverlay();\n this.state.pendingApprovalDismiss = null;\n if (action.type === 'approve') {\n this.state.harness.respondToToolApproval({ decision: 'approve' });\n } else if (action.type === 'always_allow_category') {\n this.state.harness.respondToToolApproval({ decision: 'always_allow_category' });\n } else if (action.type === 'yolo') {\n this.state.harness.setState({ yolo: true } as any);\n this.state.harness.respondToToolApproval({ decision: 'approve' });\n this.updateStatusLine();\n } else {\n this.state.harness.respondToToolApproval({ decision: 'decline' });\n }\n },\n });\n\n // Set up Ctrl+C dismiss to decline\n this.state.pendingApprovalDismiss = () => {\n this.state.ui.hideOverlay();\n this.state.pendingApprovalDismiss = null;\n this.state.harness.respondToToolApproval({ decision: 'decline' });\n };\n\n // Show the dialog as an overlay\n this.state.ui.showOverlay(dialog, {\n width: '70%',\n anchor: 'center',\n });\n dialog.focused = true;\n this.state.ui.requestRender();\n }\n\n private handleToolStart(toolCallId: string, toolName: string, args: unknown): void {\n // Component may already exist if created early by handleToolInputStart\n const existingComponent = this.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 (!this.state.seenToolCallIds.has(toolCallId)) {\n this.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 this.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n toolName,\n args,\n { showImages: false, collapsedByDefault: !this.state.toolOutputExpanded },\n this.state.ui,\n );\n component.setExpanded(this.state.toolOutputExpanded);\n this.addChildBeforeFollowUps(component);\n this.state.pendingTools.set(toolCallId, component);\n this.state.allToolComponents.push(component);\n\n // Create a new post-tool AssistantMessageComponent so pre-tool text is preserved\n this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n\n this.state.ui.requestRender();\n }\n\n // Track ask_user tool components for inline question placement\n const component = this.state.pendingTools.get(toolCallId);\n if (component) {\n if (toolName === 'ask_user') {\n this.state.lastAskUserComponent = component;\n }\n // Track submit_plan tool components for inline plan approval placement\n if (toolName === 'submit_plan') {\n this.state.lastSubmitPlanComponent = component;\n }\n }\n\n // Track file-modifying tools for /diff command\n if (FILE_TOOLS.includes(toolName)) {\n const toolArgs = args as Record<string, unknown>;\n const filePath = toolArgs?.path as string;\n if (filePath) {\n this.state.pendingFileTools.set(toolCallId, { toolName, filePath });\n }\n }\n }\n\n private handleToolUpdate(toolCallId: string, partialResult: unknown): void {\n const component = this.state.pendingTools.get(toolCallId);\n if (component) {\n const result: ToolResult = {\n content: [{ type: 'text', text: this.formatToolResult(partialResult) }],\n isError: false,\n };\n component.updateResult(result, true);\n this.state.ui.requestRender();\n }\n }\n\n /**\n * Handle streaming shell output from execute_command tool.\n */\n private handleShellOutput(toolCallId: string, output: string, _stream: 'stdout' | 'stderr'): void {\n const component = this.state.pendingTools.get(toolCallId);\n if (component?.appendStreamingOutput) {\n component.appendStreamingOutput(output);\n this.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 */\n private handleToolInputStart(toolCallId: string, toolName: string): void {\n this.state.toolInputBuffers.set(toolCallId, { text: '', toolName });\n\n // Mark as seen so handleMessageUpdate doesn't create a duplicate component\n if (!this.state.seenToolCallIds.has(toolCallId)) {\n this.state.seenToolCallIds.add(toolCallId);\n }\n\n // Create the component early so deltas can update it\n // Skip for subagent (handled by SubagentExecutionComponent) and task_write (streams to pinned TaskProgressComponent)\n if (toolName === 'task_write') {\n // Record position so task_updated can place inline completed/cleared display here\n this.state.taskWriteInsertIndex = this.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 this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n this.state.ui.requestRender();\n } else if (toolName !== 'subagent') {\n this.addChildBeforeFollowUps(new Text('', 0, 0));\n const component = new ToolExecutionComponentEnhanced(\n toolName,\n {},\n { showImages: false, collapsedByDefault: !this.state.toolOutputExpanded },\n this.state.ui,\n );\n component.setExpanded(this.state.toolOutputExpanded);\n this.addChildBeforeFollowUps(component);\n this.state.pendingTools.set(toolCallId, component);\n this.state.allToolComponents.push(component);\n\n // Create a new post-tool AssistantMessageComponent so pre-tool text is preserved\n this.state.streamingComponent = new AssistantMessageComponent(\n undefined,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.addChildBeforeFollowUps(this.state.streamingComponent);\n\n this.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 */\n private handleToolInputDelta(toolCallId: string, argsTextDelta: string): void {\n const buffer = this.state.toolInputBuffers.get(toolCallId);\n if (buffer === undefined) return;\n\n buffer.text += argsTextDelta;\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 = this.state.pendingTools.get(toolCallId);\n if (component) {\n component.updateArgs(partialArgs);\n }\n\n // For task_write, stream partial tasks into the pinned TaskProgressComponent.\n // The last array item is actively being written so its content is unstable.\n // If all existing pinned items are already completed, the list is stable and\n // we can stream in new items immediately (including the last one).\n // Otherwise, exclude the last item to avoid jumpy partial-content matches.\n if (buffer.toolName === 'task_write' && this.state.taskProgress) {\n const tasks = (partialArgs as { tasks?: TaskItem[] }).tasks;\n if (tasks && tasks.length > 0) {\n const existing = this.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 this.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 this.state.taskProgress.updateTasks(merged);\n }\n }\n }\n\n this.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 */\n private handleToolInputEnd(toolCallId: string): void {\n this.state.toolInputBuffers.delete(toolCallId);\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 private async handleAskQuestion(\n questionId: string,\n question: string,\n options?: Array<{ label: string; description?: string }>,\n ): Promise<void> {\n return new Promise(resolve => {\n if (this.state.options.inlineQuestions) {\n // Inline mode: Add question component to chat\n const questionComponent = new AskQuestionInlineComponent(\n {\n question,\n options,\n onSubmit: answer => {\n this.state.activeInlineQuestion = undefined;\n this.state.harness.respondToQuestion({ questionId, answer });\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n this.state.harness.respondToQuestion({ questionId, answer: '(skipped)' });\n resolve();\n },\n },\n this.state.ui,\n );\n\n // Store as active question\n this.state.activeInlineQuestion = questionComponent;\n\n // Insert the question right after the ask_user tool component\n if (this.state.lastAskUserComponent) {\n // Find the position of the ask_user component\n const children = [...this.state.chatContainer.children];\n // Since lastAskUserComponent extends Container, it should be in children\n const askUserIndex = children.indexOf(this.state.lastAskUserComponent as any);\n\n if (askUserIndex >= 0) {\n // Debug: Log the positioning\n\n // Clear and rebuild with question in the right place\n this.state.chatContainer.clear();\n // Add all children up to and including the ask_user tool\n for (let i = 0; i <= askUserIndex; i++) {\n this.state.chatContainer.addChild(children[i]!);\n }\n\n // Add the question component with spacing\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(questionComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n\n // Add remaining children\n for (let i = askUserIndex + 1; i < children.length; i++) {\n this.state.chatContainer.addChild(children[i]!);\n }\n } else {\n // Fallback: add at the end\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(questionComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n }\n } else {\n // Fallback: add at the end if no ask_user component tracked\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(questionComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n }\n\n this.state.ui.requestRender();\n\n // Ensure the chat scrolls to show the question\n this.state.chatContainer.invalidate();\n\n // Focus the question component\n questionComponent.focused = true;\n } else {\n // Dialog mode: Show overlay\n const dialog = new AskQuestionDialogComponent({\n question,\n options,\n onSubmit: answer => {\n this.state.ui.hideOverlay();\n this.state.harness.respondToQuestion({ questionId, answer });\n resolve();\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n this.state.harness.respondToQuestion({ questionId, answer: '(skipped)' });\n resolve();\n },\n });\n this.state.ui.showOverlay(dialog, { width: '70%', anchor: 'center' });\n dialog.focused = true;\n }\n\n this.notify('ask_question', question);\n });\n }\n\n /**\n * Handle a sandbox_access_request event from the request_sandbox_access tool.\n * Shows an inline prompt for the user to approve or deny directory access.\n */\n private async handleSandboxAccessRequest(questionId: string, requestedPath: string, reason: string): Promise<void> {\n return new Promise(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Grant sandbox access to \"${requestedPath}\"?\\n${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 this.state.activeInlineQuestion = undefined;\n this.state.harness.respondToQuestion({ questionId, answer });\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n this.state.harness.respondToQuestion({ questionId, answer: 'No' });\n resolve();\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 this.state.ui,\n );\n\n // Store as active question so input routing works\n this.state.activeInlineQuestion = questionComponent;\n\n // Add to chat\n this.state.chatContainer.addChild(new Spacer(1));\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 this.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 */\n private async handlePlanApproval(planId: string, title: string, plan: string): Promise<void> {\n return new Promise(resolve => {\n const approvalComponent = new PlanApprovalInlineComponent(\n {\n planId,\n title,\n plan,\n onApprove: async () => {\n this.state.activeInlinePlanApproval = undefined;\n // Store the approved plan in harness state\n await this.state.harness.setState({\n activePlan: {\n title,\n plan,\n approvedAt: new Date().toISOString(),\n },\n });\n // Wait for plan approval to complete (switches mode, aborts stream)\n await this.state.harness.respondToPlanApproval({\n planId,\n response: { action: 'approved' },\n });\n this.updateStatusLine();\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 =\n '<system-reminder>The user has approved the plan, begin executing.</system-reminder>';\n this.addUserMessage({\n id: `system-${Date.now()}`,\n role: 'user',\n content: [{ type: 'text', text: reminderText }],\n createdAt: new Date(),\n });\n this.fireMessage(reminderText);\n }, 50);\n\n resolve();\n },\n onReject: async (feedback?: string) => {\n this.state.activeInlinePlanApproval = undefined;\n this.state.harness.respondToPlanApproval({\n planId,\n response: { action: 'rejected', feedback },\n });\n resolve();\n },\n },\n this.state.ui,\n );\n\n // Store as active plan approval\n this.state.activeInlinePlanApproval = approvalComponent;\n\n // Insert after the submit_plan tool component (same pattern as ask_user)\n if (this.state.lastSubmitPlanComponent) {\n const children = [...this.state.chatContainer.children];\n const submitPlanIndex = children.indexOf(this.state.lastSubmitPlanComponent as any);\n if (submitPlanIndex >= 0) {\n this.state.chatContainer.clear();\n for (let i = 0; i <= submitPlanIndex; i++) {\n this.state.chatContainer.addChild(children[i]!);\n }\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(approvalComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n for (let i = submitPlanIndex + 1; i < children.length; i++) {\n this.state.chatContainer.addChild(children[i]!);\n }\n } else {\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(approvalComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n }\n } else {\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(approvalComponent);\n this.state.chatContainer.addChild(new Spacer(1));\n }\n this.state.ui.requestRender();\n this.state.chatContainer.invalidate();\n approvalComponent.focused = true;\n\n this.notify('plan_approval', `Plan \"${title}\" requires approval`);\n });\n }\n private handleToolEnd(toolCallId: string, result: unknown, isError: boolean): void {\n // If this is a subagent tool, store the result in the SubagentExecutionComponent\n const subagentComponent = this.state.pendingSubagents.get(toolCallId);\n if (subagentComponent) {\n // The final result is available here\n const resultText = this.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 // Track successful file modifications for /diff command\n const pendingFile = this.state.pendingFileTools.get(toolCallId);\n if (pendingFile && !isError) {\n const existing = this.state.modifiedFiles.get(pendingFile.filePath);\n if (existing) {\n existing.operations.push(pendingFile.toolName);\n } else {\n this.state.modifiedFiles.set(pendingFile.filePath, {\n operations: [pendingFile.toolName],\n firstModified: new Date(),\n });\n }\n }\n this.state.pendingFileTools.delete(toolCallId);\n\n const component = this.state.pendingTools.get(toolCallId);\n if (component) {\n const toolResult: ToolResult = {\n content: [{ type: 'text', text: this.formatToolResult(result) }],\n isError,\n };\n component.updateResult(toolResult, false);\n\n this.state.pendingTools.delete(toolCallId);\n this.state.ui.requestRender();\n }\n }\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 */\n private formatToolResult(result: unknown): string {\n if (result === null || result === undefined) {\n return '';\n }\n if (typeof result === 'string') {\n return result;\n }\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n // Handle common tool return format: { content: \"...\", isError: boolean }\n if ('content' in obj && typeof obj.content === 'string') {\n return obj.content;\n }\n // Handle content array format: { content: [{ type: \"text\", text: \"...\" }] }\n if ('content' in obj && Array.isArray(obj.content)) {\n const textParts = obj.content\n .filter(\n (part: unknown) =>\n typeof part === 'object' && part !== null && (part as Record<string, unknown>).type === 'text',\n )\n .map((part: unknown) => (part as Record<string, unknown>).text || '');\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n }\n try {\n return JSON.stringify(result, null, 2);\n } catch {\n return String(result);\n }\n }\n return String(result);\n }\n\n /**\n * Render a completed task list inline in the chat history.\n * This mirrors the pinned TaskProgressComponent format but shows\n * all items as completed, since the pinned component hides itself\n * when everything is done.\n * @param tasks The completed task items\n * @param insertIndex Optional index to insert at (replaces tool component position)\n */\n private renderCompletedTasksInline(tasks: TaskItem[], insertIndex = -1, collapsed = false): void {\n const headerText = bold(fg('accent', 'Tasks')) + fg('dim', ` [${tasks.length}/${tasks.length} completed]`);\n\n const container = new Container();\n container.addChild(new Spacer(1));\n container.addChild(new Text(headerText, 0, 0));\n const MAX_VISIBLE = 4;\n const shouldCollapse = collapsed && tasks.length > MAX_VISIBLE + 1;\n const visible = shouldCollapse ? tasks.slice(0, MAX_VISIBLE) : tasks;\n const remaining = shouldCollapse ? tasks.length - MAX_VISIBLE : 0;\n\n for (const task of visible) {\n const icon = chalk.hex(mastra.green)('✓');\n const text = chalk.hex(mastra.green)(task.content);\n container.addChild(new Text(` ${icon} ${text}`, 0, 0));\n }\n if (remaining > 0) {\n container.addChild(\n new Text(\n fg('dim', ` ... ${remaining} more completed task${remaining > 1 ? 's' : ''} (ctrl+e to expand)`),\n 0,\n 0,\n ),\n );\n }\n\n if (insertIndex >= 0) {\n // Insert at the position where the task_write tool was\n this.state.chatContainer.children.splice(insertIndex, 0, container);\n this.state.chatContainer.invalidate();\n } else {\n // Fallback: append at end\n this.state.chatContainer.addChild(container);\n }\n }\n\n /**\n * Render inline display when tasks are cleared.\n * Shows what was cleared with strikethrough.\n */\n private renderClearedTasksInline(clearedTasks: TaskItem[], insertIndex = -1): void {\n const container = new Container();\n container.addChild(new Spacer(1));\n const count = clearedTasks.length;\n const label = count === 1 ? 'Task' : 'Tasks';\n container.addChild(new Text(fg('accent', `${label} cleared`), 0, 0));\n for (const task of clearedTasks) {\n const icon = task.status === 'completed' ? chalk.hex(mastra.green)('✓') : chalk.hex(mastra.darkGray)('○');\n const text = chalk.dim.strikethrough(task.content);\n container.addChild(new Text(` ${icon} ${text}`, 0, 0));\n }\n if (insertIndex >= 0) {\n this.state.chatContainer.children.splice(insertIndex, 0, container);\n this.state.chatContainer.invalidate();\n } else {\n this.state.chatContainer.addChild(container);\n }\n }\n // ===========================================================================\n // Subagent Events\n // ===========================================================================\n\n private handleSubagentStart(toolCallId: string, agentType: string, task: string, modelId?: string): void {\n // Create a dedicated rendering component for this subagent run\n const component = new SubagentExecutionComponent(agentType, task, this.state.ui, modelId);\n this.state.pendingSubagents.set(toolCallId, component);\n this.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 (this.state.streamingComponent) {\n const idx = this.state.chatContainer.children.indexOf(this.state.streamingComponent as any);\n if (idx >= 0) {\n (this.state.chatContainer.children as unknown[]).splice(idx, 0, component);\n this.state.chatContainer.invalidate();\n } else {\n this.state.chatContainer.addChild(component);\n }\n } else {\n this.state.chatContainer.addChild(component);\n }\n\n this.state.ui.requestRender();\n }\n\n private handleSubagentToolStart(toolCallId: string, subToolName: string, subToolArgs: unknown): void {\n const component = this.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.addToolStart(subToolName, subToolArgs);\n this.state.ui.requestRender();\n }\n }\n\n private handleSubagentToolEnd(\n toolCallId: string,\n subToolName: string,\n subToolResult: unknown,\n isError: boolean,\n ): void {\n const component = this.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.addToolEnd(subToolName, subToolResult, isError);\n this.state.ui.requestRender();\n }\n }\n\n private handleSubagentEnd(toolCallId: string, isError: boolean, durationMs: number, result?: string): void {\n const component = this.state.pendingSubagents.get(toolCallId);\n if (component) {\n component.finish(isError, durationMs, result);\n this.state.pendingSubagents.delete(toolCallId);\n this.state.ui.requestRender();\n }\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 resolve(text);\n };\n });\n }\n\n // ===========================================================================\n // Thread Selector\n // ===========================================================================\n\n private async showThreadSelector(): Promise<void> {\n const threads = await this.state.harness.listThreads({ allResources: true });\n const currentId = this.state.pendingNewThread ? null : this.state.harness.getCurrentThreadId();\n const currentResourceId = this.state.harness.getResourceId();\n\n if (threads.length === 0) {\n this.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: this.state.ui,\n threads,\n currentThreadId: currentId,\n currentResourceId,\n getMessagePreview: async (threadId: string) => {\n const firstUserMessage = await this.state.harness.getFirstUserMessageForThread({ threadId });\n if (firstUserMessage) {\n const text = this.extractTextContent(firstUserMessage);\n return this.truncatePreview(text);\n }\n return null;\n },\n onSelect: async thread => {\n this.state.ui.hideOverlay();\n\n if (thread.id === currentId) {\n resolve();\n return;\n }\n\n // If thread is from a different resource, switch resource first\n if (thread.resourceId !== currentResourceId) {\n this.state.harness.setResourceId({ resourceId: thread.resourceId });\n }\n try {\n await this.state.harness.switchThread({ threadId: thread.id });\n } catch (error) {\n if (error instanceof ThreadLockError) {\n this.showThreadLockPrompt(thread.title || thread.id, error.ownerPid);\n resolve();\n return;\n }\n throw error;\n }\n this.state.pendingNewThread = false;\n\n // Clear chat and render existing messages\n this.state.chatContainer.clear();\n this.state.allToolComponents = [];\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n await this.renderExistingMessages();\n this.updateStatusLine();\n\n this.showInfo(`Switched to: ${thread.title || thread.id}`);\n resolve();\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n resolve();\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 // Thread Tagging\n // ===========================================================================\n\n private async tagThreadWithDir(): Promise<void> {\n const threadId = this.state.harness.getCurrentThreadId();\n if (!threadId && this.state.pendingNewThread) {\n this.showInfo('No active thread yet — send a message first.');\n return;\n }\n if (!threadId) {\n this.showInfo('No active thread.');\n return;\n }\n\n const projectPath = (this.state.harness.getState() as any)?.projectPath as string | undefined;\n if (!projectPath) {\n this.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 ${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 this.state.activeInlineQuestion = undefined;\n if (answer.toLowerCase().startsWith('y')) {\n await this.state.harness.setThreadSetting({ key: 'projectPath', value: projectPath });\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 * Show an inline prompt when a thread is locked by another process.\n * User can create a new thread (y) or exit (n).\n */\n private showThreadLockPrompt(threadTitle: string, ownerPid: number): void {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: `Thread \"${threadTitle}\" is locked by pid ${ownerPid}. Create a new thread?`,\n options: [\n { label: 'Yes', description: 'Start a new thread' },\n { label: 'No', description: 'Exit' },\n ],\n formatResult: answer => (answer === 'Yes' ? 'Thread created' : 'Exiting.'),\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n if (answer.toLowerCase().startsWith('y')) {\n // pendingNewThread is already true — thread will be\n // created lazily on first message\n } else {\n process.exit(0);\n }\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n process.exit(0);\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 // Sandbox Management\n // ===========================================================================\n\n private async handleSandboxCommand(args: string[]): Promise<void> {\n const state = this.state.harness.getState() as {\n sandboxAllowedPaths?: string[];\n };\n const currentPaths = state.sandboxAllowedPaths ?? [];\n\n // If called with args, handle directly (e.g. /sandbox add /some/path)\n const subcommand = args[0]?.toLowerCase();\n if (subcommand === 'add' && args.length > 1) {\n await this.sandboxAddPath(args.slice(1).join(' ').trim());\n return;\n }\n if (subcommand === 'remove' && args.length > 1) {\n await this.sandboxRemovePath(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 const short = p.split('/').pop() || p;\n options.push({\n label: `Remove: ${short}`,\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 const short = answer.replace('Remove: ', '');\n return `Removed: ${short}`;\n }\n return answer;\n },\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n if (answer === 'Add path') {\n resolve();\n await this.showSandboxAddPrompt();\n } else if (answer.startsWith('Remove: ')) {\n const short = answer.replace('Remove: ', '');\n const fullPath = currentPaths.find(p => (p.split('/').pop() || p) === short);\n if (fullPath) {\n await this.sandboxRemovePath(fullPath, currentPaths);\n }\n resolve();\n } else {\n resolve();\n }\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 private async showSandboxAddPrompt(): Promise<void> {\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: 'Enter path to allow',\n formatResult: answer => {\n const resolved = path.resolve(answer);\n return `Added: ${resolved}`;\n },\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n await this.sandboxAddPath(answer);\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 private async sandboxAddPath(rawPath: string): Promise<void> {\n const state = this.state.harness.getState() as {\n sandboxAllowedPaths?: string[];\n };\n const currentPaths = state.sandboxAllowedPaths ?? [];\n const resolved = path.resolve(rawPath);\n\n if (currentPaths.includes(resolved)) {\n this.showInfo(`Path already allowed: ${resolved}`);\n return;\n }\n try {\n await fs.promises.access(resolved);\n } catch {\n this.showError(`Path does not exist: ${resolved}`);\n return;\n }\n const updated = [...currentPaths, resolved];\n this.state.harness.setState({ sandboxAllowedPaths: updated } as any);\n await this.state.harness.setThreadSetting({ key: 'sandboxAllowedPaths', value: updated });\n this.showInfo(`Added to sandbox: ${resolved}`);\n }\n\n private async sandboxRemovePath(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 this.showError(`Path not in allowed list: ${resolved}`);\n return;\n }\n const updated = currentPaths.filter(p => p !== match);\n this.state.harness.setState({ sandboxAllowedPaths: updated } as any);\n await this.state.harness.setThreadSetting({ key: 'sandboxAllowedPaths', value: updated });\n this.showInfo(`Removed from sandbox: ${match}`);\n }\n\n // ===========================================================================\n // Skills List\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 private async showSkillsList(): Promise<void> {\n const workspace = this.getResolvedWorkspace();\n if (!workspace?.skills) {\n this.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 ' ~/.mastracode/skills/ (global)\\n' +\n ' ~/.claude/skills/ (global)\\n\\n' +\n 'Each skill is a folder with a SKILL.md file.\\n' +\n 'Install skills: npx add-skill <github-url>',\n );\n return;\n }\n\n try {\n const skills = await workspace.skills!.list();\n\n if (skills.length === 0) {\n this.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 this.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 this.showError(`Failed to list skills: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // ===========================================================================\n // Model Selector\n // ===========================================================================\n\n /**\n * Show mode selector first, then scope (global/thread), then model list.\n * Flow: Mode → Scope → Model\n */\n private async showModelScopeSelector(): Promise<void> {\n const modes = this.state.harness.listModes();\n const currentMode = this.state.harness.getCurrentMode();\n\n // Sort modes with active mode first\n const sortedModes = [...modes].sort((a, b) => {\n if (a.id === currentMode?.id) return -1;\n if (b.id === currentMode?.id) return 1;\n return 0;\n });\n\n const modeOptions = sortedModes.map(mode => ({\n label: mode.name + (mode.id === currentMode?.id ? ' (active)' : ''),\n modeId: mode.id,\n modeName: mode.name,\n }));\n\n return new Promise<void>(resolve => {\n const questionComponent = new AskQuestionInlineComponent(\n {\n question: 'Select mode',\n options: modeOptions.map(m => ({ label: m.label })),\n formatResult: answer => {\n const mode = modeOptions.find(m => m.label === answer);\n return `Mode: ${mode?.modeName ?? answer}`;\n },\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n const selected = modeOptions.find(m => m.label === answer);\n if (selected?.modeId && selected?.modeName) {\n await this.showModelScopeThenList(selected.modeId, selected.modeName);\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 * Show scope selector (global/thread) for a specific mode, then model list.\n */\n private async showModelScopeThenList(modeId: string, modeName: string): Promise<void> {\n const scopes = [\n {\n label: 'Thread default',\n description: `Default for ${modeName} mode in this thread`,\n scope: 'thread' as const,\n },\n {\n label: 'Global default',\n description: `Default for ${modeName} mode 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 ${modeName}`,\n options: scopes.map(s => ({\n label: s.label,\n description: s.description,\n })),\n formatResult: answer => `${modeName} · ${answer}`,\n onSubmit: async answer => {\n this.state.activeInlineQuestion = undefined;\n const selected = scopes.find(s => s.label === answer);\n if (selected) {\n await this.showModelListForScope(selected.scope, modeId, modeName);\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 * Show the model list for a specific mode and scope.\n */\n private async showModelListForScope(scope: 'global' | 'thread', modeId: string, modeName: string): Promise<void> {\n const availableModels = await this.state.harness.listAvailableModels();\n\n if (availableModels.length === 0) {\n this.showInfo('No models available. Check your Mastra configuration.');\n return;\n }\n\n const currentModelId = this.state.harness.getCurrentModelId();\n const scopeLabel = scope === 'global' ? `${modeName} · Global` : `${modeName} · Thread`;\n\n return new Promise(resolve => {\n const selector = new ModelSelectorComponent({\n tui: this.state.ui,\n models: availableModels,\n currentModelId,\n title: `Select model (${scopeLabel})`,\n onSelect: async (model: ModelItem) => {\n this.state.ui.hideOverlay();\n await this.state.harness.switchModel({ modelId: model.id, scope, modeId });\n this.showInfo(`Model set for ${scopeLabel}: ${model.id}`);\n this.updateStatusLine();\n resolve();\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n resolve();\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 * Show agent type selector first, then scope (global/thread), then model list.\n * Flow: Agent Type → Scope → Model\n */\n private async showSubagentModelSelector(): Promise<void> {\n const agentTypes = [\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\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 this.state.activeInlineQuestion = undefined;\n const selected = agentTypes.find(t => t.label === answer);\n if (selected) {\n await this.showSubagentScopeThenList(selected.id, selected.label);\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 * Show scope selector (global/thread) for a specific agent type, then model list.\n */\n private async showSubagentScopeThenList(agentType: string, agentTypeLabel: string): 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 this.state.activeInlineQuestion = undefined;\n const selected = scopes.find(s => s.label === answer);\n if (selected) {\n await this.showSubagentModelListForScope(selected.scope, agentType, agentTypeLabel);\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 * Show the model list for subagent type and scope selection.\n */\n private async showSubagentModelListForScope(\n scope: 'global' | 'thread',\n agentType: string,\n agentTypeLabel: string,\n ): Promise<void> {\n const availableModels = await this.state.harness.listAvailableModels();\n\n if (availableModels.length === 0) {\n this.showInfo('No models available. Check your Mastra configuration.');\n return;\n }\n\n // Get current subagent model if set\n const currentSubagentModel = await this.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: this.state.ui,\n models: availableModels,\n currentModelId: currentSubagentModel ?? undefined,\n title: `Select subagent model (${scopeLabel})`,\n onSelect: async (model: ModelItem) => {\n this.state.ui.hideOverlay();\n await this.state.harness.setSubagentModelId({ modelId: model.id, agentType });\n if (scope === 'global') {\n if (this.state.authStorage) {\n this.state.authStorage.setSubagentModelId(model.id, agentType);\n this.showInfo(`Subagent model set for ${scopeLabel}: ${model.id}`);\n } else {\n this.showError('Cannot persist global preference: auth storage not configured');\n }\n } else {\n this.showInfo(`Subagent model set for ${scopeLabel}: ${model.id}`);\n }\n resolve();\n },\n onCancel: () => {\n this.state.ui.hideOverlay();\n resolve();\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 // Observational Memory Settings\n // ===========================================================================\n\n private async showOMSettings(): Promise<void> {\n // Get available models for the model submenus\n const availableModels = await this.state.harness.listAvailableModels();\n const modelOptions = availableModels.map(m => ({\n id: m.id,\n label: m.id,\n }));\n\n const config = {\n observerModelId: this.state.harness.getObserverModelId(),\n reflectorModelId: this.state.harness.getReflectorModelId(),\n observationThreshold: this.state.harness.getObservationThreshold(),\n reflectionThreshold: this.state.harness.getReflectionThreshold(),\n };\n\n return new Promise<void>(resolve => {\n const settings = new OMSettingsComponent(\n config,\n {\n onObserverModelChange: async modelId => {\n await this.state.harness.switchObserverModel({ modelId });\n this.showInfo(`Observer model → ${modelId}`);\n },\n onReflectorModelChange: async modelId => {\n await this.state.harness.switchReflectorModel({ modelId });\n this.showInfo(`Reflector model → ${modelId}`);\n },\n onObservationThresholdChange: value => {\n this.state.harness.setState({ observationThreshold: value } as any);\n this.state.omProgress.threshold = value;\n this.state.omProgress.thresholdPercent =\n value > 0 ? (this.state.omProgress.pendingTokens / value) * 100 : 0;\n this.updateStatusLine();\n },\n onReflectionThresholdChange: value => {\n this.state.harness.setState({ reflectionThreshold: value } as any);\n this.state.omProgress.reflectionThreshold = value;\n this.state.omProgress.reflectionThresholdPercent =\n value > 0 ? (this.state.omProgress.observationTokens / value) * 100 : 0;\n this.updateStatusLine();\n },\n onClose: () => {\n this.state.ui.hideOverlay();\n this.updateStatusLine();\n resolve();\n },\n },\n modelOptions,\n this.state.ui,\n );\n\n this.state.ui.showOverlay(settings, {\n width: '80%',\n maxHeight: '70%',\n anchor: 'center',\n });\n settings.focused = true;\n });\n }\n // ===========================================================================\n // General Settings\n // ===========================================================================\n private async showPermissions(): Promise<void> {\n const { TOOL_CATEGORIES, getToolsForCategory } = await import('../permissions.js');\n const rules = this.state.harness.getPermissionRules();\n const grants = this.state.harness.getSessionGrants();\n const isYolo = (this.state.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 this.showInfo(lines.join('\\n'));\n }\n\n private async showSettings(): Promise<void> {\n const state = this.state.harness.getState() as any;\n const config = {\n notifications: (state?.notifications ?? 'off') as NotificationMode,\n yolo: state?.yolo === true,\n thinkingLevel: (state?.thinkingLevel ?? 'off') as string,\n escapeAsCancel: this.state.editor.escapeEnabled,\n };\n\n return new Promise<void>(resolve => {\n const settings = new SettingsComponent(config, {\n onNotificationsChange: async mode => {\n await this.state.harness.setState({ notifications: mode });\n this.showInfo(`Notifications: ${mode}`);\n },\n onYoloChange: enabled => {\n this.state.harness.setState({ yolo: enabled } as any);\n this.updateStatusLine();\n },\n onThinkingLevelChange: async level => {\n await this.state.harness.setState({ thinkingLevel: level } as any);\n this.updateStatusLine();\n },\n onEscapeAsCancelChange: async enabled => {\n this.state.editor.escapeEnabled = enabled;\n await this.state.harness.setState({ escapeAsCancel: enabled });\n await this.state.harness.setThreadSetting({ key: 'escapeAsCancel', value: enabled });\n },\n onClose: () => {\n this.state.ui.hideOverlay();\n resolve();\n },\n });\n\n this.state.ui.showOverlay(settings, {\n width: '60%',\n maxHeight: '50%',\n anchor: 'center',\n });\n settings.focused = true;\n });\n }\n // ===========================================================================\n // Login Selector\n // ===========================================================================\n\n private async showLoginSelector(mode: 'login' | 'logout'): Promise<void> {\n const allProviders = getOAuthProviders();\n const loggedInIds = allProviders.filter(p => this.state.authStorage?.isLoggedIn(p.id)).map(p => p.id);\n\n if (mode === 'logout') {\n if (loggedInIds.length === 0) {\n this.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 this.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 this.state.activeInlineQuestion = undefined;\n const provider = providers.find(p => p.name === answer);\n if (provider) {\n if (mode === 'login') {\n await this.performLogin(provider.id);\n } else {\n if (this.state.authStorage) {\n this.state.authStorage.logout(provider.id);\n this.showInfo(`Logged out from ${provider.name}`);\n } else {\n this.showError('Auth storage not configured');\n }\n }\n }\n resolve();\n },\n onCancel: () => {\n this.state.activeInlineQuestion = undefined;\n resolve();\n },\n },\n this.state.ui,\n );\n\n this.state.activeInlineQuestion = questionComponent;\n this.state.chatContainer.addChild(new Spacer(1));\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 private 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 this.showError('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 this.showInfo(`Successfully logged in to ${providerName}`);\n } else if (message) {\n this.showInfo(message);\n }\n resolve();\n });\n\n // Show as overlay - same size as model selector\n this.state.ui.showOverlay(dialog, {\n width: '80%',\n maxHeight: '60%',\n anchor: 'center',\n });\n dialog.focused = true;\n\n this.state.authStorage\n .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 // Auto-switch to the provider's default model\n const defaultModel = this.state.authStorage?.getDefaultModelForProvider(providerId as any);\n if (defaultModel) {\n await this.state.harness.switchModel({ modelId: defaultModel });\n this.updateStatusLine();\n this.showInfo(`Logged in to ${providerName} - switched to ${defaultModel}`);\n } else {\n this.showInfo(`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 this.showError(`Failed to login: ${error.message}`);\n }\n resolve();\n });\n });\n }\n\n // ===========================================================================\n // Cost Tracking\n // ===========================================================================\n\n private async showCostBreakdown(): Promise<void> {\n // Format the breakdown\n const formatNumber = (n: number) => n.toLocaleString();\n\n // Get OM token usage if available\n let omTokensText = '';\n if (this.state.omProgress.observationTokens > 0) {\n omTokensText = `\n Memory: ${formatNumber(this.state.omProgress.observationTokens)} tokens`;\n }\n\n this.showInfo(`Token Usage (Current Thread):\n Input: ${formatNumber(this.state.tokenUsage.promptTokens)} tokens\n Output: ${formatNumber(this.state.tokenUsage.completionTokens)} tokens${omTokensText}\n ─────────────────────────────────────────\n Total: ${formatNumber(this.state.tokenUsage.totalTokens)} tokens\n \n Note: For cost estimates, check your provider's pricing page.`);\n }\n\n // ===========================================================================\n // Slash Commands\n // ===========================================================================\n\n private async handleSlashCommand(input: string): Promise<boolean> {\n const trimmedInput = input.trim();\n\n // Strip leading slashes — pi-tui may pass /command or command depending\n // on how the user invoked it. Try custom commands first, then built-in.\n const withoutSlashes = trimmedInput.replace(/^\\/+/, '');\n if (trimmedInput.startsWith('/')) {\n const [cmdName, ...cmdArgs] = withoutSlashes.split(' ');\n const customCommand = this.state.customSlashCommands.find(cmd => cmd.name === cmdName);\n if (customCommand) {\n await this.handleCustomSlashCommand(customCommand, cmdArgs);\n return true;\n }\n // Not a custom command — fall through to built-in routing\n }\n\n const [command, ...args] = withoutSlashes.split(' ');\n\n switch (command) {\n case 'new': {\n // Defer thread creation until first message\n this.state.pendingNewThread = true;\n this.state.chatContainer.clear();\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n this.state.allToolComponents = [];\n this.state.modifiedFiles.clear();\n this.state.pendingFileTools.clear();\n if (this.state.taskProgress) {\n this.state.taskProgress.updateTasks([]);\n }\n this.state.previousTasks = [];\n this.state.taskWriteInsertIndex = -1;\n this.resetStatusLineState();\n this.state.ui.requestRender();\n this.showInfo('Ready for new conversation');\n return true;\n }\n\n case 'threads': {\n await this.showThreadSelector();\n return true;\n }\n\n case 'skills': {\n await this.showSkillsList();\n return true;\n }\n\n case 'thread:tag-dir': {\n await this.tagThreadWithDir();\n return true;\n }\n\n case 'sandbox': {\n await this.handleSandboxCommand(args);\n return true;\n }\n\n case 'mode': {\n const modes = this.state.harness.listModes();\n if (modes.length <= 1) {\n this.showInfo('Only one mode available');\n return true;\n }\n if (args[0]) {\n await this.state.harness.switchMode({ modeId: args[0] });\n } else {\n const currentMode = this.state.harness.getCurrentMode();\n const modeList = modes\n .map(m => ` ${m.id === currentMode?.id ? '* ' : ' '}${m.id}${m.name ? ` - ${m.name}` : ''}`)\n .join('\\n');\n this.showInfo(`Modes:\n${modeList}`);\n }\n return true;\n }\n\n case 'models': {\n await this.showModelScopeSelector();\n return true;\n }\n\n case 'subagents': {\n await this.showSubagentModelSelector();\n return true;\n }\n\n case 'om': {\n await this.showOMSettings();\n return true;\n }\n case 'think': {\n const currentLevel = ((this.state.harness.getState() as any)?.thinkingLevel ?? 'off') as string;\n const levels = [\n { label: 'Off', id: 'off' },\n { label: 'Minimal', id: 'minimal' },\n { label: 'Low', id: 'low' },\n { label: 'Medium', id: 'medium' },\n { label: 'High', id: 'high' },\n ];\n const currentIdx = levels.findIndex(l => l.id === currentLevel);\n const nextIdx = (currentIdx + 1) % levels.length;\n const next = levels[nextIdx]!;\n await this.state.harness.setState({ thinkingLevel: next.id } as any);\n this.showInfo(`Thinking: ${next.label}`);\n this.updateStatusLine();\n return true;\n }\n case 'permissions': {\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 this.showInfo(`Invalid category: ${category}. Must be one of: ${validCategories.join(', ')}`);\n return true;\n }\n if (!validPolicies.includes(policy)) {\n this.showInfo(`Invalid policy: ${policy}. Must be one of: ${validPolicies.join(', ')}`);\n return true;\n }\n this.state.harness.setPermissionForCategory({ category, policy });\n this.showInfo(`Set ${category} policy to: ${policy}`);\n return true;\n }\n await this.showPermissions();\n return true;\n }\n case 'yolo': {\n const current = (this.state.harness.getState() as any).yolo === true;\n this.state.harness.setState({ yolo: !current } as any);\n this.showInfo(!current ? 'YOLO mode ON — tools auto-approved' : 'YOLO mode OFF — tools require approval');\n this.updateStatusLine();\n return true;\n }\n case 'settings': {\n await this.showSettings();\n return true;\n }\n\n case 'login': {\n await this.showLoginSelector('login');\n return true;\n }\n\n case 'logout': {\n await this.showLoginSelector('logout');\n return true;\n }\n case 'cost': {\n await this.showCostBreakdown();\n return true;\n }\n\n case 'diff': {\n await this.showDiff(args[0]);\n return true;\n }\n\n case 'name': {\n const title = args.join(' ').trim();\n if (!title) {\n this.showInfo('Usage: /name <title>');\n return true;\n }\n if (!this.state.harness.getCurrentThreadId()) {\n this.showInfo('No active thread. Send a message first.');\n return true;\n }\n await this.state.harness.renameThread({ title });\n this.showInfo(`Thread renamed to: ${title}`);\n return true;\n }\n case 'resource': {\n const sub = args[0]?.trim();\n const current = this.state.harness.getResourceId();\n const defaultId = this.state.harness.getDefaultResourceId();\n\n if (!sub) {\n // Show current resource ID and list known ones\n const knownIds = await this.state.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 => ` ${id === current ? '* ' : ' '}${id}`),\n '',\n 'Usage:',\n ' /resource <id> - Switch to a resource ID',\n ' /resource reset - Reset to auto-detected ID',\n ];\n this.showInfo(lines.join('\\n'));\n } else if (sub === 'reset') {\n this.state.harness.setResourceId({ resourceId: defaultId });\n this.state.pendingNewThread = true;\n this.state.chatContainer.clear();\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n this.state.allToolComponents = [];\n this.resetStatusLineState();\n this.state.ui.requestRender();\n this.showInfo(`Resource ID reset to: ${defaultId}`);\n } else {\n const newId = args.join(' ').trim();\n this.state.harness.setResourceId({ resourceId: newId });\n this.state.pendingNewThread = true;\n this.state.chatContainer.clear();\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n this.state.allToolComponents = [];\n this.resetStatusLineState();\n this.state.ui.requestRender();\n this.showInfo(`Switched to resource: ${newId}`);\n }\n return true;\n }\n\n case 'exit':\n this.stop();\n process.exit(0);\n\n case 'help': {\n const modes = this.state.harness.listModes();\n const modeHelp = modes.length > 1 ? '\\n/mode - Switch or list modes' : '';\n\n // Build custom commands help\n let customCommandsHelp = '';\n if (this.state.customSlashCommands.length > 0) {\n customCommandsHelp =\n '\\n\\nCustom commands (use // prefix):\\n' +\n this.state.customSlashCommands\n .map(cmd => ` //${cmd.name.padEnd(8)} - ${cmd.description || 'No description'}`)\n .join('\\n');\n }\n\n this.showInfo(`Available commands:\n /new - Start a new thread\n /threads - Switch between threads\n /thread:tag-dir - Tag thread with current directory\n /name - Rename current thread\n /resource - Show/switch resource ID (tag for sharing)\n /skills - List available skills\n /models - Configure model (global/thread/mode)\n /subagents - Configure subagent model defaults\n /permissions - View/manage tool approval permissions\n /settings - General settings (notifications, YOLO, thinking)\n /om - Configure Observational Memory\n /review - Review a GitHub pull request\n /cost - Show token usage and estimated costs\n /diff - Show modified files or git diff for a path\n /sandbox - Manage sandbox allowed paths\n /hooks - Show/reload configured hooks\n /mcp - Show/reload MCP server connections\n /login - Login with OAuth provider\n /logout - Logout from OAuth provider${modeHelp}\n /exit - Exit the TUI\n /help - Show this help${customCommandsHelp}\n\nShell:\n !<cmd> - Run a shell command directly (e.g., !ls -la)\n\nKeyboard shortcuts:\n Ctrl+C - Interrupt agent / clear input\n Ctrl+C×2 - Exit process (double-tap)\n Ctrl+D - Exit (when editor is empty)\n Enter - While working: steer (interrupt + redirect)\n Ctrl+F - While working: queue follow-up message\n Shift+Tab - Cycle agent modes\n Ctrl+T - Toggle thinking blocks\n Ctrl+E - Expand/collapse tool outputs`);\n return true;\n }\n\n case 'hooks': {\n const hm = this.state.hookManager;\n if (!hm) {\n this.showInfo('Hooks system not initialized.');\n return true;\n }\n\n const subcommand = args[0];\n if (subcommand === 'reload') {\n hm.reload();\n this.showInfo('Hooks config reloaded.');\n return true;\n }\n\n const paths = hm.getConfigPaths();\n\n if (!hm.hasHooks()) {\n this.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 true;\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 = [\n 'PreToolUse',\n 'PostToolUse',\n 'Stop',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n ] 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 this.showInfo(lines.join('\\n'));\n return true;\n }\n\n case 'mcp': {\n const mm = this.state.mcpManager;\n if (!mm) {\n this.showInfo('MCP system not initialized.');\n return true;\n }\n\n const subcommand = args[0];\n if (subcommand === 'reload') {\n this.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 this.showInfo(`MCP: Reloaded. ${connected.length} server(s) connected, ${totalTools} tool(s).`);\n } catch (error) {\n this.showError(`MCP reload failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n return true;\n }\n\n const paths = mm.getConfigPaths();\n\n if (!mm.hasServers()) {\n this.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 ` }\\n` +\n ` }`,\n );\n return true;\n }\n\n const statuses = mm.getServerStatuses();\n const lines: string[] = [`MCP Servers:`];\n lines.push(` Project: ${paths.project}`);\n lines.push(` Global: ${paths.global}`);\n lines.push(` Claude: ${paths.claude}`);\n lines.push('');\n\n for (const status of statuses) {\n const icon = status.connected ? '\\u2713' : '\\u2717';\n const state = status.connected ? 'connected' : `error: ${status.error}`;\n lines.push(` ${icon} ${status.name} (${state})`);\n if (status.toolNames.length > 0) {\n for (const toolName of status.toolNames) {\n lines.push(` - ${toolName}`);\n }\n }\n }\n\n lines.push('');\n lines.push(` /mcp reload - Disconnect and reconnect all servers`);\n\n this.showInfo(lines.join('\\n'));\n return true;\n }\n case 'review': {\n await this.handleReviewCommand(args);\n return true;\n }\n\n default: {\n // Fall back to custom commands for single-slash input\n const customCommand = this.state.customSlashCommands.find(cmd => cmd.name === command);\n if (customCommand) {\n await this.handleCustomSlashCommand(customCommand, args);\n return true;\n }\n this.showError(`Unknown command: ${command}`);\n return true;\n }\n }\n }\n /**\n * Handle the /review command — send a PR review prompt to the agent.\n * With no args: lists open PRs. With a PR number: reviews that PR.\n */\n private async handleReviewCommand(args: string[]): Promise<void> {\n if (!this.state.harness.hasModelSelected()) {\n this.showInfo('No model selected. Use /models to select a model, or /login to authenticate.');\n return;\n }\n\n // Ensure thread exists\n if (this.state.pendingNewThread) {\n await this.state.harness.createThread();\n this.state.pendingNewThread = false;\n this.updateStatusLine();\n }\n\n const prNumber = args[0];\n const focusArea = args.slice(1).join(' ');\n\n let prompt: string;\n\n if (!prNumber) {\n // No PR specified — list open PRs and ask\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 // PR number given — do a thorough review\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 // Show what's happening\n this.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 this.state.ui.requestRender();\n\n // Send to the agent\n this.state.harness.sendMessage({ content: prompt }).catch(error => {\n this.showError(error instanceof Error ? error.message : 'Review failed');\n });\n }\n\n /**\n * Handle a custom slash command by processing its template and adding to context\n */\n private async handleCustomSlashCommand(command: SlashCommandMetadata, args: string[]): Promise<void> {\n try {\n // Process the command template\n const processedContent = await processSlashCommand(command, 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 this.state.allSlashCommandComponents.push(slashComp);\n this.state.chatContainer.addChild(slashComp);\n this.state.ui.requestRender();\n\n // Wrap in <slash-command> tags so the assistant sees the full\n // content but addUserMessage won't double-render it.\n const wrapped = `<slash-command name=\"${command.name}\">\\n${processedContent.trim()}\\n</slash-command>`;\n await this.state.harness.sendMessage({ content: wrapped });\n } else {\n this.showInfo(`Executed //${command.name} (no output)`);\n }\n } catch (error) {\n this.showError(`Error executing //${command.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // ===========================================================================\n // Message Rendering\n // ===========================================================================\n\n private addUserMessage(message: HarnessMessage): void {\n const textContent = message.content\n .filter(c => c.type === 'text')\n .map(c => (c as { type: 'text'; text: string }).text)\n .join('\\n');\n\n const imageCount = message.content.filter(c => c.type === 'image').length;\n\n // Strip [image] markers from text since we show count separately\n const displayText = imageCount > 0 ? textContent.replace(/\\[image\\]\\s*/g, '').trim() : textContent.trim();\n // Check for system reminder tags\n const systemReminderMatch = displayText.match(/<system-reminder>([\\s\\S]*?)<\\/system-reminder>/);\n if (systemReminderMatch) {\n const reminderText = systemReminderMatch[1]!.trim();\n const reminderComponent = new SystemReminderComponent({\n message: reminderText,\n });\n\n // System reminders always go at the end (after plan approval)\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(reminderComponent);\n this.state.ui.requestRender();\n return;\n }\n\n // Check for slash command tags\n const slashCommandMatch = displayText.match(/<slash-command\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/slash-command>/);\n if (slashCommandMatch) {\n const commandName = slashCommandMatch[1]!;\n const commandContent = slashCommandMatch[2]!.trim();\n const slashComp = new SlashCommandComponent(commandName, commandContent);\n this.state.allSlashCommandComponents.push(slashComp);\n this.state.chatContainer.addChild(slashComp);\n this.state.ui.requestRender();\n return;\n }\n\n const prefix = imageCount > 0 ? `[${imageCount} image${imageCount > 1 ? 's' : ''}] ` : '';\n if (displayText || prefix) {\n const userComponent = new UserMessageComponent(prefix + displayText);\n\n // Always append to end — follow-ups should stay at the bottom\n this.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 (this.state.isAgentActive && this.state.streamingComponent) {\n this.state.followUpComponents.push(userComponent);\n }\n }\n }\n\n private async renderExistingMessages(): Promise<void> {\n this.state.chatContainer.clear();\n this.state.pendingTools.clear();\n this.state.toolInputBuffers.clear();\n this.state.allToolComponents = [];\n\n const messages = await this.state.harness.listMessages({ limit: 40 });\n\n for (const message of messages) {\n if (message.role === 'user') {\n this.addUserMessage(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 this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.state.chatContainer.addChild(textComponent);\n accumulatedContent = [];\n }\n\n // Find matching tool result\n const toolResult = message.content.find(c => c.type === 'tool_result' && c.id === content.id);\n\n // Render subagent tool calls with dedicated component\n if (content.name === 'subagent') {\n const subArgs = content.args as\n | {\n agentType?: string;\n task?: string;\n modelId?: string;\n }\n | undefined;\n const rawResult =\n toolResult?.type === 'tool_result' ? this.formatToolResult(toolResult.result) : undefined;\n const isErr = toolResult?.type === 'tool_result' && toolResult.isError;\n\n // Parse embedded metadata for model ID, duration, tool calls\n const meta = rawResult ? parseSubagentMeta(rawResult) : null;\n const resultText = meta?.text ?? rawResult;\n const modelId = meta?.modelId ?? subArgs?.modelId;\n const durationMs = meta?.durationMs ?? 0;\n\n const subComponent = new SubagentExecutionComponent(\n subArgs?.agentType ?? 'unknown',\n subArgs?.task ?? '',\n this.state.ui,\n modelId,\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 this.state.chatContainer.addChild(subComponent);\n this.state.allToolComponents.push(subComponent as any);\n continue;\n }\n\n // Render the tool call\n const toolComponent = new ToolExecutionComponentEnhanced(\n content.name,\n content.args,\n {\n showImages: false,\n collapsedByDefault: !this.state.toolOutputExpanded,\n },\n this.state.ui,\n );\n\n if (toolResult && toolResult.type === 'tool_result') {\n toolComponent.updateResult(\n {\n content: [\n {\n type: 'text',\n text: this.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 this.renderCompletedTasksInline(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 (this.state.previousTasks.length > 0) {\n this.renderClearedTasksInline(this.state.previousTasks);\n this.state.previousTasks = [];\n replacedWithInline = true;\n }\n } else {\n // Track for detecting clears\n this.state.previousTasks = [...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 this.state.chatContainer.addChild(planResult);\n replacedWithInline = true;\n }\n }\n\n if (!replacedWithInline) {\n this.state.chatContainer.addChild(toolComponent);\n this.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 this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.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 this.state.chatContainer.addChild(outputComponent);\n } else {\n // Failed marker\n this.state.chatContainer.addChild(new OMMarkerComponent(content));\n }\n }\n // Skip tool_result - it's handled with tool_call above\n }\n\n // Render any remaining text after the last tool call\n if (accumulatedContent.length > 0) {\n const textMessage: HarnessMessage = {\n ...message,\n content: accumulatedContent,\n };\n const textComponent = new AssistantMessageComponent(\n textMessage,\n this.state.hideThinkingBlock,\n getMarkdownTheme(),\n );\n this.state.chatContainer.addChild(textComponent);\n }\n }\n }\n\n // Restore pinned task list from the last active task_write in history\n if (this.state.previousTasks.length > 0 && this.state.taskProgress) {\n this.state.taskProgress.updateTasks(this.state.previousTasks);\n }\n\n this.state.ui.requestRender();\n }\n\n // ===========================================================================\n // UI Helpers\n // ===========================================================================\n\n private showError(message: string): void {\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(new Text(fg('error', `Error: ${message}`), 1, 0));\n this.state.ui.requestRender();\n }\n\n /**\n * Show a formatted error with helpful context based on error type.\n */\n showFormattedError(\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 this.state.chatContainer.addChild(new Spacer(1));\n\n // Check if this is a tool validation error\n const errorMessage = error.message || String(error);\n const isValidationError =\n errorMessage.toLowerCase().includes('validation failed') ||\n errorMessage.toLowerCase().includes('required parameter') ||\n errorMessage.includes('Required');\n\n if (isValidationError) {\n // Show a simplified message for validation errors\n this.state.chatContainer.addChild(new Text(fg('error', 'Tool validation error - see details above'), 1, 0));\n this.state.chatContainer.addChild(\n new Text(fg('muted', ' Check the tool execution box for specific parameter requirements'), 1, 0),\n );\n } else {\n // Show the main error message\n let errorText = `Error: ${parsed.message}`;\n\n // Add retry info if applicable\n const retryable = 'retryable' in event ? event.retryable : parsed.retryable;\n const retryDelay = 'retryDelay' in event ? event.retryDelay : parsed.retryDelay;\n if (retryable && retryDelay) {\n const seconds = Math.ceil(retryDelay / 1000);\n errorText += fg('muted', ` (retry in ${seconds}s)`);\n }\n\n this.state.chatContainer.addChild(new Text(fg('error', errorText), 1, 0));\n\n // Add helpful hints based on error type\n const hint = this.getErrorHint(parsed.type);\n if (hint) {\n this.state.chatContainer.addChild(new Text(fg('muted', ` Hint: ${hint}`), 1, 0));\n }\n }\n\n this.state.ui.requestRender();\n }\n\n /**\n * Get a helpful hint based on error type.\n */\n private 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 /**\n * Show file changes tracked during this session.\n * With no args: shows summary of all modified files.\n * With a path: shows git diff for that specific file.\n */\n private async showDiff(filePath?: string): Promise<void> {\n if (filePath) {\n // Show git diff for a specific file\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 // Try staged diff\n const staged = await execa('git', ['diff', '--cached', filePath], {\n cwd: process.cwd(),\n reject: false,\n });\n if (!staged.stdout.trim()) {\n this.showInfo(`No changes detected for: ${filePath}`);\n return;\n }\n const component = new DiffOutputComponent(`git diff --cached ${filePath}`, staged.stdout);\n this.state.chatContainer.addChild(component);\n this.state.ui.requestRender();\n return;\n }\n\n const component = new DiffOutputComponent(`git diff ${filePath}`, result.stdout);\n this.state.chatContainer.addChild(component);\n this.state.ui.requestRender();\n } catch (error) {\n this.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 if (this.state.modifiedFiles.size === 0) {\n // Fall back to git diff --stat\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 this.state.chatContainer.addChild(component);\n this.state.ui.requestRender();\n } else {\n this.showInfo('No file changes detected in this session or working tree.');\n }\n } catch {\n this.showInfo('No file changes tracked in this session.');\n }\n return;\n }\n\n const lines: string[] = [`Modified files (${this.state.modifiedFiles.size}):`];\n for (const [filePath, info] of this.state.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(` ${fg('path', filePath)} ${fg('muted', `(${ops})`)}`);\n }\n lines.push('');\n lines.push(fg('muted', 'Use /diff <path> to see the git diff for a specific file.'));\n\n this.showInfo(lines.join('\\n'));\n }\n\n /**\n * Run a shell command directly and display the output in the chat.\n * Triggered by the `!` prefix (e.g., `!ls -la`).\n */\n private async handleShellPassthrough(command: string): Promise<void> {\n if (!command) {\n this.showInfo('Usage: !<command> (e.g., !ls -la)');\n return;\n }\n\n try {\n const { execa } = await import('execa');\n const result = await 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 const component = new ShellOutputComponent(\n command,\n result.stdout ?? '',\n result.stderr ?? '',\n result.exitCode ?? 0,\n );\n this.state.chatContainer.addChild(component);\n this.state.ui.requestRender();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : 'Shell command failed');\n }\n }\n /**\n * Send a notification alert (bell / system / hooks) based on user settings.\n */\n private notify(reason: NotificationReason, message?: string): void {\n const mode = ((this.state.harness.getState() as any)?.notifications ?? 'off') as NotificationMode;\n sendNotification(reason, {\n mode,\n message,\n hookManager: this.state.hookManager,\n });\n }\n\n private showInfo(message: string): void {\n this.state.chatContainer.addChild(new Spacer(1));\n this.state.chatContainer.addChild(new Text(fg('muted', message), 1, 0));\n this.state.ui.requestRender();\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 { bg, fg } 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 => 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(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(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 ? fg('success', ' ✓ logged in') : '';\n\n let line = '';\n if (isSelected) {\n line = 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(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"]}