@useorgx/openclaw-plugin 0.7.11 → 0.7.15

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 (189) hide show
  1. package/README.md +94 -122
  2. package/dashboard/dist/assets/0RUEVzJa.js +1 -0
  3. package/dashboard/dist/assets/0RUEVzJa.js.br +0 -0
  4. package/dashboard/dist/assets/0RUEVzJa.js.gz +0 -0
  5. package/dashboard/dist/assets/3TtV4moZ.js +1 -0
  6. package/dashboard/dist/assets/3TtV4moZ.js.br +0 -0
  7. package/dashboard/dist/assets/3TtV4moZ.js.gz +0 -0
  8. package/dashboard/dist/assets/3VwNyxUf.js +1 -0
  9. package/dashboard/dist/assets/3VwNyxUf.js.br +0 -0
  10. package/dashboard/dist/assets/3VwNyxUf.js.gz +0 -0
  11. package/dashboard/dist/assets/{beHYBbh6.js → 7DhYqBrM.js} +2 -2
  12. package/dashboard/dist/assets/7DhYqBrM.js.br +0 -0
  13. package/dashboard/dist/assets/7DhYqBrM.js.gz +0 -0
  14. package/dashboard/dist/assets/{tcEHYcbW.js → BCudUvwg.js} +1 -1
  15. package/dashboard/dist/assets/BCudUvwg.js.br +0 -0
  16. package/dashboard/dist/assets/BCudUvwg.js.gz +0 -0
  17. package/dashboard/dist/assets/BV0BcV1u.js +53 -0
  18. package/dashboard/dist/assets/BV0BcV1u.js.br +0 -0
  19. package/dashboard/dist/assets/BV0BcV1u.js.gz +0 -0
  20. package/dashboard/dist/assets/BVvffj0x.js +1 -0
  21. package/dashboard/dist/assets/BVvffj0x.js.br +0 -0
  22. package/dashboard/dist/assets/BVvffj0x.js.gz +0 -0
  23. package/dashboard/dist/assets/BiOgVMED.js +1 -0
  24. package/dashboard/dist/assets/BiOgVMED.js.br +0 -0
  25. package/dashboard/dist/assets/BiOgVMED.js.gz +0 -0
  26. package/dashboard/dist/assets/BjK42gtU.js +1 -0
  27. package/dashboard/dist/assets/BjK42gtU.js.br +0 -0
  28. package/dashboard/dist/assets/BjK42gtU.js.gz +0 -0
  29. package/dashboard/dist/assets/C-MOJWHs.js +1 -0
  30. package/dashboard/dist/assets/C-MOJWHs.js.br +0 -0
  31. package/dashboard/dist/assets/C-MOJWHs.js.gz +0 -0
  32. package/dashboard/dist/assets/{CD-q5mdP.js → C91KLKit.js} +1 -1
  33. package/dashboard/dist/assets/C91KLKit.js.br +0 -0
  34. package/dashboard/dist/assets/C91KLKit.js.gz +0 -0
  35. package/dashboard/dist/assets/{AqVoI3SF.js → C9fvfXmS.js} +1 -1
  36. package/dashboard/dist/assets/C9fvfXmS.js.br +0 -0
  37. package/dashboard/dist/assets/C9fvfXmS.js.gz +0 -0
  38. package/dashboard/dist/assets/CFZ4Swr5.js +1 -0
  39. package/dashboard/dist/assets/CFZ4Swr5.js.br +0 -0
  40. package/dashboard/dist/assets/CFZ4Swr5.js.gz +0 -0
  41. package/dashboard/dist/assets/{DCP-C7fn.js → CGj8kRhg.js} +1 -1
  42. package/dashboard/dist/assets/CGj8kRhg.js.br +0 -0
  43. package/dashboard/dist/assets/CGj8kRhg.js.gz +0 -0
  44. package/dashboard/dist/assets/CJjEAGFN.js +1 -0
  45. package/dashboard/dist/assets/CJjEAGFN.js.br +0 -0
  46. package/dashboard/dist/assets/CJjEAGFN.js.gz +0 -0
  47. package/dashboard/dist/assets/CKrH5fYO.js +1 -0
  48. package/dashboard/dist/assets/CKrH5fYO.js.br +0 -0
  49. package/dashboard/dist/assets/CKrH5fYO.js.gz +0 -0
  50. package/dashboard/dist/assets/CMTTPXch.js +1 -0
  51. package/dashboard/dist/assets/CMTTPXch.js.br +0 -0
  52. package/dashboard/dist/assets/CMTTPXch.js.gz +0 -0
  53. package/dashboard/dist/assets/CSlBSRyv.js +1 -0
  54. package/dashboard/dist/assets/CSlBSRyv.js.br +0 -0
  55. package/dashboard/dist/assets/CSlBSRyv.js.gz +0 -0
  56. package/dashboard/dist/assets/CnPC783_.js +1 -0
  57. package/dashboard/dist/assets/CnPC783_.js.br +0 -0
  58. package/dashboard/dist/assets/CnPC783_.js.gz +0 -0
  59. package/dashboard/dist/assets/Ctw95IkC.js +1 -0
  60. package/dashboard/dist/assets/Ctw95IkC.js.br +0 -0
  61. package/dashboard/dist/assets/Ctw95IkC.js.gz +0 -0
  62. package/dashboard/dist/assets/DHz-aQPw.js +1 -0
  63. package/dashboard/dist/assets/DHz-aQPw.js.br +0 -0
  64. package/dashboard/dist/assets/DHz-aQPw.js.gz +0 -0
  65. package/dashboard/dist/assets/DNX2foSJ.css +1 -0
  66. package/dashboard/dist/assets/DNX2foSJ.css.br +0 -0
  67. package/dashboard/dist/assets/DNX2foSJ.css.gz +0 -0
  68. package/dashboard/dist/assets/Dj2k1r16.js +8 -0
  69. package/dashboard/dist/assets/Dj2k1r16.js.br +0 -0
  70. package/dashboard/dist/assets/Dj2k1r16.js.gz +0 -0
  71. package/dashboard/dist/assets/DxUw4FMR.js +212 -0
  72. package/dashboard/dist/assets/DxUw4FMR.js.br +0 -0
  73. package/dashboard/dist/assets/DxUw4FMR.js.gz +0 -0
  74. package/dashboard/dist/assets/T2NFtzAv.js +1 -0
  75. package/dashboard/dist/assets/T2NFtzAv.js.br +0 -0
  76. package/dashboard/dist/assets/T2NFtzAv.js.gz +0 -0
  77. package/dashboard/dist/assets/cX2e-TLi.js +1 -0
  78. package/dashboard/dist/assets/cX2e-TLi.js.br +0 -0
  79. package/dashboard/dist/assets/cX2e-TLi.js.gz +0 -0
  80. package/dashboard/dist/assets/eeHXe_OQ.js +9 -0
  81. package/dashboard/dist/assets/eeHXe_OQ.js.br +0 -0
  82. package/dashboard/dist/assets/eeHXe_OQ.js.gz +0 -0
  83. package/dashboard/dist/assets/{Du1wfrXa.js → gZr_xKlA.js} +2 -2
  84. package/dashboard/dist/assets/gZr_xKlA.js.br +0 -0
  85. package/dashboard/dist/assets/gZr_xKlA.js.gz +0 -0
  86. package/dashboard/dist/brand/control-tower.png +0 -0
  87. package/dashboard/dist/brand/design-codex.png +0 -0
  88. package/dashboard/dist/brand/engineering-autopilot.png +0 -0
  89. package/dashboard/dist/brand/launch-captain.png +0 -0
  90. package/dashboard/dist/brand/orgx-logo.png +0 -0
  91. package/dashboard/dist/brand/pipeline-intelligence.png +0 -0
  92. package/dashboard/dist/brand/product-orchestrator.png +0 -0
  93. package/dashboard/dist/brand/xandy-orchestrator.png +0 -0
  94. package/dashboard/dist/index.html +8 -6
  95. package/dashboard/dist/index.html.br +0 -0
  96. package/dashboard/dist/index.html.gz +0 -0
  97. package/dist/hash-utils.d.ts +1 -0
  98. package/dist/hash-utils.js +4 -0
  99. package/dist/http/helpers/auto-continue-engine.js +124 -67
  100. package/dist/http/helpers/autopilot-slice-utils.js +112 -66
  101. package/dist/http/helpers/hash-utils.d.ts +1 -1
  102. package/dist/http/helpers/hash-utils.js +1 -1
  103. package/dist/http/helpers/mission-control.js +5 -2
  104. package/dist/http/helpers/queue-constants.d.ts +37 -0
  105. package/dist/http/helpers/queue-constants.js +34 -0
  106. package/dist/http/helpers/slice-experience-v2.js +2 -5
  107. package/dist/http/helpers/slice-run-projections.js +2 -5
  108. package/dist/http/helpers/workspace-scope.js +4 -3
  109. package/dist/http/index.js +101 -60
  110. package/dist/http/routes/chat.js +1 -21
  111. package/dist/http/routes/live-snapshot.js +4 -23
  112. package/dist/http/routes/mission-control-actions.js +2 -18
  113. package/dist/http/routes/mission-control-read.js +4 -107
  114. package/dist/lib/type-coercion.d.ts +10 -0
  115. package/dist/lib/type-coercion.js +82 -0
  116. package/dist/mcp-http-handler.js +14 -2
  117. package/dist/openclaw.plugin.json +1 -1
  118. package/dist/services/experiment-randomization.js +9 -2
  119. package/openclaw.plugin.json +1 -1
  120. package/package.json +3 -2
  121. package/dashboard/dist/assets/AqVoI3SF.js.br +0 -0
  122. package/dashboard/dist/assets/AqVoI3SF.js.gz +0 -0
  123. package/dashboard/dist/assets/BC4WvnHJ.js +0 -1
  124. package/dashboard/dist/assets/BC4WvnHJ.js.br +0 -0
  125. package/dashboard/dist/assets/BC4WvnHJ.js.gz +0 -0
  126. package/dashboard/dist/assets/BG5mwTkg.js +0 -1
  127. package/dashboard/dist/assets/BG5mwTkg.js.br +0 -0
  128. package/dashboard/dist/assets/BG5mwTkg.js.gz +0 -0
  129. package/dashboard/dist/assets/BJgZIVUQ.js +0 -53
  130. package/dashboard/dist/assets/BJgZIVUQ.js.br +0 -0
  131. package/dashboard/dist/assets/BJgZIVUQ.js.gz +0 -0
  132. package/dashboard/dist/assets/BNh-XYPV.js +0 -1
  133. package/dashboard/dist/assets/BNh-XYPV.js.br +0 -0
  134. package/dashboard/dist/assets/BNh-XYPV.js.gz +0 -0
  135. package/dashboard/dist/assets/BTAEErUY.js +0 -1
  136. package/dashboard/dist/assets/BTAEErUY.js.br +0 -0
  137. package/dashboard/dist/assets/BTAEErUY.js.gz +0 -0
  138. package/dashboard/dist/assets/BepW_590.js +0 -1
  139. package/dashboard/dist/assets/BepW_590.js.br +0 -0
  140. package/dashboard/dist/assets/BepW_590.js.gz +0 -0
  141. package/dashboard/dist/assets/BerAfzjq.js +0 -1
  142. package/dashboard/dist/assets/BerAfzjq.js.br +0 -0
  143. package/dashboard/dist/assets/BerAfzjq.js.gz +0 -0
  144. package/dashboard/dist/assets/Bp3N-QL5.js +0 -212
  145. package/dashboard/dist/assets/Bp3N-QL5.js.br +0 -0
  146. package/dashboard/dist/assets/Bp3N-QL5.js.gz +0 -0
  147. package/dashboard/dist/assets/C-KIc3Wc.js +0 -1
  148. package/dashboard/dist/assets/C-KIc3Wc.js.br +0 -0
  149. package/dashboard/dist/assets/C-KIc3Wc.js.gz +0 -0
  150. package/dashboard/dist/assets/C3dZRz9P.css +0 -1
  151. package/dashboard/dist/assets/C3dZRz9P.css.br +0 -0
  152. package/dashboard/dist/assets/C3dZRz9P.css.gz +0 -0
  153. package/dashboard/dist/assets/CD-q5mdP.js.br +0 -0
  154. package/dashboard/dist/assets/CD-q5mdP.js.gz +0 -0
  155. package/dashboard/dist/assets/CL_wXqR7.js +0 -1
  156. package/dashboard/dist/assets/CL_wXqR7.js.br +0 -0
  157. package/dashboard/dist/assets/CL_wXqR7.js.gz +0 -0
  158. package/dashboard/dist/assets/CdvjC9G9.js +0 -1
  159. package/dashboard/dist/assets/CdvjC9G9.js.br +0 -0
  160. package/dashboard/dist/assets/CdvjC9G9.js.gz +0 -0
  161. package/dashboard/dist/assets/Ck2agw-s.js +0 -1
  162. package/dashboard/dist/assets/Ck2agw-s.js.br +0 -0
  163. package/dashboard/dist/assets/Ck2agw-s.js.gz +0 -0
  164. package/dashboard/dist/assets/CxQ08qFN.js +0 -9
  165. package/dashboard/dist/assets/CxQ08qFN.js.br +0 -0
  166. package/dashboard/dist/assets/CxQ08qFN.js.gz +0 -0
  167. package/dashboard/dist/assets/D2CH1H6k.js +0 -1
  168. package/dashboard/dist/assets/D2CH1H6k.js.br +0 -0
  169. package/dashboard/dist/assets/D2CH1H6k.js.gz +0 -0
  170. package/dashboard/dist/assets/D9esz7jd.js +0 -1
  171. package/dashboard/dist/assets/D9esz7jd.js.br +0 -0
  172. package/dashboard/dist/assets/D9esz7jd.js.gz +0 -0
  173. package/dashboard/dist/assets/DCP-C7fn.js.br +0 -0
  174. package/dashboard/dist/assets/DCP-C7fn.js.gz +0 -0
  175. package/dashboard/dist/assets/DJASCd69.js +0 -1
  176. package/dashboard/dist/assets/DJASCd69.js.br +0 -0
  177. package/dashboard/dist/assets/DJASCd69.js.gz +0 -0
  178. package/dashboard/dist/assets/Dm9AybAp.js +0 -1
  179. package/dashboard/dist/assets/Dm9AybAp.js.br +0 -0
  180. package/dashboard/dist/assets/Dm9AybAp.js.gz +0 -0
  181. package/dashboard/dist/assets/Du1wfrXa.js.br +0 -0
  182. package/dashboard/dist/assets/Du1wfrXa.js.gz +0 -0
  183. package/dashboard/dist/assets/beHYBbh6.js.br +0 -0
  184. package/dashboard/dist/assets/beHYBbh6.js.gz +0 -0
  185. package/dashboard/dist/assets/cNrhgGc1.js +0 -8
  186. package/dashboard/dist/assets/cNrhgGc1.js.br +0 -0
  187. package/dashboard/dist/assets/cNrhgGc1.js.gz +0 -0
  188. package/dashboard/dist/assets/tcEHYcbW.js.br +0 -0
  189. package/dashboard/dist/assets/tcEHYcbW.js.gz +0 -0
