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.
Files changed (94) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +34 -5
  3. package/build/src/index.js +32 -15
  4. package/build/src/index.js.map +1 -1
  5. package/build/src/modules/shared/execution-report.d.ts +66 -0
  6. package/build/src/modules/shared/execution-report.d.ts.map +1 -0
  7. package/build/src/modules/shared/execution-report.js +407 -0
  8. package/build/src/modules/shared/execution-report.js.map +1 -0
  9. package/build/src/modules/shared/execution-usage.d.ts +50 -0
  10. package/build/src/modules/shared/execution-usage.d.ts.map +1 -0
  11. package/build/src/modules/shared/execution-usage.js +89 -0
  12. package/build/src/modules/shared/execution-usage.js.map +1 -0
  13. package/build/src/modules/shared/git-workspace.d.ts +34 -0
  14. package/build/src/modules/shared/git-workspace.d.ts.map +1 -0
  15. package/build/src/modules/shared/git-workspace.js +193 -0
  16. package/build/src/modules/shared/git-workspace.js.map +1 -0
  17. package/build/src/modules/shared/instructions.d.ts +8 -1
  18. package/build/src/modules/shared/instructions.d.ts.map +1 -1
  19. package/build/src/modules/shared/instructions.js +32 -27
  20. package/build/src/modules/shared/instructions.js.map +1 -1
  21. package/build/src/modules/shared/message-id.d.ts +3 -0
  22. package/build/src/modules/shared/message-id.d.ts.map +1 -0
  23. package/build/src/modules/shared/message-id.js +6 -0
  24. package/build/src/modules/shared/message-id.js.map +1 -0
  25. package/build/src/modules/shared/opencode-client.d.ts +42 -4
  26. package/build/src/modules/shared/opencode-client.d.ts.map +1 -1
  27. package/build/src/modules/shared/opencode-client.js +214 -38
  28. package/build/src/modules/shared/opencode-client.js.map +1 -1
  29. package/build/src/modules/shared/permission-scopes.d.ts +6 -0
  30. package/build/src/modules/shared/permission-scopes.d.ts.map +1 -0
  31. package/build/src/modules/shared/permission-scopes.js +60 -0
  32. package/build/src/modules/shared/permission-scopes.js.map +1 -0
  33. package/build/src/modules/shared/permissions.d.ts +110 -0
  34. package/build/src/modules/shared/permissions.d.ts.map +1 -0
  35. package/build/src/modules/shared/permissions.js +214 -0
  36. package/build/src/modules/shared/permissions.js.map +1 -0
  37. package/build/src/modules/shared/prompt-dispatch.d.ts +13 -0
  38. package/build/src/modules/shared/prompt-dispatch.d.ts.map +1 -0
  39. package/build/src/modules/shared/prompt-dispatch.js +34 -0
  40. package/build/src/modules/shared/prompt-dispatch.js.map +1 -0
  41. package/build/src/modules/shared/run-observer.d.ts +5 -0
  42. package/build/src/modules/shared/run-observer.d.ts.map +1 -0
  43. package/build/src/modules/shared/run-observer.js +421 -0
  44. package/build/src/modules/shared/run-observer.js.map +1 -0
  45. package/build/src/modules/shared/server-registry.d.ts +4 -0
  46. package/build/src/modules/shared/server-registry.d.ts.map +1 -1
  47. package/build/src/modules/shared/server-registry.js.map +1 -1
  48. package/build/src/modules/shared/task-registry.d.ts +75 -0
  49. package/build/src/modules/shared/task-registry.d.ts.map +1 -1
  50. package/build/src/modules/shared/task-registry.js +85 -0
  51. package/build/src/modules/shared/task-registry.js.map +1 -1
  52. package/build/src/modules/shared/usage-limits.d.ts +70 -0
  53. package/build/src/modules/shared/usage-limits.d.ts.map +1 -0
  54. package/build/src/modules/shared/usage-limits.js +296 -0
  55. package/build/src/modules/shared/usage-limits.js.map +1 -0
  56. package/build/src/modules/shared/workspace-manager.d.ts +25 -0
  57. package/build/src/modules/shared/workspace-manager.d.ts.map +1 -0
  58. package/build/src/modules/shared/workspace-manager.js +105 -0
  59. package/build/src/modules/shared/workspace-manager.js.map +1 -0
  60. package/build/src/modules/tools/cancel_task.d.ts.map +1 -1
  61. package/build/src/modules/tools/cancel_task.js +30 -1
  62. package/build/src/modules/tools/cancel_task.js.map +1 -1
  63. package/build/src/modules/tools/cleanup_workspace.d.ts +3 -0
  64. package/build/src/modules/tools/cleanup_workspace.d.ts.map +1 -0
  65. package/build/src/modules/tools/cleanup_workspace.js +82 -0
  66. package/build/src/modules/tools/cleanup_workspace.js.map +1 -0
  67. package/build/src/modules/tools/continue_task.d.ts.map +1 -1
  68. package/build/src/modules/tools/continue_task.js +116 -6
  69. package/build/src/modules/tools/continue_task.js.map +1 -1
  70. package/build/src/modules/tools/get_task_result.d.ts.map +1 -1
  71. package/build/src/modules/tools/get_task_result.js +125 -22
  72. package/build/src/modules/tools/get_task_result.js.map +1 -1
  73. package/build/src/modules/tools/get_task_status.d.ts.map +1 -1
  74. package/build/src/modules/tools/get_task_status.js +69 -6
  75. package/build/src/modules/tools/get_task_status.js.map +1 -1
  76. package/build/src/modules/tools/index.d.ts.map +1 -1
  77. package/build/src/modules/tools/index.js +2 -0
  78. package/build/src/modules/tools/index.js.map +1 -1
  79. package/build/src/modules/tools/list_agents.d.ts.map +1 -1
  80. package/build/src/modules/tools/list_agents.js +48 -7
  81. package/build/src/modules/tools/list_agents.js.map +1 -1
  82. package/build/src/modules/tools/start_server.d.ts.map +1 -1
  83. package/build/src/modules/tools/start_server.js +21 -1
  84. package/build/src/modules/tools/start_server.js.map +1 -1
  85. package/build/src/modules/tools/start_task.d.ts.map +1 -1
  86. package/build/src/modules/tools/start_task.js +218 -13
  87. package/build/src/modules/tools/start_task.js.map +1 -1
  88. package/build/src/modules/tools/stop_server.d.ts.map +1 -1
  89. package/build/src/modules/tools/stop_server.js +17 -0
  90. package/build/src/modules/tools/stop_server.js.map +1 -1
  91. package/build/src/modules/tools/wait_for_task.d.ts.map +1 -1
  92. package/build/src/modules/tools/wait_for_task.js +110 -24
  93. package/build/src/modules/tools/wait_for_task.js.map +1 -1
  94. package/package.json +4 -2
