@viraatdas/rudder 1.0.74 → 1.1.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.
Files changed (59) hide show
  1. package/dist/auth.d.ts +2 -0
  2. package/dist/auth.js +22 -1
  3. package/dist/auth.js.map +1 -1
  4. package/dist/backends.js +88 -1
  5. package/dist/backends.js.map +1 -1
  6. package/dist/board/board.css +1 -0
  7. package/dist/board/board.js +2 -0
  8. package/dist/board/daemon.d.ts +21 -0
  9. package/dist/board/daemon.js +838 -0
  10. package/dist/board/daemon.js.map +1 -0
  11. package/dist/brain.d.ts +9 -0
  12. package/dist/brain.js +32 -5
  13. package/dist/brain.js.map +1 -1
  14. package/dist/bus.d.ts +9 -0
  15. package/dist/bus.js +23 -0
  16. package/dist/bus.js.map +1 -0
  17. package/dist/daemon.d.ts +21 -0
  18. package/dist/daemon.js +141 -0
  19. package/dist/daemon.js.map +1 -0
  20. package/dist/git.d.ts +5 -16
  21. package/dist/git.js +43 -50
  22. package/dist/git.js.map +1 -1
  23. package/dist/goal.d.ts +30 -0
  24. package/dist/goal.js +75 -0
  25. package/dist/goal.js.map +1 -0
  26. package/dist/graph.d.ts +56 -0
  27. package/dist/graph.js +213 -0
  28. package/dist/graph.js.map +1 -0
  29. package/dist/jj.d.ts +121 -0
  30. package/dist/jj.js +524 -0
  31. package/dist/jj.js.map +1 -0
  32. package/dist/main.js +171 -6
  33. package/dist/main.js.map +1 -1
  34. package/dist/native/rudder-native +0 -0
  35. package/dist/planner.d.ts +27 -0
  36. package/dist/planner.js +540 -0
  37. package/dist/planner.js.map +1 -0
  38. package/dist/run-manager.d.ts +7 -0
  39. package/dist/run-manager.js +98 -38
  40. package/dist/run-manager.js.map +1 -1
  41. package/dist/scheduler.d.ts +124 -0
  42. package/dist/scheduler.js +849 -0
  43. package/dist/scheduler.js.map +1 -0
  44. package/dist/state.d.ts +16 -1
  45. package/dist/state.js +101 -0
  46. package/dist/state.js.map +1 -1
  47. package/dist/surfaces.d.ts +23 -0
  48. package/dist/surfaces.js +196 -0
  49. package/dist/surfaces.js.map +1 -0
  50. package/dist/task-summary.d.ts +18 -0
  51. package/dist/task-summary.js +132 -0
  52. package/dist/task-summary.js.map +1 -1
  53. package/dist/types.d.ts +198 -1
  54. package/dist/types.js +1 -1
  55. package/dist/types.js.map +1 -1
  56. package/dist/util.js +1 -0
  57. package/dist/util.js.map +1 -1
  58. package/package.json +11 -2
  59. package/scripts/postinstall.mjs +68 -0
