@viraatdas/rudder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/dist/auth.d.ts +33 -0
- package/dist/auth.js +348 -0
- package/dist/auth.js.map +1 -0
- package/dist/backends.d.ts +2 -0
- package/dist/backends.js +246 -0
- package/dist/backends.js.map +1 -0
- package/dist/brain.d.ts +4 -0
- package/dist/brain.js +131 -0
- package/dist/brain.js.map +1 -0
- package/dist/git.d.ts +23 -0
- package/dist/git.js +184 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +303 -0
- package/dist/main.js.map +1 -0
- package/dist/run-manager.d.ts +26 -0
- package/dist/run-manager.js +364 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/state.d.ts +34 -0
- package/dist/state.js +189 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +47 -0
- package/dist/util.js +192 -0
- package/dist/util.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fsp from "node:fs/promises";
|
|
3
|
+
import { createSpec, renderContract, verifyRun } from "./brain.js";
|
|
4
|
+
import { getBackend } from "./backends.js";
|
|
5
|
+
import { createRunRecord, eventsPath, listRuns, loadConfig, loadRunRecord, outputPath, resolveRun, runDir, saveConfig, saveRunRecord, } from "./state.js";
|
|
6
|
+
import { appendEvent, } from "./state.js";
|
|
7
|
+
import { activeRunsForCheckout, createRunWorktree, currentBranch, currentCommit, findRepoRoot, mergeRunIntoCurrentBranch, processAlive, removeWorktree, } from "./git.js";
|
|
8
|
+
import { ensureDir, isTty, newRunId, nowIso, pathExists, shortenHome } from "./util.js";
|
|
9
|
+
export async function startRun(params) {
|
|
10
|
+
const repoRoot = findRepoRoot();
|
|
11
|
+
const config = await loadConfig();
|
|
12
|
+
const backend = params.backend ?? config.lastUsedBackend ?? config.defaultBackend;
|
|
13
|
+
const model = params.model ??
|
|
14
|
+
(backend === "claude"
|
|
15
|
+
? config.backends.claude?.model
|
|
16
|
+
: backend === "codex"
|
|
17
|
+
? config.backends.codex?.model
|
|
18
|
+
: config.backends.acpx?.model);
|
|
19
|
+
const active = await activeRunsForCheckout(repoRoot, repoRoot);
|
|
20
|
+
if (params.queue && active.length > 0) {
|
|
21
|
+
throw new Error("Queue mode is not implemented yet; omit --queue to create a worktree run.");
|
|
22
|
+
}
|
|
23
|
+
const useWorktree = Boolean(params.worktree || active.length > 0);
|
|
24
|
+
const baseCommit = await currentCommit(repoRoot);
|
|
25
|
+
const targetBranch = await currentBranch(repoRoot);
|
|
26
|
+
const id = newRunId(params.task);
|
|
27
|
+
const worktreeInfo = useWorktree
|
|
28
|
+
? await createRunWorktree({ repoRoot, runId: id, task: params.task, baseCommit })
|
|
29
|
+
: { path: repoRoot, branch: undefined };
|
|
30
|
+
const run = await createRunRecord({
|
|
31
|
+
id,
|
|
32
|
+
repoRoot,
|
|
33
|
+
task: params.task,
|
|
34
|
+
backend,
|
|
35
|
+
model,
|
|
36
|
+
targetBranch,
|
|
37
|
+
baseCommit,
|
|
38
|
+
useWorktree,
|
|
39
|
+
worktreeBranch: worktreeInfo.branch,
|
|
40
|
+
worktreePath: worktreeInfo.path,
|
|
41
|
+
});
|
|
42
|
+
await emit(run, {
|
|
43
|
+
ts: nowIso(),
|
|
44
|
+
runId: run.id,
|
|
45
|
+
type: "run.created",
|
|
46
|
+
message: useWorktree
|
|
47
|
+
? `Created worktree ${shortenHome(worktreeInfo.path)}`
|
|
48
|
+
: "Created run in current checkout",
|
|
49
|
+
});
|
|
50
|
+
config.lastUsedBackend = backend;
|
|
51
|
+
await saveConfig(config);
|
|
52
|
+
const worker = spawn(process.execPath, [process.argv[1] ?? "", "__worker", "--repo", repoRoot, "--run", run.id], {
|
|
53
|
+
cwd: repoRoot,
|
|
54
|
+
detached: true,
|
|
55
|
+
stdio: "ignore",
|
|
56
|
+
});
|
|
57
|
+
worker.unref();
|
|
58
|
+
run.process = {
|
|
59
|
+
pid: worker.pid,
|
|
60
|
+
startedAt: nowIso(),
|
|
61
|
+
};
|
|
62
|
+
run.status = "running";
|
|
63
|
+
await saveRunRecord(run);
|
|
64
|
+
if (params.json) {
|
|
65
|
+
console.log(JSON.stringify(run, null, 2));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
console.log(`Started ${run.id}`);
|
|
69
|
+
console.log(` backend: ${backend}${model ? ` (${model})` : ""}`);
|
|
70
|
+
console.log(` mode: ${useWorktree ? `worktree ${shortenHome(worktreeInfo.path)}` : "current checkout"}`);
|
|
71
|
+
if (params.detach || !isTty()) {
|
|
72
|
+
console.log(` watch: rudder watch ${run.id}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await watchRun({ repoRoot, runId: run.id, follow: true });
|
|
76
|
+
}
|
|
77
|
+
export async function workerRun(repoRoot, runId) {
|
|
78
|
+
const run = await loadRunRecord(repoRoot, runId);
|
|
79
|
+
if (!run) {
|
|
80
|
+
throw new Error(`Run not found: ${runId}`);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const spec = await createSpec(run);
|
|
84
|
+
await emit(run, {
|
|
85
|
+
ts: nowIso(),
|
|
86
|
+
runId,
|
|
87
|
+
type: "planner.spec",
|
|
88
|
+
message: "Planner contract created",
|
|
89
|
+
data: spec,
|
|
90
|
+
});
|
|
91
|
+
const backend = getBackend(run.backend);
|
|
92
|
+
const health = await backend.verify();
|
|
93
|
+
if (!health.ok) {
|
|
94
|
+
throw new Error(health.message);
|
|
95
|
+
}
|
|
96
|
+
const exitCode = await backend.run({
|
|
97
|
+
run,
|
|
98
|
+
prompt: run.task,
|
|
99
|
+
contract: renderContract(spec),
|
|
100
|
+
}, async (event) => {
|
|
101
|
+
await emit(run, event);
|
|
102
|
+
});
|
|
103
|
+
run.process = {
|
|
104
|
+
...(run.process ?? {}),
|
|
105
|
+
endedAt: nowIso(),
|
|
106
|
+
exitCode,
|
|
107
|
+
signal: null,
|
|
108
|
+
};
|
|
109
|
+
if (exitCode !== 0) {
|
|
110
|
+
run.status = "failed";
|
|
111
|
+
await saveRunRecord(run);
|
|
112
|
+
await emit(run, {
|
|
113
|
+
ts: nowIso(),
|
|
114
|
+
runId,
|
|
115
|
+
type: "run.failed",
|
|
116
|
+
message: `Backend exited with ${exitCode}`,
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
run.status = "verifying";
|
|
121
|
+
await saveRunRecord(run);
|
|
122
|
+
const verification = await verifyRun(run);
|
|
123
|
+
run.verification = verification;
|
|
124
|
+
run.status = verification.shouldContinue ? "failed" : "completed";
|
|
125
|
+
await saveRunRecord(run);
|
|
126
|
+
await emit(run, {
|
|
127
|
+
ts: nowIso(),
|
|
128
|
+
runId,
|
|
129
|
+
type: "verifier.result",
|
|
130
|
+
message: verification.notes,
|
|
131
|
+
data: verification,
|
|
132
|
+
});
|
|
133
|
+
await emit(run, {
|
|
134
|
+
ts: nowIso(),
|
|
135
|
+
runId,
|
|
136
|
+
type: run.status === "completed" ? "run.completed" : "run.failed",
|
|
137
|
+
message: run.status === "completed"
|
|
138
|
+
? "Run completed"
|
|
139
|
+
: `Run failed verification: ${verification.missing.join("; ")}`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
144
|
+
run.status = "failed";
|
|
145
|
+
run.process = {
|
|
146
|
+
...(run.process ?? {}),
|
|
147
|
+
endedAt: nowIso(),
|
|
148
|
+
exitCode: 1,
|
|
149
|
+
signal: null,
|
|
150
|
+
};
|
|
151
|
+
await saveRunRecord(run);
|
|
152
|
+
await emit(run, {
|
|
153
|
+
ts: nowIso(),
|
|
154
|
+
runId,
|
|
155
|
+
type: "run.failed",
|
|
156
|
+
message,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export async function statusRuns(options) {
|
|
161
|
+
const repoRoot = findRepoRoot();
|
|
162
|
+
const runs = await listRuns(repoRoot);
|
|
163
|
+
const active = runs.filter((run) => ["created", "running", "verifying"].includes(run.status));
|
|
164
|
+
if (options?.json) {
|
|
165
|
+
console.log(JSON.stringify({ repoRoot, active, runs }, null, 2));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(`Repo: ${repoRoot}`);
|
|
169
|
+
if (active.length === 0) {
|
|
170
|
+
console.log("No active runs.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
for (const run of active) {
|
|
174
|
+
const alive = processAlive(run.process?.pid) ? "alive" : "stale";
|
|
175
|
+
console.log(`${run.id} ${run.status} ${alive} ${run.backend} ${run.task}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export async function listProjectRuns(options) {
|
|
179
|
+
const repoRoot = findRepoRoot();
|
|
180
|
+
const runs = await listRuns(repoRoot);
|
|
181
|
+
if (options?.json) {
|
|
182
|
+
console.log(JSON.stringify(runs, null, 2));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
for (const run of runs) {
|
|
186
|
+
const wt = run.worktree.enabled ? ` worktree=${shortenHome(run.worktree.path)}` : "";
|
|
187
|
+
console.log(`${run.id} ${run.status} ${run.backend}${wt} ${run.task}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function watchRun(params) {
|
|
191
|
+
const repoRoot = params.repoRoot ?? findRepoRoot();
|
|
192
|
+
const run = await resolveRun(repoRoot, params.runId);
|
|
193
|
+
if (!run) {
|
|
194
|
+
throw new Error("No runs found.");
|
|
195
|
+
}
|
|
196
|
+
const file = eventsPath(repoRoot, run.id);
|
|
197
|
+
await waitForFile(file);
|
|
198
|
+
let offset = 0;
|
|
199
|
+
const initial = await fsp.readFile(file, "utf8").catch(() => "");
|
|
200
|
+
offset = Buffer.byteLength(initial);
|
|
201
|
+
printEvents(initial);
|
|
202
|
+
if (!params.follow) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
console.log(`Watching ${run.id}. Ctrl-C detaches; use 'rudder stop ${run.id}' to cancel.`);
|
|
206
|
+
await followFile(file, offset, async (chunk) => {
|
|
207
|
+
printEvents(chunk);
|
|
208
|
+
const latest = await loadRunRecord(repoRoot, run.id);
|
|
209
|
+
if (latest && !["created", "running", "verifying"].includes(latest.status)) {
|
|
210
|
+
process.exitCode = latest.status === "completed" || latest.status === "merged" ? 0 : 1;
|
|
211
|
+
process.exit();
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
export async function printLogs(runId, follow = false) {
|
|
216
|
+
const repoRoot = findRepoRoot();
|
|
217
|
+
const run = await resolveRun(repoRoot, runId);
|
|
218
|
+
if (!run) {
|
|
219
|
+
throw new Error("No runs found.");
|
|
220
|
+
}
|
|
221
|
+
const file = outputPath(repoRoot, run.id);
|
|
222
|
+
if (!(await pathExists(file))) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const output = await fsp.readFile(file, "utf8");
|
|
226
|
+
process.stdout.write(output);
|
|
227
|
+
if (follow) {
|
|
228
|
+
await followFile(file, Buffer.byteLength(output), async (chunk) => {
|
|
229
|
+
process.stdout.write(chunk);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export async function stopRun(runId) {
|
|
234
|
+
const repoRoot = findRepoRoot();
|
|
235
|
+
const run = await loadRunRecord(repoRoot, runId);
|
|
236
|
+
if (!run) {
|
|
237
|
+
throw new Error(`Run not found: ${runId}`);
|
|
238
|
+
}
|
|
239
|
+
if (run.process?.pid && processAlive(run.process.pid)) {
|
|
240
|
+
process.kill(run.process.pid, "SIGTERM");
|
|
241
|
+
}
|
|
242
|
+
run.status = "cancelled";
|
|
243
|
+
run.process = {
|
|
244
|
+
...(run.process ?? {}),
|
|
245
|
+
endedAt: nowIso(),
|
|
246
|
+
signal: "SIGTERM",
|
|
247
|
+
};
|
|
248
|
+
await saveRunRecord(run);
|
|
249
|
+
await emit(run, { ts: nowIso(), runId, type: "run.cancelled", message: "Run cancelled" });
|
|
250
|
+
console.log(`Stopped ${runId}`);
|
|
251
|
+
}
|
|
252
|
+
export async function mergeRun(runId, allowDirty = false) {
|
|
253
|
+
const repoRoot = findRepoRoot();
|
|
254
|
+
const run = await loadRunRecord(repoRoot, runId);
|
|
255
|
+
if (!run) {
|
|
256
|
+
throw new Error(`Run not found: ${runId}`);
|
|
257
|
+
}
|
|
258
|
+
const merged = await mergeRunIntoCurrentBranch(run, allowDirty);
|
|
259
|
+
await emit(merged, {
|
|
260
|
+
ts: nowIso(),
|
|
261
|
+
runId,
|
|
262
|
+
type: "merge.result",
|
|
263
|
+
message: merged.merge?.status === "merged"
|
|
264
|
+
? "Merged successfully"
|
|
265
|
+
: `Merge conflict: ${(merged.merge?.conflictedFiles ?? []).join(", ")}`,
|
|
266
|
+
data: (merged.merge ?? {}),
|
|
267
|
+
});
|
|
268
|
+
if (merged.merge?.status === "merged") {
|
|
269
|
+
console.log(`Merged ${runId}`);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
console.log(`Merge conflict for ${runId}`);
|
|
273
|
+
for (const file of merged.merge?.conflictedFiles ?? []) {
|
|
274
|
+
console.log(` ${file}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
export async function cleanupRuns(force = false) {
|
|
278
|
+
const repoRoot = findRepoRoot();
|
|
279
|
+
const runs = await listRuns(repoRoot);
|
|
280
|
+
for (const run of runs) {
|
|
281
|
+
if (!run.worktree.enabled) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (!force && run.status !== "merged") {
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
await removeWorktree(repoRoot, run.worktree.path, force).catch(() => undefined);
|
|
288
|
+
console.log(`Removed ${shortenHome(run.worktree.path)}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async function emit(run, event) {
|
|
292
|
+
await ensureDir(runDir(run.repoRoot, run.id));
|
|
293
|
+
await appendEvent(run.repoRoot, event);
|
|
294
|
+
}
|
|
295
|
+
async function waitForFile(file) {
|
|
296
|
+
for (let i = 0; i < 50; i += 1) {
|
|
297
|
+
if (await pathExists(file)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function printEvents(raw) {
|
|
304
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
305
|
+
if (!line.trim()) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
const event = JSON.parse(line);
|
|
310
|
+
if (event.type === "backend.output" || event.type === "backend.error") {
|
|
311
|
+
if (event.message) {
|
|
312
|
+
console.log(event.message);
|
|
313
|
+
}
|
|
314
|
+
else if (event.data) {
|
|
315
|
+
console.log(formatBackendData(event.data));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else if (event.message) {
|
|
319
|
+
console.log(`[rudder] ${event.message}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
console.log(line);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function formatBackendData(data) {
|
|
328
|
+
if (typeof data === "string") {
|
|
329
|
+
return data;
|
|
330
|
+
}
|
|
331
|
+
if (data && typeof data === "object") {
|
|
332
|
+
const record = data;
|
|
333
|
+
for (const key of ["message", "text", "content", "delta"]) {
|
|
334
|
+
if (typeof record[key] === "string") {
|
|
335
|
+
return record[key];
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (typeof record.type === "string") {
|
|
339
|
+
return `[${record.type}] ${JSON.stringify(record)}`;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return JSON.stringify(data);
|
|
343
|
+
}
|
|
344
|
+
async function followFile(file, startOffset, onChunk) {
|
|
345
|
+
let offset = startOffset;
|
|
346
|
+
while (true) {
|
|
347
|
+
const stat = await fsp.stat(file).catch(() => null);
|
|
348
|
+
if (stat && stat.size > offset) {
|
|
349
|
+
const handle = await fsp.open(file, "r");
|
|
350
|
+
try {
|
|
351
|
+
const length = stat.size - offset;
|
|
352
|
+
const buffer = Buffer.alloc(length);
|
|
353
|
+
await handle.read(buffer, 0, length, offset);
|
|
354
|
+
offset = stat.size;
|
|
355
|
+
await onChunk(buffer.toString("utf8"));
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
await handle.close();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
await new Promise((resolve) => setTimeout(resolve, 350));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=run-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-manager.js","sourceRoot":"","sources":["../src/run-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthProfileStore, RudderConfig, RunRecord, RudderEvent } from "./types.js";
|
|
2
|
+
export declare function globalConfigPath(): string;
|
|
3
|
+
export declare function authStorePath(): string;
|
|
4
|
+
export declare function projectStateDir(repoRoot: string): string;
|
|
5
|
+
export declare function runsDir(repoRoot: string): string;
|
|
6
|
+
export declare function runDir(repoRoot: string, runId: string): string;
|
|
7
|
+
export declare function runRecordPath(repoRoot: string, runId: string): string;
|
|
8
|
+
export declare function eventsPath(repoRoot: string, runId: string): string;
|
|
9
|
+
export declare function outputPath(repoRoot: string, runId: string): string;
|
|
10
|
+
export declare function specPath(repoRoot: string, runId: string): string;
|
|
11
|
+
export declare function verifierPath(repoRoot: string, runId: string): string;
|
|
12
|
+
export declare function worktreePath(repoRoot: string, runId: string): string;
|
|
13
|
+
export declare function loadConfig(): Promise<RudderConfig>;
|
|
14
|
+
export declare function defaultConfig(): RudderConfig;
|
|
15
|
+
export declare function saveConfig(config: RudderConfig): Promise<void>;
|
|
16
|
+
export declare function loadAuthStore(): Promise<AuthProfileStore>;
|
|
17
|
+
export declare function saveAuthStore(store: AuthProfileStore): Promise<void>;
|
|
18
|
+
export declare function createRunRecord(params: {
|
|
19
|
+
id?: string;
|
|
20
|
+
repoRoot: string;
|
|
21
|
+
task: string;
|
|
22
|
+
backend: RunRecord["backend"];
|
|
23
|
+
model?: string;
|
|
24
|
+
targetBranch: string;
|
|
25
|
+
baseCommit: string;
|
|
26
|
+
useWorktree: boolean;
|
|
27
|
+
worktreeBranch?: string;
|
|
28
|
+
worktreePath?: string;
|
|
29
|
+
}): Promise<RunRecord>;
|
|
30
|
+
export declare function saveRunRecord(record: RunRecord): Promise<void>;
|
|
31
|
+
export declare function loadRunRecord(repoRoot: string, runId: string): Promise<RunRecord | null>;
|
|
32
|
+
export declare function appendEvent(repoRoot: string, event: RudderEvent): Promise<void>;
|
|
33
|
+
export declare function listRuns(repoRoot: string): Promise<RunRecord[]>;
|
|
34
|
+
export declare function resolveRun(repoRoot: string, runId?: string): Promise<RunRecord | null>;
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fsp from "node:fs/promises";
|
|
3
|
+
import { ensureDir, newRunId, nowIso, readJson, rudderHome, shortHash, slugify, writeJson, } from "./util.js";
|
|
4
|
+
export function globalConfigPath() {
|
|
5
|
+
return path.join(rudderHome(), "config.json");
|
|
6
|
+
}
|
|
7
|
+
export function authStorePath() {
|
|
8
|
+
return path.join(rudderHome(), "auth-profiles.json");
|
|
9
|
+
}
|
|
10
|
+
export function projectStateDir(repoRoot) {
|
|
11
|
+
return path.join(repoRoot, ".rudder");
|
|
12
|
+
}
|
|
13
|
+
export function runsDir(repoRoot) {
|
|
14
|
+
return path.join(projectStateDir(repoRoot), "runs");
|
|
15
|
+
}
|
|
16
|
+
export function runDir(repoRoot, runId) {
|
|
17
|
+
return path.join(runsDir(repoRoot), runId);
|
|
18
|
+
}
|
|
19
|
+
export function runRecordPath(repoRoot, runId) {
|
|
20
|
+
return path.join(runDir(repoRoot, runId), "run.json");
|
|
21
|
+
}
|
|
22
|
+
export function eventsPath(repoRoot, runId) {
|
|
23
|
+
return path.join(runDir(repoRoot, runId), "events.ndjson");
|
|
24
|
+
}
|
|
25
|
+
export function outputPath(repoRoot, runId) {
|
|
26
|
+
return path.join(runDir(repoRoot, runId), "output.txt");
|
|
27
|
+
}
|
|
28
|
+
export function specPath(repoRoot, runId) {
|
|
29
|
+
return path.join(runDir(repoRoot, runId), "spec.json");
|
|
30
|
+
}
|
|
31
|
+
export function verifierPath(repoRoot, runId) {
|
|
32
|
+
return path.join(runDir(repoRoot, runId), "verifier.json");
|
|
33
|
+
}
|
|
34
|
+
export function worktreePath(repoRoot, runId) {
|
|
35
|
+
const parent = path.dirname(repoRoot);
|
|
36
|
+
const repoName = `${slugify(path.basename(repoRoot), "repo")}-${shortHash(repoRoot)}`;
|
|
37
|
+
return path.join(parent, ".rudder-worktrees", repoName, runId);
|
|
38
|
+
}
|
|
39
|
+
export async function loadConfig() {
|
|
40
|
+
const existing = await readJson(globalConfigPath());
|
|
41
|
+
if (existing?.version === 1) {
|
|
42
|
+
return existing;
|
|
43
|
+
}
|
|
44
|
+
return defaultConfig();
|
|
45
|
+
}
|
|
46
|
+
export function defaultConfig() {
|
|
47
|
+
return {
|
|
48
|
+
version: 1,
|
|
49
|
+
defaultBackend: "claude",
|
|
50
|
+
runPolicy: {
|
|
51
|
+
sameCheckout: "single-active",
|
|
52
|
+
concurrentPromptMode: "worktree",
|
|
53
|
+
mergeMode: "manual-on-conflict",
|
|
54
|
+
},
|
|
55
|
+
acpx: { install: "latest" },
|
|
56
|
+
backends: {
|
|
57
|
+
claude: { profileId: "anthropic:claude-code", model: "opus", effort: "xhigh" },
|
|
58
|
+
codex: {
|
|
59
|
+
profileId: "openai-codex:default",
|
|
60
|
+
model: "gpt-5.4-codex",
|
|
61
|
+
reasoningEffort: "xhigh",
|
|
62
|
+
},
|
|
63
|
+
acpx: { model: "gpt-5.4-codex", reasoningEffort: "xhigh" },
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export async function saveConfig(config) {
|
|
68
|
+
await writeJson(globalConfigPath(), config, { mode: 0o600 });
|
|
69
|
+
}
|
|
70
|
+
export async function loadAuthStore() {
|
|
71
|
+
const existing = await readJson(authStorePath());
|
|
72
|
+
if (existing?.version === 1 && existing.profiles && typeof existing.profiles === "object") {
|
|
73
|
+
return {
|
|
74
|
+
version: 1,
|
|
75
|
+
profiles: normalizeProfiles(existing.profiles),
|
|
76
|
+
order: existing.order,
|
|
77
|
+
lastGood: existing.lastGood,
|
|
78
|
+
usageStats: existing.usageStats,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return { version: 1, profiles: {} };
|
|
82
|
+
}
|
|
83
|
+
function normalizeProfiles(profiles) {
|
|
84
|
+
const normalized = {};
|
|
85
|
+
for (const [profileId, raw] of Object.entries(profiles)) {
|
|
86
|
+
if (!raw || typeof raw !== "object") {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const entry = { ...raw };
|
|
90
|
+
if (!entry.type && typeof entry.mode === "string") {
|
|
91
|
+
entry.type = entry.mode;
|
|
92
|
+
}
|
|
93
|
+
if (entry.type === "api_key" && typeof entry.provider === "string") {
|
|
94
|
+
normalized[profileId] = {
|
|
95
|
+
type: "api_key",
|
|
96
|
+
provider: entry.provider,
|
|
97
|
+
...(typeof entry.key === "string" ? { key: entry.key } : {}),
|
|
98
|
+
...(typeof entry.apiKey === "string" ? { key: entry.apiKey } : {}),
|
|
99
|
+
};
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (entry.type === "token" && typeof entry.provider === "string") {
|
|
103
|
+
normalized[profileId] = {
|
|
104
|
+
type: "token",
|
|
105
|
+
provider: entry.provider,
|
|
106
|
+
...(typeof entry.token === "string" ? { token: entry.token } : {}),
|
|
107
|
+
...(typeof entry.expires === "number" ? { expires: entry.expires } : {}),
|
|
108
|
+
};
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (entry.type === "oauth" &&
|
|
112
|
+
typeof entry.provider === "string" &&
|
|
113
|
+
typeof entry.access === "string" &&
|
|
114
|
+
typeof entry.refresh === "string" &&
|
|
115
|
+
typeof entry.expires === "number") {
|
|
116
|
+
normalized[profileId] = {
|
|
117
|
+
type: "oauth",
|
|
118
|
+
provider: entry.provider,
|
|
119
|
+
access: entry.access,
|
|
120
|
+
refresh: entry.refresh,
|
|
121
|
+
expires: entry.expires,
|
|
122
|
+
...(typeof entry.email === "string" ? { email: entry.email } : {}),
|
|
123
|
+
...(typeof entry.accountId === "string" ? { accountId: entry.accountId } : {}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return normalized;
|
|
128
|
+
}
|
|
129
|
+
export async function saveAuthStore(store) {
|
|
130
|
+
await writeJson(authStorePath(), store, { mode: 0o600 });
|
|
131
|
+
}
|
|
132
|
+
export async function createRunRecord(params) {
|
|
133
|
+
const id = params.id ?? newRunId(params.task);
|
|
134
|
+
const createdAt = nowIso();
|
|
135
|
+
const record = {
|
|
136
|
+
id,
|
|
137
|
+
status: "created",
|
|
138
|
+
task: params.task,
|
|
139
|
+
backend: params.backend,
|
|
140
|
+
model: params.model,
|
|
141
|
+
createdAt,
|
|
142
|
+
updatedAt: createdAt,
|
|
143
|
+
repoRoot: params.repoRoot,
|
|
144
|
+
targetBranch: params.targetBranch,
|
|
145
|
+
baseCommit: params.baseCommit,
|
|
146
|
+
worktree: {
|
|
147
|
+
enabled: params.useWorktree,
|
|
148
|
+
path: params.worktreePath ?? params.repoRoot,
|
|
149
|
+
branch: params.worktreeBranch,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
await ensureDir(runDir(params.repoRoot, id));
|
|
153
|
+
await saveRunRecord(record);
|
|
154
|
+
return record;
|
|
155
|
+
}
|
|
156
|
+
export async function saveRunRecord(record) {
|
|
157
|
+
record.updatedAt = nowIso();
|
|
158
|
+
await writeJson(runRecordPath(record.repoRoot, record.id), record);
|
|
159
|
+
}
|
|
160
|
+
export async function loadRunRecord(repoRoot, runId) {
|
|
161
|
+
return await readJson(runRecordPath(repoRoot, runId));
|
|
162
|
+
}
|
|
163
|
+
export async function appendEvent(repoRoot, event) {
|
|
164
|
+
await ensureDir(runDir(repoRoot, event.runId));
|
|
165
|
+
await fsp.appendFile(eventsPath(repoRoot, event.runId), `${JSON.stringify(event)}\n`, "utf8");
|
|
166
|
+
const text = event.message ??
|
|
167
|
+
(event.type === "backend.output" && typeof event.data === "string" ? event.data : undefined);
|
|
168
|
+
if (text) {
|
|
169
|
+
await fsp.appendFile(outputPath(repoRoot, event.runId), `${text}\n`, "utf8");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function listRuns(repoRoot) {
|
|
173
|
+
await ensureDir(runsDir(repoRoot));
|
|
174
|
+
const entries = await fsp.readdir(runsDir(repoRoot), { withFileTypes: true });
|
|
175
|
+
const runs = await Promise.all(entries
|
|
176
|
+
.filter((entry) => entry.isDirectory())
|
|
177
|
+
.map(async (entry) => await loadRunRecord(repoRoot, entry.name)));
|
|
178
|
+
return runs
|
|
179
|
+
.filter((run) => Boolean(run))
|
|
180
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
181
|
+
}
|
|
182
|
+
export async function resolveRun(repoRoot, runId) {
|
|
183
|
+
if (runId) {
|
|
184
|
+
return await loadRunRecord(repoRoot, runId);
|
|
185
|
+
}
|
|
186
|
+
const runs = await listRuns(repoRoot);
|
|
187
|
+
return runs[0] ?? null;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|