@ordewell/core 0.4.9 → 0.4.10

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.
@@ -1,510 +0,0 @@
1
- import {
2
- PlanParseError,
3
- TASK_OPS_ENVELOPE_KEY,
4
- addTaskToPlan,
5
- createTask,
6
- escapeControlCharsInStrings,
7
- extractObjectsWithKey,
8
- flattenTasks,
9
- removeTaskFromPlan,
10
- renumberTasks,
11
- stripTrailingCommas,
12
- updateTaskInPlan
13
- } from "./chunk-SRGQBGI5.mjs";
14
-
15
- // src/services/TaskOps.ts
16
- var UPDATABLE_FIELDS = [
17
- "title",
18
- "description",
19
- "prompt",
20
- "dependencies",
21
- "assignedRunner",
22
- "assignedModel",
23
- "taskMode",
24
- "thinkingEffort",
25
- "type",
26
- "userSteps",
27
- "autonomy"
28
- ];
29
- function textHasTaskOps(text) {
30
- return text.includes(`"${TASK_OPS_ENVELOPE_KEY}"`);
31
- }
32
- function parseTaskOpsJson(text) {
33
- const { matches, fallback } = extractObjectsWithKey(text, TASK_OPS_ENVELOPE_KEY);
34
- const candidates = matches.length > 0 ? [...matches].reverse() : [fallback.json];
35
- let lastError = null;
36
- for (const json of candidates) {
37
- try {
38
- return parseTaskOpsObject(json, text);
39
- } catch (err) {
40
- if (!(err instanceof PlanParseError)) throw err;
41
- if (!lastError) lastError = err;
42
- }
43
- }
44
- throw lastError ?? new PlanParseError("No JSON object found in task-ops reply", text);
45
- }
46
- function parseTaskOpsObject(json, text) {
47
- let parsed;
48
- try {
49
- parsed = JSON.parse(escapeControlCharsInStrings(stripTrailingCommas(json)));
50
- } catch (err) {
51
- throw new PlanParseError(`Task-ops JSON is invalid: ${err instanceof Error ? err.message : String(err)}`, text);
52
- }
53
- const ops = parsed.taskOps;
54
- if (!Array.isArray(ops) || ops.length === 0) {
55
- throw new PlanParseError('"taskOps" must be a non-empty array', text);
56
- }
57
- for (const op of ops) {
58
- if (typeof op !== "object" || op === null || typeof op.op !== "string") {
59
- throw new PlanParseError('Every task op needs an "op" field (update | add | remove | reorder | merge | split)', text);
60
- }
61
- }
62
- return ops;
63
- }
64
- function resolveRef(ref, tasks) {
65
- if (typeof ref !== "string" && typeof ref !== "number") return void 0;
66
- const s = String(ref).trim();
67
- const byId = tasks.find((t) => t.id === s);
68
- if (byId) return byId;
69
- const orderStr = s.startsWith("#") ? s.slice(1) : s;
70
- if (/^\d+$/.test(orderStr)) {
71
- const order = Number(orderStr);
72
- const byOrder = tasks.filter((t) => t.order === order);
73
- if (byOrder.length === 1) return byOrder[0];
74
- }
75
- return tasks.find((t) => t.title === s);
76
- }
77
- function detectCycle(tasks) {
78
- const byId = new Map(tasks.map((t) => [t.id, t]));
79
- const visiting = /* @__PURE__ */ new Set();
80
- const done = /* @__PURE__ */ new Set();
81
- const visit = (id) => {
82
- if (done.has(id)) return null;
83
- if (visiting.has(id)) return id;
84
- visiting.add(id);
85
- for (const dep of byId.get(id)?.dependencies ?? []) {
86
- const hit = visit(dep);
87
- if (hit) return hit;
88
- }
89
- visiting.delete(id);
90
- done.add(id);
91
- return null;
92
- };
93
- for (const t of tasks) {
94
- const hit = visit(t.id);
95
- if (hit) return byId.get(hit)?.title ?? hit;
96
- }
97
- return null;
98
- }
99
- function canMergeTasks(tasks, selectedIds) {
100
- if (selectedIds.length < 2) return { ok: false, error: "Select at least two tasks to merge" };
101
- const idSet = new Set(selectedIds);
102
- const toMerge = tasks.filter((t) => idSet.has(t.id));
103
- if (toMerge.length < 2) return { ok: false, error: "At least two valid tasks are required to merge" };
104
- for (const t of toMerge) {
105
- if (t.status === "in_progress") return { ok: false, error: `"${t.title}" is running and cannot be merged` };
106
- if (t.status === "completed") return { ok: false, error: `"${t.title}" is completed and cannot be merged` };
107
- }
108
- const ordered = [...toMerge].sort((a, b) => a.order - b.order);
109
- const survivorId = "__merge_sim__";
110
- const sim = tasks.filter((t) => !idSet.has(t.id)).map((t) => ({ ...t, dependencies: t.dependencies.map((d) => idSet.has(d) ? survivorId : d).filter((d) => d !== t.id) }));
111
- const unionDeps = [...new Set(toMerge.flatMap((t) => t.dependencies))].filter((d) => !idSet.has(d));
112
- sim.push({ ...ordered[0], id: survivorId, title: "__merge_sim__", order: ordered[0].order, dependencies: unionDeps });
113
- const cycle = detectCycle(sim);
114
- if (cycle) return { ok: false, error: `Merging would create a dependency cycle involving "${cycle}"` };
115
- const orderById = new Map(sim.map((t) => [t.id, t.order]));
116
- for (const t of sim) {
117
- for (const dep of t.dependencies) {
118
- const depOrder = orderById.get(dep);
119
- if (depOrder !== void 0 && depOrder >= t.order) {
120
- return { ok: false, error: "Merging would break task ordering \u2014 a dependency of the merged set comes after it" };
121
- }
122
- }
123
- }
124
- return { ok: true };
125
- }
126
- function dependentsOf(tasks, taskId) {
127
- return tasks.filter((t) => t.id !== taskId && t.dependencies.includes(taskId));
128
- }
129
- function dependencyCandidates(tasks, taskId) {
130
- if (!taskId) return [...tasks];
131
- const target = tasks.find((t) => t.id === taskId);
132
- return target ? tasks.filter((t) => t.order < target.order) : [];
133
- }
134
- function canSetDependencies(tasks, taskId, dependencies) {
135
- const target = tasks.find((t) => t.id === taskId);
136
- if (!target) return { ok: false, error: "Task not found" };
137
- const allowed = new Set(dependencyCandidates(tasks, taskId).map((t) => t.id));
138
- for (const dep of dependencies) {
139
- if (dep === taskId) return { ok: false, error: `"${target.title}" cannot depend on itself` };
140
- const found = tasks.find((t) => t.id === dep);
141
- if (!found) return { ok: false, error: `Unknown dependency "${dep}"` };
142
- if (!allowed.has(dep)) {
143
- return { ok: false, error: `"${target.title}" cannot depend on "${found.title}", which comes after it in the plan` };
144
- }
145
- }
146
- return { ok: true };
147
- }
148
- function canSplitTask(tasks, taskId) {
149
- const target = tasks.find((t) => t.id === taskId);
150
- if (!target) return { ok: false, error: "Task not found" };
151
- if (target.status === "in_progress") return { ok: false, error: `"${target.title}" is running and cannot be split` };
152
- if (target.status === "completed") return { ok: false, error: `"${target.title}" is completed and cannot be split` };
153
- return { ok: true };
154
- }
155
- function applyTaskOps(currentTasks, ops, runners) {
156
- let tasks = JSON.parse(JSON.stringify(currentTasks));
157
- const errors = [];
158
- const summary = [];
159
- const resolveDeps = (deps) => {
160
- const ids = [];
161
- const bad = [];
162
- for (const d of Array.isArray(deps) ? deps : []) {
163
- const t = resolveRef(d, flattenTasks(tasks));
164
- if (t) ids.push(t.id);
165
- else bad.push(String(d));
166
- }
167
- return { ids, bad };
168
- };
169
- for (const [i, op] of ops.entries()) {
170
- const label = `op ${i + 1} (${op.op})`;
171
- switch (op.op) {
172
- case "update": {
173
- const target = resolveRef(op.taskId, flattenTasks(tasks));
174
- if (!target) {
175
- errors.push(`${label}: task "${op.taskId}" not found`);
176
- break;
177
- }
178
- if (target.status === "in_progress") {
179
- errors.push(`${label}: "${target.title}" is running and cannot be modified`);
180
- break;
181
- }
182
- if (target.status === "completed") {
183
- errors.push(`${label}: "${target.title}" is completed and cannot be modified`);
184
- break;
185
- }
186
- const changes = {};
187
- for (const key of UPDATABLE_FIELDS) {
188
- if (op.changes && key in op.changes) changes[key] = op.changes[key];
189
- }
190
- if ("dependencies" in changes) {
191
- const { ids, bad } = resolveDeps(changes.dependencies);
192
- if (bad.length) {
193
- errors.push(`${label}: unknown dependencies: ${bad.join(", ")}`);
194
- break;
195
- }
196
- changes.dependencies = ids.filter((id) => id !== target.id);
197
- }
198
- if (changes.assignedRunner && !runners.includes(changes.assignedRunner)) {
199
- errors.push(`${label}: runner "${changes.assignedRunner}" is not in this plan's runner set [${runners.join(", ")}]`);
200
- break;
201
- }
202
- if (Object.keys(changes).length === 0) {
203
- errors.push(`${label}: no valid changes provided`);
204
- break;
205
- }
206
- tasks = updateTaskInPlan(tasks, target.id, changes);
207
- summary.push(`Updated "${target.title}" (${Object.keys(changes).join(", ")})`);
208
- break;
209
- }
210
- case "add": {
211
- const spec = op.task ?? {};
212
- if (!spec.title) {
213
- errors.push(`${label}: new task needs a title`);
214
- break;
215
- }
216
- const { ids, bad } = resolveDeps(spec.dependencies);
217
- if (bad.length) {
218
- errors.push(`${label}: unknown dependencies: ${bad.join(", ")}`);
219
- break;
220
- }
221
- const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : runners[0];
222
- tasks = addTaskToPlan(tasks, {
223
- ...spec,
224
- id: void 0,
225
- dependencies: ids,
226
- assignedRunner: runner,
227
- description: spec.description ?? spec.title,
228
- prompt: spec.prompt ?? spec.description ?? spec.title
229
- });
230
- summary.push(`Added "${spec.title}"`);
231
- break;
232
- }
233
- case "remove": {
234
- const target = resolveRef(op.taskId, flattenTasks(tasks));
235
- if (!target) {
236
- errors.push(`${label}: task "${op.taskId}" not found`);
237
- break;
238
- }
239
- if (target.status === "in_progress") {
240
- errors.push(`${label}: "${target.title}" is running and cannot be removed`);
241
- break;
242
- }
243
- if (target.status === "completed") {
244
- errors.push(`${label}: "${target.title}" is completed and cannot be removed`);
245
- break;
246
- }
247
- tasks = removeTaskFromPlan(tasks, target.id);
248
- summary.push(`Removed "${target.title}"`);
249
- break;
250
- }
251
- case "reorder": {
252
- const resolved = (op.taskIds ?? []).map((r) => resolveRef(r, tasks));
253
- if (resolved.some((t) => !t)) {
254
- errors.push(`${label}: unknown task in reorder list`);
255
- break;
256
- }
257
- const orderIds = resolved.map((t) => t.id);
258
- if (new Set(orderIds).size !== tasks.length) {
259
- errors.push(`${label}: reorder must list every top-level task exactly once (${tasks.length} tasks)`);
260
- break;
261
- }
262
- const byId = new Map(tasks.map((t) => [t.id, t]));
263
- tasks = renumberTasks(orderIds.map((id) => byId.get(id)));
264
- summary.push("Reordered tasks");
265
- break;
266
- }
267
- case "merge": {
268
- const resolved = (op.taskIds ?? []).map((r) => resolveRef(r, tasks));
269
- if (resolved.some((t) => !t)) {
270
- errors.push(`${label}: unknown task in merge list`);
271
- break;
272
- }
273
- const toMerge = resolved.map((t) => t).sort((a, b) => a.order - b.order);
274
- if (toMerge.length < 2) {
275
- errors.push(`${label}: merge needs at least two tasks`);
276
- break;
277
- }
278
- const locked = toMerge.find((t) => t.status === "in_progress" || t.status === "completed");
279
- if (locked) {
280
- errors.push(`${label}: "${locked.title}" is ${locked.status === "in_progress" ? "running" : "completed"} and cannot be merged`);
281
- break;
282
- }
283
- const idSet = new Set(toMerge.map((t) => t.id));
284
- const unionDepsRaw = [...new Set(toMerge.flatMap((t) => t.dependencies))].filter((d) => !idSet.has(d));
285
- const { ids, bad } = resolveDeps(unionDepsRaw);
286
- if (bad.length) {
287
- errors.push(`${label}: unknown dependencies: ${bad.join(", ")}`);
288
- break;
289
- }
290
- const spec = op.merged ?? {};
291
- if (!spec.title) {
292
- errors.push(`${label}: merged task needs a title`);
293
- break;
294
- }
295
- const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : toMerge[0].assignedRunner;
296
- const mergedTask = createTask({
297
- title: spec.title,
298
- description: spec.description ?? toMerge.map((t) => t.description).filter(Boolean).join("\n\n"),
299
- prompt: spec.prompt ?? (toMerge.map((t) => t.prompt).filter(Boolean).join("\n\n---\n\n") || void 0),
300
- type: spec.type ?? (toMerge.some((t) => t.type === "user") ? "user" : "ai"),
301
- dependencies: ids,
302
- assignedRunner: runner,
303
- assignedModel: spec.assignedModel ?? toMerge.find((t) => t.assignedModel)?.assignedModel,
304
- thinkingEffort: spec.thinkingEffort ?? toMerge.find((t) => t.thinkingEffort)?.thinkingEffort,
305
- taskMode: spec.taskMode ?? toMerge[0].taskMode,
306
- autonomy: spec.autonomy ?? toMerge.find((t) => t.autonomy)?.autonomy,
307
- sliceType: spec.sliceType ?? toMerge.find((t) => t.sliceType)?.sliceType,
308
- userStoriesCovered: spec.userStoriesCovered ?? (toMerge.flatMap((t) => t.userStoriesCovered ?? []).length ? [...new Set(toMerge.flatMap((t) => t.userStoriesCovered ?? []))] : void 0)
309
- });
310
- const mergedId = mergedTask.id;
311
- const firstId = toMerge[0].id;
312
- const result = [];
313
- let inserted = false;
314
- for (const t of tasks) {
315
- if (idSet.has(t.id)) {
316
- if (!inserted && t.id === firstId) {
317
- result.push(mergedTask);
318
- inserted = true;
319
- }
320
- continue;
321
- }
322
- result.push({ ...t, dependencies: t.dependencies.map((d) => idSet.has(d) ? mergedId : d) });
323
- }
324
- if (!inserted) result.push(mergedTask);
325
- tasks = renumberTasks(result);
326
- summary.push(`Merged ${toMerge.length} tasks into "${spec.title}"`);
327
- break;
328
- }
329
- case "split": {
330
- const target = resolveRef(op.taskId, tasks);
331
- if (!target) {
332
- errors.push(`${label}: task "${op.taskId}" not found`);
333
- break;
334
- }
335
- if (target.status === "in_progress") {
336
- errors.push(`${label}: "${target.title}" is running and cannot be split`);
337
- break;
338
- }
339
- if (target.status === "completed") {
340
- errors.push(`${label}: "${target.title}" is completed and cannot be split`);
341
- break;
342
- }
343
- const parts = op.parts ?? [];
344
- if (parts.length < 2) {
345
- errors.push(`${label}: split needs at least two parts`);
346
- break;
347
- }
348
- const newTasks = [];
349
- let prevId;
350
- let buildError = false;
351
- for (let i2 = 0; i2 < parts.length; i2++) {
352
- const spec = parts[i2];
353
- if (!spec || !spec.title) {
354
- errors.push(`${label}: split part ${i2 + 1} needs a title`);
355
- buildError = true;
356
- break;
357
- }
358
- let deps;
359
- if (i2 === 0) {
360
- const { ids, bad } = resolveDeps(target.dependencies);
361
- if (bad.length) {
362
- errors.push(`${label}: split part 1 unknown dependencies: ${bad.join(", ")}`);
363
- buildError = true;
364
- break;
365
- }
366
- deps = ids;
367
- } else {
368
- deps = prevId ? [prevId] : [];
369
- }
370
- const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : target.assignedRunner;
371
- const nt = createTask({
372
- title: spec.title,
373
- description: spec.description ?? spec.title,
374
- prompt: spec.prompt ?? spec.description ?? spec.title,
375
- type: spec.type ?? target.type,
376
- dependencies: deps,
377
- assignedRunner: runner,
378
- assignedModel: spec.assignedModel ?? target.assignedModel,
379
- taskMode: spec.taskMode ?? target.taskMode,
380
- autonomy: spec.autonomy ?? target.autonomy,
381
- sliceType: spec.sliceType ?? target.sliceType,
382
- userStoriesCovered: spec.userStoriesCovered ?? target.userStoriesCovered
383
- });
384
- newTasks.push(nt);
385
- prevId = nt.id;
386
- }
387
- if (buildError) break;
388
- const tailId = newTasks[newTasks.length - 1].id;
389
- const result = [];
390
- for (const t of tasks) {
391
- if (t.id === target.id) {
392
- result.push(...newTasks);
393
- continue;
394
- }
395
- result.push({ ...t, dependencies: t.dependencies.map((d) => d === target.id ? tailId : d) });
396
- }
397
- tasks = renumberTasks(result);
398
- summary.push(`Split "${target.title}" into ${newTasks.length} tasks`);
399
- break;
400
- }
401
- default:
402
- errors.push(`${label}: unknown op "${op.op}"`);
403
- }
404
- if (errors.length) break;
405
- }
406
- if (!errors.length) {
407
- const flat = flattenTasks(tasks);
408
- const idSet = new Set(flat.map((t) => t.id));
409
- for (const t of flat) {
410
- for (const dep of t.dependencies) {
411
- if (!idSet.has(dep)) errors.push(`"${t.title}" depends on a task that no longer exists (${dep})`);
412
- }
413
- }
414
- const cycleAt = detectCycle(flat);
415
- if (cycleAt) errors.push(`Dependency cycle detected involving "${cycleAt}"`);
416
- const orderById = new Map(tasks.map((t) => [t.id, t.order]));
417
- for (const t of tasks) {
418
- for (const dep of t.dependencies) {
419
- const depOrder = orderById.get(dep);
420
- if (depOrder !== void 0 && depOrder >= t.order) {
421
- errors.push(`"${t.title}" is ordered before its dependency; move the dependency earlier`);
422
- }
423
- }
424
- }
425
- }
426
- return errors.length ? { ok: false, tasks: currentTasks, errors, summary: [] } : { ok: true, tasks, errors: [], summary };
427
- }
428
-
429
- // src/services/researchStepSummary.ts
430
- function ellipsize(text, max) {
431
- const oneLine = text.replace(/\s+/g, " ").trim();
432
- return oneLine.length > max ? `${oneLine.slice(0, max)}\u2026` : oneLine;
433
- }
434
- function summarizeToolCall(tool, argsJson, toolLabel) {
435
- const display = toolLabel?.trim() || tool;
436
- if (tool === "agent_tool") {
437
- try {
438
- const args = JSON.parse(argsJson);
439
- const hint = args.path ?? args.file_path ?? args.filePath ?? args.pattern ?? args.query ?? args.url ?? args.command;
440
- if (hint) return `${display} ${ellipsize(String(hint), 50)}`;
441
- } catch {
442
- }
443
- return display;
444
- }
445
- if (tool === "spawn_research_agent") {
446
- try {
447
- const args = JSON.parse(argsJson);
448
- const prompt = typeof args.prompt === "string" ? args.prompt : "";
449
- const oneLine = prompt.replace(/\s+/g, " ").trim();
450
- return `spawn: "${oneLine.slice(0, 60)}${oneLine.length > 60 ? "\u2026" : ""}"`;
451
- } catch {
452
- return "spawn_research_agent";
453
- }
454
- }
455
- try {
456
- const args = JSON.parse(argsJson);
457
- if (tool === "find_symbol" && args.symbol) {
458
- return `find_symbol ${args.symbol}${args.language ? ` [${args.language}]` : ""}`;
459
- }
460
- if (tool === "web_search" && args.query) {
461
- return `web_search "${ellipsize(String(args.query), 50)}"`;
462
- }
463
- if (tool === "fetch" && args.url) {
464
- return `fetch ${ellipsize(String(args.url), 60)}`;
465
- }
466
- if (tool === "glob" && args.pattern) {
467
- return `glob ${ellipsize(String(args.pattern), 50)}`;
468
- }
469
- if (tool === "grep" && args.pattern) {
470
- const mode = args.output_mode && args.output_mode !== "content" ? ` (${args.output_mode})` : "";
471
- const scope = args.include ? ` in ${args.include}` : "";
472
- return `grep ${ellipsize(String(args.pattern), 40)}${scope}${mode}`;
473
- }
474
- const path = args.filePath || args.file_path || args.path;
475
- if (path) {
476
- const basename = String(path).split("/").pop() || String(path);
477
- return `${display} ${basename}`;
478
- }
479
- if (args.pattern) {
480
- return `${display} ${args.pattern}`;
481
- }
482
- if (args.command) {
483
- return `bash: ${String(args.command).slice(0, 40)}`;
484
- }
485
- } catch {
486
- }
487
- return display;
488
- }
489
- function classifyOutcome(success, output) {
490
- if (!success) {
491
- if (/^Command refused:/.test(output) || /is not available\. You are a read-only research subagent/.test(output)) return "refused";
492
- if (/not approved/i.test(output) || /^Access denied:/.test(output) || /needs user approval/i.test(output)) return "denied";
493
- return "failure";
494
- }
495
- return "success";
496
- }
497
-
498
- export {
499
- textHasTaskOps,
500
- parseTaskOpsJson,
501
- canMergeTasks,
502
- dependentsOf,
503
- dependencyCandidates,
504
- canSetDependencies,
505
- canSplitTask,
506
- applyTaskOps,
507
- summarizeToolCall,
508
- classifyOutcome
509
- };
510
- //# sourceMappingURL=chunk-4KIWPW4K.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/TaskOps.ts","../src/services/researchStepSummary.ts"],"sourcesContent":["import {\n Task, RunnerId, flattenTasks,\n addTaskToPlan, removeTaskFromPlan, updateTaskInPlan, renumberTasks,\n createTask,\n} from '../models/Task';\nimport { extractObjectsWithKey, stripTrailingCommas, escapeControlCharsInStrings, PlanParseError, TASK_OPS_ENVELOPE_KEY } from './JsonExtractor';\n\n/**\n * Targeted task edits emitted by the planner conversation (the 'task_ops'\n * ConversationTurn). Task references accept a task id, a \"#<order>\" ref, or a\n * bare order number — cheap models rarely echo UUIDs correctly.\n */\nexport type TaskOp =\n | { op: 'update'; taskId: string; changes: Partial<Task> }\n | { op: 'add'; task: Partial<Task> }\n | { op: 'remove'; taskId: string }\n | { op: 'reorder'; taskIds: string[] }\n | { op: 'merge'; taskIds: string[]; merged: Partial<Task> }\n | { op: 'split'; taskId: string; parts: Partial<Task>[] };\n\n/** Fields the planner may change on an existing task. Everything else (id, status, verdict…) is system-owned. */\nconst UPDATABLE_FIELDS: (keyof Task)[] = [\n 'title', 'description', 'prompt', 'dependencies', 'assignedRunner', 'assignedModel', 'taskMode', 'thinkingEffort', 'type', 'userSteps', 'autonomy',\n];\n\nexport function textHasTaskOps(text: string): boolean {\n return text.includes(`\"${TASK_OPS_ENVELOPE_KEY}\"`);\n}\n\n/** Parse a `{\"taskOps\":[...]}` reply. Throws PlanParseError when the JSON is unusable. */\nexport function parseTaskOpsJson(text: string): TaskOp[] {\n // Extract by the taskOps key specifically — a reply may also carry a\n // tasks-keyed object (schema echo, example), which must not shadow the ops.\n // Candidates are tried back to front: the last emission is the final answer.\n const { matches, fallback } = extractObjectsWithKey(text, TASK_OPS_ENVELOPE_KEY);\n const candidates = matches.length > 0 ? [...matches].reverse() : [fallback.json];\n\n let lastError: PlanParseError | null = null;\n for (const json of candidates) {\n try {\n return parseTaskOpsObject(json, text);\n } catch (err) {\n if (!(err instanceof PlanParseError)) throw err;\n if (!lastError) lastError = err;\n }\n }\n throw lastError ?? new PlanParseError('No JSON object found in task-ops reply', text);\n}\n\nfunction parseTaskOpsObject(json: string, text: string): TaskOp[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(escapeControlCharsInStrings(stripTrailingCommas(json)));\n } catch (err) {\n throw new PlanParseError(`Task-ops JSON is invalid: ${err instanceof Error ? err.message : String(err)}`, text);\n }\n const ops = (parsed as { taskOps?: unknown }).taskOps;\n if (!Array.isArray(ops) || ops.length === 0) {\n throw new PlanParseError('\"taskOps\" must be a non-empty array', text);\n }\n for (const op of ops) {\n if (typeof op !== 'object' || op === null || typeof (op as { op?: unknown }).op !== 'string') {\n throw new PlanParseError('Every task op needs an \"op\" field (update | add | remove | reorder | merge | split)', text);\n }\n }\n return ops as TaskOp[];\n}\n\n/** Resolve a task reference (id, \"#3\", or \"3\") against the current tasks. */\nfunction resolveRef(ref: unknown, tasks: Task[]): Task | undefined {\n if (typeof ref !== 'string' && typeof ref !== 'number') return undefined;\n const s = String(ref).trim();\n const byId = tasks.find((t) => t.id === s);\n if (byId) return byId;\n const orderStr = s.startsWith('#') ? s.slice(1) : s;\n if (/^\\d+$/.test(orderStr)) {\n const order = Number(orderStr);\n const byOrder = tasks.filter((t) => t.order === order);\n if (byOrder.length === 1) return byOrder[0];\n }\n return tasks.find((t) => t.title === s);\n}\n\nfunction detectCycle(tasks: Task[]): string | null {\n const byId = new Map(tasks.map((t) => [t.id, t]));\n const visiting = new Set<string>();\n const done = new Set<string>();\n const visit = (id: string): string | null => {\n if (done.has(id)) return null;\n if (visiting.has(id)) return id;\n visiting.add(id);\n for (const dep of byId.get(id)?.dependencies ?? []) {\n const hit = visit(dep);\n if (hit) return hit;\n }\n visiting.delete(id);\n done.add(id);\n return null;\n };\n for (const t of tasks) {\n const hit = visit(t.id);\n if (hit) return byId.get(hit)?.title ?? hit;\n }\n return null;\n}\n\nexport interface ApplyTaskOpsResult {\n ok: boolean;\n tasks: Task[];\n errors: string[];\n /** Human-readable summary of what changed, for the chat transcript. */\n summary: string[];\n}\n\n/**\n * Pre-flight check for a merge: would collapsing the selected tasks into one\n * (rewiring every dependent of any selected task to the survivor) keep the\n * dependency graph valid? Rejects locked tasks and merges whose rewiring would\n * introduce a cycle or an order-violating dependency. Consecutiveness in\n * display order is NOT checked here — that is a UI concern; this validates the\n * structural compatibility the issue calls out.\n */\nexport function canMergeTasks(tasks: Task[], selectedIds: string[]): { ok: boolean; error?: string } {\n if (selectedIds.length < 2) return { ok: false, error: 'Select at least two tasks to merge' };\n const idSet = new Set(selectedIds);\n const toMerge = tasks.filter((t) => idSet.has(t.id));\n if (toMerge.length < 2) return { ok: false, error: 'At least two valid tasks are required to merge' };\n for (const t of toMerge) {\n if (t.status === 'in_progress') return { ok: false, error: `\"${t.title}\" is running and cannot be merged` };\n if (t.status === 'completed') return { ok: false, error: `\"${t.title}\" is completed and cannot be merged` };\n }\n const ordered = [...toMerge].sort((a, b) => a.order - b.order);\n const survivorId = '__merge_sim__';\n const sim: Task[] = tasks\n .filter((t) => !idSet.has(t.id))\n .map((t) => ({ ...t, dependencies: t.dependencies.map((d) => (idSet.has(d) ? survivorId : d)).filter((d) => d !== t.id) }));\n const unionDeps = [...new Set(toMerge.flatMap((t) => t.dependencies))].filter((d) => !idSet.has(d));\n sim.push({ ...ordered[0], id: survivorId, title: '__merge_sim__', order: ordered[0].order, dependencies: unionDeps });\n const cycle = detectCycle(sim);\n if (cycle) return { ok: false, error: `Merging would create a dependency cycle involving \"${cycle}\"` };\n const orderById = new Map(sim.map((t) => [t.id, t.order]));\n for (const t of sim) {\n for (const dep of t.dependencies) {\n const depOrder = orderById.get(dep);\n if (depOrder !== undefined && depOrder >= t.order) {\n return { ok: false, error: 'Merging would break task ordering — a dependency of the merged set comes after it' };\n }\n }\n }\n return { ok: true };\n}\n\n/**\n * The shape the dependency helpers below read. Structural rather than `Task`,\n * because the TUI projects tasks into its own `TaskView`: a surface's\n * dependency picker and the API's validation must agree on which dependencies\n * are legal, and a signature only core can satisfy would have forced the TUI\n * to keep a second copy of the rule.\n */\nexport interface TaskRef {\n id: string;\n order: number;\n title: string;\n dependencies: string[];\n}\n\n/** The tasks listing `taskId` as a dependency — exactly what removing it detaches. */\nexport function dependentsOf<T extends Pick<TaskRef, 'id' | 'dependencies'>>(tasks: T[], taskId: string): T[] {\n return tasks.filter((t) => t.id !== taskId && t.dependencies.includes(taskId));\n}\n\n/**\n * The tasks that may become dependencies of `taskId`: those displayed before it.\n *\n * Offering only earlier tasks is what keeps a hand-edited graph valid without a\n * cycle check — dependencies then only ever point backwards in display order,\n * the same invariant `applyTaskOps` enforces. Omit `taskId` for a task that does\n * not exist yet: it lands last, so every current task is a candidate.\n */\nexport function dependencyCandidates<T extends Pick<TaskRef, 'id' | 'order'>>(tasks: T[], taskId?: string): T[] {\n if (!taskId) return [...tasks];\n const target = tasks.find((t) => t.id === taskId);\n return target ? tasks.filter((t) => t.order < target.order) : [];\n}\n\n/** Pre-flight check for a hand-edited dependency list: every id exists and comes earlier. */\nexport function canSetDependencies<T extends TaskRef>(\n tasks: T[],\n taskId: string,\n dependencies: string[],\n): { ok: boolean; error?: string } {\n const target = tasks.find((t) => t.id === taskId);\n if (!target) return { ok: false, error: 'Task not found' };\n const allowed = new Set(dependencyCandidates(tasks, taskId).map((t) => t.id));\n for (const dep of dependencies) {\n if (dep === taskId) return { ok: false, error: `\"${target.title}\" cannot depend on itself` };\n const found = tasks.find((t) => t.id === dep);\n if (!found) return { ok: false, error: `Unknown dependency \"${dep}\"` };\n if (!allowed.has(dep)) {\n return { ok: false, error: `\"${target.title}\" cannot depend on \"${found.title}\", which comes after it in the plan` };\n }\n }\n return { ok: true };\n}\n\n/** Pre-flight check for a split: the task exists and is not locked by execution. */\nexport function canSplitTask(tasks: Task[], taskId: string): { ok: boolean; error?: string } {\n const target = tasks.find((t) => t.id === taskId);\n if (!target) return { ok: false, error: 'Task not found' };\n if (target.status === 'in_progress') return { ok: false, error: `\"${target.title}\" is running and cannot be split` };\n if (target.status === 'completed') return { ok: false, error: `\"${target.title}\" is completed and cannot be split` };\n return { ok: true };\n}\n\n/**\n * Apply task ops to a snapshot of the plan, atomically: either every op\n * applies and the result validates (deps resolve, no cycles, running and\n * completed tasks untouched), or nothing is returned and `errors` explains\n * why. The caller commits `tasks` on ok.\n */\nexport function applyTaskOps(currentTasks: Task[], ops: TaskOp[], runners: RunnerId[]): ApplyTaskOpsResult {\n let tasks: Task[] = JSON.parse(JSON.stringify(currentTasks));\n const errors: string[] = [];\n const summary: string[] = [];\n\n const resolveDeps = (deps: unknown): { ids: string[]; bad: string[] } => {\n const ids: string[] = [];\n const bad: string[] = [];\n for (const d of Array.isArray(deps) ? deps : []) {\n const t = resolveRef(d, flattenTasks(tasks));\n if (t) ids.push(t.id);\n else bad.push(String(d));\n }\n return { ids, bad };\n };\n\n for (const [i, op] of ops.entries()) {\n const label = `op ${i + 1} (${op.op})`;\n switch (op.op) {\n case 'update': {\n const target = resolveRef(op.taskId, flattenTasks(tasks));\n if (!target) { errors.push(`${label}: task \"${op.taskId}\" not found`); break; }\n if (target.status === 'in_progress') { errors.push(`${label}: \"${target.title}\" is running and cannot be modified`); break; }\n if (target.status === 'completed') { errors.push(`${label}: \"${target.title}\" is completed and cannot be modified`); break; }\n const changes: Partial<Task> = {};\n for (const key of UPDATABLE_FIELDS) {\n if (op.changes && key in op.changes) (changes as Record<string, unknown>)[key] = (op.changes as Record<string, unknown>)[key];\n }\n if ('dependencies' in changes) {\n const { ids, bad } = resolveDeps(changes.dependencies);\n if (bad.length) { errors.push(`${label}: unknown dependencies: ${bad.join(', ')}`); break; }\n changes.dependencies = ids.filter((id) => id !== target.id);\n }\n if (changes.assignedRunner && !runners.includes(changes.assignedRunner)) {\n errors.push(`${label}: runner \"${changes.assignedRunner}\" is not in this plan's runner set [${runners.join(', ')}]`);\n break;\n }\n if (Object.keys(changes).length === 0) { errors.push(`${label}: no valid changes provided`); break; }\n tasks = updateTaskInPlan(tasks, target.id, changes);\n summary.push(`Updated \"${target.title}\" (${Object.keys(changes).join(', ')})`);\n break;\n }\n case 'add': {\n const spec = op.task ?? {};\n if (!spec.title) { errors.push(`${label}: new task needs a title`); break; }\n const { ids, bad } = resolveDeps(spec.dependencies);\n if (bad.length) { errors.push(`${label}: unknown dependencies: ${bad.join(', ')}`); break; }\n const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : runners[0];\n tasks = addTaskToPlan(tasks, {\n ...spec,\n id: undefined,\n dependencies: ids,\n assignedRunner: runner,\n description: spec.description ?? spec.title,\n prompt: spec.prompt ?? spec.description ?? spec.title,\n });\n summary.push(`Added \"${spec.title}\"`);\n break;\n }\n case 'remove': {\n const target = resolveRef(op.taskId, flattenTasks(tasks));\n if (!target) { errors.push(`${label}: task \"${op.taskId}\" not found`); break; }\n if (target.status === 'in_progress') { errors.push(`${label}: \"${target.title}\" is running and cannot be removed`); break; }\n if (target.status === 'completed') { errors.push(`${label}: \"${target.title}\" is completed and cannot be removed`); break; }\n tasks = removeTaskFromPlan(tasks, target.id);\n summary.push(`Removed \"${target.title}\"`);\n break;\n }\n case 'reorder': {\n const resolved = (op.taskIds ?? []).map((r) => resolveRef(r, tasks));\n if (resolved.some((t) => !t)) { errors.push(`${label}: unknown task in reorder list`); break; }\n const orderIds = resolved.map((t) => t!.id);\n if (new Set(orderIds).size !== tasks.length) {\n errors.push(`${label}: reorder must list every top-level task exactly once (${tasks.length} tasks)`);\n break;\n }\n const byId = new Map(tasks.map((t) => [t.id, t]));\n tasks = renumberTasks(orderIds.map((id) => byId.get(id)!));\n summary.push('Reordered tasks');\n break;\n }\n case 'merge': {\n const resolved = (op.taskIds ?? []).map((r) => resolveRef(r, tasks));\n if (resolved.some((t) => !t)) { errors.push(`${label}: unknown task in merge list`); break; }\n const toMerge = resolved.map((t) => t!).sort((a, b) => a.order - b.order);\n if (toMerge.length < 2) { errors.push(`${label}: merge needs at least two tasks`); break; }\n const locked = toMerge.find((t) => t.status === 'in_progress' || t.status === 'completed');\n if (locked) {\n errors.push(`${label}: \"${locked.title}\" is ${locked.status === 'in_progress' ? 'running' : 'completed'} and cannot be merged`);\n break;\n }\n const idSet = new Set(toMerge.map((t) => t.id));\n const unionDepsRaw = [...new Set(toMerge.flatMap((t) => t.dependencies))].filter((d) => !idSet.has(d));\n const { ids, bad } = resolveDeps(unionDepsRaw);\n if (bad.length) { errors.push(`${label}: unknown dependencies: ${bad.join(', ')}`); break; }\n const spec = op.merged ?? {};\n if (!spec.title) { errors.push(`${label}: merged task needs a title`); break; }\n const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : toMerge[0].assignedRunner;\n const mergedTask = createTask({\n title: spec.title,\n description: spec.description ?? toMerge.map((t) => t.description).filter(Boolean).join('\\n\\n'),\n prompt: spec.prompt ?? (toMerge.map((t) => t.prompt).filter(Boolean).join('\\n\\n---\\n\\n') || undefined),\n type: spec.type ?? (toMerge.some((t) => t.type === 'user') ? 'user' : 'ai'),\n dependencies: ids,\n assignedRunner: runner,\n assignedModel: spec.assignedModel ?? toMerge.find((t) => t.assignedModel)?.assignedModel,\n thinkingEffort: spec.thinkingEffort ?? toMerge.find((t) => t.thinkingEffort)?.thinkingEffort,\n taskMode: spec.taskMode ?? toMerge[0].taskMode,\n autonomy: spec.autonomy ?? toMerge.find((t) => t.autonomy)?.autonomy,\n sliceType: spec.sliceType ?? toMerge.find((t) => t.sliceType)?.sliceType,\n userStoriesCovered: spec.userStoriesCovered ?? (toMerge.flatMap((t) => t.userStoriesCovered ?? []).length\n ? [...new Set(toMerge.flatMap((t) => t.userStoriesCovered ?? []))]\n : undefined),\n });\n const mergedId = mergedTask.id;\n const firstId = toMerge[0].id;\n const result: Task[] = [];\n let inserted = false;\n for (const t of tasks) {\n if (idSet.has(t.id)) {\n if (!inserted && t.id === firstId) { result.push(mergedTask); inserted = true; }\n continue;\n }\n result.push({ ...t, dependencies: t.dependencies.map((d) => (idSet.has(d) ? mergedId : d)) });\n }\n if (!inserted) result.push(mergedTask);\n tasks = renumberTasks(result);\n summary.push(`Merged ${toMerge.length} tasks into \"${spec.title}\"`);\n break;\n }\n case 'split': {\n const target = resolveRef(op.taskId, tasks);\n if (!target) { errors.push(`${label}: task \"${op.taskId}\" not found`); break; }\n if (target.status === 'in_progress') { errors.push(`${label}: \"${target.title}\" is running and cannot be split`); break; }\n if (target.status === 'completed') { errors.push(`${label}: \"${target.title}\" is completed and cannot be split`); break; }\n const parts = op.parts ?? [];\n if (parts.length < 2) { errors.push(`${label}: split needs at least two parts`); break; }\n const newTasks: Task[] = [];\n let prevId: string | undefined;\n let buildError = false;\n for (let i = 0; i < parts.length; i++) {\n const spec = parts[i];\n if (!spec || !spec.title) { errors.push(`${label}: split part ${i + 1} needs a title`); buildError = true; break; }\n // Part 0 inherits the original's (external) dependencies, resolved\n // against the current plan. Later parts chain onto the previous part\n // — a sibling id created in this same op, so it needs no resolution.\n let deps: string[];\n if (i === 0) {\n const { ids, bad } = resolveDeps(target.dependencies);\n if (bad.length) { errors.push(`${label}: split part 1 unknown dependencies: ${bad.join(', ')}`); buildError = true; break; }\n deps = ids;\n } else {\n deps = prevId ? [prevId] : [];\n }\n const runner = spec.assignedRunner && runners.includes(spec.assignedRunner) ? spec.assignedRunner : target.assignedRunner;\n const nt = createTask({\n title: spec.title,\n description: spec.description ?? spec.title,\n prompt: spec.prompt ?? spec.description ?? spec.title,\n type: spec.type ?? target.type,\n dependencies: deps,\n assignedRunner: runner,\n assignedModel: spec.assignedModel ?? target.assignedModel,\n taskMode: spec.taskMode ?? target.taskMode,\n autonomy: spec.autonomy ?? target.autonomy,\n sliceType: spec.sliceType ?? target.sliceType,\n userStoriesCovered: spec.userStoriesCovered ?? target.userStoriesCovered,\n });\n newTasks.push(nt);\n prevId = nt.id;\n }\n if (buildError) break;\n const tailId = newTasks[newTasks.length - 1].id;\n const result: Task[] = [];\n for (const t of tasks) {\n if (t.id === target.id) { result.push(...newTasks); continue; }\n result.push({ ...t, dependencies: t.dependencies.map((d) => (d === target.id ? tailId : d)) });\n }\n tasks = renumberTasks(result);\n summary.push(`Split \"${target.title}\" into ${newTasks.length} tasks`);\n break;\n }\n default:\n errors.push(`${label}: unknown op \"${(op as { op: string }).op}\"`);\n }\n if (errors.length) break;\n }\n\n if (!errors.length) {\n const flat = flattenTasks(tasks);\n const idSet = new Set(flat.map((t) => t.id));\n for (const t of flat) {\n for (const dep of t.dependencies) {\n if (!idSet.has(dep)) errors.push(`\"${t.title}\" depends on a task that no longer exists (${dep})`);\n }\n }\n const cycleAt = detectCycle(flat);\n if (cycleAt) errors.push(`Dependency cycle detected involving \"${cycleAt}\"`);\n // Order must respect dependencies. This is the only enforcer of that\n // invariant now that no surface can reposition a task by hand.\n const orderById = new Map(tasks.map((t) => [t.id, t.order]));\n for (const t of tasks) {\n for (const dep of t.dependencies) {\n const depOrder = orderById.get(dep);\n if (depOrder !== undefined && depOrder >= t.order) {\n errors.push(`\"${t.title}\" is ordered before its dependency; move the dependency earlier`);\n }\n }\n }\n }\n\n return errors.length\n ? { ok: false, tasks: currentTasks, errors, summary: [] }\n : { ok: true, tasks, errors: [], summary };\n}\n","import type { ResearchStepOutcome } from '../models/Task';\n\n/**\n * One-line human summary of a research tool call, shared by every surface that\n * renders live planner progress (VS Code webview, CLI, TUI). Kept in core so\n * the arg-shape heuristics (file path vs. pattern vs. shell command) live in\n * one place instead of being re-derived per surface — which also means a new\n * tool becomes readable in all three UIs by being handled here once.\n */\n\nfunction ellipsize(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, ' ').trim();\n return oneLine.length > max ? `${oneLine.slice(0, max)}…` : oneLine;\n}\n\n/**\n * @param toolLabel The agent's own name for the tool, when a harness planner\n * produced the call (ADR-0009). It replaces the member name in the summary, so\n * the timeline says `Edit` rather than the catch-all `agent_tool` — and says\n * `WebFetch` rather than claiming a shell command ran.\n */\nexport function summarizeToolCall(tool: string, argsJson: string, toolLabel?: string): string {\n const display = toolLabel?.trim() || tool;\n if (tool === 'agent_tool') {\n // No Ordewell equivalent, so no arg shape to rely on: show the agent's name\n // plus whichever conventional field the call happens to carry.\n try {\n const args = JSON.parse(argsJson);\n const hint = args.path ?? args.file_path ?? args.filePath ?? args.pattern ?? args.query ?? args.url ?? args.command;\n if (hint) return `${display} ${ellipsize(String(hint), 50)}`;\n } catch {\n // fall through to the bare name\n }\n return display;\n }\n\n if (tool === 'spawn_research_agent') {\n try {\n const args = JSON.parse(argsJson);\n const prompt = typeof args.prompt === 'string' ? args.prompt : '';\n const oneLine = prompt.replace(/\\s+/g, ' ').trim();\n return `spawn: \"${oneLine.slice(0, 60)}${oneLine.length > 60 ? '…' : ''}\"`;\n } catch {\n return 'spawn_research_agent';\n }\n }\n\n try {\n const args = JSON.parse(argsJson);\n\n // Ordered by specificity: a tool's defining argument wins over the generic\n // `path`, which several of the newer tools also accept as a search root.\n if (tool === 'find_symbol' && args.symbol) {\n return `find_symbol ${args.symbol}${args.language ? ` [${args.language}]` : ''}`;\n }\n if (tool === 'web_search' && args.query) {\n return `web_search \"${ellipsize(String(args.query), 50)}\"`;\n }\n if (tool === 'fetch' && args.url) {\n return `fetch ${ellipsize(String(args.url), 60)}`;\n }\n // The pattern is what a glob is about; the generic `path` below is only its\n // search root, and reporting that read as \"glob src\" for every call.\n if (tool === 'glob' && args.pattern) {\n return `glob ${ellipsize(String(args.pattern), 50)}`;\n }\n if (tool === 'grep' && args.pattern) {\n const mode = args.output_mode && args.output_mode !== 'content' ? ` (${args.output_mode})` : '';\n const scope = args.include ? ` in ${args.include}` : '';\n return `grep ${ellipsize(String(args.pattern), 40)}${scope}${mode}`;\n }\n\n const path = args.filePath || args.file_path || args.path;\n if (path) {\n const basename = String(path).split('/').pop() || String(path);\n return `${display} ${basename}`;\n }\n if (args.pattern) {\n return `${display} ${args.pattern}`;\n }\n if (args.command) {\n return `bash: ${String(args.command).slice(0, 40)}`;\n }\n } catch {\n // fall through to the bare tool name below\n }\n return display;\n}\n\n/**\n * Classify a tool outcome from its result text and success flag, so a surface\n * can render a refused `rm` or a denied `npm test` distinctly from a\n * successful run without re-deriving the refusal signatures per surface. The\n * refusal/denial strings come from `commandPolicy.ts`, `BaseFileSystem.ts`,\n * and the research-subagent wrapper — keeping the matching here means the\n * signatures stay in one place alongside the human summary.\n */\nexport function classifyOutcome(success: boolean, output: string): ResearchStepOutcome {\n if (!success) {\n if (/^Command refused:/.test(output) || /is not available\\. You are a read-only research subagent/.test(output)) return 'refused';\n if (/not approved/i.test(output) || /^Access denied:/.test(output) || /needs user approval/i.test(output)) return 'denied';\n return 'failure';\n }\n return 'success';\n}\n"],"mappings":"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","names":["i"]}