@@ -0,0 +1,407 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { lstat, readdir, readFile, readlink, realpath } from "node:fs/promises";
4
+ import path from "node:path";
5
+ const MAX_FILES = 20_000;
6
+ const MAX_BYTES = 32 * 1024 * 1024;
7
+ const MAX_OUTPUT_BYTES = 16 * 1024;
8
+ function insideWorkspace(root, candidate) {
9
+ const relative = path.relative(root, candidate);
10
+ return (relative === "" ||
11
+ (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)));
12
+ }
13
+ /** @internal Signal a direct check child and its descendants without invoking a shell. */
14
+ export function signalCheckProcess(child, force, platform = process.platform, spawnKiller = spawn) {
15
+ const signalName = force ? "SIGKILL" : "SIGTERM";
16
+ const childPid = child.pid;
17
+ if (platform === "win32" && childPid) {
18
+ return new Promise((resolve) => {
19
+ const killer = spawnKiller("taskkill.exe", ["/PID", String(childPid), "/T", ...(force ? ["/F"] : [])], { shell: false, stdio: "ignore", windowsHide: true });
20
+ killer.once("error", () => {
21
+ child.kill(signalName);
22
+ resolve(false);
23
+ });
24
+ killer.once("close", (code) => resolve(code === 0));
25
+ killer.unref();
26
+ });
27
+ }
28
+ if (childPid) {
29
+ try {
30
+ process.kill(-childPid, signalName);
31
+ }
32
+ catch (error) {
33
+ if (force && error instanceof Error && "code" in error && error.code === "ESRCH")
34
+ return Promise.resolve(true);
35
+ if (!(error instanceof Error && "code" in error && error.code === "ESRCH"))
36
+ return Promise.resolve(false);
37
+ }
38
+ return force ? waitForProcessGroupExit(childPid) : Promise.resolve(true);
39
+ }
40
+ child.kill(signalName);
41
+ return Promise.resolve(false);
42
+ }
43
+ const activeChecks = new WeakMap();
44
+ /** Abort in-flight checks and wait until every check process has drained or the deadline expires. */
45
+ export async function abortAndDrainChecks(controller, timeoutMs = 5_000) {
46
+ controller.abort(new Error("workspace execution is stopping"));
47
+ const checks = [...(activeChecks.get(controller.signal) ?? [])];
48
+ if (checks.length === 0)
49
+ return true;
50
+ let resolveTimeout;
51
+ const timeout = new Promise((resolve) => {
52
+ resolveTimeout = resolve;
53
+ });
54
+ const timer = setTimeout(() => resolveTimeout(false), timeoutMs);
55
+ timer.unref?.();
56
+ try {
57
+ return await Promise.race([
58
+ Promise.all(checks).then((confirmations) => confirmations.every(Boolean)),
59
+ timeout,
60
+ ]);
61
+ }
62
+ finally {
63
+ clearTimeout(timer);
64
+ }
65
+ }
66
+ /** @internal Confirm process-group termination, with an injectable state probe for tests. */
67
+ export async function waitForProcessGroupExit(pid, timeoutMs = 2_000, readStates = processGroupStates) {
68
+ const deadline = Date.now() + timeoutMs;
69
+ while (Date.now() < deadline) {
70
+ try {
71
+ process.kill(-pid, 0);
72
+ }
73
+ catch (error) {
74
+ if (error instanceof Error && "code" in error && error.code === "ESRCH")
75
+ return true;
76
+ const states = await readStates(pid);
77
+ if (states &&
78
+ (states.length === 0 ||
79
+ states.every((state) => state.startsWith("Z") || state.startsWith("X"))))
80
+ return true;
81
+ return false;
82
+ }
83
+ const states = await readStates(pid);
84
+ if (states &&
85
+ states.length > 0 &&
86
+ states.every((state) => state.startsWith("Z") || state.startsWith("X")))
87
+ return true;
88
+ await new Promise((resolve) => setTimeout(resolve, 20));
89
+ }
90
+ return false;
91
+ }
92
+ /** @internal Read process-group states, with an injectable spawner for failure-path tests. */
93
+ export async function processGroupStates(groupId, spawnProcess = spawn) {
94
+ return new Promise((resolve) => {
95
+ const ps = spawnProcess("ps", ["-axo", "pgid=,stat="], {
96
+ shell: false,
97
+ stdio: ["ignore", "pipe", "ignore"],
98
+ });
99
+ let output = "";
100
+ ps.stdout.on("data", (chunk) => {
101
+ output += chunk.toString("utf8");
102
+ });
103
+ ps.once("error", () => resolve(undefined));
104
+ ps.once("close", (code) => {
105
+ if (code !== 0)
106
+ return resolve(undefined);
107
+ const states = output.split("\n").flatMap((line) => {
108
+ const [pidText, state] = line.trim().split(/\s+/);
109
+ return Number(pidText) === groupId && state ? [state] : [];
110
+ });
111
+ resolve(states);
112
+ });
113
+ });
114
+ }
115
+ export function validateRelativePath(value) {
116
+ return (value.length > 0 &&
117
+ !path.isAbsolute(value) &&
118
+ !value.split(/[\\/]/).includes("..") &&
119
+ value !== ".");
120
+ }
121
+ export function validateRelativeCwd(value) {
122
+ return value === "." || value === "" || validateRelativePath(value);
123
+ }
124
+ async function walk(root, dir = root, result = new Map(), budget = { bytes: 0 }) {
125
+ const entries = await readdir(dir, { withFileTypes: true });
126
+ for (const entry of entries) {
127
+ if (entry.name === ".git" || entry.name === "node_modules")
128
+ continue;
129
+ const full = path.join(dir, entry.name);
130
+ const rel = path.relative(root, full);
131
+ if (result.size >= MAX_FILES)
132
+ throw new Error(`file inventory exceeded ${MAX_FILES} entries`);
133
+ const info = await lstat(full);
134
+ if (info.isDirectory())
135
+ await walk(root, full, result, budget);
136
+ else {
137
+ if (!info.isSymbolicLink() && budget.bytes + info.size > MAX_BYTES)
138
+ throw new Error(`file inventory exceeded ${MAX_BYTES} bytes`);
139
+ const content = info.isSymbolicLink()
140
+ ? `symlink:${await readlink(full)}`
141
+ : await readFile(full);
142
+ budget.bytes += typeof content === "string" ? Buffer.byteLength(content) : content.length;
143
+ if (budget.bytes > MAX_BYTES)
144
+ throw new Error(`file inventory exceeded ${MAX_BYTES} bytes`);
145
+ result.set(rel, createHash("sha256").update(content).digest("hex"));
146
+ }
147
+ }
148
+ return result;
149
+ }
150
+ export async function captureWorkspace(directory, explicitPaths = []) {
151
+ const root = await realpath(directory);
152
+ const files = await walk(root);
153
+ let explicitBytes = 0;
154
+ for (const relative of explicitPaths) {
155
+ if (!validateRelativePath(relative))
156
+ throw new Error(`invalid expected workspace path: ${relative}`);
157
+ const full = path.resolve(root, relative);
158
+ const info = await lstat(full).catch(() => undefined);
159
+ if (!info || info.isDirectory())
160
+ continue;
161
+ const alreadyInventoried = files.has(relative);
162
+ if (!info.isSymbolicLink() && !alreadyInventoried && explicitBytes + info.size > MAX_BYTES)
163
+ throw new Error(`explicit files exceeded ${MAX_BYTES} bytes`);
164
+ let content;
165
+ if (!info.isSymbolicLink()) {
166
+ const canonicalFile = await realpath(full);
167
+ if (!insideWorkspace(root, canonicalFile))
168
+ throw new Error(`expected workspace path resolves outside the workspace: ${relative}`);
169
+ if (!alreadyInventoried)
170
+ explicitBytes += info.size;
171
+ content = await readFile(full);
172
+ }
173
+ else
174
+ content = `symlink:${await readlink(full)}`;
175
+ files.set(relative, createHash("sha256").update(content).digest("hex"));
176
+ }
177
+ return { root, files };
178
+ }
179
+ export function compareWorkspace(before, after) {
180
+ const changes = [];
181
+ for (const [file, hash] of after.files) {
182
+ const old = before.files.get(file);
183
+ if (old !== hash)
184
+ changes.push({
185
+ path: file,
186
+ change: old === undefined ? "created" : "modified",
187
+ evidence: "workspace_delta",
188
+ });
189
+ }
190
+ for (const file of before.files.keys())
191
+ if (!after.files.has(file))
192
+ changes.push({ path: file, change: "deleted", evidence: "workspace_delta" });
193
+ return changes.sort((a, b) => a.path.localeCompare(b.path));
194
+ }
195
+ export async function runCheck(check, workspace, signal) {
196
+ const started = Date.now();
197
+ const canonicalWorkspace = await realpath(workspace).catch(() => "");
198
+ const cwd = check.cwd ? path.resolve(canonicalWorkspace, check.cwd) : canonicalWorkspace;
199
+ const canonical = await realpath(cwd).catch(() => "");
200
+ if (!canonicalWorkspace || !canonical || !insideWorkspace(canonicalWorkspace, canonical)) {
201
+ return {
202
+ executable: check.executable,
203
+ argv: check.argv,
204
+ exit_code: null,
205
+ signal: null,
206
+ duration_ms: Date.now() - started,
207
+ stdout: "",
208
+ stderr: "",
209
+ stdout_truncated: false,
210
+ stderr_truncated: false,
211
+ error: "check cwd is missing or outside workspace",
212
+ };
213
+ }
214
+ if (signal?.aborted) {
215
+ return {
216
+ executable: check.executable,
217
+ argv: check.argv,
218
+ exit_code: null,
219
+ signal: null,
220
+ duration_ms: Date.now() - started,
221
+ stdout: "",
222
+ stderr: "",
223
+ stdout_truncated: false,
224
+ stderr_truncated: false,
225
+ error: "check cancelled",
226
+ };
227
+ }
228
+ let resolveDrain;
229
+ const drained = new Promise((resolve) => {
230
+ resolveDrain = resolve;
231
+ });
232
+ if (signal) {
233
+ const checks = activeChecks.get(signal) ?? new Set();
234
+ checks.add(drained);
235
+ activeChecks.set(signal, checks);
236
+ }
237
+ return new Promise((resolve) => {
238
+ let stdout = Buffer.alloc(0);
239
+ let stderr = Buffer.alloc(0);
240
+ let stdoutTruncated = false;
241
+ let stderrTruncated = false;
242
+ let settled = false;
243
+ let timedOut = false;
244
+ let cancelled = false;
245
+ let closeResult;
246
+ let termination;
247
+ const child = spawn(check.executable, check.argv, {
248
+ cwd: canonical,
249
+ shell: false,
250
+ detached: process.platform !== "win32",
251
+ stdio: ["ignore", "pipe", "pipe"],
252
+ });
253
+ let killTimer;
254
+ const terminate = () => {
255
+ if (termination)
256
+ return;
257
+ termination = (async () => {
258
+ const graceful = await signalCheckProcess(child, false);
259
+ if (graceful) {
260
+ await new Promise((resolve) => {
261
+ killTimer = setTimeout(resolve, 250);
262
+ killTimer.unref?.();
263
+ });
264
+ }
265
+ killTimer = undefined;
266
+ return signalCheckProcess(child, true);
267
+ })();
268
+ void termination.then((confirmed) => {
269
+ if (closeResult)
270
+ finish(closeResult.code, closeResult.signal, undefined, confirmed);
271
+ });
272
+ };
273
+ const append = (target, chunk, set, truncated) => {
274
+ const combined = Buffer.concat([target, chunk]);
275
+ if (combined.length > MAX_OUTPUT_BYTES)
276
+ truncated();
277
+ set(combined.subarray(-MAX_OUTPUT_BYTES));
278
+ };
279
+ child.stdout.on("data", (chunk) => {
280
+ append(stdout, chunk, (value) => {
281
+ stdout = value;
282
+ }, () => {
283
+ stdoutTruncated = true;
284
+ });
285
+ });
286
+ child.stderr.on("data", (chunk) => {
287
+ append(stderr, chunk, (value) => {
288
+ stderr = value;
289
+ }, () => {
290
+ stderrTruncated = true;
291
+ });
292
+ });
293
+ const timer = setTimeout(() => {
294
+ timedOut = true;
295
+ terminate();
296
+ }, check.timeout_ms ?? 30_000);
297
+ const onAbort = () => {
298
+ cancelled = true;
299
+ terminate();
300
+ };
301
+ signal?.addEventListener("abort", onAbort, { once: true });
302
+ const finish = (code, closeSignal, error, terminationConfirmed) => {
303
+ if (settled)
304
+ return;
305
+ settled = true;
306
+ clearTimeout(timer);
307
+ clearTimeout(killTimer);
308
+ killTimer = undefined;
309
+ signal?.removeEventListener("abort", onAbort);
310
+ if (signal) {
311
+ const checks = activeChecks.get(signal);
312
+ checks?.delete(drained);
313
+ if (checks?.size === 0)
314
+ activeChecks.delete(signal);
315
+ }
316
+ resolveDrain(terminationConfirmed !== false);
317
+ resolve({
318
+ executable: check.executable,
319
+ argv: check.argv,
320
+ exit_code: code,
321
+ signal: closeSignal,
322
+ duration_ms: Date.now() - started,
323
+ stdout: stdout.toString("utf8"),
324
+ stderr: stderr.toString("utf8"),
325
+ stdout_truncated: stdoutTruncated,
326
+ stderr_truncated: stderrTruncated,
327
+ timed_out: timedOut,
328
+ ...(terminationConfirmed === undefined
329
+ ? {}
330
+ : { termination_confirmed: terminationConfirmed }),
331
+ ...(cancelled ? { error: "check cancelled" } : {}),
332
+ ...(terminationConfirmed === false
333
+ ? { error: "check process termination could not be confirmed" }
334
+ : {}),
335
+ ...(error ? { error: error.message } : {}),
336
+ });
337
+ };
338
+ child.once("error", (error) => finish(null, null, error));
339
+ child.once("close", (code, closeSignal) => {
340
+ closeResult = { code, signal: closeSignal };
341
+ if (termination) {
342
+ void termination.then((confirmed) => finish(code, closeSignal, undefined, confirmed));
343
+ }
344
+ else
345
+ finish(code, closeSignal);
346
+ });
347
+ });
348
+ }
349
+ const reservations = [];
350
+ export async function reserveWorkspace(directory, exclusive) {
351
+ const root = await realpath(directory);
352
+ const overlap = (a, b) => a === b || a.startsWith(`${b}${path.sep}`) || b.startsWith(`${a}${path.sep}`);
353
+ if (reservations.some((item) => overlap(root, item.root) && (exclusive || item.exclusive)))
354
+ return undefined;
355
+ const token = Symbol(root);
356
+ reservations.push({ root, exclusive, token });
357
+ return token;
358
+ }
359
+ export function releaseWorkspace(token) {
360
+ const index = reservations.findIndex((item) => item.token === token);
361
+ if (index >= 0)
362
+ reservations.splice(index, 1);
363
+ }
364
+ export async function captureReport(before, expected, checks, execution, signal) {
365
+ const errors = [];
366
+ let changes = [];
367
+ try {
368
+ changes = compareWorkspace(before, await captureWorkspace(before.root, expected.map((item) => item.path)));
369
+ }
370
+ catch (error) {
371
+ errors.push(error instanceof Error ? error.message : String(error));
372
+ }
373
+ const results = [];
374
+ if (execution !== "cancelled")
375
+ for (const check of checks)
376
+ results.push(await runCheck(check, before.root, signal));
377
+ const missing = expected.filter((item) => !changes.some((actual) => actual.path === item.path && actual.change === item.change));
378
+ const checksPassed = results.every((result) => result.exit_code === 0 && result.timed_out !== true && !result.error);
379
+ const state = errors.length
380
+ ? "unavailable"
381
+ : execution === "cancelled" || signal?.aborted
382
+ ? "cancelled"
383
+ : execution !== "completed"
384
+ ? "failed"
385
+ : checksPassed && missing.length === 0
386
+ ? "passed"
387
+ : "failed";
388
+ return {
389
+ changes,
390
+ verification: {
391
+ state: checks.length || expected.length ? state : "not_requested",
392
+ checks: results,
393
+ },
394
+ diagnostics: [
395
+ ...errors,
396
+ ...missing.map((item) => `expected ${item.change}: ${item.path} was not observed`),
397
+ ],
398
+ evidence: {
399
+ source: "workspace_delta",
400
+ inventory_scope: "recursive_except_git_and_node_modules_plus_explicit_paths",
401
+ complete: errors.length === 0,
402
+ errors,
403
+ attribution: "uncertain_shared_workspace",
404
+ },
405
+ };
406
+ }
407
+ //# sourceMappingURL=execution-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-report.js","sourceRoot":"","sources":["../../../../src/modules/shared/execution-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { AssistantEntry } from "./opencode-client.js";
2
+ export type UsageMetricName = "input" | "output" | "reasoning" | "cache_read" | "cache_write" | "reported_cost";
3
+ export type UsageMetric = {
4
+ value: number | null;
5
+ complete: boolean;
6
+ missing_messages: number;
7
+ };
8
+ export type UsageBreakdown = {
9
+ provider_id: string | null;
10
+ model_id: string | null;
11
+ message_count: number;
12
+ input: UsageMetric;
13
+ output: UsageMetric;
14
+ reasoning: UsageMetric;
15
+ cache_read: UsageMetric;
16
+ cache_write: UsageMetric;
17
+ reported_cost: UsageMetric;
18
+ };
19
+ export type UsageSummary = {
20
+ message_count: number;
21
+ input: UsageMetric;
22
+ output: UsageMetric;
23
+ reasoning: UsageMetric;
24
+ cache_read: UsageMetric;
25
+ cache_write: UsageMetric;
26
+ reported_cost: UsageMetric;
27
+ breakdown: UsageBreakdown[];
28
+ };
29
+ export type ExecutionUsageReport = {
30
+ currency: null;
31
+ cost_label: "reported_by_opencode_not_invoiced_cost";
32
+ scope: {
33
+ session_messages: "all_direct_assistant_messages_passed";
34
+ run_messages: "direct_assistant_messages_parented_to_current_user_message";
35
+ descendants_included: false;
36
+ subagent_sessions_included: false;
37
+ };
38
+ run: UsageSummary | null;
39
+ session: UsageSummary;
40
+ };
41
+ export type ExecutionUsageSnapshot = {
42
+ captured_at: string;
43
+ snapshot_kind: "live_observation" | "run_finalization";
44
+ /** Null when the SDK message snapshot could not be fetched. */
45
+ report: ExecutionUsageReport | null;
46
+ diagnostic?: string;
47
+ };
48
+ /** Aggregate only direct assistant-message INFO metrics; parts are deliberately ignored. */
49
+ export declare function buildExecutionUsage(entries: AssistantEntry[], currentMessageID?: string | null): ExecutionUsageReport;
50
+ //# sourceMappingURL=execution-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-usage.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/execution-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,aAAa,GACb,eAAe,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,WAAW,CAAC;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,wCAAwC,CAAC;IACrD,KAAK,EAAE;QACL,gBAAgB,EAAE,sCAAsC,CAAC;QACzD,YAAY,EAAE,4DAA4D,CAAC;QAC3E,oBAAoB,EAAE,KAAK,CAAC;QAC5B,0BAA0B,EAAE,KAAK,CAAC;KACnC,CAAC;IACF,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,kBAAkB,GAAG,kBAAkB,CAAC;IACvD,+DAA+D;IAC/D,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAwFF,4FAA4F;AAC5F,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EAAE,EACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,oBAAoB,CAoBtB"}
@@ -0,0 +1,89 @@
1
+ const METRICS = [
2
+ "input",
3
+ "output",
4
+ "reasoning",
5
+ "cache_read",
6
+ "cache_write",
7
+ "reported_cost",
8
+ ];
9
+ function finiteMetric(value) {
10
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
11
+ }
12
+ function metric(values) {
13
+ let value = values.length === 0 ? null : 0;
14
+ let missingMessages = 0;
15
+ for (const item of values) {
16
+ if (item === null) {
17
+ missingMessages += 1;
18
+ value = null;
19
+ }
20
+ else if (value !== null) {
21
+ value += item;
22
+ }
23
+ }
24
+ return {
25
+ value,
26
+ complete: missingMessages === 0 && values.length > 0,
27
+ missing_messages: missingMessages,
28
+ };
29
+ }
30
+ function metricValue(info, key) {
31
+ if (key === "reported_cost")
32
+ return finiteMetric(info.cost);
33
+ const tokens = info.tokens;
34
+ if (typeof tokens !== "object" || tokens === null)
35
+ return null;
36
+ const tokenFields = tokens;
37
+ if (key === "cache_read" || key === "cache_write") {
38
+ const cache = tokenFields.cache;
39
+ return typeof cache === "object" && cache !== null
40
+ ? finiteMetric(cache[key === "cache_read" ? "read" : "write"])
41
+ : null;
42
+ }
43
+ return finiteMetric(tokenFields[key]);
44
+ }
45
+ function summarize(entries) {
46
+ const unique = new Map();
47
+ let anonymousIndex = 0;
48
+ for (const entry of entries) {
49
+ const info = entry.info;
50
+ const id = typeof info.id === "string" && info.id.length > 0
51
+ ? info.id
52
+ : `__anonymous_${anonymousIndex++}`;
53
+ unique.set(id, info);
54
+ }
55
+ const messages = [...unique.values()];
56
+ const makeMetrics = (items) => Object.fromEntries(METRICS.map((key) => [key, metric(items.map((item) => metricValue(item, key)))]));
57
+ const groups = new Map();
58
+ for (const item of messages) {
59
+ const provider = typeof item.providerID === "string" && item.providerID ? item.providerID : null;
60
+ const model = typeof item.modelID === "string" && item.modelID ? item.modelID : null;
61
+ const key = JSON.stringify([provider, model]);
62
+ groups.set(key, [...(groups.get(key) ?? []), item]);
63
+ }
64
+ const breakdown = [...groups.entries()].map(([key, items]) => {
65
+ const [provider_id, model_id] = JSON.parse(key);
66
+ return { provider_id, model_id, message_count: items.length, ...makeMetrics(items) };
67
+ });
68
+ return { message_count: messages.length, ...makeMetrics(messages), breakdown };
69
+ }
70
+ /** Aggregate only direct assistant-message INFO metrics; parts are deliberately ignored. */
71
+ export function buildExecutionUsage(entries, currentMessageID) {
72
+ const session = summarize(entries);
73
+ const run = typeof currentMessageID === "string"
74
+ ? summarize(entries.filter((entry) => entry.info.parentID === currentMessageID))
75
+ : null;
76
+ return {
77
+ currency: null,
78
+ cost_label: "reported_by_opencode_not_invoiced_cost",
79
+ scope: {
80
+ session_messages: "all_direct_assistant_messages_passed",
81
+ run_messages: "direct_assistant_messages_parented_to_current_user_message",
82
+ descendants_included: false,
83
+ subagent_sessions_included: false,
84
+ },
85
+ run,
86
+ session,
87
+ };
88
+ }
89
+ //# sourceMappingURL=execution-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-usage.js","sourceRoot":"","sources":["../../../../src/modules/shared/execution-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type GitRunner = (cwd: string, args: string[]) => Promise<string>;
2
+ export type GitWorkspace = {
3
+ id: string;
4
+ sourceDirectory: string;
5
+ repositoryDirectory: string;
6
+ worktreeDirectory: string;
7
+ executionDirectory: string;
8
+ baseCommit: string;
9
+ sourceDirty: boolean;
10
+ managed: true;
11
+ };
12
+ export type CreateGitWorkspaceOptions = {
13
+ baseRef?: string;
14
+ /** Internal test seam; production callers should use the managed cache parent. */
15
+ workspaceParent?: string;
16
+ /** Internal command boundary for deterministic failure-path tests. */
17
+ gitRunner?: GitRunner;
18
+ /** Internal executable override for testing missing-Git behavior. */
19
+ gitExecutable?: string;
20
+ };
21
+ export type RemoveGitWorkspaceOptions = {
22
+ discardChanges?: boolean;
23
+ };
24
+ export type GitWorkspaceErrorCode = "git_unavailable" | "not_repository" | "invalid_base_ref" | "missing_execution_directory" | "provision_failed" | "not_owned" | "tampered" | "dirty" | "remove_failed";
25
+ export declare class GitWorkspaceError extends Error {
26
+ readonly code: GitWorkspaceErrorCode;
27
+ constructor(code: GitWorkspaceErrorCode, message: string);
28
+ }
29
+ export declare function createGitWorkspace(sourcePath: string, options?: CreateGitWorkspaceOptions): Promise<GitWorkspace>;
30
+ export declare function describeGitWorkspace(handle: GitWorkspace): GitWorkspace;
31
+ export declare function removeGitWorkspace(handle: GitWorkspace, options?: RemoveGitWorkspaceOptions): Promise<{
32
+ status: "removed";
33
+ }>;
34
+ //# sourceMappingURL=git-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-workspace.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/git-workspace.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,6BAA6B,GAC7B,kBAAkB,GAClB,WAAW,GACX,UAAU,GACV,OAAO,GACP,eAAe,CAAC;AAEpB,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,IAAI,EAAE,qBAAqB;IAD7C,YACkB,IAAI,EAAE,qBAAqB,EAC3C,OAAO,EAAE,MAAM,EAIhB;CACF;AAqCD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,CAmGvB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAMvE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,CA6DhC"}