@exla/rudder 0.0.0-stage → 3.4.1
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/LICENSE +100 -0
- package/README.md +733 -2
- package/assets/rudder.icns +0 -0
- package/assets/sounds/NOTICE.md +8 -0
- package/assets/sounds/ping.mp3 +0 -0
- package/dist/agent-attention.d.ts +5 -0
- package/dist/agent-attention.js +54 -0
- package/dist/agent-attention.js.map +1 -0
- package/dist/analytics.d.ts +36 -0
- package/dist/analytics.js +178 -0
- package/dist/analytics.js.map +1 -0
- package/dist/attach-session.d.ts +91 -0
- package/dist/attach-session.js +290 -0
- package/dist/attach-session.js.map +1 -0
- package/dist/auth.d.ts +36 -0
- package/dist/auth.js +397 -0
- package/dist/auth.js.map +1 -0
- package/dist/backends.d.ts +3 -0
- package/dist/backends.js +638 -0
- package/dist/backends.js.map +1 -0
- package/dist/board/board.css +1 -0
- package/dist/board/board.js +2 -0
- package/dist/board/daemon.d.ts +39 -0
- package/dist/board/daemon.js +1510 -0
- package/dist/board/daemon.js.map +1 -0
- package/dist/brain.d.ts +24 -0
- package/dist/brain.js +244 -0
- package/dist/brain.js.map +1 -0
- package/dist/bus.d.ts +9 -0
- package/dist/bus.js +23 -0
- package/dist/bus.js.map +1 -0
- package/dist/checkout-sync.d.ts +35 -0
- package/dist/checkout-sync.js +247 -0
- package/dist/checkout-sync.js.map +1 -0
- package/dist/cloud.d.ts +51 -0
- package/dist/cloud.js +4672 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codex-binary.d.ts +12 -0
- package/dist/codex-binary.js +184 -0
- package/dist/codex-binary.js.map +1 -0
- package/dist/context-audit.d.ts +21 -0
- package/dist/context-audit.js +109 -0
- package/dist/context-audit.js.map +1 -0
- package/dist/daemon.d.ts +27 -0
- package/dist/daemon.js +203 -0
- package/dist/daemon.js.map +1 -0
- package/dist/effort.d.ts +9 -0
- package/dist/effort.js +72 -0
- package/dist/effort.js.map +1 -0
- package/dist/feedback.d.ts +46 -0
- package/dist/feedback.js +173 -0
- package/dist/feedback.js.map +1 -0
- package/dist/gc.d.ts +3 -0
- package/dist/gc.js +262 -0
- package/dist/gc.js.map +1 -0
- package/dist/git.d.ts +31 -0
- package/dist/git.js +455 -0
- package/dist/git.js.map +1 -0
- package/dist/goal.d.ts +33 -0
- package/dist/goal.js +95 -0
- package/dist/goal.js.map +1 -0
- package/dist/graph.d.ts +93 -0
- package/dist/graph.js +372 -0
- package/dist/graph.js.map +1 -0
- package/dist/handoff.d.ts +110 -0
- package/dist/handoff.js +565 -0
- package/dist/handoff.js.map +1 -0
- package/dist/improve/advisor.d.ts +10 -0
- package/dist/improve/advisor.js +115 -0
- package/dist/improve/advisor.js.map +1 -0
- package/dist/improve/collect.d.ts +49 -0
- package/dist/improve/collect.js +274 -0
- package/dist/improve/collect.js.map +1 -0
- package/dist/improve/gate.d.ts +17 -0
- package/dist/improve/gate.js +60 -0
- package/dist/improve/gate.js.map +1 -0
- package/dist/improve/index.d.ts +9 -0
- package/dist/improve/index.js +376 -0
- package/dist/improve/index.js.map +1 -0
- package/dist/improve/judge.d.ts +32 -0
- package/dist/improve/judge.js +114 -0
- package/dist/improve/judge.js.map +1 -0
- package/dist/improve/mine.d.ts +31 -0
- package/dist/improve/mine.js +192 -0
- package/dist/improve/mine.js.map +1 -0
- package/dist/improve/propose.d.ts +51 -0
- package/dist/improve/propose.js +150 -0
- package/dist/improve/propose.js.map +1 -0
- package/dist/improve/rank.d.ts +16 -0
- package/dist/improve/rank.js +49 -0
- package/dist/improve/rank.js.map +1 -0
- package/dist/improve/schedule.d.ts +1 -0
- package/dist/improve/schedule.js +95 -0
- package/dist/improve/schedule.js.map +1 -0
- package/dist/improve/ship.d.ts +25 -0
- package/dist/improve/ship.js +82 -0
- package/dist/improve/ship.js.map +1 -0
- package/dist/improve/state.d.ts +157 -0
- package/dist/improve/state.js +264 -0
- package/dist/improve/state.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/jj-binary.d.ts +36 -0
- package/dist/jj-binary.js +143 -0
- package/dist/jj-binary.js.map +1 -0
- package/dist/jj.d.ts +163 -0
- package/dist/jj.js +926 -0
- package/dist/jj.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +110 -0
- package/dist/logger.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +1366 -0
- package/dist/main.js.map +1 -0
- package/dist/migration.d.ts +82 -0
- package/dist/migration.js +198 -0
- package/dist/migration.js.map +1 -0
- package/dist/models.d.ts +9 -0
- package/dist/models.js +623 -0
- package/dist/models.js.map +1 -0
- package/dist/move-home.d.ts +82 -0
- package/dist/move-home.js +472 -0
- package/dist/move-home.js.map +1 -0
- package/dist/native/darwin-arm64/rudder-native +0 -0
- package/dist/native/darwin-x64/rudder-native +0 -0
- package/dist/native/linux-x64/rudder-native +0 -0
- package/dist/native-agents.d.ts +8 -0
- package/dist/native-agents.js +178 -0
- package/dist/native-agents.js.map +1 -0
- package/dist/native-binary.d.ts +4 -0
- package/dist/native-binary.js +140 -0
- package/dist/native-binary.js.map +1 -0
- package/dist/onboarding.d.ts +11 -0
- package/dist/onboarding.js +111 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/paste-bridge.d.ts +36 -0
- package/dist/paste-bridge.js +279 -0
- package/dist/paste-bridge.js.map +1 -0
- package/dist/plan-mode.d.ts +2 -0
- package/dist/plan-mode.js +22 -0
- package/dist/plan-mode.js.map +1 -0
- package/dist/planner.d.ts +27 -0
- package/dist/planner.js +587 -0
- package/dist/planner.js.map +1 -0
- package/dist/predict.d.ts +67 -0
- package/dist/predict.js +369 -0
- package/dist/predict.js.map +1 -0
- package/dist/qr.d.ts +13 -0
- package/dist/qr.js +377 -0
- package/dist/qr.js.map +1 -0
- package/dist/report.d.ts +74 -0
- package/dist/report.js +412 -0
- package/dist/report.js.map +1 -0
- package/dist/rudder-md.d.ts +33 -0
- package/dist/rudder-md.js +142 -0
- package/dist/rudder-md.js.map +1 -0
- package/dist/run-manager.d.ts +62 -0
- package/dist/run-manager.js +1400 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/scheduler.d.ts +128 -0
- package/dist/scheduler.js +955 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/state.d.ts +127 -0
- package/dist/state.js +704 -0
- package/dist/state.js.map +1 -0
- package/dist/surfaces.d.ts +91 -0
- package/dist/surfaces.js +460 -0
- package/dist/surfaces.js.map +1 -0
- package/dist/task-summary.d.ts +30 -0
- package/dist/task-summary.js +472 -0
- package/dist/task-summary.js.map +1 -0
- package/dist/types.d.ts +492 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +198 -0
- package/dist/usage.js +830 -0
- package/dist/usage.js.map +1 -0
- package/dist/util.d.ts +73 -0
- package/dist/util.js +399 -0
- package/dist/util.js.map +1 -0
- package/dist/version-check.d.ts +16 -0
- package/dist/version-check.js +269 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +68 -4
- package/scripts/copy-native.mjs +89 -0
- package/scripts/postinstall.mjs +34 -0
package/dist/backends.js
ADDED
|
@@ -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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"}
|