mastracode 0.45.0 → 0.46.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +7 -2
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +7 -2
- package/dist/cli.js.map +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/tui/commands/think.d.ts.map +1 -1
- package/dist/tui/components/account-switch-notice.d.ts +1 -1
- package/dist/tui/components/ask-question-inline.d.ts +15 -0
- package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
- package/dist/tui/components/banner.d.ts +32 -5
- package/dist/tui/components/banner.d.ts.map +1 -1
- package/dist/tui/components/custom-editor.d.ts +0 -4
- package/dist/tui/components/custom-editor.d.ts.map +1 -1
- package/dist/tui/components/error-display.d.ts.map +1 -1
- package/dist/tui/components/idle-counter.d.ts +5 -1
- package/dist/tui/components/idle-counter.d.ts.map +1 -1
- package/dist/tui/components/judge-display.d.ts +1 -0
- package/dist/tui/components/judge-display.d.ts.map +1 -1
- package/dist/tui/components/notification.d.ts.map +1 -1
- package/dist/tui/components/om-output.d.ts +2 -2
- package/dist/tui/components/om-output.d.ts.map +1 -1
- package/dist/tui/components/plan-approval-inline.d.ts +2 -0
- package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
- package/dist/tui/components/shell-output.d.ts +1 -1
- package/dist/tui/components/shell-output.d.ts.map +1 -1
- package/dist/tui/components/slash-command.d.ts +2 -2
- package/dist/tui/components/slash-command.d.ts.map +1 -1
- package/dist/tui/components/subagent-execution.d.ts.map +1 -1
- package/dist/tui/components/surface.d.ts +30 -0
- package/dist/tui/components/surface.d.ts.map +1 -0
- package/dist/tui/components/system-reminder.d.ts.map +1 -1
- package/dist/tui/components/task-progress.d.ts.map +1 -1
- package/dist/tui/components/thinking-settings.d.ts.map +1 -1
- package/dist/tui/components/tool-approval-dialog.d.ts +36 -15
- package/dist/tui/components/tool-approval-dialog.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-enhanced.d.ts +16 -4
- package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-interface.d.ts +5 -0
- package/dist/tui/components/tool-execution-interface.d.ts.map +1 -1
- package/dist/tui/components/user-message.d.ts +3 -2
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/wrapping-select-list.d.ts +13 -1
- package/dist/tui/components/wrapping-select-list.d.ts.map +1 -1
- package/dist/tui/handlers/agent-lifecycle.d.ts +1 -0
- package/dist/tui/handlers/agent-lifecycle.d.ts.map +1 -1
- package/dist/tui/handlers/message.d.ts.map +1 -1
- package/dist/tui/handlers/tool.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/onboarding-inline.d.ts +6 -0
- package/dist/tui/onboarding-inline.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/setup.d.ts.map +1 -1
- package/dist/tui/state.d.ts +9 -13
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui/status-line.d.ts +8 -2
- package/dist/tui/status-line.d.ts.map +1 -1
- package/dist/tui/theme.d.ts +19 -1
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/{tui-CDdSkr_Q.js → tui-5IfsALo2.js} +1338 -1137
- package/dist/tui-5IfsALo2.js.map +1 -0
- package/dist/{tui-BsLtXA9y.cjs → tui-jrSC6Hge.cjs} +1337 -1136
- package/dist/tui-jrSC6Hge.cjs.map +1 -0
- package/dist/tui.cjs +1 -1
- package/dist/tui.js +1 -1
- package/package.json +12 -12
- package/dist/tui-BsLtXA9y.cjs.map +0 -1
- package/dist/tui-CDdSkr_Q.js.map +0 -1
package/dist/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const require_tui = require("./tui-
|
|
2
|
+
const require_tui = require("./tui-jrSC6Hge.cjs");
|
|
3
3
|
let _mastra_code_sdk = require("@mastra/code-sdk");
|
|
4
4
|
let fs = require("fs");
|
|
5
5
|
fs = require_tui.__toESM(fs, 1);
|
|
@@ -140,7 +140,7 @@ function resolveTuiSubagents(enabled) {
|
|
|
140
140
|
//#endregion
|
|
141
141
|
//#region src/version.ts
|
|
142
142
|
function getCurrentVersion() {
|
|
143
|
-
return "0.
|
|
143
|
+
return "0.46.0-alpha.1";
|
|
144
144
|
}
|
|
145
145
|
//#endregion
|
|
146
146
|
//#region src/main.ts
|
|
@@ -156,6 +156,7 @@ let storageMaintenance;
|
|
|
156
156
|
let stopPluginSignalProviders;
|
|
157
157
|
let threadScheduler;
|
|
158
158
|
let stopNotificationDispatch;
|
|
159
|
+
let releaseThreadClaims;
|
|
159
160
|
let analytics;
|
|
160
161
|
let tui;
|
|
161
162
|
let processMemoryDiagnostics;
|
|
@@ -216,6 +217,7 @@ async function tuiMain(startupMessage = {}, resumeThreadId) {
|
|
|
216
217
|
stopPluginSignalProviders = result.stopPluginSignalProviders;
|
|
217
218
|
threadScheduler = result.threadScheduler;
|
|
218
219
|
stopNotificationDispatch = result.stopNotificationDispatch;
|
|
220
|
+
releaseThreadClaims = result.releaseThreadClaims;
|
|
219
221
|
if (result.storageWarning) console.info(`⚠ ${result.storageWarning}`);
|
|
220
222
|
if (result.observabilityWarning) console.info(`⚠ ${result.observabilityWarning}`);
|
|
221
223
|
(0, _mastra_code_sdk_utils_debug_log.setupDebugLogging)();
|
|
@@ -284,6 +286,9 @@ async function tuiMain(startupMessage = {}, resumeThreadId) {
|
|
|
284
286
|
const asyncCleanup = () => {
|
|
285
287
|
cleanupPromise ??= (async () => {
|
|
286
288
|
(0, _mastra_code_sdk_utils_thread_lock.releaseAllThreadLocks)();
|
|
289
|
+
try {
|
|
290
|
+
releaseThreadClaims?.();
|
|
291
|
+
} catch {}
|
|
287
292
|
try {
|
|
288
293
|
stopPluginSignalProviders?.();
|
|
289
294
|
} catch {}
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["createProcessMemoryDiagnosticsFromEnvironment","TUI_CO_AUTHOR","detectTerminalTheme","MastraTUI"],"sources":["../src/initial-prompt.ts","../src/process-memory-diagnostics-lifecycle.ts","../src/resume-command.ts","../src/subagent-settings.ts","../src/version.ts","../src/main.ts"],"sourcesContent":["export const INITIAL_PROMPT_FLAG = '--tui-initial-prompt' as const;\nexport const INITIAL_PROMPT_ENV = 'MASTRACODE_TUI_INITIAL_PROMPT';\n\nexport const TUI_PROMPT_FLAG = '--tui-prompt' as const;\n\nexport type InitialPromptArgs = {\n /** argv with the flag and its value removed, so headless detection never mistakes the value for a prompt. */\n argv: string[];\n prompt?: string;\n /** Set when a flag was passed without a value, or both flags were passed. */\n error?: string;\n /** The flag the prompt came from; undefined when it came from the environment. */\n flag?: typeof INITIAL_PROMPT_FLAG | typeof TUI_PROMPT_FLAG;\n /**\n * `--tui-prompt` sends even when startup resumes an existing conversation;\n * `--tui-initial-prompt` and the environment variable only start a new one.\n */\n sendOnResume: boolean;\n};\n\n/**\n * Takes the interactive startup prompt from `--tui-initial-prompt <text>` or\n * `--tui-prompt <text>` (also `--flag=<text>`), falling back to\n * `MASTRACODE_TUI_INITIAL_PROMPT`.\n *\n * The environment variable is always removed from `env`: everything this\n * process spawns inherits its environment, and a nested Mastra Code (or any\n * shell the agent starts) must not send the same prompt again.\n */\nexport function takeInitialPrompt(argv: string[], env: NodeJS.ProcessEnv): InitialPromptArgs {\n const fromEnv = env[INITIAL_PROMPT_ENV];\n delete env[INITIAL_PROMPT_ENV];\n\n const rest: string[] = [];\n const found = new Map<NonNullable<InitialPromptArgs['flag']>, string>();\n let error: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n const flag = [INITIAL_PROMPT_FLAG, TUI_PROMPT_FLAG].find(f => arg === f || arg.startsWith(`${f}=`));\n if (!flag) {\n rest.push(arg);\n } else if (arg !== flag) {\n found.set(flag, arg.slice(flag.length + 1));\n } else if (argv[i + 1] === undefined) {\n error = `${flag} needs a value`;\n } else {\n found.set(flag, argv[++i]!);\n }\n }\n if (found.size > 1) error = `Use either ${INITIAL_PROMPT_FLAG} or ${TUI_PROMPT_FLAG}, not both`;\n\n const [flag, flagValue] = [...found][0] ?? [];\n const prompt = (flag ? flagValue : fromEnv)?.trim() || undefined;\n return { argv: rest, prompt, error, flag, sendOnResume: flag === TUI_PROMPT_FLAG };\n}\n\n/** The first message the TUI sends: the initial prompt, followed by any piped stdin. */\nexport function composeInitialMessage(prompt: string | undefined, pipedInput: string | null | undefined) {\n const piped = pipedInput ? `The following was piped via stdin:\\n\\n${pipedInput}` : undefined;\n if (prompt && piped) return `${prompt}\\n\\n${piped}`;\n return prompt ?? piped;\n}\n\n/**\n * Why a startup prompt can't be combined with piped stdin, if it can't.\n *\n * The first message is submitted like typed input, so a prompt starting with\n * `/` or `!` is dispatched as a command. Folding piped text into it would make\n * that text part of the command — skill arguments, or a shell script for `!`.\n */\nexport function pipedInputConflict(\n args: Pick<InitialPromptArgs, 'prompt' | 'flag'>,\n pipedInput: string | null | undefined,\n): string | undefined {\n if (!args.prompt || !pipedInput) return undefined;\n if (!args.prompt.startsWith('/') && !args.prompt.startsWith('!')) return undefined;\n const source = args.flag ?? INITIAL_PROMPT_ENV;\n return `${source} can't be combined with piped stdin when it is a slash command or starts with !`;\n}\n\n/** The TUI options for a startup prompt and/or piped stdin. */\nexport function initialMessageOptions(\n args: Pick<InitialPromptArgs, 'prompt' | 'sendOnResume'>,\n pipedInput?: string | null,\n): { initialMessage?: string; resumeSkipNotice?: string } {\n const initialMessage = composeInitialMessage(args.prompt, pipedInput);\n if (!initialMessage) return {};\n // Piped stdin on its own is always sent, as before.\n if (!args.prompt || args.sendOnResume) return { initialMessage };\n const skipped = pipedInput ? 'the initial prompt and piped input were' : 'the initial prompt was';\n return {\n initialMessage,\n resumeSkipNotice: `Resumed the existing conversation for this directory, so ${skipped} not sent. Use ${TUI_PROMPT_FLAG} to send ${pipedInput ? 'them' : 'it'} anyway.`,\n };\n}\n","import {\n createProcessMemoryDiagnosticsFromEnvironment,\n startConfiguredProcessMemoryDiagnostics,\n type ProcessMemoryDiagnostics,\n type ProcessMemoryDiagnosticsEnvironment,\n type ProcessMemoryDiagnosticsSetup,\n} from '@mastra/code-sdk/process-memory-diagnostics';\n\nexport async function startTuiProcessMemoryDiagnostics(\n env: ProcessMemoryDiagnosticsEnvironment,\n warn: (message: string) => void,\n createSetup: (\n env: ProcessMemoryDiagnosticsEnvironment,\n ) => ProcessMemoryDiagnosticsSetup = createProcessMemoryDiagnosticsFromEnvironment,\n): Promise<ProcessMemoryDiagnostics> {\n return startConfiguredProcessMemoryDiagnostics(createSetup(env), warn);\n}\n\nexport function createOneShotFatalErrorHandler(handle: (error: unknown) => void): (error: unknown) => void {\n let handlingFatalError = false;\n return error => {\n if (handlingFatalError) return;\n handlingFatalError = true;\n handle(error);\n };\n}\n\nexport function createShutdownCoordinator(\n cleanup: () => Promise<void>,\n exit: (exitCode: number) => never,\n timeoutMs = 5_000,\n): (exitCode: number) => Promise<void> {\n let shutdownPromise: Promise<void> | null = null;\n return exitCode => {\n shutdownPromise ??= (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n cleanup().catch(() => undefined),\n new Promise<void>(resolve => {\n timeout = setTimeout(resolve, timeoutMs);\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n exit(exitCode);\n })();\n return shutdownPromise;\n };\n}\n","export function parseResumeThreadId(args: string[]): string | undefined {\n if (args[0] !== 'resume') return undefined;\n\n const threadId = args[1]?.trim();\n if (!threadId || args.length !== 2) {\n throw new Error('Usage: mastracode resume <thread-id>');\n }\n return threadId;\n}\n\nexport function shouldRunHeadless(\n argv: string[],\n resumeThreadId: string | undefined,\n hasHeadlessFlag: boolean,\n): boolean {\n return !resumeThreadId && (hasHeadlessFlag || argv.includes('--help') || argv.includes('-h'));\n}\n\nexport function shouldRejectResumeWithoutTTY(resumeThreadId: string | undefined, isTTY: boolean): boolean {\n return Boolean(resumeThreadId) && !isTTY;\n}\n\nexport function formatResumeHint(threadId: string): string {\n const hasControlCharacters = [...threadId].some(character => {\n const codePoint = character.codePointAt(0)!;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n });\n const argument = /^[a-zA-Z0-9_-]+$/.test(threadId)\n ? threadId\n : hasControlCharacters\n ? `$'${[...threadId]\n .map(character => {\n const codePoint = character.codePointAt(0)!;\n if (character === \"'\") return \"\\\\'\";\n if (character === '\\\\') return '\\\\\\\\';\n if (codePoint <= 0x1f || codePoint === 0x7f) return `\\\\x${codePoint.toString(16).padStart(2, '0')}`;\n if (codePoint >= 0x80 && codePoint <= 0x9f) {\n return `\\\\u${codePoint.toString(16).padStart(4, '0')}`;\n }\n return character;\n })\n .join('')}'`\n : `'${threadId.replaceAll(\"'\", \"'\\\\''\")}'`;\n return `To continue this session, run mastracode resume ${argument}`;\n}\n","export function resolveTuiSubagents(enabled: boolean): undefined | [] {\n return enabled ? undefined : [];\n}\n","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 {\n createBrowserFromSettings,\n loadSettings,\n resolveStagehandModel,\n toActiveBrowserSettings,\n} from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport {\n stopProcessMemoryDiagnosticsWithTimeout,\n type ProcessMemoryDiagnostics,\n} from '@mastra/code-sdk/process-memory-diagnostics';\nimport { setupDebugLogging, truncateLogFile } 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 { TUI_CO_AUTHOR } from './commit-attribution.js';\nimport { initialMessageOptions, pipedInputConflict, takeInitialPrompt } from './initial-prompt.js';\nimport {\n createOneShotFatalErrorHandler,\n createShutdownCoordinator,\n startTuiProcessMemoryDiagnostics,\n} from './process-memory-diagnostics-lifecycle.js';\nimport {\n formatResumeHint,\n parseResumeThreadId,\n shouldRejectResumeWithoutTTY,\n shouldRunHeadless,\n} from './resume-command.js';\nimport { resolveTuiSubagents } from './subagent-settings.js';\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 threadScheduler: Awaited<ReturnType<typeof createMastraCode>>['threadScheduler'] | undefined;\nlet stopNotificationDispatch: Awaited<ReturnType<typeof createMastraCode>>['stopNotificationDispatch'] | undefined;\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet processMemoryDiagnostics: ProcessMemoryDiagnostics | undefined;\nlet storageClosed = false;\nlet cleanupPromise: Promise<void> | null = null;\nlet getResumeThreadId: (() => string | null) | undefined;\n\nconst CRASH_LOG_PATH = '/tmp/mastra-crash.log';\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(startupMessage: ReturnType<typeof initialMessageOptions> = {}, resumeThreadId?: string) {\n const settings = loadSettings();\n processMemoryDiagnostics = await startTuiProcessMemoryDiagnostics(process.env, warning => {\n console.info(`⚠ ${warning}`);\n });\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = (chatModelId: string | undefined) => {\n browserPromise ??= createBrowserFromSettings(settings.browser, { chatModelId });\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n createInitialThread: false,\n coAuthor: TUI_CO_AUTHOR,\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n subagents: resolveTuiSubagents(settings.preferences.subagentsEnabled),\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 threadScheduler = result.threadScheduler;\n stopNotificationDispatch = result.stopNotificationDispatch;\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 getResumeThreadId = () => (tui ? tui.getResumeThreadId() : session.thread.getId());\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 processMemoryDiagnostics,\n knowledgeInspector: result.knowledgeInspector,\n threadScheduler: result.threadScheduler,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n initialModelOverride: Boolean(initialState?.currentModelId),\n ...(resumeThreadId ? { resumeThreadId } : {}),\n githubSignals: result.githubSignals,\n backgroundToolsEnabled: result.backgroundToolsEnabled,\n backgroundCompletionEvents: result.backgroundCompletionEvents,\n exit: exitCode => void shutdownAndExit(exitCode),\n ...startupMessage,\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n // Captured once: the Stagehand instance is fixed at launch and shared by every thread.\n const chatModelId = session.model.get();\n void loadBrowser(chatModelId)\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state\n .set({\n activeBrowserSettings: toActiveBrowserSettings(settings.browser),\n activeBrowserModel: resolveStagehandModel(settings.browser, { chatModelId }),\n } as any)\n .catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = (): Promise<void> => {\n cleanupPromise ??= (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 diagnosticsShutdown = processMemoryDiagnostics\n ? stopProcessMemoryDiagnosticsWithTimeout(processMemoryDiagnostics, message => console.warn(message))\n : undefined;\n // Schedules live only in this process; stop their timers so none fires mid-shutdown.\n threadScheduler?.stop();\n // Release this process's notification dispatch leases before the pubsub that holds them closes.\n await stopNotificationDispatch?.().catch(() => {});\n await Promise.allSettled([mcpManager?.disconnect(), controller?.stopIntervals()]);\n // Mastra owns the workspaces and must destroy them to stop retained language\n // servers before storage is closed.\n await Promise.allSettled([controller?.getMastra()?.shutdown(), analytics?.shutdown()]);\n // The signals pubsub is Mastra's event bus: in-flight runs and background\n // tasks drain through it during shutdown, so close it only afterwards. Call\n // close() on the object; a detached method loses `this` and rejects silently.\n const pubsubToClose = signalsPubSub as { close?: () => Promise<void> | void } | undefined;\n await Promise.allSettled([pubsubToClose?.close?.()]);\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 await diagnosticsShutdown;\n })();\n return cleanupPromise;\n};\n\nconst shutdownAndExit = createShutdownCoordinator(asyncCleanup, exitCode => process.exit(exitCode));\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 try {\n const threadId = getResumeThreadId?.();\n if (threadId) {\n process.stdout.write(`\\n${formatResumeHint(threadId)}\\n`);\n }\n } catch {\n // session state or stdout may already be closed during exit\n }\n});\n\n// Start durable diagnostics shutdown before synchronous TUI teardown so a stalled\n// terminal cleanup cannot prevent the final profile capture. The exit handler still\n// provides a failsafe terminal reset if teardown throws.\nconst handleTermSignal = () => {\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void shutdownAndExit(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\nconst handleFatalError = createOneShotFatalErrorHandler((error: unknown): void => {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => {\n try {\n process.stderr.write(msg + '\\n');\n } catch {}\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 void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n return;\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 truncateLogFile(CRASH_LOG_PATH);\n fs.appendFileSync(CRASH_LOG_PATH, crashLog);\n truncateLogFile(CRASH_LOG_PATH);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n});\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n // Storage maintenance without the TUI, so a database can still be pruned and\n // compacted when the interactive session won't start. Checked before the\n // headless branch below, which would otherwise claim `prune --help`.\n if (process.argv[2] === 'prune') {\n const { runPruneCommand } = await import('@mastra/code-sdk/utils/prune-cli');\n return process.exit(await runPruneCommand(process.argv.slice(3)));\n }\n\n const loginIndex = process.argv.findIndex(\n (arg, index) => index >= 2 && arg !== '--acp' && arg !== '--dangerous-auto-approve',\n );\n if (process.argv[loginIndex] === 'login') {\n const { runLoginCommand } = await import('./login-command.js');\n const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });\n await new Promise(resolve => process.stdout.write('', resolve));\n return process.exit(code);\n }\n\n const initialPrompt = takeInitialPrompt(process.argv, process.env);\n if (initialPrompt.error) {\n process.stderr.write(`${initialPrompt.error}\\n`);\n process.exit(1);\n }\n if (initialPrompt.flag) process.argv = initialPrompt.argv;\n // The flag only means something to the interactive TUI. Paths that can't run\n // it reject the flag instead of dropping the prompt; an env var prompt is\n // just ignored there.\n const rejectInitialPromptFlag = (reason: string) => {\n if (!initialPrompt.flag) return;\n process.stderr.write(`${initialPrompt.flag} starts the interactive TUI; ${reason}\\n`);\n process.exit(1);\n };\n\n let resumeThreadId: string | undefined;\n try {\n resumeThreadId = parseResumeThreadId(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const headless = hasHeadlessFlag(process.argv);\n if (shouldRunHeadless(process.argv, resumeThreadId, headless)) {\n if (headless) rejectInitialPromptFlag('use --prompt for headless runs');\n return runMCCli(undefined, { coAuthor: TUI_CO_AUTHOR });\n }\n\n if (process.argv.includes('--acp')) {\n rejectInitialPromptFlag('it cannot be combined with --acp');\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({\n dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve'),\n coAuthor: TUI_CO_AUTHOR,\n });\n }\n\n if (shouldRejectResumeWithoutTTY(resumeThreadId, Boolean(process.stdin.isTTY))) {\n process.stderr.write('mastracode resume requires an interactive terminal.\\n');\n process.exitCode = 1;\n return;\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 rejectInitialPromptFlag('no TTY is available, so use --prompt for headless runs');\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput, { coAuthor: TUI_CO_AUTHOR });\n }\n }\n\n const conflict = pipedInputConflict(initialPrompt, pipedInput);\n if (conflict) {\n process.stderr.write(`${conflict}\\n`);\n process.exit(1);\n }\n\n return tuiMain(initialMessageOptions(initialPrompt, pipedInput), resumeThreadId);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["createProcessMemoryDiagnosticsFromEnvironment","TUI_CO_AUTHOR","detectTerminalTheme","MastraTUI"],"sources":["../src/initial-prompt.ts","../src/process-memory-diagnostics-lifecycle.ts","../src/resume-command.ts","../src/subagent-settings.ts","../src/version.ts","../src/main.ts"],"sourcesContent":["export const INITIAL_PROMPT_FLAG = '--tui-initial-prompt' as const;\nexport const INITIAL_PROMPT_ENV = 'MASTRACODE_TUI_INITIAL_PROMPT';\n\nexport const TUI_PROMPT_FLAG = '--tui-prompt' as const;\n\nexport type InitialPromptArgs = {\n /** argv with the flag and its value removed, so headless detection never mistakes the value for a prompt. */\n argv: string[];\n prompt?: string;\n /** Set when a flag was passed without a value, or both flags were passed. */\n error?: string;\n /** The flag the prompt came from; undefined when it came from the environment. */\n flag?: typeof INITIAL_PROMPT_FLAG | typeof TUI_PROMPT_FLAG;\n /**\n * `--tui-prompt` sends even when startup resumes an existing conversation;\n * `--tui-initial-prompt` and the environment variable only start a new one.\n */\n sendOnResume: boolean;\n};\n\n/**\n * Takes the interactive startup prompt from `--tui-initial-prompt <text>` or\n * `--tui-prompt <text>` (also `--flag=<text>`), falling back to\n * `MASTRACODE_TUI_INITIAL_PROMPT`.\n *\n * The environment variable is always removed from `env`: everything this\n * process spawns inherits its environment, and a nested Mastra Code (or any\n * shell the agent starts) must not send the same prompt again.\n */\nexport function takeInitialPrompt(argv: string[], env: NodeJS.ProcessEnv): InitialPromptArgs {\n const fromEnv = env[INITIAL_PROMPT_ENV];\n delete env[INITIAL_PROMPT_ENV];\n\n const rest: string[] = [];\n const found = new Map<NonNullable<InitialPromptArgs['flag']>, string>();\n let error: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n const flag = [INITIAL_PROMPT_FLAG, TUI_PROMPT_FLAG].find(f => arg === f || arg.startsWith(`${f}=`));\n if (!flag) {\n rest.push(arg);\n } else if (arg !== flag) {\n found.set(flag, arg.slice(flag.length + 1));\n } else if (argv[i + 1] === undefined) {\n error = `${flag} needs a value`;\n } else {\n found.set(flag, argv[++i]!);\n }\n }\n if (found.size > 1) error = `Use either ${INITIAL_PROMPT_FLAG} or ${TUI_PROMPT_FLAG}, not both`;\n\n const [flag, flagValue] = [...found][0] ?? [];\n const prompt = (flag ? flagValue : fromEnv)?.trim() || undefined;\n return { argv: rest, prompt, error, flag, sendOnResume: flag === TUI_PROMPT_FLAG };\n}\n\n/** The first message the TUI sends: the initial prompt, followed by any piped stdin. */\nexport function composeInitialMessage(prompt: string | undefined, pipedInput: string | null | undefined) {\n const piped = pipedInput ? `The following was piped via stdin:\\n\\n${pipedInput}` : undefined;\n if (prompt && piped) return `${prompt}\\n\\n${piped}`;\n return prompt ?? piped;\n}\n\n/**\n * Why a startup prompt can't be combined with piped stdin, if it can't.\n *\n * The first message is submitted like typed input, so a prompt starting with\n * `/` or `!` is dispatched as a command. Folding piped text into it would make\n * that text part of the command — skill arguments, or a shell script for `!`.\n */\nexport function pipedInputConflict(\n args: Pick<InitialPromptArgs, 'prompt' | 'flag'>,\n pipedInput: string | null | undefined,\n): string | undefined {\n if (!args.prompt || !pipedInput) return undefined;\n if (!args.prompt.startsWith('/') && !args.prompt.startsWith('!')) return undefined;\n const source = args.flag ?? INITIAL_PROMPT_ENV;\n return `${source} can't be combined with piped stdin when it is a slash command or starts with !`;\n}\n\n/** The TUI options for a startup prompt and/or piped stdin. */\nexport function initialMessageOptions(\n args: Pick<InitialPromptArgs, 'prompt' | 'sendOnResume'>,\n pipedInput?: string | null,\n): { initialMessage?: string; resumeSkipNotice?: string } {\n const initialMessage = composeInitialMessage(args.prompt, pipedInput);\n if (!initialMessage) return {};\n // Piped stdin on its own is always sent, as before.\n if (!args.prompt || args.sendOnResume) return { initialMessage };\n const skipped = pipedInput ? 'the initial prompt and piped input were' : 'the initial prompt was';\n return {\n initialMessage,\n resumeSkipNotice: `Resumed the existing conversation for this directory, so ${skipped} not sent. Use ${TUI_PROMPT_FLAG} to send ${pipedInput ? 'them' : 'it'} anyway.`,\n };\n}\n","import {\n createProcessMemoryDiagnosticsFromEnvironment,\n startConfiguredProcessMemoryDiagnostics,\n type ProcessMemoryDiagnostics,\n type ProcessMemoryDiagnosticsEnvironment,\n type ProcessMemoryDiagnosticsSetup,\n} from '@mastra/code-sdk/process-memory-diagnostics';\n\nexport async function startTuiProcessMemoryDiagnostics(\n env: ProcessMemoryDiagnosticsEnvironment,\n warn: (message: string) => void,\n createSetup: (\n env: ProcessMemoryDiagnosticsEnvironment,\n ) => ProcessMemoryDiagnosticsSetup = createProcessMemoryDiagnosticsFromEnvironment,\n): Promise<ProcessMemoryDiagnostics> {\n return startConfiguredProcessMemoryDiagnostics(createSetup(env), warn);\n}\n\nexport function createOneShotFatalErrorHandler(handle: (error: unknown) => void): (error: unknown) => void {\n let handlingFatalError = false;\n return error => {\n if (handlingFatalError) return;\n handlingFatalError = true;\n handle(error);\n };\n}\n\nexport function createShutdownCoordinator(\n cleanup: () => Promise<void>,\n exit: (exitCode: number) => never,\n timeoutMs = 5_000,\n): (exitCode: number) => Promise<void> {\n let shutdownPromise: Promise<void> | null = null;\n return exitCode => {\n shutdownPromise ??= (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n cleanup().catch(() => undefined),\n new Promise<void>(resolve => {\n timeout = setTimeout(resolve, timeoutMs);\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n exit(exitCode);\n })();\n return shutdownPromise;\n };\n}\n","export function parseResumeThreadId(args: string[]): string | undefined {\n if (args[0] !== 'resume') return undefined;\n\n const threadId = args[1]?.trim();\n if (!threadId || args.length !== 2) {\n throw new Error('Usage: mastracode resume <thread-id>');\n }\n return threadId;\n}\n\nexport function shouldRunHeadless(\n argv: string[],\n resumeThreadId: string | undefined,\n hasHeadlessFlag: boolean,\n): boolean {\n return !resumeThreadId && (hasHeadlessFlag || argv.includes('--help') || argv.includes('-h'));\n}\n\nexport function shouldRejectResumeWithoutTTY(resumeThreadId: string | undefined, isTTY: boolean): boolean {\n return Boolean(resumeThreadId) && !isTTY;\n}\n\nexport function formatResumeHint(threadId: string): string {\n const hasControlCharacters = [...threadId].some(character => {\n const codePoint = character.codePointAt(0)!;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n });\n const argument = /^[a-zA-Z0-9_-]+$/.test(threadId)\n ? threadId\n : hasControlCharacters\n ? `$'${[...threadId]\n .map(character => {\n const codePoint = character.codePointAt(0)!;\n if (character === \"'\") return \"\\\\'\";\n if (character === '\\\\') return '\\\\\\\\';\n if (codePoint <= 0x1f || codePoint === 0x7f) return `\\\\x${codePoint.toString(16).padStart(2, '0')}`;\n if (codePoint >= 0x80 && codePoint <= 0x9f) {\n return `\\\\u${codePoint.toString(16).padStart(4, '0')}`;\n }\n return character;\n })\n .join('')}'`\n : `'${threadId.replaceAll(\"'\", \"'\\\\''\")}'`;\n return `To continue this session, run mastracode resume ${argument}`;\n}\n","export function resolveTuiSubagents(enabled: boolean): undefined | [] {\n return enabled ? undefined : [];\n}\n","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 {\n createBrowserFromSettings,\n loadSettings,\n resolveStagehandModel,\n toActiveBrowserSettings,\n} from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport {\n stopProcessMemoryDiagnosticsWithTimeout,\n type ProcessMemoryDiagnostics,\n} from '@mastra/code-sdk/process-memory-diagnostics';\nimport { setupDebugLogging, truncateLogFile } 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 { TUI_CO_AUTHOR } from './commit-attribution.js';\nimport { initialMessageOptions, pipedInputConflict, takeInitialPrompt } from './initial-prompt.js';\nimport {\n createOneShotFatalErrorHandler,\n createShutdownCoordinator,\n startTuiProcessMemoryDiagnostics,\n} from './process-memory-diagnostics-lifecycle.js';\nimport {\n formatResumeHint,\n parseResumeThreadId,\n shouldRejectResumeWithoutTTY,\n shouldRunHeadless,\n} from './resume-command.js';\nimport { resolveTuiSubagents } from './subagent-settings.js';\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 threadScheduler: Awaited<ReturnType<typeof createMastraCode>>['threadScheduler'] | undefined;\nlet stopNotificationDispatch: Awaited<ReturnType<typeof createMastraCode>>['stopNotificationDispatch'] | undefined;\nlet releaseThreadClaims: Awaited<ReturnType<typeof createMastraCode>>['releaseThreadClaims'] | undefined;\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet processMemoryDiagnostics: ProcessMemoryDiagnostics | undefined;\nlet storageClosed = false;\nlet cleanupPromise: Promise<void> | null = null;\nlet getResumeThreadId: (() => string | null) | undefined;\n\nconst CRASH_LOG_PATH = '/tmp/mastra-crash.log';\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(startupMessage: ReturnType<typeof initialMessageOptions> = {}, resumeThreadId?: string) {\n const settings = loadSettings();\n processMemoryDiagnostics = await startTuiProcessMemoryDiagnostics(process.env, warning => {\n console.info(`⚠ ${warning}`);\n });\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = (chatModelId: string | undefined) => {\n browserPromise ??= createBrowserFromSettings(settings.browser, { chatModelId });\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n createInitialThread: false,\n coAuthor: TUI_CO_AUTHOR,\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n subagents: resolveTuiSubagents(settings.preferences.subagentsEnabled),\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 threadScheduler = result.threadScheduler;\n stopNotificationDispatch = result.stopNotificationDispatch;\n releaseThreadClaims = result.releaseThreadClaims;\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 getResumeThreadId = () => (tui ? tui.getResumeThreadId() : session.thread.getId());\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 processMemoryDiagnostics,\n knowledgeInspector: result.knowledgeInspector,\n threadScheduler: result.threadScheduler,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n initialModelOverride: Boolean(initialState?.currentModelId),\n ...(resumeThreadId ? { resumeThreadId } : {}),\n githubSignals: result.githubSignals,\n backgroundToolsEnabled: result.backgroundToolsEnabled,\n backgroundCompletionEvents: result.backgroundCompletionEvents,\n exit: exitCode => void shutdownAndExit(exitCode),\n ...startupMessage,\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n // Captured once: the Stagehand instance is fixed at launch and shared by every thread.\n const chatModelId = session.model.get();\n void loadBrowser(chatModelId)\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state\n .set({\n activeBrowserSettings: toActiveBrowserSettings(settings.browser),\n activeBrowserModel: resolveStagehandModel(settings.browser, { chatModelId }),\n } as any)\n .catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = (): Promise<void> => {\n cleanupPromise ??= (async () => {\n releaseAllThreadLocks();\n // Release thread claims before the slow teardown below, so a restarted\n // session can claim its thread (and peers can reach it) right away.\n try {\n releaseThreadClaims?.();\n } catch {\n // Best-effort — the process is exiting.\n }\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 diagnosticsShutdown = processMemoryDiagnostics\n ? stopProcessMemoryDiagnosticsWithTimeout(processMemoryDiagnostics, message => console.warn(message))\n : undefined;\n // Schedules live only in this process; stop their timers so none fires mid-shutdown.\n threadScheduler?.stop();\n // Release this process's notification dispatch leases before the pubsub that holds them closes.\n await stopNotificationDispatch?.().catch(() => {});\n await Promise.allSettled([mcpManager?.disconnect(), controller?.stopIntervals()]);\n // Mastra owns the workspaces and must destroy them to stop retained language\n // servers before storage is closed.\n await Promise.allSettled([controller?.getMastra()?.shutdown(), analytics?.shutdown()]);\n // The signals pubsub is Mastra's event bus: in-flight runs and background\n // tasks drain through it during shutdown, so close it only afterwards. Call\n // close() on the object; a detached method loses `this` and rejects silently.\n const pubsubToClose = signalsPubSub as { close?: () => Promise<void> | void } | undefined;\n await Promise.allSettled([pubsubToClose?.close?.()]);\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 await diagnosticsShutdown;\n })();\n return cleanupPromise;\n};\n\nconst shutdownAndExit = createShutdownCoordinator(asyncCleanup, exitCode => process.exit(exitCode));\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 try {\n const threadId = getResumeThreadId?.();\n if (threadId) {\n process.stdout.write(`\\n${formatResumeHint(threadId)}\\n`);\n }\n } catch {\n // session state or stdout may already be closed during exit\n }\n});\n\n// Start durable diagnostics shutdown before synchronous TUI teardown so a stalled\n// terminal cleanup cannot prevent the final profile capture. The exit handler still\n// provides a failsafe terminal reset if teardown throws.\nconst handleTermSignal = () => {\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void shutdownAndExit(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\nconst handleFatalError = createOneShotFatalErrorHandler((error: unknown): void => {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => {\n try {\n process.stderr.write(msg + '\\n');\n } catch {}\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 void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n return;\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 truncateLogFile(CRASH_LOG_PATH);\n fs.appendFileSync(CRASH_LOG_PATH, crashLog);\n truncateLogFile(CRASH_LOG_PATH);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n});\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n // Storage maintenance without the TUI, so a database can still be pruned and\n // compacted when the interactive session won't start. Checked before the\n // headless branch below, which would otherwise claim `prune --help`.\n if (process.argv[2] === 'prune') {\n const { runPruneCommand } = await import('@mastra/code-sdk/utils/prune-cli');\n return process.exit(await runPruneCommand(process.argv.slice(3)));\n }\n\n const loginIndex = process.argv.findIndex(\n (arg, index) => index >= 2 && arg !== '--acp' && arg !== '--dangerous-auto-approve',\n );\n if (process.argv[loginIndex] === 'login') {\n const { runLoginCommand } = await import('./login-command.js');\n const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });\n await new Promise(resolve => process.stdout.write('', resolve));\n return process.exit(code);\n }\n\n const initialPrompt = takeInitialPrompt(process.argv, process.env);\n if (initialPrompt.error) {\n process.stderr.write(`${initialPrompt.error}\\n`);\n process.exit(1);\n }\n if (initialPrompt.flag) process.argv = initialPrompt.argv;\n // The flag only means something to the interactive TUI. Paths that can't run\n // it reject the flag instead of dropping the prompt; an env var prompt is\n // just ignored there.\n const rejectInitialPromptFlag = (reason: string) => {\n if (!initialPrompt.flag) return;\n process.stderr.write(`${initialPrompt.flag} starts the interactive TUI; ${reason}\\n`);\n process.exit(1);\n };\n\n let resumeThreadId: string | undefined;\n try {\n resumeThreadId = parseResumeThreadId(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const headless = hasHeadlessFlag(process.argv);\n if (shouldRunHeadless(process.argv, resumeThreadId, headless)) {\n if (headless) rejectInitialPromptFlag('use --prompt for headless runs');\n return runMCCli(undefined, { coAuthor: TUI_CO_AUTHOR });\n }\n\n if (process.argv.includes('--acp')) {\n rejectInitialPromptFlag('it cannot be combined with --acp');\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({\n dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve'),\n coAuthor: TUI_CO_AUTHOR,\n });\n }\n\n if (shouldRejectResumeWithoutTTY(resumeThreadId, Boolean(process.stdin.isTTY))) {\n process.stderr.write('mastracode resume requires an interactive terminal.\\n');\n process.exitCode = 1;\n return;\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 rejectInitialPromptFlag('no TTY is available, so use --prompt for headless runs');\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput, { coAuthor: TUI_CO_AUTHOR });\n }\n }\n\n const conflict = pipedInputConflict(initialPrompt, pipedInput);\n if (conflict) {\n process.stderr.write(`${conflict}\\n`);\n process.exit(1);\n }\n\n return tuiMain(initialMessageOptions(initialPrompt, pipedInput), resumeThreadId);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { b as TUI_CO_AUTHOR, d as detectTerminalTheme, f as applyThemeMode, t as MastraTUI, v as restoreTerminalForeground } from "./tui-
|
|
2
|
+
import { b as TUI_CO_AUTHOR, d as detectTerminalTheme, f as applyThemeMode, t as MastraTUI, v as restoreTerminalForeground } from "./tui-5IfsALo2.js";
|
|
3
3
|
import { createMastraCode } from "@mastra/code-sdk";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import { createMastraCodeAnalytics } from "@mastra/code-sdk/analytics";
|
|
@@ -139,7 +139,7 @@ function resolveTuiSubagents(enabled) {
|
|
|
139
139
|
//#endregion
|
|
140
140
|
//#region src/version.ts
|
|
141
141
|
function getCurrentVersion() {
|
|
142
|
-
return "0.
|
|
142
|
+
return "0.46.0-alpha.1";
|
|
143
143
|
}
|
|
144
144
|
//#endregion
|
|
145
145
|
//#region src/main.ts
|
|
@@ -155,6 +155,7 @@ let storageMaintenance;
|
|
|
155
155
|
let stopPluginSignalProviders;
|
|
156
156
|
let threadScheduler;
|
|
157
157
|
let stopNotificationDispatch;
|
|
158
|
+
let releaseThreadClaims;
|
|
158
159
|
let analytics;
|
|
159
160
|
let tui;
|
|
160
161
|
let processMemoryDiagnostics;
|
|
@@ -215,6 +216,7 @@ async function tuiMain(startupMessage = {}, resumeThreadId) {
|
|
|
215
216
|
stopPluginSignalProviders = result.stopPluginSignalProviders;
|
|
216
217
|
threadScheduler = result.threadScheduler;
|
|
217
218
|
stopNotificationDispatch = result.stopNotificationDispatch;
|
|
219
|
+
releaseThreadClaims = result.releaseThreadClaims;
|
|
218
220
|
if (result.storageWarning) console.info(`⚠ ${result.storageWarning}`);
|
|
219
221
|
if (result.observabilityWarning) console.info(`⚠ ${result.observabilityWarning}`);
|
|
220
222
|
setupDebugLogging();
|
|
@@ -283,6 +285,9 @@ async function tuiMain(startupMessage = {}, resumeThreadId) {
|
|
|
283
285
|
const asyncCleanup = () => {
|
|
284
286
|
cleanupPromise ??= (async () => {
|
|
285
287
|
releaseAllThreadLocks();
|
|
288
|
+
try {
|
|
289
|
+
releaseThreadClaims?.();
|
|
290
|
+
} catch {}
|
|
286
291
|
try {
|
|
287
292
|
stopPluginSignalProviders?.();
|
|
288
293
|
} catch {}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../src/initial-prompt.ts","../src/process-memory-diagnostics-lifecycle.ts","../src/resume-command.ts","../src/subagent-settings.ts","../src/version.ts","../src/main.ts"],"sourcesContent":["export const INITIAL_PROMPT_FLAG = '--tui-initial-prompt' as const;\nexport const INITIAL_PROMPT_ENV = 'MASTRACODE_TUI_INITIAL_PROMPT';\n\nexport const TUI_PROMPT_FLAG = '--tui-prompt' as const;\n\nexport type InitialPromptArgs = {\n /** argv with the flag and its value removed, so headless detection never mistakes the value for a prompt. */\n argv: string[];\n prompt?: string;\n /** Set when a flag was passed without a value, or both flags were passed. */\n error?: string;\n /** The flag the prompt came from; undefined when it came from the environment. */\n flag?: typeof INITIAL_PROMPT_FLAG | typeof TUI_PROMPT_FLAG;\n /**\n * `--tui-prompt` sends even when startup resumes an existing conversation;\n * `--tui-initial-prompt` and the environment variable only start a new one.\n */\n sendOnResume: boolean;\n};\n\n/**\n * Takes the interactive startup prompt from `--tui-initial-prompt <text>` or\n * `--tui-prompt <text>` (also `--flag=<text>`), falling back to\n * `MASTRACODE_TUI_INITIAL_PROMPT`.\n *\n * The environment variable is always removed from `env`: everything this\n * process spawns inherits its environment, and a nested Mastra Code (or any\n * shell the agent starts) must not send the same prompt again.\n */\nexport function takeInitialPrompt(argv: string[], env: NodeJS.ProcessEnv): InitialPromptArgs {\n const fromEnv = env[INITIAL_PROMPT_ENV];\n delete env[INITIAL_PROMPT_ENV];\n\n const rest: string[] = [];\n const found = new Map<NonNullable<InitialPromptArgs['flag']>, string>();\n let error: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n const flag = [INITIAL_PROMPT_FLAG, TUI_PROMPT_FLAG].find(f => arg === f || arg.startsWith(`${f}=`));\n if (!flag) {\n rest.push(arg);\n } else if (arg !== flag) {\n found.set(flag, arg.slice(flag.length + 1));\n } else if (argv[i + 1] === undefined) {\n error = `${flag} needs a value`;\n } else {\n found.set(flag, argv[++i]!);\n }\n }\n if (found.size > 1) error = `Use either ${INITIAL_PROMPT_FLAG} or ${TUI_PROMPT_FLAG}, not both`;\n\n const [flag, flagValue] = [...found][0] ?? [];\n const prompt = (flag ? flagValue : fromEnv)?.trim() || undefined;\n return { argv: rest, prompt, error, flag, sendOnResume: flag === TUI_PROMPT_FLAG };\n}\n\n/** The first message the TUI sends: the initial prompt, followed by any piped stdin. */\nexport function composeInitialMessage(prompt: string | undefined, pipedInput: string | null | undefined) {\n const piped = pipedInput ? `The following was piped via stdin:\\n\\n${pipedInput}` : undefined;\n if (prompt && piped) return `${prompt}\\n\\n${piped}`;\n return prompt ?? piped;\n}\n\n/**\n * Why a startup prompt can't be combined with piped stdin, if it can't.\n *\n * The first message is submitted like typed input, so a prompt starting with\n * `/` or `!` is dispatched as a command. Folding piped text into it would make\n * that text part of the command — skill arguments, or a shell script for `!`.\n */\nexport function pipedInputConflict(\n args: Pick<InitialPromptArgs, 'prompt' | 'flag'>,\n pipedInput: string | null | undefined,\n): string | undefined {\n if (!args.prompt || !pipedInput) return undefined;\n if (!args.prompt.startsWith('/') && !args.prompt.startsWith('!')) return undefined;\n const source = args.flag ?? INITIAL_PROMPT_ENV;\n return `${source} can't be combined with piped stdin when it is a slash command or starts with !`;\n}\n\n/** The TUI options for a startup prompt and/or piped stdin. */\nexport function initialMessageOptions(\n args: Pick<InitialPromptArgs, 'prompt' | 'sendOnResume'>,\n pipedInput?: string | null,\n): { initialMessage?: string; resumeSkipNotice?: string } {\n const initialMessage = composeInitialMessage(args.prompt, pipedInput);\n if (!initialMessage) return {};\n // Piped stdin on its own is always sent, as before.\n if (!args.prompt || args.sendOnResume) return { initialMessage };\n const skipped = pipedInput ? 'the initial prompt and piped input were' : 'the initial prompt was';\n return {\n initialMessage,\n resumeSkipNotice: `Resumed the existing conversation for this directory, so ${skipped} not sent. Use ${TUI_PROMPT_FLAG} to send ${pipedInput ? 'them' : 'it'} anyway.`,\n };\n}\n","import {\n createProcessMemoryDiagnosticsFromEnvironment,\n startConfiguredProcessMemoryDiagnostics,\n type ProcessMemoryDiagnostics,\n type ProcessMemoryDiagnosticsEnvironment,\n type ProcessMemoryDiagnosticsSetup,\n} from '@mastra/code-sdk/process-memory-diagnostics';\n\nexport async function startTuiProcessMemoryDiagnostics(\n env: ProcessMemoryDiagnosticsEnvironment,\n warn: (message: string) => void,\n createSetup: (\n env: ProcessMemoryDiagnosticsEnvironment,\n ) => ProcessMemoryDiagnosticsSetup = createProcessMemoryDiagnosticsFromEnvironment,\n): Promise<ProcessMemoryDiagnostics> {\n return startConfiguredProcessMemoryDiagnostics(createSetup(env), warn);\n}\n\nexport function createOneShotFatalErrorHandler(handle: (error: unknown) => void): (error: unknown) => void {\n let handlingFatalError = false;\n return error => {\n if (handlingFatalError) return;\n handlingFatalError = true;\n handle(error);\n };\n}\n\nexport function createShutdownCoordinator(\n cleanup: () => Promise<void>,\n exit: (exitCode: number) => never,\n timeoutMs = 5_000,\n): (exitCode: number) => Promise<void> {\n let shutdownPromise: Promise<void> | null = null;\n return exitCode => {\n shutdownPromise ??= (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n cleanup().catch(() => undefined),\n new Promise<void>(resolve => {\n timeout = setTimeout(resolve, timeoutMs);\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n exit(exitCode);\n })();\n return shutdownPromise;\n };\n}\n","export function parseResumeThreadId(args: string[]): string | undefined {\n if (args[0] !== 'resume') return undefined;\n\n const threadId = args[1]?.trim();\n if (!threadId || args.length !== 2) {\n throw new Error('Usage: mastracode resume <thread-id>');\n }\n return threadId;\n}\n\nexport function shouldRunHeadless(\n argv: string[],\n resumeThreadId: string | undefined,\n hasHeadlessFlag: boolean,\n): boolean {\n return !resumeThreadId && (hasHeadlessFlag || argv.includes('--help') || argv.includes('-h'));\n}\n\nexport function shouldRejectResumeWithoutTTY(resumeThreadId: string | undefined, isTTY: boolean): boolean {\n return Boolean(resumeThreadId) && !isTTY;\n}\n\nexport function formatResumeHint(threadId: string): string {\n const hasControlCharacters = [...threadId].some(character => {\n const codePoint = character.codePointAt(0)!;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n });\n const argument = /^[a-zA-Z0-9_-]+$/.test(threadId)\n ? threadId\n : hasControlCharacters\n ? `$'${[...threadId]\n .map(character => {\n const codePoint = character.codePointAt(0)!;\n if (character === \"'\") return \"\\\\'\";\n if (character === '\\\\') return '\\\\\\\\';\n if (codePoint <= 0x1f || codePoint === 0x7f) return `\\\\x${codePoint.toString(16).padStart(2, '0')}`;\n if (codePoint >= 0x80 && codePoint <= 0x9f) {\n return `\\\\u${codePoint.toString(16).padStart(4, '0')}`;\n }\n return character;\n })\n .join('')}'`\n : `'${threadId.replaceAll(\"'\", \"'\\\\''\")}'`;\n return `To continue this session, run mastracode resume ${argument}`;\n}\n","export function resolveTuiSubagents(enabled: boolean): undefined | [] {\n return enabled ? undefined : [];\n}\n","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 {\n createBrowserFromSettings,\n loadSettings,\n resolveStagehandModel,\n toActiveBrowserSettings,\n} from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport {\n stopProcessMemoryDiagnosticsWithTimeout,\n type ProcessMemoryDiagnostics,\n} from '@mastra/code-sdk/process-memory-diagnostics';\nimport { setupDebugLogging, truncateLogFile } 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 { TUI_CO_AUTHOR } from './commit-attribution.js';\nimport { initialMessageOptions, pipedInputConflict, takeInitialPrompt } from './initial-prompt.js';\nimport {\n createOneShotFatalErrorHandler,\n createShutdownCoordinator,\n startTuiProcessMemoryDiagnostics,\n} from './process-memory-diagnostics-lifecycle.js';\nimport {\n formatResumeHint,\n parseResumeThreadId,\n shouldRejectResumeWithoutTTY,\n shouldRunHeadless,\n} from './resume-command.js';\nimport { resolveTuiSubagents } from './subagent-settings.js';\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 threadScheduler: Awaited<ReturnType<typeof createMastraCode>>['threadScheduler'] | undefined;\nlet stopNotificationDispatch: Awaited<ReturnType<typeof createMastraCode>>['stopNotificationDispatch'] | undefined;\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet processMemoryDiagnostics: ProcessMemoryDiagnostics | undefined;\nlet storageClosed = false;\nlet cleanupPromise: Promise<void> | null = null;\nlet getResumeThreadId: (() => string | null) | undefined;\n\nconst CRASH_LOG_PATH = '/tmp/mastra-crash.log';\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(startupMessage: ReturnType<typeof initialMessageOptions> = {}, resumeThreadId?: string) {\n const settings = loadSettings();\n processMemoryDiagnostics = await startTuiProcessMemoryDiagnostics(process.env, warning => {\n console.info(`⚠ ${warning}`);\n });\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = (chatModelId: string | undefined) => {\n browserPromise ??= createBrowserFromSettings(settings.browser, { chatModelId });\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n createInitialThread: false,\n coAuthor: TUI_CO_AUTHOR,\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n subagents: resolveTuiSubagents(settings.preferences.subagentsEnabled),\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 threadScheduler = result.threadScheduler;\n stopNotificationDispatch = result.stopNotificationDispatch;\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 getResumeThreadId = () => (tui ? tui.getResumeThreadId() : session.thread.getId());\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 processMemoryDiagnostics,\n knowledgeInspector: result.knowledgeInspector,\n threadScheduler: result.threadScheduler,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n initialModelOverride: Boolean(initialState?.currentModelId),\n ...(resumeThreadId ? { resumeThreadId } : {}),\n githubSignals: result.githubSignals,\n backgroundToolsEnabled: result.backgroundToolsEnabled,\n backgroundCompletionEvents: result.backgroundCompletionEvents,\n exit: exitCode => void shutdownAndExit(exitCode),\n ...startupMessage,\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n // Captured once: the Stagehand instance is fixed at launch and shared by every thread.\n const chatModelId = session.model.get();\n void loadBrowser(chatModelId)\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state\n .set({\n activeBrowserSettings: toActiveBrowserSettings(settings.browser),\n activeBrowserModel: resolveStagehandModel(settings.browser, { chatModelId }),\n } as any)\n .catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = (): Promise<void> => {\n cleanupPromise ??= (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 diagnosticsShutdown = processMemoryDiagnostics\n ? stopProcessMemoryDiagnosticsWithTimeout(processMemoryDiagnostics, message => console.warn(message))\n : undefined;\n // Schedules live only in this process; stop their timers so none fires mid-shutdown.\n threadScheduler?.stop();\n // Release this process's notification dispatch leases before the pubsub that holds them closes.\n await stopNotificationDispatch?.().catch(() => {});\n await Promise.allSettled([mcpManager?.disconnect(), controller?.stopIntervals()]);\n // Mastra owns the workspaces and must destroy them to stop retained language\n // servers before storage is closed.\n await Promise.allSettled([controller?.getMastra()?.shutdown(), analytics?.shutdown()]);\n // The signals pubsub is Mastra's event bus: in-flight runs and background\n // tasks drain through it during shutdown, so close it only afterwards. Call\n // close() on the object; a detached method loses `this` and rejects silently.\n const pubsubToClose = signalsPubSub as { close?: () => Promise<void> | void } | undefined;\n await Promise.allSettled([pubsubToClose?.close?.()]);\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 await diagnosticsShutdown;\n })();\n return cleanupPromise;\n};\n\nconst shutdownAndExit = createShutdownCoordinator(asyncCleanup, exitCode => process.exit(exitCode));\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 try {\n const threadId = getResumeThreadId?.();\n if (threadId) {\n process.stdout.write(`\\n${formatResumeHint(threadId)}\\n`);\n }\n } catch {\n // session state or stdout may already be closed during exit\n }\n});\n\n// Start durable diagnostics shutdown before synchronous TUI teardown so a stalled\n// terminal cleanup cannot prevent the final profile capture. The exit handler still\n// provides a failsafe terminal reset if teardown throws.\nconst handleTermSignal = () => {\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void shutdownAndExit(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\nconst handleFatalError = createOneShotFatalErrorHandler((error: unknown): void => {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => {\n try {\n process.stderr.write(msg + '\\n');\n } catch {}\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 void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n return;\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 truncateLogFile(CRASH_LOG_PATH);\n fs.appendFileSync(CRASH_LOG_PATH, crashLog);\n truncateLogFile(CRASH_LOG_PATH);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n});\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n // Storage maintenance without the TUI, so a database can still be pruned and\n // compacted when the interactive session won't start. Checked before the\n // headless branch below, which would otherwise claim `prune --help`.\n if (process.argv[2] === 'prune') {\n const { runPruneCommand } = await import('@mastra/code-sdk/utils/prune-cli');\n return process.exit(await runPruneCommand(process.argv.slice(3)));\n }\n\n const loginIndex = process.argv.findIndex(\n (arg, index) => index >= 2 && arg !== '--acp' && arg !== '--dangerous-auto-approve',\n );\n if (process.argv[loginIndex] === 'login') {\n const { runLoginCommand } = await import('./login-command.js');\n const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });\n await new Promise(resolve => process.stdout.write('', resolve));\n return process.exit(code);\n }\n\n const initialPrompt = takeInitialPrompt(process.argv, process.env);\n if (initialPrompt.error) {\n process.stderr.write(`${initialPrompt.error}\\n`);\n process.exit(1);\n }\n if (initialPrompt.flag) process.argv = initialPrompt.argv;\n // The flag only means something to the interactive TUI. Paths that can't run\n // it reject the flag instead of dropping the prompt; an env var prompt is\n // just ignored there.\n const rejectInitialPromptFlag = (reason: string) => {\n if (!initialPrompt.flag) return;\n process.stderr.write(`${initialPrompt.flag} starts the interactive TUI; ${reason}\\n`);\n process.exit(1);\n };\n\n let resumeThreadId: string | undefined;\n try {\n resumeThreadId = parseResumeThreadId(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const headless = hasHeadlessFlag(process.argv);\n if (shouldRunHeadless(process.argv, resumeThreadId, headless)) {\n if (headless) rejectInitialPromptFlag('use --prompt for headless runs');\n return runMCCli(undefined, { coAuthor: TUI_CO_AUTHOR });\n }\n\n if (process.argv.includes('--acp')) {\n rejectInitialPromptFlag('it cannot be combined with --acp');\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({\n dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve'),\n coAuthor: TUI_CO_AUTHOR,\n });\n }\n\n if (shouldRejectResumeWithoutTTY(resumeThreadId, Boolean(process.stdin.isTTY))) {\n process.stderr.write('mastracode resume requires an interactive terminal.\\n');\n process.exitCode = 1;\n return;\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 rejectInitialPromptFlag('no TTY is available, so use --prompt for headless runs');\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput, { coAuthor: TUI_CO_AUTHOR });\n }\n }\n\n const conflict = pipedInputConflict(initialPrompt, pipedInput);\n if (conflict) {\n process.stderr.write(`${conflict}\\n`);\n process.exit(1);\n }\n\n return tuiMain(initialMessageOptions(initialPrompt, pipedInput), resumeThreadId);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../src/initial-prompt.ts","../src/process-memory-diagnostics-lifecycle.ts","../src/resume-command.ts","../src/subagent-settings.ts","../src/version.ts","../src/main.ts"],"sourcesContent":["export const INITIAL_PROMPT_FLAG = '--tui-initial-prompt' as const;\nexport const INITIAL_PROMPT_ENV = 'MASTRACODE_TUI_INITIAL_PROMPT';\n\nexport const TUI_PROMPT_FLAG = '--tui-prompt' as const;\n\nexport type InitialPromptArgs = {\n /** argv with the flag and its value removed, so headless detection never mistakes the value for a prompt. */\n argv: string[];\n prompt?: string;\n /** Set when a flag was passed without a value, or both flags were passed. */\n error?: string;\n /** The flag the prompt came from; undefined when it came from the environment. */\n flag?: typeof INITIAL_PROMPT_FLAG | typeof TUI_PROMPT_FLAG;\n /**\n * `--tui-prompt` sends even when startup resumes an existing conversation;\n * `--tui-initial-prompt` and the environment variable only start a new one.\n */\n sendOnResume: boolean;\n};\n\n/**\n * Takes the interactive startup prompt from `--tui-initial-prompt <text>` or\n * `--tui-prompt <text>` (also `--flag=<text>`), falling back to\n * `MASTRACODE_TUI_INITIAL_PROMPT`.\n *\n * The environment variable is always removed from `env`: everything this\n * process spawns inherits its environment, and a nested Mastra Code (or any\n * shell the agent starts) must not send the same prompt again.\n */\nexport function takeInitialPrompt(argv: string[], env: NodeJS.ProcessEnv): InitialPromptArgs {\n const fromEnv = env[INITIAL_PROMPT_ENV];\n delete env[INITIAL_PROMPT_ENV];\n\n const rest: string[] = [];\n const found = new Map<NonNullable<InitialPromptArgs['flag']>, string>();\n let error: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n const flag = [INITIAL_PROMPT_FLAG, TUI_PROMPT_FLAG].find(f => arg === f || arg.startsWith(`${f}=`));\n if (!flag) {\n rest.push(arg);\n } else if (arg !== flag) {\n found.set(flag, arg.slice(flag.length + 1));\n } else if (argv[i + 1] === undefined) {\n error = `${flag} needs a value`;\n } else {\n found.set(flag, argv[++i]!);\n }\n }\n if (found.size > 1) error = `Use either ${INITIAL_PROMPT_FLAG} or ${TUI_PROMPT_FLAG}, not both`;\n\n const [flag, flagValue] = [...found][0] ?? [];\n const prompt = (flag ? flagValue : fromEnv)?.trim() || undefined;\n return { argv: rest, prompt, error, flag, sendOnResume: flag === TUI_PROMPT_FLAG };\n}\n\n/** The first message the TUI sends: the initial prompt, followed by any piped stdin. */\nexport function composeInitialMessage(prompt: string | undefined, pipedInput: string | null | undefined) {\n const piped = pipedInput ? `The following was piped via stdin:\\n\\n${pipedInput}` : undefined;\n if (prompt && piped) return `${prompt}\\n\\n${piped}`;\n return prompt ?? piped;\n}\n\n/**\n * Why a startup prompt can't be combined with piped stdin, if it can't.\n *\n * The first message is submitted like typed input, so a prompt starting with\n * `/` or `!` is dispatched as a command. Folding piped text into it would make\n * that text part of the command — skill arguments, or a shell script for `!`.\n */\nexport function pipedInputConflict(\n args: Pick<InitialPromptArgs, 'prompt' | 'flag'>,\n pipedInput: string | null | undefined,\n): string | undefined {\n if (!args.prompt || !pipedInput) return undefined;\n if (!args.prompt.startsWith('/') && !args.prompt.startsWith('!')) return undefined;\n const source = args.flag ?? INITIAL_PROMPT_ENV;\n return `${source} can't be combined with piped stdin when it is a slash command or starts with !`;\n}\n\n/** The TUI options for a startup prompt and/or piped stdin. */\nexport function initialMessageOptions(\n args: Pick<InitialPromptArgs, 'prompt' | 'sendOnResume'>,\n pipedInput?: string | null,\n): { initialMessage?: string; resumeSkipNotice?: string } {\n const initialMessage = composeInitialMessage(args.prompt, pipedInput);\n if (!initialMessage) return {};\n // Piped stdin on its own is always sent, as before.\n if (!args.prompt || args.sendOnResume) return { initialMessage };\n const skipped = pipedInput ? 'the initial prompt and piped input were' : 'the initial prompt was';\n return {\n initialMessage,\n resumeSkipNotice: `Resumed the existing conversation for this directory, so ${skipped} not sent. Use ${TUI_PROMPT_FLAG} to send ${pipedInput ? 'them' : 'it'} anyway.`,\n };\n}\n","import {\n createProcessMemoryDiagnosticsFromEnvironment,\n startConfiguredProcessMemoryDiagnostics,\n type ProcessMemoryDiagnostics,\n type ProcessMemoryDiagnosticsEnvironment,\n type ProcessMemoryDiagnosticsSetup,\n} from '@mastra/code-sdk/process-memory-diagnostics';\n\nexport async function startTuiProcessMemoryDiagnostics(\n env: ProcessMemoryDiagnosticsEnvironment,\n warn: (message: string) => void,\n createSetup: (\n env: ProcessMemoryDiagnosticsEnvironment,\n ) => ProcessMemoryDiagnosticsSetup = createProcessMemoryDiagnosticsFromEnvironment,\n): Promise<ProcessMemoryDiagnostics> {\n return startConfiguredProcessMemoryDiagnostics(createSetup(env), warn);\n}\n\nexport function createOneShotFatalErrorHandler(handle: (error: unknown) => void): (error: unknown) => void {\n let handlingFatalError = false;\n return error => {\n if (handlingFatalError) return;\n handlingFatalError = true;\n handle(error);\n };\n}\n\nexport function createShutdownCoordinator(\n cleanup: () => Promise<void>,\n exit: (exitCode: number) => never,\n timeoutMs = 5_000,\n): (exitCode: number) => Promise<void> {\n let shutdownPromise: Promise<void> | null = null;\n return exitCode => {\n shutdownPromise ??= (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n cleanup().catch(() => undefined),\n new Promise<void>(resolve => {\n timeout = setTimeout(resolve, timeoutMs);\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n exit(exitCode);\n })();\n return shutdownPromise;\n };\n}\n","export function parseResumeThreadId(args: string[]): string | undefined {\n if (args[0] !== 'resume') return undefined;\n\n const threadId = args[1]?.trim();\n if (!threadId || args.length !== 2) {\n throw new Error('Usage: mastracode resume <thread-id>');\n }\n return threadId;\n}\n\nexport function shouldRunHeadless(\n argv: string[],\n resumeThreadId: string | undefined,\n hasHeadlessFlag: boolean,\n): boolean {\n return !resumeThreadId && (hasHeadlessFlag || argv.includes('--help') || argv.includes('-h'));\n}\n\nexport function shouldRejectResumeWithoutTTY(resumeThreadId: string | undefined, isTTY: boolean): boolean {\n return Boolean(resumeThreadId) && !isTTY;\n}\n\nexport function formatResumeHint(threadId: string): string {\n const hasControlCharacters = [...threadId].some(character => {\n const codePoint = character.codePointAt(0)!;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n });\n const argument = /^[a-zA-Z0-9_-]+$/.test(threadId)\n ? threadId\n : hasControlCharacters\n ? `$'${[...threadId]\n .map(character => {\n const codePoint = character.codePointAt(0)!;\n if (character === \"'\") return \"\\\\'\";\n if (character === '\\\\') return '\\\\\\\\';\n if (codePoint <= 0x1f || codePoint === 0x7f) return `\\\\x${codePoint.toString(16).padStart(2, '0')}`;\n if (codePoint >= 0x80 && codePoint <= 0x9f) {\n return `\\\\u${codePoint.toString(16).padStart(4, '0')}`;\n }\n return character;\n })\n .join('')}'`\n : `'${threadId.replaceAll(\"'\", \"'\\\\''\")}'`;\n return `To continue this session, run mastracode resume ${argument}`;\n}\n","export function resolveTuiSubagents(enabled: boolean): undefined | [] {\n return enabled ? undefined : [];\n}\n","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 {\n createBrowserFromSettings,\n loadSettings,\n resolveStagehandModel,\n toActiveBrowserSettings,\n} from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport {\n stopProcessMemoryDiagnosticsWithTimeout,\n type ProcessMemoryDiagnostics,\n} from '@mastra/code-sdk/process-memory-diagnostics';\nimport { setupDebugLogging, truncateLogFile } 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 { TUI_CO_AUTHOR } from './commit-attribution.js';\nimport { initialMessageOptions, pipedInputConflict, takeInitialPrompt } from './initial-prompt.js';\nimport {\n createOneShotFatalErrorHandler,\n createShutdownCoordinator,\n startTuiProcessMemoryDiagnostics,\n} from './process-memory-diagnostics-lifecycle.js';\nimport {\n formatResumeHint,\n parseResumeThreadId,\n shouldRejectResumeWithoutTTY,\n shouldRunHeadless,\n} from './resume-command.js';\nimport { resolveTuiSubagents } from './subagent-settings.js';\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 threadScheduler: Awaited<ReturnType<typeof createMastraCode>>['threadScheduler'] | undefined;\nlet stopNotificationDispatch: Awaited<ReturnType<typeof createMastraCode>>['stopNotificationDispatch'] | undefined;\nlet releaseThreadClaims: Awaited<ReturnType<typeof createMastraCode>>['releaseThreadClaims'] | undefined;\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet processMemoryDiagnostics: ProcessMemoryDiagnostics | undefined;\nlet storageClosed = false;\nlet cleanupPromise: Promise<void> | null = null;\nlet getResumeThreadId: (() => string | null) | undefined;\n\nconst CRASH_LOG_PATH = '/tmp/mastra-crash.log';\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(startupMessage: ReturnType<typeof initialMessageOptions> = {}, resumeThreadId?: string) {\n const settings = loadSettings();\n processMemoryDiagnostics = await startTuiProcessMemoryDiagnostics(process.env, warning => {\n console.info(`⚠ ${warning}`);\n });\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = (chatModelId: string | undefined) => {\n browserPromise ??= createBrowserFromSettings(settings.browser, { chatModelId });\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n createInitialThread: false,\n coAuthor: TUI_CO_AUTHOR,\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n subagents: resolveTuiSubagents(settings.preferences.subagentsEnabled),\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 threadScheduler = result.threadScheduler;\n stopNotificationDispatch = result.stopNotificationDispatch;\n releaseThreadClaims = result.releaseThreadClaims;\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 getResumeThreadId = () => (tui ? tui.getResumeThreadId() : session.thread.getId());\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 processMemoryDiagnostics,\n knowledgeInspector: result.knowledgeInspector,\n threadScheduler: result.threadScheduler,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n initialModelOverride: Boolean(initialState?.currentModelId),\n ...(resumeThreadId ? { resumeThreadId } : {}),\n githubSignals: result.githubSignals,\n backgroundToolsEnabled: result.backgroundToolsEnabled,\n backgroundCompletionEvents: result.backgroundCompletionEvents,\n exit: exitCode => void shutdownAndExit(exitCode),\n ...startupMessage,\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n // Captured once: the Stagehand instance is fixed at launch and shared by every thread.\n const chatModelId = session.model.get();\n void loadBrowser(chatModelId)\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state\n .set({\n activeBrowserSettings: toActiveBrowserSettings(settings.browser),\n activeBrowserModel: resolveStagehandModel(settings.browser, { chatModelId }),\n } as any)\n .catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = (): Promise<void> => {\n cleanupPromise ??= (async () => {\n releaseAllThreadLocks();\n // Release thread claims before the slow teardown below, so a restarted\n // session can claim its thread (and peers can reach it) right away.\n try {\n releaseThreadClaims?.();\n } catch {\n // Best-effort — the process is exiting.\n }\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 diagnosticsShutdown = processMemoryDiagnostics\n ? stopProcessMemoryDiagnosticsWithTimeout(processMemoryDiagnostics, message => console.warn(message))\n : undefined;\n // Schedules live only in this process; stop their timers so none fires mid-shutdown.\n threadScheduler?.stop();\n // Release this process's notification dispatch leases before the pubsub that holds them closes.\n await stopNotificationDispatch?.().catch(() => {});\n await Promise.allSettled([mcpManager?.disconnect(), controller?.stopIntervals()]);\n // Mastra owns the workspaces and must destroy them to stop retained language\n // servers before storage is closed.\n await Promise.allSettled([controller?.getMastra()?.shutdown(), analytics?.shutdown()]);\n // The signals pubsub is Mastra's event bus: in-flight runs and background\n // tasks drain through it during shutdown, so close it only afterwards. Call\n // close() on the object; a detached method loses `this` and rejects silently.\n const pubsubToClose = signalsPubSub as { close?: () => Promise<void> | void } | undefined;\n await Promise.allSettled([pubsubToClose?.close?.()]);\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 await diagnosticsShutdown;\n })();\n return cleanupPromise;\n};\n\nconst shutdownAndExit = createShutdownCoordinator(asyncCleanup, exitCode => process.exit(exitCode));\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 try {\n const threadId = getResumeThreadId?.();\n if (threadId) {\n process.stdout.write(`\\n${formatResumeHint(threadId)}\\n`);\n }\n } catch {\n // session state or stdout may already be closed during exit\n }\n});\n\n// Start durable diagnostics shutdown before synchronous TUI teardown so a stalled\n// terminal cleanup cannot prevent the final profile capture. The exit handler still\n// provides a failsafe terminal reset if teardown throws.\nconst handleTermSignal = () => {\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void shutdownAndExit(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\nconst handleFatalError = createOneShotFatalErrorHandler((error: unknown): void => {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => {\n try {\n process.stderr.write(msg + '\\n');\n } catch {}\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 void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n return;\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 truncateLogFile(CRASH_LOG_PATH);\n fs.appendFileSync(CRASH_LOG_PATH, crashLog);\n truncateLogFile(CRASH_LOG_PATH);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n void asyncCleanup();\n try {\n tui?.stop();\n } catch {}\n void shutdownAndExit(1);\n});\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n // Storage maintenance without the TUI, so a database can still be pruned and\n // compacted when the interactive session won't start. Checked before the\n // headless branch below, which would otherwise claim `prune --help`.\n if (process.argv[2] === 'prune') {\n const { runPruneCommand } = await import('@mastra/code-sdk/utils/prune-cli');\n return process.exit(await runPruneCommand(process.argv.slice(3)));\n }\n\n const loginIndex = process.argv.findIndex(\n (arg, index) => index >= 2 && arg !== '--acp' && arg !== '--dangerous-auto-approve',\n );\n if (process.argv[loginIndex] === 'login') {\n const { runLoginCommand } = await import('./login-command.js');\n const code = await runLoginCommand({ args: process.argv.slice(loginIndex + 1) });\n await new Promise(resolve => process.stdout.write('', resolve));\n return process.exit(code);\n }\n\n const initialPrompt = takeInitialPrompt(process.argv, process.env);\n if (initialPrompt.error) {\n process.stderr.write(`${initialPrompt.error}\\n`);\n process.exit(1);\n }\n if (initialPrompt.flag) process.argv = initialPrompt.argv;\n // The flag only means something to the interactive TUI. Paths that can't run\n // it reject the flag instead of dropping the prompt; an env var prompt is\n // just ignored there.\n const rejectInitialPromptFlag = (reason: string) => {\n if (!initialPrompt.flag) return;\n process.stderr.write(`${initialPrompt.flag} starts the interactive TUI; ${reason}\\n`);\n process.exit(1);\n };\n\n let resumeThreadId: string | undefined;\n try {\n resumeThreadId = parseResumeThreadId(process.argv.slice(2));\n } catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const headless = hasHeadlessFlag(process.argv);\n if (shouldRunHeadless(process.argv, resumeThreadId, headless)) {\n if (headless) rejectInitialPromptFlag('use --prompt for headless runs');\n return runMCCli(undefined, { coAuthor: TUI_CO_AUTHOR });\n }\n\n if (process.argv.includes('--acp')) {\n rejectInitialPromptFlag('it cannot be combined with --acp');\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({\n dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve'),\n coAuthor: TUI_CO_AUTHOR,\n });\n }\n\n if (shouldRejectResumeWithoutTTY(resumeThreadId, Boolean(process.stdin.isTTY))) {\n process.stderr.write('mastracode resume requires an interactive terminal.\\n');\n process.exitCode = 1;\n return;\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 rejectInitialPromptFlag('no TTY is available, so use --prompt for headless runs');\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput, { coAuthor: TUI_CO_AUTHOR });\n }\n }\n\n const conflict = pipedInputConflict(initialPrompt, pipedInput);\n if (conflict) {\n process.stderr.write(`${conflict}\\n`);\n process.exit(1);\n }\n\n return tuiMain(initialMessageOptions(initialPrompt, pipedInput), resumeThreadId);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"],"mappings":"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"}
|
package/dist/docs/SKILL.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"think.d.ts","sourceRoot":"","sources":["../../../src/tui/commands/think.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"think.d.ts","sourceRoot":"","sources":["../../../src/tui/commands/think.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAqDtD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GrG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* One-line transcript notice for persisted `data-mastracode-account-switch`
|
|
3
|
-
* parts: account rotations
|
|
3
|
+
* parts: account rotations and pool exhaustion.
|
|
4
4
|
* Modeled on OMMarkerComponent (single themed Text row). The copy comes from
|
|
5
5
|
* the SDK's shared formatter so live `info`-event lines and history-reloaded
|
|
6
6
|
* part lines read identically.
|
|
@@ -76,6 +76,8 @@ export declare class AskQuestionBorderedBox {
|
|
|
76
76
|
private answerIsNegative;
|
|
77
77
|
/** True when created during streaming, before activate() is called */
|
|
78
78
|
private streaming;
|
|
79
|
+
/** Rows the card last took while waiting for an answer; the settled card keeps this height. */
|
|
80
|
+
private liveHeight;
|
|
79
81
|
constructor(questionLines: string[], hintText: string, items: Array<{
|
|
80
82
|
label: string;
|
|
81
83
|
description?: string;
|
|
@@ -88,8 +90,21 @@ export declare class AskQuestionBorderedBox {
|
|
|
88
90
|
setCancelled(): void;
|
|
89
91
|
render(width: number): string[];
|
|
90
92
|
private renderSafe;
|
|
93
|
+
/**
|
|
94
|
+
* Borderless card with a colored left bar (▎):
|
|
95
|
+
* - waiting for an answer: accent bar, bold question, ❯ options, hint
|
|
96
|
+
* - answered: muted question with the options frozen (✓ on the chosen ones), or "✓ answer" for
|
|
97
|
+
* free text; a card answered live keeps the height it had while waiting (see render)
|
|
98
|
+
*/
|
|
91
99
|
private _render;
|
|
92
100
|
}
|
|
101
|
+
/** Option list styling shared by inline prompts: accent ❯ cursor, bold selected label, ●/○ toggles. */
|
|
102
|
+
export declare const INLINE_CARD_LIST_STYLE: {
|
|
103
|
+
readonly cursor: string;
|
|
104
|
+
readonly checked: string;
|
|
105
|
+
readonly unchecked: string;
|
|
106
|
+
selectedLabel: (label: string) => string;
|
|
107
|
+
};
|
|
93
108
|
export declare class AskQuestionInlineComponent extends Container implements Focusable {
|
|
94
109
|
private borderedBox;
|
|
95
110
|
private selectList?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-question-inline.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ask-question-inline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,SAAS,EAET,KAAK,EAIN,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAc,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ask-question-inline.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ask-question-inline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Startup header: the Mastra logo in Braille next to the app title and project info.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The logo is the icon from LogoWithoutText (playground-ui), traced from its SVG path onto the Braille dot
|
|
5
|
+
* grid, then mirrored around the middle circle so it is exactly symmetric (the source path is slightly
|
|
6
|
+
* uneven). A dot lights when ≥55% of it is covered, which keeps the circles round at this size.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
import type { Component } from '@earendil-works/pi-tui';
|
|
9
|
+
/** 16 columns × 5 rows: the header logo. */
|
|
10
|
+
export declare const LOGO_HEADER: string[];
|
|
11
|
+
/** 24 columns × 7 rows: setup screens. */
|
|
12
|
+
export declare const LOGO_LARGE: string[];
|
|
13
|
+
/** Logo rows in the accent color, padded to a common width. */
|
|
14
|
+
export declare function renderLogo(rows?: string[]): string[];
|
|
15
|
+
export interface HeaderOptions {
|
|
16
|
+
version: string;
|
|
17
|
+
appName?: string;
|
|
18
|
+
/** Muted info lines (Project, Resource ID, Branch, Worktree of). */
|
|
19
|
+
info: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Header lines for a given width:
|
|
23
|
+
* - wide: logo, then title + info beside it (the info block is padded to the logo's 5 rows)
|
|
24
|
+
* - narrow: logo stacked above title + info
|
|
25
|
+
* - very narrow or a custom app name: one text line
|
|
26
|
+
*/
|
|
27
|
+
export declare function renderHeader(width: number, { version, appName, info }: HeaderOptions): string[];
|
|
28
|
+
/** Startup header component; re-lays out on resize. */
|
|
29
|
+
export declare class HeaderComponent implements Component {
|
|
30
|
+
private options;
|
|
31
|
+
private paddingX;
|
|
32
|
+
constructor(options: HeaderOptions, paddingX?: number);
|
|
33
|
+
invalidate(): void;
|
|
34
|
+
render(width: number): string[];
|
|
35
|
+
}
|
|
9
36
|
//# sourceMappingURL=banner.d.ts.map
|