@jterrats/open-orchestra 0.4.0 → 0.4.2-beta.1
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/CHANGELOG.md +21 -0
- package/dist/assets/web-console.js +91 -1
- package/dist/autonomous-phase-lifecycle.d.ts +26 -0
- package/dist/autonomous-phase-lifecycle.js +214 -0
- package/dist/autonomous-phase-lifecycle.js.map +1 -0
- package/dist/autonomous-run-state.d.ts +8 -0
- package/dist/autonomous-run-state.js +162 -0
- package/dist/autonomous-run-state.js.map +1 -0
- package/dist/autonomous-run-store.d.ts +17 -0
- package/dist/autonomous-run-store.js +89 -0
- package/dist/autonomous-run-store.js.map +1 -0
- package/dist/autonomous-workflow-constants.d.ts +7 -0
- package/dist/autonomous-workflow-constants.js +36 -0
- package/dist/autonomous-workflow-constants.js.map +1 -0
- package/dist/autonomous-workflow.d.ts +6 -45
- package/dist/autonomous-workflow.js +4 -394
- package/dist/autonomous-workflow.js.map +1 -1
- package/dist/benchmark.js +16 -0
- package/dist/benchmark.js.map +1 -1
- package/dist/clarification.d.ts +2 -0
- package/dist/clarification.js +23 -5
- package/dist/clarification.js.map +1 -1
- package/dist/cli.js +101 -14
- package/dist/cli.js.map +1 -1
- package/dist/command-manifest.js +8 -0
- package/dist/command-manifest.js.map +1 -1
- package/dist/command-utils.d.ts +6 -0
- package/dist/command-utils.js +19 -0
- package/dist/command-utils.js.map +1 -0
- package/dist/commands.d.ts +15 -43
- package/dist/commands.js +466 -912
- package/dist/commands.js.map +1 -1
- package/dist/constants.js +20 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaults.d.ts +11 -0
- package/dist/defaults.js +11 -0
- package/dist/defaults.js.map +1 -1
- package/dist/instruction-commands.d.ts +5 -0
- package/dist/instruction-commands.js +98 -0
- package/dist/instruction-commands.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +47 -0
- package/dist/mcp-oauth-proxy.js +276 -0
- package/dist/mcp-oauth-proxy.js.map +1 -1
- package/dist/memory.d.ts +11 -0
- package/dist/memory.js +224 -0
- package/dist/memory.js.map +1 -0
- package/dist/metrics-commands.d.ts +3 -0
- package/dist/metrics-commands.js +123 -0
- package/dist/metrics-commands.js.map +1 -0
- package/dist/model-commands.d.ts +13 -0
- package/dist/model-commands.js +216 -0
- package/dist/model-commands.js.map +1 -0
- package/dist/notifications.d.ts +25 -0
- package/dist/notifications.js +187 -11
- package/dist/notifications.js.map +1 -1
- package/dist/package-update-check.d.ts +19 -0
- package/dist/package-update-check.js +123 -0
- package/dist/package-update-check.js.map +1 -0
- package/dist/runtime-adapters.d.ts +5 -1
- package/dist/runtime-adapters.js +27 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +4 -2
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.d.ts +9 -0
- package/dist/runtime-commands.js +156 -0
- package/dist/runtime-commands.js.map +1 -0
- package/dist/runtime-execution-adapters.d.ts +2 -0
- package/dist/runtime-execution-adapters.js +163 -0
- package/dist/runtime-execution-adapters.js.map +1 -0
- package/dist/runtime-execution-renderer.d.ts +10 -0
- package/dist/runtime-execution-renderer.js +113 -0
- package/dist/runtime-execution-renderer.js.map +1 -0
- package/dist/runtime-execution.d.ts +27 -0
- package/dist/runtime-execution.js +153 -0
- package/dist/runtime-execution.js.map +1 -0
- package/dist/skills-commands.d.ts +10 -0
- package/dist/skills-commands.js +138 -0
- package/dist/skills-commands.js.map +1 -0
- package/dist/skills.d.ts +7 -1
- package/dist/skills.js +120 -11
- package/dist/skills.js.map +1 -1
- package/dist/sprint-commands.d.ts +5 -0
- package/dist/sprint-commands.js +120 -0
- package/dist/sprint-commands.js.map +1 -0
- package/dist/subagent-protocol.js +6 -0
- package/dist/subagent-protocol.js.map +1 -1
- package/dist/telemetry-commands.d.ts +7 -0
- package/dist/telemetry-commands.js +82 -0
- package/dist/telemetry-commands.js.map +1 -0
- package/dist/tool-commands.d.ts +5 -0
- package/dist/tool-commands.js +159 -0
- package/dist/tool-commands.js.map +1 -0
- package/dist/types.d.ts +206 -4
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +93 -1
- package/dist/web-api.js.map +1 -1
- package/dist/web-chart-contracts.d.ts +3 -1
- package/dist/web-chart-contracts.js +6 -0
- package/dist/web-chart-contracts.js.map +1 -1
- package/dist/web-console.js +2 -2
- package/dist/workflow-services.d.ts +21 -3
- package/dist/workflow-services.js +474 -10
- package/dist/workflow-services.js.map +1 -1
- package/docs/runtime-llm-flow.md +46 -0
- package/package.json +2 -1
- package/skills/proactive-orchestra/SKILL.md +27 -0
- package/skills/proactive-orchestra/manifest.json +41 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.4.1 - 2026-05-07
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added runtime execution commands for CLI and IDE-hosted agents:
|
|
10
|
+
`runtime brief`, `runtime delegate-plan`, `runtime handoff`, and
|
|
11
|
+
`runtime bootstrap`.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Split CLI command handlers into focused domain modules while keeping the
|
|
16
|
+
existing command facade stable.
|
|
17
|
+
- Split large autonomous workflow and benchmark test suites into
|
|
18
|
+
behavior-focused files with shared helpers.
|
|
19
|
+
- Runtime documentation now clarifies local CLI/IDE delegation flows that do not
|
|
20
|
+
require direct provider API calls.
|
|
21
|
+
|
|
22
|
+
### Validation
|
|
23
|
+
|
|
24
|
+
- `npm run precommit` passed after the release bump.
|
|
25
|
+
|
|
5
26
|
## 0.4.0 - 2026-05-07
|
|
6
27
|
|
|
7
28
|
### Added
|
|
@@ -6,6 +6,10 @@ function buildDashboardChartData(input) {
|
|
|
6
6
|
graphState: GRAPH_STATE_LABELS.map((label) => ({
|
|
7
7
|
label,
|
|
8
8
|
value: input.graph[label].length
|
|
9
|
+
})).filter((slice) => slice.value > 0),
|
|
10
|
+
costByProvider: (input.usage?.byProvider ?? []).map((provider) => ({
|
|
11
|
+
label: provider.key,
|
|
12
|
+
value: provider.estimatedCostUsd
|
|
9
13
|
})).filter((slice) => slice.value > 0)
|
|
10
14
|
};
|
|
11
15
|
}
|
|
@@ -18,6 +22,8 @@ var endpoints = [
|
|
|
18
22
|
["roles", "/api/roles"],
|
|
19
23
|
["evidence", "/api/evidence"],
|
|
20
24
|
["approvals", "/api/approvals"],
|
|
25
|
+
["usage", "/api/usage"],
|
|
26
|
+
["budget", "/api/budget"],
|
|
21
27
|
["tasks", "/api/tasks"],
|
|
22
28
|
["evidenceView", "/api/evidence/view"],
|
|
23
29
|
["roleActivation", "/api/roles/activation"],
|
|
@@ -34,12 +40,14 @@ var validation = document.querySelector("#validation");
|
|
|
34
40
|
var workspaceView = document.querySelector("#workspace-view");
|
|
35
41
|
var graph = document.querySelector("#graph");
|
|
36
42
|
var actions = document.querySelector("#actions");
|
|
43
|
+
var taskOwner = document.querySelector("#task-owner");
|
|
37
44
|
var charts = document.querySelector("#charts");
|
|
38
45
|
var evidenceTask = document.querySelector("#evidence-task");
|
|
39
46
|
var evidenceType = document.querySelector("#evidence-type");
|
|
40
47
|
var evidenceList = document.querySelector("#evidence-list");
|
|
41
48
|
var rolesView = document.querySelector("#roles-view");
|
|
42
49
|
var planningView = document.querySelector("#planning-view");
|
|
50
|
+
var costView = document.querySelector("#cost-view");
|
|
43
51
|
var playwrightTask = document.querySelector("#playwright-task");
|
|
44
52
|
var playwrightPlan = document.querySelector("#playwright-plan");
|
|
45
53
|
var skillsTask = document.querySelector("#skills-task");
|
|
@@ -56,6 +64,7 @@ var lessonPromotionResult = document.querySelector(
|
|
|
56
64
|
);
|
|
57
65
|
var taskStatusChart;
|
|
58
66
|
var graphStateChart;
|
|
67
|
+
var providerCostChart;
|
|
59
68
|
var themeToggle = document.querySelector("#theme-toggle");
|
|
60
69
|
applyStoredTheme();
|
|
61
70
|
themeToggle.addEventListener("click", toggleTheme);
|
|
@@ -69,6 +78,7 @@ document.querySelector("#skills-plan").addEventListener("click", loadSkillPlan);
|
|
|
69
78
|
document.querySelector("#skills-render").addEventListener("click", loadSkillRender);
|
|
70
79
|
document.querySelector("#lesson-add").addEventListener("click", addLesson);
|
|
71
80
|
document.querySelector("#lesson-promote").addEventListener("click", promoteLessons);
|
|
81
|
+
document.querySelector("#task-add").addEventListener("click", addTaskFromWeb);
|
|
72
82
|
loadDashboard();
|
|
73
83
|
function applyStoredTheme() {
|
|
74
84
|
const stored = localStorage.getItem("open-orchestra-theme");
|
|
@@ -115,17 +125,20 @@ function render(data) {
|
|
|
115
125
|
metric(String(data.roles.length), "Roles"),
|
|
116
126
|
metric(String(data.evidence.length), "Evidence"),
|
|
117
127
|
metric(String(data.approvals.length), "Approvals"),
|
|
128
|
+
metric(formatCurrency(data.usage.totals.estimatedCostUsd), "Est. Cost"),
|
|
118
129
|
metric(data.validation.valid ? "Valid" : "Needs work", "Workspace")
|
|
119
130
|
]);
|
|
120
131
|
renderValidation(data.validation);
|
|
121
132
|
renderWorkspace(data.workspaceClassification, data.runtimeAdapters);
|
|
122
133
|
renderGraph(data.graph);
|
|
123
134
|
renderActions(data);
|
|
135
|
+
renderTaskWriteControls(data.roles);
|
|
124
136
|
renderCharts(data);
|
|
125
137
|
renderEvidenceControls(data);
|
|
126
138
|
renderEvidence(data.evidenceView);
|
|
127
139
|
renderRoles(data.roleActivation);
|
|
128
140
|
renderPlanning(data.roleActivation);
|
|
141
|
+
renderCost(data.usage, data.budget);
|
|
129
142
|
renderPlaywrightTasks(data.tasks);
|
|
130
143
|
renderSkillControls(data);
|
|
131
144
|
renderSkillCatalog(data.skills, data.sources);
|
|
@@ -134,6 +147,46 @@ function render(data) {
|
|
|
134
147
|
loadPlaywrightPlan();
|
|
135
148
|
loadSkillPlan();
|
|
136
149
|
}
|
|
150
|
+
function renderTaskWriteControls(roles) {
|
|
151
|
+
replace(
|
|
152
|
+
taskOwner,
|
|
153
|
+
roles.map(function(role) {
|
|
154
|
+
return option(role.id, role.id);
|
|
155
|
+
})
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
async function addTaskFromWeb() {
|
|
159
|
+
const id = document.querySelector("#task-id").value.trim();
|
|
160
|
+
const title = document.querySelector("#task-title").value.trim();
|
|
161
|
+
if (!id || !title || !taskOwner.value) {
|
|
162
|
+
setLoading("Task id, title, and owner are required", "warn");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const response = await fetch("/api/tasks/add", {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: { "content-type": "application/json" },
|
|
168
|
+
body: JSON.stringify({
|
|
169
|
+
id,
|
|
170
|
+
title,
|
|
171
|
+
ownerRole: taskOwner.value,
|
|
172
|
+
paths: csvValues(document.querySelector("#task-paths").value),
|
|
173
|
+
acceptanceCriteria: csvValues(
|
|
174
|
+
document.querySelector("#task-acceptance").value
|
|
175
|
+
),
|
|
176
|
+
risks: csvValues(document.querySelector("#task-risks").value)
|
|
177
|
+
})
|
|
178
|
+
});
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
setLoading("Task add failed", "warn");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
["#task-id", "#task-title", "#task-paths", "#task-acceptance", "#task-risks"].map(function(selector) {
|
|
184
|
+
return document.querySelector(selector);
|
|
185
|
+
}).forEach(function(input) {
|
|
186
|
+
input.value = "";
|
|
187
|
+
});
|
|
188
|
+
await loadDashboard();
|
|
189
|
+
}
|
|
137
190
|
function renderWorkspace(classification, adapters) {
|
|
138
191
|
const adapterNames = adapters.map(function(adapter) {
|
|
139
192
|
return adapter.label;
|
|
@@ -149,7 +202,7 @@ function renderWorkspace(classification, adapters) {
|
|
|
149
202
|
}
|
|
150
203
|
function renderCharts(data) {
|
|
151
204
|
const chartData = buildDashboardChartData(data);
|
|
152
|
-
const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0;
|
|
205
|
+
const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0 || chartData.costByProvider.length > 0;
|
|
153
206
|
charts.hidden = !hasChartData;
|
|
154
207
|
if (!hasChartData || !globalThis.Chart) {
|
|
155
208
|
return;
|
|
@@ -166,6 +219,12 @@ function renderCharts(data) {
|
|
|
166
219
|
"bar",
|
|
167
220
|
chartData.graphState
|
|
168
221
|
);
|
|
222
|
+
providerCostChart = renderChart(
|
|
223
|
+
providerCostChart,
|
|
224
|
+
"provider-cost-chart",
|
|
225
|
+
"bar",
|
|
226
|
+
chartData.costByProvider
|
|
227
|
+
);
|
|
169
228
|
}
|
|
170
229
|
function renderChart(current, canvasId, type, slices) {
|
|
171
230
|
const style = getComputedStyle(document.documentElement);
|
|
@@ -214,6 +273,34 @@ function renderChart(current, canvasId, type, slices) {
|
|
|
214
273
|
}
|
|
215
274
|
});
|
|
216
275
|
}
|
|
276
|
+
function renderCost(usage, budget) {
|
|
277
|
+
const rows = [
|
|
278
|
+
listItem("Requests", String(usage.totals.requests)),
|
|
279
|
+
listItem("Total tokens", String(usage.totals.totalTokens)),
|
|
280
|
+
listItem("Estimated cost", formatCurrency(usage.totals.estimatedCostUsd)),
|
|
281
|
+
listItem(
|
|
282
|
+
"Budget",
|
|
283
|
+
budget.passed ? "Within configured limits" : budget.violations.length + " violation(s)"
|
|
284
|
+
)
|
|
285
|
+
];
|
|
286
|
+
usage.byProvider.slice(0, 6).forEach(function(provider) {
|
|
287
|
+
rows.push(
|
|
288
|
+
listItem(
|
|
289
|
+
provider.key,
|
|
290
|
+
provider.requests + " request(s) - " + provider.totalTokens + " tokens - " + formatCurrency(provider.estimatedCostUsd)
|
|
291
|
+
)
|
|
292
|
+
);
|
|
293
|
+
});
|
|
294
|
+
budget.violations.slice(0, 6).forEach(function(violation) {
|
|
295
|
+
rows.push(
|
|
296
|
+
listItem(
|
|
297
|
+
"Budget violation: " + violation.scope,
|
|
298
|
+
violation.metric + " " + violation.actual + " / " + violation.limit
|
|
299
|
+
)
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
replace(costView, rows);
|
|
303
|
+
}
|
|
217
304
|
async function loadEvidence() {
|
|
218
305
|
const query = new URLSearchParams();
|
|
219
306
|
if (evidenceTask.value) {
|
|
@@ -706,6 +793,9 @@ function metric(value, label) {
|
|
|
706
793
|
node.append(strong, span);
|
|
707
794
|
return node;
|
|
708
795
|
}
|
|
796
|
+
function formatCurrency(value) {
|
|
797
|
+
return "$" + Number(value || 0).toFixed(4);
|
|
798
|
+
}
|
|
709
799
|
function listItem(title, detail) {
|
|
710
800
|
const node = document.createElement("li");
|
|
711
801
|
node.className = "list-item";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
2
|
+
import type { AutonomousPhase, AutonomousRun, SizingLabel } from "./types.js";
|
|
3
|
+
export type SizingCheckResult = {
|
|
4
|
+
found: true;
|
|
5
|
+
sizing: SizingLabel;
|
|
6
|
+
points?: number;
|
|
7
|
+
} | {
|
|
8
|
+
found: false;
|
|
9
|
+
};
|
|
10
|
+
export declare function checkArchitectSizing(root: string, taskId: string): Promise<SizingCheckResult>;
|
|
11
|
+
export type PhaseOutcome = {
|
|
12
|
+
kind: "done";
|
|
13
|
+
notes: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: "gate_pause";
|
|
16
|
+
reviewArtifact: string;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "qa_fail";
|
|
19
|
+
notes: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function initPhase(root: string, run: AutonomousRun, phaseIndex: number, retryContext?: string, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousPhase>;
|
|
22
|
+
export declare function closePhase(root: string, run: AutonomousRun, phaseIndex: number, outcome: PhaseOutcome, sequence?: AutonomousPhaseDefinition[]): Promise<{
|
|
23
|
+
run: AutonomousRun;
|
|
24
|
+
handoffArtifact?: string;
|
|
25
|
+
reviewArtifact?: string;
|
|
26
|
+
}>;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { appendEvent, readEvents, writeArtifact } from "./workspace.js";
|
|
2
|
+
import { addTask, createHandoff, updateTask } from "./workflow-services.js";
|
|
3
|
+
import { notifyGatePaused, notifyWorkflowLifecycle } from "./notifications.js";
|
|
4
|
+
import { AUTONOMOUS_PHASE_SEQUENCE, PHASE_GATES, } from "./autonomous-workflow-constants.js";
|
|
5
|
+
import { persistRun } from "./autonomous-run-store.js";
|
|
6
|
+
import { SIZING_LABELS } from "./types.js";
|
|
7
|
+
export async function checkArchitectSizing(root, taskId) {
|
|
8
|
+
const events = await readEvents(root);
|
|
9
|
+
for (const event of events) {
|
|
10
|
+
if (event.type === "DECISION_RECORDED" &&
|
|
11
|
+
event.taskId === taskId &&
|
|
12
|
+
event.actor === "architect") {
|
|
13
|
+
const sizing = event.metadata.sizing;
|
|
14
|
+
if (typeof sizing === "string" &&
|
|
15
|
+
SIZING_LABELS.includes(sizing)) {
|
|
16
|
+
const points = typeof event.metadata.points === "number"
|
|
17
|
+
? event.metadata.points
|
|
18
|
+
: undefined;
|
|
19
|
+
return {
|
|
20
|
+
found: true,
|
|
21
|
+
sizing: sizing,
|
|
22
|
+
...(points !== undefined ? { points } : {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { found: false };
|
|
28
|
+
}
|
|
29
|
+
export async function initPhase(root, run, phaseIndex, retryContext, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
30
|
+
const def = sequence[phaseIndex];
|
|
31
|
+
if (!def)
|
|
32
|
+
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
33
|
+
const now = new Date().toISOString();
|
|
34
|
+
const runSuffix = run.id.slice(-6);
|
|
35
|
+
const iteration = run.phases.filter((p) => p.phase === def.phase).length;
|
|
36
|
+
const phaseTaskId = iteration === 0
|
|
37
|
+
? `${run.taskId}-${def.phase}-${runSuffix}`
|
|
38
|
+
: `${run.taskId}-${def.phase}-${runSuffix}-retry${iteration}`;
|
|
39
|
+
const prevDef = phaseIndex > 0 ? sequence[phaseIndex - 1] : undefined;
|
|
40
|
+
const prevPhaseTaskId = prevDef
|
|
41
|
+
? `${run.taskId}-${prevDef.phase}-${runSuffix}`
|
|
42
|
+
: undefined;
|
|
43
|
+
await addTask({
|
|
44
|
+
id: phaseTaskId,
|
|
45
|
+
title: `[${def.phase.toUpperCase()}] ${run.taskId}${iteration > 0 ? ` (retry ${iteration})` : ""}`,
|
|
46
|
+
ownerRole: def.role,
|
|
47
|
+
dependencies: prevPhaseTaskId ? [prevPhaseTaskId] : [],
|
|
48
|
+
...(retryContext ? { blockedReason: retryContext } : {}),
|
|
49
|
+
}, root);
|
|
50
|
+
return {
|
|
51
|
+
phase: def.phase,
|
|
52
|
+
role: def.role,
|
|
53
|
+
status: "running",
|
|
54
|
+
taskId: phaseTaskId,
|
|
55
|
+
startedAt: now,
|
|
56
|
+
...(retryContext ? { notes: retryContext } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function closePhase(root, run, phaseIndex, outcome, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
60
|
+
let resolvedOutcome = outcome;
|
|
61
|
+
const now = new Date().toISOString();
|
|
62
|
+
const def = sequence[phaseIndex];
|
|
63
|
+
const nextDef = sequence[phaseIndex + 1];
|
|
64
|
+
if (!def)
|
|
65
|
+
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
66
|
+
const phase = run.phases.find((p) => p.phase === def.phase);
|
|
67
|
+
if (!phase)
|
|
68
|
+
throw new Error(`phase not found in run: ${def.phase}`);
|
|
69
|
+
let handoffArtifact;
|
|
70
|
+
let reviewArtifact;
|
|
71
|
+
if (outcome.kind === "done" && nextDef) {
|
|
72
|
+
const handoffResult = await createHandoff({
|
|
73
|
+
task: run.taskId,
|
|
74
|
+
from: def.role,
|
|
75
|
+
to: nextDef.role,
|
|
76
|
+
changed: `Phase ${def.phase} completed`,
|
|
77
|
+
behavior: def.summary,
|
|
78
|
+
tests: "See phase task evidence",
|
|
79
|
+
commands: "See phase task evidence",
|
|
80
|
+
status: "ready_for_review",
|
|
81
|
+
}, root);
|
|
82
|
+
handoffArtifact = handoffResult.artifact;
|
|
83
|
+
const transitionKey = `${def.phase}→${nextDef.phase}`;
|
|
84
|
+
const needsGate = run.gates === "all" ||
|
|
85
|
+
(run.gates === "phase" && PHASE_GATES.has(transitionKey));
|
|
86
|
+
if (needsGate) {
|
|
87
|
+
const reviewResult = await createGateReview(root, run, def, nextDef, transitionKey);
|
|
88
|
+
reviewArtifact = reviewResult.artifact;
|
|
89
|
+
resolvedOutcome = {
|
|
90
|
+
kind: "gate_pause",
|
|
91
|
+
reviewArtifact: reviewResult.artifact,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const updatedPhase = {
|
|
96
|
+
...phase,
|
|
97
|
+
status: outcomeToPhaseStatus(resolvedOutcome),
|
|
98
|
+
...(resolvedOutcome.kind === "gate_pause" && nextDef
|
|
99
|
+
? { gateId: `${def.phase}->${nextDef.phase}` }
|
|
100
|
+
: {}),
|
|
101
|
+
...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
|
|
102
|
+
...(reviewArtifact !== undefined ? { reviewArtifact } : {}),
|
|
103
|
+
notes: resolvedOutcome.kind !== "gate_pause"
|
|
104
|
+
? resolvedOutcome.notes
|
|
105
|
+
: `Gate pause — review pending`,
|
|
106
|
+
completedAt: now,
|
|
107
|
+
};
|
|
108
|
+
const updatedPhases = run.phases.map((p) => p.phase === def.phase ? updatedPhase : p);
|
|
109
|
+
const allDone = resolvedOutcome.kind === "done" &&
|
|
110
|
+
!nextDef &&
|
|
111
|
+
updatedPhases.every((p) => p.status === "done");
|
|
112
|
+
const updatedRun = {
|
|
113
|
+
...run,
|
|
114
|
+
phases: updatedPhases,
|
|
115
|
+
qaIterations: def.phase === "qa" && resolvedOutcome.kind === "qa_fail"
|
|
116
|
+
? run.qaIterations + 1
|
|
117
|
+
: run.qaIterations,
|
|
118
|
+
status: resolvedOutcome.kind === "gate_pause"
|
|
119
|
+
? "paused"
|
|
120
|
+
: allDone
|
|
121
|
+
? "done"
|
|
122
|
+
: "running",
|
|
123
|
+
updatedAt: now,
|
|
124
|
+
};
|
|
125
|
+
await persistRun(root, updatedRun);
|
|
126
|
+
if (resolvedOutcome.kind === "gate_pause") {
|
|
127
|
+
await appendEvent(root, {
|
|
128
|
+
type: "AUTONOMOUS_GATE_PAUSED",
|
|
129
|
+
taskId: run.taskId,
|
|
130
|
+
actor: def.role,
|
|
131
|
+
summary: `Gate pause at ${def.phase}→${nextDef?.phase ?? "end"}`,
|
|
132
|
+
metadata: {
|
|
133
|
+
runId: run.id,
|
|
134
|
+
phase: def.phase,
|
|
135
|
+
gateId: `${def.phase}->${nextDef?.phase ?? "end"}`,
|
|
136
|
+
reviewArtifact,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
if (reviewArtifact) {
|
|
140
|
+
await notifyGatePaused({
|
|
141
|
+
root,
|
|
142
|
+
run: updatedRun,
|
|
143
|
+
transitionKey: `${def.phase}→${nextDef?.phase ?? "end"}`,
|
|
144
|
+
reviewArtifact,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (resolvedOutcome.kind === "done") {
|
|
149
|
+
await appendEvent(root, {
|
|
150
|
+
type: "AUTONOMOUS_PHASE_DONE",
|
|
151
|
+
taskId: run.taskId,
|
|
152
|
+
actor: def.role,
|
|
153
|
+
summary: `Phase ${def.phase} completed`,
|
|
154
|
+
metadata: { runId: run.id, phase: def.phase, handoffArtifact },
|
|
155
|
+
});
|
|
156
|
+
await updateTask({ id: phase.taskId, status: "done" }, root);
|
|
157
|
+
}
|
|
158
|
+
else if (resolvedOutcome.kind === "qa_fail") {
|
|
159
|
+
await notifyWorkflowLifecycle({
|
|
160
|
+
root,
|
|
161
|
+
taskId: run.taskId,
|
|
162
|
+
kind: "qa_retry",
|
|
163
|
+
runId: run.id,
|
|
164
|
+
phase: def.phase,
|
|
165
|
+
actor: def.role,
|
|
166
|
+
detail: resolvedOutcome.notes,
|
|
167
|
+
idempotencyKey: `qa_retry:${run.id}:${updatedRun.qaIterations}`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
run: updatedRun,
|
|
172
|
+
...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
|
|
173
|
+
...(reviewArtifact !== undefined ? { reviewArtifact } : {}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
async function createGateReview(root, run, from, to, transitionKey) {
|
|
177
|
+
const fileName = `${run.taskId}-gate-${transitionKey.replace("→", "-to-")}-${Date.now()}.md`;
|
|
178
|
+
const content = [
|
|
179
|
+
`# Gate Review: ${transitionKey}`,
|
|
180
|
+
"",
|
|
181
|
+
`- Run: ${run.id}`,
|
|
182
|
+
`- Task: ${run.taskId}`,
|
|
183
|
+
`- Transition: ${from.phase} → ${to.phase}`,
|
|
184
|
+
`- From role: ${from.role}`,
|
|
185
|
+
`- To role: ${to.role}`,
|
|
186
|
+
"",
|
|
187
|
+
"## Checklist",
|
|
188
|
+
`- [ ] ${from.summary}`,
|
|
189
|
+
`- [ ] Acceptance criteria verified`,
|
|
190
|
+
`- [ ] No open blockers`,
|
|
191
|
+
"",
|
|
192
|
+
"## Approval",
|
|
193
|
+
`Approve: orchestra workflow run --task ${run.taskId} --resume ${run.id}`,
|
|
194
|
+
"",
|
|
195
|
+
].join("\n");
|
|
196
|
+
const artifact = await writeArtifact(root, "approvals", fileName, content);
|
|
197
|
+
await appendEvent(root, {
|
|
198
|
+
type: "AUTONOMOUS_GATE_REQUESTED",
|
|
199
|
+
taskId: run.taskId,
|
|
200
|
+
actor: from.role,
|
|
201
|
+
summary: `Gate review requested: ${transitionKey}`,
|
|
202
|
+
artifacts: [artifact],
|
|
203
|
+
metadata: { runId: run.id, transitionKey },
|
|
204
|
+
});
|
|
205
|
+
return { artifact };
|
|
206
|
+
}
|
|
207
|
+
function outcomeToPhaseStatus(outcome) {
|
|
208
|
+
if (outcome.kind === "done")
|
|
209
|
+
return "done";
|
|
210
|
+
if (outcome.kind === "gate_pause")
|
|
211
|
+
return "gate_paused";
|
|
212
|
+
return "qa_failed";
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=autonomous-phase-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-phase-lifecycle.js","sourceRoot":"","sources":["../src/autonomous-phase-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
2
|
+
import type { AutonomousRun } from "./types.js";
|
|
3
|
+
export declare function cancelRun(root: string, runId: string, reason?: string): Promise<AutonomousRun>;
|
|
4
|
+
export declare function markRunFailed(root: string, run: AutonomousRun, reason: string, failedPhase?: string): Promise<AutonomousRun>;
|
|
5
|
+
export declare function markRunDone(root: string, run: AutonomousRun): Promise<AutonomousRun>;
|
|
6
|
+
export declare function resumePhaseIndex(run: AutonomousRun, sequence?: AutonomousPhaseDefinition[]): number;
|
|
7
|
+
export declare function suspendPhaseForClarification(root: string, run: AutonomousRun, phaseIndex: number, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousRun>;
|
|
8
|
+
export declare function resumePhaseFromClarification(root: string, run: AutonomousRun, phaseIndex: number, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousRun>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { appendEvent } from "./workspace.js";
|
|
2
|
+
import { updateTask } from "./workflow-services.js";
|
|
3
|
+
import { AUTONOMOUS_PHASE_SEQUENCE } from "./autonomous-workflow-constants.js";
|
|
4
|
+
import { persistRun, readAutonomousRun } from "./autonomous-run-store.js";
|
|
5
|
+
import { notifyWorkflowLifecycle } from "./notifications.js";
|
|
6
|
+
export async function cancelRun(root, runId, reason = "Workflow run canceled") {
|
|
7
|
+
const run = await readAutonomousRun(root, runId);
|
|
8
|
+
if (!run) {
|
|
9
|
+
throw new Error(`workflow run not found: ${runId}`);
|
|
10
|
+
}
|
|
11
|
+
if (run.status === "canceled") {
|
|
12
|
+
return run;
|
|
13
|
+
}
|
|
14
|
+
if (run.status === "done" || run.status === "failed") {
|
|
15
|
+
throw new Error(`workflow run ${runId} is ${run.status} and cannot be canceled`);
|
|
16
|
+
}
|
|
17
|
+
const now = new Date().toISOString();
|
|
18
|
+
const updated = {
|
|
19
|
+
...run,
|
|
20
|
+
status: "canceled",
|
|
21
|
+
updatedAt: now,
|
|
22
|
+
phases: run.phases.map((phase) => phase.status === "done" ||
|
|
23
|
+
phase.status === "qa_failed" ||
|
|
24
|
+
phase.status === "skipped"
|
|
25
|
+
? phase
|
|
26
|
+
: { ...phase, status: "canceled", completedAt: now }),
|
|
27
|
+
};
|
|
28
|
+
await persistRun(root, updated);
|
|
29
|
+
await appendEvent(root, {
|
|
30
|
+
type: "AUTONOMOUS_RUN_CANCELED",
|
|
31
|
+
taskId: run.taskId,
|
|
32
|
+
actor: "parent",
|
|
33
|
+
summary: reason,
|
|
34
|
+
metadata: { runId: run.id },
|
|
35
|
+
});
|
|
36
|
+
for (const phase of run.phases) {
|
|
37
|
+
if (phase.status !== "done" &&
|
|
38
|
+
phase.status !== "qa_failed" &&
|
|
39
|
+
phase.status !== "skipped") {
|
|
40
|
+
await updateTask({ id: phase.taskId, status: "canceled" }, root).catch(() => undefined);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return updated;
|
|
44
|
+
}
|
|
45
|
+
export async function markRunFailed(root, run, reason, failedPhase) {
|
|
46
|
+
const now = new Date().toISOString();
|
|
47
|
+
const updated = {
|
|
48
|
+
...run,
|
|
49
|
+
status: "failed",
|
|
50
|
+
updatedAt: now,
|
|
51
|
+
phases: run.phases.map((phase) => failedPhase && phase.phase === failedPhase
|
|
52
|
+
? {
|
|
53
|
+
...phase,
|
|
54
|
+
status: "failed",
|
|
55
|
+
completedAt: now,
|
|
56
|
+
notes: reason,
|
|
57
|
+
}
|
|
58
|
+
: phase),
|
|
59
|
+
};
|
|
60
|
+
await persistRun(root, updated);
|
|
61
|
+
await appendEvent(root, {
|
|
62
|
+
type: "AUTONOMOUS_RUN_FAILED",
|
|
63
|
+
taskId: run.taskId,
|
|
64
|
+
actor: "parent",
|
|
65
|
+
summary: reason,
|
|
66
|
+
metadata: { runId: run.id },
|
|
67
|
+
});
|
|
68
|
+
await notifyWorkflowLifecycle({
|
|
69
|
+
root,
|
|
70
|
+
taskId: run.taskId,
|
|
71
|
+
kind: "failed",
|
|
72
|
+
runId: run.id,
|
|
73
|
+
detail: reason,
|
|
74
|
+
idempotencyKey: `run_failed:${run.id}`,
|
|
75
|
+
});
|
|
76
|
+
for (const phase of run.phases) {
|
|
77
|
+
if (phase.status === "running" || phase.status === "pending") {
|
|
78
|
+
await updateTask({ id: phase.taskId, status: "canceled" }, root).catch(() => undefined);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return updated;
|
|
82
|
+
}
|
|
83
|
+
export async function markRunDone(root, run) {
|
|
84
|
+
const now = new Date().toISOString();
|
|
85
|
+
const updated = { ...run, status: "done", updatedAt: now };
|
|
86
|
+
await persistRun(root, updated);
|
|
87
|
+
await appendEvent(root, {
|
|
88
|
+
type: "AUTONOMOUS_RUN_DONE",
|
|
89
|
+
taskId: run.taskId,
|
|
90
|
+
actor: "parent",
|
|
91
|
+
summary: `Autonomous workflow complete`,
|
|
92
|
+
metadata: { runId: run.id },
|
|
93
|
+
});
|
|
94
|
+
await notifyWorkflowLifecycle({
|
|
95
|
+
root,
|
|
96
|
+
taskId: run.taskId,
|
|
97
|
+
kind: "done",
|
|
98
|
+
runId: run.id,
|
|
99
|
+
detail: "Autonomous workflow complete",
|
|
100
|
+
idempotencyKey: `run_done:${run.id}`,
|
|
101
|
+
});
|
|
102
|
+
return updated;
|
|
103
|
+
}
|
|
104
|
+
export function resumePhaseIndex(run, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
105
|
+
for (let i = 0; i < sequence.length; i++) {
|
|
106
|
+
const def = sequence[i];
|
|
107
|
+
const phase = run.phases.find((p) => p.phase === def.phase);
|
|
108
|
+
if (!phase || phase.status === "running" || phase.status === "pending") {
|
|
109
|
+
return i;
|
|
110
|
+
}
|
|
111
|
+
if (phase.status === "qa_failed")
|
|
112
|
+
return i;
|
|
113
|
+
if (phase.status === "awaiting_clarification")
|
|
114
|
+
return i;
|
|
115
|
+
if (phase.status === "done" ||
|
|
116
|
+
phase.status === "gate_paused" ||
|
|
117
|
+
phase.status === "skipped") {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return -1;
|
|
122
|
+
}
|
|
123
|
+
export async function suspendPhaseForClarification(root, run, phaseIndex, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
124
|
+
const def = sequence[phaseIndex];
|
|
125
|
+
if (!def)
|
|
126
|
+
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
127
|
+
const phase = run.phases.find((p) => p.phase === def.phase);
|
|
128
|
+
if (!phase)
|
|
129
|
+
throw new Error(`phase not found in run: ${def.phase}`);
|
|
130
|
+
const updatedPhases = run.phases.map((p) => p.phase === def.phase
|
|
131
|
+
? { ...p, status: "awaiting_clarification" }
|
|
132
|
+
: p);
|
|
133
|
+
const updated = {
|
|
134
|
+
...run,
|
|
135
|
+
phases: updatedPhases,
|
|
136
|
+
status: "paused",
|
|
137
|
+
updatedAt: new Date().toISOString(),
|
|
138
|
+
};
|
|
139
|
+
await persistRun(root, updated);
|
|
140
|
+
return updated;
|
|
141
|
+
}
|
|
142
|
+
export async function resumePhaseFromClarification(root, run, phaseIndex, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
143
|
+
const def = sequence[phaseIndex];
|
|
144
|
+
if (!def)
|
|
145
|
+
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
146
|
+
const phase = run.phases.find((p) => p.phase === def.phase);
|
|
147
|
+
if (!phase)
|
|
148
|
+
throw new Error(`phase not found in run: ${def.phase}`);
|
|
149
|
+
if (phase.status !== "awaiting_clarification") {
|
|
150
|
+
throw new Error(`phase ${def.phase} is not awaiting clarification (status: ${phase.status})`);
|
|
151
|
+
}
|
|
152
|
+
const updatedPhases = run.phases.map((p) => p.phase === def.phase ? { ...p, status: "running" } : p);
|
|
153
|
+
const updated = {
|
|
154
|
+
...run,
|
|
155
|
+
phases: updatedPhases,
|
|
156
|
+
status: "running",
|
|
157
|
+
updatedAt: new Date().toISOString(),
|
|
158
|
+
};
|
|
159
|
+
await persistRun(root, updated);
|
|
160
|
+
return updated;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=autonomous-run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-run-state.js","sourceRoot":"","sources":["../src/autonomous-run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AutonomousGateMode, AutonomousRun } from "./types.js";
|
|
2
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
3
|
+
export declare const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
|
|
4
|
+
export declare function autonomousRunsPath(root: string): string;
|
|
5
|
+
export type AutonomousRunOptions = {
|
|
6
|
+
taskId: string;
|
|
7
|
+
gates: AutonomousGateMode;
|
|
8
|
+
maxIterations: number;
|
|
9
|
+
phaseSequence?: string[];
|
|
10
|
+
skippedPhases?: AutonomousPhaseDefinition[];
|
|
11
|
+
};
|
|
12
|
+
export declare function createAutonomousRun(root: string, opts: AutonomousRunOptions): Promise<AutonomousRun>;
|
|
13
|
+
export declare function readAutonomousRun(root: string, id: string): Promise<AutonomousRun | undefined>;
|
|
14
|
+
export declare function listAutonomousRuns(root: string): Promise<AutonomousRun[]>;
|
|
15
|
+
export declare function listActiveAutonomousRuns(root: string): Promise<AutonomousRun[]>;
|
|
16
|
+
export declare function isTerminalAutonomousRunStatus(status: AutonomousRun["status"]): boolean;
|
|
17
|
+
export declare function persistRun(root: string, run: AutonomousRun): Promise<void>;
|