@jterrats/open-orchestra 0.5.7 → 1.0.2

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 (260) 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 +169 -32
  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-store.js +3 -3
  9. package/dist/autonomous-run-store.js.map +1 -1
  10. package/dist/benchmark.d.ts +4 -1
  11. package/dist/benchmark.js +93 -4
  12. package/dist/benchmark.js.map +1 -1
  13. package/dist/cli.js +73 -2
  14. package/dist/cli.js.map +1 -1
  15. package/dist/collaboration-flows.js +3 -5
  16. package/dist/collaboration-flows.js.map +1 -1
  17. package/dist/collection-utils.d.ts +3 -0
  18. package/dist/collection-utils.js +10 -0
  19. package/dist/collection-utils.js.map +1 -0
  20. package/dist/command-manifest.d.ts +12 -1
  21. package/dist/command-manifest.js +213 -10
  22. package/dist/command-manifest.js.map +1 -1
  23. package/dist/commands.d.ts +10 -5
  24. package/dist/commands.js +16 -6
  25. package/dist/commands.js.map +1 -1
  26. package/dist/config-migrations.d.ts +24 -0
  27. package/dist/config-migrations.js +102 -0
  28. package/dist/config-migrations.js.map +1 -0
  29. package/dist/constants.d.ts +2 -0
  30. package/dist/constants.js +23 -0
  31. package/dist/constants.js.map +1 -1
  32. package/dist/dashboard-commands.d.ts +2 -0
  33. package/dist/dashboard-commands.js +14 -0
  34. package/dist/dashboard-commands.js.map +1 -0
  35. package/dist/defaults.d.ts +13 -0
  36. package/dist/defaults.js +13 -0
  37. package/dist/defaults.js.map +1 -1
  38. package/dist/delegation-decision.js +23 -8
  39. package/dist/delegation-decision.js.map +1 -1
  40. package/dist/delivery-commands.js +5 -0
  41. package/dist/delivery-commands.js.map +1 -1
  42. package/dist/delivery-dashboard-charts.d.ts +4 -0
  43. package/dist/delivery-dashboard-charts.js +156 -0
  44. package/dist/delivery-dashboard-charts.js.map +1 -0
  45. package/dist/delivery-dashboard-html.d.ts +2 -0
  46. package/dist/delivery-dashboard-html.js +115 -0
  47. package/dist/delivery-dashboard-html.js.map +1 -0
  48. package/dist/delivery-dashboard-types.d.ts +78 -0
  49. package/dist/delivery-dashboard-types.js +2 -0
  50. package/dist/delivery-dashboard-types.js.map +1 -0
  51. package/dist/delivery-dashboard.d.ts +8 -0
  52. package/dist/delivery-dashboard.js +124 -0
  53. package/dist/delivery-dashboard.js.map +1 -0
  54. package/dist/effort-classification.d.ts +7 -0
  55. package/dist/effort-classification.js +72 -0
  56. package/dist/effort-classification.js.map +1 -0
  57. package/dist/extension-commands.d.ts +3 -0
  58. package/dist/extension-commands.js +40 -0
  59. package/dist/extension-commands.js.map +1 -0
  60. package/dist/extensions.d.ts +22 -0
  61. package/dist/extensions.js +126 -0
  62. package/dist/extensions.js.map +1 -0
  63. package/dist/github.d.ts +2 -0
  64. package/dist/github.js +15 -3
  65. package/dist/github.js.map +1 -1
  66. package/dist/health-checks.js +51 -0
  67. package/dist/health-checks.js.map +1 -1
  68. package/dist/lucid-story-map.d.ts +73 -0
  69. package/dist/lucid-story-map.js +112 -0
  70. package/dist/lucid-story-map.js.map +1 -0
  71. package/dist/mcp-integrations.d.ts +19 -0
  72. package/dist/mcp-integrations.js +58 -0
  73. package/dist/mcp-integrations.js.map +1 -0
  74. package/dist/mcp-tool-adapter.d.ts +21 -0
  75. package/dist/mcp-tool-adapter.js +56 -0
  76. package/dist/mcp-tool-adapter.js.map +1 -0
  77. package/dist/memory.js +18 -8
  78. package/dist/memory.js.map +1 -1
  79. package/dist/metrics-commands.js +47 -13
  80. package/dist/metrics-commands.js.map +1 -1
  81. package/dist/model-commands.d.ts +5 -0
  82. package/dist/model-commands.js +101 -3
  83. package/dist/model-commands.js.map +1 -1
  84. package/dist/model-providers.js +13 -1
  85. package/dist/model-providers.js.map +1 -1
  86. package/dist/package-update-check.d.ts +18 -0
  87. package/dist/package-update-check.js +20 -0
  88. package/dist/package-update-check.js.map +1 -1
  89. package/dist/phase-executor.d.ts +1 -0
  90. package/dist/phase-executor.js +118 -14
  91. package/dist/phase-executor.js.map +1 -1
  92. package/dist/phase-playbooks.d.ts +15 -0
  93. package/dist/phase-playbooks.js +82 -0
  94. package/dist/phase-playbooks.js.map +1 -1
  95. package/dist/planning-commands.d.ts +1 -0
  96. package/dist/planning-commands.js +24 -1
  97. package/dist/planning-commands.js.map +1 -1
  98. package/dist/project-detection.js +9 -7
  99. package/dist/project-detection.js.map +1 -1
  100. package/dist/prompt-registry-update.d.ts +2 -0
  101. package/dist/prompt-registry-update.js +25 -1
  102. package/dist/prompt-registry-update.js.map +1 -1
  103. package/dist/prompt-registry-validation.js +39 -2
  104. package/dist/prompt-registry-validation.js.map +1 -1
  105. package/dist/qa-commands.d.ts +2 -0
  106. package/dist/qa-commands.js +18 -0
  107. package/dist/qa-commands.js.map +1 -0
  108. package/dist/qa-coverage.d.ts +24 -0
  109. package/dist/qa-coverage.js +198 -0
  110. package/dist/qa-coverage.js.map +1 -0
  111. package/dist/qa-readiness.d.ts +5 -0
  112. package/dist/qa-readiness.js +26 -0
  113. package/dist/qa-readiness.js.map +1 -0
  114. package/dist/refresh-generated.d.ts +10 -1
  115. package/dist/refresh-generated.js +83 -6
  116. package/dist/refresh-generated.js.map +1 -1
  117. package/dist/release-candidate.d.ts +9 -1
  118. package/dist/release-candidate.js +52 -1
  119. package/dist/release-candidate.js.map +1 -1
  120. package/dist/release-commands.js +202 -12
  121. package/dist/release-commands.js.map +1 -1
  122. package/dist/release-readiness.d.ts +36 -1
  123. package/dist/release-readiness.js +217 -6
  124. package/dist/release-readiness.js.map +1 -1
  125. package/dist/runtime-bootstrap.js +1 -1
  126. package/dist/runtime-bootstrap.js.map +1 -1
  127. package/dist/runtime-commands.d.ts +2 -0
  128. package/dist/runtime-commands.js +77 -0
  129. package/dist/runtime-commands.js.map +1 -1
  130. package/dist/runtime-execution-renderer.d.ts +3 -2
  131. package/dist/runtime-execution-renderer.js +19 -1
  132. package/dist/runtime-execution-renderer.js.map +1 -1
  133. package/dist/runtime-execution.d.ts +2 -1
  134. package/dist/runtime-execution.js +71 -11
  135. package/dist/runtime-execution.js.map +1 -1
  136. package/dist/runtime-guardrails.d.ts +26 -0
  137. package/dist/runtime-guardrails.js +168 -0
  138. package/dist/runtime-guardrails.js.map +1 -0
  139. package/dist/setup-agents-import.js +5 -3
  140. package/dist/setup-agents-import.js.map +1 -1
  141. package/dist/skills-catalog.js +63 -0
  142. package/dist/skills-catalog.js.map +1 -1
  143. package/dist/skills-commands.d.ts +4 -0
  144. package/dist/skills-commands.js +55 -2
  145. package/dist/skills-commands.js.map +1 -1
  146. package/dist/skills-memory.d.ts +36 -2
  147. package/dist/skills-memory.js +165 -6
  148. package/dist/skills-memory.js.map +1 -1
  149. package/dist/skills-planning.js +2 -4
  150. package/dist/skills-planning.js.map +1 -1
  151. package/dist/skills-render.js +2 -4
  152. package/dist/skills-render.js.map +1 -1
  153. package/dist/skills.d.ts +1 -1
  154. package/dist/skills.js +1 -1
  155. package/dist/skills.js.map +1 -1
  156. package/dist/sprint-commands.js +2 -1
  157. package/dist/sprint-commands.js.map +1 -1
  158. package/dist/subagent-protocol.js +3 -5
  159. package/dist/subagent-protocol.js.map +1 -1
  160. package/dist/support-commands.d.ts +2 -0
  161. package/dist/support-commands.js +18 -0
  162. package/dist/support-commands.js.map +1 -0
  163. package/dist/support-diagnostics.d.ts +49 -0
  164. package/dist/support-diagnostics.js +86 -0
  165. package/dist/support-diagnostics.js.map +1 -0
  166. package/dist/task-graph-commands.js +5 -3
  167. package/dist/task-graph-commands.js.map +1 -1
  168. package/dist/telemetry-redaction.js +8 -1
  169. package/dist/telemetry-redaction.js.map +1 -1
  170. package/dist/tool-commands.d.ts +3 -0
  171. package/dist/tool-commands.js +62 -0
  172. package/dist/tool-commands.js.map +1 -1
  173. package/dist/tracker-adapters.d.ts +71 -0
  174. package/dist/tracker-adapters.js +186 -0
  175. package/dist/tracker-adapters.js.map +1 -0
  176. package/dist/tracker-commands.d.ts +2 -0
  177. package/dist/tracker-commands.js +119 -0
  178. package/dist/tracker-commands.js.map +1 -0
  179. package/dist/types/metrics.d.ts +24 -0
  180. package/dist/types/model-config.d.ts +39 -0
  181. package/dist/types/runtime.d.ts +56 -0
  182. package/dist/types/skills.d.ts +2 -0
  183. package/dist/types/tasks.d.ts +6 -0
  184. package/dist/types/workflow-run.d.ts +17 -0
  185. package/dist/types.d.ts +4 -4
  186. package/dist/types.js.map +1 -1
  187. package/dist/upgrade-commands.js +13 -4
  188. package/dist/upgrade-commands.js.map +1 -1
  189. package/dist/validation.js +2 -2
  190. package/dist/validation.js.map +1 -1
  191. package/dist/visual-validation.d.ts +81 -0
  192. package/dist/visual-validation.js +290 -0
  193. package/dist/visual-validation.js.map +1 -0
  194. package/dist/web-action-security.d.ts +11 -0
  195. package/dist/web-action-security.js +45 -0
  196. package/dist/web-action-security.js.map +1 -0
  197. package/dist/web-api-read-routes.js +101 -1
  198. package/dist/web-api-read-routes.js.map +1 -1
  199. package/dist/web-api.js +507 -5
  200. package/dist/web-api.js.map +1 -1
  201. package/dist/web-artifacts.d.ts +55 -0
  202. package/dist/web-artifacts.js +222 -0
  203. package/dist/web-artifacts.js.map +1 -0
  204. package/dist/web-console/assets/index-BNESIVvk.js +11 -0
  205. package/dist/web-console/assets/index-jxCY5eEc.css +1 -0
  206. package/dist/web-console/index.html +13 -0
  207. package/dist/web-console.js +9 -3
  208. package/dist/web-console.js.map +1 -1
  209. package/dist/web-recovery.d.ts +30 -0
  210. package/dist/web-recovery.js +163 -0
  211. package/dist/web-recovery.js.map +1 -0
  212. package/dist/web-workflow-progress.d.ts +41 -0
  213. package/dist/web-workflow-progress.js +114 -0
  214. package/dist/web-workflow-progress.js.map +1 -0
  215. package/dist/workflow-approval-service.d.ts +2 -1
  216. package/dist/workflow-approval-service.js +72 -0
  217. package/dist/workflow-approval-service.js.map +1 -1
  218. package/dist/workflow-evidence-service.js +8 -1
  219. package/dist/workflow-evidence-service.js.map +1 -1
  220. package/dist/workflow-gates.d.ts +2 -0
  221. package/dist/workflow-gates.js +221 -0
  222. package/dist/workflow-gates.js.map +1 -1
  223. package/dist/workflow-run-commands.js +13 -1
  224. package/dist/workflow-run-commands.js.map +1 -1
  225. package/dist/workflow-services.d.ts +16 -12
  226. package/dist/workflow-services.js +313 -253
  227. package/dist/workflow-services.js.map +1 -1
  228. package/dist/workflow-task-service.d.ts +11 -0
  229. package/dist/workflow-task-service.js +242 -0
  230. package/dist/workflow-task-service.js.map +1 -0
  231. package/dist/workspace-validator.js +109 -3
  232. package/dist/workspace-validator.js.map +1 -1
  233. package/dist/workspace.js +8 -2
  234. package/dist/workspace.js.map +1 -1
  235. package/docs/adoption-guide.md +147 -0
  236. package/docs/autonomous-workflow.md +118 -27
  237. package/docs/benchmark.md +15 -7
  238. package/docs/command-contracts.md +18 -1
  239. package/docs/core-command-surface.md +59 -13
  240. package/docs/end-to-end-demo.md +1 -0
  241. package/docs/extension-contracts.md +83 -0
  242. package/docs/orchestra-mvp.md +83 -3
  243. package/docs/persona-workflows.md +32 -0
  244. package/docs/release-test-matrix.md +42 -0
  245. package/docs/runtime-adapters.md +92 -0
  246. package/docs/runtime-llm-flow.md +13 -0
  247. package/docs/setup-agents-applicability-review.md +173 -0
  248. package/docs/skill-loading-strategy.md +1 -0
  249. package/docs/source-of-truth-and-agent-learning.md +14 -0
  250. package/docs/traceability-flow.md +16 -1
  251. package/docs/tracker-adapter-contract.md +10 -1
  252. package/docs/web-console-qa.md +35 -0
  253. package/package.json +12 -6
  254. package/rules/development-engineering.mdc +68 -0
  255. package/rules/devops-tooling.mdc +1 -0
  256. package/rules/dry-clean-code.mdc +1 -0
  257. package/rules/performance-reliability.mdc +1 -0
  258. package/rules/testing-discipline.mdc +4 -1
  259. package/skills/collection-standards/SKILL.md +63 -0
  260. package/skills/collection-standards/manifest.json +69 -0
