@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.
Files changed (59) hide show
  1. package/CHANGELOG.md +1081 -0
  2. package/README.md +312 -0
  3. package/dist/agents/definitions/ask.agent.md +53 -0
  4. package/dist/agents/definitions/audit-tests.agent.md +138 -0
  5. package/dist/agents/definitions/build.agent.md +111 -0
  6. package/dist/agents/definitions/execute.agent.md +99 -0
  7. package/dist/agents/definitions/explore.agent.md +57 -0
  8. package/dist/agents/definitions/fast.agent.md +48 -0
  9. package/dist/agents/definitions/plan-mode.agent.md +102 -0
  10. package/dist/agents/definitions/planner.agent.md +59 -0
  11. package/dist/chunk-3YYDXNUH.js +854 -0
  12. package/dist/chunk-3YYDXNUH.js.map +1 -0
  13. package/dist/chunk-IEV2IT3O.cjs +873 -0
  14. package/dist/chunk-IEV2IT3O.cjs.map +1 -0
  15. package/dist/chunk-MBWGSXBT.js +11927 -0
  16. package/dist/chunk-MBWGSXBT.js.map +1 -0
  17. package/dist/chunk-MS5RYNRK.js +137 -0
  18. package/dist/chunk-MS5RYNRK.js.map +1 -0
  19. package/dist/chunk-OXFO76JC.js +2633 -0
  20. package/dist/chunk-OXFO76JC.js.map +1 -0
  21. package/dist/chunk-PKRLG6A4.js +1756 -0
  22. package/dist/chunk-PKRLG6A4.js.map +1 -0
  23. package/dist/chunk-PUVEPQQ3.cjs +1805 -0
  24. package/dist/chunk-PUVEPQQ3.cjs.map +1 -0
  25. package/dist/chunk-R6JK3DE3.cjs +148 -0
  26. package/dist/chunk-R6JK3DE3.cjs.map +1 -0
  27. package/dist/chunk-Y3HWP75B.cjs +11974 -0
  28. package/dist/chunk-Y3HWP75B.cjs.map +1 -0
  29. package/dist/chunk-Y5PO67TG.cjs +2659 -0
  30. package/dist/chunk-Y5PO67TG.cjs.map +1 -0
  31. package/dist/cli.cjs +372 -0
  32. package/dist/cli.cjs.map +1 -0
  33. package/dist/cli.d.cts +1 -0
  34. package/dist/cli.d.ts +1 -0
  35. package/dist/cli.js +370 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/index.cjs +16 -0
  38. package/dist/index.cjs.map +1 -0
  39. package/dist/index.d.cts +165 -0
  40. package/dist/index.d.ts +165 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/permissions-NRD36MYI.cjs +40 -0
  44. package/dist/permissions-NRD36MYI.cjs.map +1 -0
  45. package/dist/permissions-RC7CYR5H.js +3 -0
  46. package/dist/permissions-RC7CYR5H.js.map +1 -0
  47. package/dist/project-q9WpahUs.d.cts +329 -0
  48. package/dist/project-q9WpahUs.d.ts +329 -0
  49. package/dist/storage-6P53PQBL.cjs +24 -0
  50. package/dist/storage-6P53PQBL.cjs.map +1 -0
  51. package/dist/storage-QELMNBZ2.js +3 -0
  52. package/dist/storage-QELMNBZ2.js.map +1 -0
  53. package/dist/tui.cjs +76 -0
  54. package/dist/tui.cjs.map +1 -0
  55. package/dist/tui.d.cts +1013 -0
  56. package/dist/tui.d.ts +1013 -0
  57. package/dist/tui.js +3 -0
  58. package/dist/tui.js.map +1 -0
  59. package/package.json +107 -0
