@ordewell/core 0.10.2 → 0.10.3

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 (45) hide show
  1. package/dist/{IFileSystem-j0naIoAQ.d.mts → IFileSystem-B8Nkgg4e.d.mts} +1 -1
  2. package/dist/{IFileSystem-CyTIoiSn.d.ts → IFileSystem-DCd-rkeH.d.ts} +1 -1
  3. package/dist/{IRunner-WwL-Bjqq.d.ts → IRunner-CXdYyIZo.d.mts} +202 -196
  4. package/dist/{IRunner---PfQVdc.d.mts → IRunner-QBdYcatb.d.ts} +202 -196
  5. package/dist/{ModeResolver-DrMU-5lw.d.ts → ModeResolver-BOU90Nn-.d.ts} +1 -1
  6. package/dist/{ModeResolver-CjQ7zqTN.d.mts → ModeResolver-geqjKkLY.d.mts} +1 -1
  7. package/dist/{Task-AfA1m4qW.d.mts → Task-CRVIqSfy.d.mts} +24 -5
  8. package/dist/{Task-AfA1m4qW.d.ts → Task-CRVIqSfy.d.ts} +24 -5
  9. package/dist/{chunk-4FEARWTS.mjs → chunk-645FALZX.mjs} +5 -5
  10. package/dist/chunk-645FALZX.mjs.map +1 -0
  11. package/dist/{chunk-3LNZDBCX.mjs → chunk-A57ITQE7.mjs} +35 -16
  12. package/dist/chunk-A57ITQE7.mjs.map +1 -0
  13. package/dist/{chunk-UQGR3UCA.mjs → chunk-FH6M5QZG.mjs} +136 -122
  14. package/dist/chunk-FH6M5QZG.mjs.map +1 -0
  15. package/dist/{chunk-CIL3BQIF.mjs → chunk-SM6BV6XS.mjs} +17 -3
  16. package/dist/chunk-SM6BV6XS.mjs.map +1 -0
  17. package/dist/index.d.mts +417 -39
  18. package/dist/index.d.ts +417 -39
  19. package/dist/index.js +2478 -1473
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +10702 -9753
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/parsing.d.mts +2 -2
  24. package/dist/parsing.d.ts +2 -2
  25. package/dist/parsing.js +12 -12
  26. package/dist/parsing.js.map +1 -1
  27. package/dist/parsing.mjs +3 -3
  28. package/dist/{plan-utils-DL7yOuJs.d.mts → plan-utils-KU1Rse82.d.mts} +1292 -1147
  29. package/dist/{plan-utils-gpeqV-Lp.d.ts → plan-utils-oC8bO4pN.d.ts} +1292 -1147
  30. package/dist/plan-utils.d.mts +4 -4
  31. package/dist/plan-utils.d.ts +4 -4
  32. package/dist/plan-utils.js +16 -0
  33. package/dist/plan-utils.js.map +1 -1
  34. package/dist/plan-utils.mjs +7 -3
  35. package/dist/testing.d.mts +3 -3
  36. package/dist/testing.d.ts +3 -3
  37. package/dist/testing.js +3 -1
  38. package/dist/testing.js.map +1 -1
  39. package/dist/testing.mjs +4 -2
  40. package/dist/testing.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/chunk-3LNZDBCX.mjs.map +0 -1
  43. package/dist/chunk-4FEARWTS.mjs.map +0 -1
  44. package/dist/chunk-CIL3BQIF.mjs.map +0 -1
  45. package/dist/chunk-UQGR3UCA.mjs.map +0 -1
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  NOT_STARTED,
3
+ WAITS_FOR_APPROVAL_LABEL,
3
4
  approvalLabel,
4
5
  awaitingLabel,
5
6
  isTaskRunning,
6
7
  resumeLabel,
7
8
  taskStatusKind
