mastracode 0.4.0 → 0.5.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 (155) hide show
  1. package/CHANGELOG.md +328 -0
  2. package/LICENSE.md +15 -0
  3. package/README.md +68 -29
  4. package/dist/agents/memory.d.ts.map +1 -1
  5. package/dist/agents/model.d.ts +17 -6
  6. package/dist/agents/model.d.ts.map +1 -1
  7. package/dist/agents/prompts/index.d.ts.map +1 -1
  8. package/dist/agents/prompts/tool-guidance.d.ts +2 -0
  9. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
  10. package/dist/agents/subagents/audit-tests.d.ts +0 -7
  11. package/dist/agents/subagents/audit-tests.d.ts.map +1 -1
  12. package/dist/agents/subagents/execute.d.ts +0 -7
  13. package/dist/agents/subagents/execute.d.ts.map +1 -1
  14. package/dist/agents/subagents/explore.d.ts +0 -7
  15. package/dist/agents/subagents/explore.d.ts.map +1 -1
  16. package/dist/agents/subagents/index.d.ts.map +1 -1
  17. package/dist/agents/subagents/plan.d.ts +0 -7
  18. package/dist/agents/subagents/plan.d.ts.map +1 -1
  19. package/dist/agents/tools.d.ts +3 -1
  20. package/dist/agents/tools.d.ts.map +1 -1
  21. package/dist/agents/workspace.d.ts +4 -1
  22. package/dist/agents/workspace.d.ts.map +1 -1
  23. package/dist/{chunk-K4WJUBEC.cjs → chunk-AJEYT7X3.cjs} +763 -429
  24. package/dist/chunk-AJEYT7X3.cjs.map +1 -0
  25. package/dist/{chunk-U5A7TFNT.js → chunk-CC2724NI.js} +46 -10
  26. package/dist/chunk-CC2724NI.js.map +1 -0
  27. package/dist/{chunk-REVOTI2T.js → chunk-JI4M5525.js} +740 -412
  28. package/dist/chunk-JI4M5525.js.map +1 -0
  29. package/dist/{chunk-Z4QRXVST.cjs → chunk-MBPGUMYQ.cjs} +325 -251
  30. package/dist/chunk-MBPGUMYQ.cjs.map +1 -0
  31. package/dist/{chunk-MT3YCFCC.cjs → chunk-OEDRHUU5.cjs} +47 -9
  32. package/dist/chunk-OEDRHUU5.cjs.map +1 -0
  33. package/dist/{chunk-M5LKPQB4.js → chunk-WKPHD54B.js} +283 -209
  34. package/dist/chunk-WKPHD54B.js.map +1 -0
  35. package/dist/{chunk-C4X3C2DL.cjs → chunk-XVYUS2EA.cjs} +2213 -1035
  36. package/dist/chunk-XVYUS2EA.cjs.map +1 -0
  37. package/dist/{chunk-X3BGE7CL.js → chunk-YQNZ7DHQ.js} +1788 -613
  38. package/dist/chunk-YQNZ7DHQ.js.map +1 -0
  39. package/dist/cli.cjs +79 -31
  40. package/dist/cli.cjs.map +1 -1
  41. package/dist/cli.js +71 -23
  42. package/dist/cli.js.map +1 -1
  43. package/dist/clipboard/index.d.ts +5 -0
  44. package/dist/clipboard/index.d.ts.map +1 -1
  45. package/dist/error-classification.d.ts +10 -0
  46. package/dist/error-classification.d.ts.map +1 -0
  47. package/dist/index.cjs +2 -2
  48. package/dist/index.d.ts +10 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/mcp/config.d.ts +8 -0
  52. package/dist/mcp/config.d.ts.map +1 -1
  53. package/dist/mcp/index.d.ts +1 -1
  54. package/dist/mcp/index.d.ts.map +1 -1
  55. package/dist/mcp/manager.d.ts +4 -2
  56. package/dist/mcp/manager.d.ts.map +1 -1
  57. package/dist/mcp/types.d.ts +30 -3
  58. package/dist/mcp/types.d.ts.map +1 -1
  59. package/dist/onboarding/onboarding-inline.d.ts +2 -0
  60. package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
  61. package/dist/onboarding/packs.d.ts +1 -0
  62. package/dist/onboarding/packs.d.ts.map +1 -1
  63. package/dist/onboarding/settings.d.ts +37 -2
  64. package/dist/onboarding/settings.d.ts.map +1 -1
  65. package/dist/permissions-S3LGXIDB.js +3 -0
  66. package/dist/{permissions-CVXKYIWR.js.map → permissions-S3LGXIDB.js.map} +1 -1
  67. package/dist/permissions-VGABAVGD.cjs +40 -0
  68. package/dist/{permissions-2HIUSRQN.cjs.map → permissions-VGABAVGD.cjs.map} +1 -1
  69. package/dist/permissions.d.ts.map +1 -1
  70. package/dist/providers/claude-max.d.ts +13 -0
  71. package/dist/providers/claude-max.d.ts.map +1 -1
  72. package/dist/providers/openai-codex.d.ts +1 -0
  73. package/dist/providers/openai-codex.d.ts.map +1 -1
  74. package/dist/tool-names.d.ts +68 -0
  75. package/dist/tool-names.d.ts.map +1 -0
  76. package/dist/tools/ast-smart-edit.d.ts +77 -5
  77. package/dist/tools/ast-smart-edit.d.ts.map +1 -1
  78. package/dist/tools/index.d.ts +2 -2
  79. package/dist/tools/index.d.ts.map +1 -1
  80. package/dist/tools/string-replace-lsp.d.ts +15 -0
  81. package/dist/tools/string-replace-lsp.d.ts.map +1 -1
  82. package/dist/tools/subagent.d.ts.map +1 -1
  83. package/dist/tools/utils.d.ts +4 -2
  84. package/dist/tools/utils.d.ts.map +1 -1
  85. package/dist/tui/command-dispatch.d.ts.map +1 -1
  86. package/dist/tui/commands/clone.d.ts +29 -0
  87. package/dist/tui/commands/clone.d.ts.map +1 -0
  88. package/dist/tui/commands/custom-providers.d.ts +8 -0
  89. package/dist/tui/commands/custom-providers.d.ts.map +1 -0
  90. package/dist/tui/commands/index.d.ts +3 -1
  91. package/dist/tui/commands/index.d.ts.map +1 -1
  92. package/dist/tui/commands/mcp.d.ts.map +1 -1
  93. package/dist/tui/commands/models-pack.d.ts +4 -0
  94. package/dist/tui/commands/models-pack.d.ts.map +1 -1
  95. package/dist/tui/commands/om.d.ts.map +1 -1
  96. package/dist/tui/commands/report-issue.d.ts +3 -0
  97. package/dist/tui/commands/report-issue.d.ts.map +1 -0
  98. package/dist/tui/commands/resource.d.ts.map +1 -1
  99. package/dist/tui/commands/settings.d.ts.map +1 -1
  100. package/dist/tui/commands/threads.d.ts +1 -0
  101. package/dist/tui/commands/threads.d.ts.map +1 -1
  102. package/dist/tui/components/ask-question-inline.d.ts +3 -0
  103. package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
  104. package/dist/tui/components/custom-editor.d.ts +1 -1
  105. package/dist/tui/components/custom-editor.d.ts.map +1 -1
  106. package/dist/tui/components/help-overlay.d.ts.map +1 -1
  107. package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
  108. package/dist/tui/components/settings.d.ts +2 -0
  109. package/dist/tui/components/settings.d.ts.map +1 -1
  110. package/dist/tui/components/subagent-execution.d.ts +6 -1
  111. package/dist/tui/components/subagent-execution.d.ts.map +1 -1
  112. package/dist/tui/components/thread-selector.d.ts +6 -0
  113. package/dist/tui/components/thread-selector.d.ts.map +1 -1
  114. package/dist/tui/components/tool-execution-enhanced.d.ts +1 -0
  115. package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
  116. package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
  117. package/dist/tui/handlers/message.d.ts.map +1 -1
  118. package/dist/tui/handlers/prompts.d.ts +6 -0
  119. package/dist/tui/handlers/prompts.d.ts.map +1 -1
  120. package/dist/tui/handlers/subagent.d.ts.map +1 -1
  121. package/dist/tui/mastra-tui.d.ts +14 -5
  122. package/dist/tui/mastra-tui.d.ts.map +1 -1
  123. package/dist/tui/render-messages.d.ts.map +1 -1
  124. package/dist/tui/setup.d.ts.map +1 -1
  125. package/dist/tui/state.d.ts +4 -5
  126. package/dist/tui/state.d.ts.map +1 -1
  127. package/dist/tui.cjs +19 -19
  128. package/dist/tui.js +2 -2
  129. package/dist/utils/debug-log.d.ts +12 -0
  130. package/dist/utils/debug-log.d.ts.map +1 -0
  131. package/dist/utils/plans.d.ts +7 -0
  132. package/dist/utils/plans.d.ts.map +1 -0
  133. package/dist/utils/update-check.d.ts +40 -0
  134. package/dist/utils/update-check.d.ts.map +1 -0
  135. package/package.json +8 -8
  136. package/dist/chunk-C4X3C2DL.cjs.map +0 -1
  137. package/dist/chunk-K4WJUBEC.cjs.map +0 -1
  138. package/dist/chunk-M5LKPQB4.js.map +0 -1
  139. package/dist/chunk-MT3YCFCC.cjs.map +0 -1
  140. package/dist/chunk-REVOTI2T.js.map +0 -1
  141. package/dist/chunk-U5A7TFNT.js.map +0 -1
  142. package/dist/chunk-X3BGE7CL.js.map +0 -1
  143. package/dist/chunk-Z4QRXVST.cjs.map +0 -1
  144. package/dist/docs/SKILL.md +0 -30
  145. package/dist/docs/assets/SOURCE_MAP.json +0 -11
  146. package/dist/docs/references/docs-mastra-code-configuration.md +0 -299
  147. package/dist/docs/references/docs-mastra-code-customization.md +0 -228
  148. package/dist/docs/references/docs-mastra-code-modes.md +0 -104
  149. package/dist/docs/references/docs-mastra-code-overview.md +0 -135
  150. package/dist/docs/references/docs-mastra-code-tools.md +0 -229
  151. package/dist/docs/references/reference-mastra-code-createMastraCode.md +0 -108
  152. package/dist/permissions-2HIUSRQN.cjs +0 -40
  153. package/dist/permissions-CVXKYIWR.js +0 -3
  154. package/dist/tui/commands/models.d.ts +0 -3
  155. package/dist/tui/commands/models.d.ts.map +0 -1