@@ -0,0 +1 @@
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#17202a;--muted:#5f6b7a;--line:#d8dee6;--accent:#146c94;--ok:#137a44;--warn:#a35f00;--focus:#146c9440}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111418;--panel:#1a2027;--ink:#edf1f5;--muted:#aab5c2;--line:#313b46;--accent:#6fb6d8;--ok:#68d391;--warn:#f0b45b;--focus:#6fb6d852}}*{box-sizing:border-box}html,body{max-width:100%;overflow-x:hidden}body{background:var(--bg);min-width:320px;color:var(--ink);margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.45}a,code,pre,span,strong{overflow-wrap:anywhere}button,input,select{font:inherit}button:focus-visible,input:focus-visible,select:focus-visible,a:focus-visible{outline:3px solid var(--focus);outline-offset:-2px}.app-shell{grid-template-rows:auto 1fr;min-height:100vh;display:grid}.topbar{border-bottom:1px solid var(--line);background:var(--panel)}.topbar-inner,main{width:min(1180px,100%);margin:0 auto;padding:16px}.brand-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand h1{letter-spacing:0;margin:0;font-size:1.15rem;font-weight:750}.brand p,.guide-card p,.empty-state p{color:var(--muted);margin:2px 0 0;font-size:.92rem}.refresh-button,.text-button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:6px;min-height:38px;padding:0 12px}.text-button.secondary{border-color:var(--line);background:var(--panel);color:var(--ink)}.text-button:disabled{cursor:not-allowed;opacity:.55}main{gap:16px;display:grid}.section-nav{z-index:5;background:color-mix(in srgb, var(--bg) 94%, transparent);gap:8px;padding:8px 0;display:flex;position:sticky;top:0;overflow-x:auto}.section-tab{border:1px solid var(--line);background:var(--panel);min-width:0;color:var(--ink);text-align:left;cursor:pointer;border-radius:8px;flex:0 0 170px;gap:2px;padding:10px 12px;display:grid}.section-tab.active{border-color:color-mix(in srgb, var(--accent) 56%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.section-tab strong{font-size:.9rem}.section-tab span,.section-heading p,.muted-copy{color:var(--muted);font-size:.84rem}.console-section,.overview-layout,.overview-column,.operations-layout,.section-column,.settings-layout,.tasks-layout{gap:12px;display:grid}.section-column{align-content:start}.section-column>*{align-self:start;width:100%}.section-heading{gap:2px;display:grid}.section-heading h2,.section-heading p{margin:0}.section-heading h2{font-size:1.08rem}.status-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:.92rem;display:flex}.pill,.tag{border:1px solid var(--line);color:var(--muted);border-radius:999px;align-items:center;display:inline-flex}.pill{background:var(--panel);min-height:28px;padding:0 10px}.tag{padding:2px 8px;font-size:.78rem}.pill.ok,.tag.ok{color:var(--ok);border-color:#137a4459}.pill.warn,.tag.warn{color:var(--warn);border-color:#a35f0059}.grid,.guide-grid{grid-template-columns:1fr;align-items:start;gap:12px;display:grid}.grid>*,.guide-grid>*,.control-row>*,.metric-grid>*,.chart-grid>*{min-width:0}.panel,.guide-card,.subpanel{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px}.panel h2,.guide-card h2,.subpanel h3{letter-spacing:0;margin:0 0 10px;font-size:1rem}.subpanel{margin-top:12px}.warning-panel{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));margin-bottom:12px}.compact-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.compact-list li{gap:3px;display:grid}.compact-list span{color:var(--muted);overflow-wrap:anywhere}.metric-grid,.chart-grid,.control-row{grid-template-columns:1fr;gap:10px;display:grid}.control-row.compact{grid-template-columns:minmax(140px,1fr) auto;align-items:end;margin-top:8px}.chart-grid{margin-top:12px}.cost-detail-grid{grid-template-columns:1fr;gap:10px;display:grid}.compact-subpanel{min-height:0;margin-top:12px}.compact-chart-grid .chart-card{min-height:0}.compact-chart-grid .chart-frame{min-height:90px}.compact-chart-grid .chart-frame canvas{height:90px}.settings-layout #cost-view .metric strong{overflow-wrap:anywhere;font-size:1.2rem}.chart-card,.metric,.list-item{border:1px solid var(--line);border-radius:6px;padding:10px}.chart-card{min-height:180px}.chart-card h3{letter-spacing:0;margin:0 0 8px;font-size:.9rem}.chart-frame{min-height:130px;position:relative}.chart-frame canvas{width:100%;height:130px}.metric{min-height:76px}.metric strong{font-size:1.45rem;line-height:1.1;display:block}.metric span,.list-item span{color:var(--muted);margin-top:4px;font-size:.85rem;display:block}.step-list,.command-list,.list,.detail-grid,.delivery-grid,.release-check-list,.release-detail-grid{gap:8px;display:grid}.step-list,.release-check-list,.list{margin:0;padding:0;list-style:none}.step-list{margin-top:12px}.step-list li{grid-template-columns:28px 1fr;align-items:start;gap:8px;display:grid}.step-list b{background:color-mix(in srgb, var(--accent) 18%, var(--panel));width:28px;height:28px;color:var(--accent);border-radius:999px;justify-content:center;align-items:center;font-size:.84rem;display:inline-flex}.command-chip{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));color:var(--ink);white-space:normal;word-break:break-word;border-radius:6px;padding:9px 10px;font:.84rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;display:block}.command-disclosure{margin-top:10px}.command-disclosure summary{cursor:pointer;color:var(--accent);font-size:.9rem;font-weight:650}.command-disclosure .command-list{margin-top:8px}.detail-disclosure summary{cursor:pointer;color:var(--ink);font-weight:700}.detail-disclosure>.list,.detail-disclosure>.preview,.detail-disclosure>.markdown-summary,.detail-disclosure>.text-button{margin-top:10px}.markdown-summary{border:1px solid var(--line);background:#fff;border-radius:8px;gap:8px;max-height:320px;padding:12px;display:grid;overflow:auto}.markdown-summary h4,.markdown-summary p,.markdown-summary ul{margin:0}.markdown-summary h4{font-size:.95rem}.markdown-summary ul{padding-left:18px}.markdown-summary code{overflow-wrap:anywhere;border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));border-radius:6px;padding:8px;display:block}.preview{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));max-height:220px;color:var(--ink);white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.field{gap:4px;display:grid}.field span{color:var(--muted);font-size:.82rem}.field-label{align-items:center;gap:6px;display:inline-flex}.help-tooltip{border:1px solid var(--line);width:18px;height:18px;color:var(--ink);cursor:help;background:#fff;border-radius:50%;place-items:center;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid;position:relative}.tooltip-bubble{z-index:20;color:#f8fafc;text-align:left;white-space:normal;background:#0f172a;border:1px solid #0f172a;border-radius:8px;width:min(260px,72vw);padding:8px 10px;font-size:.78rem;font-weight:500;line-height:1.4;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 14px 36px #0f172a52}.field .tooltip-bubble{color:#f8fafc;font-size:.78rem}.tooltip-bubble:after{content:"";background:#0f172a;border-bottom:1px solid #0f172a;border-right:1px solid #0f172a;width:10px;height:10px;position:absolute;top:100%;left:50%;transform:translate(-50%,-5px)rotate(45deg)}.help-tooltip:hover .tooltip-bubble,.help-tooltip:focus .tooltip-bubble,.help-tooltip:focus-within .tooltip-bubble{display:block}.field input,.field select{border:1px solid var(--line);background:var(--panel);width:100%;min-width:0;min-height:38px;color:var(--ink);border-radius:6px;padding:0 10px}.inline-error{color:var(--warn);margin:8px 0 0;font-size:.85rem}.inline-status,.muted-copy{color:var(--muted);margin:8px 0 0;font-size:.85rem}.tag-row{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.repair-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.check-field{color:var(--muted);align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.task-filters{grid-template-columns:1fr;gap:8px;display:grid}.task-filters>*{min-width:0}.task-internals-toggle{margin-top:10px}.artifact-list{color:var(--muted);margin:8px 0 0;padding-left:18px;font-size:.84rem}.review-copy{color:var(--muted);margin:8px 0 0;font-size:.86rem}.phase-timeline{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.gate-history{border-top:1px solid var(--line);gap:6px;margin-top:10px;padding-top:8px;font-size:.84rem;display:grid}.gate-history>strong{font-size:.86rem}.gate-history ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.gate-history li{color:var(--muted);grid-template-columns:minmax(80px,1fr) minmax(72px,.7fr) minmax(88px,.8fr) minmax(120px,1.4fr);gap:8px;display:grid}.phase-timeline li{border-top:1px solid var(--line);grid-template-columns:minmax(56px,.7fr) minmax(110px,1fr) minmax(88px,.8fr) minmax(72px,.8fr);align-items:center;gap:8px;padding-top:6px;font-size:.83rem;display:grid}.phase-timeline span,.phase-timeline time{color:var(--muted)}.detail-block{border-top:1px solid var(--line);padding-top:10px}.detail-block h3{letter-spacing:0;margin:0 0 6px;font-size:.9rem}.detail-block ul{color:var(--muted);margin:0;padding-left:18px}.empty-state{border:1px dashed var(--line);background:color-mix(in srgb, var(--panel) 85%, var(--bg));border-radius:8px;padding:18px}.empty-state strong{margin-bottom:4px;display:block}.artifact-canvas{margin:18px 0}.panel-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.compact-heading{align-items:center;margin-bottom:12px}.compact-heading h2{margin-bottom:0}.event-list-panel .list{gap:12px}.release-events-grid{align-items:stretch}.release-events-grid .event-list-panel{grid-template-rows:auto 1fr auto;display:grid}.release-events-grid .event-list-panel .list{align-content:start}.workflow-control-row{align-items:end}.workflow-rationale-row{grid-template-columns:1fr}.workflow-rationale-row .field{width:100%}.event-list-panel .list-item{padding:12px}.event-list-panel .list-item strong{line-height:1.3}.event-list-panel .list-item span{margin-top:6px;line-height:1.45}.list-count{color:var(--muted);white-space:nowrap;font-size:.82rem}.pagination-controls{color:var(--muted);grid-template-columns:minmax(92px,auto) 1fr minmax(72px,auto);align-items:center;gap:8px;margin-top:12px;font-size:.85rem;display:grid}.pagination-controls span{text-align:center}.release-check-list{gap:6px;margin-top:12px}.release-summary-card{align-content:start}.release-summary-metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.release-summary-metrics .metric{min-height:58px;padding:8px}.release-summary-metrics .metric strong{font-size:1.1rem}.release-check-row{border:1px solid var(--line);border-radius:6px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.release-check-row strong,.release-check-row span{display:block}.release-check-row strong{line-height:1.25}.release-check-row div>span{color:var(--muted);margin-top:2px;font-size:.82rem}.compact-role-list{max-height:320px;margin-top:10px;overflow:auto}.playwright-plan-list,#qa-automation-planner .subpanel{margin-top:14px}.artifact-layout{gap:16px;min-height:420px;display:grid}.artifact-index{gap:8px;max-height:520px;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.artifact-index button{text-align:left;border:1px solid var(--line);width:100%;min-height:58px;color:var(--text);background:#fff;gap:4px;display:grid}.artifact-index button.selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, #fff)}.artifact-index span,.artifact-preview pre{overflow-wrap:anywhere}.artifact-preview{border:1px solid var(--line);background:#fff;border-radius:8px;min-height:420px;overflow:hidden}.artifact-preview.error,.artifact-preview.source{padding:16px;overflow:auto}.artifact-preview pre{white-space:pre-wrap;margin:0}.artifact-preview.media{place-items:center;padding:12px;display:grid}.artifact-preview img{max-width:100%;max-height:520px}.canvas-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:8px;padding:10px;display:flex}.canvas-frame{cursor:grab;height:460px;overflow:hidden}.canvas-frame svg{background:#f8fafc;width:100%;height:100%}.canvas-frame line{stroke:#64748b;stroke-width:2px}.canvas-frame marker path{fill:#64748b}.canvas-node{cursor:move}.canvas-node rect{stroke:#334155;stroke-width:1.4px}.canvas-node text{fill:#111827;pointer-events:none;font-size:13px}.inline-success{color:#166534;font-weight:600}@media (width>=760px){.topbar-inner,main{padding:20px 24px}.grid{grid-template-columns:minmax(0,1.5fr) minmax(300px,.9fr)}.section-nav{grid-template-columns:repeat(7,minmax(0,1fr));display:grid;overflow-x:visible}.section-tab{flex-basis:auto}.guide-grid,.overview-layout,.operations-layout,.settings-layout{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.tasks-layout{grid-template-columns:minmax(0,1.2fr) minmax(320px,.8fr)}.tasks-layout .panel:first-child{grid-row:span 2}.workflow-rationale-row .field{grid-column:1/-1;max-width:none}.cost-detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.chart-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.control-row{grid-template-columns:repeat(4,minmax(0,1fr));align-items:end}.task-filters{grid-template-columns:minmax(220px,1fr) minmax(140px,.45fr) minmax(140px,.45fr);align-items:end}.artifact-layout{grid-template-columns:minmax(220px,320px) 1fr}}
@@ -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-BNESIVvk.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-jxCY5eEc.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");
@@ -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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"}