@markusylisiurunen/tau 0.2.38 → 0.2.39

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.
@@ -0,0 +1,373 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { createTauSdkClient } from "../../sdk/client.js";
4
+ import { prepareWorkspace } from "./workspace.js";
5
+ export class AsyncSessionManagerError extends Error {
6
+ code;
7
+ constructor(code, message) {
8
+ super(message);
9
+ this.name = "AsyncSessionManagerError";
10
+ this.code = code;
11
+ }
12
+ }
13
+ class AsyncSessionManagerImpl {
14
+ sessions = new Map();
15
+ listeners = new Set();
16
+ projects;
17
+ workspaceRoot;
18
+ maxSessions;
19
+ now;
20
+ createClient;
21
+ prepareWorkspace;
22
+ closePromise;
23
+ constructor(options) {
24
+ this.projects = options.projects;
25
+ this.workspaceRoot = resolve(options.workspaceRoot ?? resolve(process.cwd(), ".tau/async-workspaces"));
26
+ this.maxSessions = options.maxSessions;
27
+ this.now = options.now ?? (() => new Date());
28
+ this.createClient = options.createClient ?? createTauSdkClient;
29
+ this.prepareWorkspace = options.prepareWorkspace ?? prepareWorkspace;
30
+ }
31
+ async createSession(input) {
32
+ const project = this.projects[input.projectId];
33
+ if (!project) {
34
+ throw new AsyncSessionManagerError("invalid_project", `unknown async project '${input.projectId}'`);
35
+ }
36
+ if (this.maxSessions !== undefined && this.countActiveSessions() >= this.maxSessions) {
37
+ throw new AsyncSessionManagerError("max_sessions", "maximum session count reached");
38
+ }
39
+ const id = randomUUID();
40
+ const now = this.now().toISOString();
41
+ const entry = {
42
+ record: {
43
+ id,
44
+ projectId: input.projectId,
45
+ state: "queued",
46
+ createdAt: now,
47
+ updatedAt: now,
48
+ },
49
+ logs: [],
50
+ project,
51
+ abortController: new AbortController(),
52
+ cancelRequested: false,
53
+ };
54
+ this.sessions.set(id, entry);
55
+ this.log(entry, "info", "session queued");
56
+ this.emit({
57
+ type: "session-created",
58
+ session: this.toRecord(entry),
59
+ });
60
+ let initializePromise;
61
+ initializePromise = this.initializeSession(entry, input.prompt).finally(() => {
62
+ if (entry.initializePromise === initializePromise) {
63
+ entry.initializePromise = undefined;
64
+ }
65
+ });
66
+ entry.initializePromise = initializePromise;
67
+ return this.toRecord(entry);
68
+ }
69
+ listSessions() {
70
+ return Array.from(this.sessions.values()).map((entry) => this.toRecord(entry));
71
+ }
72
+ getSession(sessionId) {
73
+ const entry = this.sessions.get(sessionId);
74
+ return entry ? this.toRecord(entry) : undefined;
75
+ }
76
+ getLogs(sessionId) {
77
+ const entry = this.sessions.get(sessionId);
78
+ if (!entry) {
79
+ return undefined;
80
+ }
81
+ return entry.logs.map((logEntry) => ({ ...logEntry }));
82
+ }
83
+ onEvent(listener) {
84
+ this.listeners.add(listener);
85
+ return () => {
86
+ this.listeners.delete(listener);
87
+ };
88
+ }
89
+ async sendMessage(sessionId, text) {
90
+ const entry = this.requireSession(sessionId);
91
+ const trimmed = text.trim();
92
+ if (!trimmed) {
93
+ throw new AsyncSessionManagerError("invalid_state", "message text cannot be empty");
94
+ }
95
+ if (entry.record.state === "running") {
96
+ throw new AsyncSessionManagerError("busy", "session is running");
97
+ }
98
+ if (entry.record.state === "failed" || entry.record.state === "canceled") {
99
+ throw new AsyncSessionManagerError("invalid_state", `cannot submit messages when session is ${entry.record.state}`);
100
+ }
101
+ if (!entry.client) {
102
+ throw new AsyncSessionManagerError("not_ready", "session is still preparing");
103
+ }
104
+ if (entry.activeSubmit) {
105
+ throw new AsyncSessionManagerError("busy", "session is running");
106
+ }
107
+ void this.submitText(entry, trimmed, "user-message");
108
+ return this.toRecord(entry);
109
+ }
110
+ async cancelSession(sessionId) {
111
+ const entry = this.requireSession(sessionId);
112
+ if (entry.record.state === "canceled" || entry.record.state === "failed") {
113
+ return this.toRecord(entry);
114
+ }
115
+ this.requestCancellation(entry, "cancel requested");
116
+ await this.stopClient(entry);
117
+ return this.toRecord(entry);
118
+ }
119
+ async close() {
120
+ if (this.closePromise) {
121
+ await this.closePromise;
122
+ return;
123
+ }
124
+ this.closePromise = this.closeAllSessions();
125
+ await this.closePromise;
126
+ }
127
+ async initializeSession(entry, prompt) {
128
+ try {
129
+ this.setState(entry, "preparing-workspace");
130
+ this.log(entry, "info", "preparing workspace", {
131
+ workspaceRoot: this.workspaceRoot,
132
+ });
133
+ const workspace = await this.prepareWorkspace({
134
+ sessionId: entry.record.id,
135
+ projectId: entry.record.projectId,
136
+ project: entry.project,
137
+ workspaceRoot: entry.project.workspaceRoot ?? this.workspaceRoot,
138
+ signal: entry.abortController.signal,
139
+ onLog: (workspaceLog) => {
140
+ this.log(entry, workspaceLog.level === "error" ? "error" : "info", workspaceLog.message, workspaceLog.data);
141
+ },
142
+ });
143
+ if (entry.cancelRequested) {
144
+ this.setState(entry, "canceled");
145
+ return;
146
+ }
147
+ entry.record.workspacePath = workspace.workspacePath;
148
+ this.touch(entry);
149
+ this.log(entry, "info", "workspace ready", { workspacePath: workspace.workspacePath });
150
+ const client = await this.createClient({
151
+ cwd: workspace.workspacePath,
152
+ ...(entry.project.persona ? { persona: entry.project.persona } : {}),
153
+ ...(entry.project.riskLevel ? { riskLevel: entry.project.riskLevel } : {}),
154
+ ...(entry.project.sandbox !== undefined ? { sandbox: entry.project.sandbox } : {}),
155
+ ...(entry.project.noAgentContextFiles !== undefined
156
+ ? { noAgentContextFiles: entry.project.noAgentContextFiles }
157
+ : {}),
158
+ });
159
+ if (entry.cancelRequested) {
160
+ entry.client = client;
161
+ await this.stopClient(entry);
162
+ this.setState(entry, "canceled");
163
+ return;
164
+ }
165
+ entry.client = client;
166
+ entry.record.rpcSessionId = client.ready.sessionId;
167
+ this.touch(entry);
168
+ this.log(entry, "info", "rpc client connected", { rpcSessionId: client.ready.sessionId });
169
+ if (prompt?.trim()) {
170
+ await this.submitText(entry, prompt.trim(), "initial-prompt");
171
+ }
172
+ if (!entry.cancelRequested && entry.record.state !== "failed") {
173
+ this.setState(entry, "waiting-input");
174
+ }
175
+ }
176
+ catch (error) {
177
+ if (entry.cancelRequested) {
178
+ this.setState(entry, "canceled");
179
+ return;
180
+ }
181
+ if (entry.record.state !== "failed") {
182
+ const message = error instanceof Error ? error.message : String(error);
183
+ entry.record.error = message;
184
+ this.setState(entry, "failed");
185
+ this.log(entry, "error", "session failed", { cause: message });
186
+ }
187
+ await this.stopClient(entry);
188
+ }
189
+ }
190
+ submitText(entry, text, source) {
191
+ if (!entry.client) {
192
+ throw new AsyncSessionManagerError("not_ready", "session is still preparing");
193
+ }
194
+ if (entry.activeSubmit) {
195
+ throw new AsyncSessionManagerError("busy", "session is running");
196
+ }
197
+ this.setState(entry, "running");
198
+ this.log(entry, "info", "submitting message", { source, text });
199
+ const client = entry.client;
200
+ const submitPromise = (async () => {
201
+ try {
202
+ const result = await client.submit(text);
203
+ this.log(entry, "info", "message finished", {
204
+ source,
205
+ aborted: result.turn.aborted,
206
+ userHistoryEntryId: result.userHistoryEntryId,
207
+ });
208
+ if (!entry.cancelRequested) {
209
+ this.setState(entry, "waiting-input");
210
+ }
211
+ }
212
+ catch (error) {
213
+ if (!entry.cancelRequested) {
214
+ const message = error instanceof Error ? error.message : String(error);
215
+ entry.record.error = message;
216
+ this.setState(entry, "failed");
217
+ this.log(entry, "error", "submit failed", { source, cause: message });
218
+ await this.stopClient(entry);
219
+ }
220
+ }
221
+ })();
222
+ entry.activeSubmit = submitPromise;
223
+ void submitPromise.finally(() => {
224
+ if (entry.activeSubmit === submitPromise) {
225
+ entry.activeSubmit = undefined;
226
+ }
227
+ });
228
+ return submitPromise;
229
+ }
230
+ async closeAllSessions() {
231
+ const entries = Array.from(this.sessions.values());
232
+ for (const entry of entries) {
233
+ if (this.isActiveState(entry.record.state)) {
234
+ this.requestCancellation(entry, "manager shutdown requested");
235
+ }
236
+ }
237
+ await Promise.allSettled(entries.map(async (entry) => {
238
+ await this.stopClient(entry);
239
+ const pendingWork = [entry.activeSubmit, entry.initializePromise].filter((promise) => promise !== undefined);
240
+ if (pendingWork.length > 0) {
241
+ await Promise.allSettled(pendingWork);
242
+ }
243
+ }));
244
+ }
245
+ requestCancellation(entry, message) {
246
+ entry.cancelRequested = true;
247
+ entry.abortController.abort();
248
+ if (this.isActiveState(entry.record.state)) {
249
+ this.setState(entry, "canceled");
250
+ }
251
+ this.log(entry, "info", message);
252
+ }
253
+ async stopClient(entry) {
254
+ if (!entry.client) {
255
+ return;
256
+ }
257
+ if (entry.clientClosePromise) {
258
+ await entry.clientClosePromise;
259
+ return;
260
+ }
261
+ const client = entry.client;
262
+ let closePromise;
263
+ closePromise = (async () => {
264
+ try {
265
+ await client.interrupt();
266
+ }
267
+ catch (error) {
268
+ this.log(entry, "warn", "interrupt failed", {
269
+ cause: error instanceof Error ? error.message : String(error),
270
+ });
271
+ }
272
+ try {
273
+ await client.shutdown();
274
+ }
275
+ catch (error) {
276
+ this.log(entry, "warn", "shutdown failed", {
277
+ cause: error instanceof Error ? error.message : String(error),
278
+ });
279
+ }
280
+ try {
281
+ await client.close();
282
+ }
283
+ catch (error) {
284
+ this.log(entry, "warn", "close failed", {
285
+ cause: error instanceof Error ? error.message : String(error),
286
+ });
287
+ }
288
+ })().finally(() => {
289
+ if (entry.clientClosePromise === closePromise) {
290
+ entry.clientClosePromise = undefined;
291
+ }
292
+ if (entry.client === client) {
293
+ entry.client = undefined;
294
+ }
295
+ });
296
+ entry.clientClosePromise = closePromise;
297
+ await closePromise;
298
+ }
299
+ isActiveState(state) {
300
+ return (state === "queued" ||
301
+ state === "preparing-workspace" ||
302
+ state === "running" ||
303
+ state === "waiting-input");
304
+ }
305
+ requireSession(sessionId) {
306
+ const entry = this.sessions.get(sessionId);
307
+ if (!entry) {
308
+ throw new AsyncSessionManagerError("not_found", `session '${sessionId}' not found`);
309
+ }
310
+ return entry;
311
+ }
312
+ countActiveSessions() {
313
+ let count = 0;
314
+ for (const entry of this.sessions.values()) {
315
+ if (this.isActiveState(entry.record.state)) {
316
+ count += 1;
317
+ }
318
+ }
319
+ return count;
320
+ }
321
+ setState(entry, state) {
322
+ const previousState = entry.record.state;
323
+ if (previousState === state) {
324
+ return;
325
+ }
326
+ entry.record.state = state;
327
+ this.touch(entry);
328
+ this.emit({
329
+ type: "session-state-changed",
330
+ sessionId: entry.record.id,
331
+ projectId: entry.record.projectId,
332
+ previousState,
333
+ state,
334
+ updatedAt: entry.record.updatedAt,
335
+ });
336
+ }
337
+ touch(entry) {
338
+ entry.record.updatedAt = this.now().toISOString();
339
+ }
340
+ log(entry, level, message, data) {
341
+ const logEntry = {
342
+ timestamp: this.now().toISOString(),
343
+ level,
344
+ message,
345
+ ...(data === undefined ? {} : { data }),
346
+ };
347
+ entry.logs.push(logEntry);
348
+ this.emit({
349
+ type: "session-log",
350
+ sessionId: entry.record.id,
351
+ projectId: entry.record.projectId,
352
+ state: entry.record.state,
353
+ log: { ...logEntry },
354
+ });
355
+ }
356
+ emit(event) {
357
+ for (const listener of this.listeners) {
358
+ try {
359
+ listener(event);
360
+ }
361
+ catch {
362
+ // ignore listener errors to keep session processing stable
363
+ }
364
+ }
365
+ }
366
+ toRecord(entry) {
367
+ return { ...entry.record };
368
+ }
369
+ }
370
+ export function createAsyncSessionManager(options) {
371
+ return new AsyncSessionManagerImpl(options);
372
+ }
373
+ //# sourceMappingURL=session_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session_manager.js","sourceRoot":"","sources":["../../../src/core/async/session_manager.ts"],"names":[],"mappings":"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"}