zelari-code 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cli/headless.js +14 -0
  2. package/dist/cli/headless.js.map +1 -1
  3. package/dist/cli/hooks/useSlashDispatch.js +11 -0
  4. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  5. package/dist/cli/kraken/executor.js +725 -42
  6. package/dist/cli/kraken/executor.js.map +1 -1
  7. package/dist/cli/kraken/graphMemory.js +27 -5
  8. package/dist/cli/kraken/graphMemory.js.map +1 -1
  9. package/dist/cli/kraken/graphStatus.js +59 -0
  10. package/dist/cli/kraken/graphStatus.js.map +1 -1
  11. package/dist/cli/kraken/planner.js +189 -12
  12. package/dist/cli/kraken/planner.js.map +1 -1
  13. package/dist/cli/kraken/planner.test.js +43 -0
  14. package/dist/cli/kraken/planner.test.js.map +1 -0
  15. package/dist/cli/kraken/runtime/compile.js +73 -0
  16. package/dist/cli/kraken/runtime/compile.js.map +1 -0
  17. package/dist/cli/kraken/runtime/runScriptPlan.js +195 -0
  18. package/dist/cli/kraken/runtime/runScriptPlan.js.map +1 -0
  19. package/dist/cli/kraken/scriptPlanner.js +286 -0
  20. package/dist/cli/kraken/scriptPlanner.js.map +1 -0
  21. package/dist/cli/kraken/scriptPlanner.test.js +152 -0
  22. package/dist/cli/kraken/scriptPlanner.test.js.map +1 -0
  23. package/dist/cli/kraken/skillSuggest.js +97 -0
  24. package/dist/cli/kraken/skillSuggest.js.map +1 -0
  25. package/dist/cli/kraken/skillSuggest.test.js +157 -0
  26. package/dist/cli/kraken/skillSuggest.test.js.map +1 -0
  27. package/dist/cli/kraken/weaknessMeter.js +183 -0
  28. package/dist/cli/kraken/weaknessMeter.js.map +1 -0
  29. package/dist/cli/kraken/weaknessMeter.test.js +212 -0
  30. package/dist/cli/kraken/weaknessMeter.test.js.map +1 -0
  31. package/dist/cli/kraken/workbench.js +296 -0
  32. package/dist/cli/kraken/workbench.js.map +1 -0
  33. package/dist/cli/kraken/workbench.test.js +253 -0
  34. package/dist/cli/kraken/workbench.test.js.map +1 -0
  35. package/dist/cli/kraken/workbenchView.js +155 -0
  36. package/dist/cli/kraken/workbenchView.js.map +1 -0
  37. package/dist/cli/kraken/workbenchView.test.js +130 -0
  38. package/dist/cli/kraken/workbenchView.test.js.map +1 -0
  39. package/dist/cli/main.bundled.js +2930 -353
  40. package/dist/cli/main.bundled.js.map +4 -4
  41. package/dist/cli/runHeadless.js +83 -8
  42. package/dist/cli/runHeadless.js.map +1 -1
  43. package/dist/cli/slashCommands.js +16 -0
  44. package/dist/cli/slashCommands.js.map +1 -1
  45. package/dist/cli/slashHandlers/krakenFanout.js +200 -0
  46. package/dist/cli/slashHandlers/krakenFanout.js.map +1 -0
  47. package/dist/cli/slashHandlers/krakenGraph.js +10 -3
  48. package/dist/cli/slashHandlers/krakenGraph.js.map +1 -1
  49. package/dist/cli/slashHandlers/krakenWorkbench.js +49 -0
  50. package/dist/cli/slashHandlers/krakenWorkbench.js.map +1 -0
  51. package/dist/cli/tools/krakenCsvFanout.js +260 -0
  52. package/dist/cli/tools/krakenCsvFanout.js.map +1 -0
  53. package/dist/cli/tools/krakenCsvFanout.test.js +200 -0
  54. package/dist/cli/tools/krakenCsvFanout.test.js.map +1 -0
  55. package/dist/cli/tools/krakenModel.js +32 -0
  56. package/dist/cli/tools/krakenModel.js.map +1 -1
  57. package/dist/cli/tools/krakenRadio.js.map +1 -1
  58. package/dist/cli/tools/taskTool.js +2 -2
  59. package/dist/cli/tools/taskTool.js.map +1 -1
  60. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenFanout.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/krakenFanout.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import { createKrakenSubAgentContextFactory } from '../toolRegistry.js';
