mastracode 0.21.2 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/HarnessCompat.d.ts +21 -2
  3. package/dist/HarnessCompat.d.ts.map +1 -1
  4. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
  5. package/dist/agents/tools.d.ts +2 -1
  6. package/dist/agents/tools.d.ts.map +1 -1
  7. package/dist/{chunk-HFGEUXMI.js → chunk-7ZTY5SBK.js} +1154 -13
  8. package/dist/chunk-7ZTY5SBK.js.map +1 -0
  9. package/dist/{chunk-MNOWL5GQ.cjs → chunk-B4IKAUT7.cjs} +3533 -2776
  10. package/dist/chunk-B4IKAUT7.cjs.map +1 -0
  11. package/dist/{chunk-YRX4OMQN.js → chunk-BFO3NTQO.js} +2671 -1914
  12. package/dist/chunk-BFO3NTQO.js.map +1 -0
  13. package/dist/{chunk-A4TDK7QP.cjs → chunk-DFC5V3P7.cjs} +267 -103
  14. package/dist/chunk-DFC5V3P7.cjs.map +1 -0
  15. package/dist/{chunk-DJBUYADN.cjs → chunk-EAUXUMEB.cjs} +1157 -12
  16. package/dist/chunk-EAUXUMEB.cjs.map +1 -0
  17. package/dist/{chunk-AWYGW5ZV.cjs → chunk-JHYTJMKT.cjs} +7 -3
  18. package/dist/chunk-JHYTJMKT.cjs.map +1 -0
  19. package/dist/{chunk-TTAAM2XR.js → chunk-UOFNLVKF.js} +7 -3
  20. package/dist/chunk-UOFNLVKF.js.map +1 -0
  21. package/dist/{chunk-J4DYNVTI.js → chunk-Y5AUV6T3.js} +202 -38
  22. package/dist/chunk-Y5AUV6T3.js.map +1 -0
  23. package/dist/cli.cjs +27 -19
  24. package/dist/cli.cjs.map +1 -1
  25. package/dist/cli.js +12 -4
  26. package/dist/cli.js.map +1 -1
  27. package/dist/github-signals/index.d.ts +217 -0
  28. package/dist/github-signals/index.d.ts.map +1 -0
  29. package/dist/headless.d.ts.map +1 -1
  30. package/dist/index.cjs +3 -3
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/onboarding/settings.d.ts +2 -0
  35. package/dist/onboarding/settings.d.ts.map +1 -1
  36. package/dist/permissions-RL7PPO42.cjs +40 -0
  37. package/dist/{permissions-GWY37IEK.cjs.map → permissions-RL7PPO42.cjs.map} +1 -1
  38. package/dist/permissions-TJGRCT4O.js +3 -0
  39. package/dist/{permissions-EDE3D2DA.js.map → permissions-TJGRCT4O.js.map} +1 -1
  40. package/dist/permissions.d.ts.map +1 -1
  41. package/dist/schema.d.ts +7 -4
  42. package/dist/schema.d.ts.map +1 -1
  43. package/dist/tool-names.d.ts +1 -0
  44. package/dist/tool-names.d.ts.map +1 -1
  45. package/dist/tui/command-dispatch.d.ts.map +1 -1
  46. package/dist/tui/commands/github.d.ts +3 -0
  47. package/dist/tui/commands/github.d.ts.map +1 -0
  48. package/dist/tui/commands/index.d.ts +1 -0
  49. package/dist/tui/commands/index.d.ts.map +1 -1
  50. package/dist/tui/commands/settings.d.ts.map +1 -1
  51. package/dist/tui/components/help-overlay.d.ts.map +1 -1
  52. package/dist/tui/components/notification-summary.d.ts +12 -0
  53. package/dist/tui/components/notification-summary.d.ts.map +1 -0
  54. package/dist/tui/components/notification.d.ts +14 -0
  55. package/dist/tui/components/notification.d.ts.map +1 -0
  56. package/dist/tui/components/reactive-signal.d.ts +11 -0
  57. package/dist/tui/components/reactive-signal.d.ts.map +1 -0
  58. package/dist/tui/components/settings.d.ts +2 -0
  59. package/dist/tui/components/settings.d.ts.map +1 -1
  60. package/dist/tui/components/state-signal.d.ts +13 -0
  61. package/dist/tui/components/state-signal.d.ts.map +1 -0
  62. package/dist/tui/event-dispatch.d.ts.map +1 -1
  63. package/dist/tui/handlers/message.d.ts.map +1 -1
  64. package/dist/tui/mastra-tui.d.ts.map +1 -1
  65. package/dist/tui/render-messages.d.ts.map +1 -1
  66. package/dist/tui/setup.d.ts.map +1 -1
  67. package/dist/tui/state.d.ts +14 -0
  68. package/dist/tui/state.d.ts.map +1 -1
  69. package/dist/tui/status-line.d.ts.map +1 -1
  70. package/dist/tui.cjs +19 -19
  71. package/dist/tui.js +2 -2
  72. package/package.json +10 -10
  73. package/dist/chunk-A4TDK7QP.cjs.map +0 -1
  74. package/dist/chunk-AWYGW5ZV.cjs.map +0 -1
  75. package/dist/chunk-DJBUYADN.cjs.map +0 -1
  76. package/dist/chunk-HFGEUXMI.js.map +0 -1
  77. package/dist/chunk-J4DYNVTI.js.map +0 -1
  78. package/dist/chunk-MNOWL5GQ.cjs.map +0 -1
  79. package/dist/chunk-TTAAM2XR.js.map +0 -1
  80. package/dist/chunk-YRX4OMQN.js.map +0 -1
  81. package/dist/permissions-EDE3D2DA.js +0 -3
  82. package/dist/permissions-GWY37IEK.cjs +0 -40
package/dist/cli.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunkA4TDK7QP_cjs = require('./chunk-A4TDK7QP.cjs');
5
- var chunkMNOWL5GQ_cjs = require('./chunk-MNOWL5GQ.cjs');
6
- var chunkDJBUYADN_cjs = require('./chunk-DJBUYADN.cjs');
4
+ var chunkDFC5V3P7_cjs = require('./chunk-DFC5V3P7.cjs');
5
+ var chunkB4IKAUT7_cjs = require('./chunk-B4IKAUT7.cjs');
6
+ var chunkEAUXUMEB_cjs = require('./chunk-EAUXUMEB.cjs');
7
7
  var chunkJ3ISOP5J_cjs = require('./chunk-J3ISOP5J.cjs');
8
8
  var fs = require('fs');
9
9
  var crypto = require('crypto');
@@ -708,7 +708,7 @@ async function headlessMain(predrainedInput) {
708
708
  `);
709
709
  process.exit(1);
710
710
  }
711
- const result = await chunkA4TDK7QP_cjs.createMastraCode({ settingsPath: args.settings });
711
+ const result = await chunkDFC5V3P7_cjs.createMastraCode({ settingsPath: args.settings });
712
712
  const { harness: harness2, mcpManager: mcpManager2, effectiveDefaults } = result;
713
713
  if (mcpManager2?.hasServers()) {
714
714
  mcpManager2.initInBackground().catch((err) => {
@@ -718,10 +718,16 @@ async function headlessMain(predrainedInput) {
718
718
  }
719
719
  setupDebugLogging();
720
720
  await harness2.init();
721
+ await harness2.getMastra()?.startWorkers();
721
722
  const exitCode = await runHeadless(harness2, { ...args, prompt }, effectiveDefaults);
722
- chunkDJBUYADN_cjs.releaseAllThreadLocks();
723
+ chunkEAUXUMEB_cjs.releaseAllThreadLocks();
723
724
  const closeSignalsPubSub = result.signalsPubSub?.close;
724
- await Promise.allSettled([mcpManager2?.disconnect(), harness2?.stopHeartbeats(), closeSignalsPubSub?.()]);
725
+ await Promise.allSettled([
726
+ mcpManager2?.disconnect(),
727
+ harness2.getMastra()?.stopWorkers(),
728
+ harness2?.stopHeartbeats(),
729
+ closeSignalsPubSub?.()
730
+ ]);
725
731
  process.exit(exitCode);
726
732
  }
727
733
  var MAX_PIPE_BYTES = 1024 * 1024;
@@ -805,13 +811,13 @@ process.on("unhandledRejection", (reason) => {
805
811
  handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
806
812
  });
807
813
  async function tuiMain(pipedInput) {
808
- const settings = chunkDJBUYADN_cjs.loadSettings();
814
+ const settings = chunkEAUXUMEB_cjs.loadSettings();
809
815
  let browserPromise;
810
816
  const loadBrowser = () => {
811
- browserPromise ??= chunkDJBUYADN_cjs.createBrowserFromSettings(settings.browser);
817
+ browserPromise ??= chunkEAUXUMEB_cjs.createBrowserFromSettings(settings.browser);
812
818
  return browserPromise;
813
819
  };
814
- const result = await chunkA4TDK7QP_cjs.createMastraCode({ unixSocketPubSub: true });
820
+ const result = await chunkDFC5V3P7_cjs.createMastraCode({ unixSocketPubSub: true });
815
821
  harness = result.harness;
816
822
  mcpManager = result.mcpManager;
817
823
  hookManager = result.hookManager;
@@ -830,18 +836,18 @@ async function tuiMain(pipedInput) {
830
836
  if (envTheme === "dark" || envTheme === "light") {
831
837
  themeMode = envTheme;
832
838
  } else {
833
- const settings2 = chunkDJBUYADN_cjs.loadSettings();
839
+ const settings2 = chunkEAUXUMEB_cjs.loadSettings();
834
840
  const themePref = settings2.preferences.theme;
835
841
  if (themePref === "dark" || themePref === "light") {
836
842
  themeMode = themePref;
837
843
  } else {
838
- const detection = await chunkMNOWL5GQ_cjs.detectTerminalTheme();
844
+ const detection = await chunkB4IKAUT7_cjs.detectTerminalTheme();
839
845
  themeMode = detection.mode;
840
846
  detectedBgHex = detection.detectedBgHex;
841
847
  }
842
848
  }
843
- chunkDJBUYADN_cjs.applyThemeMode(themeMode, detectedBgHex);
844
- analytics = createMastraCodeAnalytics({ version: chunkMNOWL5GQ_cjs.getCurrentVersion() });
849
+ chunkEAUXUMEB_cjs.applyThemeMode(themeMode, detectedBgHex);
850
+ analytics = createMastraCodeAnalytics({ version: chunkB4IKAUT7_cjs.getCurrentVersion() });
845
851
  analytics.capture("mastracode_session_started", {
846
852
  mode: harness.getCurrentModeId(),
847
853
  resourceId: harness.getResourceId(),
@@ -849,15 +855,16 @@ async function tuiMain(pipedInput) {
849
855
  hasMcp: Boolean(mcpManager),
850
856
  theme: themeMode
851
857
  });
852
- const tui = new chunkMNOWL5GQ_cjs.MastraTUI({
858
+ const tui = new chunkB4IKAUT7_cjs.MastraTUI({
853
859
  harness,
854
860
  hookManager,
855
861
  analytics,
856
862
  authStorage,
857
863
  mcpManager,
858
864
  appName: "Mastra Code",
859
- version: chunkMNOWL5GQ_cjs.getCurrentVersion(),
865
+ version: chunkB4IKAUT7_cjs.getCurrentVersion(),
860
866
  inlineQuestions: true,
867
+ githubSignals: result.githubSignals,
861
868
  ...pipedInput ? { initialMessage: `The following was piped via stdin:
862
869
 
863
870
  ${pipedInput}` } : {}
@@ -876,10 +883,11 @@ ${pipedInput}` } : {}
876
883
  }
