mcp-server-opencode 1.1.5 → 1.3.0
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/CHANGELOG.md +127 -0
- package/README.md +34 -5
- package/build/src/index.js +32 -15
- package/build/src/index.js.map +1 -1
- package/build/src/modules/shared/execution-report.d.ts +66 -0
- package/build/src/modules/shared/execution-report.d.ts.map +1 -0
- package/build/src/modules/shared/execution-report.js +407 -0
- package/build/src/modules/shared/execution-report.js.map +1 -0
- package/build/src/modules/shared/execution-usage.d.ts +50 -0
- package/build/src/modules/shared/execution-usage.d.ts.map +1 -0
- package/build/src/modules/shared/execution-usage.js +89 -0
- package/build/src/modules/shared/execution-usage.js.map +1 -0
- package/build/src/modules/shared/git-workspace.d.ts +34 -0
- package/build/src/modules/shared/git-workspace.d.ts.map +1 -0
- package/build/src/modules/shared/git-workspace.js +193 -0
- package/build/src/modules/shared/git-workspace.js.map +1 -0
- package/build/src/modules/shared/instructions.d.ts +8 -1
- package/build/src/modules/shared/instructions.d.ts.map +1 -1
- package/build/src/modules/shared/instructions.js +32 -27
- package/build/src/modules/shared/instructions.js.map +1 -1
- package/build/src/modules/shared/message-id.d.ts +3 -0
- package/build/src/modules/shared/message-id.d.ts.map +1 -0
- package/build/src/modules/shared/message-id.js +6 -0
- package/build/src/modules/shared/message-id.js.map +1 -0
- package/build/src/modules/shared/opencode-client.d.ts +42 -4
- package/build/src/modules/shared/opencode-client.d.ts.map +1 -1
- package/build/src/modules/shared/opencode-client.js +214 -38
- package/build/src/modules/shared/opencode-client.js.map +1 -1
- package/build/src/modules/shared/permission-scopes.d.ts +6 -0
- package/build/src/modules/shared/permission-scopes.d.ts.map +1 -0
- package/build/src/modules/shared/permission-scopes.js +60 -0
- package/build/src/modules/shared/permission-scopes.js.map +1 -0
- package/build/src/modules/shared/permissions.d.ts +110 -0
- package/build/src/modules/shared/permissions.d.ts.map +1 -0
- package/build/src/modules/shared/permissions.js +214 -0
- package/build/src/modules/shared/permissions.js.map +1 -0
- package/build/src/modules/shared/prompt-dispatch.d.ts +13 -0
- package/build/src/modules/shared/prompt-dispatch.d.ts.map +1 -0
- package/build/src/modules/shared/prompt-dispatch.js +34 -0
- package/build/src/modules/shared/prompt-dispatch.js.map +1 -0
- package/build/src/modules/shared/run-observer.d.ts +5 -0
- package/build/src/modules/shared/run-observer.d.ts.map +1 -0
- package/build/src/modules/shared/run-observer.js +421 -0
- package/build/src/modules/shared/run-observer.js.map +1 -0
- package/build/src/modules/shared/server-registry.d.ts +4 -0
- package/build/src/modules/shared/server-registry.d.ts.map +1 -1
- package/build/src/modules/shared/server-registry.js.map +1 -1
- package/build/src/modules/shared/task-registry.d.ts +75 -0
- package/build/src/modules/shared/task-registry.d.ts.map +1 -1
- package/build/src/modules/shared/task-registry.js +85 -0
- package/build/src/modules/shared/task-registry.js.map +1 -1
- package/build/src/modules/shared/usage-limits.d.ts +70 -0
- package/build/src/modules/shared/usage-limits.d.ts.map +1 -0
- package/build/src/modules/shared/usage-limits.js +296 -0
- package/build/src/modules/shared/usage-limits.js.map +1 -0
- package/build/src/modules/shared/workspace-manager.d.ts +25 -0
- package/build/src/modules/shared/workspace-manager.d.ts.map +1 -0
- package/build/src/modules/shared/workspace-manager.js +105 -0
- package/build/src/modules/shared/workspace-manager.js.map +1 -0
- package/build/src/modules/tools/cancel_task.d.ts.map +1 -1
- package/build/src/modules/tools/cancel_task.js +30 -1
- package/build/src/modules/tools/cancel_task.js.map +1 -1
- package/build/src/modules/tools/cleanup_workspace.d.ts +3 -0
- package/build/src/modules/tools/cleanup_workspace.d.ts.map +1 -0
- package/build/src/modules/tools/cleanup_workspace.js +82 -0
- package/build/src/modules/tools/cleanup_workspace.js.map +1 -0
- package/build/src/modules/tools/continue_task.d.ts.map +1 -1
- package/build/src/modules/tools/continue_task.js +116 -6
- package/build/src/modules/tools/continue_task.js.map +1 -1
- package/build/src/modules/tools/get_task_result.d.ts.map +1 -1
- package/build/src/modules/tools/get_task_result.js +125 -22
- package/build/src/modules/tools/get_task_result.js.map +1 -1
- package/build/src/modules/tools/get_task_status.d.ts.map +1 -1
- package/build/src/modules/tools/get_task_status.js +69 -6
- package/build/src/modules/tools/get_task_status.js.map +1 -1
- package/build/src/modules/tools/index.d.ts.map +1 -1
- package/build/src/modules/tools/index.js +2 -0
- package/build/src/modules/tools/index.js.map +1 -1
- package/build/src/modules/tools/list_agents.d.ts.map +1 -1
- package/build/src/modules/tools/list_agents.js +48 -7
- package/build/src/modules/tools/list_agents.js.map +1 -1
- package/build/src/modules/tools/start_server.d.ts.map +1 -1
- package/build/src/modules/tools/start_server.js +21 -1
- package/build/src/modules/tools/start_server.js.map +1 -1
- package/build/src/modules/tools/start_task.d.ts.map +1 -1
- package/build/src/modules/tools/start_task.js +218 -13
- package/build/src/modules/tools/start_task.js.map +1 -1
- package/build/src/modules/tools/stop_server.d.ts.map +1 -1
- package/build/src/modules/tools/stop_server.js +17 -0
- package/build/src/modules/tools/stop_server.js.map +1 -1
- package/build/src/modules/tools/wait_for_task.d.ts.map +1 -1
- package/build/src/modules/tools/wait_for_task.js +110 -24
- package/build/src/modules/tools/wait_for_task.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { abortAndDrainChecks, captureReport, releaseWorkspace, } from "./execution-report.js";
|
|
2
|
+
import { buildExecutionUsage } from "./execution-usage.js";
|
|
3
|
+
import { assistantEntries, buildProgress, CANCELLED_TASK_MESSAGE, clientForTask, deriveTaskStatus, EMPTY_TURN_MESSAGE, hasWork, sessionParts, } from "./opencode-client.js";
|
|
4
|
+
import { allTasks, getTask, tasksForServer } from "./task-registry.js";
|
|
5
|
+
function unavailableUsage(diagnostic) {
|
|
6
|
+
return {
|
|
7
|
+
captured_at: new Date().toISOString(),
|
|
8
|
+
snapshot_kind: "run_finalization",
|
|
9
|
+
report: null,
|
|
10
|
+
diagnostic,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const observers = new Map();
|
|
14
|
+
const terminal = new Set(["completed", "failed", "empty", "cancelled"]);
|
|
15
|
+
export function observeRun(taskId, runId) {
|
|
16
|
+
const task = getTask(taskId);
|
|
17
|
+
if (!task)
|
|
18
|
+
return;
|
|
19
|
+
const run = task.runs?.find((item) => item.run_id === runId);
|
|
20
|
+
if (!run || run.reportReady)
|
|
21
|
+
return;
|
|
22
|
+
const state = { stopped: false, taskId };
|
|
23
|
+
observers.set(runId, state);
|
|
24
|
+
void (async () => {
|
|
25
|
+
let errors = 0;
|
|
26
|
+
let execution = "pending";
|
|
27
|
+
while (!state.stopped) {
|
|
28
|
+
const current = getTask(taskId);
|
|
29
|
+
if (!current)
|
|
30
|
+
break;
|
|
31
|
+
const run = current.runs?.find((item) => item.run_id === runId);
|
|
32
|
+
if (!run)
|
|
33
|
+
break;
|
|
34
|
+
try {
|
|
35
|
+
const client = clientForTask(taskId);
|
|
36
|
+
if (!client) {
|
|
37
|
+
errors++;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const status = await deriveTaskStatus(client.client, client.sessionId, taskId, {
|
|
41
|
+
includeUsage: true,
|
|
42
|
+
usageMessageID: run.message_id,
|
|
43
|
+
});
|
|
44
|
+
errors = 0;
|
|
45
|
+
execution = status.status;
|
|
46
|
+
run.executionState = execution;
|
|
47
|
+
if (terminal.has(status.status)) {
|
|
48
|
+
if (run.finalizationStarted)
|
|
49
|
+
break;
|
|
50
|
+
run.finalizationStarted = true;
|
|
51
|
+
const finalExecution = run.cancelledAt !== undefined ? "cancelled" : status.status;
|
|
52
|
+
run.executionState = finalExecution;
|
|
53
|
+
if (status.usage) {
|
|
54
|
+
run.usage = {
|
|
55
|
+
...status.usage,
|
|
56
|
+
snapshot_kind: "run_finalization",
|
|
57
|
+
};
|
|
58
|
+
if (status.usage.diagnostic)
|
|
59
|
+
run.report?.diagnostics.push(status.usage.diagnostic);
|
|
60
|
+
}
|
|
61
|
+
else
|
|
62
|
+
run.usage = unavailableUsage("usage unavailable: no final message snapshot was returned");
|
|
63
|
+
const verificationRequested = Boolean(run.expectedChanges?.length || run.checks?.length);
|
|
64
|
+
if (verificationRequested)
|
|
65
|
+
run.report = {
|
|
66
|
+
changes: [],
|
|
67
|
+
verification: { state: "running", checks: [], execution_state: finalExecution },
|
|
68
|
+
diagnostics: [],
|
|
69
|
+
evidence: {
|
|
70
|
+
source: "workspace_delta",
|
|
71
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
72
|
+
complete: false,
|
|
73
|
+
errors: [],
|
|
74
|
+
attribution: "uncertain_shared_workspace",
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
run.report = run.baseline
|
|
78
|
+
? await captureReport(run.baseline, run.expectedChanges ?? [], run.checks ?? [], finalExecution, run.controller?.signal)
|
|
79
|
+
: {
|
|
80
|
+
changes: [],
|
|
81
|
+
verification: {
|
|
82
|
+
state: verificationRequested ? "unavailable" : "not_requested",
|
|
83
|
+
checks: [],
|
|
84
|
+
},
|
|
85
|
+
diagnostics: [run.baselineError ?? "workspace baseline unavailable"],
|
|
86
|
+
evidence: {
|
|
87
|
+
source: "workspace_delta",
|
|
88
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
89
|
+
complete: false,
|
|
90
|
+
errors: [run.baselineError ?? "workspace baseline unavailable"],
|
|
91
|
+
attribution: "uncertain_shared_workspace",
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
run.report.verification = {
|
|
95
|
+
...run.report.verification,
|
|
96
|
+
execution_state: finalExecution,
|
|
97
|
+
};
|
|
98
|
+
const checksDrained = run.report.verification.checks.every((check) => check.termination_confirmed !== false);
|
|
99
|
+
if (!checksDrained) {
|
|
100
|
+
run.report.verification.state = "unavailable";
|
|
101
|
+
run.report.diagnostics.push("check process termination was not confirmed; workspace lease retained");
|
|
102
|
+
run.report.evidence.complete = false;
|
|
103
|
+
run.report.evidence.errors.push("check process termination not confirmed");
|
|
104
|
+
run.finalizationError = "check process termination was not confirmed";
|
|
105
|
+
}
|
|
106
|
+
if (run.dispatchError)
|
|
107
|
+
run.report.diagnostics.unshift(`prompt dispatch acknowledgement was uncertain: ${run.dispatchError}`);
|
|
108
|
+
await cacheFinalResult(taskId, runId, finalExecution, status.error);
|
|
109
|
+
run.reportReady = true;
|
|
110
|
+
if (checksDrained && run.workspaceLease) {
|
|
111
|
+
releaseWorkspace(run.workspaceLease);
|
|
112
|
+
run.workspaceLease = undefined;
|
|
113
|
+
}
|
|
114
|
+
state.stopped = true;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
if (run.finalizationStarted) {
|
|
121
|
+
run.finalizationError = "run finalization failed; evidence could not be safely completed";
|
|
122
|
+
run.usage ??= unavailableUsage("usage unavailable: run finalization failed");
|
|
123
|
+
run.report = {
|
|
124
|
+
changes: [],
|
|
125
|
+
verification: {
|
|
126
|
+
state: "unavailable",
|
|
127
|
+
checks: [],
|
|
128
|
+
execution_state: run.executionState,
|
|
129
|
+
},
|
|
130
|
+
diagnostics: [run.finalizationError, run.usage.diagnostic ?? "usage unavailable"],
|
|
131
|
+
evidence: {
|
|
132
|
+
source: "workspace_delta",
|
|
133
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
134
|
+
complete: false,
|
|
135
|
+
errors: [run.finalizationError],
|
|
136
|
+
attribution: "uncertain_shared_workspace",
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
run.result ??= {
|
|
140
|
+
task_id: taskId,
|
|
141
|
+
run_id: runId,
|
|
142
|
+
status: execution,
|
|
143
|
+
result: null,
|
|
144
|
+
error: run.finalizationError,
|
|
145
|
+
};
|
|
146
|
+
run.reportReady = true;
|
|
147
|
+
state.stopped = true;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
errors++;
|
|
151
|
+
}
|
|
152
|
+
if (errors >= 3) {
|
|
153
|
+
run.usage ??= unavailableUsage("usage unavailable: lifecycle observation failed repeatedly");
|
|
154
|
+
run.report = {
|
|
155
|
+
changes: [],
|
|
156
|
+
verification: { state: "unavailable", checks: [], execution_state: execution },
|
|
157
|
+
diagnostics: [
|
|
158
|
+
"lifecycle observation failed repeatedly; workspace delta was not captured",
|
|
159
|
+
run.usage.diagnostic ?? "usage unavailable",
|
|
160
|
+
],
|
|
161
|
+
evidence: {
|
|
162
|
+
source: "workspace_delta",
|
|
163
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
164
|
+
complete: false,
|
|
165
|
+
errors: ["lifecycle observation failed"],
|
|
166
|
+
attribution: "uncertain_shared_workspace",
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
run.result ??= {
|
|
170
|
+
task_id: taskId,
|
|
171
|
+
run_id: runId,
|
|
172
|
+
status: execution,
|
|
173
|
+
result: null,
|
|
174
|
+
error: "lifecycle observation failed repeatedly",
|
|
175
|
+
};
|
|
176
|
+
run.reportReady = true;
|
|
177
|
+
// The session may still be writing despite failed status reads. Keep its
|
|
178
|
+
// lease until confirmed cancellation or server shutdown; never infer exit.
|
|
179
|
+
state.stopped = true;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
183
|
+
}
|
|
184
|
+
observers.delete(runId);
|
|
185
|
+
})();
|
|
186
|
+
}
|
|
187
|
+
async function cacheFinalResult(taskId, runId, status, error) {
|
|
188
|
+
const task = getTask(taskId);
|
|
189
|
+
const run = task?.runs?.find((item) => item.run_id === runId);
|
|
190
|
+
if (!task || !run || run.result)
|
|
191
|
+
return;
|
|
192
|
+
const resolved = clientForTask(taskId);
|
|
193
|
+
if (!resolved) {
|
|
194
|
+
run.usage ??= unavailableUsage("usage unavailable: OpenCode server unavailable at run finalization");
|
|
195
|
+
run.report?.diagnostics.push(run.usage.diagnostic ?? "usage unavailable");
|
|
196
|
+
run.result = {
|
|
197
|
+
task_id: taskId,
|
|
198
|
+
run_id: runId,
|
|
199
|
+
status,
|
|
200
|
+
result: null,
|
|
201
|
+
error: "OpenCode server unavailable",
|
|
202
|
+
usage: run.usage,
|
|
203
|
+
};
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const allEntries = await assistantEntries(resolved.client, resolved.sessionId);
|
|
208
|
+
const entries = allEntries.filter((entry) => entry.info.parentID === run.message_id);
|
|
209
|
+
const entry = entries.at(-1);
|
|
210
|
+
const progress = entry ? buildProgress(entry.parts, sessionParts(entries)) : undefined;
|
|
211
|
+
const text = entry
|
|
212
|
+
? entry.parts
|
|
213
|
+
.filter((part) => part.type === "text")
|
|
214
|
+
.map((part) => part.text)
|
|
215
|
+
.join("")
|
|
216
|
+
: "";
|
|
217
|
+
run.result = {
|
|
218
|
+
task_id: taskId,
|
|
219
|
+
run_id: runId,
|
|
220
|
+
status,
|
|
221
|
+
result: text || null,
|
|
222
|
+
...(error ? { error } : {}),
|
|
223
|
+
...(status === "cancelled" ? { message: CANCELLED_TASK_MESSAGE } : {}),
|
|
224
|
+
...(status === "empty" || !hasWork(entry?.parts ?? [])
|
|
225
|
+
? { message: EMPTY_TURN_MESSAGE }
|
|
226
|
+
: {}),
|
|
227
|
+
...(progress ? { progress } : {}),
|
|
228
|
+
...(run.usage
|
|
229
|
+
? { usage: run.usage }
|
|
230
|
+
: {
|
|
231
|
+
usage: {
|
|
232
|
+
captured_at: new Date().toISOString(),
|
|
233
|
+
snapshot_kind: "run_finalization",
|
|
234
|
+
report: buildExecutionUsage(allEntries, run.message_id),
|
|
235
|
+
},
|
|
236
|
+
}),
|
|
237
|
+
};
|
|
238
|
+
run.usage ??= run.result.usage;
|
|
239
|
+
}
|
|
240
|
+
catch (cause) {
|
|
241
|
+
run.usage ??= unavailableUsage(`usage unavailable: final task messages could not be fetched (${cause instanceof Error ? cause.message : String(cause)})`);
|
|
242
|
+
run.result = {
|
|
243
|
+
task_id: taskId,
|
|
244
|
+
run_id: runId,
|
|
245
|
+
status,
|
|
246
|
+
result: null,
|
|
247
|
+
error: cause instanceof Error ? cause.message : String(cause),
|
|
248
|
+
usage: run.usage,
|
|
249
|
+
};
|
|
250
|
+
// A terminal run always has a report before output caching starts; if that
|
|
251
|
+
// invariant fails, the observer's finalization catch replaces it unavailable.
|
|
252
|
+
const finalizedReport = run.report;
|
|
253
|
+
finalizedReport.diagnostics.push("final task output could not be cached from the OpenCode server", run.usage.diagnostic ?? "usage unavailable");
|
|
254
|
+
finalizedReport.evidence.complete = false;
|
|
255
|
+
finalizedReport.evidence.errors.push("final task output unavailable");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
export async function stopRunObservers(timeoutMs = 5_000) {
|
|
259
|
+
let allDrained = true;
|
|
260
|
+
for (const task of allTasks()) {
|
|
261
|
+
for (const run of task.runs ?? []) {
|
|
262
|
+
const drained = run.controller ? await abortAndDrainChecks(run.controller, timeoutMs) : true;
|
|
263
|
+
if (!drained)
|
|
264
|
+
allDrained = false;
|
|
265
|
+
run.usage ??= unavailableUsage("usage unavailable: MCP server stopped before finalization");
|
|
266
|
+
if (!run.reportReady) {
|
|
267
|
+
run.report = {
|
|
268
|
+
changes: [],
|
|
269
|
+
verification: {
|
|
270
|
+
state: "unavailable",
|
|
271
|
+
checks: [],
|
|
272
|
+
execution_state: "server_stopped",
|
|
273
|
+
},
|
|
274
|
+
diagnostics: [
|
|
275
|
+
"MCP server stopped before the run could be fully observed",
|
|
276
|
+
...(drained
|
|
277
|
+
? []
|
|
278
|
+
: ["check process termination was not confirmed; workspace lease retained"]),
|
|
279
|
+
run.usage.diagnostic ?? "usage unavailable",
|
|
280
|
+
],
|
|
281
|
+
evidence: {
|
|
282
|
+
source: "workspace_delta",
|
|
283
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
284
|
+
complete: false,
|
|
285
|
+
errors: [
|
|
286
|
+
"MCP server stopped",
|
|
287
|
+
...(drained ? [] : ["check process termination not confirmed"]),
|
|
288
|
+
],
|
|
289
|
+
attribution: "uncertain_shared_workspace",
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
run.reportReady = true;
|
|
293
|
+
}
|
|
294
|
+
run.result ??= {
|
|
295
|
+
task_id: task.taskId,
|
|
296
|
+
run_id: run.run_id,
|
|
297
|
+
status: run.executionState ?? "unavailable",
|
|
298
|
+
result: null,
|
|
299
|
+
error: "MCP server stopped before final output was cached",
|
|
300
|
+
usage: run.usage,
|
|
301
|
+
};
|
|
302
|
+
if (drained && run.workspaceLease) {
|
|
303
|
+
releaseWorkspace(run.workspaceLease);
|
|
304
|
+
run.workspaceLease = undefined;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
for (const state of observers.values()) {
|
|
309
|
+
state.stopped = true;
|
|
310
|
+
}
|
|
311
|
+
observers.clear();
|
|
312
|
+
return allDrained;
|
|
313
|
+
}
|
|
314
|
+
export async function stopServerObservers(serverId, timeoutMs = 5_000) {
|
|
315
|
+
let allDrained = true;
|
|
316
|
+
for (const task of tasksForServer(serverId)) {
|
|
317
|
+
for (const run of task.runs ?? []) {
|
|
318
|
+
const drained = run.controller ? await abortAndDrainChecks(run.controller, timeoutMs) : true;
|
|
319
|
+
if (!drained)
|
|
320
|
+
allDrained = false;
|
|
321
|
+
run.usage ??= unavailableUsage("usage unavailable: OpenCode server stopped before finalization");
|
|
322
|
+
if (!run.reportReady) {
|
|
323
|
+
run.report = {
|
|
324
|
+
changes: [],
|
|
325
|
+
verification: { state: "unavailable", checks: [], execution_state: "server_stopped" },
|
|
326
|
+
diagnostics: [
|
|
327
|
+
"OpenCode server stopped before the run could be fully observed",
|
|
328
|
+
...(drained
|
|
329
|
+
? []
|
|
330
|
+
: ["check process termination was not confirmed; workspace lease retained"]),
|
|
331
|
+
run.usage.diagnostic ?? "usage unavailable",
|
|
332
|
+
],
|
|
333
|
+
evidence: {
|
|
334
|
+
source: "workspace_delta",
|
|
335
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
336
|
+
complete: false,
|
|
337
|
+
errors: [
|
|
338
|
+
"server stopped",
|
|
339
|
+
...(drained ? [] : ["check process termination not confirmed"]),
|
|
340
|
+
],
|
|
341
|
+
attribution: "uncertain_shared_workspace",
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
run.finalizationError = "OpenCode server stopped before run finalization";
|
|
346
|
+
run.controller?.abort(new Error("OpenCode server stopped"));
|
|
347
|
+
run.reportReady = true;
|
|
348
|
+
run.result ??= {
|
|
349
|
+
task_id: task.taskId,
|
|
350
|
+
run_id: run.run_id,
|
|
351
|
+
status: run.executionState ?? "unavailable",
|
|
352
|
+
result: null,
|
|
353
|
+
error: "OpenCode server stopped before final output was cached",
|
|
354
|
+
usage: run.usage,
|
|
355
|
+
};
|
|
356
|
+
if (drained && run.workspaceLease) {
|
|
357
|
+
releaseWorkspace(run.workspaceLease);
|
|
358
|
+
run.workspaceLease = undefined;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
for (const [runId, state] of observers) {
|
|
363
|
+
if (tasksForServer(serverId).some((item) => item.taskId === state.taskId)) {
|
|
364
|
+
state.stopped = true;
|
|
365
|
+
observers.delete(runId);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return allDrained;
|
|
369
|
+
}
|
|
370
|
+
export async function finishConfirmedCancellation(taskId) {
|
|
371
|
+
const task = getTask(taskId);
|
|
372
|
+
const run = task?.runs?.find((item) => item.run_id === task.currentRunId);
|
|
373
|
+
if (!task || !run || observers.has(run.run_id))
|
|
374
|
+
return;
|
|
375
|
+
if (run.reportReady &&
|
|
376
|
+
!run.finalizationError &&
|
|
377
|
+
run.executionState !== "pending" &&
|
|
378
|
+
run.executionState !== "running")
|
|
379
|
+
return;
|
|
380
|
+
const drained = run.controller ? await abortAndDrainChecks(run.controller, 5_000) : true;
|
|
381
|
+
run.executionState = "cancelled";
|
|
382
|
+
run.report = run.baseline
|
|
383
|
+
? await captureReport(run.baseline, run.expectedChanges ?? [], run.checks ?? [], "cancelled", run.controller?.signal)
|
|
384
|
+
: {
|
|
385
|
+
changes: [],
|
|
386
|
+
verification: {
|
|
387
|
+
state: run.expectedChanges?.length || run.checks?.length ? "unavailable" : "not_requested",
|
|
388
|
+
checks: [],
|
|
389
|
+
execution_state: "cancelled",
|
|
390
|
+
},
|
|
391
|
+
diagnostics: [run.baselineError ?? "workspace baseline unavailable"],
|
|
392
|
+
evidence: {
|
|
393
|
+
source: "workspace_delta",
|
|
394
|
+
inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
|
|
395
|
+
complete: false,
|
|
396
|
+
errors: [run.baselineError ?? "workspace baseline unavailable"],
|
|
397
|
+
attribution: "uncertain_shared_workspace",
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
run.report.verification.execution_state = "cancelled";
|
|
401
|
+
if (!drained) {
|
|
402
|
+
run.report.verification.state = "unavailable";
|
|
403
|
+
run.report.diagnostics.push("check process termination was not confirmed; workspace lease retained");
|
|
404
|
+
run.report.evidence.complete = false;
|
|
405
|
+
run.report.evidence.errors.push("check process termination not confirmed");
|
|
406
|
+
run.finalizationError = "check process termination was not confirmed";
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
run.finalizationError = undefined;
|
|
410
|
+
}
|
|
411
|
+
if (!run.result)
|
|
412
|
+
await cacheFinalResult(taskId, run.run_id, "cancelled");
|
|
413
|
+
else
|
|
414
|
+
run.result.status = "cancelled";
|
|
415
|
+
run.reportReady = true;
|
|
416
|
+
if (drained && run.workspaceLease) {
|
|
417
|
+
releaseWorkspace(run.workspaceLease);
|
|
418
|
+
run.workspaceLease = undefined;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=run-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-observer.js","sourceRoot":"","sources":["../../../../src/modules/shared/run-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,10 @@ export interface OpencodeServerInstance {
|
|
|
2
2
|
serverId: string;
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
close: () => void;
|
|
5
|
+
/** Canonical directory inherited by the OpenCode server process. */
|
|
6
|
+
directory?: string;
|
|
7
|
+
permissionPolicy?: "read-only" | "allow" | "deny";
|
|
8
|
+
permissionScopesEnabled?: boolean;
|
|
5
9
|
}
|
|
6
10
|
export declare function registerServer(instance: OpencodeServerInstance): void;
|
|
7
11
|
export declare function getServer(serverId: string): OpencodeServerInstance | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-registry.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/server-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"server-registry.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/server-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IAClD,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,sBAAsB,QAE9D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAE9E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,QAE5C;AAED,wBAAgB,cAAc,SAK7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-registry.js","sourceRoot":"","sources":["../../../../src/modules/shared/server-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-registry.js","sourceRoot":"","sources":["../../../../src/modules/shared/server-registry.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,QAAgC;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -1,11 +1,86 @@
|
|
|
1
|
+
import type { ExecutionReport, ExpectedChange, VerificationCheck, WorkspaceSnapshot } from "./execution-report.js";
|
|
2
|
+
import type { ExecutionUsageSnapshot } from "./execution-usage.js";
|
|
3
|
+
import type { WorkspaceMetadata } from "./workspace-manager.js";
|
|
1
4
|
export interface TaskRecord {
|
|
2
5
|
taskId: string;
|
|
3
6
|
serverId: string;
|
|
4
7
|
sessionId: string;
|
|
5
8
|
/** Epoch ms when the task was started; used to detect tasks that never produced output. */
|
|
6
9
|
createdAt?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Epoch ms when the task was cancelled. Without it an aborted session whose
|
|
12
|
+
* last assistant message carries a completed timestamp reports `completed`,
|
|
13
|
+
* which is indistinguishable from a task that finished on its own.
|
|
14
|
+
*/
|
|
15
|
+
cancelledAt?: number;
|
|
16
|
+
/** Accepted prompt history; additive metadata for later reporting and usage. */
|
|
17
|
+
runs?: TaskRunRecord[];
|
|
18
|
+
/** Current run id, used to scope all lifecycle reads. */
|
|
19
|
+
currentRunId?: string;
|
|
20
|
+
/** Reservation prevents overlapping continuation/dispatch operations. */
|
|
21
|
+
dispatching?: boolean;
|
|
22
|
+
/** Canonical directory inherited by the server process. */
|
|
23
|
+
directory?: string;
|
|
24
|
+
workspace?: WorkspaceMetadata;
|
|
25
|
+
workspaceId?: string;
|
|
7
26
|
}
|
|
27
|
+
export interface TaskRunRecord {
|
|
28
|
+
run_id: string;
|
|
29
|
+
message_id: string;
|
|
30
|
+
startedAt: number;
|
|
31
|
+
cancelledAt?: number;
|
|
32
|
+
report?: ExecutionReport;
|
|
33
|
+
/** Immutable direct-message usage snapshot captured when this run was finalized. */
|
|
34
|
+
usage?: ExecutionUsageSnapshot;
|
|
35
|
+
result?: CachedTaskResult;
|
|
36
|
+
expectedChanges?: ExpectedChange[];
|
|
37
|
+
checks?: VerificationCheck[];
|
|
38
|
+
baseline?: WorkspaceSnapshot;
|
|
39
|
+
baselineError?: string;
|
|
40
|
+
workspaceLease?: symbol;
|
|
41
|
+
controller?: AbortController;
|
|
42
|
+
executionState?: string;
|
|
43
|
+
reportReady?: boolean;
|
|
44
|
+
finalizationStarted?: boolean;
|
|
45
|
+
finalizationError?: string;
|
|
46
|
+
dispatchState?: "dispatching" | "accepted" | "uncertain" | "rejected";
|
|
47
|
+
dispatchError?: string;
|
|
48
|
+
}
|
|
49
|
+
export type TaskDispatchSnapshot = {
|
|
50
|
+
currentRunId?: string;
|
|
51
|
+
createdAt?: number;
|
|
52
|
+
cancelledAt?: number;
|
|
53
|
+
};
|
|
54
|
+
export type CachedTaskResult = {
|
|
55
|
+
task_id: string;
|
|
56
|
+
run_id: string;
|
|
57
|
+
status: string;
|
|
58
|
+
result: string | null;
|
|
59
|
+
error?: string;
|
|
60
|
+
message?: string;
|
|
61
|
+
usage?: ExecutionUsageSnapshot;
|
|
62
|
+
progress?: {
|
|
63
|
+
text_snippet: string;
|
|
64
|
+
tool_calls_completed: number;
|
|
65
|
+
mutating_tool_calls?: number;
|
|
66
|
+
files_touched?: string[];
|
|
67
|
+
current_tool?: string;
|
|
68
|
+
current_tool_status?: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
8
71
|
export declare function registerTask(task: TaskRecord): void;
|
|
9
72
|
export declare function getTask(taskId: string): TaskRecord | undefined;
|
|
73
|
+
export declare function tasksForServer(serverId: string): TaskRecord[];
|
|
74
|
+
export declare function allTasks(): TaskRecord[];
|
|
75
|
+
/**
|
|
76
|
+
* Record that a task was cancelled. No-ops for an unknown id so callers do not
|
|
77
|
+
* have to re-check the registry after aborting.
|
|
78
|
+
*/
|
|
79
|
+
export declare function markTaskCancelled(taskId: string, at?: number): void;
|
|
80
|
+
export declare function reserveTaskDispatch(taskId: string): boolean;
|
|
81
|
+
export declare function releaseTaskDispatch(taskId: string): void;
|
|
82
|
+
export declare function acceptTaskRun(taskId: string, run: TaskRunRecord): void;
|
|
83
|
+
export declare function snapshotTaskDispatch(taskId: string): TaskDispatchSnapshot | undefined;
|
|
84
|
+
export declare function rollbackTaskRun(taskId: string, runId: string, previous: TaskDispatchSnapshot | undefined): void;
|
|
10
85
|
export declare function removeTask(taskId: string): void;
|
|
11
86
|
//# sourceMappingURL=task-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-registry.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/task-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"task-registry.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/task-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,96 @@
|
|
|
1
|
+
import { releaseWorkspace } from "./execution-report.js";
|
|
1
2
|
const tasks = new Map();
|
|
3
|
+
const dispatchReservations = new Set();
|
|
2
4
|
export function registerTask(task) {
|
|
5
|
+
task.runs ??= [];
|
|
3
6
|
tasks.set(task.taskId, task);
|
|
4
7
|
}
|
|
5
8
|
export function getTask(taskId) {
|
|
6
9
|
return tasks.get(taskId);
|
|
7
10
|
}
|
|
11
|
+
export function tasksForServer(serverId) {
|
|
12
|
+
return [...tasks.values()].filter((task) => task.serverId === serverId);
|
|
13
|
+
}
|
|
14
|
+
export function allTasks() {
|
|
15
|
+
return [...tasks.values()];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Record that a task was cancelled. No-ops for an unknown id so callers do not
|
|
19
|
+
* have to re-check the registry after aborting.
|
|
20
|
+
*/
|
|
21
|
+
export function markTaskCancelled(taskId, at = Date.now()) {
|
|
22
|
+
const task = tasks.get(taskId);
|
|
23
|
+
if (!task)
|
|
24
|
+
return;
|
|
25
|
+
task.cancelledAt = at;
|
|
26
|
+
const run = task.runs?.find((item) => item.run_id === task.currentRunId);
|
|
27
|
+
if (run) {
|
|
28
|
+
run.cancelledAt = at;
|
|
29
|
+
run.controller?.abort(new Error("task cancelled"));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function reserveTaskDispatch(taskId) {
|
|
33
|
+
if (dispatchReservations.has(taskId))
|
|
34
|
+
return false;
|
|
35
|
+
dispatchReservations.add(taskId);
|
|
36
|
+
const task = tasks.get(taskId);
|
|
37
|
+
if (task)
|
|
38
|
+
task.dispatching = true;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
export function releaseTaskDispatch(taskId) {
|
|
42
|
+
dispatchReservations.delete(taskId);
|
|
43
|
+
const task = tasks.get(taskId);
|
|
44
|
+
if (task)
|
|
45
|
+
task.dispatching = false;
|
|
46
|
+
}
|
|
47
|
+
export function acceptTaskRun(taskId, run) {
|
|
48
|
+
const task = tasks.get(taskId);
|
|
49
|
+
if (!task)
|
|
50
|
+
return;
|
|
51
|
+
task.runs ??= [];
|
|
52
|
+
task.runs.push(run);
|
|
53
|
+
task.currentRunId = run.run_id;
|
|
54
|
+
task.createdAt = run.startedAt;
|
|
55
|
+
task.cancelledAt = undefined;
|
|
56
|
+
}
|
|
57
|
+
export function snapshotTaskDispatch(taskId) {
|
|
58
|
+
const task = tasks.get(taskId);
|
|
59
|
+
if (!task)
|
|
60
|
+
return undefined;
|
|
61
|
+
return {
|
|
62
|
+
currentRunId: task.currentRunId,
|
|
63
|
+
createdAt: task.createdAt,
|
|
64
|
+
cancelledAt: task.cancelledAt,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function rollbackTaskRun(taskId, runId, previous) {
|
|
68
|
+
const task = tasks.get(taskId);
|
|
69
|
+
if (!task)
|
|
70
|
+
return;
|
|
71
|
+
const run = task.runs?.find((item) => item.run_id === runId);
|
|
72
|
+
run?.controller?.abort(new Error("prompt dispatch rejected"));
|
|
73
|
+
if (run?.workspaceLease)
|
|
74
|
+
releaseWorkspace(run.workspaceLease);
|
|
75
|
+
task.runs = (task.runs ?? []).filter((item) => item.run_id !== runId);
|
|
76
|
+
task.currentRunId = previous?.currentRunId;
|
|
77
|
+
task.createdAt = previous?.createdAt;
|
|
78
|
+
task.cancelledAt = previous?.cancelledAt;
|
|
79
|
+
}
|
|
8
80
|
export function removeTask(taskId) {
|
|
81
|
+
const task = tasks.get(taskId);
|
|
82
|
+
if (!task)
|
|
83
|
+
return;
|
|
84
|
+
// Do not drop the only record of a writer while a prompt ACK is unresolved.
|
|
85
|
+
// The dispatcher will either roll it back on a definite rejection or leave
|
|
86
|
+
// the run tracked when the result is ambiguous.
|
|
87
|
+
if (task.dispatching)
|
|
88
|
+
return;
|
|
89
|
+
for (const run of task.runs ?? []) {
|
|
90
|
+
run.controller?.abort(new Error("task removed"));
|
|
91
|
+
if (run.workspaceLease)
|
|
92
|
+
releaseWorkspace(run.workspaceLease);
|
|
93
|
+
}
|
|
9
94
|
tasks.delete(taskId);
|
|
10
95
|
}
|
|
11
96
|
//# sourceMappingURL=task-registry.js.map
|