8
- } from "./chunk-3LNZDBCX.mjs";
9
+ } from "./chunk-A57ITQE7.mjs";
9
10
  import {
10
11
  pausedOnLimit,
11
12
  rejoinPlanTree,
@@ -13,7 +14,7 @@ import {
13
14
  taskRefOf,
14
15
  titledTaskRef,
15
16
  titledTaskRefOf
16
- } from "./chunk-CIL3BQIF.mjs";
17
+ } from "./chunk-SM6BV6XS.mjs";
17
18
 
18
19
  // src/models/Usage.ts
19
20
  function partedPromptUsage(parts) {
@@ -800,78 +801,20 @@ function replayTaskLog(events, from = EMPTY_TASK_LOG) {
800
801
  return events.reduce(reduceTaskLog, from);
801
802
  }
802
803
 
803
- // src/services/conflictFiles.ts
804
- function capConflictFiles(files, max = 5) {
805
- return files.length <= max ? files.join(", ") : `${files.slice(0, max).join(", ")}, +${files.length - max} more`;
806
- }
807
-
808
- // src/services/researchStepSummary.ts
809
- function ellipsize(text2, max) {
810
- const oneLine2 = text2.replace(/\s+/g, " ").trim();
811
- return oneLine2.length > max ? `${oneLine2.slice(0, max)}\u2026` : oneLine2;
812
- }
813
- function summarizeToolCall(tool, argsJson, toolLabel) {
814
- const display = toolLabel?.trim() || tool;
815
- if (tool === "agent_tool") {
816
- try {
817
- const args = JSON.parse(argsJson);
818
- const hint = args.path ?? args.file_path ?? args.filePath ?? args.pattern ?? args.query ?? args.url ?? args.command;
819
- if (hint) return `${display} ${ellipsize(String(hint), 50)}`;
820
- } catch {
821
- }
822
- return display;
823
- }
824
- if (tool === "spawn_research_agent") {
825
- try {
826
- const args = JSON.parse(argsJson);
827
- const prompt = typeof args.prompt === "string" ? args.prompt : "";
828
- const oneLine2 = prompt.replace(/\s+/g, " ").trim();
829
- return `spawn: "${oneLine2.slice(0, 60)}${oneLine2.length > 60 ? "\u2026" : ""}"`;
830
- } catch {
831
- return "spawn_research_agent";
832
- }
833
- }
834
- try {
835
- const args = JSON.parse(argsJson);
836
- if (tool === "find_symbol" && args.symbol) {
837
- return `find_symbol ${args.symbol}${args.language ? ` [${args.language}]` : ""}`;
838
- }
839
- if (tool === "web_search" && args.query) {
840
- return `web_search "${ellipsize(String(args.query), 50)}"`;
841
- }
842
- if (tool === "fetch" && args.url) {
843
- return `fetch ${ellipsize(String(args.url), 60)}`;
844
- }
845
- if (tool === "glob" && args.pattern) {
846
- return `glob ${ellipsize(String(args.pattern), 50)}`;
847
- }
848
- if (tool === "grep" && args.pattern) {
849
- const mode = args.output_mode && args.output_mode !== "content" ? ` (${args.output_mode})` : "";
850
- const scope = args.include ? ` in ${args.include}` : "";
851
- return `grep ${ellipsize(String(args.pattern), 40)}${scope}${mode}`;
852
- }
853
- const path = args.filePath || args.file_path || args.path;
854
- if (path) {
855
- const basename = String(path).split("/").pop() || String(path);
856
- return `${display} ${basename}`;
857
- }
858
- if (args.pattern) {
859
- return `${display} ${args.pattern}`;
860
- }
861
- if (args.command) {
862
- return `bash: ${String(args.command).slice(0, 40)}`;
863
- }
864
- } catch {
804
+ // src/services/continuation.ts
805
+ function continuability(task) {
806
+ const refuse = (reason) => ({ ok: false, reason: `Task "${task.title}" cannot be continued: ${reason}` });
807
+ if (task.type !== "ai") return refuse("it is not run by an agent.");
808
+ if (task.status === "awaiting_user" && task.awaitingReason === "conflict") {
809
+ return refuse("its work is waiting on a merge conflict. Resolve or repair the conflict instead.");
865
810
  }
866
- return display;
811
+ const finished = task.status === "completed" || task.status === "failed" || task.status === "skipped";
812
+ if (!finished && !pausedOnLimit(task)) return refuse("only a completed, failed or skipped task, or one paused on a usage limit, can be.");
813
+ if (!task.runnerSessionId) return refuse("its runner left no saved session to resume. Use Retry instead.");
814
+ return { ok: true, sessionId: task.runnerSessionId };
867
815
  }
868
- function classifyOutcome(success, output) {
869
- if (!success) {
870
- if (/^(Command|Fetch|Web search) refused:/.test(output) || /is not available\. You are a read-only research subagent/.test(output)) return "refused";
871
- if (/not approved/i.test(output) || /^Access denied:/.test(output) || /needs user approval/i.test(output)) return "denied";
872
- return "failure";
873
- }
874
- return "success";
816
+ function canContinue(task) {
817
+ return continuability(task).ok;
875
818
  }
876
819
 
877
820
  // src/services/blocking.ts
@@ -912,40 +855,6 @@ function blockingFailures(tasks) {
912
855
  return blocked;
913
856
  }
914
857
 
915
- // src/services/continuation.ts
916
- function continuability(task) {
917
- const refuse = (reason) => ({ ok: false, reason: `Task "${task.title}" cannot be continued: ${reason}` });
918
- if (task.type !== "ai") return refuse("it is not run by an agent.");
919
- if (task.status === "awaiting_user" && task.awaitingReason === "conflict") {
920
- return refuse("its work is waiting on a merge conflict. Resolve or repair the conflict instead.");
921
- }
922
- const finished = task.status === "completed" || task.status === "failed" || task.status === "skipped";
923
- if (!finished && !pausedOnLimit(task)) return refuse("only a completed, failed or skipped task, or one paused on a usage limit, can be.");
924
- if (!task.runnerSessionId) return refuse("its runner left no saved session to resume. Use Retry instead.");
925
- return { ok: true, sessionId: task.runnerSessionId };
926
- }
927
- function canContinue(task) {
928
- return continuability(task).ok;
929
- }
930
-
931
- // src/services/runSettingsText.ts
932
- var SUPERVISOR_LEVEL_LABEL = { off: "Off", watch: "Watch", act: "Act" };
933
- var plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
934
- var onOff = (value) => value ? "on" : "off";
935
- var supervisorSummary = (run) => `Supervisor: ${SUPERVISOR_LEVEL_LABEL[run.supervisorLevel]}, ${plural(run.supervisorRetryLimit, "retry", "retries")} per task, ${plural(run.wakeUpReadBudget, "read", "reads")} per wake-up`;
936
- var automergeSummary = (run) => `Merge automatically (gates, end of run): ${onOff(run.mergeAtGatesAutomatically)}`;
937
- var autorunSummary = (run) => `Autorun: ${onOff(run.autorun)}`;
938
- var ACT_RISK = "Tasks it adds run too, ops tasks included, which can act on real systems unattended.";
939
- var AUTORUN_RISK = "Plans start without review, ops tasks included, which can act on real systems unattended. In Full, the planner may also start tasks it adds later.";
940
- function parseSwitch(arg) {
941
- return arg === "on" ? true : arg === "off" ? false : null;
942
- }
943
- function parseCount(arg, min) {
944
- if (arg === void 0 || !/^\d+$/.test(arg)) return null;
945
- const n = Number(arg);
946
- return n >= min ? n : null;
947
- }
948
-
949
858
  // src/services/SessionMessage.ts
950
859
  function serializeTask(t) {
951
860
  return {
@@ -974,7 +883,7 @@ function serializeTask(t) {
974
883
  ...t.addedBy ? { addedBy: t.addedBy } : {}
975
884
  };
976
885
  }
977
- function serializeTaskStatus(t, idleSince = null, isolation = null, queued = [], awaitingApproval = 0, mergeGate = [], checkpoint = "") {
886
+ function serializeTaskStatus(t, idleSince = null, isolation = null, queued = [], awaitingApproval = 0, mergeGate = [], checkpoint = "", waitsForApproval = false) {
978
887
  return {
979
888
  id: t.id,
980
889
  status: t.status,
@@ -990,7 +899,8 @@ function serializeTaskStatus(t, idleSince = null, isolation = null, queued = [],
990
899
  ...canContinue(t) ? { continuable: true } : {},
991
900
  ...awaitingApproval > 0 ? { awaitingApproval } : {},
992
901
  ...mergeGate.length > 0 ? { mergeGate: [...mergeGate] } : {},
993
- ...t.forcedPastGate?.length ? { forcedPastGate: [...t.forcedPastGate] } : {}
902
+ ...t.forcedPastGate?.length ? { forcedPastGate: [...t.forcedPastGate] } : {},
903
+ ...waitsForApproval ? { waitsForApproval: true } : {}
994
904
  };
995
905
  }
996
906
  function surfaceConversation(history) {
@@ -1045,10 +955,102 @@ function truncateCheckpointSummary(summary) {
1045
955
  return firstLine.slice(0, CHECKPOINT_TRUNCATE_LENGTH - 1) + "\u2026";
1046
956
  }
1047
957
 
958
+ // src/services/conflictFiles.ts
959
+ function capConflictFiles(files, max = 5) {
960
+ return files.length <= max ? files.join(", ") : `${files.slice(0, max).join(", ")}, +${files.length - max} more`;
961
+ }
962
+
963
+ // src/services/researchStepSummary.ts
964
+ function ellipsize(text2, max) {
965
+ const oneLine2 = text2.replace(/\s+/g, " ").trim();
966
+ return oneLine2.length > max ? `${oneLine2.slice(0, max)}\u2026` : oneLine2;
967
+ }
968
+ function summarizeToolCall(tool, argsJson, toolLabel) {
969
+ const display = toolLabel?.trim() || tool;
970
+ if (tool === "agent_tool") {
971
+ try {
972
+ const args = JSON.parse(argsJson);
973
+ const hint = args.path ?? args.file_path ?? args.filePath ?? args.pattern ?? args.query ?? args.url ?? args.command;
974
+ if (hint) return `${display} ${ellipsize(String(hint), 50)}`;
975
+ } catch {
976
+ }
977
+ return display;
978
+ }
979
+ if (tool === "spawn_research_agent") {
980
+ try {
981
+ const args = JSON.parse(argsJson);
982
+ const prompt = typeof args.prompt === "string" ? args.prompt : "";
983
+ const oneLine2 = prompt.replace(/\s+/g, " ").trim();
984
+ return `spawn: "${oneLine2.slice(0, 60)}${oneLine2.length > 60 ? "\u2026" : ""}"`;
985
+ } catch {
986
+ return "spawn_research_agent";
987
+ }
988
+ }
989
+ try {
990
+ const args = JSON.parse(argsJson);
991
+ if (tool === "find_symbol" && args.symbol) {
992
+ return `find_symbol ${args.symbol}${args.language ? ` [${args.language}]` : ""}`;
993
+ }
994
+ if (tool === "web_search" && args.query) {
995
+ return `web_search "${ellipsize(String(args.query), 50)}"`;
996
+ }
997
+ if (tool === "fetch" && args.url) {
998
+ return `fetch ${ellipsize(String(args.url), 60)}`;
999
+ }
1000
+ if (tool === "glob" && args.pattern) {
1001
+ return `glob ${ellipsize(String(args.pattern), 50)}`;
1002
+ }
1003
+ if (tool === "grep" && args.pattern) {
1004
+ const mode = args.output_mode && args.output_mode !== "content" ? ` (${args.output_mode})` : "";
1005
+ const scope = args.include ? ` in ${args.include}` : "";
1006
+ return `grep ${ellipsize(String(args.pattern), 40)}${scope}${mode}`;
1007
+ }
1008
+ const path = args.filePath || args.file_path || args.path;
1009
+ if (path) {
1010
+ const basename = String(path).split("/").pop() || String(path);
1011
+ return `${display} ${basename}`;
1012
+ }
1013
+ if (args.pattern) {
1014
+ return `${display} ${args.pattern}`;
1015
+ }
1016
+ if (args.command) {
1017
+ return `bash: ${String(args.command).slice(0, 40)}`;
1018
+ }
1019
+ } catch {
1020
+ }
1021
+ return display;
1022
+ }
1023
+ function classifyOutcome(success, output) {
1024
+ if (!success) {
1025
+ if (/^(Command|Fetch|Web search) refused:/.test(output) || /is not available\. You are a read-only research subagent/.test(output)) return "refused";
1026
+ if (/not approved/i.test(output) || /^Access denied:/.test(output) || /needs user approval/i.test(output)) return "denied";
1027
+ return "failure";
1028
+ }
1029
+ return "success";
1030
+ }
1031
+
1032
+ // src/services/runSettingsText.ts
1033
+ var SUPERVISOR_LEVEL_LABEL = { off: "Off", watch: "Watch", act: "Act" };
1034
+ var plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
1035
+ var onOff = (value) => value ? "on" : "off";
1036
+ var supervisorSummary = (run) => `Supervisor: ${SUPERVISOR_LEVEL_LABEL[run.supervisorLevel]}, ${plural(run.supervisorRetryLimit, "retry", "retries")} per task, ${plural(run.wakeUpReadBudget, "read", "reads")} per wake-up`;
1037
+ var automergeSummary = (run) => `Merge automatically (gates, end of run): ${onOff(run.mergeAtGatesAutomatically)}`;
1038
+ var autorunSummary = (run) => `Autorun: ${onOff(run.autorun)}`;
1039
+ var ACT_RISK = "Tasks it adds run too, ops tasks included, which can act on real systems unattended.";
1040
+ var AUTORUN_RISK = "Plans start without review, ops tasks included, which can act on real systems unattended. In Full, the planner may also start tasks it adds later.";
1041
+ function parseSwitch(arg) {
1042
+ return arg === "on" ? true : arg === "off" ? false : null;
1043
+ }
1044
+ function parseCount(arg, min) {
1045
+ if (arg === void 0 || !/^\d+$/.test(arg)) return null;
1046
+ const n = Number(arg);
1047
+ return n >= min ? n : null;
1048
+ }
1049
+
1048
1050
  // src/services/runView.ts
1049
1051
  var EMPTY_RUN = { tasks: [], runMerge: null, handoff: null, mergeResult: null };
1050
- function split({ verdict, idleSince, isolation, checkpoint, queued, continuable, awaitingApproval, mergeGate, forcedPastGate, ...plan }) {
1051
- return { plan, status: { verdict, idleSince, isolation, checkpoint, queued, continuable, awaitingApproval, mergeGate, forcedPastGate } };
1052
+ function split({ verdict, idleSince, isolation, checkpoint, queued, continuable, awaitingApproval, mergeGate, forcedPastGate, waitsForApproval, ...plan }) {
1053
+ return { plan, status: { verdict, idleSince, isolation, checkpoint, queued, continuable, awaitingApproval, mergeGate, forcedPastGate, waitsForApproval } };
1052
1054
  }
1053
1055
  function refresh(previous, tasks) {
1054
1056
  const held = /* @__PURE__ */ new Map();
@@ -1150,6 +1152,8 @@ function reduceRun(view, input) {
1150
1152
  const tasks = changeTask(view.tasks, input.taskId, (task) => input.type === "task_started" ? startTask(task) : patchTask(task, input.changes));
1151
1153
  return tasks === view.tasks ? view : { ...view, tasks };
1152
1154
  }
1155
+ case "plan_edit_held":
1156
+ return { ...view, heldEdit: input.held ?? void 0 };
1153
1157
  case "isolation_handoff":
1154
1158
  return { ...view, handoff: handoffOf(input) };
1155
1159
  case "isolation_merge":
@@ -1400,6 +1404,13 @@ function syncTranscript(view, { plan, turnId }) {
1400
1404
  }
1401
1405
  return next === view && latest === view.transcriptAt ? view : { ...next, transcriptAt: latest };
1402
1406
  }
1407
+ function reconcileApprovals(view, waiting) {
1408
+ const ids = new Set(waiting.map((request) => request.id));
1409
+ const answered2 = (block) => block.type === "approval" && block.status === "pending" && block.approvalId !== void 0 && !ids.has(block.approvalId);
1410
+ const kept = view.blocks.some(answered2) ? { ...view, blocks: view.blocks.filter((block) => !answered2(block)) } : view;
1411
+ const carded = new Set(kept.blocks.flatMap((block) => block.type === "approval" && block.approvalId ? [block.approvalId] : []));
1412
+ return waiting.filter((request) => !carded.has(request.id)).reduce(requestApproval2, kept);
1413
+ }
1403
1414
  function reduceConversation(view, input) {
1404
1415
  switch (input.type) {
1405
1416
  case "local_entry":
@@ -1746,6 +1757,7 @@ function taskRowView(task, context = {}) {
1746
1757
  awaiting: awaitingLabel(task),
1747
1758
  resumes: resumeLabel(task, context.now),
1748
1759
  approvals: approvalLabel(task.awaitingApproval),
1760
+ waitsForApproval: task.waitsForApproval && NOT_STARTED.has(task.status) ? WAITS_FOR_APPROVAL_LABEL : null,
1749
1761
  autonomous: task.type === "ai" && context.modes?.find((m) => m.id === task.taskMode)?.autonomous === true,
1750
1762
  repos: namedRepos(isolation?.repos),
1751
1763
  conflict: isolation?.state === "conflict" ? { repo: namedRepo(isolation.conflictRepo), files: filesOf(isolation.conflictFiles) } : null,
@@ -1810,12 +1822,21 @@ export {
1810
1822
  runnerToolSubject,
1811
1823
  reduceTaskLog,
1812
1824
  replayTaskLog,
1825
+ continuability,
1826
+ canContinue,
1827
+ blockingFailures,
1828
+ serializeTask,
1829
+ serializeTaskStatus,
1830
+ surfaceTask,
1831
+ surfacePlan,
1832
+ surfacePlanState,
1833
+ serializePlan,
1834
+ executionSummary,
1835
+ CHECKPOINT_TRUNCATE_LENGTH,
1836
+ truncateCheckpointSummary,
1813
1837
  capConflictFiles,
1814
1838
  summarizeToolCall,
1815
1839
  classifyOutcome,
1816
- blockingFailures,
1817
- continuability,
1818
- canContinue,
1819
1840
  SUPERVISOR_LEVEL_LABEL,
1820
1841
  supervisorSummary,
1821
1842
  automergeSummary,
@@ -1824,17 +1845,10 @@ export {
1824
1845
  AUTORUN_RISK,
1825
1846
  parseSwitch,
1826
1847
  parseCount,
1827
- serializeTask,
1828
- serializeTaskStatus,
1829
- surfacePlan,
1830
- surfacePlanState,
1831
- serializePlan,
1832
- executionSummary,
1833
- CHECKPOINT_TRUNCATE_LENGTH,
1834
- truncateCheckpointSummary,
1835
1848
  EMPTY_RUN,
1836
1849
  reduceRun,
1837
1850
  EMPTY_CONVERSATION,
1851
+ reconcileApprovals,
1838
1852
  reduceConversation,
1839
1853
  fromTranscript,
1840
1854
  EMPTY_HOLD,
@@ -1862,4 +1876,4 @@ export {
1862
1876
  pastGateConfirmation,
1863
1877
  newTaskFields
1864
1878
  };
1865
- //# sourceMappingURL=chunk-UQGR3UCA.mjs.map
1879
+ //# sourceMappingURL=chunk-FH6M5QZG.mjs.map