877
884
  }
878
885
  var asyncCleanup = async () => {
879
- chunkDJBUYADN_cjs.releaseAllThreadLocks();
886
+ chunkEAUXUMEB_cjs.releaseAllThreadLocks();
880
887
  const closeSignalsPubSub = signalsPubSub?.close;
881
888
  await Promise.allSettled([
882
889
  mcpManager?.disconnect(),
890
+ harness?.getMastra()?.stopWorkers(),
883
891
  harness?.stopHeartbeats(),
884
892
  closeSignalsPubSub?.(),
885
893
  analytics?.shutdown()
@@ -889,8 +897,8 @@ process.on("beforeExit", () => {
889
897
  void asyncCleanup();
890
898
  });
891
899
  process.on("exit", () => {
892
- chunkDJBUYADN_cjs.restoreTerminalForeground();
893
- chunkDJBUYADN_cjs.releaseAllThreadLocks();
900
+ chunkEAUXUMEB_cjs.restoreTerminalForeground();
901
+ chunkEAUXUMEB_cjs.releaseAllThreadLocks();
894
902
  });
895
903
  process.on("SIGINT", () => {
896
904
  void asyncCleanup().finally(() => process.exit(0));
@@ -909,7 +917,7 @@ function hasEconnrefused(err, depth = 0) {
909
917
  function handleFatalError(error) {
910
918
  const write = (msg2) => process.stderr.write(msg2 + "\n");
911
919
  if (hasEconnrefused(error)) {
912
- const settings = chunkDJBUYADN_cjs.loadSettings();
920
+ const settings = chunkEAUXUMEB_cjs.loadSettings();
913
921
  const connStr = settings.storage?.pg?.connectionString;
914
922
  const target = connStr ?? "localhost:5432";
915
923
  write(
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/analytics.ts","../src/error-classification.ts","../src/utils/debug-log.ts","../src/headless.ts","../src/utils/stdin-pipe.ts","../src/main.ts"],"names":["os","randomUUID","PostHog","fs","path","getAppDataDir","parseArgs","harness","existsSync","createMastraCode","mcpManager","releaseAllThreadLocks","fs2","tty","loadSettings","createBrowserFromSettings","settings","detectTerminalTheme","applyThemeMode","getCurrentVersion","MastraTUI","restoreTerminalForeground","msg"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport os from 'node:os';\n\nimport { PostHog } from 'posthog-node';\n\nconst POSTHOG_API_KEY = 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT';\nconst POSTHOG_HOST = 'https://us.posthog.com';\nconst MASTRA_SOURCE = 'mastracode';\nconst TRUTHY_DISABLED_VALUES = new Set(['1', 'true', 'yes', 'on']);\n\nexport function getMastraAnalyticsDistinctId(hostname = os.hostname()): string {\n return `mastra-${hostname}`;\n}\n\nfunction isAnalyticsDebugEnabled(): boolean {\n return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? '');\n}\n\nfunction debugAnalytics(message: string, properties?: Record<string, unknown>): void {\n if (!isAnalyticsDebugEnabled()) {\n return;\n }\n\n const suffix = properties ? ` ${JSON.stringify(properties)}` : '';\n process.stderr.write(`[mastracode analytics] ${message}${suffix}\\n`);\n}\n\nexport type MastraCodeAnalyticsEvent =\n | 'mastracode_session_started'\n | 'mastracode_prompt_submitted'\n | 'mastracode_thread_changed'\n | 'mastracode_model_changed'\n | 'mastracode_command_used'\n | 'mastracode_interactive_prompt_shown';\n\nexport interface MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void;\n trackCommand(command: string, properties?: Record<string, unknown>): void;\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void;\n shutdown(): Promise<void>;\n isEnabled(): boolean;\n}\n\ninterface MastraCodeAnalyticsOptions {\n version: string;\n host?: string;\n apiKey?: string;\n}\n\nclass NoopMastraCodeAnalytics implements MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent): void {\n debugAnalytics('capture skipped: telemetry disabled', { event });\n }\n trackCommand(command: string): void {\n debugAnalytics('command skipped: telemetry disabled', { command });\n }\n trackInteractivePrompt(promptType: string): void {\n debugAnalytics('interactive prompt skipped: telemetry disabled', { promptType });\n }\n async shutdown(): Promise<void> {\n debugAnalytics('shutdown skipped: telemetry disabled');\n }\n isEnabled(): boolean {\n return false;\n }\n}\n\nclass PostHogMastraCodeAnalytics implements MastraCodeAnalytics {\n private readonly client: PostHog;\n private readonly distinctId: string;\n private readonly sessionId = randomUUID();\n private readonly version: string;\n\n constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }: MastraCodeAnalyticsOptions) {\n this.version = version;\n this.distinctId = getMastraAnalyticsDistinctId();\n this.client = new PostHog(apiKey, {\n host,\n flushAt: 1,\n flushInterval: 0,\n disableGeoip: false,\n });\n this.client.register({ mastraSource: MASTRA_SOURCE });\n debugAnalytics('enabled', { host, distinctId: this.distinctId, version });\n }\n\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void {\n try {\n const eventProperties = {\n ...this.getBaseProperties(),\n ...properties,\n };\n debugAnalytics('capture', { event, properties: eventProperties });\n this.client.capture({\n distinctId: this.distinctId,\n event,\n properties: eventProperties,\n });\n } catch (error) {\n debugAnalytics('capture failed', { event, error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n trackCommand(command: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_command_used', { command, ...properties });\n }\n\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_interactive_prompt_shown', { promptType, ...properties });\n }\n\n async shutdown(): Promise<void> {\n try {\n debugAnalytics('shutdown start');\n await this.client.shutdown();\n debugAnalytics('shutdown complete');\n } catch (error) {\n debugAnalytics('shutdown failed', { error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n isEnabled(): boolean {\n return true;\n }\n\n private getBaseProperties(): Record<string, unknown> {\n return {\n mastraSource: MASTRA_SOURCE,\n sessionId: this.sessionId,\n version: this.version,\n os: process.platform,\n osVersion: os.release(),\n nodeVersion: process.version,\n platform: process.arch,\n machineId: os.hostname(),\n };\n }\n}\n\nexport function isTelemetryDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const value = env.MASTRA_TELEMETRY_DISABLED;\n if (!value) {\n return false;\n }\n\n return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nexport function createMastraCodeAnalytics(options: MastraCodeAnalyticsOptions): MastraCodeAnalytics {\n if (isTelemetryDisabled()) {\n debugAnalytics('disabled by MASTRA_TELEMETRY_DISABLED', { value: process.env.MASTRA_TELEMETRY_DISABLED });\n return new NoopMastraCodeAnalytics();\n }\n\n return new PostHogMastraCodeAnalytics(options);\n}\n","/**\n * Checks whether an error is an ERR_STREAM_DESTROYED error, which is a\n * non-fatal condition that occurs when code writes to a stream after it\n * has been closed (e.g., client disconnect, cancelled LLM stream, LSP\n * shutdown, killed subprocess).\n *\n * Walks the `.cause` chain up to a depth limit.\n */\nexport function isStreamDestroyedError(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ERR_STREAM_DESTROYED') return true;\n if (typeof e.message === 'string' && e.message.includes('stream was destroyed')) return true;\n if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;\n if (Array.isArray(e.errors) && e.errors.some((inner: unknown) => isStreamDestroyedError(inner, depth + 1)))\n return true;\n return false;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { getAppDataDir } from './project.js';\n\nconst MAX_LOG_SIZE = 5 * 1024 * 1024; // 5 MB\nconst KEEP_SIZE = 4 * 1024 * 1024; // 4 MB\n\n/**\n * Truncate a log file to roughly {@link KEEP_SIZE} bytes if it exceeds\n * {@link MAX_LOG_SIZE}, cutting at the first newline so we don't start mid-line.\n */\nexport function truncateLogFile(logFile: string): void {\n try {\n const stat = fs.statSync(logFile);\n if (stat.size > MAX_LOG_SIZE) {\n const buf = Buffer.alloc(KEEP_SIZE);\n const fd = fs.openSync(logFile, 'r');\n fs.readSync(fd, buf, 0, KEEP_SIZE, stat.size - KEEP_SIZE);\n fs.closeSync(fd);\n const firstNewline = buf.indexOf(10);\n const trimmed = firstNewline >= 0 ? buf.subarray(firstNewline + 1) : buf;\n fs.writeFileSync(logFile, trimmed);\n }\n } catch {\n // File may not exist yet — that's fine\n }\n}\n\n/**\n * Set up debug logging. When {@link MASTRA_DEBUG} is `\"true\"`, redirects\n * `console.error` and `console.warn` to a log file (truncating it first if\n * oversized). Otherwise silences them to avoid corrupting the TUI.\n */\nexport function setupDebugLogging(): void {\n const debugEnabled = ['true', '1'].includes(process.env.MASTRA_DEBUG ?? '');\n\n if (debugEnabled) {\n const logFile = path.join(getAppDataDir(), 'debug.log');\n truncateLogFile(logFile);\n\n const logStream = fs.createWriteStream(logFile, { flags: 'a' });\n const fmt = (a: unknown): string => {\n if (typeof a === 'string') return a;\n if (a instanceof Error) return a.stack ?? `${a.name}: ${a.message}`;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n };\n console.error = (...args: unknown[]) => {\n logStream.write(`[ERROR] ${new Date().toISOString()} ${args.map(fmt).join(' ')}\\n`);\n };\n console.warn = (...args: unknown[]) => {\n logStream.write(`[WARN] ${new Date().toISOString()} ${args.map(fmt).join(' ')}\\n`);\n };\n } else {\n const noop = () => {};\n console.error = noop;\n console.warn = noop;\n }\n}\n","/**\n * Headless mode helpers — pure functions extracted for testability.\n */\nimport { existsSync } from 'node:fs';\nimport { parseArgs } from 'node:util';\n\nimport type { Harness, HarnessEvent, HarnessMessage } from '@mastra/core/harness';\n\nimport { setupDebugLogging } from './utils/debug-log.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.js';\nimport { createMastraCode } from './index.js';\n\nconst VALID_MODES = ['build', 'plan', 'fast'] as const;\nconst VALID_THINKING_LEVELS = ['off', 'low', 'medium', 'high', 'xhigh'] as const;\n\nexport interface HeadlessArgs {\n prompt?: string;\n timeout?: number;\n format: 'default' | 'json';\n outputFormat?: 'text' | 'json' | 'stream-json';\n continue_: boolean;\n model?: string;\n mode?: 'build' | 'plan' | 'fast';\n thinkingLevel?: 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n settings?: string;\n thread?: string;\n title?: string;\n cloneThread: boolean;\n resourceId?: string;\n}\n\n/** Returns true if argv contains --prompt or -p, indicating headless mode. */\nexport function hasHeadlessFlag(argv: string[]): boolean {\n return argv.some(a => a === '--prompt' || a === '-p');\n}\n\nconst headlessOptions = {\n prompt: { type: 'string', short: 'p' },\n continue: { type: 'boolean', short: 'c', default: false },\n thread: { type: 'string', short: 't' },\n title: { type: 'string' },\n 'clone-thread': { type: 'boolean', default: false },\n 'resource-id': { type: 'string' },\n timeout: { type: 'string' }, // parsed to number after validation\n format: { type: 'string', default: 'default' },\n 'output-format': { type: 'string' },\n model: { type: 'string', short: 'm' },\n mode: { type: 'string' },\n 'thinking-level': { type: 'string' },\n settings: { type: 'string' },\n help: { type: 'boolean', short: 'h', default: false },\n} as const;\n\n/** Parse CLI arguments for headless mode (--prompt, --timeout, --format, --output-format, --continue, --model, --mode, --thinking-level, --settings). */\nexport function parseHeadlessArgs(argv: string[]): HeadlessArgs {\n const { values, positionals } = parseArgs({\n args: argv.slice(2),\n options: headlessOptions,\n strict: false,\n allowPositionals: true,\n });\n\n const format = String(values.format ?? 'default');\n if (format !== 'default' && format !== 'json') {\n throw new Error('--format must be \"default\" or \"json\"');\n }\n\n let timeout: number | undefined;\n if (values.timeout !== undefined) {\n const raw = String(values.timeout);\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error('--timeout must be a positive integer');\n }\n timeout = parsed;\n }\n\n const prompt = typeof values.prompt === 'string' ? values.prompt : positionals[0];\n const model = typeof values.model === 'string' ? values.model : undefined;\n\n let mode: HeadlessArgs['mode'];\n if (values.mode !== undefined) {\n const raw = String(values.mode);\n if (!(VALID_MODES as readonly string[]).includes(raw)) {\n throw new Error(`--mode must be ${VALID_MODES.map(m => `\"${m}\"`).join(', ')}`);\n }\n mode = raw as HeadlessArgs['mode'];\n }\n\n let thinkingLevel: HeadlessArgs['thinkingLevel'];\n if (values['thinking-level'] !== undefined) {\n const raw = String(values['thinking-level']);\n if (!(VALID_THINKING_LEVELS as readonly string[]).includes(raw)) {\n throw new Error(`--thinking-level must be ${VALID_THINKING_LEVELS.map(l => `\"${l}\"`).join(', ')}`);\n }\n thinkingLevel = raw as HeadlessArgs['thinkingLevel'];\n }\n\n let outputFormat: HeadlessArgs['outputFormat'];\n if (values['output-format'] !== undefined) {\n const raw = String(values['output-format']);\n if (raw !== 'text' && raw !== 'json' && raw !== 'stream-json') {\n throw new Error('--output-format must be one of: text, json, stream-json');\n }\n outputFormat = raw;\n }\n\n const settings = typeof values.settings === 'string' ? values.settings : undefined;\n const thread = typeof values.thread === 'string' ? values.thread : undefined;\n const title = typeof values.title === 'string' ? values.title : undefined;\n const cloneThread = Boolean(values['clone-thread']);\n const resourceId = typeof values['resource-id'] === 'string' ? values['resource-id'] : undefined;\n\n if (values.continue && thread) {\n throw new Error('--continue and --thread cannot be used together');\n }\n\n return {\n prompt,\n timeout,\n format: format as 'default' | 'json',\n outputFormat,\n continue_: Boolean(values.continue),\n model,\n mode,\n thinkingLevel,\n settings,\n thread,\n title,\n cloneThread,\n resourceId,\n };\n}\n\n/** Truncate a string to `max` characters, appending \"...\" if truncated. */\nexport function truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + '...' : s;\n}\n\nexport function printHeadlessUsage(): void {\n process.stdout.write(`\nUsage: mastracode --prompt <text> [options]\n\nHeadless (non-interactive) mode options:\n --prompt, -p <text> The task to execute (required, or pipe via stdin)\n --continue, -c Resume the most recent thread instead of creating a new one\n --thread, -t <id|title> Resume a specific thread by ID or title\n --title <title> Set or rename the thread title\n --clone-thread Clone the current thread before running (work on a copy)\n --resource-id <id> Set the resource ID for thread scoping\n --timeout <seconds> Exit with code 2 if not complete within timeout\n --format <type> Output format: \"default\" or \"json\" (default: \"default\")\n --output-format <type> Automation output: \"text\", \"json\", or \"stream-json\"\n --model, -m <id> Model override (e.g., \"anthropic/claude-sonnet-4-5\")\n --mode {build|plan|fast} Execution mode — defaults to \"build\" if omitted\n --thinking-level <level> Thinking level: off, low, medium, high, xhigh\n --settings <path> Path to settings.json file (default: global settings)\n\nThread behavior:\n By default, a new thread is created for each run.\n Use --continue to resume the most recent thread, or --thread to target a specific one.\n Use --clone-thread to branch off a copy before running.\n\nSettings file:\n Uses the same settings.json as the interactive TUI. Pass --settings to use\n a custom settings file (e.g., settings-ci.json for CI). All model, pack,\n subagent, and OM configuration is resolved from settings at startup.\n\nExit codes:\n 0 Agent completed successfully\n 1 Error or aborted\n 2 Timeout\n\nExamples:\n mastracode --prompt \"Fix the bug in auth.ts\"\n mastracode --prompt \"Add tests\" --timeout 300\n mastracode --prompt \"Fix the bug\" --mode fast --thinking-level high\n mastracode --settings ./settings-ci.json --prompt \"Run tests\"\n mastracode -c --prompt \"Continue where you left off\"\n mastracode -t \"feature-auth\" --prompt \"Keep working on this\"\n mastracode --thread abc123 --clone-thread --prompt \"Try a different approach\"\n mastracode --prompt \"Refactor utils\" --title \"utils-refactor\"\n mastracode --prompt \"Refactor utils\" --format json\n mastracode --prompt \"Run tests and summarize pass/fail counts\" --output-format json\n mastracode --prompt \"Find all TODO comments\" --output-format stream-json\n mastracode --resource-id my-project --prompt \"Fix the bug\"\n echo \"task description\" | mastracode --prompt -\n\nPiping without --prompt launches the interactive TUI with piped content\nas the first message:\n cat file.txt | mastracode\n git diff | mastracode\n npm test 2>&1 | mastracode\n\nRun without --prompt for the interactive TUI.\n`);\n}\n\nfunction resolveExitCode(reason?: string): number {\n return reason === 'error' || reason === 'aborted' ? 1 : 0;\n}\n\nfunction autoResolve<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n event: HarnessEvent,\n): { resolved: true; label: string; json: Record<string, unknown> } | { resolved: false } {\n switch (event.type) {\n case 'sandbox_access_request': {\n harness.respondToQuestion({ questionId: event.questionId, answer: 'Yes' });\n return { resolved: true, label: `[auto-approved sandbox] ${event.path}`, json: { ...event, autoApproved: true } };\n }\n case 'tool_approval_required': {\n harness.respondToToolApproval({ decision: 'approve' });\n return { resolved: true, label: `[auto-approved] ${event.toolName}`, json: { ...event, autoApproved: true } };\n }\n case 'ask_question': {\n harness.respondToQuestion({\n questionId: event.questionId,\n answer: 'Proceed with your best judgment. Do not ask further questions.',\n });\n return {\n resolved: true,\n label: `[auto-answered] ${truncate(event.question, 100)}`,\n json: { ...event, autoAnswered: true },\n };\n }\n case 'plan_approval_required': {\n void harness.respondToPlanApproval({ planId: event.planId, response: { action: 'approved' } });\n return { resolved: true, label: `[auto-approved plan] ${event.title}`, json: { ...event, autoApproved: true } };\n }\n default:\n return { resolved: false };\n }\n}\n\nfunction formatDefault(event: HarnessEvent, ctx: { lastTextLength: number }): void {\n switch (event.type) {\n case 'agent_start':\n ctx.lastTextLength = 0;\n break;\n case 'message_update': {\n const fullText = event.message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(p => p.text)\n .join('');\n if (fullText.length > ctx.lastTextLength) {\n process.stdout.write(fullText.slice(ctx.lastTextLength));\n ctx.lastTextLength = fullText.length;\n }\n break;\n }\n case 'message_end':\n ctx.lastTextLength = 0;\n process.stdout.write('\\n');\n break;\n case 'tool_start':\n process.stderr.write(`[tool] ${event.toolName}\\n`);\n break;\n case 'tool_end':\n if (event.isError) process.stderr.write(`[tool error] ${truncate(String(event.result), 200)}\\n`);\n break;\n case 'shell_output':\n process.stderr.write(event.output);\n break;\n case 'subagent_start':\n process.stderr.write(\n `[subagent:${event.forked ? 'forked:' : ''}${event.agentType}] ${truncate(event.task, 100)}\\n`,\n );\n break;\n case 'subagent_end':\n if (event.isError) process.stderr.write(`[subagent error] ${truncate(event.result, 200)}\\n`);\n break;\n case 'error':\n process.stderr.write(`[error] ${event.error.message}\\n`);\n break;\n }\n}\n\ninterface HeadlessSummary {\n text: string;\n finishReason?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n toolCalls: Array<{ id: string; name: string; args: unknown }>;\n toolResults: Array<{ id: string; name: string; result: unknown; isError: boolean }>;\n error?: { name: string; message: string; stack?: string };\n threadId?: string;\n}\n\nfunction createEmptySummary(): HeadlessSummary {\n return { text: '', toolCalls: [], toolResults: [] };\n}\n\nfunction extractAssistantText(message: HarnessMessage): string {\n return message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(c => c.text)\n .join('');\n}\n\nfunction aggregateIntoSummary(event: HarnessEvent, summary: HeadlessSummary): void {\n switch (event.type) {\n case 'message_end':\n if (event.message.role === 'assistant') {\n summary.text += extractAssistantText(event.message);\n }\n break;\n case 'tool_start':\n summary.toolCalls.push({ id: event.toolCallId, name: event.toolName, args: event.args });\n break;\n case 'tool_end': {\n const matching = summary.toolCalls.find(c => c.id === event.toolCallId);\n summary.toolResults.push({\n id: event.toolCallId,\n name: matching?.name ?? '',\n result: event.result,\n isError: event.isError,\n });\n break;\n }\n case 'usage_update':\n summary.usage = {\n inputTokens: event.usage.promptTokens,\n outputTokens: event.usage.completionTokens,\n totalTokens: event.usage.totalTokens,\n };\n break;\n case 'error':\n summary.error = {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n };\n break;\n }\n}\n\nfunction finalizeSummary<TState extends Record<string, unknown>>(\n summary: HeadlessSummary,\n endEvent: Extract<HarnessEvent, { type: 'agent_end' }>,\n harness: Harness<TState>,\n): void {\n summary.finishReason = endEvent.reason;\n summary.threadId = harness.getCurrentThreadId() ?? undefined;\n}\n\n/** Resolve a thread by ID or title. Tries exact ID match first, then title. */\nasync function resolveThread<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n threadIdOrTitle: string,\n): Promise<{ threadId: string; matchType: 'id' | 'title' } | { error: string }> {\n const threads = await harness.listThreads();\n\n const byId = threads.find(t => t.id === threadIdOrTitle);\n if (byId) return { threadId: byId.id, matchType: 'id' };\n\n const byTitle = threads\n .filter(t => t.title === threadIdOrTitle)\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n if (byTitle.length > 0) return { threadId: byTitle[0]!.id, matchType: 'title' };\n\n return { error: `No thread found matching \"${threadIdOrTitle}\"` };\n}\n\n/**\n * Run headless mode: subscribe to harness events with auto-approval,\n * optionally resume a thread, send the prompt, and wait for completion.\n *\n * Returns the exit code (0 = success, 1 = error/aborted, 2 = timeout).\n */\nexport async function runHeadless<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n args: HeadlessArgs & { prompt: string },\n effectiveDefaults?: Record<string, string>,\n): Promise<number> {\n const outputFormat = args.outputFormat;\n const emit =\n outputFormat === 'stream-json' || (!outputFormat && args.format === 'json')\n ? (data: Record<string, unknown>) => process.stdout.write(JSON.stringify(data) + '\\n')\n : null;\n const summary = outputFormat === 'json' ? createEmptySummary() : null;\n let textBuffer: string | null = outputFormat === 'text' ? '' : null;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n if (args.timeout) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n if (emit) {\n emit({ type: 'timeout', seconds: args.timeout });\n } else {\n process.stderr.write(`\\nTimeout: ${args.timeout}s elapsed. Aborting.\\n`);\n }\n harness.abort();\n }, args.timeout * 1000);\n }\n\n function failEarly(msg: string): 1 {\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n\n // --- Pre-flight checks (before subscribing to events) ---\n\n // --- Resolve model ---\n if (args.model && args.mode) {\n if (emit) {\n emit({ type: 'warning', message: '--model overrides --mode, ignoring --mode' });\n } else {\n process.stderr.write('Warning: --model overrides --mode, ignoring --mode\\n');\n }\n }\n\n if (args.model) {\n // Highest priority: explicit --model flag\n const available = await harness.listAvailableModels();\n const match = available.find(m => m.id === args.model);\n if (!match) {\n return failEarly(`Unknown model: \"${args.model}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return failEarly(`Model \"${args.model}\" has no API key configured.${keyHint}`);\n }\n await harness.switchModel({ modelId: args.model });\n if (!emit) process.stderr.write(`[model] ${args.model}\\n`);\n } else if (args.mode) {\n // --mode flag: look up model from effectiveDefaults (resolved from settings at startup)\n const modelId = effectiveDefaults?.[args.mode];\n if (modelId) {\n const available = await harness.listAvailableModels();\n const match = available.find(m => m.id === modelId);\n if (!match) {\n return failEarly(`Unknown model \"${modelId}\" configured for mode \"${args.mode}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return failEarly(`Model \"${modelId}\" (mode: ${args.mode}) has no API key configured.${keyHint}`);\n }\n await harness.switchModel({ modelId });\n if (!emit) process.stderr.write(`[model] ${modelId} (mode: ${args.mode})\\n`);\n } else {\n const warnMsg = `--mode ${args.mode} has no configured model, using default`;\n if (emit) emit({ type: 'warning', message: warnMsg });\n else process.stderr.write(`Warning: ${warnMsg}\\n`);\n }\n }\n\n // --- Resolve thinking level ---\n if (args.thinkingLevel) {\n await harness.setState({ thinkingLevel: args.thinkingLevel } as unknown as Partial<TState>);\n if (!emit) process.stderr.write(`[thinking] ${args.thinkingLevel}\\n`);\n }\n\n // --- Subscribe and send ---\n // Subscription is set up after preflight checks (model switching, thinking level) so that\n // early-exit failures don't leave a dangling subscriber. The subscriber only handles\n // runtime events (auto-resolution, streaming, agent_end).\n\n const streamCtx = { lastTextLength: 0 };\n\n const done = new Promise<number>(resolve => {\n harness.subscribe(event => {\n const result = autoResolve(harness, event);\n if (result.resolved) {\n if (emit) emit(result.json);\n else if (!outputFormat) process.stderr.write(result.label + '\\n');\n return;\n }\n\n // Aggregate into accumulators for text / json modes\n if (summary) aggregateIntoSummary(event, summary);\n if (textBuffer !== null && event.type === 'message_end' && event.message.role === 'assistant') {\n textBuffer += extractAssistantText(event.message);\n }\n\n if (event.type === 'agent_end') {\n if (summary) {\n finalizeSummary(summary, event, harness);\n process.stdout.write(JSON.stringify(summary) + '\\n');\n } else if (textBuffer !== null) {\n process.stdout.write(textBuffer);\n if (!textBuffer.endsWith('\\n')) process.stdout.write('\\n');\n } else if (emit) {\n emit({ ...event });\n }\n resolve(resolveExitCode(event.reason));\n return;\n }\n\n if (emit) {\n emit({ ...event });\n } else if (!outputFormat) {\n formatDefault(event, streamCtx);\n }\n });\n });\n\n // --- Resource ID ---\n if (args.resourceId) {\n harness.setResourceId({ resourceId: args.resourceId });\n if (!emit) process.stderr.write(`[resource] ${args.resourceId}\\n`);\n }\n\n // --- Thread selection ---\n try {\n if (args.thread) {\n const result = await resolveThread(harness, args.thread);\n if ('error' in result) {\n const msg = result.error;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n await harness.switchThread({ threadId: result.threadId });\n if (!emit) process.stderr.write(`[thread] resumed ${result.threadId} (matched by ${result.matchType})\\n`);\n } else if (args.continue_) {\n const threads = await harness.listThreads();\n if (threads.length > 0) {\n const sorted = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n await harness.switchThread({ threadId: sorted[0]!.id });\n if (!emit) process.stderr.write(`[continued] thread ${sorted[0]!.id}\\n`);\n } else if (!emit) {\n process.stderr.write(`[info] No existing threads found, starting new thread\\n`);\n }\n }\n // else: no thread selection — sendMessage will auto-create a new thread\n } catch (err) {\n const msg = `Failed to select thread: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n\n // --- Clone ---\n if (args.cloneThread) {\n try {\n const cloned = await harness.cloneThread();\n if (emit) emit({ type: 'thread_cloned', threadId: cloned.id });\n else process.stderr.write(`[cloned] thread ${cloned.id}\\n`);\n } catch (err) {\n const msg = `Failed to clone thread: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n }\n\n // --- Title ---\n if (args.title) {\n try {\n await harness.renameThread({ title: args.title });\n if (!emit) process.stderr.write(`[title] \"${args.title}\"\\n`);\n } catch (err) {\n const msg = `Failed to set thread title: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n }\n\n await harness.sendMessage({ content: args.prompt });\n\n const exitCode = await done;\n if (timeoutId) clearTimeout(timeoutId);\n return timedOut ? 2 : exitCode;\n}\n\n/**\n * Headless mode main entry point: parse arguments, read stdin, initialize\n * MastraCode, and run headless mode.\n */\nexport async function headlessMain(predrainedInput?: string | null): Promise<never> {\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n printHeadlessUsage();\n process.exit(0);\n }\n\n let args;\n try {\n args = parseHeadlessArgs(process.argv);\n } catch (e) {\n process.stderr.write(`Error: ${(e as Error).message}\\n`);\n process.exit(1);\n }\n\n let prompt = args.prompt;\n if (predrainedInput !== undefined) {\n // Stdin was already drained by the caller (e.g. TTY reopen failed after pipe drain)\n prompt = predrainedInput ?? '';\n } else if (prompt === '-' || (!prompt && !process.stdin.isTTY)) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n printHeadlessUsage();\n process.stderr.write('Error: --prompt is required (or pipe via stdin)\\n');\n process.exit(1);\n }\n\n if (args.settings && !existsSync(args.settings)) {\n process.stderr.write(`Error: Settings file not found: ${args.settings}\\n`);\n process.exit(1);\n }\n\n const result = await createMastraCode({ settingsPath: args.settings });\n const { harness, mcpManager, effectiveDefaults } = result;\n\n if (mcpManager?.hasServers()) {\n mcpManager.initInBackground().catch(err => {\n process.stderr.write(`Warning: MCP server initialization failed: ${(err as Error).message ?? err}\\n`);\n });\n }\n\n setupDebugLogging();\n await harness.init();\n\n const exitCode = await runHeadless(harness, { ...args, prompt }, effectiveDefaults);\n\n // Cleanup\n releaseAllThreadLocks();\n const closeSignalsPubSub = (result.signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats(), closeSignalsPubSub?.()]);\n\n process.exit(exitCode);\n}\n","import * as fs from 'node:fs';\nimport * as tty from 'node:tty';\n\n/** Maximum piped input size (1 MB). Content beyond this is truncated. */\nconst MAX_PIPE_BYTES = 1024 * 1024;\n\n/**\n * Matches all ANSI escape sequences — SGR (colors), cursor movement, line\n * clears, scrolling, window titles, etc.\n */\nconst ANSI_RE = /\\x1b(?:\\[[0-9;?]*[A-Za-z]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\([A-Z])/g;\n\n/**\n * Clean up raw piped output so the agent sees readable text, not terminal\n * control noise.\n *\n * 1. Strip all ANSI escape sequences (colors, cursor movement, line clears).\n * 2. Simulate carriage-return overwrites: for each line, split on `\\r` and\n * keep only the last segment — this is what the terminal would display\n * after a spinner/progress bar finishes.\n * 3. Collapse runs of blank lines.\n */\nexport function sanitizePipedOutput(raw: string): string {\n // Strip ANSI escapes first\n let text = raw.replace(ANSI_RE, '');\n\n // Strip binary control characters (everything below 0x20 except \\t, \\n, \\r)\n text = text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n\n // Simulate \\r overwrites: for each line, the last \\r-segment wins\n text = text\n .split('\\n')\n .map(line => {\n if (!line.includes('\\r')) return line;\n const segments = line.split('\\r');\n // Walk backwards to find the last non-empty segment — a trailing \\r\n // produces an empty final segment that would otherwise discard visible text.\n for (let i = segments.length - 1; i >= 0; i--) {\n if (segments[i]!.length > 0) return segments[i]!;\n }\n return '';\n })\n .join('\\n');\n\n // Collapse 3+ consecutive blank lines into 2\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n\n return text.trim();\n}\n\n/**\n * If stdin is a pipe (not a TTY), read **all** data until EOF and return it as\n * a string. The returned promise only resolves once the write end of the pipe\n * is closed — i.e. the sending process has fully exited — so callers are\n * guaranteed to receive the complete output, not a partial snapshot from a\n * program that writes progressively.\n *\n * Returns `null` when:\n * - stdin is a TTY (interactive terminal)\n * - the pipe was empty or contained only whitespace\n */\nexport async function drainPipedStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return null;\n\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n let truncated = false;\n\n for await (const chunk of process.stdin) {\n const buf = chunk as Buffer;\n\n if (totalBytes + buf.length > MAX_PIPE_BYTES) {\n // Take only what fits under the cap — copy so we don't retain the\n // original backing buffer, then zero the source.\n const remaining = MAX_PIPE_BYTES - totalBytes;\n if (remaining > 0) {\n chunks.push(Buffer.from(buf.subarray(0, remaining)));\n }\n buf.fill(0);\n totalBytes = MAX_PIPE_BYTES;\n truncated = true;\n // Keep draining so we don't leave unread data in the pipe, but don't\n // store it — we still need to wait for EOF.\n continue;\n }\n\n chunks.push(buf);\n totalBytes += buf.length;\n }\n\n if (truncated) {\n process.stderr.write(`Warning: Piped input exceeded ${MAX_PIPE_BYTES / 1024 / 1024}MB and was truncated.\\n`);\n }\n\n const raw = Buffer.concat(chunks).toString('utf-8');\n\n // Zero out raw buffers so piped secrets don't linger in memory\n for (const buf of chunks) {\n buf.fill(0);\n }\n chunks.length = 0;\n\n const content = sanitizePipedOutput(raw);\n return content.length > 0 ? content : null;\n}\n\n/**\n * Reopen `/dev/tty` (or `CON` on Windows) as `process.stdin` so that the\n * interactive TUI can read keyboard input after the original piped stdin has\n * been consumed.\n *\n * @returns `true` if the swap succeeded, `false` if a TTY could not be opened\n * (e.g. running in a headless CI container with no controlling terminal).\n */\nexport function reopenStdinFromTTY(): boolean {\n const ttyPath = process.platform === 'win32' ? 'CON' : '/dev/tty';\n\n let fd: number;\n try {\n fd = fs.openSync(ttyPath, 'r');\n } catch {\n return false;\n }\n\n const ttyStream = new tty.ReadStream(fd);\n\n Object.defineProperty(process, 'stdin', {\n value: ttyStream,\n writable: true,\n configurable: true,\n });\n\n return true;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCodeAnalytics } from './analytics.js';\nimport { isStreamDestroyedError } from './error-classification.js';\nimport { hasHeadlessFlag, headlessMain } from './headless.js';\nimport { createBrowserFromSettings, loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { setupDebugLogging } from './utils/debug-log.js';\nimport { drainPipedStdin, reopenStdinFromTTY } from './utils/stdin-pipe.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.js';\nimport { getCurrentVersion } from './utils/update-check.js';\nimport { createMastraCode } from './index.js';\n\nlet harness: Awaited<ReturnType<typeof createMastraCode>>['harness'];\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 analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const result = await createMastraCode({ unixSocketPubSub: true });\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\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.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 analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: harness.getCurrentModeId(),\n resourceId: harness.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n harness.setBrowser(browser);\n void harness.setState({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n harness?.stopHeartbeats(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\nprocess.on('SIGINT', () => {\n void asyncCleanup().finally(() => process.exit(0));\n});\nprocess.on('SIGTERM', () => {\n void asyncCleanup().finally(() => process.exit(0));\n});\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 handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return headlessMain();\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return headlessMain(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
1
+ {"version":3,"sources":["../src/analytics.ts","../src/error-classification.ts","../src/utils/debug-log.ts","../src/headless.ts","../src/utils/stdin-pipe.ts","../src/main.ts"],"names":["os","randomUUID","PostHog","fs","path","getAppDataDir","parseArgs","harness","existsSync","createMastraCode","mcpManager","releaseAllThreadLocks","fs2","tty","loadSettings","createBrowserFromSettings","settings","detectTerminalTheme","applyThemeMode","getCurrentVersion","MastraTUI","restoreTerminalForeground","msg"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport os from 'node:os';\n\nimport { PostHog } from 'posthog-node';\n\nconst POSTHOG_API_KEY = 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT';\nconst POSTHOG_HOST = 'https://us.posthog.com';\nconst MASTRA_SOURCE = 'mastracode';\nconst TRUTHY_DISABLED_VALUES = new Set(['1', 'true', 'yes', 'on']);\n\nexport function getMastraAnalyticsDistinctId(hostname = os.hostname()): string {\n return `mastra-${hostname}`;\n}\n\nfunction isAnalyticsDebugEnabled(): boolean {\n return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? '');\n}\n\nfunction debugAnalytics(message: string, properties?: Record<string, unknown>): void {\n if (!isAnalyticsDebugEnabled()) {\n return;\n }\n\n const suffix = properties ? ` ${JSON.stringify(properties)}` : '';\n process.stderr.write(`[mastracode analytics] ${message}${suffix}\\n`);\n}\n\nexport type MastraCodeAnalyticsEvent =\n | 'mastracode_session_started'\n | 'mastracode_prompt_submitted'\n | 'mastracode_thread_changed'\n | 'mastracode_model_changed'\n | 'mastracode_command_used'\n | 'mastracode_interactive_prompt_shown';\n\nexport interface MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void;\n trackCommand(command: string, properties?: Record<string, unknown>): void;\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void;\n shutdown(): Promise<void>;\n isEnabled(): boolean;\n}\n\ninterface MastraCodeAnalyticsOptions {\n version: string;\n host?: string;\n apiKey?: string;\n}\n\nclass NoopMastraCodeAnalytics implements MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent): void {\n debugAnalytics('capture skipped: telemetry disabled', { event });\n }\n trackCommand(command: string): void {\n debugAnalytics('command skipped: telemetry disabled', { command });\n }\n trackInteractivePrompt(promptType: string): void {\n debugAnalytics('interactive prompt skipped: telemetry disabled', { promptType });\n }\n async shutdown(): Promise<void> {\n debugAnalytics('shutdown skipped: telemetry disabled');\n }\n isEnabled(): boolean {\n return false;\n }\n}\n\nclass PostHogMastraCodeAnalytics implements MastraCodeAnalytics {\n private readonly client: PostHog;\n private readonly distinctId: string;\n private readonly sessionId = randomUUID();\n private readonly version: string;\n\n constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }: MastraCodeAnalyticsOptions) {\n this.version = version;\n this.distinctId = getMastraAnalyticsDistinctId();\n this.client = new PostHog(apiKey, {\n host,\n flushAt: 1,\n flushInterval: 0,\n disableGeoip: false,\n });\n this.client.register({ mastraSource: MASTRA_SOURCE });\n debugAnalytics('enabled', { host, distinctId: this.distinctId, version });\n }\n\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void {\n try {\n const eventProperties = {\n ...this.getBaseProperties(),\n ...properties,\n };\n debugAnalytics('capture', { event, properties: eventProperties });\n this.client.capture({\n distinctId: this.distinctId,\n event,\n properties: eventProperties,\n });\n } catch (error) {\n debugAnalytics('capture failed', { event, error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n trackCommand(command: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_command_used', { command, ...properties });\n }\n\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_interactive_prompt_shown', { promptType, ...properties });\n }\n\n async shutdown(): Promise<void> {\n try {\n debugAnalytics('shutdown start');\n await this.client.shutdown();\n debugAnalytics('shutdown complete');\n } catch (error) {\n debugAnalytics('shutdown failed', { error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n isEnabled(): boolean {\n return true;\n }\n\n private getBaseProperties(): Record<string, unknown> {\n return {\n mastraSource: MASTRA_SOURCE,\n sessionId: this.sessionId,\n version: this.version,\n os: process.platform,\n osVersion: os.release(),\n nodeVersion: process.version,\n platform: process.arch,\n machineId: os.hostname(),\n };\n }\n}\n\nexport function isTelemetryDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const value = env.MASTRA_TELEMETRY_DISABLED;\n if (!value) {\n return false;\n }\n\n return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nexport function createMastraCodeAnalytics(options: MastraCodeAnalyticsOptions): MastraCodeAnalytics {\n if (isTelemetryDisabled()) {\n debugAnalytics('disabled by MASTRA_TELEMETRY_DISABLED', { value: process.env.MASTRA_TELEMETRY_DISABLED });\n return new NoopMastraCodeAnalytics();\n }\n\n return new PostHogMastraCodeAnalytics(options);\n}\n","/**\n * Checks whether an error is an ERR_STREAM_DESTROYED error, which is a\n * non-fatal condition that occurs when code writes to a stream after it\n * has been closed (e.g., client disconnect, cancelled LLM stream, LSP\n * shutdown, killed subprocess).\n *\n * Walks the `.cause` chain up to a depth limit.\n */\nexport function isStreamDestroyedError(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ERR_STREAM_DESTROYED') return true;\n if (typeof e.message === 'string' && e.message.includes('stream was destroyed')) return true;\n if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;\n if (Array.isArray(e.errors) && e.errors.some((inner: unknown) => isStreamDestroyedError(inner, depth + 1)))\n return true;\n return false;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { getAppDataDir } from './project.js';\n\nconst MAX_LOG_SIZE = 5 * 1024 * 1024; // 5 MB\nconst KEEP_SIZE = 4 * 1024 * 1024; // 4 MB\n\n/**\n * Truncate a log file to roughly {@link KEEP_SIZE} bytes if it exceeds\n * {@link MAX_LOG_SIZE}, cutting at the first newline so we don't start mid-line.\n */\nexport function truncateLogFile(logFile: string): void {\n try {\n const stat = fs.statSync(logFile);\n if (stat.size > MAX_LOG_SIZE) {\n const buf = Buffer.alloc(KEEP_SIZE);\n const fd = fs.openSync(logFile, 'r');\n fs.readSync(fd, buf, 0, KEEP_SIZE, stat.size - KEEP_SIZE);\n fs.closeSync(fd);\n const firstNewline = buf.indexOf(10);\n const trimmed = firstNewline >= 0 ? buf.subarray(firstNewline + 1) : buf;\n fs.writeFileSync(logFile, trimmed);\n }\n } catch {\n // File may not exist yet — that's fine\n }\n}\n\n/**\n * Set up debug logging. When {@link MASTRA_DEBUG} is `\"true\"`, redirects\n * `console.error` and `console.warn` to a log file (truncating it first if\n * oversized). Otherwise silences them to avoid corrupting the TUI.\n */\nexport function setupDebugLogging(): void {\n const debugEnabled = ['true', '1'].includes(process.env.MASTRA_DEBUG ?? '');\n\n if (debugEnabled) {\n const logFile = path.join(getAppDataDir(), 'debug.log');\n truncateLogFile(logFile);\n\n const logStream = fs.createWriteStream(logFile, { flags: 'a' });\n const fmt = (a: unknown): string => {\n if (typeof a === 'string') return a;\n if (a instanceof Error) return a.stack ?? `${a.name}: ${a.message}`;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n };\n console.error = (...args: unknown[]) => {\n logStream.write(`[ERROR] ${new Date().toISOString()} ${args.map(fmt).join(' ')}\\n`);\n };\n console.warn = (...args: unknown[]) => {\n logStream.write(`[WARN] ${new Date().toISOString()} ${args.map(fmt).join(' ')}\\n`);\n };\n } else {\n const noop = () => {};\n console.error = noop;\n console.warn = noop;\n }\n}\n","/**\n * Headless mode helpers — pure functions extracted for testability.\n */\nimport { existsSync } from 'node:fs';\nimport { parseArgs } from 'node:util';\n\nimport type { Harness, HarnessEvent, HarnessMessage } from '@mastra/core/harness';\n\nimport { setupDebugLogging } from './utils/debug-log.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.js';\nimport { createMastraCode } from './index.js';\n\nconst VALID_MODES = ['build', 'plan', 'fast'] as const;\nconst VALID_THINKING_LEVELS = ['off', 'low', 'medium', 'high', 'xhigh'] as const;\n\nexport interface HeadlessArgs {\n prompt?: string;\n timeout?: number;\n format: 'default' | 'json';\n outputFormat?: 'text' | 'json' | 'stream-json';\n continue_: boolean;\n model?: string;\n mode?: 'build' | 'plan' | 'fast';\n thinkingLevel?: 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n settings?: string;\n thread?: string;\n title?: string;\n cloneThread: boolean;\n resourceId?: string;\n}\n\n/** Returns true if argv contains --prompt or -p, indicating headless mode. */\nexport function hasHeadlessFlag(argv: string[]): boolean {\n return argv.some(a => a === '--prompt' || a === '-p');\n}\n\nconst headlessOptions = {\n prompt: { type: 'string', short: 'p' },\n continue: { type: 'boolean', short: 'c', default: false },\n thread: { type: 'string', short: 't' },\n title: { type: 'string' },\n 'clone-thread': { type: 'boolean', default: false },\n 'resource-id': { type: 'string' },\n timeout: { type: 'string' }, // parsed to number after validation\n format: { type: 'string', default: 'default' },\n 'output-format': { type: 'string' },\n model: { type: 'string', short: 'm' },\n mode: { type: 'string' },\n 'thinking-level': { type: 'string' },\n settings: { type: 'string' },\n help: { type: 'boolean', short: 'h', default: false },\n} as const;\n\n/** Parse CLI arguments for headless mode (--prompt, --timeout, --format, --output-format, --continue, --model, --mode, --thinking-level, --settings). */\nexport function parseHeadlessArgs(argv: string[]): HeadlessArgs {\n const { values, positionals } = parseArgs({\n args: argv.slice(2),\n options: headlessOptions,\n strict: false,\n allowPositionals: true,\n });\n\n const format = String(values.format ?? 'default');\n if (format !== 'default' && format !== 'json') {\n throw new Error('--format must be \"default\" or \"json\"');\n }\n\n let timeout: number | undefined;\n if (values.timeout !== undefined) {\n const raw = String(values.timeout);\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error('--timeout must be a positive integer');\n }\n timeout = parsed;\n }\n\n const prompt = typeof values.prompt === 'string' ? values.prompt : positionals[0];\n const model = typeof values.model === 'string' ? values.model : undefined;\n\n let mode: HeadlessArgs['mode'];\n if (values.mode !== undefined) {\n const raw = String(values.mode);\n if (!(VALID_MODES as readonly string[]).includes(raw)) {\n throw new Error(`--mode must be ${VALID_MODES.map(m => `\"${m}\"`).join(', ')}`);\n }\n mode = raw as HeadlessArgs['mode'];\n }\n\n let thinkingLevel: HeadlessArgs['thinkingLevel'];\n if (values['thinking-level'] !== undefined) {\n const raw = String(values['thinking-level']);\n if (!(VALID_THINKING_LEVELS as readonly string[]).includes(raw)) {\n throw new Error(`--thinking-level must be ${VALID_THINKING_LEVELS.map(l => `\"${l}\"`).join(', ')}`);\n }\n thinkingLevel = raw as HeadlessArgs['thinkingLevel'];\n }\n\n let outputFormat: HeadlessArgs['outputFormat'];\n if (values['output-format'] !== undefined) {\n const raw = String(values['output-format']);\n if (raw !== 'text' && raw !== 'json' && raw !== 'stream-json') {\n throw new Error('--output-format must be one of: text, json, stream-json');\n }\n outputFormat = raw;\n }\n\n const settings = typeof values.settings === 'string' ? values.settings : undefined;\n const thread = typeof values.thread === 'string' ? values.thread : undefined;\n const title = typeof values.title === 'string' ? values.title : undefined;\n const cloneThread = Boolean(values['clone-thread']);\n const resourceId = typeof values['resource-id'] === 'string' ? values['resource-id'] : undefined;\n\n if (values.continue && thread) {\n throw new Error('--continue and --thread cannot be used together');\n }\n\n return {\n prompt,\n timeout,\n format: format as 'default' | 'json',\n outputFormat,\n continue_: Boolean(values.continue),\n model,\n mode,\n thinkingLevel,\n settings,\n thread,\n title,\n cloneThread,\n resourceId,\n };\n}\n\n/** Truncate a string to `max` characters, appending \"...\" if truncated. */\nexport function truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + '...' : s;\n}\n\nexport function printHeadlessUsage(): void {\n process.stdout.write(`\nUsage: mastracode --prompt <text> [options]\n\nHeadless (non-interactive) mode options:\n --prompt, -p <text> The task to execute (required, or pipe via stdin)\n --continue, -c Resume the most recent thread instead of creating a new one\n --thread, -t <id|title> Resume a specific thread by ID or title\n --title <title> Set or rename the thread title\n --clone-thread Clone the current thread before running (work on a copy)\n --resource-id <id> Set the resource ID for thread scoping\n --timeout <seconds> Exit with code 2 if not complete within timeout\n --format <type> Output format: \"default\" or \"json\" (default: \"default\")\n --output-format <type> Automation output: \"text\", \"json\", or \"stream-json\"\n --model, -m <id> Model override (e.g., \"anthropic/claude-sonnet-4-5\")\n --mode {build|plan|fast} Execution mode — defaults to \"build\" if omitted\n --thinking-level <level> Thinking level: off, low, medium, high, xhigh\n --settings <path> Path to settings.json file (default: global settings)\n\nThread behavior:\n By default, a new thread is created for each run.\n Use --continue to resume the most recent thread, or --thread to target a specific one.\n Use --clone-thread to branch off a copy before running.\n\nSettings file:\n Uses the same settings.json as the interactive TUI. Pass --settings to use\n a custom settings file (e.g., settings-ci.json for CI). All model, pack,\n subagent, and OM configuration is resolved from settings at startup.\n\nExit codes:\n 0 Agent completed successfully\n 1 Error or aborted\n 2 Timeout\n\nExamples:\n mastracode --prompt \"Fix the bug in auth.ts\"\n mastracode --prompt \"Add tests\" --timeout 300\n mastracode --prompt \"Fix the bug\" --mode fast --thinking-level high\n mastracode --settings ./settings-ci.json --prompt \"Run tests\"\n mastracode -c --prompt \"Continue where you left off\"\n mastracode -t \"feature-auth\" --prompt \"Keep working on this\"\n mastracode --thread abc123 --clone-thread --prompt \"Try a different approach\"\n mastracode --prompt \"Refactor utils\" --title \"utils-refactor\"\n mastracode --prompt \"Refactor utils\" --format json\n mastracode --prompt \"Run tests and summarize pass/fail counts\" --output-format json\n mastracode --prompt \"Find all TODO comments\" --output-format stream-json\n mastracode --resource-id my-project --prompt \"Fix the bug\"\n echo \"task description\" | mastracode --prompt -\n\nPiping without --prompt launches the interactive TUI with piped content\nas the first message:\n cat file.txt | mastracode\n git diff | mastracode\n npm test 2>&1 | mastracode\n\nRun without --prompt for the interactive TUI.\n`);\n}\n\nfunction resolveExitCode(reason?: string): number {\n return reason === 'error' || reason === 'aborted' ? 1 : 0;\n}\n\nfunction autoResolve<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n event: HarnessEvent,\n): { resolved: true; label: string; json: Record<string, unknown> } | { resolved: false } {\n switch (event.type) {\n case 'sandbox_access_request': {\n harness.respondToQuestion({ questionId: event.questionId, answer: 'Yes' });\n return { resolved: true, label: `[auto-approved sandbox] ${event.path}`, json: { ...event, autoApproved: true } };\n }\n case 'tool_approval_required': {\n harness.respondToToolApproval({ decision: 'approve' });\n return { resolved: true, label: `[auto-approved] ${event.toolName}`, json: { ...event, autoApproved: true } };\n }\n case 'ask_question': {\n harness.respondToQuestion({\n questionId: event.questionId,\n answer: 'Proceed with your best judgment. Do not ask further questions.',\n });\n return {\n resolved: true,\n label: `[auto-answered] ${truncate(event.question, 100)}`,\n json: { ...event, autoAnswered: true },\n };\n }\n case 'plan_approval_required': {\n void harness.respondToPlanApproval({ planId: event.planId, response: { action: 'approved' } });\n return { resolved: true, label: `[auto-approved plan] ${event.title}`, json: { ...event, autoApproved: true } };\n }\n default:\n return { resolved: false };\n }\n}\n\nfunction formatDefault(event: HarnessEvent, ctx: { lastTextLength: number }): void {\n switch (event.type) {\n case 'agent_start':\n ctx.lastTextLength = 0;\n break;\n case 'message_update': {\n const fullText = event.message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(p => p.text)\n .join('');\n if (fullText.length > ctx.lastTextLength) {\n process.stdout.write(fullText.slice(ctx.lastTextLength));\n ctx.lastTextLength = fullText.length;\n }\n break;\n }\n case 'message_end':\n ctx.lastTextLength = 0;\n process.stdout.write('\\n');\n break;\n case 'tool_start':\n process.stderr.write(`[tool] ${event.toolName}\\n`);\n break;\n case 'tool_end':\n if (event.isError) process.stderr.write(`[tool error] ${truncate(String(event.result), 200)}\\n`);\n break;\n case 'shell_output':\n process.stderr.write(event.output);\n break;\n case 'subagent_start':\n process.stderr.write(\n `[subagent:${event.forked ? 'forked:' : ''}${event.agentType}] ${truncate(event.task, 100)}\\n`,\n );\n break;\n case 'subagent_end':\n if (event.isError) process.stderr.write(`[subagent error] ${truncate(event.result, 200)}\\n`);\n break;\n case 'error':\n process.stderr.write(`[error] ${event.error.message}\\n`);\n break;\n }\n}\n\ninterface HeadlessSummary {\n text: string;\n finishReason?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n toolCalls: Array<{ id: string; name: string; args: unknown }>;\n toolResults: Array<{ id: string; name: string; result: unknown; isError: boolean }>;\n error?: { name: string; message: string; stack?: string };\n threadId?: string;\n}\n\nfunction createEmptySummary(): HeadlessSummary {\n return { text: '', toolCalls: [], toolResults: [] };\n}\n\nfunction extractAssistantText(message: HarnessMessage): string {\n return message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(c => c.text)\n .join('');\n}\n\nfunction aggregateIntoSummary(event: HarnessEvent, summary: HeadlessSummary): void {\n switch (event.type) {\n case 'message_end':\n if (event.message.role === 'assistant') {\n summary.text += extractAssistantText(event.message);\n }\n break;\n case 'tool_start':\n summary.toolCalls.push({ id: event.toolCallId, name: event.toolName, args: event.args });\n break;\n case 'tool_end': {\n const matching = summary.toolCalls.find(c => c.id === event.toolCallId);\n summary.toolResults.push({\n id: event.toolCallId,\n name: matching?.name ?? '',\n result: event.result,\n isError: event.isError,\n });\n break;\n }\n case 'usage_update':\n summary.usage = {\n inputTokens: event.usage.promptTokens,\n outputTokens: event.usage.completionTokens,\n totalTokens: event.usage.totalTokens,\n };\n break;\n case 'error':\n summary.error = {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n };\n break;\n }\n}\n\nfunction finalizeSummary<TState extends Record<string, unknown>>(\n summary: HeadlessSummary,\n endEvent: Extract<HarnessEvent, { type: 'agent_end' }>,\n harness: Harness<TState>,\n): void {\n summary.finishReason = endEvent.reason;\n summary.threadId = harness.getCurrentThreadId() ?? undefined;\n}\n\n/** Resolve a thread by ID or title. Tries exact ID match first, then title. */\nasync function resolveThread<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n threadIdOrTitle: string,\n): Promise<{ threadId: string; matchType: 'id' | 'title' } | { error: string }> {\n const threads = await harness.listThreads();\n\n const byId = threads.find(t => t.id === threadIdOrTitle);\n if (byId) return { threadId: byId.id, matchType: 'id' };\n\n const byTitle = threads\n .filter(t => t.title === threadIdOrTitle)\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n if (byTitle.length > 0) return { threadId: byTitle[0]!.id, matchType: 'title' };\n\n return { error: `No thread found matching \"${threadIdOrTitle}\"` };\n}\n\n/**\n * Run headless mode: subscribe to harness events with auto-approval,\n * optionally resume a thread, send the prompt, and wait for completion.\n *\n * Returns the exit code (0 = success, 1 = error/aborted, 2 = timeout).\n */\nexport async function runHeadless<TState extends Record<string, unknown>>(\n harness: Harness<TState>,\n args: HeadlessArgs & { prompt: string },\n effectiveDefaults?: Record<string, string>,\n): Promise<number> {\n const outputFormat = args.outputFormat;\n const emit =\n outputFormat === 'stream-json' || (!outputFormat && args.format === 'json')\n ? (data: Record<string, unknown>) => process.stdout.write(JSON.stringify(data) + '\\n')\n : null;\n const summary = outputFormat === 'json' ? createEmptySummary() : null;\n let textBuffer: string | null = outputFormat === 'text' ? '' : null;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n if (args.timeout) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n if (emit) {\n emit({ type: 'timeout', seconds: args.timeout });\n } else {\n process.stderr.write(`\\nTimeout: ${args.timeout}s elapsed. Aborting.\\n`);\n }\n harness.abort();\n }, args.timeout * 1000);\n }\n\n function failEarly(msg: string): 1 {\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n\n // --- Pre-flight checks (before subscribing to events) ---\n\n // --- Resolve model ---\n if (args.model && args.mode) {\n if (emit) {\n emit({ type: 'warning', message: '--model overrides --mode, ignoring --mode' });\n } else {\n process.stderr.write('Warning: --model overrides --mode, ignoring --mode\\n');\n }\n }\n\n if (args.model) {\n // Highest priority: explicit --model flag\n const available = await harness.listAvailableModels();\n const match = available.find(m => m.id === args.model);\n if (!match) {\n return failEarly(`Unknown model: \"${args.model}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return failEarly(`Model \"${args.model}\" has no API key configured.${keyHint}`);\n }\n await harness.switchModel({ modelId: args.model });\n if (!emit) process.stderr.write(`[model] ${args.model}\\n`);\n } else if (args.mode) {\n // --mode flag: look up model from effectiveDefaults (resolved from settings at startup)\n const modelId = effectiveDefaults?.[args.mode];\n if (modelId) {\n const available = await harness.listAvailableModels();\n const match = available.find(m => m.id === modelId);\n if (!match) {\n return failEarly(`Unknown model \"${modelId}\" configured for mode \"${args.mode}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return failEarly(`Model \"${modelId}\" (mode: ${args.mode}) has no API key configured.${keyHint}`);\n }\n await harness.switchModel({ modelId });\n if (!emit) process.stderr.write(`[model] ${modelId} (mode: ${args.mode})\\n`);\n } else {\n const warnMsg = `--mode ${args.mode} has no configured model, using default`;\n if (emit) emit({ type: 'warning', message: warnMsg });\n else process.stderr.write(`Warning: ${warnMsg}\\n`);\n }\n }\n\n // --- Resolve thinking level ---\n if (args.thinkingLevel) {\n await harness.setState({ thinkingLevel: args.thinkingLevel } as unknown as Partial<TState>);\n if (!emit) process.stderr.write(`[thinking] ${args.thinkingLevel}\\n`);\n }\n\n // --- Subscribe and send ---\n // Subscription is set up after preflight checks (model switching, thinking level) so that\n // early-exit failures don't leave a dangling subscriber. The subscriber only handles\n // runtime events (auto-resolution, streaming, agent_end).\n\n const streamCtx = { lastTextLength: 0 };\n\n const done = new Promise<number>(resolve => {\n harness.subscribe(event => {\n const result = autoResolve(harness, event);\n if (result.resolved) {\n if (emit) emit(result.json);\n else if (!outputFormat) process.stderr.write(result.label + '\\n');\n return;\n }\n\n // Aggregate into accumulators for text / json modes\n if (summary) aggregateIntoSummary(event, summary);\n if (textBuffer !== null && event.type === 'message_end' && event.message.role === 'assistant') {\n textBuffer += extractAssistantText(event.message);\n }\n\n if (event.type === 'agent_end') {\n if (summary) {\n finalizeSummary(summary, event, harness);\n process.stdout.write(JSON.stringify(summary) + '\\n');\n } else if (textBuffer !== null) {\n process.stdout.write(textBuffer);\n if (!textBuffer.endsWith('\\n')) process.stdout.write('\\n');\n } else if (emit) {\n emit({ ...event });\n }\n resolve(resolveExitCode(event.reason));\n return;\n }\n\n if (emit) {\n emit({ ...event });\n } else if (!outputFormat) {\n formatDefault(event, streamCtx);\n }\n });\n });\n\n // --- Resource ID ---\n if (args.resourceId) {\n harness.setResourceId({ resourceId: args.resourceId });\n if (!emit) process.stderr.write(`[resource] ${args.resourceId}\\n`);\n }\n\n // --- Thread selection ---\n try {\n if (args.thread) {\n const result = await resolveThread(harness, args.thread);\n if ('error' in result) {\n const msg = result.error;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n await harness.switchThread({ threadId: result.threadId });\n if (!emit) process.stderr.write(`[thread] resumed ${result.threadId} (matched by ${result.matchType})\\n`);\n } else if (args.continue_) {\n const threads = await harness.listThreads();\n if (threads.length > 0) {\n const sorted = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n await harness.switchThread({ threadId: sorted[0]!.id });\n if (!emit) process.stderr.write(`[continued] thread ${sorted[0]!.id}\\n`);\n } else if (!emit) {\n process.stderr.write(`[info] No existing threads found, starting new thread\\n`);\n }\n }\n // else: no thread selection — sendMessage will auto-create a new thread\n } catch (err) {\n const msg = `Failed to select thread: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n\n // --- Clone ---\n if (args.cloneThread) {\n try {\n const cloned = await harness.cloneThread();\n if (emit) emit({ type: 'thread_cloned', threadId: cloned.id });\n else process.stderr.write(`[cloned] thread ${cloned.id}\\n`);\n } catch (err) {\n const msg = `Failed to clone thread: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n }\n\n // --- Title ---\n if (args.title) {\n try {\n await harness.renameThread({ title: args.title });\n if (!emit) process.stderr.write(`[title] \"${args.title}\"\\n`);\n } catch (err) {\n const msg = `Failed to set thread title: ${(err as Error).message}`;\n if (emit) emit({ type: 'error', error: { message: msg } });\n else process.stderr.write(`Error: ${msg}\\n`);\n if (timeoutId) clearTimeout(timeoutId);\n return 1;\n }\n }\n\n await harness.sendMessage({ content: args.prompt });\n\n const exitCode = await done;\n if (timeoutId) clearTimeout(timeoutId);\n return timedOut ? 2 : exitCode;\n}\n\n/**\n * Headless mode main entry point: parse arguments, read stdin, initialize\n * MastraCode, and run headless mode.\n */\nexport async function headlessMain(predrainedInput?: string | null): Promise<never> {\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n printHeadlessUsage();\n process.exit(0);\n }\n\n let args;\n try {\n args = parseHeadlessArgs(process.argv);\n } catch (e) {\n process.stderr.write(`Error: ${(e as Error).message}\\n`);\n process.exit(1);\n }\n\n let prompt = args.prompt;\n if (predrainedInput !== undefined) {\n // Stdin was already drained by the caller (e.g. TTY reopen failed after pipe drain)\n prompt = predrainedInput ?? '';\n } else if (prompt === '-' || (!prompt && !process.stdin.isTTY)) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n printHeadlessUsage();\n process.stderr.write('Error: --prompt is required (or pipe via stdin)\\n');\n process.exit(1);\n }\n\n if (args.settings && !existsSync(args.settings)) {\n process.stderr.write(`Error: Settings file not found: ${args.settings}\\n`);\n process.exit(1);\n }\n\n const result = await createMastraCode({ settingsPath: args.settings });\n const { harness, mcpManager, effectiveDefaults } = result;\n\n if (mcpManager?.hasServers()) {\n mcpManager.initInBackground().catch(err => {\n process.stderr.write(`Warning: MCP server initialization failed: ${(err as Error).message ?? err}\\n`);\n });\n }\n\n setupDebugLogging();\n await harness.init();\n await harness.getMastra()?.startWorkers();\n\n const exitCode = await runHeadless(harness, { ...args, prompt }, effectiveDefaults);\n\n // Cleanup\n releaseAllThreadLocks();\n const closeSignalsPubSub = (result.signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n harness.getMastra()?.stopWorkers(),\n harness?.stopHeartbeats(),\n closeSignalsPubSub?.(),\n ]);\n\n process.exit(exitCode);\n}\n","import * as fs from 'node:fs';\nimport * as tty from 'node:tty';\n\n/** Maximum piped input size (1 MB). Content beyond this is truncated. */\nconst MAX_PIPE_BYTES = 1024 * 1024;\n\n/**\n * Matches all ANSI escape sequences — SGR (colors), cursor movement, line\n * clears, scrolling, window titles, etc.\n */\nconst ANSI_RE = /\\x1b(?:\\[[0-9;?]*[A-Za-z]|\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)?|\\([A-Z])/g;\n\n/**\n * Clean up raw piped output so the agent sees readable text, not terminal\n * control noise.\n *\n * 1. Strip all ANSI escape sequences (colors, cursor movement, line clears).\n * 2. Simulate carriage-return overwrites: for each line, split on `\\r` and\n * keep only the last segment — this is what the terminal would display\n * after a spinner/progress bar finishes.\n * 3. Collapse runs of blank lines.\n */\nexport function sanitizePipedOutput(raw: string): string {\n // Strip ANSI escapes first\n let text = raw.replace(ANSI_RE, '');\n\n // Strip binary control characters (everything below 0x20 except \\t, \\n, \\r)\n text = text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n\n // Simulate \\r overwrites: for each line, the last \\r-segment wins\n text = text\n .split('\\n')\n .map(line => {\n if (!line.includes('\\r')) return line;\n const segments = line.split('\\r');\n // Walk backwards to find the last non-empty segment — a trailing \\r\n // produces an empty final segment that would otherwise discard visible text.\n for (let i = segments.length - 1; i >= 0; i--) {\n if (segments[i]!.length > 0) return segments[i]!;\n }\n return '';\n })\n .join('\\n');\n\n // Collapse 3+ consecutive blank lines into 2\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n\n return text.trim();\n}\n\n/**\n * If stdin is a pipe (not a TTY), read **all** data until EOF and return it as\n * a string. The returned promise only resolves once the write end of the pipe\n * is closed — i.e. the sending process has fully exited — so callers are\n * guaranteed to receive the complete output, not a partial snapshot from a\n * program that writes progressively.\n *\n * Returns `null` when:\n * - stdin is a TTY (interactive terminal)\n * - the pipe was empty or contained only whitespace\n */\nexport async function drainPipedStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return null;\n\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n let truncated = false;\n\n for await (const chunk of process.stdin) {\n const buf = chunk as Buffer;\n\n if (totalBytes + buf.length > MAX_PIPE_BYTES) {\n // Take only what fits under the cap — copy so we don't retain the\n // original backing buffer, then zero the source.\n const remaining = MAX_PIPE_BYTES - totalBytes;\n if (remaining > 0) {\n chunks.push(Buffer.from(buf.subarray(0, remaining)));\n }\n buf.fill(0);\n totalBytes = MAX_PIPE_BYTES;\n truncated = true;\n // Keep draining so we don't leave unread data in the pipe, but don't\n // store it — we still need to wait for EOF.\n continue;\n }\n\n chunks.push(buf);\n totalBytes += buf.length;\n }\n\n if (truncated) {\n process.stderr.write(`Warning: Piped input exceeded ${MAX_PIPE_BYTES / 1024 / 1024}MB and was truncated.\\n`);\n }\n\n const raw = Buffer.concat(chunks).toString('utf-8');\n\n // Zero out raw buffers so piped secrets don't linger in memory\n for (const buf of chunks) {\n buf.fill(0);\n }\n chunks.length = 0;\n\n const content = sanitizePipedOutput(raw);\n return content.length > 0 ? content : null;\n}\n\n/**\n * Reopen `/dev/tty` (or `CON` on Windows) as `process.stdin` so that the\n * interactive TUI can read keyboard input after the original piped stdin has\n * been consumed.\n *\n * @returns `true` if the swap succeeded, `false` if a TTY could not be opened\n * (e.g. running in a headless CI container with no controlling terminal).\n */\nexport function reopenStdinFromTTY(): boolean {\n const ttyPath = process.platform === 'win32' ? 'CON' : '/dev/tty';\n\n let fd: number;\n try {\n fd = fs.openSync(ttyPath, 'r');\n } catch {\n return false;\n }\n\n const ttyStream = new tty.ReadStream(fd);\n\n Object.defineProperty(process, 'stdin', {\n value: ttyStream,\n writable: true,\n configurable: true,\n });\n\n return true;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCodeAnalytics } from './analytics.js';\nimport { isStreamDestroyedError } from './error-classification.js';\nimport { hasHeadlessFlag, headlessMain } from './headless.js';\nimport { createBrowserFromSettings, loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { setupDebugLogging } from './utils/debug-log.js';\nimport { drainPipedStdin, reopenStdinFromTTY } from './utils/stdin-pipe.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.js';\nimport { getCurrentVersion } from './utils/update-check.js';\nimport { createMastraCode } from './index.js';\n\nlet harness: Awaited<ReturnType<typeof createMastraCode>>['harness'];\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 analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const result = await createMastraCode({ unixSocketPubSub: true });\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\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.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 analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: harness.getCurrentModeId(),\n resourceId: harness.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n harness.setBrowser(browser);\n void harness.setState({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n harness?.getMastra()?.stopWorkers(),\n harness?.stopHeartbeats(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\nprocess.on('SIGINT', () => {\n void asyncCleanup().finally(() => process.exit(0));\n});\nprocess.on('SIGTERM', () => {\n void asyncCleanup().finally(() => process.exit(0));\n});\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 handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return headlessMain();\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return headlessMain(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { createMastraCode } from './chunk-J4DYNVTI.js';
3
- import { detectTerminalTheme, getCurrentVersion, MastraTUI } from './chunk-YRX4OMQN.js';
4
- import { restoreTerminalForeground, releaseAllThreadLocks, loadSettings, applyThemeMode, createBrowserFromSettings } from './chunk-HFGEUXMI.js';
2
+ import { createMastraCode } from './chunk-Y5AUV6T3.js';
3
+ import { detectTerminalTheme, getCurrentVersion, MastraTUI } from './chunk-BFO3NTQO.js';
4
+ import { restoreTerminalForeground, releaseAllThreadLocks, loadSettings, applyThemeMode, createBrowserFromSettings } from './chunk-7ZTY5SBK.js';
5
5
  import { getAppDataDir } from './chunk-5FT2NNFO.js';
6
6
  import * as fs from 'fs';
7
7
  import fs__default, { existsSync } from 'fs';
@@ -692,10 +692,16 @@ async function headlessMain(predrainedInput) {
692
692
  }
693
693
  setupDebugLogging();
694
694
  await harness2.init();
695
+ await harness2.getMastra()?.startWorkers();
695
696
  const exitCode = await runHeadless(harness2, { ...args, prompt }, effectiveDefaults);
696
697
  releaseAllThreadLocks();
697
698
  const closeSignalsPubSub = result.signalsPubSub?.close;
698
- await Promise.allSettled([mcpManager2?.disconnect(), harness2?.stopHeartbeats(), closeSignalsPubSub?.()]);
699
+ await Promise.allSettled([
700
+ mcpManager2?.disconnect(),
701
+ harness2.getMastra()?.stopWorkers(),
702
+ harness2?.stopHeartbeats(),
703
+ closeSignalsPubSub?.()
704
+ ]);
699
705
  process.exit(exitCode);
700
706
  }
701
707
  var MAX_PIPE_BYTES = 1024 * 1024;
@@ -832,6 +838,7 @@ async function tuiMain(pipedInput) {
832
838
  appName: "Mastra Code",
833
839
  version: getCurrentVersion(),
834
840
  inlineQuestions: true,
841
+ githubSignals: result.githubSignals,
835
842
  ...pipedInput ? { initialMessage: `The following was piped via stdin:
836
843
 
837
844
  ${pipedInput}` } : {}
@@ -854,6 +861,7 @@ var asyncCleanup = async () => {
854
861
  const closeSignalsPubSub = signalsPubSub?.close;
855
862
  await Promise.allSettled([
856
863
  mcpManager?.disconnect(),
864
+ harness?.getMastra()?.stopWorkers(),
857
865
  harness?.stopHeartbeats(),
858
866
  closeSignalsPubSub?.(),
859
867
  analytics?.shutdown()