@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
@@ -0,0 +1,89 @@
1
+ import { existsSync } from "node:fs";
2
+ import { appendFile, readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { ensureDir, resolveWorkflowPath } from "./fs-utils.js";
5
+ import { appendEvent } from "./workspace.js";
6
+ export const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
7
+ export function autonomousRunsPath(root) {
8
+ return resolveWorkflowPath(root, AUTONOMOUS_RUNS_FILE);
9
+ }
10
+ export async function createAutonomousRun(root, opts) {
11
+ const now = new Date().toISOString();
12
+ const runSuffix = `${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
13
+ const id = `wfrun-${runSuffix}`;
14
+ const skippedPhases = (opts.skippedPhases ?? []).map((phase) => ({
15
+ phase: phase.phase,
16
+ role: phase.role,
17
+ status: "skipped",
18
+ taskId: `${opts.taskId}-${phase.phase}-${runSuffix}-skipped`,
19
+ startedAt: now,
20
+ completedAt: now,
21
+ skippedAt: now,
22
+ notes: "Phase skipped by workflow phase selection",
23
+ }));
24
+ const run = {
25
+ id,
26
+ taskId: opts.taskId,
27
+ gates: opts.gates,
28
+ maxIterations: opts.maxIterations,
29
+ ...(opts.phaseSequence ? { phaseSequence: opts.phaseSequence } : {}),
30
+ qaIterations: 0,
31
+ phases: skippedPhases,
32
+ status: "running",
33
+ createdAt: now,
34
+ updatedAt: now,
35
+ };
36
+ await persistRun(root, run);
37
+ await appendEvent(root, {
38
+ type: "AUTONOMOUS_RUN_STARTED",
39
+ taskId: opts.taskId,
40
+ actor: "parent",
41
+ summary: `Autonomous workflow started [gates=${opts.gates}]`,
42
+ metadata: {
43
+ runId: run.id,
44
+ gates: opts.gates,
45
+ maxIterations: opts.maxIterations,
46
+ phaseSequence: opts.phaseSequence,
47
+ skippedPhases: opts.skippedPhases?.map((phase) => phase.phase) ?? [],
48
+ },
49
+ });
50
+ return run;
51
+ }
52
+ export async function readAutonomousRun(root, id) {
53
+ const runs = await latestRuns(root);
54
+ return runs.get(id);
55
+ }
56
+ export async function listAutonomousRuns(root) {
57
+ return [...(await latestRuns(root)).values()];
58
+ }
59
+ export async function listActiveAutonomousRuns(root) {
60
+ return (await listAutonomousRuns(root)).filter((run) => !isTerminalAutonomousRunStatus(run.status));
61
+ }
62
+ export function isTerminalAutonomousRunStatus(status) {
63
+ return status === "done" || status === "failed" || status === "canceled";
64
+ }
65
+ export async function persistRun(root, run) {
66
+ const file = autonomousRunsPath(root);
67
+ await ensureDir(path.dirname(file));
68
+ const current = (await latestRuns(root)).get(run.id);
69
+ if (current?.status === "canceled" && run.status !== "canceled") {
70
+ return;
71
+ }
72
+ await appendFile(file, `${JSON.stringify(run)}\n`, "utf8");
73
+ }
74
+ async function latestRuns(root) {
75
+ const file = autonomousRunsPath(root);
76
+ const latest = new Map();
77
+ if (!existsSync(file))
78
+ return latest;
79
+ const lines = (await readFile(file, "utf8"))
80
+ .trim()
81
+ .split("\n")
82
+ .filter(Boolean);
83
+ for (const line of lines) {
84
+ const run = JSON.parse(line);
85
+ latest.set(run.id, run);
86
+ }
87
+ return latest;
88
+ }
89
+ //# sourceMappingURL=autonomous-run-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous-run-store.js","sourceRoot":"","sources":["../src/autonomous-run-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const AUTONOMOUS_PHASE_SEQUENCE: Array<{
2
+ phase: string;
3
+ role: string;
4
+ summary: string;
5
+ }>;
6
+ export type AutonomousPhaseDefinition = (typeof AUTONOMOUS_PHASE_SEQUENCE)[number];
7
+ export declare const PHASE_GATES: Set<string>;
@@ -0,0 +1,36 @@
1
+ // Phase graph: ordered list of [phase-id, role-id, summary]
2
+ export const AUTONOMOUS_PHASE_SEQUENCE = [
3
+ {
4
+ phase: "pm",
5
+ role: "product_manager",
6
+ summary: "Product framing, prioritization, and success metrics",
7
+ },
8
+ {
9
+ phase: "po",
10
+ role: "product_owner",
11
+ summary: "Backlog refinement, story sizing, and acceptance criteria",
12
+ },
13
+ {
14
+ phase: "architect",
15
+ role: "architect",
16
+ summary: "Technical tasking, design decisions, and size estimation",
17
+ },
18
+ {
19
+ phase: "developer",
20
+ role: "developer",
21
+ summary: "Implementation against acceptance criteria",
22
+ },
23
+ {
24
+ phase: "qa",
25
+ role: "qa",
26
+ summary: "Verification against acceptance criteria and edge cases",
27
+ },
28
+ {
29
+ phase: "release",
30
+ role: "release_manager",
31
+ summary: "Release candidate validation and PR creation",
32
+ },
33
+ ];
34
+ // Gate transitions that require human approval in 'phase' mode.
35
+ export const PHASE_GATES = new Set(["po→architect", "qa→release"]);
36
+ //# sourceMappingURL=autonomous-workflow-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous-workflow-constants.js","sourceRoot":"","sources":["../src/autonomous-workflow-constants.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAIjC;IACH;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,sDAAsD;KAChE;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,2DAA2D;KACrE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,0DAA0D;KACpE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,4CAA4C;KACtD;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,yDAAyD;KACnE;IACD;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,8CAA8C;KACxD;CACF,CAAC;AAKF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC"}
@@ -1,45 +1,6 @@
1
- import type { AutonomousGateMode, AutonomousPhase, AutonomousRun, SizingLabel } from "./types.js";
2
- export declare const AUTONOMOUS_PHASE_SEQUENCE: Array<{
3
- phase: string;
4
- role: string;
5
- summary: string;
6
- }>;
7
- export declare const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
8
- export declare function autonomousRunsPath(root: string): string;
9
- export type SizingCheckResult = {
10
- found: true;
11
- sizing: SizingLabel;
12
- points?: number;
13
- } | {
14
- found: false;
15
- };
16
- export declare function checkArchitectSizing(root: string, taskId: string): Promise<SizingCheckResult>;
17
- export type AutonomousRunOptions = {
18
- taskId: string;
19
- gates: AutonomousGateMode;
20
- maxIterations: number;
21
- };
22
- export declare function createAutonomousRun(root: string, opts: AutonomousRunOptions): Promise<AutonomousRun>;
23
- export declare function readAutonomousRun(root: string, id: string): Promise<AutonomousRun | undefined>;
24
- export declare function listAutonomousRuns(root: string): Promise<AutonomousRun[]>;
25
- export type PhaseOutcome = {
26
- kind: "done";
27
- notes: string;
28
- } | {
29
- kind: "gate_pause";
30
- reviewArtifact: string;
31
- } | {
32
- kind: "qa_fail";
33
- notes: string;
34
- };
35
- export declare function initPhase(root: string, run: AutonomousRun, phaseIndex: number, retryContext?: string): Promise<AutonomousPhase>;
36
- export declare function closePhase(root: string, run: AutonomousRun, phaseIndex: number, outcome: PhaseOutcome): Promise<{
37
- run: AutonomousRun;
38
- handoffArtifact?: string;
39
- reviewArtifact?: string;
40
- }>;
41
- export declare function markRunFailed(root: string, run: AutonomousRun, reason: string): Promise<AutonomousRun>;
42
- export declare function markRunDone(root: string, run: AutonomousRun): Promise<AutonomousRun>;
43
- export declare function resumePhaseIndex(run: AutonomousRun): number;
44
- export declare function suspendPhaseForClarification(root: string, run: AutonomousRun, phaseIndex: number): Promise<AutonomousRun>;
45
- export declare function resumePhaseFromClarification(root: string, run: AutonomousRun, phaseIndex: number): Promise<AutonomousRun>;
1
+ export { AUTONOMOUS_PHASE_SEQUENCE, PHASE_GATES, } from "./autonomous-workflow-constants.js";
2
+ export { AUTONOMOUS_RUNS_FILE, autonomousRunsPath, createAutonomousRun, isTerminalAutonomousRunStatus, listActiveAutonomousRuns, listAutonomousRuns, persistRun, readAutonomousRun, } from "./autonomous-run-store.js";
3
+ export { checkArchitectSizing, closePhase, initPhase, } from "./autonomous-phase-lifecycle.js";
4
+ export { cancelRun, markRunDone, markRunFailed, resumePhaseFromClarification, resumePhaseIndex, suspendPhaseForClarification, } from "./autonomous-run-state.js";
5
+ export type { AutonomousRunOptions } from "./autonomous-run-store.js";
6
+ export type { PhaseOutcome, SizingCheckResult, } from "./autonomous-phase-lifecycle.js";
@@ -1,395 +1,5 @@
1
- import { existsSync } from "node:fs";
2
- import { appendFile, readFile } from "node:fs/promises";
3
- import path from "node:path";
4
- import { ensureDir, resolveWorkflowPath } from "./fs-utils.js";
5
- import { appendEvent, readEvents, writeArtifact } from "./workspace.js";
6
- import { addTask, createHandoff, updateTask } from "./workflow-services.js";
7
- import { notifyGatePaused } from "./notifications.js";
8
- import { SIZING_LABELS } from "./types.js";
9
- // Phase graph: ordered list of [phase-id, role-id, summary]
10
- export const AUTONOMOUS_PHASE_SEQUENCE = [
11
- {
12
- phase: "pm",
13
- role: "product_manager",
14
- summary: "Product framing, prioritization, and success metrics",
15
- },
16
- {
17
- phase: "po",
18
- role: "product_owner",
19
- summary: "Backlog refinement, story sizing, and acceptance criteria",
20
- },
21
- {
22
- phase: "architect",
23
- role: "architect",
24
- summary: "Technical tasking, design decisions, and size estimation",
25
- },
26
- {
27
- phase: "developer",
28
- role: "developer",
29
- summary: "Implementation against acceptance criteria",
30
- },
31
- {
32
- phase: "qa",
33
- role: "qa",
34
- summary: "Verification against acceptance criteria and edge cases",
35
- },
36
- {
37
- phase: "release",
38
- role: "release_manager",
39
- summary: "Release candidate validation and PR creation",
40
- },
41
- ];
42
- // Gate transitions that require human approval in 'phase' mode
43
- const PHASE_GATES = new Set(["po→architect", "qa→release"]);
44
- export const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
45
- export function autonomousRunsPath(root) {
46
- return resolveWorkflowPath(root, AUTONOMOUS_RUNS_FILE);
47
- }
48
- export async function checkArchitectSizing(root, taskId) {
49
- const events = await readEvents(root);
50
- for (const event of events) {
51
- if (event.type === "DECISION_RECORDED" &&
52
- event.taskId === taskId &&
53
- event.actor === "architect") {
54
- const sizing = event.metadata.sizing;
55
- if (typeof sizing === "string" &&
56
- SIZING_LABELS.includes(sizing)) {
57
- const points = typeof event.metadata.points === "number"
58
- ? event.metadata.points
59
- : undefined;
60
- return {
61
- found: true,
62
- sizing: sizing,
63
- ...(points !== undefined ? { points } : {}),
64
- };
65
- }
66
- }
67
- }
68
- return { found: false };
69
- }
70
- export async function createAutonomousRun(root, opts) {
71
- const now = new Date().toISOString();
72
- const run = {
73
- id: `wfrun-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
74
- taskId: opts.taskId,
75
- gates: opts.gates,
76
- maxIterations: opts.maxIterations,
77
- qaIterations: 0,
78
- phases: [],
79
- status: "running",
80
- createdAt: now,
81
- updatedAt: now,
82
- };
83
- await persistRun(root, run);
84
- await appendEvent(root, {
85
- type: "AUTONOMOUS_RUN_STARTED",
86
- taskId: opts.taskId,
87
- actor: "parent",
88
- summary: `Autonomous workflow started [gates=${opts.gates}]`,
89
- metadata: {
90
- runId: run.id,
91
- gates: opts.gates,
92
- maxIterations: opts.maxIterations,
93
- },
94
- });
95
- return run;
96
- }
97
- export async function readAutonomousRun(root, id) {
98
- const file = autonomousRunsPath(root);
99
- if (!existsSync(file))
100
- return undefined;
101
- const lines = (await readFile(file, "utf8"))
102
- .trim()
103
- .split("\n")
104
- .filter(Boolean);
105
- const latest = new Map();
106
- for (const line of lines) {
107
- const r = JSON.parse(line);
108
- latest.set(r.id, r);
109
- }
110
- return latest.get(id);
111
- }
112
- export async function listAutonomousRuns(root) {
113
- const file = autonomousRunsPath(root);
114
- if (!existsSync(file))
115
- return [];
116
- const lines = (await readFile(file, "utf8"))
117
- .trim()
118
- .split("\n")
119
- .filter(Boolean);
120
- const latest = new Map();
121
- for (const line of lines) {
122
- const r = JSON.parse(line);
123
- latest.set(r.id, r);
124
- }
125
- return [...latest.values()];
126
- }
127
- export async function initPhase(root, run, phaseIndex, retryContext) {
128
- const def = AUTONOMOUS_PHASE_SEQUENCE[phaseIndex];
129
- if (!def)
130
- throw new Error(`invalid phase index: ${phaseIndex}`);
131
- const now = new Date().toISOString();
132
- // Use a run-scoped suffix so multiple runs on the same task don't collide.
133
- // Short run suffix (last 6 chars of id) keeps IDs readable.
134
- const runSuffix = run.id.slice(-6);
135
- const iteration = run.phases.filter((p) => p.phase === def.phase).length;
136
- const phaseTaskId = iteration === 0
137
- ? `${run.taskId}-${def.phase}-${runSuffix}`
138
- : `${run.taskId}-${def.phase}-${runSuffix}-retry${iteration}`;
139
- // Dependency on the previous phase task in this same run
140
- const prevDef = phaseIndex > 0 ? AUTONOMOUS_PHASE_SEQUENCE[phaseIndex - 1] : undefined;
141
- const prevPhaseTaskId = prevDef
142
- ? `${run.taskId}-${prevDef.phase}-${runSuffix}`
143
- : undefined;
144
- await addTask({
145
- id: phaseTaskId,
146
- title: `[${def.phase.toUpperCase()}] ${run.taskId}${iteration > 0 ? ` (retry ${iteration})` : ""}`,
147
- ownerRole: def.role,
148
- dependencies: prevPhaseTaskId ? [prevPhaseTaskId] : [],
149
- ...(retryContext ? { blockedReason: retryContext } : {}),
150
- }, root);
151
- const phase = {
152
- phase: def.phase,
153
- role: def.role,
154
- status: "running",
155
- taskId: phaseTaskId,
156
- startedAt: now,
157
- ...(retryContext ? { notes: retryContext } : {}),
158
- };
159
- return phase;
160
- }
161
- export async function closePhase(root, run, phaseIndex, outcome) {
162
- let resolvedOutcome = outcome;
163
- const now = new Date().toISOString();
164
- const def = AUTONOMOUS_PHASE_SEQUENCE[phaseIndex];
165
- const nextDef = AUTONOMOUS_PHASE_SEQUENCE[phaseIndex + 1];
166
- if (!def)
167
- throw new Error(`invalid phase index: ${phaseIndex}`);
168
- const phase = run.phases.find((p) => p.phase === def.phase);
169
- if (!phase)
170
- throw new Error(`phase not found in run: ${def.phase}`);
171
- let handoffArtifact;
172
- let reviewArtifact;
173
- if (outcome.kind === "done" && nextDef) {
174
- // Create handoff to next phase
175
- const handoffResult = await createHandoff({
176
- task: run.taskId,
177
- from: def.role,
178
- to: nextDef.role,
179
- changed: `Phase ${def.phase} completed`,
180
- behavior: def.summary,
181
- tests: "See phase task evidence",
182
- commands: "See phase task evidence",
183
- status: "ready_for_review",
184
- }, root);
185
- handoffArtifact = handoffResult.artifact;
186
- // Gate check
187
- const transitionKey = `${def.phase}→${nextDef.phase}`;
188
- const needsGate = run.gates === "all" ||
189
- (run.gates === "phase" && PHASE_GATES.has(transitionKey));
190
- if (needsGate) {
191
- const reviewResult = await createGateReview(root, run, def, nextDef, transitionKey);
192
- reviewArtifact = reviewResult.artifact;
193
- resolvedOutcome = {
194
- kind: "gate_pause",
195
- reviewArtifact: reviewResult.artifact,
196
- };
197
- }
198
- }
199
- const updatedPhase = {
200
- ...phase,
201
- status: outcomeToPhaseStatus(resolvedOutcome),
202
- ...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
203
- ...(reviewArtifact !== undefined ? { reviewArtifact } : {}),
204
- notes: resolvedOutcome.kind !== "gate_pause"
205
- ? resolvedOutcome.notes
206
- : `Gate pause — review pending`,
207
- completedAt: now,
208
- };
209
- const updatedPhases = run.phases.map((p) => p.phase === def.phase ? updatedPhase : p);
210
- const allDone = resolvedOutcome.kind === "done" &&
211
- !nextDef &&
212
- updatedPhases.every((p) => p.status === "done");
213
- const updatedRun = {
214
- ...run,
215
- phases: updatedPhases,
216
- qaIterations: def.phase === "qa" && resolvedOutcome.kind === "qa_fail"
217
- ? run.qaIterations + 1
218
- : run.qaIterations,
219
- status: resolvedOutcome.kind === "gate_pause"
220
- ? "paused"
221
- : allDone
222
- ? "done"
223
- : "running",
224
- updatedAt: now,
225
- };
226
- await persistRun(root, updatedRun);
227
- if (resolvedOutcome.kind === "gate_pause") {
228
- await appendEvent(root, {
229
- type: "AUTONOMOUS_GATE_PAUSED",
230
- taskId: run.taskId,
231
- actor: def.role,
232
- summary: `Gate pause at ${def.phase}→${nextDef?.phase ?? "end"}`,
233
- metadata: { runId: run.id, phase: def.phase, reviewArtifact },
234
- });
235
- if (reviewArtifact) {
236
- await notifyGatePaused({
237
- root,
238
- run: updatedRun,
239
- transitionKey: `${def.phase}→${nextDef?.phase ?? "end"}`,
240
- reviewArtifact,
241
- });
242
- }
243
- }
244
- else if (resolvedOutcome.kind === "done") {
245
- await appendEvent(root, {
246
- type: "AUTONOMOUS_PHASE_DONE",
247
- taskId: run.taskId,
248
- actor: def.role,
249
- summary: `Phase ${def.phase} completed`,
250
- metadata: { runId: run.id, phase: def.phase, handoffArtifact },
251
- });
252
- await updateTask({ id: phase.taskId, status: "done" }, root);
253
- }
254
- return {
255
- run: updatedRun,
256
- ...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
257
- ...(reviewArtifact !== undefined ? { reviewArtifact } : {}),
258
- };
259
- }
260
- export async function markRunFailed(root, run, reason) {
261
- const now = new Date().toISOString();
262
- const updated = { ...run, status: "failed", updatedAt: now };
263
- await persistRun(root, updated);
264
- await appendEvent(root, {
265
- type: "AUTONOMOUS_RUN_FAILED",
266
- taskId: run.taskId,
267
- actor: "parent",
268
- summary: reason,
269
- metadata: { runId: run.id },
270
- });
271
- // Cancel any phase sub-tasks still in a non-terminal state
272
- for (const phase of run.phases) {
273
- if (phase.status === "running" || phase.status === "pending") {
274
- await updateTask({ id: phase.taskId, status: "canceled" }, root).catch(() => undefined);
275
- }
276
- }
277
- return updated;
278
- }
279
- export async function markRunDone(root, run) {
280
- const now = new Date().toISOString();
281
- const updated = { ...run, status: "done", updatedAt: now };
282
- await persistRun(root, updated);
283
- await appendEvent(root, {
284
- type: "AUTONOMOUS_RUN_DONE",
285
- taskId: run.taskId,
286
- actor: "parent",
287
- summary: `Autonomous workflow complete`,
288
- metadata: { runId: run.id },
289
- });
290
- return updated;
291
- }
292
- // Returns the phase index to resume from, or -1 if run is already done.
293
- export function resumePhaseIndex(run) {
294
- for (let i = 0; i < AUTONOMOUS_PHASE_SEQUENCE.length; i++) {
295
- const def = AUTONOMOUS_PHASE_SEQUENCE[i];
296
- const phase = run.phases.find((p) => p.phase === def.phase);
297
- // No record yet, or actively running/pending → start here
298
- if (!phase || phase.status === "running" || phase.status === "pending")
299
- return i;
300
- if (phase.status === "qa_failed")
301
- return i; // retry qa
302
- if (phase.status === "awaiting_clarification")
303
- return i; // resume same phase
304
- // done or gate_paused (gate already approved on previous resume) → scan forward
305
- if (phase.status === "done" || phase.status === "gate_paused")
306
- continue;
307
- }
308
- return -1; // all phases accounted for
309
- }
310
- // Suspends a phase awaiting clarification (does not advance phase sequence).
311
- export async function suspendPhaseForClarification(root, run, phaseIndex) {
312
- const def = AUTONOMOUS_PHASE_SEQUENCE[phaseIndex];
313
- if (!def)
314
- throw new Error(`invalid phase index: ${phaseIndex}`);
315
- const phase = run.phases.find((p) => p.phase === def.phase);
316
- if (!phase)
317
- throw new Error(`phase not found in run: ${def.phase}`);
318
- const updatedPhases = run.phases.map((p) => p.phase === def.phase
319
- ? { ...p, status: "awaiting_clarification" }
320
- : p);
321
- const updated = {
322
- ...run,
323
- phases: updatedPhases,
324
- status: "paused",
325
- updatedAt: new Date().toISOString(),
326
- };
327
- await persistRun(root, updated);
328
- return updated;
329
- }
330
- // Resumes a phase from awaiting_clarification back to running.
331
- export async function resumePhaseFromClarification(root, run, phaseIndex) {
332
- const def = AUTONOMOUS_PHASE_SEQUENCE[phaseIndex];
333
- if (!def)
334
- throw new Error(`invalid phase index: ${phaseIndex}`);
335
- const phase = run.phases.find((p) => p.phase === def.phase);
336
- if (!phase)
337
- throw new Error(`phase not found in run: ${def.phase}`);
338
- if (phase.status !== "awaiting_clarification") {
339
- throw new Error(`phase ${def.phase} is not awaiting clarification (status: ${phase.status})`);
340
- }
341
- const updatedPhases = run.phases.map((p) => p.phase === def.phase ? { ...p, status: "running" } : p);
342
- const updated = {
343
- ...run,
344
- phases: updatedPhases,
345
- status: "running",
346
- updatedAt: new Date().toISOString(),
347
- };
348
- await persistRun(root, updated);
349
- return updated;
350
- }
351
- // --- helpers ---
352
- async function createGateReview(root, run, from, to, transitionKey) {
353
- const fileName = `${run.taskId}-gate-${transitionKey.replace("→", "-to-")}-${Date.now()}.md`;
354
- const content = [
355
- `# Gate Review: ${transitionKey}`,
356
- "",
357
- `- Run: ${run.id}`,
358
- `- Task: ${run.taskId}`,
359
- `- Transition: ${from.phase} → ${to.phase}`,
360
- `- From role: ${from.role}`,
361
- `- To role: ${to.role}`,
362
- "",
363
- "## Checklist",
364
- `- [ ] ${from.summary}`,
365
- `- [ ] Acceptance criteria verified`,
366
- `- [ ] No open blockers`,
367
- "",
368
- "## Approval",
369
- `Approve: orchestra workflow run --task ${run.taskId} --resume ${run.id}`,
370
- "",
371
- ].join("\n");
372
- const artifact = await writeArtifact(root, "approvals", fileName, content);
373
- await appendEvent(root, {
374
- type: "AUTONOMOUS_GATE_REQUESTED",
375
- taskId: run.taskId,
376
- actor: from.role,
377
- summary: `Gate review requested: ${transitionKey}`,
378
- artifacts: [artifact],
379
- metadata: { runId: run.id, transitionKey },
380
- });
381
- return { artifact };
382
- }
383
- function outcomeToPhaseStatus(outcome) {
384
- if (outcome.kind === "done")
385
- return "done";
386
- if (outcome.kind === "gate_pause")
387
- return "gate_paused";
388
- return "qa_failed";
389
- }
390
- async function persistRun(root, run) {
391
- const file = autonomousRunsPath(root);
392
- await ensureDir(path.dirname(file));
393
- await appendFile(file, `${JSON.stringify(run)}\n`, "utf8");
394
- }
1
+ export { AUTONOMOUS_PHASE_SEQUENCE, PHASE_GATES, } from "./autonomous-workflow-constants.js";
2
+ export { AUTONOMOUS_RUNS_FILE, autonomousRunsPath, createAutonomousRun, isTerminalAutonomousRunStatus, listActiveAutonomousRuns, listAutonomousRuns, persistRun, readAutonomousRun, } from "./autonomous-run-store.js";
3
+ export { checkArchitectSizing, closePhase, initPhase, } from "./autonomous-phase-lifecycle.js";
4
+ export { cancelRun, markRunDone, markRunFailed, resumePhaseFromClarification, resumePhaseIndex, suspendPhaseForClarification, } from "./autonomous-run-state.js";
395
5
  //# sourceMappingURL=autonomous-workflow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autonomous-workflow.js","sourceRoot":"","sources":["../src/autonomous-workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autonomous-workflow.js","sourceRoot":"","sources":["../src/autonomous-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,SAAS,GACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,4BAA4B,EAC5B,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC"}