package/dist/cli.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunkZ4QRXVST_cjs = require('./chunk-Z4QRXVST.cjs');
5
- var chunkC4X3C2DL_cjs = require('./chunk-C4X3C2DL.cjs');
6
- var chunkK4WJUBEC_cjs = require('./chunk-K4WJUBEC.cjs');
4
+ var chunkMBPGUMYQ_cjs = require('./chunk-MBPGUMYQ.cjs');
5
+ var chunkXVYUS2EA_cjs = require('./chunk-XVYUS2EA.cjs');
6
+ var chunkAJEYT7X3_cjs = require('./chunk-AJEYT7X3.cjs');
7
7
  var chunkS5ZLN7DR_cjs = require('./chunk-S5ZLN7DR.cjs');
8
8
  var fs = require('fs');
9
9
  var path = require('path');
@@ -29,18 +29,80 @@ function _interopNamespace(e) {
29
29
  var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
30
30
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
31
31
 
32
+ // src/error-classification.ts
33
+ function isStreamDestroyedError(err, depth = 0) {
34
+ if (!err || depth > 5) return false;
35
+ const e = err;
36
+ if (e.code === "ERR_STREAM_DESTROYED") return true;
37
+ if (typeof e.message === "string" && e.message.includes("stream was destroyed")) return true;
38
+ if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;
39
+ if (Array.isArray(e.errors) && e.errors.some((inner) => isStreamDestroyedError(inner, depth + 1)))
40
+ return true;
41
+ return false;
42
+ }
43
+ var MAX_LOG_SIZE = 5 * 1024 * 1024;
44
+ var KEEP_SIZE = 4 * 1024 * 1024;
45
+ function truncateLogFile(logFile) {
46
+ try {
47
+ const stat = fs__namespace.statSync(logFile);
48
+ if (stat.size > MAX_LOG_SIZE) {
49
+ const buf = Buffer.alloc(KEEP_SIZE);
50
+ const fd = fs__namespace.openSync(logFile, "r");
51
+ fs__namespace.readSync(fd, buf, 0, KEEP_SIZE, stat.size - KEEP_SIZE);
52
+ fs__namespace.closeSync(fd);
53
+ const firstNewline = buf.indexOf(10);
54
+ const trimmed = firstNewline >= 0 ? buf.subarray(firstNewline + 1) : buf;
55
+ fs__namespace.writeFileSync(logFile, trimmed);
56
+ }
57
+ } catch {
58
+ }
59
+ }
60
+ function setupDebugLogging() {
61
+ const debugEnabled = ["true", "1"].includes(process.env.MASTRA_DEBUG ?? "");
62
+ if (debugEnabled) {
63
+ const logFile = path__namespace.join(chunkS5ZLN7DR_cjs.getAppDataDir(), "debug.log");
64
+ truncateLogFile(logFile);
65
+ const logStream = fs__namespace.createWriteStream(logFile, { flags: "a" });
66
+ const fmt = (a) => {
67
+ if (typeof a === "string") return a;
68
+ if (a instanceof Error) return a.stack ?? `${a.name}: ${a.message}`;
69
+ try {
70
+ return JSON.stringify(a);
71
+ } catch {
72
+ return String(a);
73
+ }
74
+ };
75
+ console.error = (...args) => {
76
+ logStream.write(`[ERROR] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
77
+ `);
78
+ };
79
+ console.warn = (...args) => {
80
+ logStream.write(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
81
+ `);
82
+ };
83
+ } else {
84
+ const noop = () => {
85
+ };
86
+ console.error = noop;
87
+ console.warn = noop;
88
+ }
89
+ }
90
+
91
+ // src/main.ts
32
92
  var harness;
33
93
  var mcpManager;
34
94
  var hookManager;
35
95
  var authStorage;
36
96
  process.on("uncaughtException", (error) => {
97
+ if (isStreamDestroyedError(error)) return;
37
98
  handleFatalError(error);
38
99
  });
39
100
  process.on("unhandledRejection", (reason) => {
101
+ if (isStreamDestroyedError(reason)) return;
40
102
  handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
41
103
  });
42
104
  async function main() {
43
- const result = await chunkZ4QRXVST_cjs.createMastraCode();
105
+ const result = await chunkMBPGUMYQ_cjs.createMastraCode();
44
106
  harness = result.harness;
45
107
  mcpManager = result.mcpManager;
46
108
  hookManager = result.hookManager;
@@ -58,43 +120,29 @@ async function main() {
58
120
  for (const s of failed) {
59
121
  console.info(`MCP: Failed to connect to "${s.name}": ${s.error}`);
60
122
  }
61
- }
62
- const logFile = path__namespace.join(chunkS5ZLN7DR_cjs.getAppDataDir(), "debug.log");
63
- const logStream = fs__namespace.createWriteStream(logFile, { flags: "a" });
64
- const fmt = (a) => {
65
- if (typeof a === "string") return a;
66
- if (a instanceof Error) return `${a.name}: ${a.message}`;
67
- try {
68
- return JSON.stringify(a);
69
- } catch {
70
- return String(a);
123
+ const skipped = mcpManager.getSkippedServers();
124
+ for (const s of skipped) {
125
+ console.info(`MCP: Skipped "${s.name}": ${s.reason}`);
71
126
  }
72
- };
73
- console.error = (...args) => {
74
- logStream.write(`[ERROR] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
75
- `);
76
- };
77
- console.warn = (...args) => {
78
- logStream.write(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
79
- `);
80
- };
127
+ }
128
+ setupDebugLogging();
81
129
  const envTheme = process.env.MASTRA_THEME?.toLowerCase();
82
130
  let themeMode;
83
131
  if (envTheme === "dark" || envTheme === "light") {
84
132
  themeMode = envTheme;
85
133
  } else {
86
- const settings = chunkK4WJUBEC_cjs.loadSettings();
134
+ const settings = chunkAJEYT7X3_cjs.loadSettings();
87
135
  const themePref = settings.preferences.theme;
88
- themeMode = themePref === "dark" || themePref === "light" ? themePref : await chunkC4X3C2DL_cjs.detectTerminalTheme();
136
+ themeMode = themePref === "dark" || themePref === "light" ? themePref : await chunkXVYUS2EA_cjs.detectTerminalTheme();
89
137
  }
90
- chunkK4WJUBEC_cjs.applyThemeMode(themeMode);
91
- const tui = new chunkC4X3C2DL_cjs.MastraTUI({
138
+ chunkAJEYT7X3_cjs.applyThemeMode(themeMode);
139
+ const tui = new chunkXVYUS2EA_cjs.MastraTUI({
92
140
  harness,
93
141
  hookManager,
94
142
  authStorage,
95
143
  mcpManager,
96
144
  appName: "Mastra Code",
97
- version: "0.1.0",
145
+ version: chunkXVYUS2EA_cjs.getCurrentVersion(),
98
146
  inlineQuestions: true
99
147
  });
100
148
  tui.run().catch((error) => {
@@ -102,14 +150,14 @@ async function main() {
102
150
  });
103
151
  }
104
152
  var asyncCleanup = async () => {
105
- chunkK4WJUBEC_cjs.releaseAllThreadLocks();
153
+ chunkAJEYT7X3_cjs.releaseAllThreadLocks();
106
154
  await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);
107
155
  };
108
156
  process.on("beforeExit", () => {
109
157
  void asyncCleanup();
110
158
  });
111
159
  process.on("exit", () => {
112
- chunkK4WJUBEC_cjs.releaseAllThreadLocks();
160
+ chunkAJEYT7X3_cjs.releaseAllThreadLocks();
113
161
  });
114
162
  process.on("SIGINT", () => {
115
163
  void asyncCleanup().finally(() => process.exit(0));
@@ -128,7 +176,7 @@ function hasEconnrefused(err, depth = 0) {
128
176
  function handleFatalError(error) {
129
177
  const write = (msg) => process.stderr.write(msg + "\n");
130
178
  if (hasEconnrefused(error)) {
131
- const settings = chunkK4WJUBEC_cjs.loadSettings();
179
+ const settings = chunkAJEYT7X3_cjs.loadSettings();
132
180
  const connStr = settings.storage?.pg?.connectionString;
133
181
  const target = connStr ?? "localhost:5432";
134
182
  write(
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts"],"names":["createMastraCode","path","getAppDataDir","fs","loadSettings","detectTerminalTheme","applyThemeMode","MastraTUI","releaseAllThreadLocks"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode } from './tui/theme.js';\nimport { getAppDataDir } from './utils/project.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.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'];\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function main() {\n const result = await createMastraCode();\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n\n if (mcpManager?.hasServers()) {\n await mcpManager.init();\n const statuses = mcpManager.getServerStatuses();\n const connected = statuses.filter(s => s.connected);\n const failed = statuses.filter(s => !s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);\n for (const s of failed) {\n console.info(`MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n }\n\n const logFile = path.join(getAppDataDir(), 'debug.log');\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.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\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 if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n themeMode = themePref === 'dark' || themePref === 'light' ? themePref : await detectTerminalTheme();\n }\n applyThemeMode(themeMode);\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: '0.1.0',\n inlineQuestions: true,\n });\n\n tui.run().catch(error => {\n handleFatalError(error);\n });\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\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 write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
1
+ {"version":3,"sources":["../src/error-classification.ts","../src/utils/debug-log.ts","../src/main.ts"],"names":["fs","path","getAppDataDir","createMastraCode","loadSettings","detectTerminalTheme","applyThemeMode","MastraTUI","getCurrentVersion","releaseAllThreadLocks"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\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","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport { isStreamDestroyedError } from './error-classification.js';\nimport { loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode } from './tui/theme.js';\nimport { setupDebugLogging } from './utils/debug-log.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'];\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 main() {\n const result = await createMastraCode();\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n\n if (mcpManager?.hasServers()) {\n await mcpManager.init();\n const statuses = mcpManager.getServerStatuses();\n const connected = statuses.filter(s => s.connected);\n const failed = statuses.filter(s => !s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);\n for (const s of failed) {\n console.info(`MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n const skipped = mcpManager.getSkippedServers();\n for (const s of skipped) {\n console.info(`MCP: Skipped \"${s.name}\": ${s.reason}`);\n }\n }\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 if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n themeMode = themePref === 'dark' || themePref === 'light' ? themePref : await detectTerminalTheme();\n }\n applyThemeMode(themeMode);\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n });\n\n tui.run().catch(error => {\n handleFatalError(error);\n });\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\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 write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
package/dist/cli.js CHANGED
@@ -1,19 +1,81 @@
1
1
  #!/usr/bin/env node
2
- import { createMastraCode } from './chunk-M5LKPQB4.js';
3
- import { detectTerminalTheme, MastraTUI } from './chunk-X3BGE7CL.js';
4
- import { releaseAllThreadLocks, loadSettings, applyThemeMode } from './chunk-REVOTI2T.js';
2
+ import { createMastraCode } from './chunk-WKPHD54B.js';
3
+ import { detectTerminalTheme, MastraTUI, getCurrentVersion } from './chunk-YQNZ7DHQ.js';
4
+ import { releaseAllThreadLocks, loadSettings, applyThemeMode } from './chunk-JI4M5525.js';
5
5
  import { getAppDataDir } from './chunk-SM3QCOA7.js';
6
6
  import * as fs from 'fs';
7
7
  import * as path from 'path';
8
8
 
9
+ // src/error-classification.ts
10
+ function isStreamDestroyedError(err, depth = 0) {
11
+ if (!err || depth > 5) return false;
12
+ const e = err;
13
+ if (e.code === "ERR_STREAM_DESTROYED") return true;
14
+ if (typeof e.message === "string" && e.message.includes("stream was destroyed")) return true;
15
+ if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;
16
+ if (Array.isArray(e.errors) && e.errors.some((inner) => isStreamDestroyedError(inner, depth + 1)))
17
+ return true;
18
+ return false;
19
+ }
20
+ var MAX_LOG_SIZE = 5 * 1024 * 1024;
21
+ var KEEP_SIZE = 4 * 1024 * 1024;
22
+ function truncateLogFile(logFile) {
23
+ try {
24
+ const stat = fs.statSync(logFile);
25
+ if (stat.size > MAX_LOG_SIZE) {
26
+ const buf = Buffer.alloc(KEEP_SIZE);
27
+ const fd = fs.openSync(logFile, "r");
28
+ fs.readSync(fd, buf, 0, KEEP_SIZE, stat.size - KEEP_SIZE);
29
+ fs.closeSync(fd);
30
+ const firstNewline = buf.indexOf(10);
31
+ const trimmed = firstNewline >= 0 ? buf.subarray(firstNewline + 1) : buf;
32
+ fs.writeFileSync(logFile, trimmed);
33
+ }
34
+ } catch {
35
+ }
36
+ }
37
+ function setupDebugLogging() {
38
+ const debugEnabled = ["true", "1"].includes(process.env.MASTRA_DEBUG ?? "");
39
+ if (debugEnabled) {
40
+ const logFile = path.join(getAppDataDir(), "debug.log");
41
+ truncateLogFile(logFile);
42
+ const logStream = fs.createWriteStream(logFile, { flags: "a" });
43
+ const fmt = (a) => {
44
+ if (typeof a === "string") return a;
45
+ if (a instanceof Error) return a.stack ?? `${a.name}: ${a.message}`;
46
+ try {
47
+ return JSON.stringify(a);
48
+ } catch {
49
+ return String(a);
50
+ }
51
+ };
52
+ console.error = (...args) => {
53
+ logStream.write(`[ERROR] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
54
+ `);
55
+ };
56
+ console.warn = (...args) => {
57
+ logStream.write(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
58
+ `);
59
+ };
60
+ } else {
61
+ const noop = () => {
62
+ };
63
+ console.error = noop;
64
+ console.warn = noop;
65
+ }
66
+ }
67
+
68
+ // src/main.ts
9
69
  var harness;
10
70
  var mcpManager;
11
71
  var hookManager;
12
72
  var authStorage;
13
73
  process.on("uncaughtException", (error) => {
74
+ if (isStreamDestroyedError(error)) return;
14
75
  handleFatalError(error);
15
76
  });
16
77
  process.on("unhandledRejection", (reason) => {
78
+ if (isStreamDestroyedError(reason)) return;
17
79
  handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
18
80
  });
19
81
  async function main() {
@@ -35,26 +97,12 @@ async function main() {
35
97
  for (const s of failed) {
36
98
  console.info(`MCP: Failed to connect to "${s.name}": ${s.error}`);
37
99
  }
38
- }
39
- const logFile = path.join(getAppDataDir(), "debug.log");
40
- const logStream = fs.createWriteStream(logFile, { flags: "a" });
41
- const fmt = (a) => {
42
- if (typeof a === "string") return a;
43
- if (a instanceof Error) return `${a.name}: ${a.message}`;
44
- try {
45
- return JSON.stringify(a);
46
- } catch {
47
- return String(a);
100
+ const skipped = mcpManager.getSkippedServers();
101
+ for (const s of skipped) {
102
+ console.info(`MCP: Skipped "${s.name}": ${s.reason}`);
48
103
  }
49
- };
50
- console.error = (...args) => {
51
- logStream.write(`[ERROR] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
52
- `);
53
- };
54
- console.warn = (...args) => {
55
- logStream.write(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${args.map(fmt).join(" ")}
56
- `);
57
- };
104
+ }
105
+ setupDebugLogging();
58
106
  const envTheme = process.env.MASTRA_THEME?.toLowerCase();
59
107
  let themeMode;
60
108
  if (envTheme === "dark" || envTheme === "light") {
@@ -71,7 +119,7 @@ async function main() {
71
119
  authStorage,
72
120
  mcpManager,
73
121
  appName: "Mastra Code",
74
- version: "0.1.0",
122
+ version: getCurrentVersion(),
75
123
  inlineQuestions: true
76
124
  });
77
125
  tui.run().catch((error) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode } from './tui/theme.js';\nimport { getAppDataDir } from './utils/project.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.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'];\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function main() {\n const result = await createMastraCode();\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n\n if (mcpManager?.hasServers()) {\n await mcpManager.init();\n const statuses = mcpManager.getServerStatuses();\n const connected = statuses.filter(s => s.connected);\n const failed = statuses.filter(s => !s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);\n for (const s of failed) {\n console.info(`MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n }\n\n const logFile = path.join(getAppDataDir(), 'debug.log');\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.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\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 if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n themeMode = themePref === 'dark' || themePref === 'light' ? themePref : await detectTerminalTheme();\n }\n applyThemeMode(themeMode);\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: '0.1.0',\n inlineQuestions: true,\n });\n\n tui.run().catch(error => {\n handleFatalError(error);\n });\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\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 write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
1
+ {"version":3,"sources":["../src/error-classification.ts","../src/utils/debug-log.ts","../src/main.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["/**\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","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport { isStreamDestroyedError } from './error-classification.js';\nimport { loadSettings } from './onboarding/settings.js';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode } from './tui/theme.js';\nimport { setupDebugLogging } from './utils/debug-log.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'];\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 main() {\n const result = await createMastraCode();\n harness = result.harness;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n\n if (mcpManager?.hasServers()) {\n await mcpManager.init();\n const statuses = mcpManager.getServerStatuses();\n const connected = statuses.filter(s => s.connected);\n const failed = statuses.filter(s => !s.connected);\n const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);\n console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);\n for (const s of failed) {\n console.info(`MCP: Failed to connect to \"${s.name}\": ${s.error}`);\n }\n const skipped = mcpManager.getSkippedServers();\n for (const s of skipped) {\n console.info(`MCP: Skipped \"${s.name}\": ${s.reason}`);\n }\n }\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 if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n themeMode = themePref === 'dark' || themePref === 'light' ? themePref : await detectTerminalTheme();\n }\n applyThemeMode(themeMode);\n\n const tui = new MastraTUI({\n harness,\n hookManager,\n authStorage,\n mcpManager,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n });\n\n tui.run().catch(error => {\n handleFatalError(error);\n });\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\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 write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
@@ -8,6 +8,11 @@ export interface ClipboardImage {
8
8
  data: string;
9
9
  mimeType: string;
10
10
  }
11
+ /**
12
+ * Read plain text from the system clipboard.
13
+ * Returns null if clipboard is empty or reading fails.
14
+ */
15
+ export declare function getClipboardText(): string | null;
11
16
  /**
12
17
  * Check the system clipboard for image data and return it as base64.
13
18
  * Returns null if no image data is found or extraction fails.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clipboard/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAYzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clipboard/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAgChD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAYzD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Checks whether an error is an ERR_STREAM_DESTROYED error, which is a
3
+ * non-fatal condition that occurs when code writes to a stream after it
4
+ * has been closed (e.g., client disconnect, cancelled LLM stream, LSP
5
+ * shutdown, killed subprocess).
6
+ *
7
+ * Walks the `.cause` chain up to a depth limit.
8
+ */
9
+ export declare function isStreamDestroyedError(err: unknown, depth?: number): boolean;
10
+ //# sourceMappingURL=error-classification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-classification.d.ts","sourceRoot":"","sources":["../src/error-classification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CASvE"}
package/dist/index.cjs CHANGED
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ4QRXVST_cjs = require('./chunk-Z4QRXVST.cjs');
3
+ var chunkMBPGUMYQ_cjs = require('./chunk-MBPGUMYQ.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "createMastraCode", {
8
8
  enumerable: true,
9
- get: function () { return chunkZ4QRXVST_cjs.createMastraCode; }
9
+ get: function () { return chunkMBPGUMYQ_cjs.createMastraCode; }
10
10
  });
11
11
  //# sourceMappingURL=index.cjs.map
12
12
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { Harness } from '@mastra/core/harness';
2
- import type { HeartbeatHandler, HarnessMode, HarnessSubagent } from '@mastra/core/harness';
2
+ import type { HeartbeatHandler, HarnessConfig, HarnessMode, HarnessSubagent } from '@mastra/core/harness';
3
+ import type { RequestContext } from '@mastra/core/request-context';
4
+ import { resolveModel } from './agents/model.js';
3
5
  import { AuthStorage } from './auth/storage.js';
4
6
  import { HookManager } from './hooks/index.js';
5
7
  import type { StorageConfig } from './utils/project.js';
@@ -10,14 +12,18 @@ export interface MastraCodeConfig {
10
12
  modes?: HarnessMode[];
11
13
  /** Override or extend subagent definitions. Default: explore/plan/execute */
12
14
  subagents?: HarnessSubagent[];
13
- /** Extra tools merged into the dynamic tool set */
14
- extraTools?: Record<string, any>;
15
+ /** Extra tools merged into the dynamic tool set. Can be a static record or a function that receives requestContext. */
16
+ extraTools?: Record<string, any> | ((ctx: {
17
+ requestContext: RequestContext;
18
+ }) => Record<string, any>);
15
19
  /** Custom storage config instead of auto-detected default */
16
20
  storage?: StorageConfig;
17
21
  /** Initial state overrides (yolo, thinkingLevel, etc.) */
18
22
  initialState?: Record<string, unknown>;
19
23
  /** Override heartbeat handlers. Default: gateway-sync */
20
24
  heartbeatHandlers?: HeartbeatHandler[];
25
+ /** Override the workspace. Default: local filesystem + local sandbox based on detected project */
26
+ workspace?: HarnessConfig['workspace'];
21
27
  /** Disable MCP server discovery. Default: false */
22
28
  disableMcp?: boolean;
23
29
  /** Disable hooks. Default: false */
@@ -28,6 +34,7 @@ export declare function createMastraCode(config?: MastraCodeConfig): Promise<{
28
34
  mcpManager: import("./mcp/manager.js").McpManager | undefined;
29
35
  hookManager: HookManager | undefined;
30
36
  authStorage: AuthStorage;
37
+ resolveModel: typeof resolveModel;
31
38
  storageWarning: string | undefined;
32
39
  }>;
33
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAgC,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAY3F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqB/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB;;;;;;GAqO/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAgC,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAEV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOlE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA4B/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,uHAAuH;IACvH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;QAAE,cAAc,EAAE,cAAc,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACtG,6DAA6D;IAC7D,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,kGAAkG;IAClG,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACvC,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB;;;;;;;GA+Q/D"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createMastraCode } from './chunk-M5LKPQB4.js';
1
+ export { createMastraCode } from './chunk-WKPHD54B.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -12,4 +12,12 @@ export declare function loadMcpConfig(projectDir: string): McpConfig;
12
12
  export declare function getProjectMcpPath(projectDir: string): string;
13
13
  export declare function getGlobalMcpPath(): string;
14
14
  export declare function getClaudeSettingsPath(projectDir: string): string;
15
+ /**
16
+ * Classify a raw server entry as stdio, http, or skip (with reason).
17
+ */
18
+ export declare function classifyServerEntry(raw: unknown): {
19
+ kind: 'stdio' | 'http' | 'skip';
20
+ reason?: string;
21
+ };
22
+ export declare function validateConfig(raw: unknown): McpConfig;
15
23
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAE7D,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAM3D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAqC,MAAM,YAAY,CAAC;AAE/E,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAM3D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AA4BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA2BtG;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAwCtD"}
@@ -1,5 +1,5 @@
1
1
  export { createMcpManager } from './manager.js';
2
2
  export type { McpManager } from './manager.js';
3
3
  export { loadMcpConfig, getProjectMcpPath, getGlobalMcpPath, getClaudeSettingsPath } from './config.js';
4
- export type { McpConfig, McpServerConfig, McpServerStatus } from './types.js';
4
+ export type { McpConfig, McpServerConfig, McpStdioServerConfig, McpHttpServerConfig, McpSkippedServer, McpServerStatus, } from './types.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,YAAY,EACV,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * MCP manager — orchestrates MCP server connections using MCPClient directly.
3
3
  * Created once at startup, provides tools from connected MCP servers.
4
4
  */
5
- import type { McpConfig, McpServerStatus } from './types.js';
5
+ import type { McpConfig, McpServerStatus, McpSkippedServer } from './types.js';
6
6
  /** Public interface for the MCP manager returned by createMcpManager(). */
7
7
  export interface McpManager {
8
8
  /** Connect to all configured MCP servers and collect their tools. */
@@ -13,10 +13,12 @@ export interface McpManager {
13
13
  disconnect(): Promise<void>;
14
14
  /** Get all tools from connected MCP servers (namespaced as serverName_toolName). */
15
15
  getTools(): Record<string, any>;
16
- /** Check if any MCP servers are configured. */
16
+ /** Check if any MCP servers are configured (or skipped). */
17
17
  hasServers(): boolean;
18
18
  /** Get status of all servers. */
19
19
  getServerStatuses(): McpServerStatus[];
20
+ /** Get servers that were skipped during config loading. */
21
+ getSkippedServers(): McpSkippedServer[];
20
22
  /** Get config file paths for display. */
21
23
  getConfigPaths(): {
22
24
  project: string;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,kEAAkE;IAClE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,oDAAoD;IACpD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,+CAA+C;IAC/C,UAAU,IAAI,OAAO,CAAC;IACtB,iCAAiC;IACjC,iBAAiB,IAAI,eAAe,EAAE,CAAC;IACvC,yCAAyC;IACzC,cAAc,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,6BAA6B;IAC7B,SAAS,IAAI,SAAS,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAmH/D"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAwC,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAErH,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,kEAAkE;IAClE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,oDAAoD;IACpD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,4DAA4D;IAC5D,UAAU,IAAI,OAAO,CAAC;IACtB,iCAAiC;IACjC,iBAAiB,IAAI,eAAe,EAAE,CAAC;IACvC,2DAA2D;IAC3D,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;IACxC,yCAAyC;IACzC,cAAc,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,6BAA6B;IAC7B,SAAS,IAAI,SAAS,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAiI/D"}