@ordewell/core 0.7.0 → 0.7.2

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 (55) hide show
  1. package/dist/{IFileSystem-DgpX0BU7.d.mts → IFileSystem-B5asBRDa.d.mts} +1 -1
  2. package/dist/{IFileSystem-D4ADfTrX.d.ts → IFileSystem-CbCmUDBn.d.ts} +1 -1
  3. package/dist/{ModeResolver-Cv01ZDd9.d.mts → ModeResolver-DcqAho4y.d.mts} +1 -1
  4. package/dist/{ModeResolver-BEcRAz1c.d.ts → ModeResolver-DtfhWeVL.d.ts} +1 -1
  5. package/dist/{Task-CoKhvBa1.d.mts → Task-BpzIbunq.d.mts} +146 -22
  6. package/dist/{Task-CoKhvBa1.d.ts → Task-BpzIbunq.d.ts} +146 -22
  7. package/dist/{chunk-LSGY7AIZ.mjs → chunk-AJ5KDO6V.mjs} +219 -77
  8. package/dist/chunk-AJ5KDO6V.mjs.map +1 -0
  9. package/dist/chunk-H5O74L77.mjs +185 -0
  10. package/dist/chunk-H5O74L77.mjs.map +1 -0
  11. package/dist/{chunk-YU4UKKKI.mjs → chunk-MZYZS7B3.mjs} +14 -186
  12. package/dist/chunk-MZYZS7B3.mjs.map +1 -0
  13. package/dist/{chunk-J3YSTPCE.mjs → chunk-OUIQWNS3.mjs} +8 -5
  14. package/dist/chunk-OUIQWNS3.mjs.map +1 -0
  15. package/dist/{chunk-N66ZHFGN.mjs → chunk-OYUSADFM.mjs} +11 -1
  16. package/dist/chunk-OYUSADFM.mjs.map +1 -0
  17. package/dist/{chunk-HPNUFBIT.mjs → chunk-V3JHS7AX.mjs} +9 -1
  18. package/dist/chunk-V3JHS7AX.mjs.map +1 -0
  19. package/dist/index.d.mts +909 -459
  20. package/dist/index.d.ts +909 -459
  21. package/dist/index.js +5671 -3776
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +5548 -3795
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/order-labels.d.mts +15 -2
  26. package/dist/order-labels.d.ts +15 -2
  27. package/dist/order-labels.js +12 -2
  28. package/dist/order-labels.js.map +1 -1
  29. package/dist/order-labels.mjs +7 -3
  30. package/dist/{parsing-DMdOq-BV.d.ts → parsing-COFGUEWx.d.ts} +2 -2
  31. package/dist/{parsing-B4OCHH1_.d.mts → parsing-D0uo-Icd.d.mts} +2 -2
  32. package/dist/parsing.d.mts +3 -3
  33. package/dist/parsing.d.ts +3 -3
  34. package/dist/parsing.js +6 -3
  35. package/dist/parsing.js.map +1 -1
  36. package/dist/parsing.mjs +4 -3
  37. package/dist/{plan-utils-CD1Xu65s.d.mts → plan-utils-CdW3mxt5.d.mts} +226 -9
  38. package/dist/{plan-utils-BdYPRBno.d.ts → plan-utils-D4Z8UyLL.d.ts} +226 -9
  39. package/dist/plan-utils.d.mts +4 -3
  40. package/dist/plan-utils.d.ts +4 -3
  41. package/dist/plan-utils.js +210 -3
  42. package/dist/plan-utils.js.map +1 -1
  43. package/dist/plan-utils.mjs +44 -3
  44. package/dist/testing.d.mts +17 -5
  45. package/dist/testing.d.ts +17 -5
  46. package/dist/testing.js +50 -3
  47. package/dist/testing.js.map +1 -1
  48. package/dist/testing.mjs +50 -5
  49. package/dist/testing.mjs.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/chunk-HPNUFBIT.mjs.map +0 -1
  52. package/dist/chunk-J3YSTPCE.mjs.map +0 -1
  53. package/dist/chunk-LSGY7AIZ.mjs.map +0 -1
  54. package/dist/chunk-N66ZHFGN.mjs.map +0 -1
  55. package/dist/chunk-YU4UKKKI.mjs.map +0 -1