@@ -0,0 +1,540 @@
1
+ import { callTextModel } from "./task-summary.js";
2
+ import { loadInstructionFiles } from "./brain.js";
3
+ import { createEmptyChange, currentJjChangeId } from "./jj.js";
4
+ import { newEdgeId, newNodeId, updateGraph } from "./graph.js";
5
+ import { nowIso } from "./util.js";
6
+ import { DEFAULT_SUCCESS, deriveGoal, formatGoalPrompt } from "./goal.js";
7
+ export { loadInstructionFiles } from "./brain.js";
8
+ // A sonnet-class model: planning/decomposition is too hard for haiku, which is
9
+ // the task-summary model. Keep this a single constant so it is easy to bump.
10
+ export const PLANNER_MODEL = "claude-sonnet-4-6";
11
+ const PLAN_START = "RUDDER_PLAN_TASKS_START";
12
+ const PLAN_END = "RUDDER_PLAN_TASKS_END";
13
+ // The dependency rules quoted into the system prompts. The same wording is the
14
+ // contract the native tasks.rs parser enforces, so the model and both parsers
15
+ // agree on what hard vs soft means.
16
+ // The /goal convention quoted into the system prompts. Every spawnable task
17
+ // MUST carry a one-line objective (goal) and a verifiable stopping condition
18
+ // (success). Both Claude and Codex receive these as a leading `/goal` line plus
19
+ // a `Done when:` line, so the worker always knows what done means.
20
+ const GOAL_RULES = [
21
+ "Goal rules (REQUIRED for every task):",
22
+ "- `goal`: one line naming the single objective the worker should accomplish.",
23
+ "- `success`: the verifiable DONE-WHEN condition (the commands, artifacts, or criteria that mean it is complete).",
24
+ "- Always include both. Never omit them and never leave them empty.",
25
+ ].join("\n");
26
+ const DEP_RULES = [
27
+ "Dependency rules:",
28
+ "- A task with no id and no deps is a 0-dep root.",
29
+ "- hard = ordering: the child literally CANNOT begin until the parent has merged. Every hard edge MUST carry a non-empty `why` justifying the ordering; an unjustified hard edge is downgraded to soft.",
30
+ "- soft = context-sharing (the default): the child runs in parallel and is fed the parent's diff once the parent merges.",
31
+ "- Prefer the MINIMAL hard-edge set. Default to soft. Only make an edge hard when starting the child before the parent merges would be wrong.",
32
+ "- No cycles.",
33
+ ].join("\n");
34
+ export function parsePlanBlock(output) {
35
+ const json = extractPlanJson(output);
36
+ let value;
37
+ try {
38
+ value = JSON.parse(json);
39
+ }
40
+ catch {
41
+ throw new Error("RUDDER_PLAN_TASKS block was not valid JSON.");
42
+ }
43
+ const tasks = value?.tasks;
44
+ if (!Array.isArray(tasks)) {
45
+ throw new Error("RUDDER_PLAN_TASKS block must contain a tasks array.");
46
+ }
47
+ // First pass: build nodes, synthesizing ids n0.. for tasks without one.
48
+ const nodes = [];
49
+ const rawDepsById = new Map();
50
+ tasks.slice(0, 6).forEach((entry, index) => {
51
+ const raw = (entry ?? {});
52
+ const prompt = typeof raw.prompt === "string" ? raw.prompt.trim() : "";
53
+ if (!prompt) {
54
+ return;
55
+ }
56
+ const id = typeof raw.id === "string" && raw.id.trim() ? raw.id.trim() : `n${index}`;
57
+ const title = typeof raw.title === "string" && raw.title.trim() ? raw.title.trim() : "worker task";
58
+ // goal + success are part of the /goal convention: REQUIRED in the system
59
+ // prompt, but we stay backward-compatible by deriving sane defaults when the
60
+ // model omits them (goal = title/first line of the prompt; success = the
61
+ // canonical stopping condition).
62
+ const goal = typeof raw.goal === "string" && raw.goal.trim() ? raw.goal.trim() : deriveGoal(title || prompt);
63
+ const success = typeof raw.success === "string" && raw.success.trim() ? raw.success.trim() : DEFAULT_SUCCESS;
64
+ const node = {
65
+ id,
66
+ title,
67
+ prompt,
68
+ goal,
69
+ success,
70
+ deps: [],
71
+ ...(isBackend(raw.backend) ? { backend: raw.backend } : {}),
72
+ ...(typeof raw.model === "string" && raw.model.trim() ? { model: raw.model.trim() } : {}),
73
+ ...(isEffort(raw.effort) ? { effort: raw.effort } : {}),
74
+ ...(parseFileScope(raw.fileScope) ? { fileScope: parseFileScope(raw.fileScope) } : {}),
75
+ };
76
+ nodes.push(node);
77
+ rawDepsById.set(id, parseRawDeps(raw.deps));
78
+ });
79
+ const knownIds = new Set(nodes.map((node) => node.id));
80
+ // Second pass: resolve deps. Drop edges to unknown ids; downgrade hard edges
81
+ // with an empty `why` to soft (forces justification).
82
+ const edges = [];
83
+ for (const node of nodes) {
84
+ const resolved = [];
85
+ for (const dep of rawDepsById.get(node.id) ?? []) {
86
+ if (!knownIds.has(dep.on) || dep.on === node.id) {
87
+ continue; // dangling or self edge
88
+ }
89
+ const why = dep.why?.trim();
90
+ const type = dep.type === "hard" && why ? "hard" : "soft";
91
+ resolved.push({ on: dep.on, type, ...(why ? { why } : {}) });
92
+ edges.push({ from: dep.on, to: node.id, type, ...(why ? { why } : {}) });
93
+ }
94
+ node.deps = resolved;
95
+ }
96
+ if (hasCycle(nodes, edges)) {
97
+ throw new Error("RUDDER_PLAN_TASKS dependency graph has a cycle.");
98
+ }
99
+ return { nodes, edges };
100
+ }
101
+ function extractPlanJson(output) {
102
+ const clean = output.replace(/\r/g, "");
103
+ const start = clean.lastIndexOf(PLAN_START);
104
+ if (start < 0) {
105
+ throw new Error(`missing ${PLAN_START}`);
106
+ }
107
+ const afterStart = clean.slice(start + PLAN_START.length);
108
+ const end = afterStart.indexOf(PLAN_END);
109
+ if (end < 0) {
110
+ throw new Error(`missing ${PLAN_END}`);
111
+ }
112
+ let json = afterStart.slice(0, end).trim();
113
+ if (json.startsWith("```json")) {
114
+ json = json.slice("```json".length).trim();
115
+ }
116
+ else if (json.startsWith("```")) {
117
+ json = json.slice("```".length).trim();
118
+ }
119
+ if (json.endsWith("```")) {
120
+ json = json.slice(0, -3).trim();
121
+ }
122
+ return json;
123
+ }
124
+ function parseRawDeps(value) {
125
+ if (!Array.isArray(value)) {
126
+ return [];
127
+ }
128
+ const deps = [];
129
+ for (const entry of value) {
130
+ if (typeof entry === "string" && entry.trim()) {
131
+ // Bare id string -> soft edge by default.
132
+ deps.push({ on: entry.trim(), type: "soft" });
133
+ continue;
134
+ }
135
+ if (entry && typeof entry === "object") {
136
+ const dep = entry;
137
+ const on = typeof dep.on === "string" ? dep.on.trim() : "";
138
+ if (!on) {
139
+ continue;
140
+ }
141
+ const type = dep.type === "hard" ? "hard" : "soft";
142
+ const why = typeof dep.why === "string" ? dep.why.trim() : "";
143
+ deps.push({ on, type, ...(why ? { why } : {}) });
144
+ }
145
+ }
146
+ return deps;
147
+ }
148
+ function parseFileScope(value) {
149
+ if (!Array.isArray(value)) {
150
+ return undefined;
151
+ }
152
+ const scope = value.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
153
+ return scope.length ? scope : undefined;
154
+ }
155
+ function isBackend(value) {
156
+ return value === "claude" || value === "codex" || value === "acpx";
157
+ }
158
+ function isEffort(value) {
159
+ return value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max";
160
+ }
161
+ /**
162
+ * Kahn topo-sort over hard edges only. Soft edges share context in parallel and
163
+ * never deadlock, so a soft cycle is harmless; only hard cycles are rejected.
164
+ */
165
+ function hasCycle(nodes, edges) {
166
+ const ids = nodes.map((node) => node.id);
167
+ const indegree = new Map(ids.map((id) => [id, 0]));
168
+ const adjacency = new Map(ids.map((id) => [id, []]));
169
+ for (const edge of edges) {
170
+ if (edge.type !== "hard") {
171
+ continue;
172
+ }
173
+ if (!indegree.has(edge.to) || !adjacency.has(edge.from)) {
174
+ continue;
175
+ }
176
+ indegree.set(edge.to, (indegree.get(edge.to) ?? 0) + 1);
177
+ adjacency.get(edge.from)?.push(edge.to);
178
+ }
179
+ const queue = ids.filter((id) => (indegree.get(id) ?? 0) === 0);
180
+ let visited = 0;
181
+ while (queue.length) {
182
+ const id = queue.shift();
183
+ visited += 1;
184
+ for (const next of adjacency.get(id) ?? []) {
185
+ const degree = (indegree.get(next) ?? 0) - 1;
186
+ indegree.set(next, degree);
187
+ if (degree === 0) {
188
+ queue.push(next);
189
+ }
190
+ }
191
+ }
192
+ return visited !== ids.length;
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // Adaptive gating. Trivial tasks bypass the gate entirely (today's fast path);
196
+ // anything richer gates for human approval before scaffolding.
197
+ // ---------------------------------------------------------------------------
198
+ const MULTI_STEP_MARKER = /\b(\d\.|first|then|after that|finally)\b/i;
199
+ export function gateDecision(dag) {
200
+ if (dag.nodes.length !== 1) {
201
+ return { autoRun: false, reason: `plan has ${dag.nodes.length} nodes` };
202
+ }
203
+ if (dag.edges.length > 0) {
204
+ return { autoRun: false, reason: "plan has dependencies" };
205
+ }
206
+ const node = dag.nodes[0];
207
+ if (!node) {
208
+ return { autoRun: false, reason: "plan has no nodes" };
209
+ }
210
+ const estTokens = Math.ceil(node.prompt.length / 4);
211
+ if (estTokens >= 1500) {
212
+ return { autoRun: false, reason: `prompt is large (~${estTokens} tokens)` };
213
+ }
214
+ if ((node.fileScope?.length ?? 0) > 3) {
215
+ return { autoRun: false, reason: `file scope spans ${node.fileScope?.length} paths` };
216
+ }
217
+ if (MULTI_STEP_MARKER.test(node.prompt)) {
218
+ return { autoRun: false, reason: "prompt has multi-step markers" };
219
+ }
220
+ return { autoRun: true, reason: "single trivial task" };
221
+ }
222
+ function planSystemPrompt() {
223
+ return [
224
+ "You are Rudder's planning coordinator. Decompose a coding request into the smallest set of",
225
+ "independent implementation tasks that separate worker agents can run in isolated jj workspaces.",
226
+ "",
227
+ DEP_RULES,
228
+ "",
229
+ GOAL_RULES,
230
+ "",
231
+ "Output rules:",
232
+ "- Print exactly one block and no other JSON block:",
233
+ `${PLAN_START}`,
234
+ '{"tasks":[{"id":"n0","title":"short title","prompt":"full implementation prompt for one worker","goal":"one-line objective","success":"verifiable done-when condition","deps":[{"on":"n0","type":"hard","why":"why ordering is required"}],"backend":"claude","model":"...","effort":"medium","fileScope":["src/..."]}]}',
235
+ `${PLAN_END}`,
236
+ "- Use 1-4 tasks; more only when the split is clearly independent.",
237
+ "- Keep the hard-edge set minimal and justify every hard edge in its `why`.",
238
+ "- After the block, add a short human summary of why this split is safe.",
239
+ ].join("\n");
240
+ }
241
+ export async function planTask(task, ctx) {
242
+ const instructions = await loadInstructionFiles(ctx.root).catch(() => []);
243
+ const instructionText = instructions.length
244
+ ? `\n\nRepository instructions:\n${instructions.map((file) => `### ${file.path}\n${file.content}`).join("\n\n")}`
245
+ : "";
246
+ const user = [
247
+ `Repository root: ${ctx.root}`,
248
+ `Branch: ${ctx.branch}`,
249
+ "",
250
+ `User request:\n${task}`,
251
+ instructionText,
252
+ ].join("\n");
253
+ const output = await callTextModel({
254
+ model: PLANNER_MODEL,
255
+ system: planSystemPrompt(),
256
+ user,
257
+ maxTokens: 4096,
258
+ });
259
+ return parsePlanBlock(output);
260
+ }
261
+ function reconcileSystemPrompt() {
262
+ return [
263
+ "You are Rudder's injection coordinator. A new task is being added to a project that already has",
264
+ "in-flight work (the frontier). Decide how the new task depends on each frontier node.",
265
+ "",
266
+ DEP_RULES,
267
+ "",
268
+ GOAL_RULES,
269
+ "",
270
+ "Output rules:",
271
+ "- Print exactly one block and no other JSON block. The block holds a single task whose `deps`",
272
+ " reference the frontier node ids you were given:",
273
+ `${PLAN_START}`,
274
+ '{"tasks":[{"id":"new","title":"short title","prompt":"full implementation prompt","goal":"one-line objective","success":"verifiable done-when condition","deps":[{"on":"<frontier id>","type":"soft","why":"..."}]}]}',
275
+ `${PLAN_END}`,
276
+ "- Default every edge to soft. Only make an edge hard when the new task literally cannot start",
277
+ " until that frontier node merges, and justify it in `why`.",
278
+ ].join("\n");
279
+ }
280
+ /**
281
+ * Infer the new node's deps against the current frontier. On any LLM failure
282
+ * (timeout / no model / unparsable), fall back to a SOFT edge to every frontier
283
+ * node: this over-delivers context and never deadlocks. Never a default hard
284
+ * edge.
285
+ */
286
+ export async function reconcile(task, frontierNodes, ctx) {
287
+ const fallback = () => {
288
+ const node = {
289
+ id: "new",
290
+ title: task.slice(0, 72),
291
+ prompt: task,
292
+ goal: deriveGoal(task),
293
+ success: DEFAULT_SUCCESS,
294
+ deps: frontierNodes.map((frontierNode) => ({ on: frontierNode.id, type: "soft" })),
295
+ };
296
+ return {
297
+ node,
298
+ inferredDeps: frontierNodes.map((frontierNode) => ({ node: frontierNode.id, type: "soft" })),
299
+ };
300
+ };
301
+ if (frontierNodes.length === 0) {
302
+ return {
303
+ node: { id: "new", title: task.slice(0, 72), prompt: task, goal: deriveGoal(task), success: DEFAULT_SUCCESS, deps: [] },
304
+ inferredDeps: [],
305
+ };
306
+ }
307
+ const user = [
308
+ `Repository root: ${ctx.root}`,
309
+ `Branch: ${ctx.branch}`,
310
+ "",
311
+ "Frontier nodes (in-flight, not yet merged):",
312
+ ...frontierNodes.map((node) => `- ${node.id}: ${node.title}`),
313
+ "",
314
+ `New task to reconcile:\n${task}`,
315
+ ].join("\n");
316
+ let output;
317
+ try {
318
+ output = await callTextModel({
319
+ model: PLANNER_MODEL,
320
+ system: reconcileSystemPrompt(),
321
+ user,
322
+ maxTokens: 1024,
323
+ timeoutMs: 30000,
324
+ });
325
+ }
326
+ catch {
327
+ return fallback();
328
+ }
329
+ let dag;
330
+ try {
331
+ dag = parsePlanBlock(output);
332
+ }
333
+ catch {
334
+ return fallback();
335
+ }
336
+ const node = dag.nodes[0];
337
+ if (!node) {
338
+ return fallback();
339
+ }
340
+ const frontierIds = new Set(frontierNodes.map((frontierNode) => frontierNode.id));
341
+ // Injection reconciliation only ever produces hard/soft edges; the planner
342
+ // parser never emits judge edges, so coerce any stray non-hard to soft.
343
+ const inferredDeps = node.deps
344
+ .filter((dep) => frontierIds.has(dep.on))
345
+ .map((dep) => ({ node: dep.on, type: dep.type === "hard" ? "hard" : "soft" }));
346
+ return { node, inferredDeps };
347
+ }
348
+ // ---------------------------------------------------------------------------
349
+ // Fan-out-and-judge: N independent variant agents attempt the same task, then a
350
+ // single judge agent compares their diffs and produces the winning
351
+ // implementation. Modeled as a DAG: N variant roots + 1 judge node with a
352
+ // "judge" edge from each variant. The judge becomes ready (isReady) when every
353
+ // variant has reached review; each variant's diff is delivered to the judge on
354
+ // review (treated like a soft edge, but gated on review not merge).
355
+ // ---------------------------------------------------------------------------
356
+ // Short angle hints cycled across variants so the attempts genuinely differ
357
+ // instead of being N identical runs of the same prompt.
358
+ const FANOUT_ANGLES = ["simplicity", "robustness", "minimal-diff", "speed", "clarity"];
359
+ export function buildFanoutDag(task, n, opts = {}) {
360
+ const count = Math.max(2, Math.min(6, Math.floor(Number.isFinite(n) ? n : 3)));
361
+ const trimmed = task.trim();
362
+ const shortTitle = trimmed.slice(0, 56) || "task";
363
+ const nodes = [];
364
+ const variantIds = [];
365
+ for (let index = 0; index < count; index += 1) {
366
+ const angle = FANOUT_ANGLES[index % FANOUT_ANGLES.length] ?? "simplicity";
367
+ const id = `v${index}`;
368
+ variantIds.push(id);
369
+ // Each variant: objective = the task with its angle; success = its approach
370
+ // is implemented and its own verification passes. The /goal-format header is
371
+ // applied at scaffold time (scaffoldPlan), so the body stays raw here.
372
+ nodes.push({
373
+ id,
374
+ title: `variant ${index + 1}/${count}: ${shortTitle}`,
375
+ goal: `${trimmed} (favoring ${angle})`,
376
+ success: "your approach is implemented and its own verification passes",
377
+ prompt: [
378
+ trimmed,
379
+ "",
380
+ `Approach variant ${index + 1} of ${count}: favor ${angle}. Implement the task end to end in your workspace; another agent will compare your result against the other variants.`,
381
+ ].join("\n"),
382
+ deps: [],
383
+ ...(opts.backend ? { backend: opts.backend } : {}),
384
+ ...(opts.model ? { model: opts.model } : {}),
385
+ ...(opts.effort ? { effort: opts.effort } : {}),
386
+ });
387
+ }
388
+ // Judge: objective = pick/synthesize the best; success = the final
389
+ // implementation is complete and verified. The /goal-format header is applied
390
+ // at scaffold time (scaffoldPlan).
391
+ const judgePrompt = [
392
+ `${count} independent agents each attempted this task: ${trimmed}`,
393
+ "Their diffs will be provided as context below.",
394
+ "Compare them, choose the best approach (you may combine the strongest parts of several),",
395
+ "and produce the final, complete implementation in your workspace.",
396
+ "Note which variant you based it on.",
397
+ ].join(" ");
398
+ const judge = {
399
+ id: "judge",
400
+ title: `judge: ${shortTitle}`,
401
+ goal: `pick or synthesize the best implementation for: ${trimmed}`,
402
+ success: "the final implementation is complete and verified",
403
+ prompt: judgePrompt,
404
+ deps: variantIds.map((variantId) => ({ on: variantId, type: "judge" })),
405
+ ...(opts.backend ? { backend: opts.backend } : {}),
406
+ ...(opts.model ? { model: opts.model } : {}),
407
+ ...(opts.effort ? { effort: opts.effort } : {}),
408
+ };
409
+ nodes.push(judge);
410
+ const edges = variantIds.map((variantId) => ({
411
+ from: variantId,
412
+ to: "judge",
413
+ type: "judge",
414
+ }));
415
+ return { nodes, edges };
416
+ }
417
+ // ---------------------------------------------------------------------------
418
+ // Scaffold: turn a PlanDag into real graph.json nodes + edges, each backed by
419
+ // an empty jj change parented on its hard+soft deps' changes (plan section 3a).
420
+ // Dependents exist as real merge changes before parents do work.
421
+ // ---------------------------------------------------------------------------
422
+ export async function scaffoldPlan(repoRoot, dag) {
423
+ const order = topoOrderHard(dag);
424
+ const trunk = (await currentJjChangeId(repoRoot)) || "@";
425
+ // Map plan id -> created jj change id, filled as we walk in topo order so a
426
+ // child can parent on its already-created parents.
427
+ const changeByPlanId = new Map();
428
+ // Map plan id -> the final graph node id (content-hashed, mergeable).
429
+ const nodeIdByPlanId = new Map();
430
+ for (const node of order) {
431
+ // hard+soft deps contribute jj-change parentage (the change stacks on them).
432
+ // judge deps do NOT: a judge node produces its own implementation off the
433
+ // trunk and the variants it compares are never merged.
434
+ const parentChangeIds = node.deps
435
+ .filter((dep) => dep.type !== "judge")
436
+ .map((dep) => changeByPlanId.get(dep.on))
437
+ .filter((value) => Boolean(value));
438
+ const parents = parentChangeIds.length ? parentChangeIds : [trunk];
439
+ const nodeId = newNodeId(node.title);
440
+ const changeId = await createEmptyChange({
441
+ repoRoot,
442
+ parents,
443
+ description: `rudder-node:${nodeId} ${node.title}`,
444
+ });
445
+ changeByPlanId.set(node.id, changeId);
446
+ nodeIdByPlanId.set(node.id, nodeId);
447
+ }
448
+ const createdAt = nowIso();
449
+ await updateGraph(repoRoot, (graph) => {
450
+ for (const node of dag.nodes) {
451
+ const nodeId = nodeIdByPlanId.get(node.id);
452
+ const changeId = changeByPlanId.get(node.id);
453
+ if (!nodeId) {
454
+ continue;
455
+ }
456
+ const incomingEdgeIds = [];
457
+ for (const dep of node.deps) {
458
+ const fromId = nodeIdByPlanId.get(dep.on);
459
+ if (!fromId) {
460
+ continue;
461
+ }
462
+ const edgeId = newEdgeId(fromId, nodeId);
463
+ incomingEdgeIds.push(edgeId);
464
+ graph.edges[edgeId] = {
465
+ id: edgeId,
466
+ from: fromId,
467
+ to: nodeId,
468
+ type: dep.type,
469
+ ...(dep.why ? { why: dep.why } : {}),
470
+ };
471
+ }
472
+ const goal = node.goal ?? deriveGoal(node.title || node.prompt);
473
+ const success = node.success ?? DEFAULT_SUCCESS;
474
+ graph.nodes[nodeId] = {
475
+ id: nodeId,
476
+ title: node.title,
477
+ // Persist the launch prompt already in /goal format so every planner-
478
+ // produced worker leads with its objective + verifiable done-when line.
479
+ prompt: formatGoalPrompt({ goal, success, body: node.prompt }),
480
+ goal,
481
+ success,
482
+ backend: node.backend ?? "claude",
483
+ ...(node.model ? { model: node.model } : {}),
484
+ ...(node.effort ? { effort: node.effort } : {}),
485
+ status: "planned",
486
+ ...(changeId ? { jjChangeId: changeId } : {}),
487
+ deps: incomingEdgeIds,
488
+ source: "planner",
489
+ createdAt,
490
+ updatedAt: createdAt,
491
+ };
492
+ }
493
+ return graph;
494
+ });
495
+ }
496
+ /**
497
+ * Topological order over HARD edges (the ones that gate scaffolding parentage).
498
+ * parsePlanBlock already rejected hard cycles, so Kahn's algorithm completes;
499
+ * any node left over (only possible via a soft-only cycle) is appended.
500
+ */
501
+ function topoOrderHard(dag) {
502
+ const byId = new Map(dag.nodes.map((node) => [node.id, node]));
503
+ const indegree = new Map(dag.nodes.map((node) => [node.id, 0]));
504
+ const adjacency = new Map(dag.nodes.map((node) => [node.id, []]));
505
+ for (const edge of dag.edges) {
506
+ if (edge.type !== "hard" || !indegree.has(edge.to) || !adjacency.has(edge.from)) {
507
+ continue;
508
+ }
509
+ indegree.set(edge.to, (indegree.get(edge.to) ?? 0) + 1);
510
+ adjacency.get(edge.from)?.push(edge.to);
511
+ }
512
+ const queue = dag.nodes.filter((node) => (indegree.get(node.id) ?? 0) === 0).map((node) => node.id);
513
+ const ordered = [];
514
+ const seen = new Set();
515
+ while (queue.length) {
516
+ const id = queue.shift();
517
+ if (seen.has(id)) {
518
+ continue;
519
+ }
520
+ seen.add(id);
521
+ const node = byId.get(id);
522
+ if (node) {
523
+ ordered.push(node);
524
+ }
525
+ for (const next of adjacency.get(id) ?? []) {
526
+ const degree = (indegree.get(next) ?? 0) - 1;
527
+ indegree.set(next, degree);
528
+ if (degree === 0) {
529
+ queue.push(next);
530
+ }
531
+ }
532
+ }
533
+ for (const node of dag.nodes) {
534
+ if (!seen.has(node.id)) {
535
+ ordered.push(node);
536
+ }
537
+ }
538
+ return ordered;
539
+ }
540
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,13 @@ export declare function continueRun(params: {
40
40
  interrupt?: boolean;
41
41
  silent?: boolean;
42
42
  }): Promise<RunRecord>;
43
+ /**
44
+ * The detached `rudder __worker` spawn primitive. Both startRun/continueRun and
45
+ * the scheduler launch workers through this one path so the spawn shape (flags,
46
+ * detached, stdio:"ignore", unref) is defined in exactly one place. Returns the
47
+ * spawned worker pid (or undefined if the platform did not assign one).
48
+ */
49
+ export declare function spawnWorker(repoRoot: string, runId: string): number | undefined;
43
50
  export declare function workerRun(repoRoot: string, runId: string): Promise<void>;
44
51
  export declare function writeAgentContext(repoRoot: string): Promise<void>;
45
52
  export declare function statusRuns(options?: {