@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.
- package/README.md +94 -122
- package/dashboard/dist/assets/0RUEVzJa.js +1 -0
- package/dashboard/dist/assets/0RUEVzJa.js.br +0 -0
- package/dashboard/dist/assets/0RUEVzJa.js.gz +0 -0
- package/dashboard/dist/assets/3TtV4moZ.js +1 -0
- package/dashboard/dist/assets/3TtV4moZ.js.br +0 -0
- package/dashboard/dist/assets/3TtV4moZ.js.gz +0 -0
- package/dashboard/dist/assets/3VwNyxUf.js +1 -0
- package/dashboard/dist/assets/3VwNyxUf.js.br +0 -0
- package/dashboard/dist/assets/3VwNyxUf.js.gz +0 -0
- package/dashboard/dist/assets/{beHYBbh6.js → 7DhYqBrM.js} +2 -2
- package/dashboard/dist/assets/7DhYqBrM.js.br +0 -0
- package/dashboard/dist/assets/7DhYqBrM.js.gz +0 -0
- package/dashboard/dist/assets/{tcEHYcbW.js → BCudUvwg.js} +1 -1
- package/dashboard/dist/assets/BCudUvwg.js.br +0 -0
- package/dashboard/dist/assets/BCudUvwg.js.gz +0 -0
- package/dashboard/dist/assets/BV0BcV1u.js +53 -0
- package/dashboard/dist/assets/BV0BcV1u.js.br +0 -0
- package/dashboard/dist/assets/BV0BcV1u.js.gz +0 -0
- package/dashboard/dist/assets/BVvffj0x.js +1 -0
- package/dashboard/dist/assets/BVvffj0x.js.br +0 -0
- package/dashboard/dist/assets/BVvffj0x.js.gz +0 -0
- package/dashboard/dist/assets/BiOgVMED.js +1 -0
- package/dashboard/dist/assets/BiOgVMED.js.br +0 -0
- package/dashboard/dist/assets/BiOgVMED.js.gz +0 -0
- package/dashboard/dist/assets/BjK42gtU.js +1 -0
- package/dashboard/dist/assets/BjK42gtU.js.br +0 -0
- package/dashboard/dist/assets/BjK42gtU.js.gz +0 -0
- package/dashboard/dist/assets/C-MOJWHs.js +1 -0
- package/dashboard/dist/assets/C-MOJWHs.js.br +0 -0
- package/dashboard/dist/assets/C-MOJWHs.js.gz +0 -0
- package/dashboard/dist/assets/{CD-q5mdP.js → C91KLKit.js} +1 -1
- package/dashboard/dist/assets/C91KLKit.js.br +0 -0
- package/dashboard/dist/assets/C91KLKit.js.gz +0 -0
- package/dashboard/dist/assets/{AqVoI3SF.js → C9fvfXmS.js} +1 -1
- package/dashboard/dist/assets/C9fvfXmS.js.br +0 -0
- package/dashboard/dist/assets/C9fvfXmS.js.gz +0 -0
- package/dashboard/dist/assets/CFZ4Swr5.js +1 -0
- package/dashboard/dist/assets/CFZ4Swr5.js.br +0 -0
- package/dashboard/dist/assets/CFZ4Swr5.js.gz +0 -0
- package/dashboard/dist/assets/{DCP-C7fn.js → CGj8kRhg.js} +1 -1
- package/dashboard/dist/assets/CGj8kRhg.js.br +0 -0
- package/dashboard/dist/assets/CGj8kRhg.js.gz +0 -0
- package/dashboard/dist/assets/CJjEAGFN.js +1 -0
- package/dashboard/dist/assets/CJjEAGFN.js.br +0 -0
- package/dashboard/dist/assets/CJjEAGFN.js.gz +0 -0
- package/dashboard/dist/assets/CKrH5fYO.js +1 -0
- package/dashboard/dist/assets/CKrH5fYO.js.br +0 -0
- package/dashboard/dist/assets/CKrH5fYO.js.gz +0 -0
- package/dashboard/dist/assets/CMTTPXch.js +1 -0
- package/dashboard/dist/assets/CMTTPXch.js.br +0 -0
- package/dashboard/dist/assets/CMTTPXch.js.gz +0 -0
- package/dashboard/dist/assets/CSlBSRyv.js +1 -0
- package/dashboard/dist/assets/CSlBSRyv.js.br +0 -0
- package/dashboard/dist/assets/CSlBSRyv.js.gz +0 -0
- package/dashboard/dist/assets/CnPC783_.js +1 -0
- package/dashboard/dist/assets/CnPC783_.js.br +0 -0
- package/dashboard/dist/assets/CnPC783_.js.gz +0 -0
- package/dashboard/dist/assets/Ctw95IkC.js +1 -0
- package/dashboard/dist/assets/Ctw95IkC.js.br +0 -0
- package/dashboard/dist/assets/Ctw95IkC.js.gz +0 -0
- package/dashboard/dist/assets/DHz-aQPw.js +1 -0
- package/dashboard/dist/assets/DHz-aQPw.js.br +0 -0
- package/dashboard/dist/assets/DHz-aQPw.js.gz +0 -0
- package/dashboard/dist/assets/DNX2foSJ.css +1 -0
- package/dashboard/dist/assets/DNX2foSJ.css.br +0 -0
- package/dashboard/dist/assets/DNX2foSJ.css.gz +0 -0
- package/dashboard/dist/assets/Dj2k1r16.js +8 -0
- package/dashboard/dist/assets/Dj2k1r16.js.br +0 -0
- package/dashboard/dist/assets/Dj2k1r16.js.gz +0 -0
- package/dashboard/dist/assets/DxUw4FMR.js +212 -0
- package/dashboard/dist/assets/DxUw4FMR.js.br +0 -0
- package/dashboard/dist/assets/DxUw4FMR.js.gz +0 -0
- package/dashboard/dist/assets/T2NFtzAv.js +1 -0
- package/dashboard/dist/assets/T2NFtzAv.js.br +0 -0
- package/dashboard/dist/assets/T2NFtzAv.js.gz +0 -0
- package/dashboard/dist/assets/cX2e-TLi.js +1 -0
- package/dashboard/dist/assets/cX2e-TLi.js.br +0 -0
- package/dashboard/dist/assets/cX2e-TLi.js.gz +0 -0
- package/dashboard/dist/assets/eeHXe_OQ.js +9 -0
- package/dashboard/dist/assets/eeHXe_OQ.js.br +0 -0
- package/dashboard/dist/assets/eeHXe_OQ.js.gz +0 -0
- package/dashboard/dist/assets/{Du1wfrXa.js → gZr_xKlA.js} +2 -2
- package/dashboard/dist/assets/gZr_xKlA.js.br +0 -0
- package/dashboard/dist/assets/gZr_xKlA.js.gz +0 -0
- package/dashboard/dist/brand/control-tower.png +0 -0
- package/dashboard/dist/brand/design-codex.png +0 -0
- package/dashboard/dist/brand/engineering-autopilot.png +0 -0
- package/dashboard/dist/brand/launch-captain.png +0 -0
- package/dashboard/dist/brand/orgx-logo.png +0 -0
- package/dashboard/dist/brand/pipeline-intelligence.png +0 -0
- package/dashboard/dist/brand/product-orchestrator.png +0 -0
- package/dashboard/dist/brand/xandy-orchestrator.png +0 -0
- package/dashboard/dist/index.html +8 -6
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/hash-utils.d.ts +1 -0
- package/dist/hash-utils.js +4 -0
- package/dist/http/helpers/auto-continue-engine.js +124 -67
- package/dist/http/helpers/autopilot-slice-utils.js +112 -66
- package/dist/http/helpers/hash-utils.d.ts +1 -1
- package/dist/http/helpers/hash-utils.js +1 -1
- package/dist/http/helpers/mission-control.js +5 -2
- package/dist/http/helpers/queue-constants.d.ts +37 -0
- package/dist/http/helpers/queue-constants.js +34 -0
- package/dist/http/helpers/slice-experience-v2.js +2 -5
- package/dist/http/helpers/slice-run-projections.js +2 -5
- package/dist/http/helpers/workspace-scope.js +4 -3
- package/dist/http/index.js +101 -60
- package/dist/http/routes/chat.js +1 -21
- package/dist/http/routes/live-snapshot.js +4 -23
- package/dist/http/routes/mission-control-actions.js +2 -18
- package/dist/http/routes/mission-control-read.js +4 -107
- package/dist/lib/type-coercion.d.ts +10 -0
- package/dist/lib/type-coercion.js +82 -0
- package/dist/mcp-http-handler.js +14 -2
- package/dist/openclaw.plugin.json +1 -1
- package/dist/services/experiment-randomization.js +9 -2
- package/openclaw.plugin.json +1 -1
- package/package.json +3 -2
- package/dashboard/dist/assets/AqVoI3SF.js.br +0 -0
- package/dashboard/dist/assets/AqVoI3SF.js.gz +0 -0
- package/dashboard/dist/assets/BC4WvnHJ.js +0 -1
- package/dashboard/dist/assets/BC4WvnHJ.js.br +0 -0
- package/dashboard/dist/assets/BC4WvnHJ.js.gz +0 -0
- package/dashboard/dist/assets/BG5mwTkg.js +0 -1
- package/dashboard/dist/assets/BG5mwTkg.js.br +0 -0
- package/dashboard/dist/assets/BG5mwTkg.js.gz +0 -0
- package/dashboard/dist/assets/BJgZIVUQ.js +0 -53
- package/dashboard/dist/assets/BJgZIVUQ.js.br +0 -0
- package/dashboard/dist/assets/BJgZIVUQ.js.gz +0 -0
- package/dashboard/dist/assets/BNh-XYPV.js +0 -1
- package/dashboard/dist/assets/BNh-XYPV.js.br +0 -0
- package/dashboard/dist/assets/BNh-XYPV.js.gz +0 -0
- package/dashboard/dist/assets/BTAEErUY.js +0 -1
- package/dashboard/dist/assets/BTAEErUY.js.br +0 -0
- package/dashboard/dist/assets/BTAEErUY.js.gz +0 -0
- package/dashboard/dist/assets/BepW_590.js +0 -1
- package/dashboard/dist/assets/BepW_590.js.br +0 -0
- package/dashboard/dist/assets/BepW_590.js.gz +0 -0
- package/dashboard/dist/assets/BerAfzjq.js +0 -1
- package/dashboard/dist/assets/BerAfzjq.js.br +0 -0
- package/dashboard/dist/assets/BerAfzjq.js.gz +0 -0
- package/dashboard/dist/assets/Bp3N-QL5.js +0 -212
- package/dashboard/dist/assets/Bp3N-QL5.js.br +0 -0
- package/dashboard/dist/assets/Bp3N-QL5.js.gz +0 -0
- package/dashboard/dist/assets/C-KIc3Wc.js +0 -1
- package/dashboard/dist/assets/C-KIc3Wc.js.br +0 -0
- package/dashboard/dist/assets/C-KIc3Wc.js.gz +0 -0
- package/dashboard/dist/assets/C3dZRz9P.css +0 -1
- package/dashboard/dist/assets/C3dZRz9P.css.br +0 -0
- package/dashboard/dist/assets/C3dZRz9P.css.gz +0 -0
- package/dashboard/dist/assets/CD-q5mdP.js.br +0 -0
- package/dashboard/dist/assets/CD-q5mdP.js.gz +0 -0
- package/dashboard/dist/assets/CL_wXqR7.js +0 -1
- package/dashboard/dist/assets/CL_wXqR7.js.br +0 -0
- package/dashboard/dist/assets/CL_wXqR7.js.gz +0 -0
- package/dashboard/dist/assets/CdvjC9G9.js +0 -1
- package/dashboard/dist/assets/CdvjC9G9.js.br +0 -0
- package/dashboard/dist/assets/CdvjC9G9.js.gz +0 -0
- package/dashboard/dist/assets/Ck2agw-s.js +0 -1
- package/dashboard/dist/assets/Ck2agw-s.js.br +0 -0
- package/dashboard/dist/assets/Ck2agw-s.js.gz +0 -0
- package/dashboard/dist/assets/CxQ08qFN.js +0 -9
- package/dashboard/dist/assets/CxQ08qFN.js.br +0 -0
- package/dashboard/dist/assets/CxQ08qFN.js.gz +0 -0
- package/dashboard/dist/assets/D2CH1H6k.js +0 -1
- package/dashboard/dist/assets/D2CH1H6k.js.br +0 -0
- package/dashboard/dist/assets/D2CH1H6k.js.gz +0 -0
- package/dashboard/dist/assets/D9esz7jd.js +0 -1
- package/dashboard/dist/assets/D9esz7jd.js.br +0 -0
- package/dashboard/dist/assets/D9esz7jd.js.gz +0 -0
- package/dashboard/dist/assets/DCP-C7fn.js.br +0 -0
- package/dashboard/dist/assets/DCP-C7fn.js.gz +0 -0
- package/dashboard/dist/assets/DJASCd69.js +0 -1
- package/dashboard/dist/assets/DJASCd69.js.br +0 -0
- package/dashboard/dist/assets/DJASCd69.js.gz +0 -0
- package/dashboard/dist/assets/Dm9AybAp.js +0 -1
- package/dashboard/dist/assets/Dm9AybAp.js.br +0 -0
- package/dashboard/dist/assets/Dm9AybAp.js.gz +0 -0
- package/dashboard/dist/assets/Du1wfrXa.js.br +0 -0
- package/dashboard/dist/assets/Du1wfrXa.js.gz +0 -0
- package/dashboard/dist/assets/beHYBbh6.js.br +0 -0
- package/dashboard/dist/assets/beHYBbh6.js.gz +0 -0
- package/dashboard/dist/assets/cNrhgGc1.js +0 -8
- package/dashboard/dist/assets/cNrhgGc1.js.br +0 -0
- package/dashboard/dist/assets/cNrhgGc1.js.gz +0 -0
- package/dashboard/dist/assets/tcEHYcbW.js.br +0 -0
- 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:
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 =
|
|
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 ===
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
1991
|
+
operationalParsedStatus === "completed"
|
|
1976
1992
|
? "completed"
|
|
1977
|
-
:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 ||
|
|
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:
|
|
2396
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
2505
|
+
state: LaneState.BLOCKED,
|
|
2447
2506
|
activeRunId: null,
|
|
2448
2507
|
activeTaskIds: [],
|
|
2449
2508
|
blockedReason: parsed?.summary ??
|
|
2450
2509
|
slice.lastError ??
|
|
2451
|
-
`Slice returned status: ${
|
|
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:
|
|
2461
|
-
error:
|
|
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:
|
|
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:
|
|
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 =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 ===
|
|
3767
|
-
lane.state ===
|
|
3768
|
-
lane.state ===
|
|
3769
|
-
lane.state ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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:
|
|
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 =
|
|
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:
|
|
4220
|
-
new_state:
|
|
4276
|
+
old_state: LaneState.IDLE,
|
|
4277
|
+
new_state: LaneState.RUNNING,
|
|
4221
4278
|
reason: "started",
|
|
4222
4279
|
workspace_id: run.allowedWorkstreamIds?.[0] ?? null,
|
|
4223
4280
|
},
|