{"version":3,"file":"cli.cjs","names":["detectTerminalTheme","MastraTUI"],"sources":["../src/version.ts","../src/main.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nexport function getCurrentVersion(): string {\n  if (typeof MASTRACODE_VERSION !== 'undefined') {\n    return MASTRACODE_VERSION;\n  }\n\n  const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n  return pkg.version;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { getCurrentVersion } from './version.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet storageMaintenance: Awaited<ReturnType<typeof createMastraCode>>['storageMaintenance'];\nlet stopPluginSignalProviders: Awaited<ReturnType<typeof createMastraCode>>['stopPluginSignalProviders'] | undefined;\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet storageClosed = false;\n\nfunction isTruthyEnv(name: string): boolean {\n  return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n  const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n  const initialState: Record<string, unknown> = {};\n  if (currentModelId) initialState.currentModelId = currentModelId;\n  if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n  return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n  // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n  // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n  if (isStreamDestroyedError(error)) return;\n  handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n  if (isStreamDestroyedError(reason)) return;\n  handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n  const settings = loadSettings();\n  let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n  const loadBrowser = () => {\n    browserPromise ??= createBrowserFromSettings(settings.browser);\n    return browserPromise;\n  };\n\n  const initialState = resolveInitialStateFromEnv();\n  const result = await createMastraCode({\n    unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n    disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n    disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n    ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n    ...(initialState ? { initialState: initialState as never } : {}),\n  });\n  controller = result.controller;\n  mcpManager = result.mcpManager;\n  hookManager = result.hookManager;\n  authStorage = result.authStorage;\n  signalsPubSub = result.signalsPubSub;\n  storageMaintenance = result.storageMaintenance;\n  stopPluginSignalProviders = result.stopPluginSignalProviders;\n\n  if (result.storageWarning) {\n    console.info(`⚠ ${result.storageWarning}`);\n  }\n  if (result.observabilityWarning) {\n    console.info(`⚠ ${result.observabilityWarning}`);\n  }\n\n  // MCP connection is deferred to TUI.init() (after ui.start()) so that\n  // status messages use showInfo() instead of console.info(), which would\n  // corrupt the terminal.  Headless mode still inits from headless/cli.ts.\n\n  setupDebugLogging();\n\n  // Detect and apply terminal theme\n  // MASTRA_THEME env var is the highest-priority override\n  const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n  let themeMode: 'dark' | 'light';\n  let detectedBgHex: string | undefined;\n  if (envTheme === 'dark' || envTheme === 'light') {\n    themeMode = envTheme;\n  } else {\n    const settings = loadSettings();\n    const themePref = settings.preferences.theme;\n    if (themePref === 'dark' || themePref === 'light') {\n      themeMode = themePref;\n    } else {\n      const detection = await detectTerminalTheme();\n      themeMode = detection.mode;\n      detectedBgHex = detection.detectedBgHex;\n    }\n  }\n  applyThemeMode(themeMode, detectedBgHex);\n\n  // createMastraCode() brought up shared resources and minted the single\n  // session that all work runs through. The AgentController owns no session of its own.\n  const session = result.session;\n\n  analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n  analytics.capture('mastracode_session_started', {\n    mode: session.mode.get(),\n    resourceId: session.identity.getResourceId(),\n    hasAuthStorage: Boolean(authStorage),\n    hasMcp: Boolean(mcpManager),\n    theme: themeMode,\n  });\n\n  tui = new MastraTUI({\n    controller: controller,\n    session,\n    hookManager,\n    analytics,\n    authStorage,\n    mcpManager,\n    pluginManager: result.pluginManager,\n    storageMaintenance: result.storageMaintenance,\n    appName: 'Mastra Code',\n    version: getCurrentVersion(),\n    inlineQuestions: true,\n    githubSignals: result.githubSignals,\n    ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n  });\n  tui.run().catch(error => {\n    handleFatalError(error);\n  });\n\n  if (settings.browser.enabled) {\n    void loadBrowser()\n      .then(browser => {\n        if (!browser) return;\n        controller.setBrowser(browser);\n        void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n      })\n      .catch(() => {});\n  }\n}\n\nconst asyncCleanup = async () => {\n  releaseAllThreadLocks();\n  // Stop plugin-contributed signal providers (and the plugin reload listener)\n  // before quiescing workers: a provider that keeps polling past this point\n  // could dispatch into a controller that is shutting down.\n  try {\n    stopPluginSignalProviders?.();\n  } catch {\n    // Best-effort — the process is exiting.\n  }\n  const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n  await Promise.allSettled([\n    mcpManager?.disconnect(),\n    controller?.getMastra()?.stopWorkers(),\n    controller?.stopIntervals(),\n    closeSignalsPubSub?.(),\n    analytics?.shutdown(),\n  ]);\n  // Checkpoint WAL and close the local storage connection after all producers\n  // and timers are quiesced. Idempotent — repeated signals (SIGINT then SIGHUP)\n  // close only once. LibSQLStore.close()/LibSQLVector.close() truncate the WAL\n  // and switch back to DELETE journal mode for a clean shutdown.\n  if (!storageClosed) {\n    storageClosed = true;\n    await storageMaintenance?.closeStorage?.().catch(() => {\n      // Swallow — best-effort cleanup during shutdown. The process is exiting.\n    });\n  }\n};\n\nprocess.on('beforeExit', () => {\n  void asyncCleanup();\n});\nprocess.on('exit', () => {\n  // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n  // raw mode) are disabled on ANY exit path. Without this, killing the process\n  // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n  // produce escape sequences like \"5;99~\" instead of normal characters.\n  try {\n    tui?.stop();\n  } catch {\n    // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n    // sequences to disable Kitty keyboard protocol, bracketed paste, and\n    // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n    // would write.\n  }\n  // Belt-and-suspenders: always write terminal reset sequences directly,\n  // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n  // but missing them leaves the terminal in a corrupted state.\n  try {\n    process.stdout.write(\n      '\\x1b[?2004l' + // disable bracketed paste\n        '\\x1b[<u' + // pop kitty keyboard protocol\n        '\\x1b[>4;0m' + // disable modifyOtherKeys\n        '\\x1b[?25h', // show cursor\n    );\n    if (process.stdin.setRawMode) {\n      process.stdin.setRawMode(false);\n    }\n  } catch {\n    // stdout may already be closed during exit\n  }\n  restoreTerminalForeground();\n  releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n  try {\n    tui?.stop();\n  } catch {\n    // ignored — exit handler has failsafe reset\n  }\n  void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n  if (!err || depth > 5) return false;\n  const e = err as any;\n  if (e.code === 'ECONNREFUSED') return true;\n  if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n  // AggregateError has .errors array\n  if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n  return false;\n}\n\nfunction pluginMain(args: string[]): void {\n  if (args[0] !== 'scaffold') {\n    process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n    process.exit(1);\n  }\n\n  const dir = args[1];\n  if (!dir) {\n    process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n    process.exit(1);\n  }\n\n  const id = readFlag(args, '--id');\n  const name = readFlag(args, '--name');\n  const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n  process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n  const index = args.indexOf(flag);\n  if (index === -1) return undefined;\n  const value = args[index + 1];\n  if (!value || value.startsWith('--')) {\n    throw new Error(`Missing value for ${flag}`);\n  }\n  return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n  // Always write to real stderr, even if console.error was overridden\n  const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n  if (hasEconnrefused(error)) {\n    const settings = loadSettings();\n    const connStr = settings.storage?.pg?.connectionString;\n    const target = connStr ?? 'localhost:5432';\n    write(\n      `\\nFailed to connect to PostgreSQL at ${target}.` +\n        `\\nMake sure the database is running and accessible.` +\n        `\\n\\nTo switch back to LibSQL:` +\n        `\\n  Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n    );\n    process.exit(1);\n  }\n\n  const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n  write(msg);\n  // Write crash log to file so it persists even if terminal closes\n  try {\n    const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n    fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n  } catch {}\n  if (error instanceof Error && error.stack) {\n    write(error.stack);\n  }\n  process.exit(1);\n}\n\nasync function main() {\n  if (process.argv[2] === 'plugin') {\n    return pluginMain(process.argv.slice(3));\n  }\n\n  if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n    return runMCCli();\n  }\n\n  if (process.argv.includes('--acp')) {\n    const { acpMain } = await import('@mastra/code-sdk/acp/index');\n    return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n  }\n\n  // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n  // before starting the TUI.  The drain blocks until the sender process exits\n  // and closes its stdout, so we never see partial output.\n  let pipedInput: string | null = null;\n  if (!process.stdin.isTTY) {\n    process.stderr.write('Reading piped input...\\n');\n    pipedInput = await drainPipedStdin();\n\n    // Always reopen a real TTY — even if the pipe was empty, the original\n    // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n    const reopenedStdin = reopenStdinFromTTY();\n    if (!reopenedStdin) {\n      process.stderr.write('No TTY available — falling back to headless mode.\\n');\n      return runMCCli(pipedInput);\n    }\n  }\n\n  return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n  handleFatalError(error);\n});\n"],"mappings":"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"}