package/dist/benchmark.js CHANGED
@@ -85,6 +85,7 @@ export async function computeBenchmark(root, taskId) {
85
85
  vsSoloPct: null,
86
86
  vsAiUnguidedPct: null,
87
87
  qaIterations: 0,
88
+ phaseDurations: [],
88
89
  quality,
89
90
  status: "pending",
90
91
  };
@@ -102,6 +103,20 @@ export async function computeBenchmark(root, taskId) {
102
103
  ? Math.round(((completedAt - startedAt) / (1000 * 60 * 60 * 24)) * 100) /
103
104
  100
104
105
  : null;
106
+ const phaseDurations = taskRun.phases.map((phase) => {
107
+ const phaseStartedAt = new Date(phase.startedAt).getTime();
108
+ const phaseCompletedAt = phase.completedAt
109
+ ? new Date(phase.completedAt).getTime()
110
+ : null;
111
+ return {
112
+ phase: phase.phase,
113
+ startedAt: phase.startedAt,
114
+ ...(phase.completedAt ? { completedAt: phase.completedAt } : {}),
115
+ durationMs: phaseCompletedAt !== null
116
+ ? Math.max(0, phaseCompletedAt - phaseStartedAt)
117
+ : null,
118
+ };
119
+ });
105
120
  const vsSoloPct = actualDays !== null
106
121
  ? Math.round(((actualDays - estimate.soloEstimateDays) /
107
122
  estimate.soloEstimateDays) *
@@ -121,6 +136,7 @@ export async function computeBenchmark(root, taskId) {
121
136
  vsSoloPct,
122
137
  vsAiUnguidedPct,
123
138
  qaIterations: taskRun.qaIterations,
139
+ phaseDurations,
124
140
  quality,
125
141
  status: "complete",
126
142
  };