-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchild-session-error-forwarder.ts
More file actions
68 lines (58 loc) · 2.2 KB
/
child-session-error-forwarder.ts
File metadata and controls
68 lines (58 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import type { OpencodeClient } from "@opencode-ai/sdk/v2";
import { SessionRegistry } from "./session-registry";
export class ChildSessionErrorForwarder {
private readonly client: OpencodeClient;
private readonly registry: SessionRegistry;
private readonly defaultOrchestratorDirectory: string;
public constructor(input: {
client: OpencodeClient;
registry: SessionRegistry;
defaultOrchestratorDirectory: string;
}) {
this.client = input.client;
this.registry = input.registry;
this.defaultOrchestratorDirectory = input.defaultOrchestratorDirectory;
}
public async handleSessionError(input: {
childSessionID: string;
error: unknown;
}): Promise<void> {
const childSessionID = input.childSessionID;
const orchestratorSessionID =
this.registry.getOrchestratorSessionID(childSessionID);
if (!orchestratorSessionID) return;
const errorText = input.error ? JSON.stringify(input.error) : "Unknown error";
const excerpt = truncateText(errorText, 400);
this.registry.markError(childSessionID, Date.now(), excerpt);
if (!this.registry.hasPendingForwardRequests(childSessionID)) return;
const delivered = this.registry.shiftPendingForwardRequest(childSessionID);
if (!delivered) return;
const childOrchestratorDirectory =
this.registry.getOrchestratorDirectory(childSessionID) ??
this.defaultOrchestratorDirectory;
const directory = childOrchestratorDirectory === null ? undefined : childOrchestratorDirectory;
await this.client.session.prompt({
sessionID: orchestratorSessionID,
directory,
agent: "orchestrator",
parts: [
{
type: "text",
text: `[Child session ${childSessionID} error]\n\n${errorText}`,
synthetic: true,
metadata: {
childSessionID,
status: "error",
forwardToken: delivered.forwardToken,
},
},
],
});
}
}
function truncateText(text: string, maxChars: number): string {
const trimmed = text.trim();
if (trimmed.length <= maxChars) return trimmed;
if (maxChars <= 3) return trimmed.slice(0, Math.max(0, maxChars));
return trimmed.slice(0, Math.max(0, maxChars - 3)) + "...";
}