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.
- package/CHANGELOG.md +328 -0
- package/LICENSE.md +15 -0
- package/README.md +68 -29
- package/dist/agents/memory.d.ts.map +1 -1
- package/dist/agents/model.d.ts +17 -6
- package/dist/agents/model.d.ts.map +1 -1
- package/dist/agents/prompts/index.d.ts.map +1 -1
- package/dist/agents/prompts/tool-guidance.d.ts +2 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
- package/dist/agents/subagents/audit-tests.d.ts +0 -7
- package/dist/agents/subagents/audit-tests.d.ts.map +1 -1
- package/dist/agents/subagents/execute.d.ts +0 -7
- package/dist/agents/subagents/execute.d.ts.map +1 -1
- package/dist/agents/subagents/explore.d.ts +0 -7
- package/dist/agents/subagents/explore.d.ts.map +1 -1
- package/dist/agents/subagents/index.d.ts.map +1 -1
- package/dist/agents/subagents/plan.d.ts +0 -7
- package/dist/agents/subagents/plan.d.ts.map +1 -1
- package/dist/agents/tools.d.ts +3 -1
- package/dist/agents/tools.d.ts.map +1 -1
- package/dist/agents/workspace.d.ts +4 -1
- package/dist/agents/workspace.d.ts.map +1 -1
- package/dist/{chunk-K4WJUBEC.cjs → chunk-AJEYT7X3.cjs} +763 -429
- package/dist/chunk-AJEYT7X3.cjs.map +1 -0
- package/dist/{chunk-U5A7TFNT.js → chunk-CC2724NI.js} +46 -10
- package/dist/chunk-CC2724NI.js.map +1 -0
- package/dist/{chunk-REVOTI2T.js → chunk-JI4M5525.js} +740 -412
- package/dist/chunk-JI4M5525.js.map +1 -0
- package/dist/{chunk-Z4QRXVST.cjs → chunk-MBPGUMYQ.cjs} +325 -251
- package/dist/chunk-MBPGUMYQ.cjs.map +1 -0
- package/dist/{chunk-MT3YCFCC.cjs → chunk-OEDRHUU5.cjs} +47 -9
- package/dist/chunk-OEDRHUU5.cjs.map +1 -0
- package/dist/{chunk-M5LKPQB4.js → chunk-WKPHD54B.js} +283 -209
- package/dist/chunk-WKPHD54B.js.map +1 -0
- package/dist/{chunk-C4X3C2DL.cjs → chunk-XVYUS2EA.cjs} +2213 -1035
- package/dist/chunk-XVYUS2EA.cjs.map +1 -0
- package/dist/{chunk-X3BGE7CL.js → chunk-YQNZ7DHQ.js} +1788 -613
- package/dist/chunk-YQNZ7DHQ.js.map +1 -0
- package/dist/cli.cjs +79 -31
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +71 -23
- package/dist/cli.js.map +1 -1
- package/dist/clipboard/index.d.ts +5 -0
- package/dist/clipboard/index.d.ts.map +1 -1
- package/dist/error-classification.d.ts +10 -0
- package/dist/error-classification.d.ts.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/config.d.ts +8 -0
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/manager.d.ts +4 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/types.d.ts +30 -3
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/onboarding/onboarding-inline.d.ts +2 -0
- package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
- package/dist/onboarding/packs.d.ts +1 -0
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/settings.d.ts +37 -2
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/permissions-S3LGXIDB.js +3 -0
- package/dist/{permissions-CVXKYIWR.js.map → permissions-S3LGXIDB.js.map} +1 -1
- package/dist/permissions-VGABAVGD.cjs +40 -0
- package/dist/{permissions-2HIUSRQN.cjs.map → permissions-VGABAVGD.cjs.map} +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/providers/claude-max.d.ts +13 -0
- package/dist/providers/claude-max.d.ts.map +1 -1
- package/dist/providers/openai-codex.d.ts +1 -0
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/tool-names.d.ts +68 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tools/ast-smart-edit.d.ts +77 -5
- package/dist/tools/ast-smart-edit.d.ts.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/string-replace-lsp.d.ts +15 -0
- package/dist/tools/string-replace-lsp.d.ts.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/utils.d.ts +4 -2
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tui/command-dispatch.d.ts.map +1 -1
- package/dist/tui/commands/clone.d.ts +29 -0
- package/dist/tui/commands/clone.d.ts.map +1 -0
- package/dist/tui/commands/custom-providers.d.ts +8 -0
- package/dist/tui/commands/custom-providers.d.ts.map +1 -0
- package/dist/tui/commands/index.d.ts +3 -1
- package/dist/tui/commands/index.d.ts.map +1 -1
- package/dist/tui/commands/mcp.d.ts.map +1 -1
- package/dist/tui/commands/models-pack.d.ts +4 -0
- package/dist/tui/commands/models-pack.d.ts.map +1 -1
- package/dist/tui/commands/om.d.ts.map +1 -1
- package/dist/tui/commands/report-issue.d.ts +3 -0
- package/dist/tui/commands/report-issue.d.ts.map +1 -0
- package/dist/tui/commands/resource.d.ts.map +1 -1
- package/dist/tui/commands/settings.d.ts.map +1 -1
- package/dist/tui/commands/threads.d.ts +1 -0
- package/dist/tui/commands/threads.d.ts.map +1 -1
- package/dist/tui/components/ask-question-inline.d.ts +3 -0
- package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
- package/dist/tui/components/custom-editor.d.ts +1 -1
- package/dist/tui/components/custom-editor.d.ts.map +1 -1
- package/dist/tui/components/help-overlay.d.ts.map +1 -1
- package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
- package/dist/tui/components/settings.d.ts +2 -0
- package/dist/tui/components/settings.d.ts.map +1 -1
- package/dist/tui/components/subagent-execution.d.ts +6 -1
- package/dist/tui/components/subagent-execution.d.ts.map +1 -1
- package/dist/tui/components/thread-selector.d.ts +6 -0
- package/dist/tui/components/thread-selector.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-enhanced.d.ts +1 -0
- package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
- package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
- package/dist/tui/handlers/message.d.ts.map +1 -1
- package/dist/tui/handlers/prompts.d.ts +6 -0
- package/dist/tui/handlers/prompts.d.ts.map +1 -1
- package/dist/tui/handlers/subagent.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts +14 -5
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/setup.d.ts.map +1 -1
- package/dist/tui/state.d.ts +4 -5
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui.cjs +19 -19
- package/dist/tui.js +2 -2
- package/dist/utils/debug-log.d.ts +12 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/plans.d.ts +7 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/update-check.d.ts +40 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/chunk-C4X3C2DL.cjs.map +0 -1
- package/dist/chunk-K4WJUBEC.cjs.map +0 -1
- package/dist/chunk-M5LKPQB4.js.map +0 -1
- package/dist/chunk-MT3YCFCC.cjs.map +0 -1
- package/dist/chunk-REVOTI2T.js.map +0 -1
- package/dist/chunk-U5A7TFNT.js.map +0 -1
- package/dist/chunk-X3BGE7CL.js.map +0 -1
- package/dist/chunk-Z4QRXVST.cjs.map +0 -1
- package/dist/docs/SKILL.md +0 -30
- package/dist/docs/assets/SOURCE_MAP.json +0 -11
- package/dist/docs/references/docs-mastra-code-configuration.md +0 -299
- package/dist/docs/references/docs-mastra-code-customization.md +0 -228
- package/dist/docs/references/docs-mastra-code-modes.md +0 -104
- package/dist/docs/references/docs-mastra-code-overview.md +0 -135
- package/dist/docs/references/docs-mastra-code-tools.md +0 -229
- package/dist/docs/references/reference-mastra-code-createMastraCode.md +0 -108
- package/dist/permissions-2HIUSRQN.cjs +0 -40
- package/dist/permissions-CVXKYIWR.js +0 -3
- package/dist/tui/commands/models.d.ts +0 -3
- 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
|
|
5
|
-
var
|
|
6
|
-
var
|
|
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
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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 =
|
|
134
|
+
const settings = chunkAJEYT7X3_cjs.loadSettings();
|
|
87
135
|
const themePref = settings.preferences.theme;
|
|
88
|
-
themeMode = themePref === "dark" || themePref === "light" ? themePref : await
|
|
136
|
+
themeMode = themePref === "dark" || themePref === "light" ? themePref : await chunkXVYUS2EA_cjs.detectTerminalTheme();
|
|
89
137
|
}
|
|
90
|
-
|
|
91
|
-
const tui = new
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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-
|
|
3
|
-
import { detectTerminalTheme, MastraTUI } from './chunk-
|
|
4
|
-
import { releaseAllThreadLocks, loadSettings, applyThemeMode } from './chunk-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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
package/dist/mcp/config.d.ts
CHANGED
|
@@ -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
|
package/dist/mcp/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,
|
|
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"}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -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
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/mcp/manager.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|