@@ -21,16 +21,21 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var plan_utils_exports = {};
22
22
  __export(plan_utils_exports, {
23
23
  CHECKPOINT_TRUNCATE_LENGTH: () => CHECKPOINT_TRUNCATE_LENGTH,
24
+ DEFAULT_RUNNERS: () => DEFAULT_RUNNERS,
24
25
  EMPTY_CONVERSATION: () => EMPTY_CONVERSATION,
25
26
  EMPTY_HOLD: () => EMPTY_HOLD,
26
27
  EMPTY_TASK_LOG: () => EMPTY_TASK_LOG,
28
+ NOT_STARTED: () => NOT_STARTED,
27
29
  NO_TURN: () => NO_TURN,
28
30
  aheadOfDraft: () => aheadOfDraft,
31
+ approvalLabel: () => approvalLabel,
32
+ awaitingLabel: () => awaitingLabel,
29
33
  canMergeTasks: () => canMergeTasks,
30
34
  canSetDependencies: () => canSetDependencies,
31
35
  canSplitTask: () => canSplitTask,
32
36
  capConflictFiles: () => capConflictFiles,
33
37
  dependencyCandidates: () => dependencyCandidates,
38
+ dependentsNotice: () => dependentsNotice,
34
39
  dependentsOf: () => dependentsOf,
35
40
  diffRows: () => diffRows,
36
41
  diffStat: () => diffStat,
@@ -40,15 +45,29 @@ __export(plan_utils_exports, {
40
45
  fromTranscript: () => fromTranscript,
41
46
  hasHiddenDetail: () => hasHiddenDetail,
42
47
  holdPrompt: () => holdPrompt,
48
+ isTaskRunning: () => isTaskRunning,
49
+ markAction: () => markAction,
50
+ markRequestFor: () => markRequestFor,
51
+ namedRepos: () => namedRepos,
52
+ newTaskFields: () => newTaskFields,
53
+ opsEditable: () => opsEditable,
43
54
  outputLines: () => outputLines,
44
55
  outputPreview: () => outputPreview,
56
+ pastGateConfirmation: () => pastGateConfirmation,
45
57
  reduceConversation: () => reduceConversation,
46
58
  reduceTaskLog: () => reduceTaskLog,
47
59
  replayTaskLog: () => replayTaskLog,
48
60
  runnerToolSubject: () => runnerToolSubject,
49
61
  stopTurn: () => stopTurn,
50
62
  summarizeToolCall: () => summarizeToolCall,
63
+ taskOrderLabel: () => taskOrderLabel,
64
+ taskRef: () => taskRef,
65
+ taskRowActions: () => taskRowActions,
66
+ taskRowView: () => taskRowView,
51
67
  taskStartedNotice: () => taskStartedNotice,
68
+ taskStatusKind: () => taskStatusKind,
69
+ titledRefs: () => titledRefs,
70
+ titledTaskRef: () => titledTaskRef,
52
71
  toolHeadline: () => toolHeadline,
53
72
  truncateCheckpointSummary: () => truncateCheckpointSummary,
54
73
  unsendAll: () => unsendAll,
@@ -57,7 +76,57 @@ __export(plan_utils_exports, {
57
76
  module.exports = __toCommonJS(plan_utils_exports);
58
77
 
59
78
  // src/services/TaskOps.ts
79
+ var import_uuid2 = require("uuid");
80
+
81
+ // src/models/Task.ts
60
82
  var import_uuid = require("uuid");
83
+
84
+ // src/order-labels.ts
85
+ function taskOrderLabel(task, parent) {
86
+ return parent ? `${parent.order}.${task.order}` : String(task.order);
87
+ }
88
+ function taskRef(task, parent) {
89
+ return `#${taskOrderLabel(task, parent)}`;
90
+ }
91
+ function titledTaskRef(task, parent) {
92
+ return `${taskRef(task, parent)} ${task.title}`;
93
+ }
94
+
95
+ // src/models/Task.ts
96
+ var DEFAULT_RUNNERS = ["claude-code"];
97
+
98
+ // src/taskRow/status.ts
99
+ var isTaskRunning = (task) => task.status === "in_progress" || task.status === "running";
100
+ var NOT_STARTED = /* @__PURE__ */ new Set(["pending", "approved", "blocked"]);
101
+ function taskStatusKind(task) {
102
+ switch (task.status) {
103
+ case "completed":
104
+ return "done";
105
+ case "failed":
106
+ return "failed";
107
+ case "blocked":
108
+ return "blocked";
109
+ case "awaiting_user":
110
+ return "awaiting";
111
+ }
112
+ if (!isTaskRunning(task)) return "todo";
113
+ return task.status === "in_progress" && task.idleSince ? "quiet" : "running";
114
+ }
115
+ var AWAITING_LABELS = {
116
+ input: "Waiting for your input",
117
+ checkpoint: "Checkpoint",
118
+ conflict: "Merge conflict",
119
+ "files-changed": "Changed tracked files"
120
+ };
121
+ function awaitingLabel(task) {
122
+ return task.status === "awaiting_user" && task.awaitingReason ? AWAITING_LABELS[task.awaitingReason] : null;
123
+ }
124
+ function approvalLabel(count) {
125
+ if (!count) return null;
126
+ return count > 1 ? `Waiting for approval (${count})` : "Waiting for approval";
127
+ }
128
+
129
+ // src/services/TaskOps.ts
61
130
  function detectCycle(tasks) {
62
131
  const byId = new Map(tasks.map((t) => [t.id, t]));
63
132
  const visiting = /* @__PURE__ */ new Set();
@@ -1031,9 +1100,25 @@ function endTurn2(view, { reason }) {
1031
1100
  const closed = closeOpenBlocks({ ...view, working: false, lastTurnEnd: reason, streams: {} }, CUT[reason]);
1032
1101
  return reason === "interrupted" ? append(closed, (id) => settledMessage(id, "system", "Interrupted.")) : closed;
1033
1102
  }
1034
- function queueMessage(view, { messageId, text: text2 }) {
1035
- if (view.queued.some((m) => m.id === messageId)) return view;
1036
- return { ...view, queued: [...view.queued, { id: messageId, text: text2 }] };
1103
+ function queueMessage(view, { messageId, text: text2, forced }) {
1104
+ const listed = view.queued.find((m) => m.id === messageId);
1105
+ if (forced) {
1106
+ const rest = view.queued.filter((m) => m !== listed);
1107
+ const at = rest.findIndex((m) => !m.forced);
1108
+ const placed = at < 0 ? rest.length : at;
1109
+ return { ...view, queued: [...rest.slice(0, placed), { id: messageId, text: text2, forced: true }, ...rest.slice(placed)] };
1110
+ }
1111
+ if (!listed) return { ...view, queued: [...view.queued, { id: messageId, text: text2 }] };
1112
+ if (!listed.handedOver) return view;
1113
+ return { ...view, queued: view.queued.map((m) => m === listed ? { id: m.id, text: m.text } : m) };
1114
+ }
1115
+ function handOver(view, { messageId }) {
1116
+ const listed = view.queued.find((m) => m.id === messageId);
1117
+ if (!listed || listed.handedOver) return view;
1118
+ return { ...view, queued: view.queued.map((m) => m === listed ? { ...m, handedOver: true } : m) };
1119
+ }
1120
+ function deliverMidTurn(view, event) {
1121
+ return appendOutput(unqueueMessage(view, event), null, (id) => settledMessage(id, "user", event.text));
1037
1122
  }
1038
1123
  function unqueueMessage(view, { messageId }) {
1039
1124
  const queued = view.queued.filter((m) => m.id !== messageId);
@@ -1067,6 +1152,12 @@ function reduceTaskLog(view, event) {
1067
1152
  return queueMessage(view, event);
1068
1153
  case "message_removed":
1069
1154
  return unqueueMessage(view, event);
1155
+ case "message_handed_over":
1156
+ return handOver(view, event);
1157
+ case "message_delivered":
1158
+ return deliverMidTurn(view, event);
1159
+ case "message_undelivered":
1160
+ return append(unqueueMessage(view, event), (id) => settledMessage(id, "system", `${event.text} \xB7 not delivered`));
1070
1161
  case "error":
1071
1162
  return appendOutput(view, null, (id) => settledMessage(id, "error", event.message));
1072
1163
  case "approval_requested":
@@ -1155,19 +1246,121 @@ function hasHiddenDetail(blocks) {
1155
1246
  function taskStartedNotice(title, runner) {
1156
1247
  return runner ? `Started "${title}" \xB7 ${runner}` : `Started "${title}"`;
1157
1248
  }
1249
+
1250
+ // src/taskRow/actions.ts
1251
+ var UNSTARTED_AI = (t) => t.type === "ai" && NOT_STARTED.has(t.status);
1252
+ var QUEUED = (t) => t.status === "pending" || t.status === "approved";
1253
+ var TASK_RULES = [
1254
+ ["cancel", (t) => t.status === "in_progress"],
1255
+ ["skip", (t) => t.status === "blocked"],
1256
+ ["force-start", UNSTARTED_AI],
1257
+ // A manual task has no runner to report it done, so it can always be marked.
1258
+ ["complete", (t) => t.status === "awaiting_user" || t.type === "user"],
1259
+ ["uncomplete", (t) => t.status === "completed"]
1260
+ ];
1261
+ var SUBTASK_RULES = [
1262
+ ["cancel", (t) => t.status === "in_progress"],
1263
+ ["complete", (t) => t.status === "in_progress" && t.type === "ai"],
1264
+ ["force-start", (t) => t.type === "ai" && QUEUED(t)],
1265
+ ["skip", QUEUED],
1266
+ ["complete", (t) => t.status === "awaiting_user"],
1267
+ ["uncomplete", (t) => t.status === "completed"]
1268
+ ];
1269
+ function taskRowActions(task, placement = "task") {
1270
+ const rules = placement === "subtask" ? SUBTASK_RULES : TASK_RULES;
1271
+ return rules.filter(([, applies]) => applies(task)).map(([action]) => action);
1272
+ }
1273
+ function markAction(task) {
1274
+ return task.status === "completed" ? "uncomplete" : "complete";
1275
+ }
1276
+ function markRequestFor(action) {
1277
+ if (action === "complete" || action === "skip") return "complete";
1278
+ if (action === "uncomplete") return "uncomplete";
1279
+ return null;
1280
+ }
1281
+ function opsEditable(task) {
1282
+ return UNSTARTED_AI(task);
1283
+ }
1284
+
1285
+ // src/taskRow/view.ts
1286
+ var refsOf = (ids, orderOf) => ids.map((id) => {
1287
+ const order = orderOf?.get(id);
1288
+ return order === void 0 ? id : taskRef({ order });
1289
+ });
1290
+ var namedRepo = (repo) => repo && repo !== "." ? repo : null;
1291
+ var namedRepos = (repos) => (repos ?? []).filter((r) => r !== ".");
1292
+ var filesOf = (files) => files?.length ? capConflictFiles(files) : null;
1293
+ function taskRowView(task, context = {}) {
1294
+ const parent = context.parent ?? void 0;
1295
+ const isolation = task.isolation && task.isolation.state !== "none" ? task.isolation : null;
1296
+ return {
1297
+ orderLabel: taskOrderLabel(task, parent),
1298
+ kind: task.type === "user" ? "user" : task.ops ? "ops" : "ai",
1299
+ status: taskStatusKind(task),
1300
+ running: isTaskRunning(task),
1301
+ awaiting: awaitingLabel(task),
1302
+ approvals: approvalLabel(task.awaitingApproval),
1303
+ autonomous: task.type === "ai" && context.modes?.find((m) => m.id === task.taskMode)?.autonomous === true,
1304
+ repos: namedRepos(isolation?.repos),
1305
+ conflict: isolation?.state === "conflict" ? { repo: namedRepo(isolation.conflictRepo), files: filesOf(isolation.conflictFiles) } : null,
1306
+ repairing: isolation?.state === "repairing" ? { files: filesOf(isolation.conflictFiles), attempt: isolation.repair ?? null } : null,
1307
+ repaired: isolation?.repairedFiles?.length ? { files: capConflictFiles(isolation.repairedFiles), landed: isolation.state === "integrated" } : null,
1308
+ mergeGate: task.mergeGate?.length ? refsOf(task.mergeGate, context.orderOf) : null,
1309
+ opsChangedFiles: task.status === "awaiting_user" && task.awaitingReason === "files-changed",
1310
+ forcedPastGate: task.forcedPastGate?.length ? task.forcedPastGate : null,
1311
+ dependencies: refsOf(task.dependencies, context.orderOf),
1312
+ actions: taskRowActions(task, context.placement ?? (parent ? "subtask" : "task")),
1313
+ mark: markAction(task),
1314
+ opsEditable: opsEditable(task)
1315
+ };
1316
+ }
1317
+
1318
+ // src/taskRow/texts.ts
1319
+ function findNamed(tasks, id) {
1320
+ for (const task of tasks) {
1321
+ if (task.id === id) return task;
1322
+ const nested = findNamed(task.subtasks ?? [], id);
1323
+ if (nested) return nested;
1324
+ }
1325
+ return void 0;
1326
+ }
1327
+ function titledRefs(ids, tasks) {
1328
+ return ids.map((id) => {
1329
+ const task = findNamed(tasks, id);
1330
+ return task ? titledTaskRef(task) : id;
1331
+ });
1332
+ }
1333
+ function dependentsNotice(dependents) {
1334
+ if (dependents.length === 0) return null;
1335
+ const subject = dependents.length === 1 ? "1 task depends" : `${dependents.length} tasks depend`;
1336
+ return `${subject} on it and will lose that dependency: ${dependents.map((t) => titledTaskRef(t)).join(", ")}.`;
1337
+ }
1338
+ function pastGateConfirmation(unmerged, subject = "This task") {
1339
+ return `${subject} waits for Merge all: the work of ${unmerged.join(", ")} is not merged into your branch yet, so it would act without it. Starting it now is kept on the task.`;
1340
+ }
1341
+ function newTaskFields(title, prompt) {
1342
+ const name = title.trim();
1343
+ if (!name) return null;
1344
+ return { title: name, description: name, prompt: prompt?.trim() ? prompt : name, type: "ai" };
1345
+ }
1158
1346
  // Annotate the CommonJS export names for ESM import in node:
1159
1347
  0 && (module.exports = {
1160
1348
  CHECKPOINT_TRUNCATE_LENGTH,
1349
+ DEFAULT_RUNNERS,
1161
1350
  EMPTY_CONVERSATION,
1162
1351
  EMPTY_HOLD,
1163
1352
  EMPTY_TASK_LOG,
1353
+ NOT_STARTED,
1164
1354
  NO_TURN,
1165
1355
  aheadOfDraft,
1356
+ approvalLabel,
1357
+ awaitingLabel,
1166
1358
  canMergeTasks,
1167
1359
  canSetDependencies,
1168
1360
  canSplitTask,
1169
1361
  capConflictFiles,
1170
1362
  dependencyCandidates,
1363
+ dependentsNotice,
1171
1364
  dependentsOf,
1172
1365
  diffRows,
1173
1366
  diffStat,
@@ -1177,15 +1370,29 @@ function taskStartedNotice(title, runner) {
1177
1370
  fromTranscript,
1178
1371
  hasHiddenDetail,
1179
1372
  holdPrompt,
1373
+ isTaskRunning,
1374
+ markAction,
1375
+ markRequestFor,
1376
+ namedRepos,
1377
+ newTaskFields,
1378
+ opsEditable,
1180
1379
  outputLines,
1181
1380
  outputPreview,
1381
+ pastGateConfirmation,
1182
1382
  reduceConversation,
1183
1383
  reduceTaskLog,
1184
1384
  replayTaskLog,
1185
1385
  runnerToolSubject,
1186
1386
  stopTurn,
1187
1387
  summarizeToolCall,
1388
+ taskOrderLabel,
1389
+ taskRef,
1390
+ taskRowActions,
1391
+ taskRowView,
1188
1392
  taskStartedNotice,
1393
+ taskStatusKind,
1394
+ titledRefs,
1395
+ titledTaskRef,
1189
1396
  toolHeadline,
1190
1397
  truncateCheckpointSummary,
1191
1398
  unsendAll,