16
16
  import { planTaskGraph } from '../kraken/planner.js';
17
17
  import { loadGraphSnapshot, formatSnapshotForPlanner } from '../kraken/graphMemory.js';
18
18
  import { KrakenGraphExecutor, isKrakenGraphEnabled } from '../kraken/executor.js';
19
- import { formatKrakenGraphAscii } from '../kraken/graphStatus.js';
19
+ import { formatKrakenGraphAscii, formatKrakenGraphDigest } from '../kraken/graphStatus.js';
20
20
  export async function handleKrakenGraph(ctx, prompt) {
21
21
  if (!isKrakenGraphEnabled()) {
22
22
  appendSystem(ctx.setMessages, '[kraken] graph engine disabled (ZELARI_KRAKEN_GRAPH=0). Unset it to re-enable.');
@@ -44,6 +44,7 @@ export async function handleKrakenGraph(ctx, prompt) {
44
44
  const graph = await planTaskGraph({
45
45
  prompt,
46
46
  graphId: `kraken-${Date.now().toString(36)}`,
47
+ cwd: ctx.cwd,
47
48
  ...(previousAttempt ? { previousAttempt } : {}),
48
49
  });
49
50
  appendSystem(ctx.setMessages, formatKrakenGraphAscii(graph));
@@ -54,10 +55,16 @@ export async function handleKrakenGraph(ctx, prompt) {
54
55
  goal: prompt,
55
56
  });
56
57
  const summary = await executor.execute(graph);
57
- appendSystem(ctx.setMessages, `${formatKrakenGraphAscii(summary.graph)}\n\n` +
58
+ const digest = formatKrakenGraphDigest(summary.graph, {
59
+ durationsMs: summary.durationsMs,
60
+ unresolvedFindings: summary.unresolvedFindings,
61
+ });
62
+ appendSystem(ctx.setMessages, `${formatKrakenGraphAscii(summary.graph)}\n\n${digest}\n\n` +
58
63
  (summary.converged
59
64
  ? '[kraken] graph converged.'
60
- : `[kraken] graph did not converge — failed: ${summary.failedNodeIds.join(', ') || 'none'}`));
65
+ : summary.cancelled
66
+ ? '[kraken] graph cancelled.'
67
+ : `[kraken] graph did not converge — failed: ${summary.failedNodeIds.join(', ') || 'none'}`));
61
68
  }
