@jterrats/open-orchestra 0.5.5 → 1.0.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 (310) hide show
  1. package/AGENTS.md +9 -8
  2. package/CLAUDE.md +13 -11
  3. package/README.md +78 -11
  4. package/dist/assets/web-console.js +203 -36
  5. package/dist/automation-evidence.d.ts +23 -0
  6. package/dist/automation-evidence.js +97 -0
  7. package/dist/automation-evidence.js.map +1 -0
  8. package/dist/autonomous-run-state.d.ts +4 -1
  9. package/dist/autonomous-run-state.js +8 -2
  10. package/dist/autonomous-run-state.js.map +1 -1
  11. package/dist/autonomous-run-store.d.ts +3 -1
  12. package/dist/autonomous-run-store.js +9 -3
  13. package/dist/autonomous-run-store.js.map +1 -1
  14. package/dist/autonomous-workflow-constants.js +5 -1
  15. package/dist/autonomous-workflow-constants.js.map +1 -1
  16. package/dist/benchmark.d.ts +4 -1
  17. package/dist/benchmark.js +140 -19
  18. package/dist/benchmark.js.map +1 -1
  19. package/dist/cli.js +88 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/collaboration-flows.js +5 -19
  22. package/dist/collaboration-flows.js.map +1 -1
  23. package/dist/collection-utils.d.ts +3 -0
  24. package/dist/collection-utils.js +10 -0
  25. package/dist/collection-utils.js.map +1 -0
  26. package/dist/command-manifest.d.ts +12 -1
  27. package/dist/command-manifest.js +218 -10
  28. package/dist/command-manifest.js.map +1 -1
  29. package/dist/commands.d.ts +14 -6
  30. package/dist/commands.js +78 -28
  31. package/dist/commands.js.map +1 -1
  32. package/dist/config-migrations.d.ts +24 -0
  33. package/dist/config-migrations.js +102 -0
  34. package/dist/config-migrations.js.map +1 -0
  35. package/dist/constants.d.ts +3 -0
  36. package/dist/constants.js +26 -0
  37. package/dist/constants.js.map +1 -1
  38. package/dist/cursor-canvas.d.ts +20 -0
  39. package/dist/cursor-canvas.js +119 -0
  40. package/dist/cursor-canvas.js.map +1 -0
  41. package/dist/dashboard-commands.d.ts +2 -0
  42. package/dist/dashboard-commands.js +14 -0
  43. package/dist/dashboard-commands.js.map +1 -0
  44. package/dist/defaults.d.ts +13 -0
  45. package/dist/defaults.js +13 -0
  46. package/dist/defaults.js.map +1 -1
  47. package/dist/delegation-decision.js +23 -8
  48. package/dist/delegation-decision.js.map +1 -1
  49. package/dist/delivery-commands.js +5 -0
  50. package/dist/delivery-commands.js.map +1 -1
  51. package/dist/delivery-dashboard-charts.d.ts +4 -0
  52. package/dist/delivery-dashboard-charts.js +156 -0
  53. package/dist/delivery-dashboard-charts.js.map +1 -0
  54. package/dist/delivery-dashboard-html.d.ts +2 -0
  55. package/dist/delivery-dashboard-html.js +115 -0
  56. package/dist/delivery-dashboard-html.js.map +1 -0
  57. package/dist/delivery-dashboard-types.d.ts +78 -0
  58. package/dist/delivery-dashboard-types.js +2 -0
  59. package/dist/delivery-dashboard-types.js.map +1 -0
  60. package/dist/delivery-dashboard.d.ts +8 -0
  61. package/dist/delivery-dashboard.js +124 -0
  62. package/dist/delivery-dashboard.js.map +1 -0
  63. package/dist/doc-sync.d.ts +25 -0
  64. package/dist/doc-sync.js +79 -0
  65. package/dist/doc-sync.js.map +1 -0
  66. package/dist/effort-classification.d.ts +7 -0
  67. package/dist/effort-classification.js +72 -0
  68. package/dist/effort-classification.js.map +1 -0
  69. package/dist/extension-commands.d.ts +3 -0
  70. package/dist/extension-commands.js +40 -0
  71. package/dist/extension-commands.js.map +1 -0
  72. package/dist/extensions.d.ts +22 -0
  73. package/dist/extensions.js +126 -0
  74. package/dist/extensions.js.map +1 -0
  75. package/dist/gemini-provider.d.ts +3 -6
  76. package/dist/gemini-provider.js +8 -17
  77. package/dist/gemini-provider.js.map +1 -1
  78. package/dist/github.d.ts +2 -0
  79. package/dist/github.js +15 -3
  80. package/dist/github.js.map +1 -1
  81. package/dist/health-checks.js +51 -0
  82. package/dist/health-checks.js.map +1 -1
  83. package/dist/lucid-story-map.d.ts +73 -0
  84. package/dist/lucid-story-map.js +112 -0
  85. package/dist/lucid-story-map.js.map +1 -0
  86. package/dist/mcp-integrations.d.ts +19 -0
  87. package/dist/mcp-integrations.js +58 -0
  88. package/dist/mcp-integrations.js.map +1 -0
  89. package/dist/mcp-tool-adapter.d.ts +21 -0
  90. package/dist/mcp-tool-adapter.js +56 -0
  91. package/dist/mcp-tool-adapter.js.map +1 -0
  92. package/dist/metrics-commands.js +47 -13
  93. package/dist/metrics-commands.js.map +1 -1
  94. package/dist/model-commands.d.ts +5 -0
  95. package/dist/model-commands.js +95 -1
  96. package/dist/model-commands.js.map +1 -1
  97. package/dist/model-providers.d.ts +5 -12
  98. package/dist/model-providers.js +30 -43
  99. package/dist/model-providers.js.map +1 -1
  100. package/dist/network-policy.d.ts +2 -0
  101. package/dist/network-policy.js +6 -0
  102. package/dist/network-policy.js.map +1 -0
  103. package/dist/ollama-provider.d.ts +3 -6
  104. package/dist/ollama-provider.js +7 -16
  105. package/dist/ollama-provider.js.map +1 -1
  106. package/dist/package-update-check.d.ts +19 -0
  107. package/dist/package-update-check.js +24 -0
  108. package/dist/package-update-check.js.map +1 -1
  109. package/dist/phase-executor.d.ts +1 -0
  110. package/dist/phase-executor.js +401 -9
  111. package/dist/phase-executor.js.map +1 -1
  112. package/dist/phase-playbooks.d.ts +18 -1
  113. package/dist/phase-playbooks.js +146 -2
  114. package/dist/phase-playbooks.js.map +1 -1
  115. package/dist/planning-commands.d.ts +1 -0
  116. package/dist/planning-commands.js +36 -36
  117. package/dist/planning-commands.js.map +1 -1
  118. package/dist/policy-commands.d.ts +2 -0
  119. package/dist/policy-commands.js +29 -0
  120. package/dist/policy-commands.js.map +1 -0
  121. package/dist/policy-defaults.d.ts +2 -0
  122. package/dist/policy-defaults.js +42 -0
  123. package/dist/policy-defaults.js.map +1 -0
  124. package/dist/policy.d.ts +20 -0
  125. package/dist/policy.js +155 -0
  126. package/dist/policy.js.map +1 -0
  127. package/dist/project-detection.js +9 -7
  128. package/dist/project-detection.js.map +1 -1
  129. package/dist/prompt-registry-update.d.ts +2 -0
  130. package/dist/prompt-registry-update.js +5 -1
  131. package/dist/prompt-registry-update.js.map +1 -1
  132. package/dist/prompt-registry-validation.d.ts +3 -0
  133. package/dist/prompt-registry-validation.js +61 -21
  134. package/dist/prompt-registry-validation.js.map +1 -1
  135. package/dist/provider-utils.d.ts +11 -0
  136. package/dist/provider-utils.js +14 -0
  137. package/dist/provider-utils.js.map +1 -1
  138. package/dist/qa-commands.d.ts +2 -0
  139. package/dist/qa-commands.js +18 -0
  140. package/dist/qa-commands.js.map +1 -0
  141. package/dist/qa-coverage.d.ts +24 -0
  142. package/dist/qa-coverage.js +189 -0
  143. package/dist/qa-coverage.js.map +1 -0
  144. package/dist/qa-readiness.d.ts +5 -0
  145. package/dist/qa-readiness.js +26 -0
  146. package/dist/qa-readiness.js.map +1 -0
  147. package/dist/refresh-generated.d.ts +32 -0
  148. package/dist/refresh-generated.js +180 -0
  149. package/dist/refresh-generated.js.map +1 -0
  150. package/dist/release-candidate.d.ts +9 -1
  151. package/dist/release-candidate.js +52 -1
  152. package/dist/release-candidate.js.map +1 -1
  153. package/dist/release-commands.js +161 -8
  154. package/dist/release-commands.js.map +1 -1
  155. package/dist/release-readiness.d.ts +33 -0
  156. package/dist/release-readiness.js +187 -3
  157. package/dist/release-readiness.js.map +1 -1
  158. package/dist/runtime-adapters.d.ts +2 -1
  159. package/dist/runtime-adapters.js +16 -0
  160. package/dist/runtime-adapters.js.map +1 -1
  161. package/dist/runtime-bootstrap.js +1 -1
  162. package/dist/runtime-bootstrap.js.map +1 -1
  163. package/dist/runtime-commands.d.ts +2 -0
  164. package/dist/runtime-commands.js +85 -3
  165. package/dist/runtime-commands.js.map +1 -1
  166. package/dist/runtime-execution-adapters.js +40 -0
  167. package/dist/runtime-execution-adapters.js.map +1 -1
  168. package/dist/runtime-execution-renderer.d.ts +3 -2
  169. package/dist/runtime-execution-renderer.js +46 -8
  170. package/dist/runtime-execution-renderer.js.map +1 -1
  171. package/dist/runtime-execution.d.ts +8 -2
  172. package/dist/runtime-execution.js +109 -11
  173. package/dist/runtime-execution.js.map +1 -1
  174. package/dist/runtime-guardrails.d.ts +26 -0
  175. package/dist/runtime-guardrails.js +168 -0
  176. package/dist/runtime-guardrails.js.map +1 -0
  177. package/dist/setup-agents-import.js +5 -3
  178. package/dist/setup-agents-import.js.map +1 -1
  179. package/dist/skills-catalog.js +1 -0
  180. package/dist/skills-catalog.js.map +1 -1
  181. package/dist/skills-commands.d.ts +5 -0
  182. package/dist/skills-commands.js +79 -2
  183. package/dist/skills-commands.js.map +1 -1
  184. package/dist/skills-memory.d.ts +36 -2
  185. package/dist/skills-memory.js +165 -6
  186. package/dist/skills-memory.js.map +1 -1
  187. package/dist/skills-planning.js +9 -22
  188. package/dist/skills-planning.js.map +1 -1
  189. package/dist/skills-render.js +2 -4
  190. package/dist/skills-render.js.map +1 -1
  191. package/dist/skills.d.ts +1 -1
  192. package/dist/skills.js +1 -1
  193. package/dist/skills.js.map +1 -1
  194. package/dist/sprint-commands.js +2 -1
  195. package/dist/sprint-commands.js.map +1 -1
  196. package/dist/subagent-protocol.js +3 -5
  197. package/dist/subagent-protocol.js.map +1 -1
  198. package/dist/support-commands.d.ts +2 -0
  199. package/dist/support-commands.js +18 -0
  200. package/dist/support-commands.js.map +1 -0
  201. package/dist/support-diagnostics.d.ts +49 -0
  202. package/dist/support-diagnostics.js +86 -0
  203. package/dist/support-diagnostics.js.map +1 -0
  204. package/dist/task-graph-commands.js +6 -14
  205. package/dist/task-graph-commands.js.map +1 -1
  206. package/dist/task-text.d.ts +8 -0
  207. package/dist/task-text.js +18 -0
  208. package/dist/task-text.js.map +1 -0
  209. package/dist/telemetry-redaction.js +8 -1
  210. package/dist/telemetry-redaction.js.map +1 -1
  211. package/dist/tool-commands.d.ts +3 -0
  212. package/dist/tool-commands.js +62 -0
  213. package/dist/tool-commands.js.map +1 -1
  214. package/dist/tracker-adapters.d.ts +71 -0
  215. package/dist/tracker-adapters.js +186 -0
  216. package/dist/tracker-adapters.js.map +1 -0
  217. package/dist/tracker-commands.d.ts +2 -0
  218. package/dist/tracker-commands.js +119 -0
  219. package/dist/tracker-commands.js.map +1 -0
  220. package/dist/types/metrics.d.ts +25 -1
  221. package/dist/types/model-config.d.ts +51 -4
  222. package/dist/types/runtime.d.ts +83 -0
  223. package/dist/types/skills.d.ts +2 -0
  224. package/dist/types/tasks.d.ts +10 -0
  225. package/dist/types/workflow-run.d.ts +35 -0
  226. package/dist/types.d.ts +12 -4
  227. package/dist/types.js.map +1 -1
  228. package/dist/upgrade-commands.js +13 -4
  229. package/dist/upgrade-commands.js.map +1 -1
  230. package/dist/validation.js +2 -2
  231. package/dist/validation.js.map +1 -1
  232. package/dist/visual-validation.d.ts +81 -0
  233. package/dist/visual-validation.js +290 -0
  234. package/dist/visual-validation.js.map +1 -0
  235. package/dist/web-action-security.d.ts +11 -0
  236. package/dist/web-action-security.js +45 -0
  237. package/dist/web-action-security.js.map +1 -0
  238. package/dist/web-api-read-routes.js +115 -3
  239. package/dist/web-api-read-routes.js.map +1 -1
  240. package/dist/web-api.js +507 -5
  241. package/dist/web-api.js.map +1 -1
  242. package/dist/web-artifacts.d.ts +55 -0
  243. package/dist/web-artifacts.js +222 -0
  244. package/dist/web-artifacts.js.map +1 -0
  245. package/dist/web-console/assets/index-C9lx-V42.css +1 -0
  246. package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
  247. package/dist/web-console/index.html +13 -0
  248. package/dist/web-console.js +9 -3
  249. package/dist/web-console.js.map +1 -1
  250. package/dist/web-recovery.d.ts +30 -0
  251. package/dist/web-recovery.js +163 -0
  252. package/dist/web-recovery.js.map +1 -0
  253. package/dist/web-workflow-progress.d.ts +41 -0
  254. package/dist/web-workflow-progress.js +114 -0
  255. package/dist/web-workflow-progress.js.map +1 -0
  256. package/dist/workflow-approval-service.d.ts +2 -1
  257. package/dist/workflow-approval-service.js +83 -4
  258. package/dist/workflow-approval-service.js.map +1 -1
  259. package/dist/workflow-approval-utils.js +13 -3
  260. package/dist/workflow-approval-utils.js.map +1 -1
  261. package/dist/workflow-event-query.d.ts +2 -0
  262. package/dist/workflow-event-query.js +6 -0
  263. package/dist/workflow-event-query.js.map +1 -0
  264. package/dist/workflow-evidence-service.js +18 -9
  265. package/dist/workflow-evidence-service.js.map +1 -1
  266. package/dist/workflow-gates.d.ts +2 -0
  267. package/dist/workflow-gates.js +103 -0
  268. package/dist/workflow-gates.js.map +1 -1
  269. package/dist/workflow-markdown.d.ts +6 -0
  270. package/dist/workflow-markdown.js +25 -0
  271. package/dist/workflow-markdown.js.map +1 -0
  272. package/dist/workflow-phase-planner.d.ts +19 -0
  273. package/dist/workflow-phase-planner.js +133 -0
  274. package/dist/workflow-phase-planner.js.map +1 -0
  275. package/dist/workflow-run-commands.d.ts +1 -0
  276. package/dist/workflow-run-commands.js +247 -20
  277. package/dist/workflow-run-commands.js.map +1 -1
  278. package/dist/workflow-services.d.ts +21 -12
  279. package/dist/workflow-services.js +376 -260
  280. package/dist/workflow-services.js.map +1 -1
  281. package/dist/workflow-task-service.d.ts +11 -0
  282. package/dist/workflow-task-service.js +242 -0
  283. package/dist/workflow-task-service.js.map +1 -0
  284. package/dist/workflow-templates.js +2 -14
  285. package/dist/workflow-templates.js.map +1 -1
  286. package/dist/workspace-validator.js +133 -5
  287. package/dist/workspace-validator.js.map +1 -1
  288. package/dist/workspace.js +10 -2
  289. package/dist/workspace.js.map +1 -1
  290. package/docs/adoption-guide.md +147 -0
  291. package/docs/autonomous-workflow.md +146 -28
  292. package/docs/benchmark.md +17 -9
  293. package/docs/command-contracts.md +18 -1
  294. package/docs/core-command-surface.md +62 -13
  295. package/docs/end-to-end-demo.md +1 -0
  296. package/docs/extension-contracts.md +83 -0
  297. package/docs/orchestra-mvp.md +86 -3
  298. package/docs/persona-workflows.md +32 -0
  299. package/docs/release-test-matrix.md +42 -0
  300. package/docs/runtime-adapters.md +113 -0
  301. package/docs/runtime-llm-flow.md +13 -0
  302. package/docs/setup-agents-applicability-review.md +173 -0
  303. package/docs/skill-loading-strategy.md +1 -0
  304. package/docs/source-of-truth-and-agent-learning.md +14 -0
  305. package/docs/traceability-flow.md +5 -1
  306. package/docs/tracker-adapter-contract.md +10 -1
  307. package/docs/web-console-qa.md +35 -0
  308. package/package.json +12 -6
  309. package/rules/development-engineering.mdc +66 -0
  310. package/skills/doc-sync/SKILL.md +2 -0
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Open Orchestra Local workflow console</title>
7
+ <script type="module" crossorigin src="/assets/index-M3S0g1GK.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-C9lx-V42.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
@@ -11,8 +11,11 @@ export function renderWebConsoleHtml() {
11
11
  @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { color-scheme: dark; --bg: #111418; --panel: #1a2027; --ink: #edf1f5; --muted: #aab5c2; --line: #313b46; --accent: #6fb6d8; --ok: #68d391; --warn: #f0b45b; --focus: rgba(111, 182, 216, 0.32); } }
12
12
  :root[data-theme="dark"] { color-scheme: dark; --bg: #111418; --panel: #1a2027; --ink: #edf1f5; --muted: #aab5c2; --line: #313b46; --accent: #6fb6d8; --ok: #68d391; --warn: #f0b45b; --focus: rgba(111, 182, 216, 0.32); }
13
13
  * { box-sizing: border-box; }
14
+ html, body { max-width: 100%; overflow-x: hidden; }
14
15
  body { margin: 0; min-width: 320px; background: var(--bg); color: var(--ink); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.45; }
16
+ a, code, pre, span, strong { overflow-wrap: anywhere; }
15
17
  button { font: inherit; }
18
+ button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, a:focus-visible { outline: 3px solid var(--focus); outline-offset: -2px; }
16
19
  .app-shell { display: grid; min-height: 100vh; grid-template-rows: auto 1fr; }
17
20
  .topbar { border-bottom: 1px solid var(--line); background: var(--panel); }
18
21
  .topbar-inner, main { width: min(1180px, 100%); margin: 0 auto; padding: 16px; }
@@ -23,14 +26,15 @@ export function renderWebConsoleHtml() {
23
26
  .icon-button { display: inline-flex; align-items: center; justify-content: center; min-width: 40px; min-height: 40px; border: 1px solid var(--line); border-radius: 6px; background: var(--panel); color: var(--ink); cursor: pointer; }
24
27
  .icon-button svg { width: 18px; height: 18px; stroke: currentColor; }
25
28
  .refresh-button { min-height: 40px; border: 1px solid var(--accent); border-radius: 6px; background: var(--accent); color: white; padding: 0 14px; cursor: pointer; }
26
- .refresh-button:focus-visible, .icon-button:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; }
29
+ .refresh-button:focus-visible, .icon-button:focus-visible { outline-color: var(--focus); }
27
30
  main { display: grid; gap: 16px; }
28
31
  .status-line { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--muted); font-size: 0.92rem; }
29
32
  .pill { display: inline-flex; align-items: center; min-height: 28px; border: 1px solid var(--line); border-radius: 999px; background: var(--panel); padding: 0 10px; color: var(--muted); }
30
33
  .pill.ok { border-color: rgba(19, 122, 68, 0.35); color: var(--ok); }
31
34
  .pill.warn { border-color: rgba(163, 95, 0, 0.35); color: var(--warn); }
32
35
  .grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
33
- .panel { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 14px; }
36
+ .grid > *, .guide-grid > *, .control-row > *, .metric-grid > *, .chart-grid > * { min-width: 0; }
37
+ .panel { min-width: 0; border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 14px; }
34
38
  .panel h2 { margin: 0 0 10px; font-size: 0.98rem; letter-spacing: 0; }
35
39
  .metric-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
36
40
  .chart-grid { display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 12px; }
@@ -52,7 +56,7 @@ export function renderWebConsoleHtml() {
52
56
  .command-list { display: grid; gap: 8px; margin-top: 12px; }
53
57
  .command-chip { display: block; border: 1px solid var(--line); border-radius: 6px; background: color-mix(in srgb, var(--panel) 82%, var(--bg)); padding: 9px 10px; color: var(--ink); font: 0.84rem/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: normal; word-break: break-word; }
54
58
  .list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
55
- .list-item { border: 1px solid var(--line); border-radius: 6px; padding: 10px; }
59
+ .list-item { min-width: 0; border: 1px solid var(--line); border-radius: 6px; padding: 10px; overflow-wrap: anywhere; }
56
60
  .list-item strong { display: block; font-size: 0.94rem; }
57
61
  .list-item button { margin-top: 8px; }
58
62
  .control-row { display: grid; grid-template-columns: 1fr; gap: 8px; margin-bottom: 10px; }
@@ -87,6 +91,8 @@ export function renderWebConsoleHtml() {
87
91
  <section class="status-line" aria-live="polite"><span class="pill" id="load-state">Loading workflow</span><span id="last-updated">Waiting for local API data</span></section>
88
92
  ${renderAdoptionGuideSections()}
89
93
  ${renderDashboardSections()}
94
+ <section class="grid"><div class="panel"><h2>Task Board</h2><ul class="list" id="task-board"></ul></div><div class="panel"><h2>Provider Health</h2><ul class="list" id="provider-health"></ul></div></section>
95
+ <section class="grid"><div class="panel"><h2>Decisions</h2><ul class="list" id="decisions-list"></ul></div><div class="panel"><h2>Reviews</h2><ul class="list" id="reviews-list"></ul></div></section>
90
96
  <section class="grid"><div class="panel"><h2>Graph Plan</h2><ul class="list" id="graph"></ul></div><div class="panel"><h2>Next Actions</h2><ul class="list" id="actions"></ul></div></section><section class="panel" aria-labelledby="task-detail-heading"><h2 id="task-detail-heading">Task Detail</h2><div class="control-row"><div class="field"><label for="task-detail-select">Task</label><select id="task-detail-select"></select></div><button class="text-button secondary" id="task-detail-refresh" type="button">Refresh Detail</button></div><div id="task-detail"></div></section><section class="grid"><div class="panel"><h2>Cost</h2><ul class="list" id="cost-view"></ul></div><div class="panel"><h2>Add Task</h2><div class="control-row"><div class="field"><label for="task-id">ID</label><input id="task-id" placeholder="WEB-001" /></div><div class="field"><label for="task-title">Title</label><input id="task-title" placeholder="Implement workflow task" /></div><div class="field"><label for="task-owner">Owner</label><select id="task-owner"></select></div><div class="field"><label for="task-paths">Paths</label><input id="task-paths" placeholder="src/web-api.ts, test/orchestra.test.js" /></div></div><div class="control-row"><div class="field"><label for="task-acceptance">Acceptance</label><input id="task-acceptance" placeholder="comma separated criteria" /></div><div class="field"><label for="task-risks">Risks</label><input id="task-risks" placeholder="security, release" /></div><button class="text-button" id="task-add" type="button">Add Task</button></div></div></section><section class="grid"><div class="panel"><h2>Evidence</h2><div class="control-row"><div class="field"><label for="evidence-task">Task</label><select id="evidence-task"></select></div><div class="field"><label for="evidence-type">Type</label><select id="evidence-type"></select></div><button class="text-button" id="evidence-filter" type="button">Apply</button></div><ul class="list" id="evidence-list"></ul></div><div class="panel"><h2>Roles</h2><ul class="list" id="roles-view"></ul></div></section><section class="grid"><div class="panel"><h2>Planning</h2><ul class="list" id="planning-view"></ul></div><div class="panel"><h2>Workflow Runs</h2><div class="control-row"><div class="field"><label for="workflow-task">Task</label><select id="workflow-task"></select></div><div class="field"><label for="workflow-gates">Gates</label><select id="workflow-gates"><option>phase</option><option>none</option><option>all</option></select></div><div class="field"><label for="workflow-approver">Approver</label><input id="workflow-approver" value="web-console" /></div><button class="text-button" id="workflow-start" type="button">Start Workflow</button></div><div class="control-row"><div class="field"><label for="workflow-rationale">Gate rationale</label><input id="workflow-rationale" value="Approved from web console" /></div></div><ul class="list" id="workflow-runs"></ul></div></section><section class="grid"><div class="panel"><h2>Playwright</h2><div class="control-row"><div class="field"><label for="playwright-task">Task</label><select id="playwright-task"></select></div><div class="field"><label for="playwright-kind">Kind</label><select id="playwright-kind"><option>screenshot</option><option>trace</option><option>video</option><option>report</option></select></div><div class="field"><label for="playwright-path">Artifact path</label><input id="playwright-path" placeholder="reports/smoke.png" /></div><div class="field"><label for="playwright-summary">Summary</label><input id="playwright-summary" placeholder="Evidence summary" /></div><button class="text-button" id="playwright-attach" type="button">Attach</button></div><ul class="list" id="playwright-plan"></ul></div><div class="panel"><h2>Skills</h2><div class="control-row"><div class="field"><label for="skills-task">Task</label><select id="skills-task"></select></div><div class="field"><label for="skills-target">Target</label><select id="skills-target"><option>generic</option><option>claude</option><option>cursor</option><option>codex</option><option>vscode</option><option>windsurf</option></select></div><button class="text-button" id="skills-plan" type="button">Plan</button><button class="text-button" id="skills-render" type="button">Render</button></div><ul class="list" id="skills-plan-list"></ul></div></section><section class="grid"><div class="panel"><h2>Skill Catalog</h2><ul class="list" id="skills-list"></ul><h2>Render Preview</h2><pre class="preview" id="skills-preview">No skill render yet.</pre></div><div class="panel"><h2>Source of Truth</h2><ul class="list" id="sources-list"></ul></div></section><section class="grid"><div class="panel"><h2>Lessons Learned</h2><div class="control-row"><div class="field"><label for="lesson-promote-target">Promote to</label><select id="lesson-promote-target"><option>doc</option><option>skill</option><option>rule</option></select></div><div class="field"><label for="lesson-promote-filter">Filter</label><input id="lesson-promote-filter" placeholder="operation or error" /></div><button class="text-button" id="lesson-promote" type="button">Promote</button></div><ul class="list" id="lesson-promotion-result"></ul><ul class="list" id="lessons-list"></ul></div><div class="panel"><h2>Add Lesson</h2><div class="control-row"><div class="field"><label for="lesson-task">Task</label><select id="lesson-task"></select></div><div class="field"><label for="lesson-actor">Actor</label><input id="lesson-actor" value="parent" data-lesson-required required /></div><div class="field"><label for="lesson-operation">Operation</label><input id="lesson-operation" placeholder="generated-doc-update" data-lesson-required required /></div><div class="field"><label for="lesson-error-signature">Error signature</label><input id="lesson-error-signature" placeholder="syntax error" data-lesson-required required /></div></div><div class="control-row"><div class="field"><label for="lesson-failed-action">Failed action</label><input id="lesson-failed-action" placeholder="command or attempted step" data-lesson-required required /></div><div class="field"><label for="lesson-root-cause">Root cause</label><input id="lesson-root-cause" placeholder="why it failed" data-lesson-required required /></div><div class="field"><label for="lesson-fix">Fix</label><input id="lesson-fix" placeholder="working correction" data-lesson-required required /></div><div class="field"><label for="lesson-prevention">Prevention</label><input id="lesson-prevention" placeholder="how to avoid repeat" data-lesson-required required /></div></div><div class="control-row"><div class="field"><label for="lesson-applies-to">Applies to</label><input id="lesson-applies-to" placeholder="web, skills" /></div><div class="field"><label for="lesson-verified-by">Verified by</label><input id="lesson-verified-by" placeholder="test, precommit" /></div><button class="text-button" id="lesson-add" type="button">Add Lesson</button></div></div></section>
91
97
  </main>
92
98
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"web-console.js","sourceRoot":"","sources":["../src/web-console.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAqFT,2BAA2B,EAAE;UAC7B,uBAAuB,EAAE;;;;;;;QAO3B,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"web-console.js","sourceRoot":"","sources":["../src/web-console.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAyFT,2BAA2B,EAAE;UAC7B,uBAAuB,EAAE;;;;;;;;;QAS3B,CAAC;AACT,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface RecoveryStateItem {
2
+ id: string;
3
+ severity: "error" | "warning";
4
+ category: "stale-lock" | "temp-file" | "file-lock" | "orphan-event" | "orphan-run" | "invalid-json" | "other";
5
+ owner?: string;
6
+ age?: string;
7
+ path?: string;
8
+ recommendedAction: string;
9
+ repair?: RecoveryRepairAction;
10
+ message: string;
11
+ }
12
+ export type RecoveryRepairAction = "release-lock" | "remove-temp-file" | "remove-file-lock";
13
+ export interface RecoveryState {
14
+ valid: boolean;
15
+ errors: number;
16
+ warnings: number;
17
+ items: RecoveryStateItem[];
18
+ }
19
+ export interface RecoveryRepairInput {
20
+ action: RecoveryRepairAction;
21
+ target: string;
22
+ confirmed: boolean;
23
+ }
24
+ export interface RecoveryRepairResult {
25
+ action: RecoveryRepairAction;
26
+ target: string;
27
+ repaired: boolean;
28
+ }
29
+ export declare function getRecoveryState(root?: string): Promise<RecoveryState>;
30
+ export declare function repairRecoveryItem(input: RecoveryRepairInput, root?: string): Promise<RecoveryRepairResult>;
@@ -0,0 +1,163 @@
1
+ import { rm } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { WORKFLOW_DIR } from "./constants.js";
4
+ import { releaseLock } from "./workflow-services.js";
5
+ import { appendEvent } from "./workspace.js";
6
+ import { validateWorkspace, } from "./workspace-validator.js";
7
+ export async function getRecoveryState(root = process.cwd()) {
8
+ const report = await validateWorkspace(root, {
9
+ promptRegistry: { strict: false },
10
+ });
11
+ return recoveryStateFromReport(report);
12
+ }
13
+ export async function repairRecoveryItem(input, root = process.cwd()) {
14
+ if (!input.confirmed) {
15
+ throw new Error("recovery repair requires confirmation");
16
+ }
17
+ if (input.action === "release-lock") {
18
+ await releaseLock(input.target, root);
19
+ }
20
+ else if (input.action === "remove-temp-file") {
21
+ await rm(resolveRecoveryArtifactPath(root, input.target, ".tmp"));
22
+ }
23
+ else if (input.action === "remove-file-lock") {
24
+ await rm(resolveRecoveryArtifactPath(root, input.target, ".lock"), {
25
+ recursive: true,
26
+ });
27
+ }
28
+ else {
29
+ throw new Error(`unsupported recovery action: ${input.action}`);
30
+ }
31
+ await appendEvent(root, {
32
+ type: "RECOVERY_REPAIR_APPLIED",
33
+ actor: "web-console",
34
+ summary: `Recovery repair applied: ${input.action}`,
35
+ metadata: { action: input.action, target: input.target },
36
+ });
37
+ return {
38
+ action: input.action,
39
+ target: input.target,
40
+ repaired: true,
41
+ };
42
+ }
43
+ function recoveryStateFromReport(report) {
44
+ const messages = [
45
+ ...report.errors.map((message) => ({
46
+ severity: "error",
47
+ message,
48
+ })),
49
+ ...report.warnings.map((message) => ({
50
+ severity: "warning",
51
+ message,
52
+ })),
53
+ ];
54
+ return {
55
+ valid: report.valid,
56
+ errors: report.errors.length,
57
+ warnings: report.warnings.length,
58
+ items: messages.map(({ severity, message }, index) => recoveryItemFromMessage(severity, message, index)),
59
+ };
60
+ }
61
+ function recoveryItemFromMessage(severity, message, index) {
62
+ const staleLock = message.match(/locks\.json: lock ([^\s]+) for task ([^\s]+) \(([^)]+)\) is stale after ([^;]+); owner=([^;]+)/);
63
+ if (staleLock) {
64
+ const lockId = staleLock[1] ?? "";
65
+ const taskPath = staleLock[3] ?? "";
66
+ return {
67
+ id: `stale-lock:${lockId}`,
68
+ severity,
69
+ category: "stale-lock",
70
+ owner: staleLock[5] ?? "",
71
+ age: staleLock[4] ?? "",
72
+ path: taskPath,
73
+ repair: "release-lock",
74
+ recommendedAction: `Inspect worktree, then release lock ${lockId}.`,
75
+ message,
76
+ };
77
+ }
78
+ const tempFile = message.match(/(\.agent-workflow\/[^:]+\.tmp):/);
79
+ if (tempFile) {
80
+ const targetPath = tempFile[1] ?? "";
81
+ return {
82
+ id: `temp-file:${targetPath}`,
83
+ severity,
84
+ category: "temp-file",
85
+ path: targetPath,
86
+ repair: "remove-temp-file",
87
+ recommendedAction: "Confirm the target JSON is valid, then remove the interrupted temp file.",
88
+ message,
89
+ };
90
+ }
91
+ const fileLock = message.match(/(\.agent-workflow\/[^:]+\.lock):/);
92
+ if (fileLock) {
93
+ const targetPath = fileLock[1] ?? "";
94
+ return {
95
+ id: `file-lock:${targetPath}`,
96
+ severity,
97
+ category: "file-lock",
98
+ path: targetPath,
99
+ repair: "remove-file-lock",
100
+ recommendedAction: "Confirm no Orchestra command is running, then remove the stale file lock directory.",
101
+ message,
102
+ };
103
+ }
104
+ const orphanEvent = message.match(/(events\.jsonl:\d+): event ([^\s]+) references unknown task ([^\s]+)/);
105
+ if (orphanEvent) {
106
+ const sourcePath = orphanEvent[1] ?? "";
107
+ const eventId = orphanEvent[2] ?? "";
108
+ const taskId = orphanEvent[3] ?? "";
109
+ return {
110
+ id: `orphan-event:${eventId}`,
111
+ severity,
112
+ category: "orphan-event",
113
+ path: sourcePath,
114
+ recommendedAction: `Restore task ${taskId} or archive the orphan event manually after review.`,
115
+ message,
116
+ };
117
+ }
118
+ const orphanRun = message.match(/(workflow-runs\.jsonl:\d+): run ([^\s]+) references unknown task ([^;]+)/);
119
+ if (orphanRun) {
120
+ const sourcePath = orphanRun[1] ?? "";
121
+ const runId = orphanRun[2] ?? "";
122
+ const taskId = orphanRun[3] ?? "";
123
+ return {
124
+ id: `orphan-run:${runId}`,
125
+ severity,
126
+ category: "orphan-run",
127
+ path: sourcePath,
128
+ recommendedAction: `Archive run ${runId} or restore task ${taskId} before resuming.`,
129
+ message,
130
+ };
131
+ }
132
+ if (message.includes("invalid JSON")) {
133
+ return {
134
+ id: `invalid-json:${index}`,
135
+ severity,
136
+ category: "invalid-json",
137
+ recommendedAction: "Repair or remove the malformed JSON line after confirming the canonical record.",
138
+ message,
139
+ };
140
+ }
141
+ return {
142
+ id: `issue:${index}`,
143
+ severity,
144
+ category: "other",
145
+ recommendedAction: "Review the validation message and rerun validation.",
146
+ message,
147
+ };
148
+ }
149
+ function resolveRecoveryArtifactPath(root, target, expectedSuffix) {
150
+ if (!target.startsWith(`${WORKFLOW_DIR}/`) ||
151
+ !target.endsWith(expectedSuffix)) {
152
+ throw new Error(`invalid recovery target: ${target}`);
153
+ }
154
+ const workflowRoot = path.join(root, WORKFLOW_DIR);
155
+ const relativeTarget = target.slice(`${WORKFLOW_DIR}/`.length);
156
+ const resolved = path.resolve(workflowRoot, relativeTarget);
157
+ const relative = path.relative(workflowRoot, resolved);
158
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
159
+ throw new Error(`recovery target escapes workspace: ${target}`);
160
+ }
161
+ return resolved;
162
+ }
163
+ //# sourceMappingURL=web-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-recovery.js","sourceRoot":"","sources":["../src/web-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { AutonomousRun } from "./types.js";
2
+ export interface WorkflowProgressSummary {
3
+ runId: string;
4
+ taskId: string;
5
+ status: AutonomousRun["status"];
6
+ gates: AutonomousRun["gates"];
7
+ currentPhase?: string;
8
+ currentRole?: string;
9
+ provider?: string;
10
+ model?: string;
11
+ elapsedMs: number;
12
+ completedPhases: number;
13
+ totalPhases: number;
14
+ latestStatus: string;
15
+ failureReason?: string;
16
+ fallbackState?: string;
17
+ pausedGate?: string;
18
+ canApproveGate: boolean;
19
+ canResume: boolean;
20
+ }
21
+ export interface WorkflowEventSummary {
22
+ id: string;
23
+ type: string;
24
+ taskId: string | null;
25
+ runId?: string;
26
+ actor: string;
27
+ summary: string;
28
+ timestamp: string;
29
+ phase?: string;
30
+ gateId?: string;
31
+ result?: string;
32
+ rationale?: string;
33
+ }
34
+ export declare function listWorkflowProgress(root?: string): Promise<WorkflowProgressSummary[]>;
35
+ export declare function listWorkflowEvents({ root, task, run, limit, }?: {
36
+ root?: string;
37
+ task?: string;
38
+ run?: string;
39
+ limit?: number;
40
+ }): Promise<WorkflowEventSummary[]>;
41
+ export declare function summarizeWorkflowProgress(run: AutonomousRun, now?: number): WorkflowProgressSummary;
@@ -0,0 +1,114 @@
1
+ import { listAutonomousRuns } from "./autonomous-workflow.js";
2
+ import { readEvents } from "./workspace.js";
3
+ export async function listWorkflowProgress(root = process.cwd()) {
4
+ return (await listAutonomousRuns(root)).map((run) => summarizeWorkflowProgress(run));
5
+ }
6
+ export async function listWorkflowEvents({ root = process.cwd(), task, run, limit = 20, } = {}) {
7
+ const events = await readEvents(root);
8
+ return events
9
+ .filter(isWorkflowEvent)
10
+ .filter((event) => !task || event.taskId === task)
11
+ .filter((event) => !run || eventRunId(event) === run)
12
+ .slice(-limit)
13
+ .reverse()
14
+ .map(summarizeWorkflowEvent);
15
+ }
16
+ export function summarizeWorkflowProgress(run, now = Date.now()) {
17
+ const current = activePhase(run.phases) ??
18
+ failedPhase(run.phases) ??
19
+ pausedPhase(run.phases) ??
20
+ latestPhase(run.phases);
21
+ const providerProgress = current?.providerProgress;
22
+ const elapsedMs = providerProgress
23
+ ? elapsedSince(providerProgress.startedAt, now, providerProgress.elapsedMs)
24
+ : current
25
+ ? elapsedSince(current.startedAt, now, 0)
26
+ : elapsedSince(run.createdAt, now, 0);
27
+ const paused = pausedPhase(run.phases);
28
+ const summary = {
29
+ runId: run.id,
30
+ taskId: run.taskId,
31
+ status: run.status,
32
+ gates: run.gates,
33
+ elapsedMs,
34
+ completedPhases: run.phases.filter((phase) => phase.status === "done")
35
+ .length,
36
+ totalPhases: run.phases.length,
37
+ latestStatus: current
38
+ ? `${current.phase}:${current.status}`
39
+ : `run:${run.status}`,
40
+ canApproveGate: Boolean(paused?.gateId),
41
+ canResume: run.status === "paused",
42
+ };
43
+ if (current) {
44
+ summary.currentPhase = current.phase;
45
+ summary.currentRole = current.role;
46
+ }
47
+ if (providerProgress) {
48
+ summary.provider = providerProgress.provider;
49
+ summary.model = providerProgress.model;
50
+ if (providerProgress.fallbacks.length > 0) {
51
+ summary.fallbackState = providerProgress.fallbacks.join(", ");
52
+ }
53
+ }
54
+ if (run.status === "failed") {
55
+ const failureReason = current?.notes ?? providerProgress?.message;
56
+ if (failureReason) {
57
+ summary.failureReason = failureReason;
58
+ }
59
+ }
60
+ if (paused?.gateId) {
61
+ summary.pausedGate = paused.gateId;
62
+ }
63
+ return summary;
64
+ }
65
+ function isWorkflowEvent(event) {
66
+ return (event.type === "GATE_APPROVED" ||
67
+ event.type === "GATE_BLOCKED" ||
68
+ event.type === "WORKFLOW_TIMEOUT" ||
69
+ event.type.startsWith("AUTONOMOUS_"));
70
+ }
71
+ function summarizeWorkflowEvent(event) {
72
+ const runId = eventRunId(event);
73
+ const phase = stringMetadata(event, "phase");
74
+ const gateId = stringMetadata(event, "gateId");
75
+ const result = stringMetadata(event, "result");
76
+ const rationale = stringMetadata(event, "rationale");
77
+ return {
78
+ id: event.id,
79
+ type: event.type,
80
+ taskId: event.taskId,
81
+ actor: event.actor,
82
+ summary: event.summary,
83
+ timestamp: event.timestamp,
84
+ ...(runId ? { runId } : {}),
85
+ ...(phase ? { phase } : {}),
86
+ ...(gateId ? { gateId } : {}),
87
+ ...(result ? { result } : {}),
88
+ ...(rationale ? { rationale } : {}),
89
+ };
90
+ }
91
+ function eventRunId(event) {
92
+ return stringMetadata(event, "runId");
93
+ }
94
+ function stringMetadata(event, key) {
95
+ const value = event.metadata[key];
96
+ return typeof value === "string" ? value : undefined;
97
+ }
98
+ function activePhase(phases) {
99
+ return [...phases].reverse().find((phase) => phase.status === "running");
100
+ }
101
+ function failedPhase(phases) {
102
+ return [...phases].reverse().find((phase) => phase.status === "failed");
103
+ }
104
+ function pausedPhase(phases) {
105
+ return [...phases].reverse().find((phase) => phase.status === "gate_paused");
106
+ }
107
+ function latestPhase(phases) {
108
+ return [...phases].reverse().find(Boolean);
109
+ }
110
+ function elapsedSince(startedAt, now, fallbackMs) {
111
+ const started = Date.parse(startedAt);
112
+ return Number.isFinite(started) ? Math.max(0, now - started) : fallbackMs;
113
+ }
114
+ //# sourceMappingURL=web-workflow-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-workflow-progress.js","sourceRoot":"","sources":["../src/web-workflow-progress.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import type { ApprovalDecisionInput, ApprovalRecord, BudgetFallbackProposal, WorkflowGateApprovalInput, WorkflowGateApprovalResult } from "./types.js";
1
+ import type { ApprovalDecisionInput, ApprovalRecord, BudgetFallbackProposal, WorkflowGateDecisionInput, WorkflowGateDecisionRecord, WorkflowGateApprovalInput, WorkflowGateApprovalResult } from "./types.js";
2
2
  export declare function listApprovals(taskId?: string, root?: string): Promise<ApprovalRecord[]>;
3
3
  export declare function approveWorkflowGate(input: WorkflowGateApprovalInput, root?: string): Promise<WorkflowGateApprovalResult>;
4
+ export declare function recordWorkflowGateDecision(input: WorkflowGateDecisionInput, root?: string): Promise<WorkflowGateDecisionRecord>;
4
5
  export declare function showApproval(id: string, root?: string): Promise<ApprovalRecord & {
5
6
  content: string;
6
7
  }>;
@@ -77,6 +77,78 @@ export async function approveWorkflowGate(input, root = process.cwd()) {
77
77
  alreadyApproved: false,
78
78
  };
79
79
  }
80
+ export async function recordWorkflowGateDecision(input, root = process.cwd()) {
81
+ if (input.result === "approve") {
82
+ const approval = await approveWorkflowGate({
83
+ runId: input.runId,
84
+ gateId: input.gateId,
85
+ approver: input.reviewer,
86
+ rationale: input.rationale,
87
+ }, root);
88
+ return {
89
+ run: approval.run,
90
+ gateId: approval.gateId,
91
+ reviewer: approval.approver,
92
+ rationale: input.rationale,
93
+ result: "approve",
94
+ decidedAt: approval.approvedAt,
95
+ alreadyApproved: approval.alreadyApproved,
96
+ };
97
+ }
98
+ const run = await readAutonomousRun(root, input.runId);
99
+ if (!run) {
100
+ throw new Error(`workflow run not found: ${input.runId}`);
101
+ }
102
+ const phaseIndex = run.phases.findLastIndex((phase) => phase.status === "gate_paused");
103
+ if (phaseIndex < 0) {
104
+ throw new Error(`workflow run ${input.runId} has no paused gate`);
105
+ }
106
+ const phase = run.phases[phaseIndex];
107
+ const gateId = phase.gateId ?? gateIdForPhase(run, phaseIndex);
108
+ if (input.gateId !== gateId) {
109
+ throw new Error(`wrong gate id: ${input.gateId}. Expected gate: ${gateId}`);
110
+ }
111
+ const decidedAt = new Date().toISOString();
112
+ const updatedRun = {
113
+ ...run,
114
+ phases: run.phases.map((candidate, index) => index === phaseIndex
115
+ ? {
116
+ ...phase,
117
+ gateId,
118
+ notes: `Gate ${input.result}: ${input.rationale}`,
119
+ }
120
+ : candidate),
121
+ updatedAt: decidedAt,
122
+ };
123
+ await persistRun(root, updatedRun);
124
+ await appendEvent(root, removeUndefined({
125
+ type: "GATE_BLOCKED",
126
+ taskId: run.taskId,
127
+ actor: input.reviewer,
128
+ summary: input.result === "changes"
129
+ ? `Gate changes requested: ${gateId}`
130
+ : `Gate blocked: ${gateId}`,
131
+ artifacts: phase.reviewArtifact ? [phase.reviewArtifact] : undefined,
132
+ metadata: {
133
+ runId: run.id,
134
+ gateId,
135
+ result: input.result,
136
+ reviewer: input.reviewer,
137
+ rationale: input.rationale,
138
+ decidedAt,
139
+ phase: phase.phase,
140
+ },
141
+ }));
142
+ return {
143
+ run: updatedRun,
144
+ gateId,
145
+ reviewer: input.reviewer,
146
+ rationale: input.rationale,
147
+ result: input.result,
148
+ decidedAt,
149
+ alreadyApproved: false,
150
+ };
151
+ }
80
152
  export async function showApproval(id, root = process.cwd()) {
81
153
  const record = await getApprovalRecord(id, root);
82
154
  const content = await readFile(path.join(root, record.artifact), "utf8");
@@ -105,18 +177,25 @@ export async function findStoredApprovalForProposal(proposal, root) {
105
177
  }
106
178
  async function recordApprovalDecision(input, status, root) {
107
179
  const current = await getApprovalRecord(input.id, root);
108
- const requested = approvalEventsForArtifact(await readEvents(root), current.artifact).find((event) => event.type === "BUDGET_ESCALATION_REQUESTED");
180
+ const requested = approvalEventsForArtifact(await readEvents(root), current.artifact).find((event) => event.type === "BUDGET_ESCALATION_REQUESTED" ||
181
+ event.type === "ACTION_POLICY_APPROVAL_REQUESTED");
182
+ const isActionPolicy = requested?.type === "ACTION_POLICY_APPROVAL_REQUESTED";
109
183
  await appendEvent(root, removeUndefined({
110
184
  type: status === "approved"
111
- ? "BUDGET_ESCALATION_APPROVED"
112
- : "BUDGET_ESCALATION_REJECTED",
185
+ ? isActionPolicy
186
+ ? "ACTION_POLICY_APPROVAL_APPROVED"
187
+ : "BUDGET_ESCALATION_APPROVED"
188
+ : isActionPolicy
189
+ ? "ACTION_POLICY_APPROVAL_REJECTED"
190
+ : "BUDGET_ESCALATION_REJECTED",
113
191
  taskId: current.taskId,
114
192
  actor: "parent",
115
- summary: `Budget escalation ${status}: ${input.id}`,
193
+ summary: `${isActionPolicy ? "Action policy approval" : "Budget escalation"} ${status}: ${input.id}`,
116
194
  artifacts: [current.artifact],
117
195
  metadata: {
118
196
  approvalId: input.id,
119
197
  proposal: requested?.metadata.proposal,
198
+ actionPolicy: requested?.metadata,
120
199
  approver: input.approver,
121
200
  rationale: input.rationale,
122
201
  },
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-approval-service.js","sourceRoot":"","sources":["../src/workflow-approval-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-approval-service.js","sourceRoot":"","sources":["../src/workflow-approval-service.ts"],"names":[],"mappings":"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"}