@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.
Files changed (107) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/assets/web-console.js +91 -1
  3. package/dist/autonomous-phase-lifecycle.d.ts +26 -0
  4. package/dist/autonomous-phase-lifecycle.js +214 -0
  5. package/dist/autonomous-phase-lifecycle.js.map +1 -0
  6. package/dist/autonomous-run-state.d.ts +8 -0
  7. package/dist/autonomous-run-state.js +162 -0
  8. package/dist/autonomous-run-state.js.map +1 -0
  9. package/dist/autonomous-run-store.d.ts +17 -0
  10. package/dist/autonomous-run-store.js +89 -0
  11. package/dist/autonomous-run-store.js.map +1 -0
  12. package/dist/autonomous-workflow-constants.d.ts +7 -0
  13. package/dist/autonomous-workflow-constants.js +36 -0
  14. package/dist/autonomous-workflow-constants.js.map +1 -0
  15. package/dist/autonomous-workflow.d.ts +6 -45
  16. package/dist/autonomous-workflow.js +4 -394
  17. package/dist/autonomous-workflow.js.map +1 -1
  18. package/dist/benchmark.js +16 -0
  19. package/dist/benchmark.js.map +1 -1
  20. package/dist/clarification.d.ts +2 -0
  21. package/dist/clarification.js +23 -5
  22. package/dist/clarification.js.map +1 -1
  23. package/dist/cli.js +101 -14
  24. package/dist/cli.js.map +1 -1
  25. package/dist/command-manifest.js +8 -0
  26. package/dist/command-manifest.js.map +1 -1
  27. package/dist/command-utils.d.ts +6 -0
  28. package/dist/command-utils.js +19 -0
  29. package/dist/command-utils.js.map +1 -0
  30. package/dist/commands.d.ts +15 -43
  31. package/dist/commands.js +466 -912
  32. package/dist/commands.js.map +1 -1
  33. package/dist/constants.js +20 -0
  34. package/dist/constants.js.map +1 -1
  35. package/dist/defaults.d.ts +11 -0
  36. package/dist/defaults.js +11 -0
  37. package/dist/defaults.js.map +1 -1
  38. package/dist/instruction-commands.d.ts +5 -0
  39. package/dist/instruction-commands.js +98 -0
  40. package/dist/instruction-commands.js.map +1 -0
  41. package/dist/mcp-oauth-proxy.d.ts +47 -0
  42. package/dist/mcp-oauth-proxy.js +276 -0
  43. package/dist/mcp-oauth-proxy.js.map +1 -1
  44. package/dist/memory.d.ts +11 -0
  45. package/dist/memory.js +224 -0
  46. package/dist/memory.js.map +1 -0
  47. package/dist/metrics-commands.d.ts +3 -0
  48. package/dist/metrics-commands.js +123 -0
  49. package/dist/metrics-commands.js.map +1 -0
  50. package/dist/model-commands.d.ts +13 -0
  51. package/dist/model-commands.js +216 -0
  52. package/dist/model-commands.js.map +1 -0
  53. package/dist/notifications.d.ts +25 -0
  54. package/dist/notifications.js +187 -11
  55. package/dist/notifications.js.map +1 -1
  56. package/dist/package-update-check.d.ts +19 -0
  57. package/dist/package-update-check.js +123 -0
  58. package/dist/package-update-check.js.map +1 -0
  59. package/dist/runtime-adapters.d.ts +5 -1
  60. package/dist/runtime-adapters.js +27 -0
  61. package/dist/runtime-adapters.js.map +1 -1
  62. package/dist/runtime-bootstrap.js +4 -2
  63. package/dist/runtime-bootstrap.js.map +1 -1
  64. package/dist/runtime-commands.d.ts +9 -0
  65. package/dist/runtime-commands.js +156 -0
  66. package/dist/runtime-commands.js.map +1 -0
  67. package/dist/runtime-execution-adapters.d.ts +2 -0
  68. package/dist/runtime-execution-adapters.js +163 -0
  69. package/dist/runtime-execution-adapters.js.map +1 -0
  70. package/dist/runtime-execution-renderer.d.ts +10 -0
  71. package/dist/runtime-execution-renderer.js +113 -0
  72. package/dist/runtime-execution-renderer.js.map +1 -0
  73. package/dist/runtime-execution.d.ts +27 -0
  74. package/dist/runtime-execution.js +153 -0
  75. package/dist/runtime-execution.js.map +1 -0
  76. package/dist/skills-commands.d.ts +10 -0
  77. package/dist/skills-commands.js +138 -0
  78. package/dist/skills-commands.js.map +1 -0
  79. package/dist/skills.d.ts +7 -1
  80. package/dist/skills.js +120 -11
  81. package/dist/skills.js.map +1 -1
  82. package/dist/sprint-commands.d.ts +5 -0
  83. package/dist/sprint-commands.js +120 -0
  84. package/dist/sprint-commands.js.map +1 -0
  85. package/dist/subagent-protocol.js +6 -0
  86. package/dist/subagent-protocol.js.map +1 -1
  87. package/dist/telemetry-commands.d.ts +7 -0
  88. package/dist/telemetry-commands.js +82 -0
  89. package/dist/telemetry-commands.js.map +1 -0
  90. package/dist/tool-commands.d.ts +5 -0
  91. package/dist/tool-commands.js +159 -0
  92. package/dist/tool-commands.js.map +1 -0
  93. package/dist/types.d.ts +206 -4
  94. package/dist/types.js.map +1 -1
  95. package/dist/web-api.js +93 -1
  96. package/dist/web-api.js.map +1 -1
  97. package/dist/web-chart-contracts.d.ts +3 -1
  98. package/dist/web-chart-contracts.js +6 -0
  99. package/dist/web-chart-contracts.js.map +1 -1
  100. package/dist/web-console.js +2 -2
  101. package/dist/workflow-services.d.ts +21 -3
  102. package/dist/workflow-services.js +474 -10
  103. package/dist/workflow-services.js.map +1 -1
  104. package/docs/runtime-llm-flow.md +46 -0
  105. package/package.json +2 -1
  106. package/skills/proactive-orchestra/SKILL.md +27 -0
  107. 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>;