mastracode 0.32.3-alpha.1 → 0.32.3-alpha.2
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 +16 -0
- package/dist/acp.cjs +6 -11
- package/dist/acp.js +2 -3
- package/dist/cli.cjs +200 -240
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +200 -234
- package/dist/cli.js.map +1 -1
- package/dist/headless.cjs +6 -11
- package/dist/headless.js +2 -3
- package/dist/index.cjs +6 -11
- package/dist/index.js +2 -3
- package/dist/plugin.cjs +6 -11
- package/dist/plugin.js +2 -3
- package/dist/tui/commands/login.d.ts.map +1 -1
- package/dist/tui/display.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/om-defaults.d.ts +8 -0
- package/dist/tui/om-defaults.d.ts.map +1 -0
- package/dist/tui/onboarding-inline.d.ts +4 -1
- package/dist/tui/onboarding-inline.d.ts.map +1 -1
- package/dist/tui-DQUNQTkz.js +21591 -0
- package/dist/tui-DQUNQTkz.js.map +1 -0
- package/dist/tui-G-b6reo7.cjs +21737 -0
- package/dist/tui-G-b6reo7.cjs.map +1 -0
- package/dist/tui.cjs +20 -76
- package/dist/tui.js +2 -3
- package/package.json +9 -9
- package/dist/acp.cjs.map +0 -1
- package/dist/acp.js.map +0 -1
- package/dist/chunk-LDCL2KGF.cjs +0 -21856
- package/dist/chunk-LDCL2KGF.cjs.map +0 -1
- package/dist/chunk-N3CNDPYJ.js +0 -21807
- package/dist/chunk-N3CNDPYJ.js.map +0 -1
- package/dist/headless.cjs.map +0 -1
- package/dist/headless.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/plugin.cjs.map +0 -1
- package/dist/plugin.js.map +0 -1
- package/dist/tui.cjs.map +0 -1
- package/dist/tui.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# mastracode
|
|
2
2
|
|
|
3
|
+
## 0.32.3-alpha.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed observational memory staying on the Gemini default after you sign in to Anthropic or OpenAI. First-run setup and `/login` now select the small, cheap OM model of the provider you just connected, and the TUI tells you when it does. An OM model you picked yourself is never replaced. ([#20291](https://github.com/mastra-ai/mastra/pull/20291))
|
|
8
|
+
|
|
9
|
+
Providers with no cheap OM model (GitHub Copilot, xAI) no longer pin observation and reflection to their full-size coding model — OM stays open so a later login can set it.
|
|
10
|
+
|
|
11
|
+
When an OM run fails, the hint names the model OM is using and keeps the advice for the actual failure, so an authentication error still points at `/login` and a rate limit still tells you to wait, alongside `/memory` to switch OM models.
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`a211d09`](https://github.com/mastra-ai/mastra/commit/a211d09185dc65a746534914cf38b67f21ee9bac), [`f014c26`](https://github.com/mastra-ai/mastra/commit/f014c26f3445118b684e286ee5819b46dfa943a0), [`05db566`](https://github.com/mastra-ai/mastra/commit/05db566fcbdcbf33d0bffca0c72ec30129e2e3ca), [`05db566`](https://github.com/mastra-ai/mastra/commit/05db566fcbdcbf33d0bffca0c72ec30129e2e3ca), [`8dadb6a`](https://github.com/mastra-ai/mastra/commit/8dadb6abfe449b7f8b129663671cc614f2cceeef), [`e075db9`](https://github.com/mastra-ai/mastra/commit/e075db9715c836bae5dfc37c50248492af397c3b), [`8124754`](https://github.com/mastra-ai/mastra/commit/8124754ae89fbc69f8136d1df4a91904d0f84c4e)]:
|
|
14
|
+
- @mastra/core@1.54.0-alpha.2
|
|
15
|
+
- @mastra/code-sdk@1.1.0-alpha.2
|
|
16
|
+
- @mastra/pg@1.18.0-alpha.2
|
|
17
|
+
- @mastra/libsql@1.18.0-alpha.1
|
|
18
|
+
|
|
3
19
|
## 0.32.3-alpha.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/dist/acp.cjs
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.keys(acp).forEach(function (k) {
|
|
8
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
1
|
+
var _mastra_code_sdk_acp = require("@mastra/code-sdk/acp");
|
|
2
|
+
Object.keys(_mastra_code_sdk_acp).forEach(function(k) {
|
|
3
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
9
4
|
enumerable: true,
|
|
10
|
-
get: function
|
|
5
|
+
get: function() {
|
|
6
|
+
return _mastra_code_sdk_acp[k];
|
|
7
|
+
}
|
|
11
8
|
});
|
|
12
9
|
});
|
|
13
|
-
//# sourceMappingURL=acp.cjs.map
|
|
14
|
-
//# sourceMappingURL=acp.cjs.map
|
package/dist/acp.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=acp.js.map
|
|
1
|
+
export * from "@mastra/code-sdk/acp";
|
|
2
|
+
export {};
|
package/dist/cli.cjs
CHANGED
|
@@ -1,275 +1,235 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
-
|
|
18
|
-
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
19
|
-
|
|
2
|
+
const require_tui = require("./tui-G-b6reo7.cjs");
|
|
3
|
+
let _mastra_code_sdk = require("@mastra/code-sdk");
|
|
4
|
+
let fs = require("fs");
|
|
5
|
+
fs = require_tui.__toESM(fs, 1);
|
|
6
|
+
let _mastra_code_sdk_analytics = require("@mastra/code-sdk/analytics");
|
|
7
|
+
let _mastra_code_sdk_error_classification = require("@mastra/code-sdk/error-classification");
|
|
8
|
+
let _mastra_code_sdk_headless_index = require("@mastra/code-sdk/headless/index");
|
|
9
|
+
let _mastra_code_sdk_onboarding_settings = require("@mastra/code-sdk/onboarding/settings");
|
|
10
|
+
let _mastra_code_sdk_plugins_scaffold = require("@mastra/code-sdk/plugins/scaffold");
|
|
11
|
+
let _mastra_code_sdk_utils_debug_log = require("@mastra/code-sdk/utils/debug-log");
|
|
12
|
+
let _mastra_code_sdk_utils_stdin_pipe = require("@mastra/code-sdk/utils/stdin-pipe");
|
|
13
|
+
let _mastra_code_sdk_utils_thread_lock = require("@mastra/code-sdk/utils/thread-lock");
|
|
14
|
+
//#region src/version.ts
|
|
20
15
|
function getCurrentVersion() {
|
|
21
|
-
|
|
22
|
-
return "0.32.3-alpha.1";
|
|
23
|
-
}
|
|
16
|
+
return "0.32.3-alpha.2";
|
|
24
17
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/main.ts
|
|
20
|
+
/**
|
|
21
|
+
* Main entry point for Mastra Code TUI.
|
|
22
|
+
*/
|
|
23
|
+
let controller;
|
|
24
|
+
let mcpManager;
|
|
25
|
+
let hookManager;
|
|
26
|
+
let authStorage;
|
|
27
|
+
let signalsPubSub;
|
|
28
|
+
let storageMaintenance;
|
|
29
|
+
let analytics;
|
|
30
|
+
let tui;
|
|
31
|
+
let storageClosed = false;
|
|
36
32
|
function isTruthyEnv(name) {
|
|
37
|
-
|
|
33
|
+
return [
|
|
34
|
+
"1",
|
|
35
|
+
"true",
|
|
36
|
+
"yes",
|
|
37
|
+
"on"
|
|
38
|
+
].includes(process.env[name]?.trim().toLowerCase() ?? "");
|
|
38
39
|
}
|
|
39
40
|
function resolveInitialStateFromEnv() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();
|
|
42
|
+
const initialState = {};
|
|
43
|
+
if (currentModelId) initialState.currentModelId = currentModelId;
|
|
44
|
+
if (isTruthyEnv("MASTRACODE_YOLO")) initialState.yolo = true;
|
|
45
|
+
return Object.keys(initialState).length > 0 ? initialState : void 0;
|
|
45
46
|
}
|
|
46
47
|
process.on("uncaughtException", (error) => {
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
if ((0, _mastra_code_sdk_error_classification.isStreamDestroyedError)(error)) return;
|
|
49
|
+
handleFatalError(error);
|
|
49
50
|
});
|
|
50
51
|
process.on("unhandledRejection", (reason) => {
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if ((0, _mastra_code_sdk_error_classification.isStreamDestroyedError)(reason)) return;
|
|
53
|
+
handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
|
|
53
54
|
});
|
|
54
55
|
async function tuiMain(pipedInput) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
});
|
|
125
|
-
tui.run().catch((error) => {
|
|
126
|
-
handleFatalError(error);
|
|
127
|
-
});
|
|
128
|
-
if (settings$1.browser.enabled) {
|
|
129
|
-
void loadBrowser().then((browser) => {
|
|
130
|
-
if (!browser) return;
|
|
131
|
-
controller.setBrowser(browser);
|
|
132
|
-
void session.state.set({ activeBrowserSettings: settings$1.browser }).catch(() => {
|
|
133
|
-
});
|
|
134
|
-
}).catch(() => {
|
|
135
|
-
});
|
|
136
|
-
}
|
|
56
|
+
const settings = (0, _mastra_code_sdk_onboarding_settings.loadSettings)();
|
|
57
|
+
let browserPromise;
|
|
58
|
+
const loadBrowser = () => {
|
|
59
|
+
browserPromise ??= (0, _mastra_code_sdk_onboarding_settings.createBrowserFromSettings)(settings.browser);
|
|
60
|
+
return browserPromise;
|
|
61
|
+
};
|
|
62
|
+
const initialState = resolveInitialStateFromEnv();
|
|
63
|
+
const result = await (0, _mastra_code_sdk.createMastraCode)({
|
|
64
|
+
unixSocketPubSub: !isTruthyEnv("MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB"),
|
|
65
|
+
disableMcp: isTruthyEnv("MASTRACODE_DISABLE_MCP"),
|
|
66
|
+
disableHooks: isTruthyEnv("MASTRACODE_DISABLE_HOOKS"),
|
|
67
|
+
...isTruthyEnv("MASTRACODE_DISABLE_MEMORY") ? { memory: false } : {},
|
|
68
|
+
...initialState ? { initialState } : {}
|
|
69
|
+
});
|
|
70
|
+
controller = result.controller;
|
|
71
|
+
mcpManager = result.mcpManager;
|
|
72
|
+
hookManager = result.hookManager;
|
|
73
|
+
authStorage = result.authStorage;
|
|
74
|
+
signalsPubSub = result.signalsPubSub;
|
|
75
|
+
storageMaintenance = result.storageMaintenance;
|
|
76
|
+
if (result.storageWarning) console.info(`⚠ ${result.storageWarning}`);
|
|
77
|
+
if (result.observabilityWarning) console.info(`⚠ ${result.observabilityWarning}`);
|
|
78
|
+
(0, _mastra_code_sdk_utils_debug_log.setupDebugLogging)();
|
|
79
|
+
const envTheme = process.env.MASTRA_THEME?.toLowerCase();
|
|
80
|
+
let themeMode;
|
|
81
|
+
let detectedBgHex;
|
|
82
|
+
if (envTheme === "dark" || envTheme === "light") themeMode = envTheme;
|
|
83
|
+
else {
|
|
84
|
+
const themePref = (0, _mastra_code_sdk_onboarding_settings.loadSettings)().preferences.theme;
|
|
85
|
+
if (themePref === "dark" || themePref === "light") themeMode = themePref;
|
|
86
|
+
else {
|
|
87
|
+
const detection = await require_tui.detectTerminalTheme();
|
|
88
|
+
themeMode = detection.mode;
|
|
89
|
+
detectedBgHex = detection.detectedBgHex;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
require_tui.applyThemeMode(themeMode, detectedBgHex);
|
|
93
|
+
const session = result.session;
|
|
94
|
+
analytics = (0, _mastra_code_sdk_analytics.createMastraCodeAnalytics)({ version: getCurrentVersion() });
|
|
95
|
+
analytics.capture("mastracode_session_started", {
|
|
96
|
+
mode: session.mode.get(),
|
|
97
|
+
resourceId: session.identity.getResourceId(),
|
|
98
|
+
hasAuthStorage: Boolean(authStorage),
|
|
99
|
+
hasMcp: Boolean(mcpManager),
|
|
100
|
+
theme: themeMode
|
|
101
|
+
});
|
|
102
|
+
tui = new require_tui.MastraTUI({
|
|
103
|
+
controller,
|
|
104
|
+
session,
|
|
105
|
+
hookManager,
|
|
106
|
+
analytics,
|
|
107
|
+
authStorage,
|
|
108
|
+
mcpManager,
|
|
109
|
+
pluginManager: result.pluginManager,
|
|
110
|
+
storageMaintenance: result.storageMaintenance,
|
|
111
|
+
appName: "Mastra Code",
|
|
112
|
+
version: getCurrentVersion(),
|
|
113
|
+
inlineQuestions: true,
|
|
114
|
+
githubSignals: result.githubSignals,
|
|
115
|
+
...pipedInput ? { initialMessage: `The following was piped via stdin:\n\n${pipedInput}` } : {}
|
|
116
|
+
});
|
|
117
|
+
tui.run().catch((error) => {
|
|
118
|
+
handleFatalError(error);
|
|
119
|
+
});
|
|
120
|
+
if (settings.browser.enabled) loadBrowser().then((browser) => {
|
|
121
|
+
if (!browser) return;
|
|
122
|
+
controller.setBrowser(browser);
|
|
123
|
+
session.state.set({ activeBrowserSettings: settings.browser }).catch(() => {});
|
|
124
|
+
}).catch(() => {});
|
|
137
125
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
126
|
+
const asyncCleanup = async () => {
|
|
127
|
+
(0, _mastra_code_sdk_utils_thread_lock.releaseAllThreadLocks)();
|
|
128
|
+
const closeSignalsPubSub = signalsPubSub?.close;
|
|
129
|
+
await Promise.allSettled([
|
|
130
|
+
mcpManager?.disconnect(),
|
|
131
|
+
controller?.getMastra()?.stopWorkers(),
|
|
132
|
+
controller?.stopIntervals(),
|
|
133
|
+
closeSignalsPubSub?.(),
|
|
134
|
+
analytics?.shutdown()
|
|
135
|
+
]);
|
|
136
|
+
if (!storageClosed) {
|
|
137
|
+
storageClosed = true;
|
|
138
|
+
await storageMaintenance?.closeStorage?.().catch(() => {});
|
|
139
|
+
}
|
|
153
140
|
};
|
|
154
141
|
process.on("beforeExit", () => {
|
|
155
|
-
|
|
142
|
+
asyncCleanup();
|
|
156
143
|
});
|
|
157
144
|
process.on("exit", () => {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (process.stdin.setRawMode) {
|
|
168
|
-
process.stdin.setRawMode(false);
|
|
169
|
-
}
|
|
170
|
-
} catch {
|
|
171
|
-
}
|
|
172
|
-
chunkLDCL2KGF_cjs.restoreTerminalForeground();
|
|
173
|
-
threadLock.releaseAllThreadLocks();
|
|
145
|
+
try {
|
|
146
|
+
tui?.stop();
|
|
147
|
+
} catch {}
|
|
148
|
+
try {
|
|
149
|
+
process.stdout.write("\x1B[?2004l\x1B[<u\x1B[>4;0m\x1B[?25h");
|
|
150
|
+
if (process.stdin.setRawMode) process.stdin.setRawMode(false);
|
|
151
|
+
} catch {}
|
|
152
|
+
require_tui.restoreTerminalForeground();
|
|
153
|
+
(0, _mastra_code_sdk_utils_thread_lock.releaseAllThreadLocks)();
|
|
174
154
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
void asyncCleanup().finally(() => process.exit(0));
|
|
155
|
+
const handleTermSignal = () => {
|
|
156
|
+
try {
|
|
157
|
+
tui?.stop();
|
|
158
|
+
} catch {}
|
|
159
|
+
asyncCleanup().finally(() => process.exit(0));
|
|
181
160
|
};
|
|
182
161
|
process.on("SIGINT", handleTermSignal);
|
|
183
162
|
process.on("SIGTERM", handleTermSignal);
|
|
184
163
|
process.on("SIGHUP", handleTermSignal);
|
|
185
164
|
function hasEconnrefused(err, depth = 0) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
165
|
+
if (!err || depth > 5) return false;
|
|
166
|
+
const e = err;
|
|
167
|
+
if (e.code === "ECONNREFUSED") return true;
|
|
168
|
+
if (e.cause) return hasEconnrefused(e.cause, depth + 1);
|
|
169
|
+
if (Array.isArray(e.errors)) return e.errors.some((inner) => hasEconnrefused(inner, depth + 1));
|
|
170
|
+
return false;
|
|
192
171
|
}
|
|
193
172
|
function pluginMain(args) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
173
|
+
if (args[0] !== "scaffold") {
|
|
174
|
+
process.stderr.write("Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\n");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const dir = args[1];
|
|
178
|
+
if (!dir) {
|
|
179
|
+
process.stderr.write("Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\n");
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const id = readFlag(args, "--id");
|
|
183
|
+
const name = readFlag(args, "--name");
|
|
184
|
+
const targetDir = (0, _mastra_code_sdk_plugins_scaffold.scaffoldPlugin)(dir, {
|
|
185
|
+
...id ? { id } : {},
|
|
186
|
+
...name ? { name } : {}
|
|
187
|
+
});
|
|
188
|
+
process.stdout.write(`${(0, _mastra_code_sdk_plugins_scaffold.formatScaffoldSuccess)(targetDir)}\n`);
|
|
208
189
|
}
|
|
209
190
|
function readFlag(args, flag) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
return value;
|
|
191
|
+
const index = args.indexOf(flag);
|
|
192
|
+
if (index === -1) return void 0;
|
|
193
|
+
const value = args[index + 1];
|
|
194
|
+
if (!value || value.startsWith("--")) throw new Error(`Missing value for ${flag}`);
|
|
195
|
+
return value;
|
|
217
196
|
}
|
|
218
197
|
function handleFatalError(error) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
);
|
|
233
|
-
process.exit(1);
|
|
234
|
-
}
|
|
235
|
-
const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;
|
|
236
|
-
write(msg);
|
|
237
|
-
try {
|
|
238
|
-
const crashLog = `[${(/* @__PURE__ */ new Date()).toISOString()}] ${msg}
|
|
239
|
-
${error instanceof Error && error.stack ? error.stack + "\n" : ""}`;
|
|
240
|
-
fs__default.default.appendFileSync("/tmp/mastra-crash.log", crashLog);
|
|
241
|
-
} catch {
|
|
242
|
-
}
|
|
243
|
-
if (error instanceof Error && error.stack) {
|
|
244
|
-
write(error.stack);
|
|
245
|
-
}
|
|
246
|
-
process.exit(1);
|
|
198
|
+
const write = (msg) => process.stderr.write(msg + "\n");
|
|
199
|
+
if (hasEconnrefused(error)) {
|
|
200
|
+
write(`\nFailed to connect to PostgreSQL at ${(0, _mastra_code_sdk_onboarding_settings.loadSettings)().storage?.pg?.connectionString ?? "localhost:5432"}.\nMake sure the database is running and accessible.\n\nTo switch back to LibSQL:\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\n`);
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;
|
|
204
|
+
write(msg);
|
|
205
|
+
try {
|
|
206
|
+
const crashLog = `[${(/* @__PURE__ */ new Date()).toISOString()}] ${msg}\n${error instanceof Error && error.stack ? error.stack + "\n" : ""}`;
|
|
207
|
+
fs.default.appendFileSync("/tmp/mastra-crash.log", crashLog);
|
|
208
|
+
} catch {}
|
|
209
|
+
if (error instanceof Error && error.stack) write(error.stack);
|
|
210
|
+
process.exit(1);
|
|
247
211
|
}
|
|
248
212
|
async function main() {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
process.stderr.write("No TTY available \u2014 falling back to headless mode.\n");
|
|
266
|
-
return index.runMCCli(pipedInput);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return tuiMain(pipedInput);
|
|
213
|
+
if (process.argv[2] === "plugin") return pluginMain(process.argv.slice(3));
|
|
214
|
+
if ((0, _mastra_code_sdk_headless_index.hasHeadlessFlag)(process.argv) || process.argv.includes("--help") || process.argv.includes("-h")) return (0, _mastra_code_sdk_headless_index.runMCCli)();
|
|
215
|
+
if (process.argv.includes("--acp")) {
|
|
216
|
+
const { acpMain } = await import("@mastra/code-sdk/acp/index");
|
|
217
|
+
return acpMain({ dangerousAutoApprove: process.argv.includes("--dangerous-auto-approve") });
|
|
218
|
+
}
|
|
219
|
+
let pipedInput = null;
|
|
220
|
+
if (!process.stdin.isTTY) {
|
|
221
|
+
process.stderr.write("Reading piped input...\n");
|
|
222
|
+
pipedInput = await (0, _mastra_code_sdk_utils_stdin_pipe.drainPipedStdin)();
|
|
223
|
+
if (!(0, _mastra_code_sdk_utils_stdin_pipe.reopenStdinFromTTY)()) {
|
|
224
|
+
process.stderr.write("No TTY available — falling back to headless mode.\n");
|
|
225
|
+
return (0, _mastra_code_sdk_headless_index.runMCCli)(pipedInput);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return tuiMain(pipedInput);
|
|
270
229
|
}
|
|
271
230
|
main().catch((error) => {
|
|
272
|
-
|
|
231
|
+
handleFatalError(error);
|
|
273
232
|
});
|
|
274
|
-
//#
|
|
233
|
+
//#endregion
|
|
234
|
+
|
|
275
235
|
//# sourceMappingURL=cli.cjs.map
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/main.ts"],"names":["isStreamDestroyedError","settings","loadSettings","createBrowserFromSettings","createMastraCode","setupDebugLogging","detectTerminalTheme","applyThemeMode","createMastraCodeAnalytics","MastraTUI","releaseAllThreadLocks","restoreTerminalForeground","scaffoldPlugin","formatScaffoldSuccess","msg","fs","hasHeadlessFlag","runMCCli","drainPipedStdin","reopenStdinFromTTY"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { readFileSync } from 'node:fs';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nexport function getCurrentVersion(): string {\n if (typeof MASTRACODE_VERSION !== 'undefined') {\n return MASTRACODE_VERSION;\n }\n\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n return pkg.version;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { getCurrentVersion } from './version.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet storageMaintenance: Awaited<ReturnType<typeof createMastraCode>>['storageMaintenance'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet storageClosed = false;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n storageMaintenance = result.storageMaintenance;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n // Checkpoint WAL and close the local storage connection after all producers\n // and timers are quiesced. Idempotent — repeated signals (SIGINT then SIGHUP)\n // close only once. LibSQLStore.close()/LibSQLVector.close() truncate the WAL\n // and switch back to DELETE journal mode for a clean shutdown.\n if (!storageClosed) {\n storageClosed = true;\n await storageMaintenance?.closeStorage?.().catch(() => {\n // Swallow — best-effort cleanup during shutdown. The process is exiting.\n });\n }\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["detectTerminalTheme","MastraTUI"],"sources":["../src/version.ts","../src/main.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\ndeclare const MASTRACODE_VERSION: string | undefined;\n\nexport function getCurrentVersion(): string {\n if (typeof MASTRACODE_VERSION !== 'undefined') {\n return MASTRACODE_VERSION;\n }\n\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };\n return pkg.version;\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for Mastra Code TUI.\n */\nimport fs from 'node:fs';\n\nimport { createMastraCode } from '@mastra/code-sdk';\nimport { createMastraCodeAnalytics } from '@mastra/code-sdk/analytics';\nimport { isStreamDestroyedError } from '@mastra/code-sdk/error-classification';\nimport { hasHeadlessFlag, runMCCli } from '@mastra/code-sdk/headless/index';\nimport { createBrowserFromSettings, loadSettings } from '@mastra/code-sdk/onboarding/settings';\nimport { formatScaffoldSuccess, scaffoldPlugin } from '@mastra/code-sdk/plugins/scaffold';\nimport { setupDebugLogging } from '@mastra/code-sdk/utils/debug-log';\nimport { drainPipedStdin, reopenStdinFromTTY } from '@mastra/code-sdk/utils/stdin-pipe';\nimport { releaseAllThreadLocks } from '@mastra/code-sdk/utils/thread-lock';\nimport { detectTerminalTheme } from './tui/detect-theme.js';\nimport { MastraTUI } from './tui/index.js';\nimport { applyThemeMode, restoreTerminalForeground } from './tui/theme.js';\nimport { getCurrentVersion } from './version.js';\n\nlet controller: Awaited<ReturnType<typeof createMastraCode>>['controller'];\nlet mcpManager: Awaited<ReturnType<typeof createMastraCode>>['mcpManager'];\nlet hookManager: Awaited<ReturnType<typeof createMastraCode>>['hookManager'];\nlet authStorage: Awaited<ReturnType<typeof createMastraCode>>['authStorage'];\nlet signalsPubSub: Awaited<ReturnType<typeof createMastraCode>>['signalsPubSub'];\nlet storageMaintenance: Awaited<ReturnType<typeof createMastraCode>>['storageMaintenance'];\nlet analytics: ReturnType<typeof createMastraCodeAnalytics> | undefined;\nlet tui: MastraTUI | undefined;\nlet storageClosed = false;\n\nfunction isTruthyEnv(name: string): boolean {\n return ['1', 'true', 'yes', 'on'].includes(process.env[name]?.trim().toLowerCase() ?? '');\n}\n\nfunction resolveInitialStateFromEnv() {\n const currentModelId = process.env.MASTRACODE_MODEL_ID?.trim();\n const initialState: Record<string, unknown> = {};\n if (currentModelId) initialState.currentModelId = currentModelId;\n if (isTruthyEnv('MASTRACODE_YOLO')) initialState.yolo = true;\n return Object.keys(initialState).length > 0 ? initialState : undefined;\n}\n\n// Global safety nets — catch any uncaught errors from storage init, etc.\nprocess.on('uncaughtException', error => {\n // ERR_STREAM_DESTROYED is non-fatal — happens routinely when streams close\n // during shutdown, cancelled LLM requests, or LSP/subprocess exits (#13548, #13549)\n if (isStreamDestroyedError(error)) return;\n handleFatalError(error);\n});\nprocess.on('unhandledRejection', reason => {\n if (isStreamDestroyedError(reason)) return;\n handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));\n});\n\nasync function tuiMain(pipedInput?: string | null) {\n const settings = loadSettings();\n let browserPromise: ReturnType<typeof createBrowserFromSettings> | undefined;\n const loadBrowser = () => {\n browserPromise ??= createBrowserFromSettings(settings.browser);\n return browserPromise;\n };\n\n const initialState = resolveInitialStateFromEnv();\n const result = await createMastraCode({\n unixSocketPubSub: !isTruthyEnv('MASTRACODE_DISABLE_UNIX_SOCKET_PUBSUB'),\n disableMcp: isTruthyEnv('MASTRACODE_DISABLE_MCP'),\n disableHooks: isTruthyEnv('MASTRACODE_DISABLE_HOOKS'),\n ...(isTruthyEnv('MASTRACODE_DISABLE_MEMORY') ? { memory: false as never } : {}),\n ...(initialState ? { initialState: initialState as never } : {}),\n });\n controller = result.controller;\n mcpManager = result.mcpManager;\n hookManager = result.hookManager;\n authStorage = result.authStorage;\n signalsPubSub = result.signalsPubSub;\n storageMaintenance = result.storageMaintenance;\n\n if (result.storageWarning) {\n console.info(`⚠ ${result.storageWarning}`);\n }\n if (result.observabilityWarning) {\n console.info(`⚠ ${result.observabilityWarning}`);\n }\n\n // MCP connection is deferred to TUI.init() (after ui.start()) so that\n // status messages use showInfo() instead of console.info(), which would\n // corrupt the terminal. Headless mode still inits from headless/cli.ts.\n\n setupDebugLogging();\n\n // Detect and apply terminal theme\n // MASTRA_THEME env var is the highest-priority override\n const envTheme = process.env.MASTRA_THEME?.toLowerCase();\n let themeMode: 'dark' | 'light';\n let detectedBgHex: string | undefined;\n if (envTheme === 'dark' || envTheme === 'light') {\n themeMode = envTheme;\n } else {\n const settings = loadSettings();\n const themePref = settings.preferences.theme;\n if (themePref === 'dark' || themePref === 'light') {\n themeMode = themePref;\n } else {\n const detection = await detectTerminalTheme();\n themeMode = detection.mode;\n detectedBgHex = detection.detectedBgHex;\n }\n }\n applyThemeMode(themeMode, detectedBgHex);\n\n // createMastraCode() brought up shared resources and minted the single\n // session that all work runs through. The AgentController owns no session of its own.\n const session = result.session;\n\n analytics = createMastraCodeAnalytics({ version: getCurrentVersion() });\n analytics.capture('mastracode_session_started', {\n mode: session.mode.get(),\n resourceId: session.identity.getResourceId(),\n hasAuthStorage: Boolean(authStorage),\n hasMcp: Boolean(mcpManager),\n theme: themeMode,\n });\n\n tui = new MastraTUI({\n controller: controller,\n session,\n hookManager,\n analytics,\n authStorage,\n mcpManager,\n pluginManager: result.pluginManager,\n storageMaintenance: result.storageMaintenance,\n appName: 'Mastra Code',\n version: getCurrentVersion(),\n inlineQuestions: true,\n githubSignals: result.githubSignals,\n ...(pipedInput ? { initialMessage: `The following was piped via stdin:\\n\\n${pipedInput}` } : {}),\n });\n tui.run().catch(error => {\n handleFatalError(error);\n });\n\n if (settings.browser.enabled) {\n void loadBrowser()\n .then(browser => {\n if (!browser) return;\n controller.setBrowser(browser);\n void session.state.set({ activeBrowserSettings: settings.browser } as any).catch(() => {});\n })\n .catch(() => {});\n }\n}\n\nconst asyncCleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\n closeSignalsPubSub?.(),\n analytics?.shutdown(),\n ]);\n // Checkpoint WAL and close the local storage connection after all producers\n // and timers are quiesced. Idempotent — repeated signals (SIGINT then SIGHUP)\n // close only once. LibSQLStore.close()/LibSQLVector.close() truncate the WAL\n // and switch back to DELETE journal mode for a clean shutdown.\n if (!storageClosed) {\n storageClosed = true;\n await storageMaintenance?.closeStorage?.().catch(() => {\n // Swallow — best-effort cleanup during shutdown. The process is exiting.\n });\n }\n};\n\nprocess.on('beforeExit', () => {\n void asyncCleanup();\n});\nprocess.on('exit', () => {\n // Ensure terminal protocols (kitty keyboard, modifyOtherKeys, bracketed paste,\n // raw mode) are disabled on ANY exit path. Without this, killing the process\n // via SIGINT/SIGTERM leaves the terminal in a corrupted state where keypresses\n // produce escape sequences like \"5;99~\" instead of normal characters.\n try {\n tui?.stop();\n } catch {\n // Failsafe: even if MastraTUI.stop() throws, write raw terminal reset\n // sequences to disable Kitty keyboard protocol, bracketed paste, and\n // modifyOtherKeys. These are the exact sequences pi-tui's terminal.stop()\n // would write.\n }\n // Belt-and-suspenders: always write terminal reset sequences directly,\n // regardless of whether tui.stop() succeeded. Writing them twice is harmless\n // but missing them leaves the terminal in a corrupted state.\n try {\n process.stdout.write(\n '\\x1b[?2004l' + // disable bracketed paste\n '\\x1b[<u' + // pop kitty keyboard protocol\n '\\x1b[>4;0m' + // disable modifyOtherKeys\n '\\x1b[?25h', // show cursor\n );\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false);\n }\n } catch {\n // stdout may already be closed during exit\n }\n restoreTerminalForeground();\n releaseAllThreadLocks();\n});\n\n// For all termination signals: stop the TUI FIRST (synchronous, disables keyboard\n// protocol immediately) before doing any async cleanup. This ensures the terminal\n// escape sequences are written even if asyncCleanup hangs or the process is killed\n// during cleanup.\nconst handleTermSignal = () => {\n try {\n tui?.stop();\n } catch {\n // ignored — exit handler has failsafe reset\n }\n void asyncCleanup().finally(() => process.exit(0));\n};\nprocess.on('SIGINT', handleTermSignal);\nprocess.on('SIGTERM', handleTermSignal);\nprocess.on('SIGHUP', handleTermSignal);\n\nfunction hasEconnrefused(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ECONNREFUSED') return true;\n if (e.cause) return hasEconnrefused(e.cause, depth + 1);\n // AggregateError has .errors array\n if (Array.isArray(e.errors)) return e.errors.some((inner: unknown) => hasEconnrefused(inner, depth + 1));\n return false;\n}\n\nfunction pluginMain(args: string[]): void {\n if (args[0] !== 'scaffold') {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const dir = args[1];\n if (!dir) {\n process.stderr.write('Usage: mastracode plugin scaffold <dir> [--id acme.foo] [--name \"Foo Tools\"]\\n');\n process.exit(1);\n }\n\n const id = readFlag(args, '--id');\n const name = readFlag(args, '--name');\n const targetDir = scaffoldPlugin(dir, { ...(id ? { id } : {}), ...(name ? { name } : {}) });\n process.stdout.write(`${formatScaffoldSuccess(targetDir)}\\n`);\n}\n\nfunction readFlag(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${flag}`);\n }\n return value;\n}\n\nfunction handleFatalError(error: unknown): never {\n // Always write to real stderr, even if console.error was overridden\n const write = (msg: string) => process.stderr.write(msg + '\\n');\n\n if (hasEconnrefused(error)) {\n const settings = loadSettings();\n const connStr = settings.storage?.pg?.connectionString;\n const target = connStr ?? 'localhost:5432';\n write(\n `\\nFailed to connect to PostgreSQL at ${target}.` +\n `\\nMake sure the database is running and accessible.` +\n `\\n\\nTo switch back to LibSQL:` +\n `\\n Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings\\n`,\n );\n process.exit(1);\n }\n\n const msg = `Fatal error: ${error instanceof Error ? error.message : String(error)}`;\n write(msg);\n // Write crash log to file so it persists even if terminal closes\n try {\n const crashLog = `[${new Date().toISOString()}] ${msg}\\n${error instanceof Error && error.stack ? error.stack + '\\n' : ''}`;\n fs.appendFileSync('/tmp/mastra-crash.log', crashLog);\n } catch {}\n if (error instanceof Error && error.stack) {\n write(error.stack);\n }\n process.exit(1);\n}\n\nasync function main() {\n if (process.argv[2] === 'plugin') {\n return pluginMain(process.argv.slice(3));\n }\n\n if (hasHeadlessFlag(process.argv) || process.argv.includes('--help') || process.argv.includes('-h')) {\n return runMCCli();\n }\n\n if (process.argv.includes('--acp')) {\n const { acpMain } = await import('@mastra/code-sdk/acp/index');\n return acpMain({ dangerousAutoApprove: process.argv.includes('--dangerous-auto-approve') });\n }\n\n // When stdin is piped (e.g. `cat foo | mastracode`), drain the pipe fully\n // before starting the TUI. The drain blocks until the sender process exits\n // and closes its stdout, so we never see partial output.\n let pipedInput: string | null = null;\n if (!process.stdin.isTTY) {\n process.stderr.write('Reading piped input...\\n');\n pipedInput = await drainPipedStdin();\n\n // Always reopen a real TTY — even if the pipe was empty, the original\n // stdin is consumed/closed and the TUI needs a live TTY for keyboard input.\n const reopenedStdin = reopenStdinFromTTY();\n if (!reopenedStdin) {\n process.stderr.write('No TTY available — falling back to headless mode.\\n');\n return runMCCli(pipedInput);\n }\n }\n\n return tuiMain(pipedInput);\n}\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"],"mappings":"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"}
|