@exla/rudder 0.0.0-stage → 3.4.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 (181) hide show
  1. package/LICENSE +100 -0
  2. package/README.md +733 -2
  3. package/assets/rudder.icns +0 -0
  4. package/assets/sounds/NOTICE.md +8 -0
  5. package/assets/sounds/ping.mp3 +0 -0
  6. package/dist/agent-attention.d.ts +5 -0
  7. package/dist/agent-attention.js +54 -0
  8. package/dist/agent-attention.js.map +1 -0
  9. package/dist/analytics.d.ts +36 -0
  10. package/dist/analytics.js +178 -0
  11. package/dist/analytics.js.map +1 -0
  12. package/dist/attach-session.d.ts +91 -0
  13. package/dist/attach-session.js +290 -0
  14. package/dist/attach-session.js.map +1 -0
  15. package/dist/auth.d.ts +36 -0
  16. package/dist/auth.js +392 -0
  17. package/dist/auth.js.map +1 -0
  18. package/dist/backends.d.ts +3 -0
  19. package/dist/backends.js +638 -0
  20. package/dist/backends.js.map +1 -0
  21. package/dist/board/board.css +1 -0
  22. package/dist/board/board.js +2 -0
  23. package/dist/board/daemon.d.ts +39 -0
  24. package/dist/board/daemon.js +1510 -0
  25. package/dist/board/daemon.js.map +1 -0
  26. package/dist/brain.d.ts +24 -0
  27. package/dist/brain.js +244 -0
  28. package/dist/brain.js.map +1 -0
  29. package/dist/bus.d.ts +9 -0
  30. package/dist/bus.js +23 -0
  31. package/dist/bus.js.map +1 -0
  32. package/dist/checkout-sync.d.ts +35 -0
  33. package/dist/checkout-sync.js +247 -0
  34. package/dist/checkout-sync.js.map +1 -0
  35. package/dist/cloud.d.ts +48 -0
  36. package/dist/cloud.js +4596 -0
  37. package/dist/cloud.js.map +1 -0
  38. package/dist/codex-binary.d.ts +12 -0
  39. package/dist/codex-binary.js +184 -0
  40. package/dist/codex-binary.js.map +1 -0
  41. package/dist/context-audit.d.ts +21 -0
  42. package/dist/context-audit.js +109 -0
  43. package/dist/context-audit.js.map +1 -0
  44. package/dist/daemon.d.ts +27 -0
  45. package/dist/daemon.js +203 -0
  46. package/dist/daemon.js.map +1 -0
  47. package/dist/effort.d.ts +9 -0
  48. package/dist/effort.js +72 -0
  49. package/dist/effort.js.map +1 -0
  50. package/dist/feedback.d.ts +46 -0
  51. package/dist/feedback.js +173 -0
  52. package/dist/feedback.js.map +1 -0
  53. package/dist/gc.d.ts +3 -0
  54. package/dist/gc.js +262 -0
  55. package/dist/gc.js.map +1 -0
  56. package/dist/git.d.ts +31 -0
  57. package/dist/git.js +455 -0
  58. package/dist/git.js.map +1 -0
  59. package/dist/goal.d.ts +33 -0
  60. package/dist/goal.js +95 -0
  61. package/dist/goal.js.map +1 -0
  62. package/dist/graph.d.ts +93 -0
  63. package/dist/graph.js +372 -0
  64. package/dist/graph.js.map +1 -0
  65. package/dist/handoff.d.ts +110 -0
  66. package/dist/handoff.js +565 -0
  67. package/dist/handoff.js.map +1 -0
  68. package/dist/improve/advisor.d.ts +10 -0
  69. package/dist/improve/advisor.js +115 -0
  70. package/dist/improve/advisor.js.map +1 -0
  71. package/dist/improve/collect.d.ts +49 -0
  72. package/dist/improve/collect.js +274 -0
  73. package/dist/improve/collect.js.map +1 -0
  74. package/dist/improve/gate.d.ts +17 -0
  75. package/dist/improve/gate.js +60 -0
  76. package/dist/improve/gate.js.map +1 -0
  77. package/dist/improve/index.d.ts +9 -0
  78. package/dist/improve/index.js +376 -0
  79. package/dist/improve/index.js.map +1 -0
  80. package/dist/improve/judge.d.ts +32 -0
  81. package/dist/improve/judge.js +114 -0
  82. package/dist/improve/judge.js.map +1 -0
  83. package/dist/improve/mine.d.ts +31 -0
  84. package/dist/improve/mine.js +192 -0
  85. package/dist/improve/mine.js.map +1 -0
  86. package/dist/improve/propose.d.ts +51 -0
  87. package/dist/improve/propose.js +150 -0
  88. package/dist/improve/propose.js.map +1 -0
  89. package/dist/improve/rank.d.ts +16 -0
  90. package/dist/improve/rank.js +49 -0
  91. package/dist/improve/rank.js.map +1 -0
  92. package/dist/improve/schedule.d.ts +1 -0
  93. package/dist/improve/schedule.js +95 -0
  94. package/dist/improve/schedule.js.map +1 -0
  95. package/dist/improve/ship.d.ts +25 -0
  96. package/dist/improve/ship.js +82 -0
  97. package/dist/improve/ship.js.map +1 -0
  98. package/dist/improve/state.d.ts +157 -0
  99. package/dist/improve/state.js +264 -0
  100. package/dist/improve/state.js.map +1 -0
  101. package/dist/index.d.ts +2 -0
  102. package/dist/index.js +88 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/jj-binary.d.ts +36 -0
  105. package/dist/jj-binary.js +143 -0
  106. package/dist/jj-binary.js.map +1 -0
  107. package/dist/jj.d.ts +163 -0
  108. package/dist/jj.js +926 -0
  109. package/dist/jj.js.map +1 -0
  110. package/dist/logger.d.ts +22 -0
  111. package/dist/logger.js +110 -0
  112. package/dist/logger.js.map +1 -0
  113. package/dist/main.d.ts +3 -0
  114. package/dist/main.js +1366 -0
  115. package/dist/main.js.map +1 -0
  116. package/dist/migration.d.ts +82 -0
  117. package/dist/migration.js +198 -0
  118. package/dist/migration.js.map +1 -0
  119. package/dist/models.d.ts +9 -0
  120. package/dist/models.js +623 -0
  121. package/dist/models.js.map +1 -0
  122. package/dist/move-home.d.ts +82 -0
  123. package/dist/move-home.js +472 -0
  124. package/dist/move-home.js.map +1 -0
  125. package/dist/native/darwin-arm64/rudder-native +0 -0
  126. package/dist/native/darwin-x64/rudder-native +0 -0
  127. package/dist/native/linux-x64/rudder-native +0 -0
  128. package/dist/native-agents.d.ts +8 -0
  129. package/dist/native-agents.js +178 -0
  130. package/dist/native-agents.js.map +1 -0
  131. package/dist/native-binary.d.ts +4 -0
  132. package/dist/native-binary.js +140 -0
  133. package/dist/native-binary.js.map +1 -0
  134. package/dist/paste-bridge.d.ts +36 -0
  135. package/dist/paste-bridge.js +279 -0
  136. package/dist/paste-bridge.js.map +1 -0
  137. package/dist/plan-mode.d.ts +2 -0
  138. package/dist/plan-mode.js +22 -0
  139. package/dist/plan-mode.js.map +1 -0
  140. package/dist/planner.d.ts +27 -0
  141. package/dist/planner.js +587 -0
  142. package/dist/planner.js.map +1 -0
  143. package/dist/predict.d.ts +67 -0
  144. package/dist/predict.js +369 -0
  145. package/dist/predict.js.map +1 -0
  146. package/dist/report.d.ts +74 -0
  147. package/dist/report.js +412 -0
  148. package/dist/report.js.map +1 -0
  149. package/dist/rudder-md.d.ts +33 -0
  150. package/dist/rudder-md.js +142 -0
  151. package/dist/rudder-md.js.map +1 -0
  152. package/dist/run-manager.d.ts +62 -0
  153. package/dist/run-manager.js +1400 -0
  154. package/dist/run-manager.js.map +1 -0
  155. package/dist/scheduler.d.ts +128 -0
  156. package/dist/scheduler.js +955 -0
  157. package/dist/scheduler.js.map +1 -0
  158. package/dist/state.d.ts +127 -0
  159. package/dist/state.js +704 -0
  160. package/dist/state.js.map +1 -0
  161. package/dist/surfaces.d.ts +91 -0
  162. package/dist/surfaces.js +460 -0
  163. package/dist/surfaces.js.map +1 -0
  164. package/dist/task-summary.d.ts +30 -0
  165. package/dist/task-summary.js +472 -0
  166. package/dist/task-summary.js.map +1 -0
  167. package/dist/types.d.ts +492 -0
  168. package/dist/types.js +2 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/usage.d.ts +198 -0
  171. package/dist/usage.js +830 -0
  172. package/dist/usage.js.map +1 -0
  173. package/dist/util.d.ts +73 -0
  174. package/dist/util.js +399 -0
  175. package/dist/util.js.map +1 -0
  176. package/dist/version-check.d.ts +16 -0
  177. package/dist/version-check.js +269 -0
  178. package/dist/version-check.js.map +1 -0
  179. package/package.json +68 -4
  180. package/scripts/copy-native.mjs +89 -0
  181. package/scripts/postinstall.mjs +34 -0