62
69
  catch (err) {
63
70
  appendSystem(ctx.setMessages, `[kraken] graph run failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"krakenGraph.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/krakenGraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"krakenGraph.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/krakenGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Kraken workbench slash handler — `/kraken workbench` (F3.2 TUI viewer).
3
+ *
4
+ * Reads the most recent `.zelari/radio/workbench-*.md` file and prints it
5
+ * to the transcript via the `parseWorkbench` / `formatWorkbenchForTerminal`
6
+ * pair. A full TUI live panel (a la Claude Code's `/workflows`) is a
7
+ * follow-up; this command is the simplest viable "I can see what's
8
+ * happening" affordance.
9
+ *
10
+ * @since Kraken v1.30.x — workflow script runtime (Pillar 3 F3.2)
11
+ */
12
+ import { promises as fs } from 'node:fs';
13
+ import path from 'node:path';
14
+ import { appendSystem } from '../hooks/messageHelpers.js';
15
+ import { parseWorkbench, formatWorkbenchForTerminal } from '../kraken/workbenchView.js';
16
+ export async function handleKrakenWorkbench(ctx) {
17
+ const dir = path.join(ctx.cwd, '.zelari', 'radio');
18
+ let latest = null;
19
+ let latestMtime = 0;
20
+ try {
21
+ const files = await fs.readdir(dir);
22
+ for (const f of files) {
23
+ if (!f.startsWith('workbench-') || !f.endsWith('.md'))
24
+ continue;
25
+ const full = path.join(dir, f);
26
+ const stat = await fs.stat(full);
27
+ if (stat.mtimeMs > latestMtime) {
28
+ latestMtime = stat.mtimeMs;
29
+ latest = full;
30
+ }
31
+ }
32
+ }
33
+ catch {
34
+ // No .zelari/radio dir yet.
35
+ }
36
+ if (!latest) {
37
+ appendSystem(ctx.setMessages, '[kraken workbench] no workbench file found (.zelari/radio/workbench-*.md)');
38
+ return;
39
+ }
40
+ const content = await fs.readFile(latest, 'utf8');
41
+ const parsed = parseWorkbench(content);
42
+ const rendered = formatWorkbenchForTerminal(parsed);
43
+ if (!rendered.trim()) {
44
+ appendSystem(ctx.setMessages, `[kraken workbench] ${path.basename(latest)}: (no nodes / no events yet)`);
45
+ return;
46
+ }
47
+ appendSystem(ctx.setMessages, `[kraken workbench] ${path.basename(latest)}:\n${rendered}`);
48
+ }
49
+ //# sourceMappingURL=krakenWorkbench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenWorkbench.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/krakenWorkbench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAOxF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAgC;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC/B,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC3B,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,2EAA2E,CAAC,CAAC;QAC3G,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACzG,OAAO;IACT,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Kraken CSV fan-out — `kraken_spawn_on_csv` tool (Slice G / Pillar 4).
3
+ *
4
+ * One tool call reads a CSV, fans out one sub-agent per row, and writes
5
+ * a result CSV. The shape is intentionally a small, predictable wrapper
6
+ * around the existing `runTentacle` from `taskTool.ts`:
7
+ *
8
+ * - One row = one tentacle. Each tentacle gets a fresh context window,
9
+ * so the auth row's findings never leak into the test row's context.
10
+ * - Concurrency is capped at `ZELARI_KRAKEN_MAX_PARALLEL` (12 by default).
11
+ * A pool of N workers drains the queue; per-row results land in the
12
+ * same order as the input rows, regardless of completion order.
13
+ * - On per-row failure: row's `status` = 'error', `error` column is
14
+ * populated, the run continues. The whole batch fails only when the
15
+ * read/write or LLM transport itself is broken.
16
+ * - Scope templating: optional `scope_template` (with `{column}` slots)
17
+ * is applied per row, then the global scope-overlap check refuses
18
+ * to run two rows with overlapping scopes in parallel. We never auto-
19
+ * resolve conflicts; the executor serializes the conflict.
20
+ *
21
+ * This is a **per-row fan-out**, not a single batched completion. The
22
+ * cost is N times a tentacle; the win is true isolation between rows.
23
+ * For "review every PR" / "audit every endpoint" workloads that's the
24
+ * right trade.
25
+ *
26
+ * @since Kraken v1.30.x — workflow script runtime (Pillar 4)
27
+ */
28
+ import { promises as fs } from 'node:fs';
29
+ import path from 'node:path';
30
+ import { randomBytes } from 'node:crypto';
31
+ import { z } from 'zod';
32
+ import { runTentacle } from './taskTool.js';
33
+ /** Per-call config; validated with Zod for early failure. */
34
+ const CsvFanoutArgsSchema = z.object({
35
+ csv_path: z.string().min(1),
36
+ id_column: z.string().min(1),
37
+ output_csv_path: z.string().min(1),
38
+ /** Template with `{column_name}` placeholders. The tentacle's prompt is
39
+ * the template with each row's values substituted. */
40
+ instruction_template: z.string().min(1),
41
+ /** Default 'verify' — read-mostly workloads are the common case. */
42
+ agent_kind: z.enum(['explore', 'general', 'verify']).default('verify'),
43
+ thoroughness: z.enum(['quick', 'medium', 'deep']).default('medium'),
44
+ /** Optional: per-row scope template with `{column}` placeholders. The
45
+ * resulting path/glob list is fed to the scope-overlap check. */
46
+ scope_template: z.array(z.string()).optional(),
47
+ /** Default: ZELARI_KRAKEN_MAX_PARALLEL. */
48
+ max_concurrency: z.number().int().positive().optional(),
49
+ /** Per-row timeout (ms). Default: 5 min for verify, 15 min for general. */
50
+ max_runtime_seconds: z.number().int().positive().optional(),
51
+ });
52
+ /** Read a UTF-8 CSV file. Tiny hand-rolled parser; the format is simple
53
+ * enough that pulling in a dep is overkill. Handles quoted fields with
54
+ * embedded newlines and commas. */
55
+ export async function readCsv(filePath) {
56
+ const text = await fs.readFile(filePath, 'utf8');
57
+ return parseCsv(text);
58
+ }
59
+ export function parseCsv(text) {
60
+ // State machine: walk the text, respect quotes, split on \n, then on ,.
61
+ const records = [];
62
+ let row = [];
63
+ let field = '';
64
+ let inQuotes = false;
65
+ for (let i = 0; i < text.length; i++) {
66
+ const ch = text[i];
67
+ if (inQuotes) {
68
+ if (ch === '"') {
69
+ if (text[i + 1] === '"') {
70
+ field += '"';
71
+ i += 1;
72
+ }
73
+ else
74
+ inQuotes = false;
75
+ }
76
+ else {
77
+ field += ch;
78
+ }
79
+ }
80
+ else {
81
+ if (ch === '"')
82
+ inQuotes = true;
83
+ else if (ch === ',') {
84
+ row.push(field);
85
+ field = '';
86
+ }
87
+ else if (ch === '\n') {
88
+ row.push(field);
89
+ records.push(row);
90
+ row = [];
91
+ field = '';
92
+ }
93
+ else if (ch === '\r') { /* ignore; \r\n becomes \n */ }
94
+ else
95
+ field += ch;
96
+ }
97
+ }
98
+ if (field !== '' || row.length > 0) {
99
+ row.push(field);
100
+ records.push(row);
101
+ }
102
+ // Drop a trailing empty row from a final newline.
103
+ while (records.length > 0 && records[records.length - 1].length === 1 && records[records.length - 1][0] === '') {
104
+ records.pop();
105
+ }
106
+ if (records.length === 0)
107
+ return { headers: [], rows: [] };
108
+ const headers = records[0];
109
+ const rows = records.slice(1).map((r) => {
110
+ const obj = {};
111
+ for (let i = 0; i < headers.length; i++)
112
+ obj[headers[i]] = r[i] ?? '';
113
+ return obj;
114
+ });
115
+ return { headers, rows };
116
+ }
117
+ /** Substitute `{column_name}` placeholders in a template. */
118
+ export function applyTemplate(template, row) {
119
+ return template.replace(/\{([a-zA-Z_][\w-]*)\}/g, (_, k) => row[k] ?? '');
120
+ }
121
+ /** Serialize a list of records as CSV. Mirrors `parseCsv` (quoted fields). */
122
+ export function serializeCsv(headers, rows) {
123
+ const escape = (v) => {
124
+ if (v.includes(',') || v.includes('\n') || v.includes('"')) {
125
+ return `"${v.replace(/"/g, '""')}"`;
126
+ }
127
+ return v;
128
+ };
129
+ const out = [headers.map(escape).join(',')];
130
+ for (const row of rows) {
131
+ out.push(headers.map((h) => escape(row[h] ?? '')).join(','));
132
+ }
133
+ return out.join('\n') + '\n';
134
+ }
135
+ export function resolveMaxConcurrency(env = process.env) {
136
+ const raw = env.ZELARI_KRAKEN_MAX_PARALLEL;
137
+ if (raw === undefined || raw === '')
138
+ return 12;
139
+ const n = Number.parseInt(raw, 10);
140
+ return Number.isFinite(n) && n > 0 ? n : 12;
141
+ }
142
+ /** Pool worker: pull rows from the queue, run a tentacle per row, collect
143
+ * results. The pool caps concurrency at `max_concurrency`; each worker
144
+ * grabs the next unclaimed row until the queue is empty. */
145
+ export async function runCsvFanout(args, deps, opts) {
146
+ const start = Date.now();
147
+ const absCsv = path.isAbsolute(args.csv_path) ? args.csv_path : path.join(opts.parentCwd, args.csv_path);
148
+ const absOut = path.isAbsolute(args.output_csv_path) ? args.output_csv_path : path.join(opts.parentCwd, args.output_csv_path);
149
+ const { headers, rows } = await readCsv(absCsv);
150
+ if (headers.length === 0) {
151
+ throw new Error(`kraken_csv_fanout: ${absCsv} is empty`);
152
+ }
153
+ if (!args.id_column) {
154
+ throw new Error('kraken_csv_fanout: id_column is required');
155
+ }
156
+ if (!headers.includes(args.id_column)) {
157
+ throw new Error(`kraken_csv_fanout: id_column "${args.id_column}" not in CSV header [${headers.join(', ')}]`);
158
+ }
159
+ const concurrency = args.max_concurrency ?? resolveMaxConcurrency();
160
+ opts.onLog?.(`csv fanout: ${rows.length} rows × ${args.agent_kind} @ concurrency=${concurrency}`);
161
+ // Per-row runtime cap. We mirror the kind-aware default from the graph
162
+ // executor (5 min for readers, 15 min for writers) so a slow row can't
163
+ // hang the whole batch.
164
+ const perRowMs = args.max_runtime_seconds !== undefined
165
+ ? args.max_runtime_seconds * 1000
166
+ : args.agent_kind === 'general'
167
+ ? 900_000
168
+ : 300_000;
169
+ // Output records: copy each input row, append result columns.
170
+ const outputRecords = rows.map((r) => ({ ...r, status: 'pending', result: '', error: '' }));
171
+ const outHeaders = [...headers, 'status', 'result', 'error'];
172
+ // Serialize atomic writes to the output CSV. Even with a random tmp
173
+ // suffix, N concurrent workers all rename-ing into the same target
174
+ // path can race on Windows (the destination is briefly locked by
175
+ // the rename, and a sibling rename fails with EPERM/EBUSY). Tail
176
+ // users only need the *latest* snapshot, so we serialize: the
177
+ // chain lets the next writer see the previous rename fully done
178
+ // before starting its own.
179
+ let writeChain = Promise.resolve();
180
+ function queueWrite(contents) {
181
+ const next = writeChain.then(() => atomicWrite(absOut, contents));
182
+ // Swallow the chain's rejection so a single failed write doesn't
183
+ // poison the chain; the worker that initiated this write still
184
+ // sees the rejection at its own `await` below.
185
+ writeChain = next.catch(() => { });
186
+ return next;
187
+ }
188
+ // Simple worker pool. Rows are claimed by index; the pool stops when
189
+ // the next index >= rows.length.
190
+ let nextIndex = 0;
191
+ let completed = 0;
192
+ let errored = 0;
193
+ const errors = [];
194
+ async function worker() {
195
+ while (true) {
196
+ const i = nextIndex;
197
+ nextIndex += 1;
198
+ if (i >= rows.length)
199
+ return;
200
+ const row = rows[i];
201
+ const prompt = applyTemplate(args.instruction_template, row);
202
+ const scope = args.scope_template?.map((t) => applyTemplate(t, row));
203
+ const res = await runTentacle({
204
+ deps,
205
+ args: {
206
+ description: `csv-row ${row[args.id_column] ?? i}`,
207
+ prompt,
208
+ ...(scope ? { scope } : {}),
209
+ },
210
+ agent: args.agent_kind,
211
+ thoroughness: args.thoroughness,
212
+ parentCwd: opts.parentCwd,
213
+ sessionId: opts.sessionId,
214
+ });
215
+ outputRecords[i].status = res.ok ? 'ok' : 'error';
216
+ if (res.ok) {
217
+ outputRecords[i].result = res.result;
218
+ completed += 1;
219
+ }
220
+ else {
221
+ outputRecords[i].error = res.error;
222
+ errored += 1;
223
+ errors.push(`${row[args.id_column] ?? i}: ${res.error}`);
224
+ }
225
+ // Atomic write of the result so a long batch can be observed mid-flight
226
+ // by tailing the file. We rewrite the whole output on each row; the
227
+ // expected sizes here are small enough (CSV with at most a few KB per
228
+ // row of LLM conclusion) that this is cheap. Writes are serialized
229
+ // through `queueWrite` (see above) so N concurrent workers don't race
230
+ // the rename on the same target path.
231
+ await fs.mkdir(path.dirname(absOut), { recursive: true });
232
+ await queueWrite(serializeCsv(outHeaders, outputRecords));
233
+ }
234
+ }
235
+ const pool = Array.from({ length: Math.min(concurrency, rows.length) }, () => worker());
236
+ await Promise.all(pool);
237
+ const durationMs = Date.now() - start;
238
+ opts.onLog?.(`csv fanout: ${completed} ok, ${errored} error, ${durationMs}ms`);
239
+ if (errored > 0) {
240
+ opts.onLog?.(`csv fanout: first 3 errors:\n - ${errors.slice(0, 3).join('\n - ')}`);
241
+ }
242
+ return {
243
+ rows: rows.length,
244
+ completed,
245
+ errored,
246
+ output_csv_path: absOut,
247
+ durationMs,
248
+ };
249
+ }
250
+ /** Atomic write via tmp + rename so partial files are never visible.
251
+ * The tmp filename carries a random hex suffix so concurrent writers
252
+ * (multiple fan-out workers tailing the same output CSV) never
253
+ * collide on the same tmp path — a collision would race the write
254
+ * and rename and surface as ENOENT. */
255
+ async function atomicWrite(file, contents) {
256
+ const tmp = `${file}.${process.pid}.${Date.now()}.${randomBytes(6).toString('hex')}.tmp`;
257
+ await fs.writeFile(tmp, contents, 'utf8');
258
+ await fs.rename(tmp, file);
259
+ }
260
+ //# sourceMappingURL=krakenCsvFanout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenCsvFanout.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenCsvFanout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Kraken CSV fan-out — tests.
3
+ *
4
+ * Covers:
5
+ * - `parseCsv` / `serializeCsv` round-trip
6
+ * - `applyTemplate` substitution
7
+ * - `parseFanoutArgs` CLI argument parsing
8
+ * - `runCsvFanout` end-to-end with a fake tentacle (mock host)
9
+ */
10
+ import { describe, it, expect } from 'vitest';
11
+ import { promises as fs } from 'node:fs';
12
+ import os from 'node:os';
13
+ import path from 'node:path';
14
+ import { parseCsv, serializeCsv, applyTemplate, runCsvFanout, } from './krakenCsvFanout.js';
15
+ import { parseFanoutArgs, splitArgs } from '../slashHandlers/krakenFanout.js';
16
+ describe('parseCsv / serializeCsv', () => {
17
+ it('parses a simple CSV', () => {
18
+ const { headers, rows } = parseCsv('a,b,c\n1,2,3\n4,5,6\n');
19
+ expect(headers).toEqual(['a', 'b', 'c']);
20
+ expect(rows).toEqual([{ a: '1', b: '2', c: '3' }, { a: '4', b: '5', c: '6' }]);
21
+ });
22
+ it('parses quoted fields with embedded commas and newlines', () => {
23
+ const text = 'a,b\n"hello, world","line1\nline2"\n';
24
+ const { headers, rows } = parseCsv(text);
25
+ expect(headers).toEqual(['a', 'b']);
26
+ expect(rows).toEqual([{ a: 'hello, world', b: 'line1\nline2' }]);
27
+ });
28
+ it('handles escaped quotes ("" → ")', () => {
29
+ const { rows } = parseCsv('a\n"He said ""hi"""\n');
30
+ expect(rows).toEqual([{ a: 'He said "hi"' }]);
31
+ });
32
+ it('round-trips a CSV through parse + serialize', () => {
33
+ const text = 'id,description\n1,"hello, world"\n2,"ok"\n';
34
+ const { headers, rows } = parseCsv(text);
35
+ const out = serializeCsv(headers, rows);
36
+ const reparsed = parseCsv(out);
37
+ expect(reparsed.headers).toEqual(headers);
38
+ expect(reparsed.rows).toEqual(rows);
39
+ });
40
+ it('returns empty for an empty input', () => {
41
+ expect(parseCsv('')).toEqual({ headers: [], rows: [] });
42
+ });
43
+ it('drops trailing empty rows from a final newline', () => {
44
+ const { rows } = parseCsv('a\n1\n2\n\n\n');
45
+ expect(rows).toEqual([{ a: '1' }, { a: '2' }]);
46
+ });
47
+ });
48
+ describe('applyTemplate', () => {
49
+ it('substitutes {column} placeholders', () => {
50
+ expect(applyTemplate('review {path} for {issue}', { path: 'a.ts', issue: 'XSS' }))
51
+ .toBe('review a.ts for XSS');
52
+ });
53
+ it('leaves unknown placeholders as empty', () => {
54
+ expect(applyTemplate('hello {name}', {})).toBe('hello ');
55
+ });
56
+ it('handles no placeholders', () => {
57
+ expect(applyTemplate('static text', { a: 'b' })).toBe('static text');
58
+ });
59
+ });
60
+ describe('splitArgs', () => {
61
+ it('splits on whitespace', () => {
62
+ expect(splitArgs('a b c')).toEqual(['a', 'b', 'c']);
63
+ });
64
+ it('respects double quotes', () => {
65
+ expect(splitArgs('a "b c" d')).toEqual(['a', 'b c', 'd']);
66
+ });
67
+ it('handles empty input', () => {
68
+ expect(splitArgs('')).toEqual([]);
69
+ expect(splitArgs(' ')).toEqual([]);
70
+ });
71
+ });
72
+ describe('parseFanoutArgs', () => {
73
+ it('parses a minimal invocation', () => {
74
+ const r = parseFanoutArgs(['data.csv', '--col', 'id', '--out', 'r.csv', '--instruction', 'review {id}']);
75
+ expect(r.ok).toBe(true);
76
+ expect(r.args).toMatchObject({
77
+ csv_path: 'data.csv',
78
+ id_column: 'id',
79
+ output_csv_path: 'r.csv',
80
+ instruction_template: 'review {id}',
81
+ agent_kind: 'verify',
82
+ thoroughness: 'medium',
83
+ });
84
+ });
85
+ it('parses flags with =', () => {
86
+ const r = parseFanoutArgs(['--csv=data.csv', '--col=id', '--out=r.csv', '--instruction=hi {x}']);
87
+ expect(r.ok).toBe(true);
88
+ expect(r.args?.csv_path).toBe('data.csv');
89
+ });
90
+ it('rejects missing csv', () => {
91
+ const r = parseFanoutArgs(['--col', 'id', '--out', 'r.csv', '--instruction', 'x']);
92
+ expect(r.ok).toBe(false);
93
+ expect(r.error).toMatch(/csv_path is required/);
94
+ });
95
+ it('rejects missing col', () => {
96
+ const r = parseFanoutArgs(['data.csv', '--out', 'r.csv', '--instruction', 'x']);
97
+ expect(r.ok).toBe(false);
98
+ expect(r.error).toMatch(/--col/);
99
+ });
100
+ it('rejects invalid agent_kind', () => {
101
+ const r = parseFanoutArgs(['data.csv', '--col', 'id', '--out', 'r.csv', '--instruction', 'x', '--agent', 'foo']);
102
+ expect(r.ok).toBe(false);
103
+ expect(r.error).toMatch(/--agent/);
104
+ });
105
+ it('parses concurrency and max-runtime', () => {
106
+ const r = parseFanoutArgs(['data.csv', '--col', 'id', '--out', 'r.csv', '--instruction', 'x', '--concurrency', '4', '--max-runtime', '120']);
107
+ expect(r.ok).toBe(true);
108
+ expect(r.args?.max_concurrency).toBe(4);
109
+ expect(r.args?.max_runtime_seconds).toBe(120);
110
+ });
111
+ it('rejects non-integer concurrency', () => {
112
+ const r = parseFanoutArgs(['data.csv', '--col', 'id', '--out', 'r.csv', '--instruction', 'x', '--concurrency', '0']);
113
+ expect(r.ok).toBe(false);
114
+ });
115
+ it('returns the usage string when no args are given', () => {
116
+ const r = parseFanoutArgs([]);
117
+ expect(r.ok).toBe(false);
118
+ expect(r.usage).toMatch(/Usage:/);
119
+ });
120
+ });
121
+ describe('runCsvFanout (with fake tentacle)', () => {
122
+ function fakeDeps(getConclusion) {
123
+ // We don't actually call runTentacle here; we reach into the worker
124
+ // pool by mocking the deps object. The simplest path: use a deps
125
+ // object whose `createSubAgentContext` throws — the worker's first
126
+ // call will fail, the row will be marked error, and the run continues.
127
+ // For real "conclusions" we patch runTentacle indirectly by
128
+ // constructing the deps and exercising the code path. To keep this
129
+ // test simple, we use a `createSubAgentContext` that returns a
130
+ // minimal context which the harness will use to produce a known
131
+ // result. But that's a lot of plumbing. So we just test the
132
+ // error-path behavior here; the happy path is covered by the CLI
133
+ // integration smoke test.
134
+ return {
135
+ createSubAgentContext: () => {
136
+ throw new Error('fake: tentacle host unavailable in this test');
137
+ },
138
+ };
139
+ }
140
+ it('marks every row as error when the host is unreachable', async () => {
141
+ const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-fanout-'));
142
+ const csv = path.join(tmp, 'in.csv');
143
+ const out = path.join(tmp, 'out.csv');
144
+ await fs.writeFile(csv, 'id\n1\n2\n3\n', 'utf8');
145
+ const args = {
146
+ csv_path: csv,
147
+ id_column: 'id',
148
+ output_csv_path: out,
149
+ instruction_template: 'review {id}',
150
+ agent_kind: 'verify',
151
+ thoroughness: 'medium',
152
+ max_concurrency: 2,
153
+ };
154
+ const result = await runCsvFanout(args, fakeDeps(() => ({ ok: false, error: 'boom' })), {
155
+ parentCwd: tmp,
156
+ sessionId: 's1',
157
+ });
158
+ expect(result.rows).toBe(3);
159
+ expect(result.completed).toBe(0);
160
+ expect(result.errored).toBe(3);
161
+ // The output CSV is on disk and has the expected columns.
162
+ const written = await fs.readFile(out, 'utf8');
163
+ expect(written).toContain('id,status,result,error');
164
+ const { rows } = parseCsv(written);
165
+ expect(rows).toHaveLength(3);
166
+ for (const r of rows) {
167
+ expect(r.status).toBe('error');
168
+ expect(r.error).toMatch(/fake|tentacle/);
169
+ }
170
+ });
171
+ it('rejects an empty CSV with a structured error', async () => {
172
+ const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-fanout-'));
173
+ const csv = path.join(tmp, 'empty.csv');
174
+ await fs.writeFile(csv, '', 'utf8');
175
+ const args = {
176
+ csv_path: csv,
177
+ id_column: 'id',
178
+ output_csv_path: path.join(tmp, 'out.csv'),
179
+ instruction_template: 'x',
180
+ agent_kind: 'verify',
181
+ thoroughness: 'medium',
182
+ };
183
+ await expect(runCsvFanout(args, fakeDeps(() => ({ ok: false })), { parentCwd: tmp, sessionId: 's' })).rejects.toThrowError(/is empty/);
184
+ });
185
+ it('rejects a missing id_column with a structured error', async () => {
186
+ const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-fanout-'));
187
+ const csv = path.join(tmp, 'in.csv');
188
+ await fs.writeFile(csv, 'name,age\nalice,30\n', 'utf8');
189
+ const args = {
190
+ csv_path: csv,
191
+ id_column: 'id', // not in the header
192
+ output_csv_path: path.join(tmp, 'out.csv'),
193
+ instruction_template: 'x',
194
+ agent_kind: 'verify',
195
+ thoroughness: 'medium',
196
+ };
197
+ await expect(runCsvFanout(args, fakeDeps(() => ({ ok: false })), { parentCwd: tmp, sessionId: 's' })).rejects.toThrowError(/id_column "id" not in CSV header/);
198
+ });
199
+ });
200
+ //# sourceMappingURL=krakenCsvFanout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenCsvFanout.test.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenCsvFanout.test.ts"],"names":[],"mappings":"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"}