@markusylisiurunen/tau 0.2.38 → 0.2.40

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 (36) hide show
  1. package/README.md +63 -2
  2. package/dist/core/async/cli.js +508 -0
  3. package/dist/core/async/cli.js.map +1 -0
  4. package/dist/core/async/http_protocol.js +60 -0
  5. package/dist/core/async/http_protocol.js.map +1 -0
  6. package/dist/core/async/http_server.js +260 -0
  7. package/dist/core/async/http_server.js.map +1 -0
  8. package/dist/core/async/index.js +8 -0
  9. package/dist/core/async/index.js.map +1 -0
  10. package/dist/core/async/server_config.js +282 -0
  11. package/dist/core/async/server_config.js.map +1 -0
  12. package/dist/core/async/session_manager.js +431 -0
  13. package/dist/core/async/session_manager.js.map +1 -0
  14. package/dist/core/async/telegram.js +560 -0
  15. package/dist/core/async/telegram.js.map +1 -0
  16. package/dist/core/async/workspace.js +90 -0
  17. package/dist/core/async/workspace.js.map +1 -0
  18. package/dist/core/cli.js +2 -0
  19. package/dist/core/cli.js.map +1 -1
  20. package/dist/core/config/index.js.map +1 -1
  21. package/dist/core/config/schema.js +199 -0
  22. package/dist/core/config/schema.js.map +1 -1
  23. package/dist/core/index.js +1 -0
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/core/platform_support.js +7 -0
  26. package/dist/core/platform_support.js.map +1 -0
  27. package/dist/core/utils/type_guards.js +4 -0
  28. package/dist/core/utils/type_guards.js.map +1 -0
  29. package/dist/core/version.js +1 -1
  30. package/dist/main.js +30 -1
  31. package/dist/main.js.map +1 -1
  32. package/dist/starter/prompts/plan.md +1 -53
  33. package/dist/starter/skills/plan/SKILL.md +53 -0
  34. package/dist/tui/clipboard.js +81 -8
  35. package/dist/tui/clipboard.js.map +1 -1
  36. package/package.json +2 -1
