zelari-code 1.27.1 → 1.28.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/dist/cli/kraken/executor.js +128 -20
- package/dist/cli/kraken/executor.js.map +1 -1
- package/dist/cli/kraken/graphMemory.js +111 -0
- package/dist/cli/kraken/graphMemory.js.map +1 -0
- package/dist/cli/kraken/planner.js +160 -21
- package/dist/cli/kraken/planner.js.map +1 -1
- package/dist/cli/main.bundled.js +537 -246
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/runHeadless.js +15 -1
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/slashHandlers/krakenGraph.js +12 -1
- package/dist/cli/slashHandlers/krakenGraph.js.map +1 -1
- package/dist/cli/tools/taskTool.js +47 -2
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/package.json +2 -2
|
@@ -39,6 +39,7 @@ import { runBacktest } from '../workspace/worldModel.js';
|
|
|
39
39
|
import { startKrakenGraphLive, updateKrakenGraphLive, endKrakenGraphLive, } from './graphStatus.js';
|
|
40
40
|
import { existsSync } from 'node:fs';
|
|
41
41
|
import path from 'node:path';
|
|
42
|
+
import { saveGraphSnapshot, toGraphSnapshot } from './graphMemory.js';
|
|
42
43
|
/** Default cap on concurrently-running tentacles across the whole graph. */
|
|
43
44
|
export const DEFAULT_MAX_PARALLEL = 12;
|
|
44
45
|
/** Default number of `fix` nodes the executor may spawn across one graph run. */
|
|
@@ -68,13 +69,56 @@ export function resolveFixBudget(env = process.env) {
|
|
|
68
69
|
* "running" state stuck permanently. Matches the task tool's own budget.
|
|
69
70
|
*/
|
|
70
71
|
export const DEFAULT_NODE_TIMEOUT_MS = 300_000;
|
|
71
|
-
/**
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Writers get a much larger budget than readers. A `general` (or `fix`) node
|
|
74
|
+
* is a bounded but real coding task — scaffolding a project, adding a
|
|
75
|
+
* subsystem across several files — and 5 minutes is simply not enough for
|
|
76
|
+
* one, especially on a slow reasoning model. `explore` and `verify` nodes are
|
|
77
|
+
* read-only and quick, so they keep the tighter bound.
|
|
78
|
+
*
|
|
79
|
+
* Observed failure that prompted the split: a graph whose two largest general
|
|
80
|
+
* nodes ("project scaffold + ocean integration + shared core", "three ship
|
|
81
|
+
* classes + selection screen + sailing controller") both died on
|
|
82
|
+
* `tentacle timed out after 300000ms`, taking their fix nodes and four
|
|
83
|
+
* cascade-skipped dependents with them.
|
|
84
|
+
*/
|
|
85
|
+
export const DEFAULT_WRITER_NODE_TIMEOUT_MS = 900_000;
|
|
86
|
+
/**
|
|
87
|
+
* How long to wait for a cancelled tentacle to actually unwind before
|
|
88
|
+
* declaring it unstoppable. Cancellation lands at the sub-agent's next event
|
|
89
|
+
* boundary, so this only needs to cover one in-flight provider chunk or tool
|
|
90
|
+
* call, not a whole turn.
|
|
91
|
+
*/
|
|
92
|
+
export const DEFAULT_CANCEL_GRACE_MS = 30_000;
|
|
93
|
+
export function resolveCancelGraceMs(env = process.env) {
|
|
94
|
+
const raw = env.ZELARI_KRAKEN_CANCEL_GRACE_MS;
|
|
74
95
|
if (raw === undefined || raw === '')
|
|
75
|
-
return
|
|
96
|
+
return DEFAULT_CANCEL_GRACE_MS;
|
|
76
97
|
const n = Number.parseInt(raw, 10);
|
|
77
|
-
return Number.isFinite(n) && n >= 0 ? n :
|
|
98
|
+
return Number.isFinite(n) && n >= 0 ? n : DEFAULT_CANCEL_GRACE_MS;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Wall-clock bound for one tentacle. `ZELARI_KRAKEN_NODE_TIMEOUT_MS` overrides
|
|
102
|
+
* every kind (single knob, unchanged semantics: `0` disables);
|
|
103
|
+
* `ZELARI_KRAKEN_WRITER_NODE_TIMEOUT_MS` overrides just the writer budget.
|
|
104
|
+
*/
|
|
105
|
+
export function resolveNodeTimeoutMs(env = process.env, agent) {
|
|
106
|
+
const raw = env.ZELARI_KRAKEN_NODE_TIMEOUT_MS;
|
|
107
|
+
if (raw !== undefined && raw !== '') {
|
|
108
|
+
const n = Number.parseInt(raw, 10);
|
|
109
|
+
if (Number.isFinite(n) && n >= 0)
|
|
110
|
+
return n;
|
|
111
|
+
}
|
|
112
|
+
if (agent === 'general') {
|
|
113
|
+
const rawWriter = env.ZELARI_KRAKEN_WRITER_NODE_TIMEOUT_MS;
|
|
114
|
+
if (rawWriter !== undefined && rawWriter !== '') {
|
|
115
|
+
const n = Number.parseInt(rawWriter, 10);
|
|
116
|
+
if (Number.isFinite(n) && n >= 0)
|
|
117
|
+
return n;
|
|
118
|
+
}
|
|
119
|
+
return DEFAULT_WRITER_NODE_TIMEOUT_MS;
|
|
120
|
+
}
|
|
121
|
+
return DEFAULT_NODE_TIMEOUT_MS;
|
|
78
122
|
}
|
|
79
123
|
/**
|
|
80
124
|
* F6 kill-switch: the `/kraken graph` slash command and `--kraken-graph`
|
|
@@ -103,8 +147,11 @@ export class KrakenGraphExecutor {
|
|
|
103
147
|
deps;
|
|
104
148
|
parentCwd;
|
|
105
149
|
sessionId;
|
|
150
|
+
goal;
|
|
106
151
|
maxParallel;
|
|
152
|
+
/** Explicit all-kinds override; when undefined the budget is per-kind. */
|
|
107
153
|
nodeTimeoutMs;
|
|
154
|
+
cancelGraceMs;
|
|
108
155
|
fixBudgetRemaining;
|
|
109
156
|
worldModelGateOverride;
|
|
110
157
|
runTentacleFn;
|
|
@@ -116,8 +163,10 @@ export class KrakenGraphExecutor {
|
|
|
116
163
|
this.deps = opts.taskToolDeps;
|
|
117
164
|
this.parentCwd = opts.parentCwd;
|
|
118
165
|
this.sessionId = opts.sessionId;
|
|
166
|
+
this.goal = opts.goal;
|
|
119
167
|
this.maxParallel = opts.maxParallel ?? resolveMaxParallel();
|
|
120
|
-
this.nodeTimeoutMs = opts.nodeTimeoutMs
|
|
168
|
+
this.nodeTimeoutMs = opts.nodeTimeoutMs;
|
|
169
|
+
this.cancelGraceMs = opts.cancelGraceMs;
|
|
121
170
|
this.fixBudgetRemaining = opts.fixBudget ?? resolveFixBudget();
|
|
122
171
|
this.worldModelGateOverride = opts.worldModelGate;
|
|
123
172
|
this.runTentacleFn = opts.runTentacleFn ?? runTentacle;
|
|
@@ -185,6 +234,9 @@ export class KrakenGraphExecutor {
|
|
|
185
234
|
});
|
|
186
235
|
}
|
|
187
236
|
endKrakenGraphLive(graph, converged);
|
|
237
|
+
// Cross-run memory: let the next planning pass see where this one stopped
|
|
238
|
+
// instead of replanning the whole goal blind.
|
|
239
|
+
await saveGraphSnapshot(this.parentCwd, toGraphSnapshot(graph, { goal: this.goal ?? graph.id, converged }));
|
|
188
240
|
return {
|
|
189
241
|
graph,
|
|
190
242
|
converged,
|
|
@@ -201,6 +253,7 @@ export class KrakenGraphExecutor {
|
|
|
201
253
|
}
|
|
202
254
|
const usesWorktree = node.kind === 'general' || node.kind === 'fix';
|
|
203
255
|
const agent = node.kind === 'fix' ? 'general' : node.kind;
|
|
256
|
+
const controller = new AbortController();
|
|
204
257
|
const res = await this.withNodeTimeout(this.runTentacleFn({
|
|
205
258
|
deps: this.deps,
|
|
206
259
|
args: {
|
|
@@ -218,34 +271,75 @@ export class KrakenGraphExecutor {
|
|
|
218
271
|
deferMerge: usesWorktree,
|
|
219
272
|
graphId: graph.id,
|
|
220
273
|
nodeId: node.id,
|
|
221
|
-
|
|
274
|
+
signal: controller.signal,
|
|
275
|
+
}), agent, controller);
|
|
222
276
|
if (res.ok && usesWorktree) {
|
|
223
277
|
this.nodeRunState.set(node.id, { worktreeHandle: res.worktreeHandle });
|
|
224
278
|
}
|
|
225
279
|
return res;
|
|
226
280
|
}
|
|
227
281
|
/**
|
|
228
|
-
* Bound a tentacle run to
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
282
|
+
* Bound a tentacle run to its wall-clock budget (explicit `nodeTimeoutMs`
|
|
283
|
+
* option, else per-kind — writers get more than readers). On timeout the
|
|
284
|
+
* run is CANCELLED via its AbortSignal, then given `cancelGraceMs` to
|
|
285
|
+
* unwind. Cancellation lands at the sub-agent's next event boundary (an
|
|
286
|
+
* async generator only observes `.return()` when it next yields), so a run
|
|
287
|
+
* blocked on a slow provider call can outlive the grace period — that case
|
|
288
|
+
* resolves with `cancelled: false` and `applyResult` refuses to re-spawn
|
|
289
|
+
* the node, since a tentacle that may still be writing must not be joined
|
|
290
|
+
* by a second one on the same scope.
|
|
291
|
+
*
|
|
292
|
+
* Either way `execute()` always settles, so the caller's process can exit
|
|
293
|
+
* instead of hanging forever on one stuck node.
|
|
234
294
|
*/
|
|
235
|
-
withNodeTimeout(promise, agent) {
|
|
236
|
-
|
|
295
|
+
async withNodeTimeout(promise, agent, controller) {
|
|
296
|
+
const ms = this.nodeTimeoutMs ?? resolveNodeTimeoutMs(process.env, agent);
|
|
297
|
+
if (ms <= 0)
|
|
237
298
|
return promise;
|
|
238
|
-
const ms = this.nodeTimeoutMs;
|
|
239
299
|
let timer;
|
|
300
|
+
const TIMED_OUT = Symbol('timeout');
|
|
240
301
|
const timeout = new Promise((resolve) => {
|
|
241
|
-
timer = setTimeout(() =>
|
|
242
|
-
resolve({ ok: false, agent, error: `tentacle timed out after ${ms}ms` });
|
|
243
|
-
}, ms);
|
|
302
|
+
timer = setTimeout(() => resolve(TIMED_OUT), ms);
|
|
244
303
|
});
|
|
245
|
-
|
|
304
|
+
const raced = await Promise.race([promise, timeout]).finally(() => {
|
|
246
305
|
if (timer)
|
|
247
306
|
clearTimeout(timer);
|
|
248
307
|
});
|
|
308
|
+
if (raced !== TIMED_OUT)
|
|
309
|
+
return raced;
|
|
310
|
+
// Budget blown. Tell the tentacle to stop, then give it a bounded grace
|
|
311
|
+
// period to actually unwind — a run that has already been told to stop is
|
|
312
|
+
// safe to re-run, one that is still going is not (two agents writing the
|
|
313
|
+
// same scope is exactly the corruption this guards against).
|
|
314
|
+
controller?.abort();
|
|
315
|
+
const graceMs = this.cancelGraceMs ?? resolveCancelGraceMs();
|
|
316
|
+
let graceTimer;
|
|
317
|
+
const grace = new Promise((resolve) => {
|
|
318
|
+
graceTimer = setTimeout(() => resolve(TIMED_OUT), graceMs);
|
|
319
|
+
});
|
|
320
|
+
const settled = await Promise.race([promise, grace]).finally(() => {
|
|
321
|
+
if (graceTimer)
|
|
322
|
+
clearTimeout(graceTimer);
|
|
323
|
+
});
|
|
324
|
+
if (settled !== TIMED_OUT) {
|
|
325
|
+
// The run is over, so the scope is free and a retry/fix would be safe.
|
|
326
|
+
// If it actually SUCCEEDED — finishing in the window between the
|
|
327
|
+
// deadline and the abort landing — keep that result rather than
|
|
328
|
+
// discarding completed (and already written) work over a few ms.
|
|
329
|
+
if (settled.ok)
|
|
330
|
+
return settled;
|
|
331
|
+
return { ...settled, cancelled: true };
|
|
332
|
+
}
|
|
333
|
+
// Did not stop in time. Report it as uncancelled so `applyResult` refuses
|
|
334
|
+
// to re-spawn this node — better one failed node than two concurrent
|
|
335
|
+
// writers on one directory.
|
|
336
|
+
return {
|
|
337
|
+
ok: false,
|
|
338
|
+
agent,
|
|
339
|
+
error: `tentacle timed out after ${ms}ms and did not stop within ${graceMs}ms of being cancelled; ` +
|
|
340
|
+
`not retrying to avoid two tentacles writing the same scope`,
|
|
341
|
+
cancelled: false,
|
|
342
|
+
};
|
|
249
343
|
}
|
|
250
344
|
/**
|
|
251
345
|
* Sequentially merge every dep node's deferred worktree (in dep order) into
|
|
@@ -312,6 +406,20 @@ export class KrakenGraphExecutor {
|
|
|
312
406
|
return;
|
|
313
407
|
}
|
|
314
408
|
node.error = res.error;
|
|
409
|
+
// A run we could not confirm has stopped may still be writing this node's
|
|
410
|
+
// scope. Re-spawning would put two tentacles in the same directory — the
|
|
411
|
+
// failure mode that produced duplicate parallel implementations of the
|
|
412
|
+
// same modules. Fail terminally instead; dependents cascade-skip.
|
|
413
|
+
if (res.cancelled === false) {
|
|
414
|
+
node.status = 'error';
|
|
415
|
+
this.radio('node_end', {
|
|
416
|
+
description: node.label,
|
|
417
|
+
agent: node.kind,
|
|
418
|
+
detail: res.error,
|
|
419
|
+
ok: false,
|
|
420
|
+
});
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
315
423
|
if (node.retryCount < node.maxRetries) {
|
|
316
424
|
node.retryCount += 1;
|
|
317
425
|
node.status = 'pending';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/cli/kraken/executor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/cli/kraken/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kraken graph engine — cross-run memory.
|
|
3
|
+
*
|
|
4
|
+
* The planner is a one-shot completion: it sees the goal text and nothing
|
|
5
|
+
* else. So a follow-up like "continua" after a partially failed graph was
|
|
6
|
+
* planned from scratch, with no knowledge of what had already been built or
|
|
7
|
+
* what had failed — the model's best available move was to re-explore, which
|
|
8
|
+
* produced a single read-only node that converged having changed nothing.
|
|
9
|
+
*
|
|
10
|
+
* This module persists a compact snapshot of the last graph next to the other
|
|
11
|
+
* Kraken state (`.zelari/kraken/last-graph.json`) so the planner can be told
|
|
12
|
+
* where the previous attempt stopped.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately small: node ids, kinds, labels, scopes and terminal statuses.
|
|
15
|
+
* Not prompts or results — those are large, and the sub-agent that picks the
|
|
16
|
+
* work up reads the actual repository anyway.
|
|
17
|
+
*/
|
|
18
|
+
import { promises as fs } from 'node:fs';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
const SNAPSHOT_DIR = path.join('.zelari', 'kraken');
|
|
21
|
+
const SNAPSHOT_FILE = 'last-graph.json';
|
|
22
|
+
function snapshotPath(cwd) {
|
|
23
|
+
return path.join(cwd, SNAPSHOT_DIR, SNAPSHOT_FILE);
|
|
24
|
+
}
|
|
25
|
+
/** Reduce a live graph to the snapshot shape. */
|
|
26
|
+
export function toGraphSnapshot(graph, opts) {
|
|
27
|
+
return {
|
|
28
|
+
graphId: graph.id,
|
|
29
|
+
goal: opts.goal,
|
|
30
|
+
finishedAt: new Date().toISOString(),
|
|
31
|
+
converged: opts.converged,
|
|
32
|
+
nodes: [...graph.nodes.values()].map((n) => ({
|
|
33
|
+
id: n.id,
|
|
34
|
+
kind: n.kind,
|
|
35
|
+
label: n.label,
|
|
36
|
+
status: n.status,
|
|
37
|
+
...(n.scope && n.scope.length > 0 ? { scope: n.scope } : {}),
|
|
38
|
+
...(n.error ? { error: n.error.slice(0, 300) } : {}),
|
|
39
|
+
})),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Best-effort persist; never throws (memory is an optimization, not state). */
|
|
43
|
+
export async function saveGraphSnapshot(cwd, snapshot) {
|
|
44
|
+
try {
|
|
45
|
+
// Don't materialize a directory tree for a path that isn't a real project
|
|
46
|
+
// (tests pass synthetic cwds).
|
|
47
|
+
await fs.access(cwd);
|
|
48
|
+
const file = snapshotPath(cwd);
|
|
49
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
50
|
+
await fs.writeFile(file, JSON.stringify(snapshot, null, 2) + '\n', 'utf8');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// ignore
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Best-effort load; returns null when absent or unreadable. */
|
|
57
|
+
export async function loadGraphSnapshot(cwd) {
|
|
58
|
+
try {
|
|
59
|
+
const raw = await fs.readFile(snapshotPath(cwd), 'utf8');
|
|
60
|
+
const parsed = JSON.parse(raw);
|
|
61
|
+
if (!parsed || !Array.isArray(parsed.nodes))
|
|
62
|
+
return null;
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Render a snapshot as the "previous attempt" briefing appended to the
|
|
71
|
+
* planner prompt. Returns '' when there is nothing worth telling the model
|
|
72
|
+
* (no snapshot, or the previous run finished cleanly with everything done).
|
|
73
|
+
*/
|
|
74
|
+
export function formatSnapshotForPlanner(snapshot) {
|
|
75
|
+
if (!snapshot)
|
|
76
|
+
return '';
|
|
77
|
+
const done = snapshot.nodes.filter((n) => n.status === 'done');
|
|
78
|
+
const failed = snapshot.nodes.filter((n) => n.status === 'error');
|
|
79
|
+
const skipped = snapshot.nodes.filter((n) => n.status === 'skipped');
|
|
80
|
+
if (failed.length === 0 && skipped.length === 0)
|
|
81
|
+
return '';
|
|
82
|
+
const line = (n) => `- ${n.label}${n.scope ? ` [${n.scope.join(', ')}]` : ''}${n.error ? ` — ${n.error}` : ''}`;
|
|
83
|
+
// The previous goal is quoted verbatim: the stored snapshot is per-project,
|
|
84
|
+
// not per-goal, so the last unfinished graph may belong to entirely
|
|
85
|
+
// different work. Naming it lets the model decide whether this is a
|
|
86
|
+
// continuation or an unrelated request, instead of being told that somebody
|
|
87
|
+
// else's failed nodes belong to the goal it was just given.
|
|
88
|
+
const parts = [
|
|
89
|
+
'',
|
|
90
|
+
'## Previous unfinished task graph in this project',
|
|
91
|
+
`Goal it was working on: "${snapshot.goal}"`,
|
|
92
|
+
`It did NOT finish (${done.length} done, ${failed.length} failed, ` +
|
|
93
|
+
`${skipped.length} never ran).`,
|
|
94
|
+
'',
|
|
95
|
+
'If that goal is unrelated to the one above, ignore this section entirely.',
|
|
96
|
+
'',
|
|
97
|
+
];
|
|
98
|
+
if (done.length > 0) {
|
|
99
|
+
parts.push('Already completed — do NOT redo this work:', ...done.map(line), '');
|
|
100
|
+
}
|
|
101
|
+
if (failed.length > 0) {
|
|
102
|
+
parts.push('Failed — needs to be finished or repaired:', ...failed.map(line), '');
|
|
103
|
+
}
|
|
104
|
+
if (skipped.length > 0) {
|
|
105
|
+
parts.push('Never ran (blocked by the failures above):', ...skipped.map(line), '');
|
|
106
|
+
}
|
|
107
|
+
parts.push('Plan only the remaining work. Inspect what is already on disk before rewriting it, ' +
|
|
108
|
+
'and prefer wiring/finishing existing modules over recreating them.');
|
|
109
|
+
return parts.join('\n');
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=graphMemory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphMemory.js","sourceRoot":"","sources":["../../../src/cli/kraken/graphMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,32 +115,129 @@ const PlannedGraphSchema = z.object({
|
|
|
115
115
|
nodes: z.array(PlannedNodeSchema).min(1).max(DEFAULT_MAX_NODES),
|
|
116
116
|
});
|
|
117
117
|
/**
|
|
118
|
-
* Strip ```json fences,
|
|
119
|
-
*
|
|
120
|
-
* a strict parse fails.
|
|
118
|
+
* Strip inline `<think>` blocks and ```json fences, then walk the balanced
|
|
119
|
+
* `{...}` objects in the reply and parse the first usable one — falling back
|
|
120
|
+
* to {@link repairLooseJson} when a strict parse fails. Pass `requireKey` to
|
|
121
|
+
* skip objects that lack it, which is what separates a draft fragment left in
|
|
122
|
+
* the model's reasoning from the actual answer. Some models emit
|
|
123
|
+
* JS-object-literal-ish output
|
|
121
124
|
* (unquoted keys, single-quoted strings, trailing commas) despite explicit
|
|
122
125
|
* "valid JSON only" instructions; repairing once here is cheaper and more
|
|
123
126
|
* reliable than relying solely on the retry-with-feedback loop for a mistake
|
|
124
127
|
* a model tends to repeat identically.
|
|
125
128
|
*/
|
|
126
|
-
export function extractJsonObject(text) {
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
export function extractJsonObject(text, opts = {}) {
|
|
130
|
+
const stripped = stripReasoningBlocks(text);
|
|
131
|
+
// Safety net: an unterminated `<think>` with the answer after it would be
|
|
132
|
+
// stripped away entirely. Stripping must never lose an answer we would
|
|
133
|
+
// otherwise have found, so fall back to the raw reply when it leaves
|
|
134
|
+
// nothing usable behind.
|
|
135
|
+
const usable = findJsonIn(stripped, opts);
|
|
136
|
+
if (usable)
|
|
137
|
+
return usable.value;
|
|
138
|
+
const raw = findJsonIn(text, opts);
|
|
139
|
+
if (raw)
|
|
140
|
+
return raw.value;
|
|
141
|
+
const body = bodyOf(stripped) || bodyOf(text);
|
|
132
142
|
try {
|
|
133
|
-
return JSON.parse(
|
|
143
|
+
return JSON.parse(body);
|
|
134
144
|
}
|
|
135
145
|
catch (err) {
|
|
136
146
|
try {
|
|
137
|
-
return JSON.parse(repairLooseJson(
|
|
147
|
+
return JSON.parse(repairLooseJson(body));
|
|
138
148
|
}
|
|
139
149
|
catch {
|
|
140
150
|
throw err instanceof Error ? err : new Error(String(err));
|
|
141
151
|
}
|
|
142
152
|
}
|
|
143
153
|
}
|
|
154
|
+
/** Strip a ```json fence, if the whole body is one. */
|
|
155
|
+
function bodyOf(text) {
|
|
156
|
+
const trimmed = text.trim();
|
|
157
|
+
const fenced = /^```(?:json)?\s*([\s\S]*?)```$/i.exec(trimmed);
|
|
158
|
+
return fenced ? fenced[1].trim() : trimmed;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Scan the balanced objects in `text` and return the first usable one:
|
|
162
|
+
* preferring an object carrying `requireKey`, else the first that parses.
|
|
163
|
+
*/
|
|
164
|
+
function findJsonIn(text, opts) {
|
|
165
|
+
let firstParsed = null;
|
|
166
|
+
for (const candidate of balancedJsonObjects(bodyOf(text))) {
|
|
167
|
+
let value;
|
|
168
|
+
try {
|
|
169
|
+
value = JSON.parse(candidate);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
try {
|
|
173
|
+
value = JSON.parse(repairLooseJson(candidate));
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!opts.requireKey)
|
|
180
|
+
return { value };
|
|
181
|
+
// Reasoning models sketch partial JSON while thinking, so the FIRST
|
|
182
|
+
// balanced object in the reply is often a fragment ({"id":"g-add",...})
|
|
183
|
+
// rather than the answer. Keep scanning for one that carries the key the
|
|
184
|
+
// caller actually needs; the first parseable object is the fallback.
|
|
185
|
+
if (value && typeof value === 'object' && opts.requireKey in value) {
|
|
186
|
+
return { value };
|
|
187
|
+
}
|
|
188
|
+
// Models sometimes wrap the answer one level down ({"plan": {"nodes": …}},
|
|
189
|
+
// {"graph": {"nodes": …}}). Unwrap rather than fail schema validation with
|
|
190
|
+
// a confusing "expected array, received undefined".
|
|
191
|
+
const unwrapped = unwrapKey(value, opts.requireKey);
|
|
192
|
+
if (unwrapped)
|
|
193
|
+
return { value: unwrapped };
|
|
194
|
+
if (!firstParsed)
|
|
195
|
+
firstParsed = { value };
|
|
196
|
+
}
|
|
197
|
+
return firstParsed;
|
|
198
|
+
}
|
|
199
|
+
/** Find a direct child object that carries `key`, one level down. */
|
|
200
|
+
function unwrapKey(value, key) {
|
|
201
|
+
if (!value || typeof value !== 'object')
|
|
202
|
+
return null;
|
|
203
|
+
for (const child of Object.values(value)) {
|
|
204
|
+
if (child && typeof child === 'object' && key in child) {
|
|
205
|
+
return child;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Remove inline chain-of-thought blocks. Several reasoning models (MiniMax-M3
|
|
212
|
+
* among them) put their thinking in `message.content` wrapped in `<think>`
|
|
213
|
+
* tags rather than in a separate `reasoning_content` field — and that thinking
|
|
214
|
+
* routinely contains draft JSON, which the extractor would otherwise pick up
|
|
215
|
+
* instead of the real answer.
|
|
216
|
+
*/
|
|
217
|
+
export function stripReasoningBlocks(text) {
|
|
218
|
+
let out = text.replace(/<(think|thinking|reasoning)>[\s\S]*?<\/\1>/gi, '');
|
|
219
|
+
// An unterminated opening tag means the answer (if any) follows the last
|
|
220
|
+
// one; everything from that tag on is thinking, so there is nothing to keep
|
|
221
|
+
// unless a closing tag appeared earlier, which the replace above handled.
|
|
222
|
+
const openIdx = out.search(/<(think|thinking|reasoning)>/i);
|
|
223
|
+
if (openIdx >= 0)
|
|
224
|
+
out = out.slice(0, openIdx);
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
/** Yield every top-level balanced `{...}` object in `s`, in order. */
|
|
228
|
+
function* balancedJsonObjects(s) {
|
|
229
|
+
let from = 0;
|
|
230
|
+
while (from < s.length) {
|
|
231
|
+
const next = extractBalancedJsonObject(s.slice(from));
|
|
232
|
+
if (!next)
|
|
233
|
+
return;
|
|
234
|
+
yield next;
|
|
235
|
+
const idx = s.indexOf(next, from);
|
|
236
|
+
if (idx < 0)
|
|
237
|
+
return;
|
|
238
|
+
from = idx + next.length;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
144
241
|
/**
|
|
145
242
|
* Find the first top-level `{...}` object by brace depth, ignoring braces
|
|
146
243
|
* inside "double" or 'single' quoted strings (some models emit single-quoted
|
|
@@ -182,11 +279,36 @@ function extractBalancedJsonObject(s) {
|
|
|
182
279
|
/**
|
|
183
280
|
* Best-effort repair for the JSON mistakes models make most often despite
|
|
184
281
|
* being told "valid JSON only": single-quoted strings (Python/JS-dict
|
|
185
|
-
* style), unquoted/bareword object keys (JS-object-literal style),
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
282
|
+
* style), unquoted/bareword object keys (JS-object-literal style), trailing
|
|
283
|
+
* commas before `}`/`]`, and raw control characters inside string literals.
|
|
284
|
+
* That last one is the most common failure here by far: the planner asks for
|
|
285
|
+
* a self-contained multi-line `prompt` per node, so models routinely emit
|
|
286
|
+
* real newlines inside the string rather than `\n` escapes. Deliberately
|
|
287
|
+
* permissive — this is a fallback tried only after a strict `JSON.parse` has
|
|
288
|
+
* already failed, not a general JSON5 parser.
|
|
289
|
+
*/
|
|
290
|
+
/**
|
|
291
|
+
* Escape a character that JSON forbids raw inside a string literal (anything
|
|
292
|
+
* below U+0020). Everything else is returned unchanged.
|
|
189
293
|
*/
|
|
294
|
+
function escapeJsonControlChar(c) {
|
|
295
|
+
if (c >= ' ')
|
|
296
|
+
return c;
|
|
297
|
+
switch (c) {
|
|
298
|
+
case '\n':
|
|
299
|
+
return '\\n';
|
|
300
|
+
case '\r':
|
|
301
|
+
return '\\r';
|
|
302
|
+
case '\t':
|
|
303
|
+
return '\\t';
|
|
304
|
+
case '\b':
|
|
305
|
+
return '\\b';
|
|
306
|
+
case '\f':
|
|
307
|
+
return '\\f';
|
|
308
|
+
default:
|
|
309
|
+
return `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
190
312
|
function repairLooseJson(s) {
|
|
191
313
|
let out = '';
|
|
192
314
|
let i = 0;
|
|
@@ -198,15 +320,20 @@ function repairLooseJson(s) {
|
|
|
198
320
|
i += 1;
|
|
199
321
|
while (i < n) {
|
|
200
322
|
const c = s[i];
|
|
201
|
-
out += c;
|
|
202
323
|
i += 1;
|
|
203
324
|
if (c === '\\') {
|
|
325
|
+
out += c;
|
|
204
326
|
if (i < n) {
|
|
205
327
|
out += s[i];
|
|
206
328
|
i += 1;
|
|
207
329
|
}
|
|
208
330
|
continue;
|
|
209
331
|
}
|
|
332
|
+
// A raw control character inside a string literal — most often a real
|
|
333
|
+
// newline in a multi-line `prompt` — is illegal JSON. Escape it
|
|
334
|
+
// instead of copying it through, or the repair pass fails for the
|
|
335
|
+
// same reason the strict parse did.
|
|
336
|
+
out += escapeJsonControlChar(c);
|
|
210
337
|
if (c === '"')
|
|
211
338
|
break;
|
|
212
339
|
}
|
|
@@ -227,7 +354,7 @@ function repairLooseJson(s) {
|
|
|
227
354
|
i += 1;
|
|
228
355
|
break;
|
|
229
356
|
}
|
|
230
|
-
value += c;
|
|
357
|
+
value += escapeJsonControlChar(c);
|
|
231
358
|
i += 1;
|
|
232
359
|
}
|
|
233
360
|
out += `"${value.replace(/"/g, '\\"')}"`;
|
|
@@ -399,8 +526,9 @@ async function createDefaultLlmClient(opts) {
|
|
|
399
526
|
},
|
|
400
527
|
};
|
|
401
528
|
}
|
|
402
|
-
function buildPlannerUserPrompt(prompt) {
|
|
403
|
-
|
|
529
|
+
function buildPlannerUserPrompt(prompt, previousAttempt) {
|
|
530
|
+
const prev = previousAttempt?.trim() ? `\n${previousAttempt.trim()}\n` : '';
|
|
531
|
+
return `Goal:\n${prompt.trim()}\n${prev}\nReturn ONLY the JSON object described in the system prompt.`;
|
|
404
532
|
}
|
|
405
533
|
function uniqueId(base, existing) {
|
|
406
534
|
if (!existing.has(base))
|
|
@@ -482,14 +610,25 @@ export async function planTaskGraph(opts) {
|
|
|
482
610
|
const client = opts.llmClient ?? (await createDefaultLlmClient({ provider: opts.provider, model: opts.model }));
|
|
483
611
|
const maxNodes = opts.maxNodes ?? DEFAULT_MAX_NODES;
|
|
484
612
|
const graphId = opts.graphId ?? `kraken-${Date.now().toString(36)}`;
|
|
485
|
-
const userBase = buildPlannerUserPrompt(opts.prompt);
|
|
613
|
+
const userBase = buildPlannerUserPrompt(opts.prompt, opts.previousAttempt);
|
|
486
614
|
let lastError;
|
|
487
615
|
let userMessage = userBase;
|
|
488
616
|
for (let attempt = 1; attempt <= MAX_PLAN_ATTEMPTS; attempt++) {
|
|
489
617
|
try {
|
|
490
618
|
const text = await client.complete({ system: KRAKEN_PLANNER_SYSTEM_PROMPT, user: userMessage });
|
|
491
|
-
const parsedJson = extractJsonObject(text);
|
|
619
|
+
const parsedJson = extractJsonObject(text, { requireKey: 'nodes' });
|
|
492
620
|
const validated = PlannedGraphSchema.parse(parsedJson);
|
|
621
|
+
// `explore` is read-only, so a plan made only of explore nodes cannot
|
|
622
|
+
// change anything — yet it would run, converge, and report success.
|
|
623
|
+
// Observed for real on a "continua" prompt: the model planned a single
|
|
624
|
+
// "assess current workspace state" node and the graph reported 1/1 done
|
|
625
|
+
// having touched nothing. Reject it here so the retry loop asks again
|
|
626
|
+
// with corrective feedback.
|
|
627
|
+
if (!validated.nodes.some((n) => n.kind === 'general')) {
|
|
628
|
+
throw new Error('the plan contains no "general" node, so it cannot change anything — ' +
|
|
629
|
+
'every node is read-only "explore". Include at least one "general" node ' +
|
|
630
|
+
'that performs the actual work.');
|
|
631
|
+
}
|
|
493
632
|
const graph = buildGraphFromPlan(graphId, validated.nodes);
|
|
494
633
|
const check = validateGraph(graph, { maxNodes });
|
|
495
634
|
if (!check.ok) {
|