package/dist/cli.js ADDED
@@ -0,0 +1,370 @@
1
+ #!/usr/bin/env node
2
+ import { createMastraCode } from './chunk-OXFO76JC.js';
3
+ import { getCurrentVersion, detectTerminalTheme, applyThemeMode, MastraTUI } from './chunk-MBWGSXBT.js';
4
+ import { releaseAllThreadLocks, loadSettingsCached, setupDebugLogging } from './chunk-PKRLG6A4.js';
5
+ import { parseArgs } from 'util';
6
+
7
+ // src/error-classification.ts
8
+ function isStreamDestroyedError(err, depth = 0) {
9
+ if (!err || depth > 5) return false;
10
+ const e = err;
11
+ if (e.code === "ERR_STREAM_DESTROYED") return true;
12
+ if (typeof e.message === "string" && e.message.includes("stream was destroyed")) return true;
13
+ if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;
14
+ if (Array.isArray(e.errors) && e.errors.some((inner) => isStreamDestroyedError(inner, depth + 1)))
15
+ return true;
16
+ return false;
17
+ }
18
+ function hasHeadlessFlag(argv) {
19
+ return argv.some((a) => a === "--prompt" || a === "-p");
20
+ }
21
+ var headlessOptions = {
22
+ prompt: { type: "string", short: "p" },
23
+ continue: { type: "boolean", short: "c", default: false },
24
+ timeout: { type: "string" },
25
+ // parsed to number after validation
26
+ format: { type: "string", default: "default" },
27
+ help: { type: "boolean", short: "h", default: false }
28
+ };
29
+ function parseHeadlessArgs(argv) {
30
+ const { values, positionals } = parseArgs({
31
+ args: argv.slice(2),
32
+ options: headlessOptions,
33
+ strict: false,
34
+ allowPositionals: true
35
+ });
36
+ const format = String(values.format ?? "default");
37
+ if (format !== "default" && format !== "json") {
38
+ throw new Error('--format must be "default" or "json"');
39
+ }
40
+ let timeout;
41
+ if (values.timeout !== void 0) {
42
+ const raw = String(values.timeout);
43
+ const parsed = Number(raw);
44
+ if (!Number.isInteger(parsed) || parsed <= 0) {
45
+ throw new Error("--timeout must be a positive integer");
46
+ }
47
+ timeout = parsed;
48
+ }
49
+ const prompt = typeof values.prompt === "string" ? values.prompt : positionals[0];
50
+ return {
51
+ prompt,
52
+ timeout,
53
+ format,
54
+ continue_: Boolean(values.continue)
55
+ };
56
+ }
57
+ function truncate(s, max) {
58
+ return s.length > max ? s.slice(0, max) + "..." : s;
59
+ }
60
+ function printHeadlessUsage() {
61
+ process.stdout.write(`
62
+ Usage: ulicode --prompt <text> [options]
63
+
64
+ Headless (non-interactive) mode options:
65
+ --prompt, -p <text> The task to execute (required, or pipe via stdin)
66
+ --continue, -c Resume the most recent thread instead of creating a new one
67
+ --timeout <seconds> Exit with code 2 if not complete within timeout
68
+ --format <type> Output format: "default" or "json" (default: "default")
69
+
70
+ Exit codes:
71
+ 0 Agent completed successfully
72
+ 1 Error or aborted
73
+ 2 Timeout
74
+
75
+ Examples:
76
+ ulicode --prompt "Fix the bug in auth.ts"
77
+ ulicode --prompt "Add tests" --timeout 300
78
+ ulicode -c --prompt "Continue where you left off"
79
+ ulicode --prompt "Refactor utils" --format json
80
+ echo "task description" | ulicode --prompt -
81
+
82
+ Run without --prompt for the interactive TUI.
83
+ `);
84
+ }
85
+ function resolveExitCode(reason) {
86
+ return reason === "error" || reason === "aborted" ? 1 : 0;
87
+ }
88
+ function autoResolve(harness2, event) {
89
+ switch (event.type) {
90
+ case "sandbox_access_request": {
91
+ harness2.respondToQuestion({ questionId: event.questionId, answer: "Yes" });
92
+ return { resolved: true, label: `[auto-approved sandbox] ${event.path}`, json: { ...event, autoApproved: true } };
93
+ }
94
+ case "tool_approval_required": {
95
+ harness2.respondToToolApproval({ decision: "approve" });
96
+ return { resolved: true, label: `[auto-approved] ${event.toolName}`, json: { ...event, autoApproved: true } };
97
+ }
98
+ case "ask_question": {
99
+ harness2.respondToQuestion({
100
+ questionId: event.questionId,
101
+ answer: "Proceed with your best judgment. Do not ask further questions."
102
+ });
103
+ return {
104
+ resolved: true,
105
+ label: `[auto-answered] ${truncate(event.question, 100)}`,
106
+ json: { ...event, autoAnswered: true }
107
+ };
108
+ }
109
+ case "plan_approval_required": {
110
+ void harness2.respondToPlanApproval({ planId: event.planId, response: { action: "approved" } });
111
+ return { resolved: true, label: `[auto-approved plan] ${event.title}`, json: { ...event, autoApproved: true } };
112
+ }
113
+ default:
114
+ return { resolved: false };
115
+ }
116
+ }
117
+ function formatDefault(event, ctx) {
118
+ switch (event.type) {
119
+ case "agent_start":
120
+ ctx.lastTextLength = 0;
121
+ break;
122
+ case "message_update": {
123
+ const fullText = event.message.content.filter((c) => c.type === "text").map((p) => p.text).join("");
124
+ if (fullText.length > ctx.lastTextLength) {
125
+ process.stdout.write(fullText.slice(ctx.lastTextLength));
126
+ ctx.lastTextLength = fullText.length;
127
+ }
128
+ break;
129
+ }
130
+ case "message_end":
131
+ ctx.lastTextLength = 0;
132
+ process.stdout.write("\n");
133
+ break;
134
+ case "tool_start":
135
+ process.stderr.write(`[tool] ${event.toolName}
136
+ `);
137
+ break;
138
+ case "tool_end":
139
+ if (event.isError) process.stderr.write(`[tool error] ${truncate(String(event.result), 200)}
140
+ `);
141
+ break;
142
+ case "shell_output":
143
+ process.stderr.write(event.output);
144
+ break;
145
+ case "subagent_start":
146
+ process.stderr.write(`[subagent:${event.agentType}] ${truncate(event.task, 100)}
147
+ `);
148
+ break;
149
+ case "subagent_end":
150
+ if (event.isError) process.stderr.write(`[subagent error] ${truncate(event.result, 200)}
151
+ `);
152
+ break;
153
+ case "error":
154
+ process.stderr.write(`[error] ${event.error.message}
155
+ `);
156
+ break;
157
+ }
158
+ }
159
+ async function runHeadless(harness2, args) {
160
+ const emit = args.format === "json" ? (data) => process.stdout.write(JSON.stringify(data) + "\n") : null;
161
+ let timeoutId;
162
+ let timedOut = false;
163
+ if (args.timeout) {
164
+ timeoutId = setTimeout(() => {
165
+ timedOut = true;
166
+ if (emit) {
167
+ emit({ type: "timeout", seconds: args.timeout });
168
+ } else {
169
+ process.stderr.write(`
170
+ Timeout: ${args.timeout}s elapsed. Aborting.
171
+ `);
172
+ }
173
+ harness2.abort();
174
+ }, args.timeout * 1e3);
175
+ }
176
+ const streamCtx = { lastTextLength: 0 };
177
+ const done = new Promise((resolve) => {
178
+ harness2.subscribe((event) => {
179
+ const result = autoResolve(harness2, event);
180
+ if (result.resolved) {
181
+ if (emit) emit(result.json);
182
+ else process.stderr.write(result.label + "\n");
183
+ return;
184
+ }
185
+ if (event.type === "agent_end") {
186
+ if (emit) emit({ ...event });
187
+ resolve(resolveExitCode(event.reason));
188
+ return;
189
+ }
190
+ if (emit) {
191
+ emit({ ...event });
192
+ } else {
193
+ formatDefault(event, streamCtx);
194
+ }
195
+ });
196
+ });
197
+ if (args.continue_) {
198
+ const threads = await harness2.listThreads();
199
+ if (threads.length > 0) {
200
+ const sorted = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
201
+ await harness2.switchThread({ threadId: sorted[0].id });
202
+ if (!emit) process.stderr.write(`[continued] thread ${sorted[0].id}
203
+ `);
204
+ } else if (!emit) {
205
+ process.stderr.write(`[info] No existing threads found, starting new thread
206
+ `);
207
+ }
208
+ }
209
+ await harness2.sendMessage({ content: args.prompt });
210
+ const exitCode = await done;
211
+ if (timeoutId) clearTimeout(timeoutId);
212
+ return timedOut ? 2 : exitCode;
213
+ }
214
+ async function headlessMain() {
215
+ if (process.argv.includes("--help") || process.argv.includes("-h")) {
216
+ printHeadlessUsage();
217
+ process.exit(0);
218
+ }
219
+ let args;
220
+ try {
221
+ args = parseHeadlessArgs(process.argv);
222
+ } catch (e) {
223
+ process.stderr.write(`Error: ${e.message}
224
+ `);
225
+ process.exit(1);
226
+ }
227
+ let prompt = args.prompt;
228
+ if (prompt === "-" || !prompt && !process.stdin.isTTY) {
229
+ const chunks = [];
230
+ for await (const chunk of process.stdin) {
231
+ chunks.push(chunk);
232
+ }
233
+ prompt = Buffer.concat(chunks).toString("utf-8").trim();
234
+ }
235
+ if (!prompt) {
236
+ printHeadlessUsage();
237
+ process.stderr.write("Error: --prompt is required (or pipe via stdin)\n");
238
+ process.exit(1);
239
+ }
240
+ const result = await createMastraCode({ initialState: { yolo: true } });
241
+ const { harness: harness2, mcpManager: mcpManager2 } = result;
242
+ if (mcpManager2?.hasServers()) {
243
+ await mcpManager2.init();
244
+ }
245
+ setupDebugLogging();
246
+ await harness2.init();
247
+ const exitCode = await runHeadless(harness2, { ...args, prompt });
248
+ releaseAllThreadLocks();
249
+ await Promise.allSettled([mcpManager2?.disconnect(), harness2?.stopHeartbeats()]);
250
+ process.exit(exitCode);
251
+ }
252
+
253
+ // src/main.ts
254
+ var harness;
255
+ var mcpManager;
256
+ var hookManager;
257
+ var authStorage;
258
+ process.on("uncaughtException", (error) => {
259
+ if (isStreamDestroyedError(error)) return;
260
+ handleFatalError(error);
261
+ });
262
+ process.on("unhandledRejection", (reason) => {
263
+ if (isStreamDestroyedError(reason)) return;
264
+ handleFatalError(reason instanceof Error ? reason : new Error(String(reason)));
265
+ });
266
+ function hasVersionFlag(argv) {
267
+ return argv.includes("--version") || argv.includes("-v");
268
+ }
269
+ async function tuiMain() {
270
+ const result = await createMastraCode();
271
+ harness = result.harness;
272
+ mcpManager = result.mcpManager;
273
+ hookManager = result.hookManager;
274
+ authStorage = result.authStorage;
275
+ if (result.storageWarning) {
276
+ console.info(`\u26A0 ${result.storageWarning}`);
277
+ }
278
+ if (mcpManager?.hasServers()) {
279
+ await mcpManager.init();
280
+ const statuses = mcpManager.getServerStatuses();
281
+ const connected = statuses.filter((s) => s.connected);
282
+ const failed = statuses.filter((s) => !s.connected);
283
+ const totalTools = connected.reduce((sum, s) => sum + s.toolCount, 0);
284
+ console.info(`MCP: ${connected.length} server(s) connected, ${totalTools} tool(s)`);
285
+ for (const s of failed) {
286
+ console.info(`MCP: Failed to connect to "${s.name}": ${s.error}`);
287
+ }
288
+ const skipped = mcpManager.getSkippedServers();
289
+ for (const s of skipped) {
290
+ console.info(`MCP: Skipped "${s.name}": ${s.reason}`);
291
+ }
292
+ }
293
+ setupDebugLogging();
294
+ const envTheme = process.env.MASTRA_THEME?.toLowerCase();
295
+ let themeMode;
296
+ if (envTheme === "dark" || envTheme === "light") {
297
+ themeMode = envTheme;
298
+ } else {
299
+ const settings = loadSettingsCached();
300
+ const themePref = settings.preferences.theme;
301
+ themeMode = themePref === "dark" || themePref === "light" ? themePref : await detectTerminalTheme();
302
+ }
303
+ applyThemeMode(themeMode);
304
+ const tui = new MastraTUI({
305
+ harness,
306
+ hookManager,
307
+ authStorage,
308
+ mcpManager,
309
+ appName: "Ulicode",
310
+ version: getCurrentVersion(),
311
+ inlineQuestions: true
312
+ });
313
+ tui.run().catch((error) => {
314
+ handleFatalError(error);
315
+ });
316
+ }
317
+ var asyncCleanup = async () => {
318
+ releaseAllThreadLocks();
319
+ await Promise.allSettled([mcpManager?.disconnect(), harness?.stopHeartbeats()]);
320
+ };
321
+ process.on("beforeExit", () => {
322
+ void asyncCleanup();
323
+ });
324
+ process.on("exit", () => {
325
+ releaseAllThreadLocks();
326
+ });
327
+ process.on("SIGINT", () => {
328
+ void asyncCleanup().finally(() => process.exit(0));
329
+ });
330
+ process.on("SIGTERM", () => {
331
+ void asyncCleanup().finally(() => process.exit(0));
332
+ });
333
+ function hasEconnrefused(err, depth = 0) {
334
+ if (!err || depth > 5) return false;
335
+ const e = err;
336
+ if (e.code === "ECONNREFUSED") return true;
337
+ if (e.cause) return hasEconnrefused(e.cause, depth + 1);
338
+ if (Array.isArray(e.errors)) return e.errors.some((inner) => hasEconnrefused(inner, depth + 1));
339
+ return false;
340
+ }
341
+ function handleFatalError(error) {
342
+ const write = (msg) => process.stderr.write(msg + "\n");
343
+ if (hasEconnrefused(error)) {
344
+ const settings = loadSettingsCached();
345
+ const connStr = settings.storage?.pg?.connectionString;
346
+ const target = connStr ?? "localhost:5432";
347
+ write(
348
+ `
349
+ Failed to connect to PostgreSQL at ${target}.
350
+ Make sure the database is running and accessible.
351
+
352
+ To switch back to LibSQL:
353
+ Set MASTRA_STORAGE_BACKEND=libsql or change the backend in /settings
354
+ `
355
+ );
356
+ process.exit(1);
357
+ }
358
+ write(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);
359
+ process.exit(1);
360
+ }
361
+ if (hasVersionFlag(process.argv)) {
362
+ console.info(getCurrentVersion());
363
+ process.exit(0);
364
+ }
365
+ var main = hasHeadlessFlag(process.argv) ? headlessMain : tuiMain;
366
+ main().catch((error) => {
367
+ handleFatalError(error);
368
+ });
369
+ //# sourceMappingURL=cli.js.map
370
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-classification.ts","../src/headless.ts","../src/main.ts"],"names":["harness","mcpManager"],"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","/**\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/index.cjs ADDED
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkY5PO67TG_cjs = require('./chunk-Y5PO67TG.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "createAuthStorage", {
8
+ enumerable: true,
9
+ get: function () { return chunkY5PO67TG_cjs.createAuthStorage; }
10
+ });
11
+ Object.defineProperty(exports, "createMastraCode", {
12
+ enumerable: true,
13
+ get: function () { return chunkY5PO67TG_cjs.createMastraCode; }
14
+ });
15
+ //# sourceMappingURL=index.cjs.map
16
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,165 @@
1
+ import { S as StorageConfig, M as McpServerConfig, A as AuthStorage, a as McpManager, H as HookManager } from './project-q9WpahUs.cjs';
2
+ import { HarnessMode, HarnessSubagent, HeartbeatHandler, HarnessConfig, Harness } from '@mastra/core/harness';
3
+ import { RequestContext } from '@mastra/core/request-context';
4
+ import { MastraModelConfig, ModelRouterLanguageModel } from '@mastra/core/llm';
5
+ import { z } from 'zod';
6
+
7
+ /**
8
+ * Claude Max OAuth Provider
9
+ *
10
+ * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.
11
+ * The OAuth endpoint requires a specific system message to be present.
12
+ */
13
+
14
+ /**
15
+ * Creates an Anthropic model using Claude Max OAuth authentication
16
+ * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)
17
+ */
18
+ declare function opencodeClaudeMaxProvider(modelId?: string): MastraModelConfig;
19
+
20
+ /**
21
+ * OpenAI Codex OAuth Provider
22
+ *
23
+ * Uses OAuth tokens from AuthStorage to authenticate with ChatGPT Plus/Pro subscription.
24
+ * This allows access to OpenAI models through the ChatGPT OAuth flow.
25
+ *
26
+ * Inspired by opencode's Codex plugin implementation:
27
+ * https://github.com/sst/opencode/blob/main/packages/opencode/src/plugin/codex.ts
28
+ */
29
+
30
+ /** Valid thinking level values. */
31
+ type ThinkingLevel = 'off' | 'low' | 'medium' | 'high' | 'xhigh';
32
+ /**
33
+ * Creates an OpenAI model using ChatGPT OAuth authentication
34
+ * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)
35
+ *
36
+ * IMPORTANT: This uses the Codex API endpoint, not the standard OpenAI API.
37
+ * URLs are rewritten from /v1/responses or /chat/completions to the Codex endpoint.
38
+ */
39
+ declare function openaiCodexProvider(modelId?: string, options?: {
40
+ thinkingLevel?: ThinkingLevel;
41
+ }): MastraModelConfig;
42
+
43
+ type ResolvedModel = MastraModelConfig | ReturnType<typeof openaiCodexProvider> | ReturnType<typeof opencodeClaudeMaxProvider> | ModelRouterLanguageModel;
44
+ /**
45
+ * Resolve a model ID to the correct provider instance.
46
+ * Shared by the main agent, observer, and reflector.
47
+ *
48
+ * - For anthropic/* models: Uses stored OAuth credentials when present, otherwise direct API key
49
+ * - For openai/* models: Uses OAuth when configured, otherwise direct API key from AuthStorage
50
+ * - For google/* models: Uses stored API key when present, otherwise the model router
51
+ * - For moonshotai/* models: Uses Moonshot AI Anthropic-compatible endpoint
52
+ * - For all other providers: Uses Mastra's model router (models.dev gateway)
53
+ */
54
+ declare function resolveModel(modelId: string, options?: {
55
+ thinkingLevel?: ThinkingLevel;
56
+ remapForCodexOAuth?: boolean;
57
+ }): ResolvedModel;
58
+
59
+ declare const stateSchema: z.ZodObject<{
60
+ projectPath: z.ZodOptional<z.ZodString>;
61
+ projectName: z.ZodOptional<z.ZodString>;
62
+ gitBranch: z.ZodOptional<z.ZodString>;
63
+ lastCommand: z.ZodOptional<z.ZodString>;
64
+ currentModelId: z.ZodDefault<z.ZodString>;
65
+ subagentModelId: z.ZodOptional<z.ZodString>;
66
+ observerModelId: z.ZodDefault<z.ZodString>;
67
+ reflectorModelId: z.ZodDefault<z.ZodString>;
68
+ observationThreshold: z.ZodDefault<z.ZodNumber>;
69
+ reflectionThreshold: z.ZodDefault<z.ZodNumber>;
70
+ omScope: z.ZodOptional<z.ZodEnum<{
71
+ thread: "thread";
72
+ resource: "resource";
73
+ }>>;
74
+ thinkingLevel: z.ZodDefault<z.ZodEnum<{
75
+ off: "off";
76
+ low: "low";
77
+ medium: "medium";
78
+ high: "high";
79
+ xhigh: "xhigh";
80
+ }>>;
81
+ yolo: z.ZodDefault<z.ZodBoolean>;
82
+ permissionRules: z.ZodDefault<z.ZodObject<{
83
+ categories: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<{
84
+ allow: "allow";
85
+ ask: "ask";
86
+ deny: "deny";
87
+ }>>>;
88
+ tools: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<{
89
+ allow: "allow";
90
+ ask: "ask";
91
+ deny: "deny";
92
+ }>>>;
93
+ }, z.core.$strip>>;
94
+ smartEditing: z.ZodDefault<z.ZodBoolean>;
95
+ notifications: z.ZodDefault<z.ZodEnum<{
96
+ off: "off";
97
+ bell: "bell";
98
+ system: "system";
99
+ both: "both";
100
+ }>>;
101
+ tasks: z.ZodDefault<z.ZodArray<z.ZodObject<{
102
+ content: z.ZodString;
103
+ status: z.ZodEnum<{
104
+ pending: "pending";
105
+ in_progress: "in_progress";
106
+ completed: "completed";
107
+ }>;
108
+ activeForm: z.ZodString;
109
+ }, z.core.$strip>>>;
110
+ sandboxAllowedPaths: z.ZodDefault<z.ZodArray<z.ZodString>>;
111
+ activePlan: z.ZodDefault<z.ZodNullable<z.ZodObject<{
112
+ title: z.ZodString;
113
+ plan: z.ZodString;
114
+ approvedAt: z.ZodString;
115
+ }, z.core.$strip>>>;
116
+ }, z.core.$strip>;
117
+ type MastraCodeState = z.infer<typeof stateSchema>;
118
+
119
+ interface MastraCodeConfig {
120
+ /** Working directory for project detection. Default: process.cwd() */
121
+ cwd?: string;
122
+ /** Override modes (model IDs, colors, which modes exist). Default: build/plan/fast */
123
+ modes?: HarnessMode<MastraCodeState>[];
124
+ /** Override or extend subagent definitions. Default: explore/plan/execute */
125
+ subagents?: HarnessSubagent[];
126
+ /** Extra tools merged into the dynamic tool set. Can be a static record or a function that receives requestContext. */
127
+ extraTools?: Record<string, {
128
+ execute?: (input: unknown, context?: unknown) => Promise<unknown> | unknown;
129
+ [key: string]: unknown;
130
+ }> | ((ctx: {
131
+ requestContext: RequestContext;
132
+ }) => Record<string, {
133
+ execute?: (input: unknown, context?: unknown) => Promise<unknown> | unknown;
134
+ [key: string]: unknown;
135
+ }>);
136
+ /** Tools removed from the dynamic tool set before exposure to the model */
137
+ disabledTools?: string[];
138
+ /** Custom storage config instead of auto-detected default */
139
+ storage?: StorageConfig;
140
+ /** Observational memory scope. Default: auto-detected from env/config files, falls back to 'thread' */
141
+ omScope?: 'thread' | 'resource';
142
+ /** Initial state overrides (yolo, thinkingLevel, etc.) */
143
+ initialState?: Record<string, unknown>;
144
+ /** Override heartbeat handlers. Default: gateway-sync */
145
+ heartbeatHandlers?: HeartbeatHandler[];
146
+ /** Override the workspace. Default: local filesystem + local sandbox based on detected project */
147
+ workspace?: HarnessConfig<MastraCodeState>['workspace'];
148
+ /** Programmatic MCP server configurations, merged with (and overriding) file-based configs. */
149
+ mcpServers?: Record<string, McpServerConfig>;
150
+ /** Disable MCP server discovery. Default: false */
151
+ disableMcp?: boolean;
152
+ /** Disable hooks. Default: false */
153
+ disableHooks?: boolean;
154
+ }
155
+ declare function createAuthStorage(): AuthStorage;
156
+ declare function createMastraCode(config?: MastraCodeConfig): Promise<{
157
+ harness: Harness<any>;
158
+ mcpManager: McpManager | undefined;
159
+ hookManager: HookManager | undefined;
160
+ authStorage: AuthStorage;
161
+ resolveModel: typeof resolveModel;
162
+ storageWarning: string | undefined;
163
+ }>;
164
+
165
+ export { type MastraCodeConfig, createAuthStorage, createMastraCode };