subharness 0.0.3 → 0.0.4
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/README.md +3 -3
- package/dist/adapters/approval-context.d.ts +2 -0
- package/dist/adapters/approval-context.js +9 -0
- package/dist/adapters/approval-context.js.map +1 -0
- package/dist/adapters/approval-lifetime.d.ts +8 -0
- package/dist/adapters/approval-lifetime.js +50 -0
- package/dist/adapters/approval-lifetime.js.map +1 -0
- package/dist/adapters/claude-approvals.d.ts +4 -0
- package/dist/adapters/claude-approvals.js +32 -0
- package/dist/adapters/claude-approvals.js.map +1 -0
- package/dist/adapters/claude-permissions.js +1 -1
- package/dist/adapters/claude-permissions.js.map +1 -1
- package/dist/adapters/claude.js +30 -1
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex-approvals.d.ts +6 -0
- package/dist/adapters/codex-approvals.js +111 -0
- package/dist/adapters/codex-approvals.js.map +1 -0
- package/dist/adapters/codex.js +32 -2
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/fx-approvals.d.ts +2 -0
- package/dist/adapters/fx-approvals.js +14 -0
- package/dist/adapters/fx-approvals.js.map +1 -0
- package/dist/adapters/fx.js +49 -18
- package/dist/adapters/fx.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/approvals/schema.d.ts +4 -0
- package/dist/approvals/schema.js +70 -0
- package/dist/approvals/schema.js.map +1 -0
- package/dist/approvals/types.d.ts +47 -0
- package/dist/approvals/types.js +2 -0
- package/dist/approvals/types.js.map +1 -0
- package/dist/cli/args.d.ts +2 -1
- package/dist/cli/args.js +20 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/dashboard-client.d.ts +5 -1
- package/dist/cli/dashboard-client.js +161 -14
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/dashboard-detail-view.d.ts +16 -0
- package/dist/cli/dashboard-detail-view.js +163 -0
- package/dist/cli/dashboard-detail-view.js.map +1 -0
- package/dist/cli/dashboard-history-view.d.ts +29 -0
- package/dist/cli/dashboard-history-view.js +211 -0
- package/dist/cli/dashboard-history-view.js.map +1 -0
- package/dist/cli/dashboard-input.d.ts +14 -0
- package/dist/cli/dashboard-input.js +118 -0
- package/dist/cli/dashboard-input.js.map +1 -0
- package/dist/cli/dashboard-layout.d.ts +12 -1
- package/dist/cli/dashboard-layout.js +29 -27
- package/dist/cli/dashboard-layout.js.map +1 -1
- package/dist/cli/dashboard-renderer.d.ts +30 -2
- package/dist/cli/dashboard-renderer.js +125 -7
- package/dist/cli/dashboard-renderer.js.map +1 -1
- package/dist/cli/dashboard-style.d.ts +9 -0
- package/dist/cli/dashboard-style.js +36 -0
- package/dist/cli/dashboard-style.js.map +1 -0
- package/dist/cli/dashboard.d.ts +3 -1
- package/dist/cli/dashboard.js +127 -12
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.js +7 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/input.d.ts +1 -0
- package/dist/cli/input.js +23 -17
- package/dist/cli/input.js.map +1 -1
- package/dist/cli/main.js +1 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.js +17 -1
- package/dist/cli/output.js.map +1 -1
- package/dist/runtime/approval-registry.d.ts +27 -0
- package/dist/runtime/approval-registry.js +126 -0
- package/dist/runtime/approval-registry.js.map +1 -0
- package/dist/runtime/coordinator.d.ts +17 -1
- package/dist/runtime/coordinator.js +124 -6
- package/dist/runtime/coordinator.js.map +1 -1
- package/dist/runtime/dashboard.d.ts +42 -0
- package/dist/runtime/dashboard.js.map +1 -1
- package/dist/runtime/select-native.d.ts +2 -1
- package/dist/runtime/select-native.js +2 -2
- package/dist/runtime/select-native.js.map +1 -1
- package/dist/runtime/service.js +24 -1
- package/dist/runtime/service.js.map +1 -1
- package/dist/runtime/types.d.ts +9 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/runtime/worker-approvals.d.ts +21 -0
- package/dist/runtime/worker-approvals.js +51 -0
- package/dist/runtime/worker-approvals.js.map +1 -0
- package/dist/runtime/worker-client.js +35 -7
- package/dist/runtime/worker-client.js.map +1 -1
- package/dist/runtime/worker-server.d.ts +2 -0
- package/dist/runtime/worker-server.js +39 -10
- package/dist/runtime/worker-server.js.map +1 -1
- package/package.json +1 -1
- package/sdk/access-config.md +28 -0
- package/sdk/adapter-contract.md +2 -10
- package/sdk/agent-skill.md +6 -3
- package/sdk/approvals.md +118 -0
- package/sdk/cli/dashboard-design.md +38 -4
- package/sdk/cli/dashboard-inspection.md +25 -0
- package/sdk/cli/index.md +11 -5
- package/sdk/cli/output.md +7 -3
- package/sdk/completion-notifications.md +2 -0
- package/sdk/distribution.md +52 -0
- package/sdk/evals.md +9 -3
- package/sdk/fx.md +1 -1
- package/sdk/index.md +1 -0
- package/sdk/message-delivery.md +1 -1
- package/sdk/permissions.md +4 -4
- package/sdk/pr-integration.md +1 -1
- package/sdk/sessions.md +4 -1
- package/sdk/v1-runtime.md +3 -3
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { AgentError } from '../errors.js';
|
|
4
|
+
import { validateApprovalContent, validateApprovalSchema } from '../approvals/schema.js';
|
|
5
|
+
const MAX_SETTLED_REQUESTS = 1_024;
|
|
6
|
+
const expired = () => new AgentError('REQUEST_EXPIRED', 'The native permission request is no longer pending.');
|
|
7
|
+
const unknown = () => new AgentError('UNKNOWN_REQUEST', 'Permission request is unavailable in this coordinator.');
|
|
8
|
+
const identity = (request) => ({
|
|
9
|
+
requestId: request.requestId, taskId: request.taskId, sessionId: request.sessionId,
|
|
10
|
+
});
|
|
11
|
+
/** Retains pending requests and a bounded settlement-ordered outcome history. */
|
|
12
|
+
export class ApprovalRegistry {
|
|
13
|
+
changed;
|
|
14
|
+
pending = new Map();
|
|
15
|
+
settled = new Map();
|
|
16
|
+
constructor(changed) {
|
|
17
|
+
this.changed = changed;
|
|
18
|
+
}
|
|
19
|
+
async register(taskId, sessionId, request, signal) {
|
|
20
|
+
if (signal.aborted)
|
|
21
|
+
throw expired();
|
|
22
|
+
if (this.pendingFor(taskId).length >= 32)
|
|
23
|
+
throw new AgentError('INPUT_REQUIRED', 'A task cannot wait on more than 32 permission requests.');
|
|
24
|
+
let copy;
|
|
25
|
+
try {
|
|
26
|
+
const serialized = JSON.stringify(request);
|
|
27
|
+
if (Buffer.byteLength(serialized) > 64 * 1024)
|
|
28
|
+
throw new Error();
|
|
29
|
+
copy = JSON.parse(serialized);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented within 64 KiB.');
|
|
33
|
+
}
|
|
34
|
+
if (copy.kind !== 'permission' || !['codex', 'claudeCode', 'fx'].includes(copy.harness) || typeof copy.message !== 'string')
|
|
35
|
+
throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented.');
|
|
36
|
+
validateApprovalSchema(copy.requestedSchema);
|
|
37
|
+
const requestId = `req_${randomUUID()}`;
|
|
38
|
+
const snapshot = { ...copy, requestId, taskId, sessionId };
|
|
39
|
+
if (Buffer.byteLength(JSON.stringify(snapshot)) > 64 * 1024)
|
|
40
|
+
throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented within 64 KiB.');
|
|
41
|
+
const answer = new Promise((resolve, reject) => {
|
|
42
|
+
const abort = () => this.retire(requestId);
|
|
43
|
+
this.pending.set(requestId, { outcome: 'pending', request: snapshot,
|
|
44
|
+
continuation: { resolve, reject, cleanup: () => signal.removeEventListener('abort', abort) } });
|
|
45
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
46
|
+
});
|
|
47
|
+
this.changed(taskId);
|
|
48
|
+
return answer;
|
|
49
|
+
}
|
|
50
|
+
request(id) {
|
|
51
|
+
const pending = this.pending.get(id);
|
|
52
|
+
if (pending)
|
|
53
|
+
return identity(pending.request);
|
|
54
|
+
const settled = this.settled.get(id);
|
|
55
|
+
if (!settled)
|
|
56
|
+
throw unknown();
|
|
57
|
+
return { ...settled.identity };
|
|
58
|
+
}
|
|
59
|
+
respond(id, content) {
|
|
60
|
+
const pending = this.pending.get(id);
|
|
61
|
+
if (!pending) {
|
|
62
|
+
const settled = this.settled.get(id);
|
|
63
|
+
if (!settled)
|
|
64
|
+
throw unknown();
|
|
65
|
+
if (settled.outcome === 'withdrawn')
|
|
66
|
+
throw expired();
|
|
67
|
+
this.validateBoundedContent(content);
|
|
68
|
+
if (!isDeepStrictEqual(settled.answer, content))
|
|
69
|
+
throw new AgentError('INVALID_APPROVAL_RESPONSE', 'This permission request already has a different answer.');
|
|
70
|
+
return this.receipt(settled.identity);
|
|
71
|
+
}
|
|
72
|
+
this.validateBoundedContent(content);
|
|
73
|
+
const answer = validateApprovalContent(pending.request.requestedSchema, content);
|
|
74
|
+
const requestIdentity = identity(pending.request);
|
|
75
|
+
this.pending.delete(id);
|
|
76
|
+
pending.continuation.cleanup();
|
|
77
|
+
this.retain({ outcome: 'answered', identity: requestIdentity, answer: structuredClone(answer) });
|
|
78
|
+
pending.continuation.resolve(answer);
|
|
79
|
+
this.changed(requestIdentity.taskId);
|
|
80
|
+
return this.receipt(requestIdentity);
|
|
81
|
+
}
|
|
82
|
+
pendingFor(taskId) {
|
|
83
|
+
return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)
|
|
84
|
+
.map(entry => structuredClone(entry.request));
|
|
85
|
+
}
|
|
86
|
+
retireTask(taskId) {
|
|
87
|
+
for (const [id, entry] of this.pending)
|
|
88
|
+
if (entry.request.taskId === taskId)
|
|
89
|
+
this.retire(id);
|
|
90
|
+
}
|
|
91
|
+
close() { for (const id of [...this.pending.keys()])
|
|
92
|
+
this.retire(id); }
|
|
93
|
+
retire(id) {
|
|
94
|
+
const entry = this.pending.get(id);
|
|
95
|
+
if (!entry)
|
|
96
|
+
return;
|
|
97
|
+
const requestIdentity = identity(entry.request);
|
|
98
|
+
this.pending.delete(id);
|
|
99
|
+
entry.continuation.cleanup();
|
|
100
|
+
this.retain({ outcome: 'withdrawn', identity: requestIdentity });
|
|
101
|
+
entry.continuation.reject(expired());
|
|
102
|
+
this.changed(requestIdentity.taskId);
|
|
103
|
+
}
|
|
104
|
+
retain(entry) {
|
|
105
|
+
this.settled.set(entry.identity.requestId, entry);
|
|
106
|
+
while (this.settled.size > MAX_SETTLED_REQUESTS) {
|
|
107
|
+
const oldest = this.settled.keys().next().value;
|
|
108
|
+
if (oldest !== undefined)
|
|
109
|
+
this.settled.delete(oldest);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
validateBoundedContent(content) {
|
|
113
|
+
let serialized;
|
|
114
|
+
try {
|
|
115
|
+
serialized = JSON.stringify(content);
|
|
116
|
+
}
|
|
117
|
+
catch { /* Report no submitted data. */ }
|
|
118
|
+
if (!serialized || Buffer.byteLength(serialized) > 16 * 1024)
|
|
119
|
+
throw new AgentError('INVALID_APPROVAL_RESPONSE', 'Approval content must be a JSON object within 16 KiB.');
|
|
120
|
+
}
|
|
121
|
+
receipt(request) {
|
|
122
|
+
return { version: 1, type: 'approval_answered', requestId: request.requestId,
|
|
123
|
+
taskId: request.taskId, sessionId: request.sessionId };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=approval-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-registry.js","sourceRoot":"","sources":["../../src/runtime/approval-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\nimport { AgentError } from '../errors.js';\nimport { validateApprovalContent, validateApprovalSchema } from '../approvals/schema.js';\nimport type { ApprovalContent, NativeApprovalRequest } from '../approvals/types.js';\nimport type { ApprovalRequest } from './types.js';\n\ntype RequestIdentity = Pick<ApprovalRequest,'requestId'|'taskId'|'sessionId'>;\ninterface Continuation {\n resolve(content: ApprovalContent): void;\n reject(error: AgentError): void;\n cleanup(): void;\n}\ninterface PendingEntry {\n outcome: 'pending';\n request: ApprovalRequest;\n continuation: Continuation;\n}\ninterface AnsweredEntry { outcome: 'answered'; identity: RequestIdentity; answer: ApprovalContent }\ninterface WithdrawnEntry { outcome: 'withdrawn'; identity: RequestIdentity }\ntype SettledEntry = AnsweredEntry | WithdrawnEntry;\n\nconst MAX_SETTLED_REQUESTS = 1_024;\nconst expired = () => new AgentError('REQUEST_EXPIRED','The native permission request is no longer pending.');\nconst unknown = () => new AgentError('UNKNOWN_REQUEST','Permission request is unavailable in this coordinator.');\nconst identity = (request: ApprovalRequest): RequestIdentity => ({\n requestId:request.requestId,taskId:request.taskId,sessionId:request.sessionId,\n});\n\n/** Retains pending requests and a bounded settlement-ordered outcome history. */\nexport class ApprovalRegistry {\n private pending = new Map<string,PendingEntry>();\n private settled = new Map<string,SettledEntry>();\n constructor(private readonly changed: (taskId: string) => void) {}\n\n async register(taskId: string, sessionId: string, request: NativeApprovalRequest, signal: AbortSignal): Promise<ApprovalContent> {\n if (signal.aborted) throw expired();\n if (this.pendingFor(taskId).length >= 32)\n throw new AgentError('INPUT_REQUIRED','A task cannot wait on more than 32 permission requests.');\n let copy: NativeApprovalRequest;\n try {\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > 64 * 1024) throw new Error();\n copy = JSON.parse(serialized) as NativeApprovalRequest;\n } catch { throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.'); }\n if (copy.kind !== 'permission' || !['codex','claudeCode','fx'].includes(copy.harness) || typeof copy.message !== 'string')\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented.');\n validateApprovalSchema(copy.requestedSchema);\n const requestId = `req_${randomUUID()}`;\n const snapshot: ApprovalRequest = {...copy,requestId,taskId,sessionId};\n if (Buffer.byteLength(JSON.stringify(snapshot)) > 64 * 1024)\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.');\n const answer = new Promise<ApprovalContent>((resolve,reject) => {\n const abort = () => this.retire(requestId);\n this.pending.set(requestId,{outcome:'pending',request:snapshot,\n continuation:{resolve,reject,cleanup:() => signal.removeEventListener('abort',abort)}});\n signal.addEventListener('abort',abort,{once:true});\n });\n this.changed(taskId);\n return answer;\n }\n\n request(id: string): RequestIdentity {\n const pending = this.pending.get(id);\n if (pending) return identity(pending.request);\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n return {...settled.identity};\n }\n\n respond(id: string, content: unknown) {\n const pending = this.pending.get(id);\n if (!pending) {\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n if (settled.outcome === 'withdrawn') throw expired();\n this.validateBoundedContent(content);\n if (!isDeepStrictEqual(settled.answer,content))\n throw new AgentError('INVALID_APPROVAL_RESPONSE','This permission request already has a different answer.');\n return this.receipt(settled.identity);\n }\n this.validateBoundedContent(content);\n const answer = validateApprovalContent(pending.request.requestedSchema,content);\n const requestIdentity = identity(pending.request);\n this.pending.delete(id);\n pending.continuation.cleanup();\n this.retain({outcome:'answered',identity:requestIdentity,answer:structuredClone(answer)});\n pending.continuation.resolve(answer);\n this.changed(requestIdentity.taskId);\n return this.receipt(requestIdentity);\n }\n\n pendingFor(taskId: string): ApprovalRequest[] {\n return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)\n .map(entry => structuredClone(entry.request));\n }\n\n retireTask(taskId: string) {\n for (const [id,entry] of this.pending) if (entry.request.taskId === taskId) this.retire(id);\n }\n\n close() { for (const id of [...this.pending.keys()]) this.retire(id); }\n\n private retire(id: string) {\n const entry = this.pending.get(id);\n if (!entry) return;\n const requestIdentity = identity(entry.request);\n this.pending.delete(id);\n entry.continuation.cleanup();\n this.retain({outcome:'withdrawn',identity:requestIdentity});\n entry.continuation.reject(expired());\n this.changed(requestIdentity.taskId);\n }\n\n private retain(entry: SettledEntry) {\n this.settled.set(entry.identity.requestId,entry);\n while (this.settled.size > MAX_SETTLED_REQUESTS) {\n const oldest = this.settled.keys().next().value;\n if (oldest !== undefined) this.settled.delete(oldest);\n }\n }\n\n private validateBoundedContent(content: unknown) {\n let serialized: string | undefined;\n try { serialized = JSON.stringify(content); } catch { /* Report no submitted data. */ }\n if (!serialized || Buffer.byteLength(serialized) > 16 * 1024)\n throw new AgentError('INVALID_APPROVAL_RESPONSE','Approval content must be a JSON object within 16 KiB.');\n }\n\n private receipt(request: RequestIdentity) {\n return {version:1 as const,type:'approval_answered' as const,requestId:request.requestId,\n taskId:request.taskId,sessionId:request.sessionId};\n }\n}\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type DriverFactory, type Observation, type Receipt, type SessionInput, type Delivery } from './types.js';
|
|
2
|
-
import { type DashboardSnapshot } from './dashboard.js';
|
|
2
|
+
import { type DashboardDetail, type DashboardSession, type DashboardSnapshot } from './dashboard.js';
|
|
3
3
|
export declare class Coordinator {
|
|
4
4
|
private readonly factory;
|
|
5
5
|
private readonly now;
|
|
6
6
|
private sessions;
|
|
7
7
|
private tasks;
|
|
8
8
|
private dashboardHistory?;
|
|
9
|
+
private closed;
|
|
10
|
+
private approvals;
|
|
9
11
|
constructor(factory: DriverFactory, now?: () => number);
|
|
10
12
|
parentContext(token: string): {
|
|
11
13
|
taskId: string;
|
|
@@ -22,6 +24,7 @@ export declare class Coordinator {
|
|
|
22
24
|
taskId: string;
|
|
23
25
|
sessionId: string;
|
|
24
26
|
state: import("./types.js").TaskState;
|
|
27
|
+
requests?: import("./types.js").ApprovalRequest[] | undefined;
|
|
25
28
|
error?: import("../errors.js").ErrorInfo | undefined;
|
|
26
29
|
response?: {
|
|
27
30
|
responseId: string;
|
|
@@ -29,7 +32,18 @@ export declare class Coordinator {
|
|
|
29
32
|
truncated: boolean;
|
|
30
33
|
} | undefined;
|
|
31
34
|
};
|
|
35
|
+
respond(id: string, content: unknown, parentToken?: string): {
|
|
36
|
+
version: 1;
|
|
37
|
+
type: 'approval_answered';
|
|
38
|
+
requestId: string;
|
|
39
|
+
taskId: string;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
};
|
|
32
42
|
dashboard(): Promise<DashboardSnapshot>;
|
|
43
|
+
dashboardDetail(id: string, includePrompt?: boolean, knownResponseId?: string): Promise<DashboardDetail>;
|
|
44
|
+
dashboardSession(id: string): Promise<DashboardSession>;
|
|
45
|
+
private dashboardRow;
|
|
46
|
+
private dashboardRelatedTask;
|
|
33
47
|
private finish;
|
|
34
48
|
queue(id: string): {
|
|
35
49
|
version: number;
|
|
@@ -61,6 +75,8 @@ export declare class Coordinator {
|
|
|
61
75
|
private deliver;
|
|
62
76
|
private continueParent;
|
|
63
77
|
private touch;
|
|
78
|
+
private pendingApprovals;
|
|
79
|
+
private approvalChanged;
|
|
64
80
|
private notify;
|
|
65
81
|
private task;
|
|
66
82
|
private session;
|
|
@@ -4,12 +4,15 @@ import { AgentError, errorInfo } from '../errors.js';
|
|
|
4
4
|
import { terminal } from './types.js';
|
|
5
5
|
import { dashboardHarness, dashboardTitle } from './dashboard.js';
|
|
6
6
|
import { resolveDashboardWorkspace } from './dashboard-workspace.js';
|
|
7
|
+
import { ApprovalRegistry } from './approval-registry.js';
|
|
7
8
|
export class Coordinator {
|
|
8
9
|
factory;
|
|
9
10
|
now;
|
|
10
11
|
sessions = new Map();
|
|
11
12
|
tasks = new Map();
|
|
12
13
|
dashboardHistory;
|
|
14
|
+
closed = false;
|
|
15
|
+
approvals = new ApprovalRegistry(id => this.approvalChanged(this.task(id)));
|
|
13
16
|
constructor(factory, now = Date.now) {
|
|
14
17
|
this.factory = factory;
|
|
15
18
|
this.now = now;
|
|
@@ -81,6 +84,10 @@ export class Coordinator {
|
|
|
81
84
|
return { version: 1, type: 'terminal', taskId: id,
|
|
82
85
|
sessionId: task.sessionId, state: task.state, ...(task.error ? { error: task.error } : {}) };
|
|
83
86
|
}
|
|
87
|
+
const requests = this.pendingApprovals(task);
|
|
88
|
+
if (requests.length)
|
|
89
|
+
return { version: 1, type: 'approval_required', taskId: id,
|
|
90
|
+
sessionId: task.sessionId, state: task.state, requests };
|
|
84
91
|
await waitForChange(task.changed, signal);
|
|
85
92
|
}
|
|
86
93
|
}
|
|
@@ -93,12 +100,32 @@ export class Coordinator {
|
|
|
93
100
|
}
|
|
94
101
|
status(id, full = false) {
|
|
95
102
|
const task = this.task(id), response = task.responses.at(-1);
|
|
103
|
+
const requests = this.pendingApprovals(task);
|
|
96
104
|
return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,
|
|
105
|
+
...(requests.length ? { requests } : {}),
|
|
97
106
|
...(task.error ? { error: task.error } : {}), ...(response ? { response: {
|
|
98
107
|
responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),
|
|
99
108
|
truncated: !full && response.text.length > 4000
|
|
100
109
|
} } : {}) };
|
|
101
110
|
}
|
|
111
|
+
respond(id, content, parentToken) {
|
|
112
|
+
const request = this.approvals.request(id);
|
|
113
|
+
if (parentToken !== undefined) {
|
|
114
|
+
let caller;
|
|
115
|
+
try {
|
|
116
|
+
caller = this.parentContext(parentToken).taskId;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
throw new AgentError('INVALID_APPROVAL_OWNER', 'The caller cannot answer this permission request.');
|
|
120
|
+
}
|
|
121
|
+
let ancestor = this.task(request.taskId).parentId;
|
|
122
|
+
while (ancestor && ancestor !== caller)
|
|
123
|
+
ancestor = this.task(ancestor).parentId;
|
|
124
|
+
if (!ancestor)
|
|
125
|
+
throw new AgentError('INVALID_APPROVAL_OWNER', 'Only an active strict ancestor can answer this permission request.');
|
|
126
|
+
}
|
|
127
|
+
return this.approvals.respond(id, content);
|
|
128
|
+
}
|
|
102
129
|
async dashboard() {
|
|
103
130
|
// New sessions join the next snapshot; every serialized row has resolved context.
|
|
104
131
|
const admitted = [...this.sessions.values()];
|
|
@@ -117,13 +144,75 @@ export class Coordinator {
|
|
|
117
144
|
.sort((first, second) => second.finishedAt - first.finishedAt);
|
|
118
145
|
const visible = new Set(current.map(task => task.id));
|
|
119
146
|
const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];
|
|
120
|
-
const sessions = tasks.map(task => (
|
|
147
|
+
const sessions = tasks.map(task => this.dashboardRow(task, workspaces.get(task.sessionId)));
|
|
148
|
+
return { version: 1, type: 'dashboard', history: true, grouping: true, sessions };
|
|
149
|
+
}
|
|
150
|
+
async dashboardDetail(id, includePrompt = true, knownResponseId) {
|
|
151
|
+
const task = this.task(id);
|
|
152
|
+
const session = this.session(task.sessionId);
|
|
153
|
+
const workspace = await session.workspace;
|
|
154
|
+
const response = task.responses.at(-1);
|
|
155
|
+
return {
|
|
156
|
+
version: 1,
|
|
157
|
+
type: 'dashboard-detail',
|
|
158
|
+
task: this.dashboardRow(task, workspace),
|
|
159
|
+
...(includePrompt ? { prompt: task.prompt } : {}),
|
|
160
|
+
...(response ? { response: {
|
|
161
|
+
responseId: response.responseId,
|
|
162
|
+
...(response.responseId === knownResponseId ? {} : { text: response.text }),
|
|
163
|
+
} } : {}),
|
|
164
|
+
...(task.error ? { error: task.error } : {}),
|
|
165
|
+
children: [...task.children].map(childId => this.dashboardRelatedTask(this.task(childId))),
|
|
166
|
+
queue: {
|
|
167
|
+
paused: session.paused,
|
|
168
|
+
tasks: session.tasks.map(taskId => this.dashboardRelatedTask(this.task(taskId))),
|
|
169
|
+
},
|
|
170
|
+
stopUnconfirmed: task.stopUnconfirmed ?? false,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async dashboardSession(id) {
|
|
174
|
+
const session = this.session(this.task(id).sessionId);
|
|
175
|
+
const workspace = await session.workspace;
|
|
176
|
+
// Collect all metadata after discovery, without another asynchronous boundary.
|
|
177
|
+
const retained = [...this.tasks.values()];
|
|
178
|
+
const tasks = retained.filter(task => task.sessionId === session.id);
|
|
179
|
+
const childIds = new Set(tasks.flatMap(task => [...task.children]));
|
|
180
|
+
const childSessions = new Set(retained.filter(task => childIds.has(task.id)).map(task => task.sessionId));
|
|
181
|
+
const latest = new Map();
|
|
182
|
+
const titles = new Map();
|
|
183
|
+
for (const task of retained) {
|
|
184
|
+
latest.set(task.sessionId, task.id);
|
|
185
|
+
if (!titles.has(task.sessionId))
|
|
186
|
+
titles.set(task.sessionId, task.title);
|
|
187
|
+
}
|
|
188
|
+
const representative = (candidate) => this.task(candidate.active ?? candidate.tasks[0]
|
|
189
|
+
?? latest.get(candidate.id));
|
|
190
|
+
const requests = tasks.map((task, index) => ({ ...this.dashboardRow(task, workspace),
|
|
191
|
+
ordinal: index + 1, stopUnconfirmed: task.stopUnconfirmed ?? false }));
|
|
192
|
+
requests.sort((first, second) => Number(second.state === 'queued') - Number(first.state === 'queued')
|
|
193
|
+
|| second.ordinal - first.ordinal);
|
|
194
|
+
return {
|
|
195
|
+
version: 1, type: 'dashboard-session', taskId: id, sessionId: session.id,
|
|
196
|
+
title: titles.get(session.id), harness: session.harness,
|
|
197
|
+
state: representative(session).state, workspace, requests,
|
|
198
|
+
subagents: [...childSessions].map(sessionId => {
|
|
199
|
+
const child = this.session(sessionId);
|
|
200
|
+
return { ...this.dashboardRelatedTask(representative(child)), title: titles.get(child.id) };
|
|
201
|
+
}),
|
|
202
|
+
queuePaused: session.paused,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
dashboardRow(task, workspace) {
|
|
206
|
+
return { sessionId: task.sessionId, taskId: task.id,
|
|
121
207
|
harness: this.session(task.sessionId).harness, title: task.title, state: task.state,
|
|
122
|
-
workspace
|
|
208
|
+
workspace, updatedAt: task.updatedAt,
|
|
123
209
|
...(task.dispatchedAt === undefined ? {} : { dispatchedAt: task.dispatchedAt }),
|
|
124
210
|
...(task.failedAt === undefined ? {} : { failedAt: task.failedAt }),
|
|
125
|
-
...(task.finishedAt === undefined ? {} : { finishedAt: task.finishedAt }) }
|
|
126
|
-
|
|
211
|
+
...(task.finishedAt === undefined ? {} : { finishedAt: task.finishedAt }) };
|
|
212
|
+
}
|
|
213
|
+
dashboardRelatedTask(task) {
|
|
214
|
+
return { taskId: task.id, sessionId: task.sessionId, harness: this.session(task.sessionId).harness,
|
|
215
|
+
title: task.title, state: task.state };
|
|
127
216
|
}
|
|
128
217
|
finish(task, state, at = this.now(), updatedAt = at) {
|
|
129
218
|
task.state = state;
|
|
@@ -157,6 +246,11 @@ export class Coordinator {
|
|
|
157
246
|
});
|
|
158
247
|
}
|
|
159
248
|
async close() {
|
|
249
|
+
this.closed = true;
|
|
250
|
+
for (const task of this.tasks.values())
|
|
251
|
+
if (!terminal(task.state))
|
|
252
|
+
task.stopping = true;
|
|
253
|
+
this.approvals.close();
|
|
160
254
|
await Promise.allSettled([...this.sessions.values()].map(async (session) => (await session.driver)?.close()));
|
|
161
255
|
}
|
|
162
256
|
async cancel(id) {
|
|
@@ -195,6 +289,7 @@ export class Coordinator {
|
|
|
195
289
|
async finishStop(task, outcome) {
|
|
196
290
|
const session = this.session(task.sessionId);
|
|
197
291
|
task.stopping = true;
|
|
292
|
+
this.approvals.retireTask(task.id);
|
|
198
293
|
session.tasks = session.tasks.filter(id => id !== task.id);
|
|
199
294
|
try {
|
|
200
295
|
const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));
|
|
@@ -244,6 +339,8 @@ export class Coordinator {
|
|
|
244
339
|
...(blockedByTaskId ? { paused: true, blockedByTaskId } : {}) };
|
|
245
340
|
}
|
|
246
341
|
validateAdmission(session, prompt, parentToken, replacement = false) {
|
|
342
|
+
if (this.closed)
|
|
343
|
+
throw new AgentError('COORDINATOR_UNAVAILABLE', 'The coordinator is shutting down.');
|
|
247
344
|
if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)
|
|
248
345
|
throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');
|
|
249
346
|
if (!replacement && session && session.tasks.length >= 100)
|
|
@@ -261,7 +358,7 @@ export class Coordinator {
|
|
|
261
358
|
return parent;
|
|
262
359
|
}
|
|
263
360
|
dispatch(session) {
|
|
264
|
-
if (session.active || session.paused || session.controls)
|
|
361
|
+
if (this.closed || session.active || session.paused || session.controls)
|
|
265
362
|
return;
|
|
266
363
|
const id = session.tasks.shift();
|
|
267
364
|
if (!id)
|
|
@@ -277,7 +374,13 @@ export class Coordinator {
|
|
|
277
374
|
task.state = 'running';
|
|
278
375
|
task.nativeActive = true;
|
|
279
376
|
try {
|
|
280
|
-
session.driver ??= this.factory({ ...session.input, sessionId: session.id, token: session.token
|
|
377
|
+
session.driver ??= this.factory({ ...session.input, sessionId: session.id, token: session.token,
|
|
378
|
+
onApproval: async (request, signal) => {
|
|
379
|
+
const active = session.active ? this.task(session.active) : undefined;
|
|
380
|
+
if (this.closed || !active || active.stopping || !active.nativeActive || terminal(active.state))
|
|
381
|
+
throw new AgentError('REQUEST_EXPIRED', 'The native permission request is no longer pending.');
|
|
382
|
+
return this.approvals.register(active.id, session.id, request, signal);
|
|
383
|
+
} });
|
|
281
384
|
const driver = await session.driver;
|
|
282
385
|
if (driver.selectedHarness) {
|
|
283
386
|
const harness = dashboardHarness(driver.selectedHarness);
|
|
@@ -289,6 +392,7 @@ export class Coordinator {
|
|
|
289
392
|
if (task.stopping)
|
|
290
393
|
return;
|
|
291
394
|
const text = recovering ? await driver.resume() : await driver.turn(prompt);
|
|
395
|
+
this.approvals.retireTask(task.id);
|
|
292
396
|
if (task.stopping)
|
|
293
397
|
return;
|
|
294
398
|
if (Buffer.byteLength(text) > 1024 * 1024)
|
|
@@ -312,6 +416,7 @@ export class Coordinator {
|
|
|
312
416
|
this.continueParent(task);
|
|
313
417
|
}
|
|
314
418
|
catch (error) {
|
|
419
|
+
this.approvals.retireTask(task.id);
|
|
315
420
|
if (task.stopping)
|
|
316
421
|
return;
|
|
317
422
|
task.failedAt = this.now();
|
|
@@ -350,6 +455,19 @@ export class Coordinator {
|
|
|
350
455
|
void this.execute(task, prompt);
|
|
351
456
|
}
|
|
352
457
|
touch(task, at = this.now()) { task.updatedAt = at; }
|
|
458
|
+
pendingApprovals(task) {
|
|
459
|
+
return [...this.approvals.pendingFor(task.id), ...[...task.children].flatMap(id => this.pendingApprovals(this.task(id)))];
|
|
460
|
+
}
|
|
461
|
+
approvalChanged(task) {
|
|
462
|
+
if (!task.stopping && task.nativeActive)
|
|
463
|
+
task.state = this.approvals.pendingFor(task.id).length ? 'awaiting_approval' : 'running';
|
|
464
|
+
this.touch(task);
|
|
465
|
+
let current = task;
|
|
466
|
+
while (current) {
|
|
467
|
+
this.notify(current);
|
|
468
|
+
current = current.parentId ? this.task(current.parentId) : undefined;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
353
471
|
notify(task) { for (const resolve of task.changed)
|
|
354
472
|
resolve(); task.changed.clear(); }
|
|
355
473
|
task(id) { const task = this.tasks.get(id); if (!task)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/runtime/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { waitForChange } from './observation.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { terminal, type DriverFactory, type Observation, type Receipt, type Session, type SessionInput, type Task, type Delivery } from './types.js';\nimport { dashboardHarness, dashboardTitle, type DashboardSnapshot } from './dashboard.js';\nimport { resolveDashboardWorkspace } from './dashboard-workspace.js';\n\nexport class Coordinator {\n private sessions = new Map<string, Session>();\n private tasks = new Map<string, Task>();\n private dashboardHistory?: Task[];\n constructor(private readonly factory: DriverFactory, private readonly now: () => number = Date.now) {}\n\n parentContext(token: string) {\n const session = [...this.sessions.values()].find(session => session.token === token);\n const task = session?.active ? this.task(session.active) : undefined;\n if (!session || !task || task.stopping || terminal(task.state))\n throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');\n return {taskId: task.id, reference: session.input.reference, cwd: session.input.cwd};\n }\n\n run(input: SessionInput): Receipt {\n this.validateAdmission(undefined, input.prompt, input.parentToken);\n const selected = 'kind' in input.reference ? input.reference.harness.kind : undefined;\n const session: Session = { id: `ses_${randomUUID()}`, token: randomUUID(), input,\n tasks: [], paused: false, commands: Promise.resolve(), controls: 0, harness: dashboardHarness(selected),\n workspace: resolveDashboardWorkspace(input.cwd) };\n this.sessions.set(session.id, session);\n return this.admit(session, input.prompt, false, input.parentToken);\n }\n\n async send(id: string, prompt: string, delivery: Delivery, parentToken?: string): Promise<Receipt> {\n const session = this.session(id);\n const operation = async (): Promise<Receipt> => {\n if (!['queue', 'steer', 'interrupt'].includes(delivery)) throw new AgentError('INVALID_ARGUMENT', 'Unknown delivery mode.');\n this.validateAdmission(session, prompt, parentToken, delivery !== 'queue');\n if (delivery === 'queue') return this.admit(session, prompt, false, parentToken);\n const task = session.active ? this.task(session.active) : undefined;\n if (delivery === 'steer') {\n if (!task || terminal(task.state) || task.stopping) throw new AgentError('NO_ACTIVE_TASK', 'There is no active task accepting steering.');\n if (!task.nativeActive) {\n void this.execute(task, prompt);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n }\n try {\n await (await session.driver!).steer(prompt);\n this.touch(task);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n } catch (error) {\n if (!(error instanceof AgentError) || error.code !== 'UNSUPPORTED_DELIVERY') throw error;\n }\n }\n if (task && (!terminal(task.state) || task.stopUnconfirmed || task.state === 'failed')) await this.stop(task, 'interrupted');\n session.paused = false;\n const receipt = this.admit(session, prompt, true, parentToken);\n return {...receipt, requestedDelivery: delivery, delivery: 'interrupt'};\n };\n return this.command(session, operation);\n }\n\n async observe(id: string, after?: string, readerToken?: string, signal?: AbortSignal): Promise<Observation> {\n const task = this.task(id);\n const position = after ? task.responses.findIndex(response => response.responseId === after) : -1;\n if (after && position === -1) throw new AgentError('UNKNOWN_RESPONSE', 'The response does not belong to this task.');\n for (;;) {\n const response = task.responses[position + 1];\n if (response) {\n if (terminal(response.state)) this.acknowledge(task, readerToken);\n return response;\n }\n if (terminal(task.state)) {\n this.acknowledge(task, readerToken);\n return { version: 1, type: 'terminal', taskId: id,\n sessionId: task.sessionId, state: task.state, ...(task.error ? {error:task.error} : {}) };\n }\n await waitForChange(task.changed, signal);\n }\n }\n\n private acknowledge(task: Task, readerToken?: string) {\n if (!readerToken || !task.parentId || task.stopUnconfirmed) return;\n const parent = this.task(task.parentId);\n if (this.session(parent.sessionId).token === readerToken && parent.nativeActive)\n parent.inbox = parent.inbox.filter(result => result.taskId !== task.id);\n }\n\n status(id: string, full = false) {\n const task = this.task(id), response = task.responses.at(-1);\n return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,\n ...(task.error ? {error: task.error} : {}), ...(response ? { response: {\n responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),\n truncated: !full && response.text.length > 4000 }} : {}) };\n }\n\n async dashboard(): Promise<DashboardSnapshot> {\n // New sessions join the next snapshot; every serialized row has resolved context.\n const admitted = [...this.sessions.values()];\n const workspaces = new Map(await Promise.all(admitted.map(async session =>\n [session.id, await session.workspace] as const)));\n const current: Task[] = [];\n for (const session of admitted) {\n const id = session.active ?? session.tasks[0];\n if (!id) continue;\n const task = this.task(id);\n if (task.state === 'failed' || !terminal(task.state)) current.push(task);\n }\n // Map insertion order records admission order; stable sorting preserves its reversed ties.\n this.dashboardHistory ??= [...this.tasks.values()].reverse().filter(task => terminal(task.state))\n .sort((first, second) => second.finishedAt! - first.finishedAt!);\n const visible = new Set(current.map(task => task.id));\n const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];\n const sessions = tasks.map(task => ({sessionId: task.sessionId, taskId: task.id,\n harness: this.session(task.sessionId).harness, title: task.title, state: task.state,\n workspace: workspaces.get(task.sessionId)!, updatedAt: task.updatedAt,\n ...(task.dispatchedAt === undefined ? {} : {dispatchedAt: task.dispatchedAt}),\n ...(task.failedAt === undefined ? {} : {failedAt: task.failedAt}),\n ...(task.finishedAt === undefined ? {} : {finishedAt: task.finishedAt})}));\n return {version: 1, type: 'dashboard', history: true, grouping: true, sessions};\n }\n\n private finish(task: Task, state: 'completed' | 'failed' | 'cancelled' | 'interrupted', at = this.now(), updatedAt = at) {\n task.state = state;\n task.finishedAt = at;\n task.updatedAt = updatedAt;\n this.dashboardHistory = undefined;\n }\n\n queue(id: string) {\n const session = this.session(id);\n const summary = (task: Task) => ({taskId: task.id, state: task.state, description: task.prompt.slice(0, 120)});\n return {version: 1, type: 'queue', sessionId: id, paused: session.paused,\n ...(session.active ? {active: summary(this.task(session.active))} : {}),\n tasks: session.tasks.map(id => summary(this.task(id)))};\n }\n\n async resume(id: string): Promise<Receipt> {\n const session = this.session(id);\n return this.command(session, async () => {\n const task = session.active ? this.task(session.active) : undefined;\n if (!task || task.state !== 'failed') throw new AgentError('NOT_FAILED', 'This session has no failed task to resume.');\n if (task.stopUnconfirmed || task.stopPromise) throw new AgentError('CANCEL_FAILED', 'Confirm cancellation of the affected executions before recovery.');\n task.stopping = false; task.error = undefined; task.failedAt = undefined; task.finishedAt = undefined; session.paused = false;\n this.dashboardHistory = undefined;\n void this.execute(task, '', true);\n return {version: 1, type: 'started', sessionId: id, taskId: task.id, state: task.state, resumed: true};\n });\n }\n\n async close() {\n await Promise.allSettled([...this.sessions.values()].map(async session => (await session.driver)?.close()));\n }\n\n async cancel(id: string): Promise<Receipt> {\n const task = this.task(id);\n return this.command(this.session(task.sessionId), async () => {\n if (!terminal(task.state) || task.stopUnconfirmed) await this.stop(task, 'cancelled');\n else if (task.state === 'failed') {\n const session = this.session(task.sessionId);\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n }\n return {version: 1, type: 'cancelled', taskId: id, sessionId: task.sessionId, state: task.state};\n });\n }\n\n private command<T>(session: Session, operation: () => Promise<T>): Promise<T> {\n session.controls++;\n const result = session.commands.then(operation, operation).finally(() => {\n session.controls--;\n this.dispatch(session);\n });\n session.commands = result.catch(() => undefined);\n return result;\n }\n\n private stop(task: Task, outcome: 'cancelled' | 'interrupted'): Promise<void> {\n if (task.stopPromise) return task.stopPromise;\n task.stopPromise = this.finishStop(task, outcome).finally(() => {\n task.stopPromise = undefined;\n this.dispatch(this.session(task.sessionId));\n });\n return task.stopPromise;\n }\n\n private async finishStop(task: Task, outcome: 'cancelled' | 'interrupted') {\n const session = this.session(task.sessionId);\n task.stopping = true;\n session.tasks = session.tasks.filter(id => id !== task.id);\n try {\n const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));\n if (task.nativeActive && session.driver) stops.push(session.driver.then(async driver => {\n await driver.interrupt(); task.nativeActive = false;\n }));\n const outcomes = await Promise.allSettled(stops);\n if (outcomes.some(outcome => outcome.status === 'rejected')) throw new Error('Cancellation unconfirmed');\n } catch {\n task.failedAt = this.now();\n this.finish(task, 'failed', task.failedAt); task.error = {code:'CANCEL_FAILED', message:'Native execution could not be confirmed stopped.'};\n task.stopUnconfirmed = true;\n session.paused = true; this.notify(task);\n throw new AgentError('CANCEL_FAILED', task.error.message);\n }\n task.nativeActive = false; this.finish(task, outcome); task.stopUnconfirmed = false; task.error = undefined;\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n this.notify(task); this.deliver(task);\n }\n\n private admit(session: Session, prompt: string, front = false, parentToken?: string): Receipt {\n const parent = this.validateAdmission(session, prompt, parentToken, front);\n const blockedByTaskId = session.paused ? session.active : undefined;\n const task: Task = { id: `tsk_${randomUUID()}`, sessionId: session.id, prompt, title: dashboardTitle(prompt),\n parentId: parent?.id, state: 'queued', responses: [], children: new Set(), inbox: [], nativeActive: false,\n stopping: false, updatedAt: this.now(), changed: new Set() };\n this.tasks.set(task.id, task);\n parent?.children.add(task.id);\n if (front) session.tasks.unshift(task.id); else session.tasks.push(task.id);\n this.dispatch(session);\n return {version: 1, type: 'started', sessionId: session.id, taskId: task.id, state: task.state,\n ...(blockedByTaskId ? {paused: true, blockedByTaskId} : {})};\n }\n\n private validateAdmission(session: Session | undefined, prompt: string, parentToken?: string, replacement = false) {\n if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)\n throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');\n if (!replacement && session && session.tasks.length >= 100) throw new AgentError('QUEUE_FULL', 'The session already has 100 queued tasks.');\n const parent = parentToken ? this.task(this.parentContext(parentToken).taskId) : undefined;\n let depth = 0, ancestor = parent;\n while (ancestor) {\n if (ancestor.sessionId === session?.id) throw new AgentError('INVALID_PARENT', 'A managed task cannot queue work in its own or an ancestor session.');\n depth++; ancestor = ancestor.parentId ? this.task(ancestor.parentId) : undefined;\n }\n if (depth > 8) throw new AgentError('DELEGATION_LIMIT', 'Maximum delegation depth is 8.');\n return parent;\n }\n\n private dispatch(session: Session) {\n if (session.active || session.paused || session.controls) return;\n const id = session.tasks.shift();\n if (!id) return;\n session.active = id;\n void this.execute(this.task(id), this.task(id).prompt);\n }\n\n private async execute(task: Task, prompt: string, recovering = false) {\n const session = this.session(task.sessionId);\n const dispatchedAt = this.now();\n task.dispatchedAt ??= dispatchedAt;\n this.touch(task, dispatchedAt);\n task.state = 'running'; task.nativeActive = true;\n try {\n session.driver ??= this.factory({...session.input, sessionId: session.id, token: session.token});\n const driver = await session.driver;\n if (driver.selectedHarness) {\n const harness = dashboardHarness(driver.selectedHarness);\n if (session.harness !== harness) { session.harness = harness; this.touch(task); }\n }\n if (task.stopping) return;\n const text = recovering ? await driver.resume() : await driver.turn(prompt);\n if (task.stopping) return;\n if (Buffer.byteLength(text) > 1024 * 1024) throw new AgentError('OUTPUT_TOO_LARGE', 'The response exceeds 1 MiB.');\n task.nativeActive = false;\n task.state = this.pending(task) ? 'waiting' : 'completed';\n const respondedAt = this.now();\n if (task.state === 'completed') this.finish(task, 'completed', respondedAt);\n else this.touch(task, respondedAt);\n task.responses.push({version: 1, type: 'response', sessionId: session.id, taskId: task.id,\n responseId: `rsp_${randomUUID()}`, state: task.state, text});\n this.notify(task);\n if (task.state === 'completed') {\n session.active = undefined;\n this.deliver(task);\n this.dispatch(session);\n } else this.continueParent(task);\n } catch (error) {\n if (task.stopping) return;\n task.failedAt = this.now();\n task.nativeActive = false;\n task.stopping = true;\n const stopped = await Promise.allSettled([...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled')));\n task.stopUnconfirmed = stopped.some(result => result.status === 'rejected');\n this.finish(task, 'failed', task.failedAt, this.now()); task.error = task.stopUnconfirmed\n ? {code:'CANCEL_FAILED', message:'Descendant execution could not be confirmed stopped.'} : errorInfo(error);\n session.paused = true; this.notify(task); this.deliver(task);\n }\n }\n\n private pending(task: Task) {\n return task.inbox.length > 0 || [...task.children].some(id => !terminal(this.task(id).state) || this.task(id).stopUnconfirmed);\n }\n\n private deliver(child: Task) {\n if (!child.parentId || child.stopUnconfirmed) return;\n const parent = this.task(child.parentId);\n if (parent.stopping || terminal(parent.state)) return;\n parent.inbox.push({taskId: child.id, state: child.state,\n text: child.error?.message ?? child.responses.at(-1)?.text ?? child.state});\n // Let an attached child command acknowledge delivery through its native tool output first.\n setImmediate(() => this.continueParent(parent));\n }\n\n private continueParent(task: Task) {\n if (task.nativeActive || task.stopping || terminal(task.state) || !task.inbox.length) return;\n const results = task.inbox.splice(0);\n const prompt = 'Delegated task outcomes (continue the current task):\\n' +\n results.map(result => `${result.taskId} [${result.state}]:\\n${result.text}`).join('\\n\\n');\n void this.execute(task, prompt);\n }\n\n private touch(task: Task, at = this.now()) { task.updatedAt = at; }\n private notify(task: Task) { for (const resolve of task.changed) resolve(); task.changed.clear(); }\n private task(id: string) { const task = this.tasks.get(id); if (!task) throw new AgentError('UNKNOWN_TASK', 'Task is unavailable in this coordinator.'); return task; }\n private session(id: string) { const session = this.sessions.get(id); if (!session) throw new AgentError('UNKNOWN_SESSION', 'Session is unavailable in this coordinator.'); return session; }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/runtime/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { waitForChange } from './observation.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { terminal, type DriverFactory, type Observation, type Receipt, type Session, type SessionInput, type Task, type Delivery } from './types.js';\nimport { dashboardHarness, dashboardTitle, type DashboardDetail, type DashboardRelatedTask,\n type DashboardRow, type DashboardSession, type DashboardSnapshot, type DashboardWorkspace } from './dashboard.js';\nimport { resolveDashboardWorkspace } from './dashboard-workspace.js';\nimport { ApprovalRegistry } from './approval-registry.js';\n\nexport class Coordinator {\n private sessions = new Map<string, Session>();\n private tasks = new Map<string, Task>();\n private dashboardHistory?: Task[];\n private closed = false;\n private approvals = new ApprovalRegistry(id => this.approvalChanged(this.task(id)));\n constructor(private readonly factory: DriverFactory, private readonly now: () => number = Date.now) {}\n\n parentContext(token: string) {\n const session = [...this.sessions.values()].find(session => session.token === token);\n const task = session?.active ? this.task(session.active) : undefined;\n if (!session || !task || task.stopping || terminal(task.state))\n throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');\n return {taskId: task.id, reference: session.input.reference, cwd: session.input.cwd};\n }\n\n run(input: SessionInput): Receipt {\n this.validateAdmission(undefined, input.prompt, input.parentToken);\n const selected = 'kind' in input.reference ? input.reference.harness.kind : undefined;\n const session: Session = { id: `ses_${randomUUID()}`, token: randomUUID(), input,\n tasks: [], paused: false, commands: Promise.resolve(), controls: 0, harness: dashboardHarness(selected),\n workspace: resolveDashboardWorkspace(input.cwd) };\n this.sessions.set(session.id, session);\n return this.admit(session, input.prompt, false, input.parentToken);\n }\n\n async send(id: string, prompt: string, delivery: Delivery, parentToken?: string): Promise<Receipt> {\n const session = this.session(id);\n const operation = async (): Promise<Receipt> => {\n if (!['queue', 'steer', 'interrupt'].includes(delivery)) throw new AgentError('INVALID_ARGUMENT', 'Unknown delivery mode.');\n this.validateAdmission(session, prompt, parentToken, delivery !== 'queue');\n if (delivery === 'queue') return this.admit(session, prompt, false, parentToken);\n const task = session.active ? this.task(session.active) : undefined;\n if (delivery === 'steer') {\n if (!task || terminal(task.state) || task.stopping) throw new AgentError('NO_ACTIVE_TASK', 'There is no active task accepting steering.');\n if (!task.nativeActive) {\n void this.execute(task, prompt);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n }\n try {\n await (await session.driver!).steer(prompt);\n this.touch(task);\n return {version: 1, type: 'accepted', sessionId: id, taskId: task.id, delivery: 'steer'};\n } catch (error) {\n if (!(error instanceof AgentError) || error.code !== 'UNSUPPORTED_DELIVERY') throw error;\n }\n }\n if (task && (!terminal(task.state) || task.stopUnconfirmed || task.state === 'failed')) await this.stop(task, 'interrupted');\n session.paused = false;\n const receipt = this.admit(session, prompt, true, parentToken);\n return {...receipt, requestedDelivery: delivery, delivery: 'interrupt'};\n };\n return this.command(session, operation);\n }\n\n async observe(id: string, after?: string, readerToken?: string, signal?: AbortSignal): Promise<Observation> {\n const task = this.task(id);\n const position = after ? task.responses.findIndex(response => response.responseId === after) : -1;\n if (after && position === -1) throw new AgentError('UNKNOWN_RESPONSE', 'The response does not belong to this task.');\n for (;;) {\n const response = task.responses[position + 1];\n if (response) {\n if (terminal(response.state)) this.acknowledge(task, readerToken);\n return response;\n }\n if (terminal(task.state)) {\n this.acknowledge(task, readerToken);\n return { version: 1, type: 'terminal', taskId: id,\n sessionId: task.sessionId, state: task.state, ...(task.error ? {error:task.error} : {}) };\n }\n const requests = this.pendingApprovals(task);\n if (requests.length) return {version:1,type:'approval_required',taskId:id,\n sessionId:task.sessionId,state:task.state,requests};\n await waitForChange(task.changed, signal);\n }\n }\n\n private acknowledge(task: Task, readerToken?: string) {\n if (!readerToken || !task.parentId || task.stopUnconfirmed) return;\n const parent = this.task(task.parentId);\n if (this.session(parent.sessionId).token === readerToken && parent.nativeActive)\n parent.inbox = parent.inbox.filter(result => result.taskId !== task.id);\n }\n\n status(id: string, full = false) {\n const task = this.task(id), response = task.responses.at(-1);\n const requests = this.pendingApprovals(task);\n return { version: 1, type: 'status', taskId: id, sessionId: task.sessionId, state: task.state,\n ...(requests.length ? {requests} : {}),\n ...(task.error ? {error: task.error} : {}), ...(response ? { response: {\n responseId: response.responseId, text: full ? response.text : response.text.slice(0, 4000),\n truncated: !full && response.text.length > 4000 }} : {}) };\n }\n\n respond(id: string, content: unknown, parentToken?: string) {\n const request = this.approvals.request(id);\n if (parentToken !== undefined) {\n let caller: string;\n try { caller = this.parentContext(parentToken).taskId; }\n catch { throw new AgentError('INVALID_APPROVAL_OWNER','The caller cannot answer this permission request.'); }\n let ancestor = this.task(request.taskId).parentId;\n while (ancestor && ancestor !== caller) ancestor = this.task(ancestor).parentId;\n if (!ancestor) throw new AgentError('INVALID_APPROVAL_OWNER','Only an active strict ancestor can answer this permission request.');\n }\n return this.approvals.respond(id,content);\n }\n\n async dashboard(): Promise<DashboardSnapshot> {\n // New sessions join the next snapshot; every serialized row has resolved context.\n const admitted = [...this.sessions.values()];\n const workspaces = new Map(await Promise.all(admitted.map(async session =>\n [session.id, await session.workspace] as const)));\n const current: Task[] = [];\n for (const session of admitted) {\n const id = session.active ?? session.tasks[0];\n if (!id) continue;\n const task = this.task(id);\n if (task.state === 'failed' || !terminal(task.state)) current.push(task);\n }\n // Map insertion order records admission order; stable sorting preserves its reversed ties.\n this.dashboardHistory ??= [...this.tasks.values()].reverse().filter(task => terminal(task.state))\n .sort((first, second) => second.finishedAt! - first.finishedAt!);\n const visible = new Set(current.map(task => task.id));\n const tasks = [...current, ...this.dashboardHistory.filter(task => workspaces.has(task.sessionId) && !visible.has(task.id))];\n const sessions = tasks.map(task => this.dashboardRow(task, workspaces.get(task.sessionId)!));\n return {version: 1, type: 'dashboard', history: true, grouping: true, sessions};\n }\n\n async dashboardDetail(id: string, includePrompt = true, knownResponseId?: string): Promise<DashboardDetail> {\n const task = this.task(id);\n const session = this.session(task.sessionId);\n const workspace = await session.workspace;\n const response = task.responses.at(-1);\n return {\n version: 1,\n type: 'dashboard-detail',\n task: this.dashboardRow(task, workspace),\n ...(includePrompt ? {prompt: task.prompt} : {}),\n ...(response ? {response: {\n responseId: response.responseId,\n ...(response.responseId === knownResponseId ? {} : {text: response.text}),\n }} : {}),\n ...(task.error ? {error: task.error} : {}),\n children: [...task.children].map(childId => this.dashboardRelatedTask(this.task(childId))),\n queue: {\n paused: session.paused,\n tasks: session.tasks.map(taskId => this.dashboardRelatedTask(this.task(taskId))),\n },\n stopUnconfirmed: task.stopUnconfirmed ?? false,\n };\n }\n\n async dashboardSession(id: string): Promise<DashboardSession> {\n const session = this.session(this.task(id).sessionId);\n const workspace = await session.workspace;\n // Collect all metadata after discovery, without another asynchronous boundary.\n const retained = [...this.tasks.values()];\n const tasks = retained.filter(task => task.sessionId === session.id);\n const childIds = new Set(tasks.flatMap(task => [...task.children]));\n const childSessions = new Set(retained.filter(task => childIds.has(task.id)).map(task => task.sessionId));\n const latest = new Map<string, string>();\n const titles = new Map<string, string>();\n for (const task of retained) {\n latest.set(task.sessionId, task.id);\n if (!titles.has(task.sessionId)) titles.set(task.sessionId, task.title);\n }\n const representative = (candidate: Session) => this.task(candidate.active ?? candidate.tasks[0]\n ?? latest.get(candidate.id)!);\n const requests = tasks.map((task, index) => ({...this.dashboardRow(task, workspace),\n ordinal: index + 1, stopUnconfirmed: task.stopUnconfirmed ?? false}));\n requests.sort((first, second) => Number(second.state === 'queued') - Number(first.state === 'queued')\n || second.ordinal - first.ordinal);\n return {\n version: 1, type: 'dashboard-session', taskId: id, sessionId: session.id,\n title: titles.get(session.id)!, harness: session.harness,\n state: representative(session).state, workspace, requests,\n subagents: [...childSessions].map(sessionId => {\n const child = this.session(sessionId);\n return {...this.dashboardRelatedTask(representative(child)), title: titles.get(child.id)!};\n }),\n queuePaused: session.paused,\n };\n }\n\n private dashboardRow(task: Task, workspace: DashboardWorkspace): DashboardRow {\n return {sessionId: task.sessionId, taskId: task.id,\n harness: this.session(task.sessionId).harness, title: task.title, state: task.state,\n workspace, updatedAt: task.updatedAt,\n ...(task.dispatchedAt === undefined ? {} : {dispatchedAt: task.dispatchedAt}),\n ...(task.failedAt === undefined ? {} : {failedAt: task.failedAt}),\n ...(task.finishedAt === undefined ? {} : {finishedAt: task.finishedAt})};\n }\n\n private dashboardRelatedTask(task: Task): DashboardRelatedTask {\n return {taskId: task.id, sessionId: task.sessionId, harness: this.session(task.sessionId).harness,\n title: task.title, state: task.state};\n }\n\n private finish(task: Task, state: 'completed' | 'failed' | 'cancelled' | 'interrupted', at = this.now(), updatedAt = at) {\n task.state = state;\n task.finishedAt = at;\n task.updatedAt = updatedAt;\n this.dashboardHistory = undefined;\n }\n\n queue(id: string) {\n const session = this.session(id);\n const summary = (task: Task) => ({taskId: task.id, state: task.state, description: task.prompt.slice(0, 120)});\n return {version: 1, type: 'queue', sessionId: id, paused: session.paused,\n ...(session.active ? {active: summary(this.task(session.active))} : {}),\n tasks: session.tasks.map(id => summary(this.task(id)))};\n }\n\n async resume(id: string): Promise<Receipt> {\n const session = this.session(id);\n return this.command(session, async () => {\n const task = session.active ? this.task(session.active) : undefined;\n if (!task || task.state !== 'failed') throw new AgentError('NOT_FAILED', 'This session has no failed task to resume.');\n if (task.stopUnconfirmed || task.stopPromise) throw new AgentError('CANCEL_FAILED', 'Confirm cancellation of the affected executions before recovery.');\n task.stopping = false; task.error = undefined; task.failedAt = undefined; task.finishedAt = undefined; session.paused = false;\n this.dashboardHistory = undefined;\n void this.execute(task, '', true);\n return {version: 1, type: 'started', sessionId: id, taskId: task.id, state: task.state, resumed: true};\n });\n }\n\n async close() {\n this.closed = true;\n for (const task of this.tasks.values()) if (!terminal(task.state)) task.stopping = true;\n this.approvals.close();\n await Promise.allSettled([...this.sessions.values()].map(async session => (await session.driver)?.close()));\n }\n\n async cancel(id: string): Promise<Receipt> {\n const task = this.task(id);\n return this.command(this.session(task.sessionId), async () => {\n if (!terminal(task.state) || task.stopUnconfirmed) await this.stop(task, 'cancelled');\n else if (task.state === 'failed') {\n const session = this.session(task.sessionId);\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n }\n return {version: 1, type: 'cancelled', taskId: id, sessionId: task.sessionId, state: task.state};\n });\n }\n\n private command<T>(session: Session, operation: () => Promise<T>): Promise<T> {\n session.controls++;\n const result = session.commands.then(operation, operation).finally(() => {\n session.controls--;\n this.dispatch(session);\n });\n session.commands = result.catch(() => undefined);\n return result;\n }\n\n private stop(task: Task, outcome: 'cancelled' | 'interrupted'): Promise<void> {\n if (task.stopPromise) return task.stopPromise;\n task.stopPromise = this.finishStop(task, outcome).finally(() => {\n task.stopPromise = undefined;\n this.dispatch(this.session(task.sessionId));\n });\n return task.stopPromise;\n }\n\n private async finishStop(task: Task, outcome: 'cancelled' | 'interrupted') {\n const session = this.session(task.sessionId);\n task.stopping = true;\n this.approvals.retireTask(task.id);\n session.tasks = session.tasks.filter(id => id !== task.id);\n try {\n const stops = [...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled'));\n if (task.nativeActive && session.driver) stops.push(session.driver.then(async driver => {\n await driver.interrupt(); task.nativeActive = false;\n }));\n const outcomes = await Promise.allSettled(stops);\n if (outcomes.some(outcome => outcome.status === 'rejected')) throw new Error('Cancellation unconfirmed');\n } catch {\n task.failedAt = this.now();\n this.finish(task, 'failed', task.failedAt); task.error = {code:'CANCEL_FAILED', message:'Native execution could not be confirmed stopped.'};\n task.stopUnconfirmed = true;\n session.paused = true; this.notify(task);\n throw new AgentError('CANCEL_FAILED', task.error.message);\n }\n task.nativeActive = false; this.finish(task, outcome); task.stopUnconfirmed = false; task.error = undefined;\n if (session.active === task.id) { session.active = undefined; session.paused = false; }\n this.notify(task); this.deliver(task);\n }\n\n private admit(session: Session, prompt: string, front = false, parentToken?: string): Receipt {\n const parent = this.validateAdmission(session, prompt, parentToken, front);\n const blockedByTaskId = session.paused ? session.active : undefined;\n const task: Task = { id: `tsk_${randomUUID()}`, sessionId: session.id, prompt, title: dashboardTitle(prompt),\n parentId: parent?.id, state: 'queued', responses: [], children: new Set(), inbox: [], nativeActive: false,\n stopping: false, updatedAt: this.now(), changed: new Set() };\n this.tasks.set(task.id, task);\n parent?.children.add(task.id);\n if (front) session.tasks.unshift(task.id); else session.tasks.push(task.id);\n this.dispatch(session);\n return {version: 1, type: 'started', sessionId: session.id, taskId: task.id, state: task.state,\n ...(blockedByTaskId ? {paused: true, blockedByTaskId} : {})};\n }\n\n private validateAdmission(session: Session | undefined, prompt: string, parentToken?: string, replacement = false) {\n if (this.closed) throw new AgentError('COORDINATOR_UNAVAILABLE','The coordinator is shutting down.');\n if (typeof prompt !== 'string' || !prompt.trim() || Buffer.byteLength(prompt) > 1024 * 1024)\n throw new AgentError('INVALID_ARGUMENT', 'Prompt must contain text and cannot exceed 1 MiB.');\n if (!replacement && session && session.tasks.length >= 100) throw new AgentError('QUEUE_FULL', 'The session already has 100 queued tasks.');\n const parent = parentToken ? this.task(this.parentContext(parentToken).taskId) : undefined;\n let depth = 0, ancestor = parent;\n while (ancestor) {\n if (ancestor.sessionId === session?.id) throw new AgentError('INVALID_PARENT', 'A managed task cannot queue work in its own or an ancestor session.');\n depth++; ancestor = ancestor.parentId ? this.task(ancestor.parentId) : undefined;\n }\n if (depth > 8) throw new AgentError('DELEGATION_LIMIT', 'Maximum delegation depth is 8.');\n return parent;\n }\n\n private dispatch(session: Session) {\n if (this.closed || session.active || session.paused || session.controls) return;\n const id = session.tasks.shift();\n if (!id) return;\n session.active = id;\n void this.execute(this.task(id), this.task(id).prompt);\n }\n\n private async execute(task: Task, prompt: string, recovering = false) {\n const session = this.session(task.sessionId);\n const dispatchedAt = this.now();\n task.dispatchedAt ??= dispatchedAt;\n this.touch(task, dispatchedAt);\n task.state = 'running'; task.nativeActive = true;\n try {\n session.driver ??= this.factory({...session.input, sessionId: session.id, token: session.token,\n onApproval: async (request,signal) => {\n const active = session.active ? this.task(session.active) : undefined;\n if (this.closed || !active || active.stopping || !active.nativeActive || terminal(active.state))\n throw new AgentError('REQUEST_EXPIRED','The native permission request is no longer pending.');\n return this.approvals.register(active.id,session.id,request,signal);\n }});\n const driver = await session.driver;\n if (driver.selectedHarness) {\n const harness = dashboardHarness(driver.selectedHarness);\n if (session.harness !== harness) { session.harness = harness; this.touch(task); }\n }\n if (task.stopping) return;\n const text = recovering ? await driver.resume() : await driver.turn(prompt);\n this.approvals.retireTask(task.id);\n if (task.stopping) return;\n if (Buffer.byteLength(text) > 1024 * 1024) throw new AgentError('OUTPUT_TOO_LARGE', 'The response exceeds 1 MiB.');\n task.nativeActive = false;\n task.state = this.pending(task) ? 'waiting' : 'completed';\n const respondedAt = this.now();\n if (task.state === 'completed') this.finish(task, 'completed', respondedAt);\n else this.touch(task, respondedAt);\n task.responses.push({version: 1, type: 'response', sessionId: session.id, taskId: task.id,\n responseId: `rsp_${randomUUID()}`, state: task.state, text});\n this.notify(task);\n if (task.state === 'completed') {\n session.active = undefined;\n this.deliver(task);\n this.dispatch(session);\n } else this.continueParent(task);\n } catch (error) {\n this.approvals.retireTask(task.id);\n if (task.stopping) return;\n task.failedAt = this.now();\n task.nativeActive = false;\n task.stopping = true;\n const stopped = await Promise.allSettled([...task.children].map(id => this.task(id)).filter(child => !terminal(child.state) || child.stopUnconfirmed).map(child => this.stop(child, 'cancelled')));\n task.stopUnconfirmed = stopped.some(result => result.status === 'rejected');\n this.finish(task, 'failed', task.failedAt, this.now()); task.error = task.stopUnconfirmed\n ? {code:'CANCEL_FAILED', message:'Descendant execution could not be confirmed stopped.'} : errorInfo(error);\n session.paused = true; this.notify(task); this.deliver(task);\n }\n }\n\n private pending(task: Task) {\n return task.inbox.length > 0 || [...task.children].some(id => !terminal(this.task(id).state) || this.task(id).stopUnconfirmed);\n }\n\n private deliver(child: Task) {\n if (!child.parentId || child.stopUnconfirmed) return;\n const parent = this.task(child.parentId);\n if (parent.stopping || terminal(parent.state)) return;\n parent.inbox.push({taskId: child.id, state: child.state,\n text: child.error?.message ?? child.responses.at(-1)?.text ?? child.state});\n // Let an attached child command acknowledge delivery through its native tool output first.\n setImmediate(() => this.continueParent(parent));\n }\n\n private continueParent(task: Task) {\n if (task.nativeActive || task.stopping || terminal(task.state) || !task.inbox.length) return;\n const results = task.inbox.splice(0);\n const prompt = 'Delegated task outcomes (continue the current task):\\n' +\n results.map(result => `${result.taskId} [${result.state}]:\\n${result.text}`).join('\\n\\n');\n void this.execute(task, prompt);\n }\n\n private touch(task: Task, at = this.now()) { task.updatedAt = at; }\n private pendingApprovals(task: Task): import('./types.js').ApprovalRequest[] {\n return [...this.approvals.pendingFor(task.id), ...[...task.children].flatMap(id => this.pendingApprovals(this.task(id)))];\n }\n private approvalChanged(task: Task) {\n if (!task.stopping && task.nativeActive) task.state = this.approvals.pendingFor(task.id).length ? 'awaiting_approval' : 'running';\n this.touch(task);\n let current: Task | undefined = task;\n while (current) { this.notify(current); current = current.parentId ? this.task(current.parentId) : undefined; }\n }\n private notify(task: Task) { for (const resolve of task.changed) resolve(); task.changed.clear(); }\n private task(id: string) { const task = this.tasks.get(id); if (!task) throw new AgentError('UNKNOWN_TASK', 'Task is unavailable in this coordinator.'); return task; }\n private session(id: string) { const session = this.sessions.get(id); if (!session) throw new AgentError('UNKNOWN_SESSION', 'Session is unavailable in this coordinator.'); return session; }\n}\n"]}
|