@@ -15,6 +15,7 @@ import { buildMissionControlGraph, DEFAULT_TOKEN_BUDGET_ASSUMPTIONS, dedupeStrin
15
15
  import { createAutopilotRuntime } from "./autopilot-runtime.js";
16
16
  import { buildScopeDirective, buildSliceOutputInstructions, buildWorkstreamSlicePrompt, createCodexBinResolver, ensureAutopilotSliceSchemaPath, extractSessionIdFromLog, extractSessionIdFromOutput, fileUpdatedAtEpochMs, parseSliceResult, readFileTailSafe, readSliceOutputFile, } from "./autopilot-slice-utils.js";
17
17
  import { pickString } from "./value-utils.js";
18
+ import { LaneState, RunStatus, } from "./queue-constants.js";
18
19
  function resolveAutopilotDefaultCwd(filename) {
19
20
  let cursor = dirname(filename);
20
21
  for (let i = 0; i < 12; i += 1) {
@@ -1029,7 +1030,7 @@ export function createAutoContinueEngine(deps) {
1029
1030
  }
1030
1031
  const existing = run.laneByWorkstreamId[normalizedWorkstreamId] ?? {
1031
1032
  workstreamId: normalizedWorkstreamId,
1032
- state: "idle",
1033
+ state: LaneState.IDLE,
1033
1034
  activeRunId: null,
1034
1035
  activeTaskIds: [],
1035
1036
  blockedReason: null,
@@ -1081,12 +1082,12 @@ export function createAutoContinueEngine(deps) {
1081
1082
  if (lane && lane.activeRunId === sliceRunId) {
1082
1083
  setLaneState(run, {
1083
1084
  workstreamId: normalizedWorkstreamId,
1084
- state: lane.state === "blocked" ? "blocked" : "idle",
1085
+ state: lane.state === LaneState.BLOCKED ? "blocked" : "idle",
1085
1086
  activeRunId: null,
1086
1087
  activeTaskIds: [],
1087
1088
  retryAt: lane.retryAt ?? null,
1088
1089
  waitingOnWorkstreamIds: lane.waitingOnWorkstreamIds ?? [],
1089
- blockedReason: lane.state === "blocked" ? lane.blockedReason : null,
1090
+ blockedReason: lane.state === LaneState.BLOCKED ? lane.blockedReason : null,
1090
1091
  });
1091
1092
  }
1092
1093
  }
@@ -1389,7 +1390,7 @@ export function createAutoContinueEngine(deps) {
1389
1390
  updated_at: lane.updatedAt,
1390
1391
  }));
1391
1392
  const patch = {
1392
- auto_continue_enabled: input.run.status === "running" || input.run.status === "stopping",
1393
+ auto_continue_enabled: input.run.status === RunStatus.RUNNING || input.run.status === RunStatus.STOPPING,
1393
1394
  auto_continue_status: input.run.status,
1394
1395
  auto_continue_stop_reason: input.run.stopReason,
1395
1396
  auto_continue_started_at: input.run.startedAt,
@@ -1428,7 +1429,7 @@ export function createAutoContinueEngine(deps) {
1428
1429
  const now = new Date().toISOString();
1429
1430
  ensureRunInternals(input.run);
1430
1431
  const activeRunIds = listActiveSliceRunIds(input.run);
1431
- input.run.status = "stopped";
1432
+ input.run.status = RunStatus.STOPPED;
1432
1433
  input.run.stopReason = input.reason;
1433
1434
  input.run.stoppedAt = now;
1434
1435
  input.run.updatedAt = now;
@@ -1442,7 +1443,7 @@ export function createAutoContinueEngine(deps) {
1442
1443
  if (lane.activeRunId || lane.activeTaskIds.length > 0) {
1443
1444
  setLaneState(input.run, {
1444
1445
  workstreamId: lane.workstreamId,
1445
- state: lane.state === "blocked" ? "blocked" : "idle",
1446
+ state: lane.state === LaneState.BLOCKED ? "blocked" : "idle",
1446
1447
  activeRunId: null,
1447
1448
  activeTaskIds: [],
1448
1449
  });
@@ -1572,7 +1573,7 @@ export function createAutoContinueEngine(deps) {
1572
1573
  event: "autopilot_transition",
1573
1574
  actionType: "run_state_transition",
1574
1575
  }),
1575
- old_state: "running",
1576
+ old_state: LaneState.RUNNING,
1576
1577
  new_state: input.reason === "completed" || input.reason === "stopped" ? "idle" : input.reason === "blocked" ? "blocked" : input.reason === "error" ? "error" : "idle",
1577
1578
  reason: input.reason,
1578
1579
  workspace_id: input.run.allowedWorkstreamIds?.[0] ?? null,
@@ -1774,7 +1775,7 @@ export function createAutoContinueEngine(deps) {
1774
1775
  });
1775
1776
  setLaneState(run, {
1776
1777
  workstreamId: slice.workstreamId,
1777
- state: "blocked",
1778
+ state: LaneState.BLOCKED,
1778
1779
  activeRunId: null,
1779
1780
  activeTaskIds: [],
1780
1781
  blockedReason: slice.lastError,
@@ -1816,6 +1817,9 @@ export function createAutoContinueEngine(deps) {
1816
1817
  clearAutoContinueSliceTransientState(slice.runId);
1817
1818
  const event = killDecision.kind === "timeout" ? "autopilot_slice_timeout" : "autopilot_slice_log_stall";
1818
1819
  const humanLabel = killDecision.kind === "timeout" ? "timed out" : "stalled";
1820
+ const stallDecisionTitle = killDecision.kind === "timeout"
1821
+ ? `Autopilot slice timed out: ${slice.workstreamTitle ?? slice.workstreamId}`
1822
+ : `Autopilot slice stalled: ${slice.workstreamTitle ?? slice.workstreamId}`;
1819
1823
  await emitActivitySafe({
1820
1824
  initiativeId: run.initiativeId,
1821
1825
  runId: slice.runId,
@@ -1849,7 +1853,7 @@ export function createAutoContinueEngine(deps) {
1849
1853
  const decisionResult = await requestDecisionQueued({
1850
1854
  initiativeId: run.initiativeId,
1851
1855
  correlationId: slice.runId,
1852
- title: `Agent ${humanLabel === "timed out" ? "ran out of time" : "stopped making progress"}: ${slice.workstreamTitle ?? slice.workstreamId}`,
1856
+ title: stallDecisionTitle,
1853
1857
  summary: humanizeSliceFailureSummary(slice.lastError ?? `Autopilot slice ${humanLabel}`),
1854
1858
  urgency: "high",
1855
1859
  options: [
@@ -1902,7 +1906,7 @@ export function createAutoContinueEngine(deps) {
1902
1906
  });
1903
1907
  setLaneState(run, {
1904
1908
  workstreamId: slice.workstreamId,
1905
- state: "blocked",
1909
+ state: LaneState.BLOCKED,
1906
1910
  activeRunId: null,
1907
1911
  activeTaskIds: [],
1908
1912
  blockedReason: slice.lastError,
@@ -1968,13 +1972,25 @@ export function createAutoContinueEngine(deps) {
1968
1972
  const decisions = allDecisions.filter((item) => !isParserSyntheticFallbackDecision(item));
1969
1973
  const normalizedBlockingDecisionCount = allDecisions.filter((item) => typeof item.blocking === "boolean" ? item.blocking : defaultDecisionBlocking).length;
1970
1974
  const normalizedNonBlockingDecisionCount = Math.max(0, allDecisions.length - normalizedBlockingDecisionCount);
1971
- const effectiveParsedStatus = parsedStatus === "completed" && normalizedBlockingDecisionCount > 0
1975
+ const operationalParsedStatus = parsedStatus === "completed" && normalizedBlockingDecisionCount > 0
1972
1976
  ? "needs_decision"
1973
1977
  : parsedStatus;
1978
+ const parsedSummarySignal = String(parsed?.summary ?? "").toLowerCase();
1979
+ const parsedLooksLikeNoOutcomeCompletion = operationalParsedStatus === "error" &&
1980
+ (parsedSummarySignal.includes("without verifiable outcomes") ||
1981
+ parsedSummarySignal.includes("without output") ||
1982
+ parsedSummarySignal.includes("without artifacts") ||
1983
+ parsedSummarySignal.includes("did not report artifacts") ||
1984
+ (parsedSummarySignal.includes("did not report") &&
1985
+ parsedSummarySignal.includes("status updates")) ||
1986
+ parsedSummarySignal.includes("produced nothing"));
1987
+ const reportedParsedStatus = parsedLooksLikeNoOutcomeCompletion
1988
+ ? "completed"
1989
+ : operationalParsedStatus;
1974
1990
  slice.status =
1975
- effectiveParsedStatus === "completed"
1991
+ operationalParsedStatus === "completed"
1976
1992
  ? "completed"
1977
- : effectiveParsedStatus === "blocked" || effectiveParsedStatus === "needs_decision"
1993
+ : operationalParsedStatus === "blocked" || operationalParsedStatus === "needs_decision"
1978
1994
  ? "blocked"
1979
1995
  : "error";
1980
1996
  slice.finishedAt = now;
@@ -2054,7 +2070,7 @@ export function createAutoContinueEngine(deps) {
2054
2070
  : [];
2055
2071
  const resultEnvelope = {
2056
2072
  summary: userSummary,
2057
- parsed_status: effectiveParsedStatus,
2073
+ parsed_status: reportedParsedStatus,
2058
2074
  task_updates: taskUpdates,
2059
2075
  milestone_updates: milestoneUpdates,
2060
2076
  next_actions: nextActions,
@@ -2245,7 +2261,7 @@ export function createAutoContinueEngine(deps) {
2245
2261
  correlation_id: slice.runId,
2246
2262
  requested_by_agent_id: run.agentId,
2247
2263
  requested_by_agent_name: run.agentName,
2248
- status: effectiveParsedStatus,
2264
+ status: reportedParsedStatus,
2249
2265
  artifacts: artifacts.length,
2250
2266
  decisions: allDecisions.length,
2251
2267
  blocking_decisions: normalizedBlockingDecisionCount,
@@ -2289,7 +2305,7 @@ export function createAutoContinueEngine(deps) {
2289
2305
  userSummary,
2290
2306
  event: "autopilot_slice_handoff",
2291
2307
  extra: {
2292
- parsed_status: effectiveParsedStatus,
2308
+ parsed_status: reportedParsedStatus,
2293
2309
  artifacts: artifacts.length,
2294
2310
  decisions: decisions.length,
2295
2311
  decision_ids: decisionIds,
@@ -2335,7 +2351,7 @@ export function createAutoContinueEngine(deps) {
2335
2351
  behavior_config_hash: slice.behaviorConfigHash,
2336
2352
  policy_source: slice.behaviorPolicySource,
2337
2353
  behavior_automation_level: slice.behaviorAutomationLevel,
2338
- parsed_status: effectiveParsedStatus,
2354
+ parsed_status: reportedParsedStatus,
2339
2355
  has_output: Boolean(parsed),
2340
2356
  artifacts: artifacts.length,
2341
2357
  decisions: allDecisions.length,
@@ -2344,7 +2360,7 @@ export function createAutoContinueEngine(deps) {
2344
2360
  decision_ids: decisionIds,
2345
2361
  blocking_decision_ids: Array.from(new Set(blockingDecisionIds)),
2346
2362
  non_blocking_decision_ids: Array.from(new Set(nonBlockingDecisionIds)),
2347
- decision_required: blockingDecisionQueued || effectiveParsedStatus === "needs_decision",
2363
+ decision_required: blockingDecisionQueued || operationalParsedStatus === "needs_decision",
2348
2364
  status_updates_applied: statusUpdateResult.applied,
2349
2365
  status_updates_buffered: statusUpdateResult.buffered,
2350
2366
  reported_skill_evidence_count: skillEvidence.length,
@@ -2382,20 +2398,63 @@ export function createAutoContinueEngine(deps) {
2382
2398
  queued: false,
2383
2399
  decisionIds: [],
2384
2400
  };
2401
+ const fallbackRawError = parsed?.summary ??
2402
+ slice.lastError ??
2403
+ (slice.status === "blocked"
2404
+ ? "Execution is blocked and needs intervention."
2405
+ : "Agent process exited without a valid output contract.");
2406
+ const fallbackHumanized = humanizeSliceFailure(fallbackRawError);
2407
+ const fallbackErrorSignal = [
2408
+ parsed?.summary ?? null,
2409
+ slice.lastError ?? null,
2410
+ fallbackRawError,
2411
+ ]
2412
+ .filter((entry) => typeof entry === "string" && entry.trim().length > 0)
2413
+ .join(" ")
2414
+ .toLowerCase();
2415
+ const looksLikeNoOutcome = fallbackErrorSignal.includes("without verifiable outcomes") ||
2416
+ fallbackErrorSignal.includes("without output") ||
2417
+ fallbackErrorSignal.includes("without artifacts") ||
2418
+ fallbackErrorSignal.includes("did not report artifacts") ||
2419
+ (fallbackErrorSignal.includes("did not report") &&
2420
+ fallbackErrorSignal.includes("status updates")) ||
2421
+ fallbackErrorSignal.includes("produced nothing");
2422
+ const looksLikeStall = fallbackErrorSignal.includes("stall") ||
2423
+ fallbackErrorSignal.includes("stopped making progress");
2424
+ const looksLikeTimeout = fallbackErrorSignal.includes("timeout") ||
2425
+ fallbackErrorSignal.includes("timed out") ||
2426
+ fallbackErrorSignal.includes("ran out of time");
2427
+ const blockedLike = slice.status === "blocked" ||
2428
+ looksLikeNoOutcome ||
2429
+ looksLikeStall ||
2430
+ looksLikeTimeout;
2431
+ const decisionConflictSource = looksLikeNoOutcome
2432
+ ? "slice_completed_without_outcome"
2433
+ : looksLikeTimeout
2434
+ ? "slice_timeout"
2435
+ : looksLikeStall
2436
+ ? "slice_stall_no_output"
2437
+ : blockedLike
2438
+ ? "slice_missing_blocking_decision"
2439
+ : "slice_invalid_output";
2440
+ const fallbackDecisionTitle = looksLikeNoOutcome
2441
+ ? `Autopilot slice needs verification: ${slice.workstreamTitle ?? slice.workstreamId}`
2442
+ : looksLikeStall
2443
+ ? `Autopilot slice stalled: ${slice.workstreamTitle ?? slice.workstreamId}`
2444
+ : looksLikeTimeout
2445
+ ? `Autopilot slice timed out: ${slice.workstreamTitle ?? slice.workstreamId}`
2446
+ : blockedLike
2447
+ ? `Autopilot slice blocked: ${slice.workstreamTitle ?? slice.workstreamId}`
2448
+ : `Autopilot slice failed: ${slice.workstreamTitle ?? slice.workstreamId}`;
2449
+ const fallbackDecisionSummary = looksLikeNoOutcome
2450
+ ? "The slice reported completion but did not produce artifacts or status updates. Decide whether to retry, request stronger output, or mark tasks manually."
2451
+ : fallbackHumanized.explanation;
2385
2452
  if (!blockingDecisionQueued) {
2386
- const blockedLike = slice.status === "blocked";
2387
- const fallbackRawError = parsed?.summary ?? slice.lastError ??
2388
- (blockedLike
2389
- ? "Execution is blocked and needs intervention."
2390
- : "Agent process exited without a valid output contract.");
2391
- const fallbackHumanized = humanizeSliceFailure(fallbackRawError);
2392
2453
  fallbackDecisionResult = await requestDecisionQueued({
2393
2454
  initiativeId: run.initiativeId,
2394
2455
  correlationId: slice.runId,
2395
- title: blockedLike
2396
- ? `Agent needs your help: ${slice.workstreamTitle ?? slice.workstreamId}`
2397
- : `${fallbackHumanized.headline}: ${slice.workstreamTitle ?? slice.workstreamId}`,
2398
- summary: fallbackHumanized.explanation,
2456
+ title: fallbackDecisionTitle,
2457
+ summary: fallbackDecisionSummary,
2399
2458
  urgency: "high",
2400
2459
  options: [
2401
2460
  "Retry this workstream slice",
@@ -2403,18 +2462,20 @@ export function createAutoContinueEngine(deps) {
2403
2462
  "Skip this workstream for now",
2404
2463
  ],
2405
2464
  blocking: true,
2406
- decisionType: blockedLike ? "autopilot_blocked_without_decision" : "autopilot_failure",
2465
+ decisionType: looksLikeNoOutcome
2466
+ ? "autopilot_completed_without_outcome"
2467
+ : blockedLike
2468
+ ? "autopilot_blocked_without_decision"
2469
+ : "autopilot_failure",
2407
2470
  workstreamId: slice.workstreamId,
2408
2471
  agentId: slice.agentId,
2409
2472
  sourceSystem: "orgx-autopilot",
2410
- conflictSource: blockedLike
2411
- ? "slice_missing_blocking_decision"
2412
- : "slice_invalid_output",
2473
+ conflictSource: decisionConflictSource,
2413
2474
  dedupeKey: [
2414
2475
  "autopilot",
2415
2476
  run.initiativeId,
2416
2477
  slice.workstreamId,
2417
- blockedLike ? "slice_missing_blocking_decision" : "slice_invalid_output",
2478
+ decisionConflictSource,
2418
2479
  ].join(":"),
2419
2480
  recommendedAction: nextActions[0] ??
2420
2481
  "Review the output contract and logs, then retry or pause autopilot until the blocker is resolved.",
@@ -2422,19 +2483,17 @@ export function createAutoContinueEngine(deps) {
2422
2483
  sourceRef: {
2423
2484
  run_id: slice.runId,
2424
2485
  workstream_id: slice.workstreamId,
2425
- parsed_status: effectiveParsedStatus,
2486
+ parsed_status: reportedParsedStatus,
2426
2487
  },
2427
2488
  evidenceRefs: [
2428
2489
  {
2429
2490
  evidence_type: "slice_output_validation",
2430
2491
  title: "Slice output requires fallback decision",
2431
- summary: parsed?.summary ??
2432
- slice.lastError ??
2433
- "Slice did not provide a blocking decision payload.",
2492
+ summary: fallbackDecisionSummary,
2434
2493
  source_pointer: slice.outputPath,
2435
2494
  payload: {
2436
2495
  log_path: slice.logPath,
2437
- parsed_status: effectiveParsedStatus,
2496
+ parsed_status: reportedParsedStatus,
2438
2497
  },
2439
2498
  },
2440
2499
  ...artifactEvidenceRefs,
@@ -2443,12 +2502,12 @@ export function createAutoContinueEngine(deps) {
2443
2502
  }
2444
2503
  setLaneState(run, {
2445
2504
  workstreamId: slice.workstreamId,
2446
- state: "blocked",
2505
+ state: LaneState.BLOCKED,
2447
2506
  activeRunId: null,
2448
2507
  activeTaskIds: [],
2449
2508
  blockedReason: parsed?.summary ??
2450
2509
  slice.lastError ??
2451
- `Slice returned status: ${effectiveParsedStatus}`,
2510
+ `Slice returned status: ${reportedParsedStatus}`,
2452
2511
  waitingOnWorkstreamIds: [],
2453
2512
  retryAt: null,
2454
2513
  });
@@ -2457,10 +2516,8 @@ export function createAutoContinueEngine(deps) {
2457
2516
  }
2458
2517
  await stopAutoContinueRun({
2459
2518
  run,
2460
- reason: slice.status === "error" ? "error" : "blocked",
2461
- error: parsed?.summary ??
2462
- slice.lastError ??
2463
- `Slice returned status: ${effectiveParsedStatus}`,
2519
+ reason: blockedLike ? "blocked" : "error",
2520
+ error: fallbackRawError,
2464
2521
  decisionRequired: blockingDecisionQueued || fallbackDecisionResult.queued,
2465
2522
  decisionIds: Array.from(new Set([...decisionIds, ...fallbackDecisionResult.decisionIds])),
2466
2523
  });
@@ -2533,7 +2590,7 @@ export function createAutoContinueEngine(deps) {
2533
2590
  });
2534
2591
  setLaneState(run, {
2535
2592
  workstreamId: slice.workstreamId,
2536
- state: "blocked",
2593
+ state: LaneState.BLOCKED,
2537
2594
  activeRunId: null,
2538
2595
  activeTaskIds: [],
2539
2596
  blockedReason: slice.lastError ??
@@ -2567,7 +2624,7 @@ export function createAutoContinueEngine(deps) {
2567
2624
  });
2568
2625
  setLaneState(run, {
2569
2626
  workstreamId: slice.workstreamId,
2570
- state: "completed",
2627
+ state: LaneState.COMPLETED,
2571
2628
  activeRunId: null,
2572
2629
  activeTaskIds: [],
2573
2630
  blockedReason: null,
@@ -2645,7 +2702,7 @@ export function createAutoContinueEngine(deps) {
2645
2702
  }
2646
2703
  syncLegacyRunPointers(run);
2647
2704
  if (run.stopRequested) {
2648
- run.status = "stopping";
2705
+ run.status = RunStatus.STOPPING;
2649
2706
  run.updatedAt = now;
2650
2707
  await stopAutoContinueRun({ run, reason: "stopped" });
2651
2708
  return;
@@ -2777,7 +2834,7 @@ export function createAutoContinueEngine(deps) {
2777
2834
  for (const [workstreamId, waitingOnWorkstreamIds] of waitingByWorkstream.entries()) {
2778
2835
  setLaneState(run, {
2779
2836
  workstreamId,
2780
- state: "waiting_dependency",
2837
+ state: LaneState.WAITING_DEPENDENCY,
2781
2838
  activeRunId: null,
2782
2839
  activeTaskIds: [],
2783
2840
  blockedReason: null,
@@ -3028,7 +3085,7 @@ export function createAutoContinueEngine(deps) {
3028
3085
  }
3029
3086
  setLaneState(run, {
3030
3087
  workstreamId: selectedWorkstreamId,
3031
- state: "blocked",
3088
+ state: LaneState.BLOCKED,
3032
3089
  activeRunId: null,
3033
3090
  activeTaskIds: [],
3034
3091
  blockedReason,
@@ -3123,7 +3180,7 @@ export function createAutoContinueEngine(deps) {
3123
3180
  }
3124
3181
  setLaneState(run, {
3125
3182
  workstreamId: selectedWorkstreamId,
3126
- state: "blocked",
3183
+ state: LaneState.BLOCKED,
3127
3184
  activeRunId: null,
3128
3185
  activeTaskIds: [],
3129
3186
  blockedReason,
@@ -3188,7 +3245,7 @@ export function createAutoContinueEngine(deps) {
3188
3245
  });
3189
3246
  setLaneState(run, {
3190
3247
  workstreamId: selectedWorkstreamId,
3191
- state: "rate_limited",
3248
+ state: LaneState.RATE_LIMITED,
3192
3249
  activeRunId: null,
3193
3250
  activeTaskIds: [],
3194
3251
  blockedReason,
@@ -3271,7 +3328,7 @@ export function createAutoContinueEngine(deps) {
3271
3328
  run.updatedAt = now;
3272
3329
  setLaneState(run, {
3273
3330
  workstreamId: selectedWorkstreamId,
3274
- state: "idle",
3331
+ state: LaneState.IDLE,
3275
3332
  activeRunId: null,
3276
3333
  activeTaskIds: [],
3277
3334
  blockedReason: null,
@@ -3379,7 +3436,7 @@ export function createAutoContinueEngine(deps) {
3379
3436
  }
3380
3437
  setLaneState(run, {
3381
3438
  workstreamId: selectedWorkstreamId,
3382
- state: "blocked",
3439
+ state: LaneState.BLOCKED,
3383
3440
  activeRunId: null,
3384
3441
  activeTaskIds: [],
3385
3442
  blockedReason,
@@ -3566,7 +3623,7 @@ export function createAutoContinueEngine(deps) {
3566
3623
  behaviorAutomationLevel,
3567
3624
  sourceClient: executorSourceClient,
3568
3625
  pid: spawned.pid,
3569
- status: "running",
3626
+ status: RunStatus.RUNNING,
3570
3627
  startedAt: now,
3571
3628
  finishedAt: null,
3572
3629
  updatedAt: now,
@@ -3684,7 +3741,7 @@ export function createAutoContinueEngine(deps) {
3684
3741
  run.activeTaskIds = dedupeStrings([...run.activeTaskIds, ...slice.taskIds]);
3685
3742
  setLaneState(run, {
3686
3743
  workstreamId: selectedWorkstreamId,
3687
- state: "running",
3744
+ state: LaneState.RUNNING,
3688
3745
  activeRunId: sliceRunId,
3689
3746
  activeTaskIds: slice.taskIds,
3690
3747
  blockedReason: null,
@@ -3763,16 +3820,16 @@ export function createAutoContinueEngine(deps) {
3763
3820
  }
3764
3821
  const lane = run.laneByWorkstreamId[workstreamId] ?? null;
3765
3822
  if (lane &&
3766
- (lane.state === "running" ||
3767
- lane.state === "blocked" ||
3768
- lane.state === "waiting_dependency" ||
3769
- lane.state === "rate_limited")) {
3823
+ (lane.state === LaneState.RUNNING ||
3824
+ lane.state === LaneState.BLOCKED ||
3825
+ lane.state === LaneState.WAITING_DEPENDENCY ||
3826
+ lane.state === LaneState.RATE_LIMITED)) {
3770
3827
  return run;
3771
3828
  }
3772
3829
  if (Array.isArray(run.allowedWorkstreamIds) &&
3773
3830
  run.allowedWorkstreamIds.length > 0 &&
3774
3831
  run.allowedWorkstreamIds.includes(workstreamId) &&
3775
- (run.status === "running" || run.status === "stopping")) {
3832
+ (run.status === RunStatus.RUNNING || run.status === RunStatus.STOPPING)) {
3776
3833
  return run;
3777
3834
  }
3778
3835
  return null;
@@ -3856,13 +3913,13 @@ export function createAutoContinueEngine(deps) {
3856
3913
  const existingRun = autoContinueRuns.get(initiativeId) ?? null;
3857
3914
  if (existingRun &&
3858
3915
  (existingRun.stopRequested ||
3859
- existingRun.status === "stopping" ||
3916
+ existingRun.status === RunStatus.STOPPING ||
3860
3917
  existingRun.stopReason === "stopped")) {
3861
3918
  await emitSkip("paused_by_user");
3862
3919
  return;
3863
3920
  }
3864
3921
  if (existingRun &&
3865
- (existingRun.status === "running" || existingRun.status === "stopping") &&
3922
+ (existingRun.status === RunStatus.RUNNING || existingRun.status === RunStatus.STOPPING) &&
3866
3923
  listActiveSliceRunIds(existingRun).length > 0) {
3867
3924
  const activeRunIds = listActiveSliceRunIds(existingRun);
3868
3925
  await emitSkip("already_running", {
@@ -4075,7 +4132,7 @@ export function createAutoContinueEngine(deps) {
4075
4132
  async function startAutoContinueRun(input) {
4076
4133
  const now = new Date().toISOString();
4077
4134
  const existing = autoContinueRuns.get(input.initiativeId) ?? null;
4078
- const existingIsLive = existing?.status === "running" || existing?.status === "stopping";
4135
+ const existingIsLive = existing?.status === RunStatus.RUNNING || existing?.status === RunStatus.STOPPING;
4079
4136
  const run = existing ??
4080
4137
  {
4081
4138
  initiativeId: input.initiativeId,
@@ -4090,7 +4147,7 @@ export function createAutoContinueEngine(deps) {
4090
4147
  scope: "task",
4091
4148
  tokenBudget: defaultAutoContinueTokenBudget(),
4092
4149
  tokensUsed: 0,
4093
- status: "running",
4150
+ status: RunStatus.RUNNING,
4094
4151
  stopReason: null,
4095
4152
  stopRequested: false,
4096
4153
  startedAt: now,
@@ -4133,7 +4190,7 @@ export function createAutoContinueEngine(deps) {
4133
4190
  ? normalizeTokenBudget(run.tokenBudget, defaultAutoContinueTokenBudget())
4134
4191
  : defaultAutoContinueTokenBudget();
4135
4192
  }
4136
- run.status = "running";
4193
+ run.status = RunStatus.RUNNING;
4137
4194
  run.stopReason = null;
4138
4195
  run.stopRequested = false;
4139
4196
  run.stoppedAt = null;
@@ -4216,8 +4273,8 @@ export function createAutoContinueEngine(deps) {
4216
4273
  event: "autopilot_transition",
4217
4274
  actionType: "run_state_transition",
4218
4275
  }),
4219
- old_state: "idle",
4220
- new_state: "running",
4276
+ old_state: LaneState.IDLE,
4277
+ new_state: LaneState.RUNNING,
4221
4278
  reason: "started",
4222
4279
  workspace_id: run.allowedWorkstreamIds?.[0] ?? null,
4223
4280
  },