@@ -0,0 +1,638 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { spawn } from "node:child_process";
3
+ import { CODEX_RUDDER_WORKER_CONFIG_ARGS, codexLaunchEnv, ensureRudderCodexBinary } from "./codex-binary.js";
4
+ import { CODEX_DEFAULT_MODEL, lastUsedCodexModelSync, liveCodexModel, loadAuthStore, loadConfig, saveRunRecord } from "./state.js";
5
+ import { normalizeEffortForBackend } from "./effort.js";
6
+ import { commandExists, formatMissingToolMessage, isMissingToolSpawnError, isRecord, lineSplitBuffer, MissingToolError, nowIso, parseJsonLine, runCommand, stripRudderPromptWrappers, textFromAssistantMessage, } from "./util.js";
7
+ export function getBackend(id) {
8
+ // TEST-ONLY deterministic hook: when RUDDER_FAKE_BACKEND=1, every backend is a
9
+ // scripted fake that applies file edits encoded in the node prompt and exits 0,
10
+ // with no real model call or auth. This lets the end-to-end orchestrator test
11
+ // drive the REAL pipeline (schedule -> isolated jj workspace -> worker -> verify
12
+ // -> jj merge -> unblock dependents) repeatably. See `fakeBackend`.
13
+ if (process.env.RUDDER_FAKE_BACKEND === "1") {
14
+ return fakeBackend(id);
15
+ }
16
+ if (id === "claude") {
17
+ return claudeBackend();
18
+ }
19
+ if (id === "codex") {
20
+ return codexBackend();
21
+ }
22
+ if (id === "opencode") {
23
+ return opencodeBackend();
24
+ }
25
+ return acpxBackend();
26
+ }
27
+ /**
28
+ * TEST-ONLY backend. It reads `[[FAKE_FILE:relpath]]…[[/FAKE_FILE]]` blocks from
29
+ * the node prompt (`run.task`, which is stable across auto-steer passes) and
30
+ * writes each into the run's isolated workspace, then emits a `backend.output`
31
+ * line that mentions verification so the local verifier is satisfied. Parsing
32
+ * `run.task` (not the per-turn prompt) keeps the second auto-steer pass writing
33
+ * the same files idempotently.
34
+ */
35
+ function fakeBackend(id) {
36
+ return {
37
+ id,
38
+ async verify() {
39
+ return { ok: true, message: "fake backend (RUDDER_FAKE_BACKEND=1)" };
40
+ },
41
+ async run(request, emit) {
42
+ const fsp = await import("node:fs/promises");
43
+ const path = await import("node:path");
44
+ // Mirror spawnAndStream's bookkeeping so downstream readers (and the e2e
45
+ // test's ordering assertions) see the same run.process timing shape.
46
+ request.run.process = {
47
+ ...(request.run.process ?? {}),
48
+ startedAt: request.run.process?.startedAt ?? nowIso(),
49
+ };
50
+ request.run.status = "running";
51
+ await saveBackendRun(request.run);
52
+ const delayMs = Number(process.env.RUDDER_FAKE_BACKEND_DELAY_MS) || 0;
53
+ if (delayMs > 0) {
54
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
55
+ }
56
+ const root = request.run.workspace?.path ?? request.run.repoRoot;
57
+ const source = request.run.task ?? request.prompt ?? "";
58
+ const blocks = [...source.matchAll(/\[\[FAKE_FILE:(.+?)\]\]\n([\s\S]*?)\n\[\[\/FAKE_FILE\]\]/g)];
59
+ const written = [];
60
+ for (const match of blocks) {
61
+ const rel = (match[1] ?? "").trim();
62
+ const content = match[2] ?? "";
63
+ if (!rel) {
64
+ continue;
65
+ }
66
+ const dest = path.resolve(root, rel);
67
+ // Stay inside the workspace: a directive must never escape via `..`.
68
+ if (!dest.startsWith(path.resolve(root))) {
69
+ continue;
70
+ }
71
+ await fsp.mkdir(path.dirname(dest), { recursive: true });
72
+ await fsp.writeFile(dest, content.endsWith("\n") ? content : `${content}\n`, "utf8");
73
+ written.push(rel);
74
+ }
75
+ await emit({
76
+ ts: nowIso(),
77
+ runId: request.run.id,
78
+ type: "backend.output",
79
+ message: written.length
80
+ ? `fake backend wrote ${written.join(", ")} and ran the verification checks (tests pass)\n`
81
+ : "fake backend made no file changes; verification check ran\n",
82
+ });
83
+ request.run.process = {
84
+ ...(request.run.process ?? {}),
85
+ endedAt: nowIso(),
86
+ exitCode: 0,
87
+ signal: null,
88
+ };
89
+ await saveBackendRun(request.run);
90
+ return 0;
91
+ },
92
+ };
93
+ }
94
+ function claudeBackend() {
95
+ return {
96
+ id: "claude",
97
+ async verify() {
98
+ return commandExists("claude")
99
+ ? { ok: true, message: "claude found" }
100
+ : { ok: false, message: formatMissingToolMessage("claude") };
101
+ },
102
+ async run(request, emit) {
103
+ const prompt = stripRudderPromptWrappers(request.prompt);
104
+ const existingSessionId = request.run.session?.nativeSessionId;
105
+ const isFollowUp = (request.run.turns?.length ?? 0) > 1;
106
+ const sessionId = existingSessionId ?? randomUUID();
107
+ request.run.session = {
108
+ ...(request.run.session ?? {}),
109
+ nativeSessionId: sessionId,
110
+ };
111
+ await saveBackendRun(request.run);
112
+ const env = await backendEnv("anthropic");
113
+ const effort = normalizeEffortForBackend("claude", request.run.effort);
114
+ const args = compact([
115
+ "-p",
116
+ prompt,
117
+ "--model",
118
+ request.run.model || "sonnet",
119
+ effort ? "--effort" : undefined,
120
+ effort,
121
+ "--permission-mode",
122
+ "bypassPermissions",
123
+ "--dangerously-skip-permissions",
124
+ "--output-format",
125
+ "stream-json",
126
+ "--verbose",
127
+ "--include-partial-messages",
128
+ "--append-system-prompt",
129
+ request.contract,
130
+ ...(isFollowUp && existingSessionId
131
+ ? ["--resume", existingSessionId, "--fork-session"]
132
+ : ["--session-id", sessionId]),
133
+ ]);
134
+ return await spawnAndStream({
135
+ command: "claude",
136
+ args,
137
+ cwd: request.run.workspace.path,
138
+ env,
139
+ request,
140
+ emit,
141
+ });
142
+ },
143
+ };
144
+ }
145
+ function codexBackend() {
146
+ return {
147
+ id: "codex",
148
+ async verify() {
149
+ try {
150
+ const binary = await ensureRudderCodexBinary();
151
+ return { ok: true, message: `rudder-codex found at ${binary}` };
152
+ }
153
+ catch (error) {
154
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
155
+ }
156
+ },
157
+ async run(request, emit) {
158
+ const prompt = stripRudderPromptWrappers(request.prompt);
159
+ const command = await ensureRudderCodexBinary();
160
+ const env = await codexLaunchEnv(await backendEnv("openai"));
161
+ const effort = normalizeEffortForBackend("codex", request.run.effort);
162
+ const sessionId = request.run.session?.nativeSessionId;
163
+ const isFollowUp = (request.run.turns?.length ?? 0) > 1 && Boolean(sessionId);
164
+ const args = compact(isFollowUp
165
+ ? [
166
+ "exec",
167
+ "resume",
168
+ "--json",
169
+ "--model",
170
+ liveCodexModel(request.run.model) || lastUsedCodexModelSync() || CODEX_DEFAULT_MODEL,
171
+ "--dangerously-bypass-approvals-and-sandbox",
172
+ "--enable",
173
+ "goals",
174
+ ...CODEX_RUDDER_WORKER_CONFIG_ARGS,
175
+ effort ? "-c" : undefined,
176
+ effort ? `model_reasoning_effort="${effort}"` : undefined,
177
+ sessionId,
178
+ `${request.contract}\n\n${prompt}`,
179
+ ]
180
+ : [
181
+ "exec",
182
+ "--json",
183
+ "--color",
184
+ "never",
185
+ "--model",
186
+ liveCodexModel(request.run.model) || lastUsedCodexModelSync() || CODEX_DEFAULT_MODEL,
187
+ "--dangerously-bypass-approvals-and-sandbox",
188
+ "--enable",
189
+ "goals",
190
+ ...CODEX_RUDDER_WORKER_CONFIG_ARGS,
191
+ effort ? "-c" : undefined,
192
+ effort ? `model_reasoning_effort="${effort}"` : undefined,
193
+ `${request.contract}\n\n${prompt}`,
194
+ ]);
195
+ return await spawnAndStream({
196
+ command,
197
+ args,
198
+ cwd: request.run.workspace.path,
199
+ env,
200
+ request,
201
+ emit,
202
+ });
203
+ },
204
+ };
205
+ }
206
+ /**
207
+ * opencode (https://opencode.ai). `opencode run --format json` streams JSONL parts
208
+ * and reports the session id on every one, so a follow-up turn resumes the same
209
+ * conversation with `--session`. Models are named `provider/model`; an empty model
210
+ * means "whatever opencode is configured with", which is a legitimate choice here.
211
+ *
212
+ * No effort flag exists, so `run.effort` is deliberately not translated.
213
+ */
214
+ function opencodeBackend() {
215
+ return {
216
+ id: "opencode",
217
+ async verify() {
218
+ return commandExists("opencode")
219
+ ? { ok: true, message: "opencode found" }
220
+ : { ok: false, message: formatMissingToolMessage("opencode") };
221
+ },
222
+ async run(request, emit) {
223
+ const prompt = stripRudderPromptWrappers(request.prompt);
224
+ const sessionId = request.run.session?.nativeSessionId;
225
+ const isFollowUp = (request.run.turns?.length ?? 0) > 1 && Boolean(sessionId);
226
+ const args = compact([
227
+ "run",
228
+ "--format",
229
+ "json",
230
+ request.run.model ? "-m" : undefined,
231
+ request.run.model || undefined,
232
+ isFollowUp ? "--session" : undefined,
233
+ isFollowUp ? sessionId : undefined,
234
+ `${request.contract}\n\n${prompt}`,
235
+ ]);
236
+ return await spawnAndStream({
237
+ command: "opencode",
238
+ args,
239
+ cwd: request.run.workspace.path,
240
+ env: process.env,
241
+ request,
242
+ emit,
243
+ });
244
+ },
245
+ };
246
+ }
247
+ function compact(values) {
248
+ return values.filter((value) => Boolean(value));
249
+ }
250
+ function acpxBackend() {
251
+ return {
252
+ id: "acpx",
253
+ async verify() {
254
+ return commandExists("acpx")
255
+ ? { ok: true, message: "acpx found" }
256
+ : { ok: false, message: formatMissingToolMessage("acpx") };
257
+ },
258
+ async run(request, emit) {
259
+ const prompt = stripRudderPromptWrappers(request.prompt);
260
+ const sessionName = request.run.session?.sessionName ?? request.run.id;
261
+ const env = process.env;
262
+ const model = acpxCodexModel(request.run.model, request.run.effort);
263
+ request.run.session = {
264
+ ...(request.run.session ?? {}),
265
+ sessionName,
266
+ };
267
+ await saveBackendRun(request.run);
268
+ await runCommand("acpx", ["codex", "sessions", "ensure", "--name", sessionName], {
269
+ cwd: request.run.workspace.path,
270
+ env,
271
+ });
272
+ const args = [
273
+ "--approve-all",
274
+ "--format",
275
+ "json",
276
+ ...(model ? ["--model", model] : []),
277
+ "--cwd",
278
+ request.run.workspace.path,
279
+ "codex",
280
+ "-s",
281
+ sessionName,
282
+ `${request.contract}\n\n${prompt}`,
283
+ ];
284
+ return await spawnAndStream({
285
+ command: "acpx",
286
+ args,
287
+ cwd: request.run.workspace.path,
288
+ env,
289
+ request,
290
+ emit,
291
+ });
292
+ },
293
+ };
294
+ }
295
+ function acpxCodexModel(model, effort) {
296
+ const selectedModel = liveCodexModel(model) || lastUsedCodexModelSync() || CODEX_DEFAULT_MODEL;
297
+ if (selectedModel.includes("/")) {
298
+ return selectedModel;
299
+ }
300
+ const selectedEffort = normalizeEffortForBackend("codex", effort) || "xhigh";
301
+ return `${selectedModel}/${selectedEffort}`;
302
+ }
303
+ export async function backendEnv(provider) {
304
+ const store = await loadAuthStore();
305
+ const config = await loadConfig().catch(() => undefined);
306
+ const env = { ...process.env };
307
+ if (provider === "anthropic") {
308
+ // Honor the configured/synced profile FIRST, then the common fallbacks. The
309
+ // synced Claude Code profile is "anthropic:claude-code" — omitting it meant the
310
+ // primary credential was never injected.
311
+ const configuredId = config?.backends?.claude?.profileId;
312
+ const profile = firstProfile(store, [
313
+ ...(configuredId ? [configuredId] : []),
314
+ "anthropic:claude-code",
315
+ "anthropic:env",
316
+ "anthropic:default",
317
+ ]);
318
+ if (profile?.type === "api_key" && profile.key) {
319
+ env.ANTHROPIC_API_KEY = profile.key;
320
+ }
321
+ if (profile?.type === "token" && profile.token) {
322
+ // The Claude CLI reads CLAUDE_CODE_OAUTH_TOKEN for a setup-token; the previously
323
+ // set ANTHROPIC_OAUTH_TOKEN is not a recognized var, so the token was ignored.
324
+ env.CLAUDE_CODE_OAUTH_TOKEN = profile.token;
325
+ }
326
+ }
327
+ if (provider === "openai") {
328
+ const configuredId = config?.backends?.codex?.profileId;
329
+ const profile = firstProfile(store, [
330
+ ...(configuredId ? [configuredId] : []),
331
+ "openai-codex:default",
332
+ "openai:env",
333
+ "openai:default",
334
+ ]);
335
+ if (profile?.type === "api_key" && profile.key) {
336
+ env.OPENAI_API_KEY = profile.key;
337
+ }
338
+ }
339
+ return env;
340
+ }
341
+ function firstProfile(store, ids) {
342
+ for (const id of ids) {
343
+ const profile = store.profiles[id];
344
+ if (profile) {
345
+ return profile;
346
+ }
347
+ }
348
+ return undefined;
349
+ }
350
+ async function spawnAndStream(params) {
351
+ await params.emit({
352
+ ts: nowIso(),
353
+ runId: params.request.run.id,
354
+ type: "run.started",
355
+ message: `${params.command} started`,
356
+ data: { command: params.command, args: params.args },
357
+ });
358
+ const child = spawn(params.command, params.args, {
359
+ cwd: params.cwd,
360
+ env: params.env,
361
+ stdio: ["ignore", "pipe", "pipe"],
362
+ });
363
+ params.request.run.process = {
364
+ ...(params.request.run.process ?? {}),
365
+ pid: child.pid,
366
+ backendPid: child.pid,
367
+ // startedAt identifies the owning worker attempt (and is the legacy
368
+ // ownership token when attemptId is absent). Do not replace it merely
369
+ // because the backend child started a moment later.
370
+ startedAt: params.request.run.process?.startedAt ?? nowIso(),
371
+ };
372
+ params.request.run.status = "running";
373
+ await saveBackendRun(params.request.run);
374
+ let outRest = "";
375
+ let errRest = "";
376
+ const streamState = { sawStreamingText: false };
377
+ // Best-effort token accounting: accumulate the largest usage the backend
378
+ // reports on its own stream (claude usage / codex token_count). Backends
379
+ // report cumulative totals, so we keep the max seen and write it onto the
380
+ // run record so the scheduler's budget cap operates on real numbers.
381
+ const usageState = { input: 0, output: 0 };
382
+ let emitQueue = Promise.resolve();
383
+ const enqueueBackendLine = (line, stderr) => {
384
+ emitQueue = emitQueue
385
+ .then(async () => {
386
+ accumulateUsage(usageState, line);
387
+ await emitBackendLine(params.request.run, line, params.emit, stderr, streamState);
388
+ })
389
+ .catch(async (error) => {
390
+ await params.emit({
391
+ ts: nowIso(),
392
+ runId: params.request.run.id,
393
+ type: "backend.error",
394
+ message: error instanceof Error ? error.message : String(error),
395
+ });
396
+ });
397
+ };
398
+ child.stdout.setEncoding("utf8");
399
+ child.stderr.setEncoding("utf8");
400
+ child.stdout.on("data", (chunk) => {
401
+ const split = lineSplitBuffer(outRest, chunk);
402
+ outRest = split.rest;
403
+ for (const line of split.lines) {
404
+ enqueueBackendLine(line, false);
405
+ }
406
+ });
407
+ child.stderr.on("data", (chunk) => {
408
+ const split = lineSplitBuffer(errRest, chunk);
409
+ errRest = split.rest;
410
+ for (const line of split.lines) {
411
+ enqueueBackendLine(line, true);
412
+ }
413
+ });
414
+ return await new Promise((resolve, reject) => {
415
+ child.on("error", (error) => {
416
+ if (isMissingToolSpawnError(error)) {
417
+ reject(new MissingToolError(params.command));
418
+ return;
419
+ }
420
+ void params.emit({
421
+ ts: nowIso(),
422
+ runId: params.request.run.id,
423
+ type: "backend.error",
424
+ message: error.message,
425
+ });
426
+ resolve(1);
427
+ });
428
+ child.on("close", (code, signal) => {
429
+ if (outRest) {
430
+ enqueueBackendLine(outRest, false);
431
+ }
432
+ if (errRest) {
433
+ enqueueBackendLine(errRest, true);
434
+ }
435
+ void (async () => {
436
+ await emitQueue;
437
+ // Persist the best-effort token usage captured from the stream so the
438
+ // scheduler can sum it against the budget cap. Only write when we saw a
439
+ // real number; backends that emit no usage leave run.tokens untouched.
440
+ if (usageState.input + usageState.output > 0) {
441
+ const previous = params.request.run.tokens;
442
+ if (!previous || usageState.input + usageState.output >= previous.input + previous.output) {
443
+ params.request.run.tokens = { input: usageState.input, output: usageState.output };
444
+ await saveBackendRun(params.request.run);
445
+ }
446
+ }
447
+ await params.emit({
448
+ ts: nowIso(),
449
+ runId: params.request.run.id,
450
+ type: "backend.exit",
451
+ message: `${params.command} exited with ${code ?? signal ?? "unknown"}`,
452
+ data: { code: code ?? null, signal: signal ?? null, tokens: { ...usageState } },
453
+ });
454
+ resolve(code ?? (signal ? 130 : 1));
455
+ })();
456
+ });
457
+ });
458
+ }
459
+ async function emitBackendLine(run, line, emit, stderr, streamState) {
460
+ const trimmed = line.trimEnd();
461
+ if (!trimmed) {
462
+ return;
463
+ }
464
+ if (/^\[acpx\].*agent needs reconnect$/.test(trimmed)) {
465
+ return;
466
+ }
467
+ const parsed = parseJsonLine(trimmed);
468
+ const message = parsed ? textFromBackendData(parsed, streamState.sawStreamingText) : trimmed;
469
+ if (isStreamingTextEvent(parsed)) {
470
+ streamState.sawStreamingText = true;
471
+ }
472
+ const sessionId = sessionIdFromBackendData(parsed);
473
+ if (sessionId && run.session?.nativeSessionId !== sessionId) {
474
+ run.session = {
475
+ ...(run.session ?? {}),
476
+ nativeSessionId: sessionId,
477
+ };
478
+ await saveBackendRun(run);
479
+ }
480
+ await emit({
481
+ ts: nowIso(),
482
+ runId: run.id,
483
+ type: stderr ? "backend.error" : "backend.output",
484
+ message: message || undefined,
485
+ data: parsed ?? trimmed,
486
+ });
487
+ }
488
+ function sessionIdFromBackendData(data) {
489
+ if (!isRecord(data))
490
+ return undefined;
491
+ if (typeof data.session_id === "string")
492
+ return data.session_id;
493
+ // `codex exec --json` announces the resumable conversation with a
494
+ // thread.started event. Persist it so a web steer resumes model context rather
495
+ // than merely re-running in the same workspace.
496
+ if (data.type === "thread.started" && typeof data.thread_id === "string") {
497
+ return data.thread_id;
498
+ }
499
+ // `opencode run --format json` stamps every part with its session id.
500
+ return typeof data.sessionID === "string" ? data.sessionID : undefined;
501
+ }
502
+ function saveBackendRun(run) {
503
+ const expectedAttemptId = run.process?.attemptId;
504
+ const expectedStartedAt = run.process?.startedAt;
505
+ return saveRunRecord(run, expectedAttemptId
506
+ ? { expectedAttemptId }
507
+ : expectedStartedAt
508
+ ? { expectedStartedAt }
509
+ : undefined);
510
+ }
511
+ /**
512
+ * Best-effort token accounting. Parses a single backend stream line and raises
513
+ * the running usage totals to the largest cumulative numbers seen. Recognizes:
514
+ * - claude (--output-format stream-json): `result` events carry a cumulative
515
+ * `usage`; `assistant` events carry per-message `message.usage`. We take the
516
+ * cumulative `result` usage when present and otherwise accumulate assistant
517
+ * deltas, keeping whichever total is larger.
518
+ * - codex (exec --json): `token_count` event with
519
+ * `payload.info.total_token_usage` (cumulative). We take the max.
520
+ * Anything else is a no-op. Mirrors native/src/usage.rs field names.
521
+ */
522
+ function accumulateUsage(state, line) {
523
+ const parsed = parseJsonLine(line.trimEnd());
524
+ if (!isRecord(parsed)) {
525
+ return;
526
+ }
527
+ // Claude: final `result` event with a cumulative usage block.
528
+ if (parsed.type === "result") {
529
+ const usage = readClaudeUsage(parsed.usage);
530
+ if (usage) {
531
+ raiseUsage(state, usage.input, usage.output);
532
+ }
533
+ return;
534
+ }
535
+ // Claude: per-message assistant usage. Sum across messages; compare to state.
536
+ if (parsed.type === "assistant" && isRecord(parsed.message)) {
537
+ const usage = readClaudeUsage(parsed.message.usage);
538
+ if (usage) {
539
+ // assistant usage is per-turn; add it to the running totals.
540
+ state.input += usage.input;
541
+ state.output += usage.output;
542
+ }
543
+ return;
544
+ }
545
+ // Codex: token_count event carrying a cumulative total_token_usage.
546
+ const payload = isRecord(parsed.payload) ? parsed.payload : undefined;
547
+ if (payload && payload.type === "token_count" && isRecord(payload.info)) {
548
+ const total = isRecord(payload.info.total_token_usage) ? payload.info.total_token_usage : undefined;
549
+ if (total) {
550
+ const inp = numberField(total.input_tokens);
551
+ const cached = numberField(total.cached_input_tokens);
552
+ const out = numberField(total.output_tokens);
553
+ const reasoning = numberField(total.reasoning_output_tokens);
554
+ // Mirror usage.rs: codex cached_input_tokens are a subset already in
555
+ // input_tokens; reasoning tokens are billed as output.
556
+ raiseUsage(state, Math.max(0, inp - cached), out + reasoning);
557
+ }
558
+ }
559
+ }
560
+ function readClaudeUsage(value) {
561
+ if (!isRecord(value)) {
562
+ return undefined;
563
+ }
564
+ const input = numberField(value.input_tokens) +
565
+ numberField(value.cache_creation_input_tokens) +
566
+ numberField(value.cache_read_input_tokens);
567
+ const output = numberField(value.output_tokens);
568
+ if (input + output === 0) {
569
+ return undefined;
570
+ }
571
+ return { input, output };
572
+ }
573
+ function raiseUsage(state, input, output) {
574
+ if (input + output > state.input + state.output) {
575
+ state.input = input;
576
+ state.output = output;
577
+ }
578
+ }
579
+ function numberField(value) {
580
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
581
+ }
582
+ function textFromBackendData(data, sawStreamingText) {
583
+ if (!data || typeof data !== "object") {
584
+ return "";
585
+ }
586
+ const record = data;
587
+ if (record.type === "stream_event" && isRecord(record.event)) {
588
+ const event = record.event;
589
+ if (event.type === "content_block_delta" && isRecord(event.delta) && typeof event.delta.text === "string") {
590
+ return event.delta.text;
591
+ }
592
+ return "";
593
+ }
594
+ if (record.method === "session/update" && isRecord(record.params)) {
595
+ const update = record.params.update;
596
+ if (isRecord(update) && update.sessionUpdate === "agent_message_chunk" && isRecord(update.content)) {
597
+ return typeof update.content.text === "string" ? update.content.text : "";
598
+ }
599
+ return "";
600
+ }
601
+ if (isRecord(record.error) && typeof record.error.message === "string") {
602
+ return record.error.message;
603
+ }
604
+ // opencode: text parts carry the assistant prose; step_start/step_finish do not.
605
+ if (record.type === "text" && isRecord(record.part) && typeof record.part.text === "string") {
606
+ return record.part.text;
607
+ }
608
+ if (record.type === "assistant") {
609
+ if (sawStreamingText) {
610
+ return "";
611
+ }
612
+ return textFromAssistantMessage(record.message);
613
+ }
614
+ if (record.type === "result") {
615
+ if (record.subtype === "success" && typeof record.result === "string") {
616
+ return sawStreamingText ? "" : record.result;
617
+ }
618
+ if (Array.isArray(record.errors)) {
619
+ return record.errors.filter((item) => typeof item === "string").join(", ");
620
+ }
621
+ return "";
622
+ }
623
+ if (typeof record.message === "string") {
624
+ return record.message;
625
+ }
626
+ if (typeof record.text === "string") {
627
+ return record.text;
628
+ }
629
+ return "";
630
+ }
631
+ function isStreamingTextEvent(data) {
632
+ if (!isRecord(data) || data.type !== "stream_event" || !isRecord(data.event)) {
633
+ return false;
634
+ }
635
+ const event = data.event;
636
+ return event.type === "content_block_delta" && isRecord(event.delta) && typeof event.delta.text === "string";
637
+ }
638
+ //# sourceMappingURL=backends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backends.js","sourceRoot":"","sources":["../src/backends.ts"],"names":[],"mappings":"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"}