@@ -0,0 +1,560 @@
1
+ import { Api } from "grammy";
2
+ import { isRecord } from "../utils/type_guards.js";
3
+ import { AsyncSessionManagerError, } from "./session_manager.js";
4
+ const DEFAULT_POLL_INTERVAL_MS = 1000;
5
+ const DEFAULT_REQUEST_TIMEOUT_SECONDS = 30;
6
+ const MAX_COMMAND_PREVIEW_CHARS = 280;
7
+ const MAX_ASSISTANT_PREVIEW_CHARS = 1000;
8
+ const ABORTED = Symbol("aborted");
9
+ const TELEGRAM_COMMANDS = [
10
+ { command: "new", description: "start a new session" },
11
+ { command: "use", description: "switch active session" },
12
+ { command: "list", description: "list sessions" },
13
+ { command: "status", description: "show active session status" },
14
+ { command: "cancel", description: "cancel active session" },
15
+ ];
16
+ function splitCommandText(text) {
17
+ return text
18
+ .trim()
19
+ .split(/\s+/)
20
+ .map((part) => part.trim())
21
+ .filter(Boolean);
22
+ }
23
+ function stripCommandMention(command) {
24
+ const mentionIndex = command.indexOf("@");
25
+ if (mentionIndex === -1) {
26
+ return command;
27
+ }
28
+ return command.slice(0, mentionIndex);
29
+ }
30
+ function truncateText(text, maxChars) {
31
+ const trimmed = text.trim();
32
+ if (trimmed.length <= maxChars) {
33
+ return trimmed;
34
+ }
35
+ if (maxChars <= 1) {
36
+ return "…";
37
+ }
38
+ return `${trimmed.slice(0, maxChars - 1)}…`;
39
+ }
40
+ function describeSession(session, details = {}) {
41
+ return [
42
+ `session: ${session.id}`,
43
+ `project: ${session.projectId}`,
44
+ `state: ${session.state}`,
45
+ ...(session.error ? [`error: ${session.error}`] : []),
46
+ ...(details.lastCommand
47
+ ? [`last command: ${truncateText(details.lastCommand, MAX_COMMAND_PREVIEW_CHARS)}`]
48
+ : []),
49
+ ...(details.lastAssistantMessage
50
+ ? [
51
+ "last assistant message:",
52
+ truncateText(details.lastAssistantMessage, MAX_ASSISTANT_PREVIEW_CHARS),
53
+ ]
54
+ : []),
55
+ ].join("\n");
56
+ }
57
+ function createGrammyApi(botToken) {
58
+ const api = new Api(botToken);
59
+ return {
60
+ async getUpdates(args) {
61
+ const updates = await api.getUpdates({
62
+ offset: args.offset,
63
+ timeout: args.timeoutSeconds,
64
+ allowed_updates: args.allowedUpdates,
65
+ });
66
+ return updates;
67
+ },
68
+ async sendMessage(chatId, text) {
69
+ await api.sendMessage(chatId, text);
70
+ },
71
+ async setCommands(commands) {
72
+ await api.setMyCommands(commands);
73
+ },
74
+ };
75
+ }
76
+ class AsyncTelegramAdapterImpl {
77
+ projects;
78
+ defaultProjectId;
79
+ allowedUserIds;
80
+ allowedChatIds;
81
+ pollIntervalMs;
82
+ requestTimeoutSeconds;
83
+ sessionManager;
84
+ api;
85
+ onLog;
86
+ abortController = new AbortController();
87
+ activeSessionsByChat = new Map();
88
+ chatsBySession = new Map();
89
+ lastCommandBySession = new Map();
90
+ lastAssistantMessageBySession = new Map();
91
+ unsubscribeSessionEvents;
92
+ loopPromise;
93
+ nextUpdateOffset = 0;
94
+ closed = false;
95
+ constructor(options) {
96
+ this.projects = options.projects;
97
+ this.defaultProjectId = options.defaultProjectId;
98
+ this.allowedUserIds =
99
+ options.allowedUserIds && options.allowedUserIds.length > 0
100
+ ? new Set(options.allowedUserIds)
101
+ : undefined;
102
+ this.allowedChatIds =
103
+ options.allowedChatIds && options.allowedChatIds.length > 0
104
+ ? new Set(options.allowedChatIds)
105
+ : undefined;
106
+ this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
107
+ this.requestTimeoutSeconds = options.requestTimeoutSeconds ?? DEFAULT_REQUEST_TIMEOUT_SECONDS;
108
+ this.sessionManager = options.sessionManager;
109
+ this.api = options.api ?? createGrammyApi(options.botToken);
110
+ this.onLog = options.onLog;
111
+ this.unsubscribeSessionEvents = this.sessionManager.onEvent((event) => {
112
+ this.onSessionEvent(event);
113
+ });
114
+ void this.syncCommands();
115
+ this.loopPromise = this.runLoop();
116
+ this.log("info", "telegram adapter started", {
117
+ pollIntervalMs: this.pollIntervalMs,
118
+ requestTimeoutSeconds: this.requestTimeoutSeconds,
119
+ });
120
+ }
121
+ async close() {
122
+ if (this.closed) {
123
+ return;
124
+ }
125
+ this.closed = true;
126
+ this.abortController.abort();
127
+ this.unsubscribeSessionEvents();
128
+ try {
129
+ await this.loopPromise;
130
+ }
131
+ finally {
132
+ this.log("info", "telegram adapter stopped");
133
+ }
134
+ }
135
+ log(level, message, data) {
136
+ this.onLog?.({ level, message, ...(data === undefined ? {} : { data }) });
137
+ }
138
+ async syncCommands() {
139
+ if (!this.api.setCommands) {
140
+ return;
141
+ }
142
+ try {
143
+ await this.api.setCommands(TELEGRAM_COMMANDS);
144
+ this.log("info", "telegram commands synced", { count: TELEGRAM_COMMANDS.length });
145
+ }
146
+ catch (error) {
147
+ this.log("warn", "failed to sync telegram commands", {
148
+ cause: error instanceof Error ? error.message : String(error),
149
+ });
150
+ }
151
+ }
152
+ async runLoop() {
153
+ while (!this.abortController.signal.aborted) {
154
+ try {
155
+ const updates = await this.getUpdates();
156
+ for (const update of updates) {
157
+ if (this.abortController.signal.aborted) {
158
+ return;
159
+ }
160
+ const updateId = update.update_id;
161
+ if (typeof updateId === "number" && Number.isFinite(updateId)) {
162
+ this.nextUpdateOffset = Math.max(this.nextUpdateOffset, updateId + 1);
163
+ }
164
+ await this.handleUpdate(update);
165
+ }
166
+ }
167
+ catch (error) {
168
+ if (this.abortController.signal.aborted) {
169
+ return;
170
+ }
171
+ this.log("warn", "telegram poll failed", {
172
+ cause: error instanceof Error ? error.message : String(error),
173
+ });
174
+ await this.wait(this.pollIntervalMs);
175
+ }
176
+ }
177
+ }
178
+ async getUpdates() {
179
+ const updates = await this.raceWithAbort(this.api.getUpdates({
180
+ offset: this.nextUpdateOffset,
181
+ timeoutSeconds: this.requestTimeoutSeconds,
182
+ allowedUpdates: ["message"],
183
+ }));
184
+ if (updates === undefined) {
185
+ return [];
186
+ }
187
+ return updates.filter((entry) => isRecord(entry));
188
+ }
189
+ async raceWithAbort(promise) {
190
+ if (this.abortController.signal.aborted) {
191
+ return undefined;
192
+ }
193
+ let abortListener;
194
+ const abortPromise = new Promise((resolve) => {
195
+ abortListener = () => resolve(ABORTED);
196
+ this.abortController.signal.addEventListener("abort", abortListener, { once: true });
197
+ });
198
+ const settled = promise.then((value) => ({ ok: true, value }), (error) => ({ ok: false, error }));
199
+ const raceResult = await Promise.race([settled, abortPromise]);
200
+ if (abortListener) {
201
+ this.abortController.signal.removeEventListener("abort", abortListener);
202
+ }
203
+ if (raceResult === ABORTED) {
204
+ return undefined;
205
+ }
206
+ if (!raceResult.ok) {
207
+ throw raceResult.error;
208
+ }
209
+ return raceResult.value;
210
+ }
211
+ async handleUpdate(update) {
212
+ const message = update.message;
213
+ if (!message) {
214
+ return;
215
+ }
216
+ const chat = message.chat;
217
+ if (!chat || chat.type !== "private") {
218
+ return;
219
+ }
220
+ const chatId = chat.id;
221
+ if (!this.isChatAllowed(chatId)) {
222
+ return;
223
+ }
224
+ const userId = message.from?.id;
225
+ if (!this.isUserAllowed(userId)) {
226
+ return;
227
+ }
228
+ const text = typeof message.text === "string" ? message.text.trim() : "";
229
+ if (!text) {
230
+ return;
231
+ }
232
+ if (text.startsWith("/")) {
233
+ await this.handleCommand(chatId, text);
234
+ return;
235
+ }
236
+ await this.handleMessage(chatId, text);
237
+ }
238
+ isChatAllowed(chatId) {
239
+ if (!this.allowedChatIds) {
240
+ return true;
241
+ }
242
+ return this.allowedChatIds.has(chatId);
243
+ }
244
+ isUserAllowed(userId) {
245
+ if (!this.allowedUserIds) {
246
+ return true;
247
+ }
248
+ if (typeof userId !== "number") {
249
+ return false;
250
+ }
251
+ return this.allowedUserIds.has(userId);
252
+ }
253
+ async handleCommand(chatId, text) {
254
+ const parts = splitCommandText(text);
255
+ const command = stripCommandMention(parts[0] ?? "");
256
+ const args = parts.slice(1);
257
+ if (command === "/new") {
258
+ await this.handleNew(chatId, args);
259
+ return;
260
+ }
261
+ if (command === "/use") {
262
+ await this.handleUse(chatId, args);
263
+ return;
264
+ }
265
+ if (command === "/list") {
266
+ await this.handleList(chatId);
267
+ return;
268
+ }
269
+ if (command === "/status") {
270
+ await this.handleStatus(chatId);
271
+ return;
272
+ }
273
+ if (command === "/cancel") {
274
+ await this.handleCancel(chatId);
275
+ return;
276
+ }
277
+ await this.reply(chatId, "supported commands: /new, /use, /list, /status, /cancel");
278
+ }
279
+ resolveNewCommand(args) {
280
+ const projectIds = Object.keys(this.projects);
281
+ const resolveFallbackProjectId = () => {
282
+ if (this.defaultProjectId) {
283
+ if (!this.projects[this.defaultProjectId]) {
284
+ return {
285
+ error: `async.server.telegram.defaultProjectId '${this.defaultProjectId}' is not configured`,
286
+ };
287
+ }
288
+ return { projectId: this.defaultProjectId };
289
+ }
290
+ if (projectIds.length === 1) {
291
+ return { projectId: projectIds[0] };
292
+ }
293
+ if (projectIds.length === 0) {
294
+ return { error: "no async projects configured" };
295
+ }
296
+ return { error: "missing project id. usage: /new [projectId]" };
297
+ };
298
+ if (args.length > 1) {
299
+ return { error: "usage: /new [projectId]" };
300
+ }
301
+ if (args.length === 1) {
302
+ const projectId = args[0];
303
+ if (!projectId) {
304
+ return { error: "usage: /new [projectId]" };
305
+ }
306
+ if (!this.projects[projectId]) {
307
+ return {
308
+ error: `unknown project '${projectId}'. usage: /new [projectId]`,
309
+ };
310
+ }
311
+ return { projectId };
312
+ }
313
+ const fallback = resolveFallbackProjectId();
314
+ if (!fallback.projectId) {
315
+ return {
316
+ error: fallback.error ?? "unable to resolve project id",
317
+ };
318
+ }
319
+ return {
320
+ projectId: fallback.projectId,
321
+ };
322
+ }
323
+ async handleNew(chatId, args) {
324
+ const parsed = this.resolveNewCommand(args);
325
+ if ("error" in parsed) {
326
+ await this.reply(chatId, parsed.error);
327
+ return;
328
+ }
329
+ try {
330
+ const session = await this.sessionManager.createSession({
331
+ projectId: parsed.projectId,
332
+ });
333
+ this.setActiveSession(chatId, session.id);
334
+ await this.reply(chatId, this.formatSessionPreparing(session.projectId));
335
+ }
336
+ catch (error) {
337
+ await this.reply(chatId, this.formatManagerError(error));
338
+ }
339
+ }
340
+ async handleUse(chatId, args) {
341
+ const sessionId = args[0]?.trim();
342
+ if (!sessionId) {
343
+ await this.reply(chatId, "usage: /use <sessionId>");
344
+ return;
345
+ }
346
+ const session = this.sessionManager.getSession(sessionId);
347
+ if (!session) {
348
+ await this.reply(chatId, `session '${sessionId}' not found`);
349
+ return;
350
+ }
351
+ this.setActiveSession(chatId, sessionId);
352
+ await this.reply(chatId, `using session ${session.id} (${session.state})`);
353
+ }
354
+ async handleList(chatId) {
355
+ const sessions = this.sessionManager.listSessions();
356
+ if (sessions.length === 0) {
357
+ await this.reply(chatId, "no sessions");
358
+ return;
359
+ }
360
+ const activeSessionId = this.activeSessionsByChat.get(chatId);
361
+ const lines = sessions.map((session) => {
362
+ const marker = session.id === activeSessionId ? "* " : "";
363
+ return `${marker}${session.id} ${session.projectId} ${session.state}`;
364
+ });
365
+ await this.reply(chatId, lines.join("\n"));
366
+ }
367
+ async handleStatus(chatId) {
368
+ const session = this.getActiveSession(chatId);
369
+ if (!session) {
370
+ await this.reply(chatId, "no active session. use /new or /use <sessionId>");
371
+ return;
372
+ }
373
+ await this.reply(chatId, describeSession(session, {
374
+ lastCommand: this.lastCommandBySession.get(session.id),
375
+ lastAssistantMessage: this.lastAssistantMessageBySession.get(session.id),
376
+ }));
377
+ }
378
+ async handleCancel(chatId) {
379
+ const session = this.getActiveSession(chatId);
380
+ if (!session) {
381
+ await this.reply(chatId, "no active session. use /new or /use <sessionId>");
382
+ return;
383
+ }
384
+ try {
385
+ const canceled = await this.sessionManager.cancelSession(session.id);
386
+ await this.reply(chatId, `canceled: ${canceled.id}`);
387
+ }
388
+ catch (error) {
389
+ await this.reply(chatId, this.formatManagerError(error));
390
+ }
391
+ }
392
+ async handleMessage(chatId, text) {
393
+ const session = this.getActiveSession(chatId);
394
+ if (!session) {
395
+ await this.reply(chatId, "no active session. use /new or /use <sessionId>");
396
+ return;
397
+ }
398
+ try {
399
+ await this.sessionManager.sendMessage(session.id, text);
400
+ await this.reply(chatId, this.formatMessageQueued(session.id));
401
+ }
402
+ catch (error) {
403
+ await this.reply(chatId, this.formatManagerError(error));
404
+ }
405
+ }
406
+ getActiveSession(chatId) {
407
+ const sessionId = this.activeSessionsByChat.get(chatId);
408
+ if (!sessionId) {
409
+ return undefined;
410
+ }
411
+ const session = this.sessionManager.getSession(sessionId);
412
+ if (!session) {
413
+ this.clearActiveSession(chatId);
414
+ return undefined;
415
+ }
416
+ return session;
417
+ }
418
+ setActiveSession(chatId, sessionId) {
419
+ const currentSessionId = this.activeSessionsByChat.get(chatId);
420
+ if (currentSessionId && currentSessionId !== sessionId) {
421
+ const currentChats = this.chatsBySession.get(currentSessionId);
422
+ currentChats?.delete(chatId);
423
+ if (currentChats && currentChats.size === 0) {
424
+ this.chatsBySession.delete(currentSessionId);
425
+ }
426
+ }
427
+ this.activeSessionsByChat.set(chatId, sessionId);
428
+ const chats = this.chatsBySession.get(sessionId) ?? new Set();
429
+ chats.add(chatId);
430
+ this.chatsBySession.set(sessionId, chats);
431
+ }
432
+ clearActiveSession(chatId) {
433
+ const sessionId = this.activeSessionsByChat.get(chatId);
434
+ if (!sessionId) {
435
+ return;
436
+ }
437
+ this.activeSessionsByChat.delete(chatId);
438
+ const chats = this.chatsBySession.get(sessionId);
439
+ if (!chats) {
440
+ return;
441
+ }
442
+ chats.delete(chatId);
443
+ if (chats.size === 0) {
444
+ this.chatsBySession.delete(sessionId);
445
+ }
446
+ }
447
+ onSessionEvent(event) {
448
+ if (event.type === "session-progress") {
449
+ this.handleSessionProgress(event);
450
+ return;
451
+ }
452
+ if (event.type !== "session-state-changed") {
453
+ return;
454
+ }
455
+ if (event.state === "running") {
456
+ this.notifyLifecycle(event.sessionId, event.projectId, "started");
457
+ return;
458
+ }
459
+ if (event.state === "failed") {
460
+ this.notifyLifecycle(event.sessionId, event.projectId, "failed");
461
+ return;
462
+ }
463
+ if (event.state === "canceled") {
464
+ this.notifyLifecycle(event.sessionId, event.projectId, "canceled");
465
+ return;
466
+ }
467
+ if (event.state === "waiting-input" && event.previousState === "preparing-workspace") {
468
+ this.notifySession(event.sessionId, this.formatSessionReady(event.sessionId, event.projectId));
469
+ return;
470
+ }
471
+ if (event.state === "waiting-input" && event.previousState === "running") {
472
+ this.notifyLifecycle(event.sessionId, event.projectId, "finished");
473
+ }
474
+ }
475
+ handleSessionProgress(event) {
476
+ if (event.progress.type === "bash-command") {
477
+ this.lastCommandBySession.set(event.sessionId, event.progress.command);
478
+ this.notifySession(event.sessionId, [
479
+ "running command",
480
+ `session: ${event.sessionId}`,
481
+ `$ ${truncateText(event.progress.command, MAX_COMMAND_PREVIEW_CHARS)}`,
482
+ ].join("\n"));
483
+ return;
484
+ }
485
+ this.lastAssistantMessageBySession.set(event.sessionId, event.progress.text);
486
+ this.notifySession(event.sessionId, [
487
+ "assistant message",
488
+ `session: ${event.sessionId}`,
489
+ truncateText(event.progress.text, MAX_ASSISTANT_PREVIEW_CHARS),
490
+ ].join("\n"));
491
+ }
492
+ notifyLifecycle(sessionId, projectId, state) {
493
+ const stateLabel = {
494
+ started: "run started",
495
+ finished: "run finished",
496
+ failed: "run failed",
497
+ canceled: "run canceled",
498
+ }[state];
499
+ this.notifySession(sessionId, [stateLabel, `session: ${sessionId}`, `project: ${projectId}`].join("\n"));
500
+ }
501
+ notifySession(sessionId, text) {
502
+ const chatIds = this.chatsBySession.get(sessionId);
503
+ if (!chatIds || chatIds.size === 0) {
504
+ return;
505
+ }
506
+ for (const chatId of chatIds) {
507
+ void this.reply(chatId, text);
508
+ }
509
+ }
510
+ formatSessionPreparing(projectId) {
511
+ return ["session is being prepared", `project: ${projectId}`].join("\n");
512
+ }
513
+ formatSessionReady(sessionId, projectId) {
514
+ return ["session is ready", `session: ${sessionId}`, `project: ${projectId}`].join("\n");
515
+ }
516
+ formatMessageQueued(sessionId) {
517
+ return ["message queued", `session: ${sessionId}`].join("\n");
518
+ }
519
+ formatManagerError(error) {
520
+ if (error instanceof AsyncSessionManagerError) {
521
+ return error.message;
522
+ }
523
+ return error instanceof Error ? error.message : String(error);
524
+ }
525
+ async reply(chatId, text) {
526
+ try {
527
+ await this.api.sendMessage(chatId, text);
528
+ }
529
+ catch (error) {
530
+ this.log("warn", "failed to send telegram message", {
531
+ chatId,
532
+ cause: error instanceof Error ? error.message : String(error),
533
+ });
534
+ }
535
+ }
536
+ async wait(durationMs) {
537
+ if (durationMs <= 0 || this.abortController.signal.aborted) {
538
+ return;
539
+ }
540
+ await new Promise((resolve) => {
541
+ const timeout = setTimeout(() => {
542
+ this.abortController.signal.removeEventListener("abort", onAbort);
543
+ resolve();
544
+ }, durationMs);
545
+ timeout.unref?.();
546
+ const onAbort = () => {
547
+ clearTimeout(timeout);
548
+ resolve();
549
+ };
550
+ this.abortController.signal.addEventListener("abort", onAbort, { once: true });
551
+ });
552
+ }
553
+ }
554
+ export async function startAsyncTelegramAdapter(options) {
555
+ const adapter = new AsyncTelegramAdapterImpl(options);
556
+ return {
557
+ close: () => adapter.close(),
558
+ };
559
+ }
560
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/core/async/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { mkdir, rm } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { spawnWithCapture } from "../utils/spawn_capture.js";
4
+ function log(onLog, level, message, data) {
5
+ onLog?.({ level, message, ...(data === undefined ? {} : { data }) });
6
+ }
7
+ async function runCommand(args) {
8
+ const result = await spawnWithCapture(args.command, args.commandArgs, {
9
+ cwd: args.cwd,
10
+ signal: args.signal,
11
+ captureOutput: "combined",
12
+ maxCaptureBytes: 1024 * 1024,
13
+ });
14
+ return {
15
+ output: result.output ?? "",
16
+ exitCode: result.exitCode,
17
+ };
18
+ }
19
+ async function runShellCommand(args) {
20
+ const result = await spawnWithCapture(args.command, [], {
21
+ cwd: args.cwd,
22
+ signal: args.signal,
23
+ shell: true,
24
+ captureOutput: "combined",
25
+ maxCaptureBytes: 1024 * 1024,
26
+ });
27
+ return {
28
+ output: result.output ?? "",
29
+ exitCode: result.exitCode,
30
+ };
31
+ }
32
+ export async function prepareWorkspace(options) {
33
+ const workspacePath = join(resolve(options.workspaceRoot), options.projectId, options.sessionId);
34
+ await rm(workspacePath, { recursive: true, force: true });
35
+ await mkdir(dirname(workspacePath), { recursive: true });
36
+ log(options.onLog, "info", "cloning repository", {
37
+ repo: options.project.repo,
38
+ workspacePath,
39
+ });
40
+ const cloneResult = await runCommand({
41
+ command: "gh",
42
+ commandArgs: ["repo", "clone", options.project.repo, workspacePath],
43
+ signal: options.signal,
44
+ });
45
+ if (cloneResult.exitCode !== 0) {
46
+ log(options.onLog, "error", "gh repo clone failed", { output: cloneResult.output });
47
+ throw new Error(`gh repo clone failed with exit code ${cloneResult.exitCode ?? "unknown"}`);
48
+ }
49
+ if (cloneResult.output.trim()) {
50
+ log(options.onLog, "info", "gh repo clone output", { output: cloneResult.output });
51
+ }
52
+ if (options.project.ref) {
53
+ log(options.onLog, "info", "checking out ref", { ref: options.project.ref });
54
+ const checkoutResult = await runCommand({
55
+ command: "git",
56
+ commandArgs: ["-C", workspacePath, "checkout", options.project.ref],
57
+ signal: options.signal,
58
+ });
59
+ if (checkoutResult.exitCode !== 0) {
60
+ log(options.onLog, "error", "git checkout failed", { output: checkoutResult.output });
61
+ throw new Error(`git checkout failed with exit code ${checkoutResult.exitCode ?? "unknown"}`);
62
+ }
63
+ if (checkoutResult.output.trim()) {
64
+ log(options.onLog, "info", "git checkout output", { output: checkoutResult.output });
65
+ }
66
+ }
67
+ for (const command of options.project.bootstrapCommands ?? []) {
68
+ log(options.onLog, "info", "running bootstrap command", { command });
69
+ const bootstrapResult = await runShellCommand({
70
+ command,
71
+ cwd: workspacePath,
72
+ signal: options.signal,
73
+ });
74
+ if (bootstrapResult.output.trim()) {
75
+ log(options.onLog, "info", "bootstrap output", {
76
+ command,
77
+ output: bootstrapResult.output,
78
+ });
79
+ }
80
+ if (bootstrapResult.exitCode !== 0) {
81
+ log(options.onLog, "error", "bootstrap command failed", {
82
+ command,
83
+ output: bootstrapResult.output,
84
+ });
85
+ throw new Error(`bootstrap command failed with exit code ${bootstrapResult.exitCode ?? "unknown"}`);
86
+ }
87
+ }
88
+ return { workspacePath };
89
+ }
90
+ //# sourceMappingURL=workspace.js.map