@ngandu/ulicode 0.0.6
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 +1081 -0
- package/README.md +312 -0
- package/dist/agents/definitions/ask.agent.md +53 -0
- package/dist/agents/definitions/audit-tests.agent.md +138 -0
- package/dist/agents/definitions/build.agent.md +111 -0
- package/dist/agents/definitions/execute.agent.md +99 -0
- package/dist/agents/definitions/explore.agent.md +57 -0
- package/dist/agents/definitions/fast.agent.md +48 -0
- package/dist/agents/definitions/plan-mode.agent.md +102 -0
- package/dist/agents/definitions/planner.agent.md +59 -0
- package/dist/chunk-3YYDXNUH.js +854 -0
- package/dist/chunk-3YYDXNUH.js.map +1 -0
- package/dist/chunk-IEV2IT3O.cjs +873 -0
- package/dist/chunk-IEV2IT3O.cjs.map +1 -0
- package/dist/chunk-MBWGSXBT.js +11927 -0
- package/dist/chunk-MBWGSXBT.js.map +1 -0
- package/dist/chunk-MS5RYNRK.js +137 -0
- package/dist/chunk-MS5RYNRK.js.map +1 -0
- package/dist/chunk-OXFO76JC.js +2633 -0
- package/dist/chunk-OXFO76JC.js.map +1 -0
- package/dist/chunk-PKRLG6A4.js +1756 -0
- package/dist/chunk-PKRLG6A4.js.map +1 -0
- package/dist/chunk-PUVEPQQ3.cjs +1805 -0
- package/dist/chunk-PUVEPQQ3.cjs.map +1 -0
- package/dist/chunk-R6JK3DE3.cjs +148 -0
- package/dist/chunk-R6JK3DE3.cjs.map +1 -0
- package/dist/chunk-Y3HWP75B.cjs +11974 -0
- package/dist/chunk-Y3HWP75B.cjs.map +1 -0
- package/dist/chunk-Y5PO67TG.cjs +2659 -0
- package/dist/chunk-Y5PO67TG.cjs.map +1 -0
- package/dist/cli.cjs +372 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +370 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +16 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +165 -0
- package/dist/index.d.ts +165 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions-NRD36MYI.cjs +40 -0
- package/dist/permissions-NRD36MYI.cjs.map +1 -0
- package/dist/permissions-RC7CYR5H.js +3 -0
- package/dist/permissions-RC7CYR5H.js.map +1 -0
- package/dist/project-q9WpahUs.d.cts +329 -0
- package/dist/project-q9WpahUs.d.ts +329 -0
- package/dist/storage-6P53PQBL.cjs +24 -0
- package/dist/storage-6P53PQBL.cjs.map +1 -0
- package/dist/storage-QELMNBZ2.js +3 -0
- package/dist/storage-QELMNBZ2.js.map +1 -0
- package/dist/tui.cjs +76 -0
- package/dist/tui.cjs.map +1 -0
- package/dist/tui.d.cts +1013 -0
- package/dist/tui.d.ts +1013 -0
- package/dist/tui.js +3 -0
- package/dist/tui.js.map +1 -0
- package/package.json +107 -0
package/dist/cli.cjs
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkY5PO67TG_cjs = require('./chunk-Y5PO67TG.cjs');
|
|
5
|
+
var chunkY3HWP75B_cjs = require('./chunk-Y3HWP75B.cjs');
|
|
6
|
+
var chunkPUVEPQQ3_cjs = require('./chunk-PUVEPQQ3.cjs');
|
|
7
|
+
var util = require('util');
|
|
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
|
+
function hasHeadlessFlag(argv) {
|
|
21
|
+
return argv.some((a) => a === "--prompt" || a === "-p");
|
|
22
|
+
}
|
|
23
|
+
var headlessOptions = {
|
|
24
|
+
prompt: { type: "string", short: "p" },
|
|
25
|
+
continue: { type: "boolean", short: "c", default: false },
|
|
26
|
+
timeout: { type: "string" },
|
|
27
|
+
// parsed to number after validation
|
|
28
|
+
format: { type: "string", default: "default" },
|
|
29
|
+
help: { type: "boolean", short: "h", default: false }
|
|
30
|
+
};
|
|
31
|
+
function parseHeadlessArgs(argv) {
|
|
32
|
+
const { values, positionals } = util.parseArgs({
|
|
33
|
+
args: argv.slice(2),
|
|
34
|
+
options: headlessOptions,
|
|
35
|
+
strict: false,
|
|
36
|
+
allowPositionals: true
|
|
37
|
+
});
|
|
38
|
+
const format = String(values.format ?? "default");
|
|
39
|
+
if (format !== "default" && format !== "json") {
|
|
40
|
+
throw new Error('--format must be "default" or "json"');
|
|
41
|
+
}
|
|
42
|
+
let timeout;
|
|
43
|
+
if (values.timeout !== void 0) {
|
|
44
|
+
const raw = String(values.timeout);
|
|
45
|
+
const parsed = Number(raw);
|
|
46
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
47
|
+
throw new Error("--timeout must be a positive integer");
|
|
48
|
+
}
|
|
49
|
+
timeout = parsed;
|
|
50
|
+
}
|
|
51
|
+
const prompt = typeof values.prompt === "string" ? values.prompt : positionals[0];
|
|
52
|
+
return {
|
|
53
|
+
prompt,
|
|
54
|
+
timeout,
|
|
55
|
+
format,
|
|
56
|
+
continue_: Boolean(values.continue)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function truncate(s, max) {
|
|
60
|
+
return s.length > max ? s.slice(0, max) + "..." : s;
|
|
61
|
+
}
|
|
62
|
+
function printHeadlessUsage() {
|
|
63
|
+
process.stdout.write(`
|
|
64
|
+
Usage: ulicode --prompt <text> [options]
|
|
65
|
+
|
|
66
|
+
Headless (non-interactive) mode options:
|
|
67
|
+
--prompt, -p <text> The task to execute (required, or pipe via stdin)
|
|
68
|
+
--continue, -c Resume the most recent thread instead of creating a new one
|
|
69
|
+
--timeout <seconds> Exit with code 2 if not complete within timeout
|
|
70
|
+
--format <type> Output format: "default" or "json" (default: "default")
|
|
71
|
+
|
|
72
|
+
Exit codes:
|
|
73
|
+
0 Agent completed successfully
|
|
74
|
+
1 Error or aborted
|
|
75
|
+
2 Timeout
|
|
76
|
+
|
|
77
|
+
Examples:
|
|
78
|
+
ulicode --prompt "Fix the bug in auth.ts"
|
|
79
|
+
ulicode --prompt "Add tests" --timeout 300
|
|
80
|
+
ulicode -c --prompt "Continue where you left off"
|
|
81
|
+
ulicode --prompt "Refactor utils" --format json
|
|
82
|
+
echo "task description" | ulicode --prompt -
|
|
83
|
+
|
|
84
|
+
Run without --prompt for the interactive TUI.
|
|
85
|
+
`);
|
|
86
|
+
}
|
|
87
|
+
function resolveExitCode(reason) {
|
|
88
|
+
return reason === "error" || reason === "aborted" ? 1 : 0;
|
|
89
|
+
}
|
|
90
|
+
function autoResolve(harness2, event) {
|
|
91
|
+
switch (event.type) {
|
|
92
|
+
case "sandbox_access_request": {
|
|
93
|
+
harness2.respondToQuestion({ questionId: event.questionId, answer: "Yes" });
|
|
94
|
+
return { resolved: true, label: `[auto-approved sandbox] ${event.path}`, json: { ...event, autoApproved: true } };
|
|
95
|
+
}
|
|
96
|
+
case "tool_approval_required": {
|
|
97
|
+
harness2.respondToToolApproval({ decision: "approve" });
|
|
98
|
+
return { resolved: true, label: `[auto-approved] ${event.toolName}`, json: { ...event, autoApproved: true } };
|
|
99
|
+
}
|
|
100
|
+
case "ask_question": {
|
|
101
|
+
harness2.respondToQuestion({
|
|
102
|
+
questionId: event.questionId,
|
|
103
|
+
answer: "Proceed with your best judgment. Do not ask further questions."
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
resolved: true,
|
|
107
|
+
label: `[auto-answered] ${truncate(event.question, 100)}`,
|
|
108
|
+
json: { ...event, autoAnswered: true }
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
case "plan_approval_required": {
|
|
112
|
+
void harness2.respondToPlanApproval({ planId: event.planId, response: { action: "approved" } });
|
|
113
|
+
return { resolved: true, label: `[auto-approved plan] ${event.title}`, json: { ...event, autoApproved: true } };
|
|
114
|
+
}
|
|
115
|
+
default:
|
|
116
|
+
return { resolved: false };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function formatDefault(event, ctx) {
|
|
120
|
+
switch (event.type) {
|
|
121
|
+
case "agent_start":
|
|
122
|
+
ctx.lastTextLength = 0;
|
|
123
|
+
break;
|
|
124
|
+
case "message_update": {
|
|
125
|
+
const fullText = event.message.content.filter((c) => c.type === "text").map((p) => p.text).join("");
|
|
126
|
+
if (fullText.length > ctx.lastTextLength) {
|
|
127
|
+
process.stdout.write(fullText.slice(ctx.lastTextLength));
|
|
128
|
+
ctx.lastTextLength = fullText.length;
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
case "message_end":
|
|
133
|
+
ctx.lastTextLength = 0;
|
|
134
|
+
process.stdout.write("\n");
|
|
135
|
+
break;
|
|
136
|
+
case "tool_start":
|
|
137
|
+
process.stderr.write(`[tool] ${event.toolName}
|
|
138
|
+
`);
|
|
139
|
+
break;
|
|
140
|
+
case "tool_end":
|
|
141
|
+
if (event.isError) process.stderr.write(`[tool error] ${truncate(String(event.result), 200)}
|
|
142
|
+
`);
|
|
143
|
+
break;
|
|
144
|
+
case "shell_output":
|
|
145
|
+
process.stderr.write(event.output);
|
|
146
|
+
break;
|
|
147
|
+
case "subagent_start":
|
|
148
|
+
process.stderr.write(`[subagent:${event.agentType}] ${truncate(event.task, 100)}
|
|
149
|
+
`);
|
|
150
|
+
break;
|
|
151
|
+
case "subagent_end":
|
|
152
|
+
if (event.isError) process.stderr.write(`[subagent error] ${truncate(event.result, 200)}
|
|
153
|
+
`);
|
|
154
|
+
break;
|
|
155
|
+
case "error":
|
|
156
|
+
process.stderr.write(`[error] ${event.error.message}
|
|
157
|
+
`);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function runHeadless(harness2, args) {
|
|
162
|
+
const emit = args.format === "json" ? (data) => process.stdout.write(JSON.stringify(data) + "\n") : null;
|
|
163
|
+
let timeoutId;
|
|
164
|
+
let timedOut = false;
|
|
165
|
+
if (args.timeout) {
|
|
166
|
+
timeoutId = setTimeout(() => {
|
|
167
|
+
timedOut = true;
|
|
168
|
+
if (emit) {
|
|
169
|
+
emit({ type: "timeout", seconds: args.timeout });
|
|
170
|
+
} else {
|
|
171
|
+
process.stderr.write(`
|
|
172
|
+
Timeout: ${args.timeout}s elapsed. Aborting.
|
|
173
|
+
`);
|
|
174
|
+
}
|
|
175
|
+
harness2.abort();
|
|
176
|
+
}, args.timeout * 1e3);
|
|
177
|
+
}
|
|
178
|
+
const streamCtx = { lastTextLength: 0 };
|
|
179
|
+
const done = new Promise((resolve) => {
|
|
180
|
+
harness2.subscribe((event) => {
|
|
181
|
+
const result = autoResolve(harness2, event);
|
|
182
|
+
if (result.resolved) {
|
|
183
|
+
if (emit) emit(result.json);
|
|
184
|
+
else process.stderr.write(result.label + "\n");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (event.type === "agent_end") {
|
|
188
|
+
if (emit) emit({ ...event });
|
|
189
|
+
resolve(resolveExitCode(event.reason));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (emit) {
|
|
193
|
+
emit({ ...event });
|
|
194
|
+
} else {
|
|
195
|
+
formatDefault(event, streamCtx);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
if (args.continue_) {
|
|
200
|
+
const threads = await harness2.listThreads();
|
|
201
|
+
if (threads.length > 0) {
|
|
202
|
+
const sorted = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
203
|
+
await harness2.switchThread({ threadId: sorted[0].id });
|
|
204
|
+
if (!emit) process.stderr.write(`[continued] thread ${sorted[0].id}
|
|
205
|
+
`);
|
|
206
|
+
} else if (!emit) {
|
|
207
|
+
process.stderr.write(`[info] No existing threads found, starting new thread
|
|
208
|
+
`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
await harness2.sendMessage({ content: args.prompt });
|
|
212
|
+
const exitCode = await done;
|
|
213
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
214
|
+
return timedOut ? 2 : exitCode;
|
|
215
|
+
}
|
|
216
|
+
async function headlessMain() {
|
|
217
|
+
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
218
|
+
printHeadlessUsage();
|
|
219
|
+
process.exit(0);
|
|
220
|
+
}
|
|
221
|
+
let args;
|
|
222
|
+
try {
|
|
223
|
+
args = parseHeadlessArgs(process.argv);
|
|
224
|
+
} catch (e) {
|
|
225
|
+
process.stderr.write(`Error: ${e.message}
|
|
226
|
+
`);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
let prompt = args.prompt;
|
|
230
|
+
if (prompt === "-" || !prompt && !process.stdin.isTTY) {
|
|
231
|
+
const chunks = [];
|
|
232
|
+
for await (const chunk of process.stdin) {
|
|
233
|
+
chunks.push(chunk);
|
|
234
|
+
}
|
|
235
|
+
prompt = Buffer.concat(chunks).toString("utf-8").trim();
|
|
236
|
+
}
|
|
237
|
+
if (!prompt) {
|
|
238
|
+
printHeadlessUsage();
|
|
239
|
+
process.stderr.write("Error: --prompt is required (or pipe via stdin)\n");
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
const result = await chunkY5PO67TG_cjs.createMastraCode({ initialState: { yolo: true } });
|
|
243
|
+
const { harness: harness2, mcpManager: mcpManager2 } = result;
|
|
244
|
+
if (mcpManager2?.hasServers()) {
|
|
245
|
+
await mcpManager2.init();
|
|
246
|
+
}
|
|
247
|
+
chunkPUVEPQQ3_cjs.setupDebugLogging();
|
|
248
|
+
await harness2.init();
|
|
249
|
+
const exitCode = await runHeadless(harness2, { ...args, prompt });
|
|
250
|
+
chunkPUVEPQQ3_cjs.releaseAllThreadLocks();
|
|
251
|
+
await Promise.allSettled([mcpManager2?.disconnect(), harness2?.stopHeartbeats()]);
|
|
252
|
+
process.exit(exitCode);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// src/main.ts
|
|
256
|
+
var harness;
|
|
257
|
+
var mcpManager;
|
|
258
|
+
var hookManager;
|
|
259
|
+
var authStorage;
|
|
260
|
+
process.on("uncaughtException", (error) => {
|
|
261
|
+
if (isStreamDestroyedError(error)) return;
|
|
262
|
+
handleFatalError(error);
|
|
263
|
+
});
|
|
264
|
+
process.on("unhandledRejection", (reason) => {
|
|
265
|
+
if (isStreamDestroyedError(reason)) return;
|
|
266
|
+
handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
|
|
267
|
+
});
|
|
268
|
+
function hasVersionFlag(argv) {
|
|
269
|
+
return argv.includes("--version") || argv.includes("-v");
|
|
270
|
+
}
|
|
271
|
+
async function tuiMain() {
|
|
272
|
+
const result = await chunkY5PO67TG_cjs.createMastraCode();
|
|
273
|
+
harness = result.harness;
|
|
274
|
+
mcpManager = result.mcpManager;
|
|
275
|
+
hookManager = result.hookManager;
|
|
276
|
+
authStorage = result.authStorage;
|
|
277
|
+
if (result.storageWarning) {
|
|
278
|
+
console.info(`\u26A0 ${result.storageWarning}`);
|
|
279
|
+
}
|
|
280
|
+
if (mcpManager?.hasServers()) {
|
|
281
|
+
await mcpManager.init();
|
|
282
|
+
const statuses = mcpManager.getServerStatuses();
|
|
283
|
+
const connected = statuses.filter((s) => s.connected);
|
|
284
|
+
const failed = statuses.filter((s) => !s.connected);
|
|
285
|
+
const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);
|
|
286
|
+
console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);
|
|
287
|
+
for (const s of failed) {
|
|
288
|
+
console.info(`MCP: Failed to connect to "${s.name}": ${s.error}`);
|
|
289
|
+
}
|
|
290
|
+
const skipped = mcpManager.getSkippedServers();
|
|
291
|
+
for (const s of skipped) {
|
|
292
|
+
console.info(`MCP: Skipped "${s.name}": ${s.reason}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
chunkPUVEPQQ3_cjs.setupDebugLogging();
|
|
296
|
+
const envTheme = process.env.MASTRA_THEME?.toLowerCase();
|
|
297
|
+
let themeMode;
|
|
298
|
+
if (envTheme === "dark" || envTheme === "light") {
|
|
299
|
+
themeMode = envTheme;
|
|
300
|
+
} else {
|
|
301
|
+
const settings = chunkPUVEPQQ3_cjs.loadSettingsCached();
|
|
302
|
+
const themePref = settings.preferences.theme;
|
|
303
|
+
themeMode = themePref === "dark" || themePref === "light" ? themePref : await chunkY3HWP75B_cjs.detectTerminalTheme();
|
|
304
|
+
}
|
|
305
|
+
chunkY3HWP75B_cjs.applyThemeMode(themeMode);
|
|
306
|
+
const tui = new chunkY3HWP75B_cjs.MastraTUI({
|
|
307
|
+
harness,
|
|
308
|
+
hookManager,
|
|
309
|
+
authStorage,
|
|
310
|
+
mcpManager,
|
|
311
|
+
appName: "Ulicode",
|
|
312
|
+
version: chunkY3HWP75B_cjs.getCurrentVersion(),
|
|
313
|
+
inlineQuestions: true
|
|
314
|
+
});
|
|
315
|
+
tui.run().catch((error) => {
|
|
316
|
+
handleFatalError(error);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
var asyncCleanup = async () => {
|
|
320
|
+
chunkPUVEPQQ3_cjs.releaseAllThreadLocks();
|
|
321
|
+
await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);
|
|
322
|
+
};
|
|
323
|
+
process.on("beforeExit", () => {
|
|
324
|
+
void asyncCleanup();
|
|
325
|
+
});
|
|
326
|
+
process.on("exit", () => {
|
|
327
|
+
chunkPUVEPQQ3_cjs.releaseAllThreadLocks();
|
|
328
|
+
});
|
|
329
|
+
process.on("SIGINT", () => {
|
|
330
|
+
void asyncCleanup().finally(() => process.exit(0));
|
|
331
|
+
});
|
|
332
|
+
process.on("SIGTERM", () => {
|
|
333
|
+
void asyncCleanup().finally(() => process.exit(0));
|
|
334
|
+
});
|
|
335
|
+
function hasEconnrefused(err, depth = 0) {
|
|
336
|
+
if (!err || depth > 5) return false;
|
|
337
|
+
const e = err;
|
|
338
|
+
if (e.code === "ECONNREFUSED") return true;
|
|
339
|
+
if (e.cause) return hasEconnrefused(e.cause, depth + 1);
|
|
340
|
+
if (Array.isArray(e.errors)) return e.errors.some((inner) => hasEconnrefused(inner, depth + 1));
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
function handleFatalError(error) {
|
|
344
|
+
const write = (msg) => process.stderr.write(msg + "\n");
|
|
345
|
+
if (hasEconnrefused(error)) {
|
|
346
|
+
const settings = chunkPUVEPQQ3_cjs.loadSettingsCached();
|
|
347
|
+
const connStr = settings.storage?.pg?.connectionString;
|
|
348
|
+
const target = connStr ?? "localhost:5432";
|
|
349
|
+
write(
|
|
350
|
+
`
|
|
351
|
+
Failed to connect to PostgreSQL at ${target}.
|
|
352
|
+
Make sure the database is running and accessible.
|
|
353
|
+
|
|
354
|
+
To switch back to LibSQL:
|
|
355
|
+
Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings
|
|
356
|
+
`
|
|
357
|
+
);
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);
|
|
361
|
+
process.exit(1);
|
|
362
|
+
}
|
|
363
|
+
if (hasVersionFlag(process.argv)) {
|
|
364
|
+
console.info(chunkY3HWP75B_cjs.getCurrentVersion());
|
|
365
|
+
process.exit(0);
|
|
366
|
+
}
|
|
367
|
+
var main = hasHeadlessFlag(process.argv) ? headlessMain : tuiMain;
|
|
368
|
+
main().catch((error) => {
|
|
369
|
+
handleFatalError(error);
|
|
370
|
+
});
|
|
371
|
+
//# sourceMappingURL=cli.cjs.map
|
|
372
|
+
//# sourceMappingURL=cli.cjs.map
|
package/dist/cli.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error-classification.ts","../src/headless.ts","../src/main.ts"],"names":["parseArgs","harness","createMastraCode","mcpManager","setupDebugLogging","releaseAllThreadLocks","loadSettingsCached","detectTerminalTheme","applyThemeMode","MastraTUI","getCurrentVersion"],"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","/**\n * Headless mode helpers — pure functions extracted for testability.\n */\nimport { parseArgs } from 'node:util';\n\nimport type { Harness, HarnessEvent } from '@mastra/core/harness';\n\n// Imported from local modules\nimport { setupDebugLogging } from './utils/debug-log.js';\nimport { releaseAllThreadLocks } from './utils/thread-lock.js';\nimport { createMastraCode } from './index.js';\n\nexport interface HeadlessArgs {\n prompt?: string;\n timeout?: number;\n format: 'default' | 'json';\n continue_: boolean;\n}\n\n/** Returns true if argv contains --prompt or -p, indicating headless mode. */\nexport function hasHeadlessFlag(argv: string[]): boolean {\n return argv.some(a => a === '--prompt' || a === '-p');\n}\n\nconst headlessOptions = {\n prompt: { type: 'string', short: 'p' },\n continue: { type: 'boolean', short: 'c', default: false },\n timeout: { type: 'string' }, // parsed to number after validation\n format: { type: 'string', default: 'default' },\n help: { type: 'boolean', short: 'h', default: false },\n} as const;\n\n/** Parse CLI arguments for headless mode (--prompt, --timeout, --format, --continue). */\nexport function parseHeadlessArgs(argv: string[]): HeadlessArgs {\n const { values, positionals } = parseArgs({\n args: argv.slice(2),\n options: headlessOptions,\n strict: false,\n allowPositionals: true,\n });\n\n const format = String(values.format ?? 'default');\n if (format !== 'default' && format !== 'json') {\n throw new Error('--format must be \"default\" or \"json\"');\n }\n\n let timeout: number | undefined;\n if (values.timeout !== undefined) {\n const raw = String(values.timeout);\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error('--timeout must be a positive integer');\n }\n timeout = parsed;\n }\n\n const prompt = typeof values.prompt === 'string' ? values.prompt : positionals[0];\n\n return {\n prompt,\n timeout,\n format: format as 'default' | 'json',\n continue_: Boolean(values.continue),\n };\n}\n\n/** Truncate a string to `max` characters, appending \"...\" if truncated. */\nexport function truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + '...' : s;\n}\n\nexport function printHeadlessUsage(): void {\n process.stdout.write(`\nUsage: ulicode --prompt <text> [options]\n\nHeadless (non-interactive) mode options:\n --prompt, -p <text> The task to execute (required, or pipe via stdin)\n --continue, -c Resume the most recent thread instead of creating a new one\n --timeout <seconds> Exit with code 2 if not complete within timeout\n --format <type> Output format: \"default\" or \"json\" (default: \"default\")\n\nExit codes:\n 0 Agent completed successfully\n 1 Error or aborted\n 2 Timeout\n\nExamples:\n ulicode --prompt \"Fix the bug in auth.ts\"\n ulicode --prompt \"Add tests\" --timeout 300\n ulicode -c --prompt \"Continue where you left off\"\n ulicode --prompt \"Refactor utils\" --format json\n echo \"task description\" | ulicode --prompt -\n\nRun without --prompt for the interactive TUI.\n`);\n}\n\nfunction resolveExitCode(reason?: string): number {\n return reason === 'error' || reason === 'aborted' ? 1 : 0;\n}\n\nfunction autoResolve(\n harness: Harness,\n event: HarnessEvent,\n): { resolved: true; label: string; json: Record<string, unknown> } | { resolved: false } {\n switch (event.type) {\n case 'sandbox_access_request': {\n harness.respondToQuestion({ questionId: event.questionId, answer: 'Yes' });\n return { resolved: true, label: `[auto-approved sandbox] ${event.path}`, json: { ...event, autoApproved: true } };\n }\n case 'tool_approval_required': {\n harness.respondToToolApproval({ decision: 'approve' });\n return { resolved: true, label: `[auto-approved] ${event.toolName}`, json: { ...event, autoApproved: true } };\n }\n case 'ask_question': {\n harness.respondToQuestion({\n questionId: event.questionId,\n answer: 'Proceed with your best judgment. Do not ask further questions.',\n });\n return {\n resolved: true,\n label: `[auto-answered] ${truncate(event.question, 100)}`,\n json: { ...event, autoAnswered: true },\n };\n }\n case 'plan_approval_required': {\n void harness.respondToPlanApproval({ planId: event.planId, response: { action: 'approved' } });\n return { resolved: true, label: `[auto-approved plan] ${event.title}`, json: { ...event, autoApproved: true } };\n }\n default:\n return { resolved: false };\n }\n}\n\nfunction formatDefault(event: HarnessEvent, ctx: { lastTextLength: number }): void {\n switch (event.type) {\n case 'agent_start':\n ctx.lastTextLength = 0;\n break;\n case 'message_update': {\n const fullText = event.message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(p => p.text)\n .join('');\n if (fullText.length > ctx.lastTextLength) {\n process.stdout.write(fullText.slice(ctx.lastTextLength));\n ctx.lastTextLength = fullText.length;\n }\n break;\n }\n case 'message_end':\n ctx.lastTextLength = 0;\n process.stdout.write('\\n');\n break;\n case 'tool_start':\n process.stderr.write(`[tool] ${event.toolName}\\n`);\n break;\n case 'tool_end':\n if (event.isError) process.stderr.write(`[tool error] ${truncate(String(event.result), 200)}\\n`);\n break;\n case 'shell_output':\n process.stderr.write(event.output);\n break;\n case 'subagent_start':\n process.stderr.write(`[subagent:${event.agentType}] ${truncate(event.task, 100)}\\n`);\n break;\n case 'subagent_end':\n if (event.isError) process.stderr.write(`[subagent error] ${truncate(event.result, 200)}\\n`);\n break;\n case 'error':\n process.stderr.write(`[error] ${event.error.message}\\n`);\n break;\n }\n}\n\n/**\n * Run headless mode: subscribe to harness events with auto-approval,\n * optionally resume a thread, send the prompt, and wait for completion.\n *\n * Returns the exit code (0 = success, 1 = error/aborted, 2 = timeout).\n */\nexport async function runHeadless(harness: Harness, args: HeadlessArgs & { prompt: string }): Promise<number> {\n const emit =\n args.format === 'json'\n ? (data: Record<string, unknown>) => process.stdout.write(JSON.stringify(data) + '\\n')\n : null;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n if (args.timeout) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n if (emit) {\n emit({ type: 'timeout', seconds: args.timeout });\n } else {\n process.stderr.write(`\\nTimeout: ${args.timeout}s elapsed. Aborting.\\n`);\n }\n harness.abort();\n }, args.timeout * 1000);\n }\n\n const streamCtx = { lastTextLength: 0 };\n\n const done = new Promise<number>(resolve => {\n harness.subscribe(event => {\n const result = autoResolve(harness, event);\n if (result.resolved) {\n if (emit) emit(result.json);\n else process.stderr.write(result.label + '\\n');\n return;\n }\n\n if (event.type === 'agent_end') {\n if (emit) emit({ ...event });\n resolve(resolveExitCode(event.reason));\n return;\n }\n\n if (emit) {\n emit({ ...event });\n } else {\n formatDefault(event, streamCtx);\n }\n });\n });\n\n if (args.continue_) {\n const threads = await harness.listThreads();\n if (threads.length > 0) {\n const sorted = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n await harness.switchThread({ threadId: sorted[0]!.id });\n if (!emit) process.stderr.write(`[continued] thread ${sorted[0]!.id}\\n`);\n } else if (!emit) {\n process.stderr.write(`[info] No existing threads found, starting new thread\\n`);\n }\n }\n\n await harness.sendMessage({ content: args.prompt });\n\n const exitCode = await done;\n if (timeoutId) clearTimeout(timeoutId);\n return timedOut ? 2 : exitCode;\n}\n\n/**\n * Headless mode main entry point: parse arguments, read stdin, initialize\n * MastraCode, and run headless mode.\n */\nexport async function headlessMain(): Promise<never> {\n if (process.argv.includes('--help') || process.argv.includes('-h')) {\n printHeadlessUsage();\n process.exit(0);\n }\n\n let args;\n try {\n args = parseHeadlessArgs(process.argv);\n } catch (e) {\n process.stderr.write(`Error: ${(e as Error).message}\\n`);\n process.exit(1);\n }\n\n let prompt = args.prompt;\n if (prompt === '-' || (!prompt && !process.stdin.isTTY)) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n printHeadlessUsage();\n process.stderr.write('Error: --prompt is required (or pipe via stdin)\\n');\n process.exit(1);\n }\n\n const result = await createMastraCode({ initialState: { yolo: true } });\n const { harness, mcpManager } = result;\n\n if (mcpManager?.hasServers()) {\n await mcpManager.init();\n }\n\n setupDebugLogging();\n await harness.init();\n\n const exitCode = await runHeadless(harness as any, { ...args, prompt });\n\n // Cleanup\n releaseAllThreadLocks();\n await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);\n\n process.exit(exitCode);\n}\n","#!/usr/bin/env node\n/**\n * Main entry point for the Ulicode TUI.\n */\nimport { isStreamDestroyedError } from './error-classification.js';\nimport { hasHeadlessFlag, headlessMain } from './headless.js';\nimport { loadSettingsCached } 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\nfunction hasVersionFlag(argv: string[]): boolean {\n return argv.includes('--version') || argv.includes('-v');\n}\n\nasync function tuiMain() {\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 = loadSettingsCached();\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: 'Ulicode',\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 = loadSettingsCached();\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\nif (hasVersionFlag(process.argv)) {\n console.info(getCurrentVersion());\n process.exit(0);\n}\n\nconst main = hasHeadlessFlag(process.argv) ? headlessMain : tuiMain;\n\nmain().catch(error => {\n handleFatalError(error);\n});\n"]}
|
package/dist/cli.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|