subharness 0.0.3 → 0.0.5
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 +39 -9
- 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-process.d.ts +3 -0
- package/dist/adapters/claude-process.js +11 -1
- package/dist/adapters/claude-process.js.map +1 -1
- package/dist/adapters/claude-result.d.ts +2 -0
- package/dist/adapters/claude-result.js +22 -0
- package/dist/adapters/claude-result.js.map +1 -0
- package/dist/adapters/claude.js +60 -12
- 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 +36 -3
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot-permissions.d.ts +26 -0
- package/dist/adapters/copilot-permissions.js +121 -0
- package/dist/adapters/copilot-permissions.js.map +1 -0
- package/dist/adapters/copilot-tools.d.ts +12 -0
- package/dist/adapters/copilot-tools.js +61 -0
- package/dist/adapters/copilot-tools.js.map +1 -0
- package/dist/adapters/copilot.d.ts +108 -0
- package/dist/adapters/copilot.js +819 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
- package/dist/adapters/cursor-cli-approvals.js +83 -0
- package/dist/adapters/cursor-cli-approvals.js.map +1 -0
- package/dist/adapters/cursor-cli-model.d.ts +4 -0
- package/dist/adapters/cursor-cli-model.js +64 -0
- package/dist/adapters/cursor-cli-model.js.map +1 -0
- package/dist/adapters/cursor-cli-session.d.ts +32 -0
- package/dist/adapters/cursor-cli-session.js +316 -0
- package/dist/adapters/cursor-cli-session.js.map +1 -0
- package/dist/adapters/cursor-cli-tools.d.ts +20 -0
- package/dist/adapters/cursor-cli-tools.js +181 -0
- package/dist/adapters/cursor-cli-tools.js.map +1 -0
- package/dist/adapters/cursor-cli.d.ts +2 -0
- package/dist/adapters/cursor-cli.js +306 -0
- package/dist/adapters/cursor-cli.js.map +1 -0
- package/dist/adapters/cursor-model.d.ts +7 -0
- package/dist/adapters/cursor-model.js +67 -0
- package/dist/adapters/cursor-model.js.map +1 -0
- package/dist/adapters/cursor-rpc.d.ts +42 -0
- package/dist/adapters/cursor-rpc.js +271 -0
- package/dist/adapters/cursor-rpc.js.map +1 -0
- package/dist/adapters/cursor-session.d.ts +4 -0
- package/dist/adapters/cursor-session.js +327 -0
- package/dist/adapters/cursor-session.js.map +1 -0
- package/dist/adapters/cursor-startup.d.ts +16 -0
- package/dist/adapters/cursor-startup.js +74 -0
- package/dist/adapters/cursor-startup.js.map +1 -0
- package/dist/adapters/cursor-tools.d.ts +11 -0
- package/dist/adapters/cursor-tools.js +49 -0
- package/dist/adapters/cursor-tools.js.map +1 -0
- package/dist/adapters/cursor.d.ts +6 -0
- package/dist/adapters/cursor.js +17 -0
- package/dist/adapters/cursor.js.map +1 -0
- 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-auth.d.ts +12 -2
- package/dist/adapters/fx-auth.js +51 -61
- package/dist/adapters/fx-auth.js.map +1 -1
- package/dist/adapters/fx-profile.d.ts +8 -0
- package/dist/adapters/fx-profile.js +101 -0
- package/dist/adapters/fx-profile.js.map +1 -0
- package/dist/adapters/fx-rpc.d.ts +2 -0
- package/dist/adapters/fx-rpc.js +30 -4
- package/dist/adapters/fx-rpc.js.map +1 -1
- package/dist/adapters/fx-status.d.ts +2 -0
- package/dist/adapters/fx-status.js +96 -0
- package/dist/adapters/fx-status.js.map +1 -0
- package/dist/adapters/fx.js +77 -30
- package/dist/adapters/fx.js.map +1 -1
- package/dist/adapters/opencode-access.d.ts +13 -0
- package/dist/adapters/opencode-access.js +76 -0
- package/dist/adapters/opencode-access.js.map +1 -0
- package/dist/adapters/opencode-config.d.ts +11 -0
- package/dist/adapters/opencode-config.js +238 -0
- package/dist/adapters/opencode-config.js.map +1 -0
- package/dist/adapters/opencode-http.d.ts +28 -0
- package/dist/adapters/opencode-http.js +297 -0
- package/dist/adapters/opencode-http.js.map +1 -0
- package/dist/adapters/opencode-tools.d.ts +19 -0
- package/dist/adapters/opencode-tools.js +127 -0
- package/dist/adapters/opencode-tools.js.map +1 -0
- package/dist/adapters/opencode.d.ts +2 -0
- package/dist/adapters/opencode.js +569 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/rpc.d.ts +3 -0
- package/dist/adapters/rpc.js +45 -4
- package/dist/adapters/rpc.js.map +1 -1
- package/dist/adapters/types.d.ts +7 -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 +3 -2
- package/dist/cli/args.js +24 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/dashboard-client.d.ts +5 -1
- package/dist/cli/dashboard-client.js +162 -15
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/dashboard-controller.d.ts +7 -0
- package/dist/cli/dashboard-controller.js +27 -0
- package/dist/cli/dashboard-controller.js.map +1 -0
- package/dist/cli/dashboard-detail-view.d.ts +16 -0
- package/dist/cli/dashboard-detail-view.js +162 -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 +128 -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 +32 -30
- 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 +5 -3
- package/dist/cli/dashboard.js +102 -12
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +37 -12
- 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 +6 -2
- 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/config/access-provenance.d.ts +10 -0
- package/dist/config/access-provenance.js +31 -0
- package/dist/config/access-provenance.js.map +1 -0
- package/dist/config/access.d.ts +12 -2
- package/dist/config/access.js +125 -27
- package/dist/config/access.js.map +1 -1
- package/dist/config/loader.js +1 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/oidc.js +4 -2
- package/dist/config/oidc.js.map +1 -1
- package/dist/config/project.js +2 -1
- package/dist/config/project.js.map +1 -1
- package/dist/config/resolve-access.js +24 -10
- package/dist/config/resolve-access.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/process-diagnostics.d.ts +2 -0
- package/dist/process-diagnostics.js +11 -0
- package/dist/process-diagnostics.js.map +1 -0
- package/dist/runtime/access-errors.d.ts +4 -0
- package/dist/runtime/access-errors.js +25 -0
- package/dist/runtime/access-errors.js.map +1 -0
- 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/client.js +54 -14
- package/dist/runtime/client.js.map +1 -1
- 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-sanitize.d.ts +2 -0
- package/dist/runtime/dashboard-sanitize.js +7 -0
- package/dist/runtime/dashboard-sanitize.js.map +1 -0
- package/dist/runtime/dashboard.d.ts +43 -1
- package/dist/runtime/dashboard.js +2 -3
- package/dist/runtime/dashboard.js.map +1 -1
- package/dist/runtime/definition.js +11 -1
- package/dist/runtime/definition.js.map +1 -1
- package/dist/runtime/select-native.d.ts +2 -1
- package/dist/runtime/select-native.js +28 -10
- 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 +73 -20
- 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/dist/sdk/definitions.d.ts +4 -1
- package/dist/sdk/definitions.js +16 -2
- package/dist/sdk/definitions.js.map +1 -1
- package/dist/sdk/permission-validation.js +10 -1
- package/dist/sdk/permission-validation.js.map +1 -1
- package/dist/sdk/types.d.ts +29 -1
- package/dist/sdk/types.js.map +1 -1
- package/package.json +4 -1
- package/sdk/access-config.md +86 -4
- package/sdk/adapter-contract.md +7 -13
- package/sdk/additional-harnesses.md +43 -0
- package/sdk/agent-skill.md +7 -4
- package/sdk/agent.md +5 -3
- package/sdk/approvals.md +120 -0
- package/sdk/authentication.md +1 -1
- package/sdk/cli/dashboard-design.md +44 -4
- package/sdk/cli/dashboard-inspection.md +25 -0
- package/sdk/cli/index.md +20 -11
- package/sdk/cli/output.md +10 -4
- package/sdk/completion-notifications.md +2 -0
- package/sdk/config.md +1 -1
- package/sdk/copilot.md +53 -0
- package/sdk/cursor.md +68 -0
- package/sdk/diagnostics.md +29 -0
- package/sdk/distribution.md +53 -1
- package/sdk/evals.md +10 -4
- package/sdk/fx.md +51 -6
- package/sdk/harnesses.md +13 -13
- package/sdk/index.md +4 -2
- package/sdk/message-delivery.md +1 -1
- package/sdk/opencode.md +57 -0
- package/sdk/permissions.md +7 -5
- package/sdk/pr-integration.md +1 -1
- package/sdk/project-team.md +2 -0
- package/sdk/sessions.md +4 -1
- package/sdk/tools.md +1 -1
- package/sdk/v1-runtime.md +6 -6
|
@@ -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"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import stripAnsi from 'strip-ansi';
|
|
2
|
+
const unsafeControls = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/gu;
|
|
3
|
+
/** Removes terminal instructions while retaining whitespace for the caller to normalize. */
|
|
4
|
+
export function sanitizeDashboardTerminalText(text) {
|
|
5
|
+
return stripAnsi(text).replace(unsafeControls, '');
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=dashboard-sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-sanitize.js","sourceRoot":"","sources":["../../src/runtime/dashboard-sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,cAAc,GAAG,yDAAyD,CAAC;AAEjF,4FAA4F;AAC5F,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import stripAnsi from 'strip-ansi';\n\nconst unsafeControls = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/gu;\n\n/** Removes terminal instructions while retaining whitespace for the caller to normalize. */\nexport function sanitizeDashboardTerminalText(text: string): string {\n return stripAnsi(text).replace(unsafeControls, '');\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { ErrorInfo } from '../errors.js';
|
|
1
2
|
import type { HarnessKind } from '../sdk/types.js';
|
|
2
3
|
import type { TaskState } from './types.js';
|
|
3
|
-
export type DashboardHarness = 'codex' | 'claude' | 'fx' | 'pending';
|
|
4
|
+
export type DashboardHarness = 'codex' | 'claude' | 'fx' | 'opencode' | 'copilot' | 'cursor' | 'pending';
|
|
4
5
|
export interface DashboardWorkspace {
|
|
5
6
|
directory: string;
|
|
6
7
|
repository?: string;
|
|
@@ -24,5 +25,46 @@ export interface DashboardSnapshot {
|
|
|
24
25
|
grouping: true;
|
|
25
26
|
sessions: DashboardRow[];
|
|
26
27
|
}
|
|
28
|
+
export interface DashboardRelatedTask {
|
|
29
|
+
taskId: string;
|
|
30
|
+
sessionId: string;
|
|
31
|
+
harness: DashboardHarness;
|
|
32
|
+
title: string;
|
|
33
|
+
state: TaskState;
|
|
34
|
+
}
|
|
35
|
+
export interface DashboardRequest extends DashboardRow {
|
|
36
|
+
ordinal: number;
|
|
37
|
+
stopUnconfirmed: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface DashboardSession {
|
|
40
|
+
version: 1;
|
|
41
|
+
type: 'dashboard-session';
|
|
42
|
+
taskId: string;
|
|
43
|
+
sessionId: string;
|
|
44
|
+
title: string;
|
|
45
|
+
harness: DashboardHarness;
|
|
46
|
+
state: TaskState;
|
|
47
|
+
workspace: DashboardWorkspace;
|
|
48
|
+
requests: DashboardRequest[];
|
|
49
|
+
subagents: DashboardRelatedTask[];
|
|
50
|
+
queuePaused: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface DashboardDetail {
|
|
53
|
+
version: 1;
|
|
54
|
+
type: 'dashboard-detail';
|
|
55
|
+
task: DashboardRow;
|
|
56
|
+
prompt?: string;
|
|
57
|
+
response?: {
|
|
58
|
+
responseId: string;
|
|
59
|
+
text?: string;
|
|
60
|
+
};
|
|
61
|
+
error?: ErrorInfo;
|
|
62
|
+
children: DashboardRelatedTask[];
|
|
63
|
+
queue: {
|
|
64
|
+
paused: boolean;
|
|
65
|
+
tasks: DashboardRelatedTask[];
|
|
66
|
+
};
|
|
67
|
+
stopUnconfirmed: boolean;
|
|
68
|
+
}
|
|
27
69
|
export declare function dashboardHarness(kind?: HarnessKind): DashboardHarness;
|
|
28
70
|
export declare function dashboardTitle(prompt: string): string;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sanitizeDashboardTerminalText } from './dashboard-sanitize.js';
|
|
2
2
|
export function dashboardHarness(kind) {
|
|
3
3
|
if (kind === 'claudeCode')
|
|
4
4
|
return 'claude';
|
|
5
5
|
return kind ?? 'pending';
|
|
6
6
|
}
|
|
7
7
|
export function dashboardTitle(prompt) {
|
|
8
|
-
const plain =
|
|
8
|
+
const plain = sanitizeDashboardTerminalText(prompt);
|
|
9
9
|
for (const line of plain.split(/\r\n?|\n/u)) {
|
|
10
10
|
const normalized = line
|
|
11
|
-
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/gu, '')
|
|
12
11
|
.replace(/\s+/gu, ' ')
|
|
13
12
|
.trim();
|
|
14
13
|
if (normalized)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/runtime/dashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/runtime/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,6BAA6B,EAAC,MAAM,yBAAyB,CAAC;AAsEtE,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI;aACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,IAAI,EAAE,CAAC;QACV,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import type { ErrorInfo } from '../errors.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport {sanitizeDashboardTerminalText} from './dashboard-sanitize.ts';\nimport type { TaskState } from './types.js';\n\nexport type DashboardHarness = 'codex' | 'claude' | 'fx' | 'opencode' | 'copilot' | 'cursor' | 'pending';\n\nexport interface DashboardWorkspace {\n directory: string;\n repository?: string;\n}\n\nexport interface DashboardRow {\n sessionId: string;\n taskId: string;\n harness: DashboardHarness;\n title: string;\n state: TaskState;\n workspace: DashboardWorkspace;\n updatedAt: number;\n dispatchedAt?: number;\n failedAt?: number;\n finishedAt?: number;\n}\n\nexport interface DashboardSnapshot {\n version: 1;\n type: 'dashboard';\n history: true;\n grouping: true;\n sessions: DashboardRow[];\n}\n\nexport interface DashboardRelatedTask {\n taskId: string;\n sessionId: string;\n harness: DashboardHarness;\n title: string;\n state: TaskState;\n}\n\nexport interface DashboardRequest extends DashboardRow {\n ordinal: number;\n stopUnconfirmed: boolean;\n}\n\nexport interface DashboardSession {\n version: 1;\n type: 'dashboard-session';\n taskId: string;\n sessionId: string;\n title: string;\n harness: DashboardHarness;\n state: TaskState;\n workspace: DashboardWorkspace;\n requests: DashboardRequest[];\n subagents: DashboardRelatedTask[];\n queuePaused: boolean;\n}\n\nexport interface DashboardDetail {\n version: 1;\n type: 'dashboard-detail';\n task: DashboardRow;\n prompt?: string;\n response?: {responseId: string; text?: string};\n error?: ErrorInfo;\n children: DashboardRelatedTask[];\n queue: {paused: boolean; tasks: DashboardRelatedTask[]};\n stopUnconfirmed: boolean;\n}\n\nexport function dashboardHarness(kind?: HarnessKind): DashboardHarness {\n if (kind === 'claudeCode') return 'claude';\n return kind ?? 'pending';\n}\n\nexport function dashboardTitle(prompt: string): string {\n const plain = sanitizeDashboardTerminalText(prompt);\n for (const line of plain.split(/\\r\\n?|\\n/u)) {\n const normalized = line\n .replace(/\\s+/gu, ' ')\n .trim();\n if (normalized) return [...normalized].slice(0, 120).join('');\n }\n return '(untitled)';\n}\n"]}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { loadDefinition } from '../config/loader.js';
|
|
2
2
|
import { AgentError } from '../errors.js';
|
|
3
3
|
export function harnessReference(kind, model, effort) {
|
|
4
|
+
if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && !model?.trim()) {
|
|
5
|
+
throw new AgentError('INVALID_CONFIG', `${kind} requires --model with an explicit nonempty model identifier.`);
|
|
6
|
+
}
|
|
7
|
+
if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && effort !== undefined) {
|
|
8
|
+
throw new AgentError('INVALID_ARGUMENT', `${kind} does not support --effort.`);
|
|
9
|
+
}
|
|
4
10
|
if (kind === 'claudeCode') {
|
|
5
11
|
if (effort !== undefined && effort !== 'low' && effort !== 'medium' && effort !== 'high' && effort !== 'xhigh' && effort !== 'max') {
|
|
6
12
|
throw new AgentError('INVALID_ARGUMENT', 'Claude effort must be low, medium, high, xhigh, or max.');
|
|
7
13
|
}
|
|
8
14
|
return { kind: 'harness', harness: { kind, model, effort, fast: false } };
|
|
9
15
|
}
|
|
10
|
-
|
|
16
|
+
if (kind === 'fx')
|
|
17
|
+
return { kind: 'harness', harness: { kind, model, effort } };
|
|
18
|
+
if (kind === 'codex')
|
|
19
|
+
return { kind: 'harness', harness: { kind, model, effort, fast: false } };
|
|
20
|
+
return { kind: 'harness', harness: { kind, model: model } };
|
|
11
21
|
}
|
|
12
22
|
/** Generic sessions do not import user definitions or add a specialist role. */
|
|
13
23
|
export async function loadExecutionDefinition(reference) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/runtime/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,KAAc,EAAE,MAAe;IACjF,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnI,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,yDAAyD,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/runtime/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,KAAc,EAAE,MAAe;IACjF,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,GAAG,IAAI,+DAA+D,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7F,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnI,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,yDAAyD,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,EAAC,CAAC;IAC5E,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAC,CAAC;IAC5F,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,KAAM,EAAC,EAAC,CAAC;AAC3D,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAA6B;IACzE,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;IACzF,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,kBAAkB,IAAI,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAC,CAAC;AAC9G,CAAC","sourcesContent":["import { loadDefinition } from '../config/loader.js';\nimport { AgentError } from '../errors.js';\nimport type { ExecutionDefinition } from '../adapters/types.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { ExecutionReference, HarnessReference } from './types.js';\n\nexport function harnessReference(kind: HarnessKind, model?: string, effort?: string): HarnessReference {\n if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && !model?.trim()) {\n throw new AgentError('INVALID_CONFIG', `${kind} requires --model with an explicit nonempty model identifier.`);\n }\n if ((kind === 'opencode' || kind === 'copilot' || kind === 'cursor') && effort !== undefined) {\n throw new AgentError('INVALID_ARGUMENT', `${kind} does not support --effort.`);\n }\n if (kind === 'claudeCode') {\n if (effort !== undefined && effort !== 'low' && effort !== 'medium' && effort !== 'high' && effort !== 'xhigh' && effort !== 'max') {\n throw new AgentError('INVALID_ARGUMENT', 'Claude effort must be low, medium, high, xhigh, or max.');\n }\n return {kind: 'harness', harness: {kind, model, effort, fast: false}};\n }\n if (kind === 'fx') return {kind: 'harness', harness: {kind, model, effort}};\n if (kind === 'codex') return {kind: 'harness', harness: {kind, model, effort, fast: false}};\n return {kind: 'harness', harness: {kind, model: model!}};\n}\n\n/** Generic sessions do not import user definitions or add a specialist role. */\nexport async function loadExecutionDefinition(reference: ExecutionReference): Promise<ExecutionDefinition> {\n if ('file' in reference) return loadDefinition(reference.file, reference.subagents);\n const name = reference.harness.kind === 'claudeCode' ? 'claude' : reference.harness.kind;\n return {name, description: `Run the native ${name} harness.`, instructions: '', harness: reference.harness};\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { HarnessKind } from '../sdk/types.js';
|
|
2
2
|
import type { AdapterOptions, ExecutionDefinition, NativeSession } from '../adapters/types.js';
|
|
3
3
|
import { type AccessConfig } from '../config/access.js';
|
|
4
|
-
|
|
4
|
+
import type { ApprovalHandler } from '../approvals/types.js';
|
|
5
|
+
export declare function selectNative(agent: ExecutionDefinition, cwd: string, env: NodeJS.ProcessEnv, settings: AccessConfig, open?: (options: AdapterOptions) => Promise<NativeSession>, selected?: (kind: HarnessKind) => void, onApproval?: ApprovalHandler): Promise<NativeSession>;
|