@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.
- package/AGENTS.md +9 -8
- package/CLAUDE.md +13 -11
- package/README.md +78 -11
- package/dist/assets/web-console.js +169 -32
- package/dist/automation-evidence.d.ts +23 -0
- package/dist/automation-evidence.js +97 -0
- package/dist/automation-evidence.js.map +1 -0
- package/dist/autonomous-run-store.js +3 -3
- package/dist/autonomous-run-store.js.map +1 -1
- package/dist/benchmark.d.ts +4 -1
- package/dist/benchmark.js +93 -4
- package/dist/benchmark.js.map +1 -1
- package/dist/cli.js +73 -2
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.js +3 -5
- package/dist/collaboration-flows.js.map +1 -1
- package/dist/collection-utils.d.ts +3 -0
- package/dist/collection-utils.js +10 -0
- package/dist/collection-utils.js.map +1 -0
- package/dist/command-manifest.d.ts +12 -1
- package/dist/command-manifest.js +213 -10
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +10 -5
- package/dist/commands.js +16 -6
- package/dist/commands.js.map +1 -1
- package/dist/config-migrations.d.ts +24 -0
- package/dist/config-migrations.js +102 -0
- package/dist/config-migrations.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -1
- package/dist/dashboard-commands.d.ts +2 -0
- package/dist/dashboard-commands.js +14 -0
- package/dist/dashboard-commands.js.map +1 -0
- package/dist/defaults.d.ts +13 -0
- package/dist/defaults.js +13 -0
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.js +23 -8
- package/dist/delegation-decision.js.map +1 -1
- package/dist/delivery-commands.js +5 -0
- package/dist/delivery-commands.js.map +1 -1
- package/dist/delivery-dashboard-charts.d.ts +4 -0
- package/dist/delivery-dashboard-charts.js +156 -0
- package/dist/delivery-dashboard-charts.js.map +1 -0
- package/dist/delivery-dashboard-html.d.ts +2 -0
- package/dist/delivery-dashboard-html.js +115 -0
- package/dist/delivery-dashboard-html.js.map +1 -0
- package/dist/delivery-dashboard-types.d.ts +78 -0
- package/dist/delivery-dashboard-types.js +2 -0
- package/dist/delivery-dashboard-types.js.map +1 -0
- package/dist/delivery-dashboard.d.ts +8 -0
- package/dist/delivery-dashboard.js +124 -0
- package/dist/delivery-dashboard.js.map +1 -0
- package/dist/effort-classification.d.ts +7 -0
- package/dist/effort-classification.js +72 -0
- package/dist/effort-classification.js.map +1 -0
- package/dist/extension-commands.d.ts +3 -0
- package/dist/extension-commands.js +40 -0
- package/dist/extension-commands.js.map +1 -0
- package/dist/extensions.d.ts +22 -0
- package/dist/extensions.js +126 -0
- package/dist/extensions.js.map +1 -0
- package/dist/github.d.ts +2 -0
- package/dist/github.js +15 -3
- package/dist/github.js.map +1 -1
- package/dist/health-checks.js +51 -0
- package/dist/health-checks.js.map +1 -1
- package/dist/lucid-story-map.d.ts +73 -0
- package/dist/lucid-story-map.js +112 -0
- package/dist/lucid-story-map.js.map +1 -0
- package/dist/mcp-integrations.d.ts +19 -0
- package/dist/mcp-integrations.js +58 -0
- package/dist/mcp-integrations.js.map +1 -0
- package/dist/mcp-tool-adapter.d.ts +21 -0
- package/dist/mcp-tool-adapter.js +56 -0
- package/dist/mcp-tool-adapter.js.map +1 -0
- package/dist/memory.js +18 -8
- package/dist/memory.js.map +1 -1
- package/dist/metrics-commands.js +47 -13
- package/dist/metrics-commands.js.map +1 -1
- package/dist/model-commands.d.ts +5 -0
- package/dist/model-commands.js +101 -3
- package/dist/model-commands.js.map +1 -1
- package/dist/model-providers.js +13 -1
- package/dist/model-providers.js.map +1 -1
- package/dist/package-update-check.d.ts +18 -0
- package/dist/package-update-check.js +20 -0
- package/dist/package-update-check.js.map +1 -1
- package/dist/phase-executor.d.ts +1 -0
- package/dist/phase-executor.js +118 -14
- package/dist/phase-executor.js.map +1 -1
- package/dist/phase-playbooks.d.ts +15 -0
- package/dist/phase-playbooks.js +82 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/planning-commands.d.ts +1 -0
- package/dist/planning-commands.js +24 -1
- package/dist/planning-commands.js.map +1 -1
- package/dist/project-detection.js +9 -7
- package/dist/project-detection.js.map +1 -1
- package/dist/prompt-registry-update.d.ts +2 -0
- package/dist/prompt-registry-update.js +25 -1
- package/dist/prompt-registry-update.js.map +1 -1
- package/dist/prompt-registry-validation.js +39 -2
- package/dist/prompt-registry-validation.js.map +1 -1
- package/dist/qa-commands.d.ts +2 -0
- package/dist/qa-commands.js +18 -0
- package/dist/qa-commands.js.map +1 -0
- package/dist/qa-coverage.d.ts +24 -0
- package/dist/qa-coverage.js +198 -0
- package/dist/qa-coverage.js.map +1 -0
- package/dist/qa-readiness.d.ts +5 -0
- package/dist/qa-readiness.js +26 -0
- package/dist/qa-readiness.js.map +1 -0
- package/dist/refresh-generated.d.ts +10 -1
- package/dist/refresh-generated.js +83 -6
- package/dist/refresh-generated.js.map +1 -1
- package/dist/release-candidate.d.ts +9 -1
- package/dist/release-candidate.js +52 -1
- package/dist/release-candidate.js.map +1 -1
- package/dist/release-commands.js +202 -12
- package/dist/release-commands.js.map +1 -1
- package/dist/release-readiness.d.ts +36 -1
- package/dist/release-readiness.js +217 -6
- package/dist/release-readiness.js.map +1 -1
- package/dist/runtime-bootstrap.js +1 -1
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.d.ts +2 -0
- package/dist/runtime-commands.js +77 -0
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-renderer.d.ts +3 -2
- package/dist/runtime-execution-renderer.js +19 -1
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +2 -1
- package/dist/runtime-execution.js +71 -11
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-guardrails.d.ts +26 -0
- package/dist/runtime-guardrails.js +168 -0
- package/dist/runtime-guardrails.js.map +1 -0
- package/dist/setup-agents-import.js +5 -3
- package/dist/setup-agents-import.js.map +1 -1
- package/dist/skills-catalog.js +63 -0
- package/dist/skills-catalog.js.map +1 -1
- package/dist/skills-commands.d.ts +4 -0
- package/dist/skills-commands.js +55 -2
- package/dist/skills-commands.js.map +1 -1
- package/dist/skills-memory.d.ts +36 -2
- package/dist/skills-memory.js +165 -6
- package/dist/skills-memory.js.map +1 -1
- package/dist/skills-planning.js +2 -4
- package/dist/skills-planning.js.map +1 -1
- package/dist/skills-render.js +2 -4
- package/dist/skills-render.js.map +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills.js.map +1 -1
- package/dist/sprint-commands.js +2 -1
- package/dist/sprint-commands.js.map +1 -1
- package/dist/subagent-protocol.js +3 -5
- package/dist/subagent-protocol.js.map +1 -1
- package/dist/support-commands.d.ts +2 -0
- package/dist/support-commands.js +18 -0
- package/dist/support-commands.js.map +1 -0
- package/dist/support-diagnostics.d.ts +49 -0
- package/dist/support-diagnostics.js +86 -0
- package/dist/support-diagnostics.js.map +1 -0
- package/dist/task-graph-commands.js +5 -3
- package/dist/task-graph-commands.js.map +1 -1
- package/dist/telemetry-redaction.js +8 -1
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/tool-commands.d.ts +3 -0
- package/dist/tool-commands.js +62 -0
- package/dist/tool-commands.js.map +1 -1
- package/dist/tracker-adapters.d.ts +71 -0
- package/dist/tracker-adapters.js +186 -0
- package/dist/tracker-adapters.js.map +1 -0
- package/dist/tracker-commands.d.ts +2 -0
- package/dist/tracker-commands.js +119 -0
- package/dist/tracker-commands.js.map +1 -0
- package/dist/types/metrics.d.ts +24 -0
- package/dist/types/model-config.d.ts +39 -0
- package/dist/types/runtime.d.ts +56 -0
- package/dist/types/skills.d.ts +2 -0
- package/dist/types/tasks.d.ts +6 -0
- package/dist/types/workflow-run.d.ts +17 -0
- package/dist/types.d.ts +4 -4
- package/dist/types.js.map +1 -1
- package/dist/upgrade-commands.js +13 -4
- package/dist/upgrade-commands.js.map +1 -1
- package/dist/validation.js +2 -2
- package/dist/validation.js.map +1 -1
- package/dist/visual-validation.d.ts +81 -0
- package/dist/visual-validation.js +290 -0
- package/dist/visual-validation.js.map +1 -0
- package/dist/web-action-security.d.ts +11 -0
- package/dist/web-action-security.js +45 -0
- package/dist/web-action-security.js.map +1 -0
- package/dist/web-api-read-routes.js +101 -1
- package/dist/web-api-read-routes.js.map +1 -1
- package/dist/web-api.js +507 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifacts.d.ts +55 -0
- package/dist/web-artifacts.js +222 -0
- package/dist/web-artifacts.js.map +1 -0
- package/dist/web-console/assets/index-BNESIVvk.js +11 -0
- package/dist/web-console/assets/index-jxCY5eEc.css +1 -0
- package/dist/web-console/index.html +13 -0
- package/dist/web-console.js +9 -3
- package/dist/web-console.js.map +1 -1
- package/dist/web-recovery.d.ts +30 -0
- package/dist/web-recovery.js +163 -0
- package/dist/web-recovery.js.map +1 -0
- package/dist/web-workflow-progress.d.ts +41 -0
- package/dist/web-workflow-progress.js +114 -0
- package/dist/web-workflow-progress.js.map +1 -0
- package/dist/workflow-approval-service.d.ts +2 -1
- package/dist/workflow-approval-service.js +72 -0
- package/dist/workflow-approval-service.js.map +1 -1
- package/dist/workflow-evidence-service.js +8 -1
- package/dist/workflow-evidence-service.js.map +1 -1
- package/dist/workflow-gates.d.ts +2 -0
- package/dist/workflow-gates.js +221 -0
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-run-commands.js +13 -1
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.d.ts +16 -12
- package/dist/workflow-services.js +313 -253
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-task-service.d.ts +11 -0
- package/dist/workflow-task-service.js +242 -0
- package/dist/workflow-task-service.js.map +1 -0
- package/dist/workspace-validator.js +109 -3
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.js +8 -2
- package/dist/workspace.js.map +1 -1
- package/docs/adoption-guide.md +147 -0
- package/docs/autonomous-workflow.md +118 -27
- package/docs/benchmark.md +15 -7
- package/docs/command-contracts.md +18 -1
- package/docs/core-command-surface.md +59 -13
- package/docs/end-to-end-demo.md +1 -0
- package/docs/extension-contracts.md +83 -0
- package/docs/orchestra-mvp.md +83 -3
- package/docs/persona-workflows.md +32 -0
- package/docs/release-test-matrix.md +42 -0
- package/docs/runtime-adapters.md +92 -0
- package/docs/runtime-llm-flow.md +13 -0
- package/docs/setup-agents-applicability-review.md +173 -0
- package/docs/skill-loading-strategy.md +1 -0
- package/docs/source-of-truth-and-agent-learning.md +14 -0
- package/docs/traceability-flow.md +16 -1
- package/docs/tracker-adapter-contract.md +10 -1
- package/docs/web-console-qa.md +35 -0
- package/package.json +12 -6
- package/rules/development-engineering.mdc +68 -0
- package/rules/devops-tooling.mdc +1 -0
- package/rules/dry-clean-code.mdc +1 -0
- package/rules/performance-reliability.mdc +1 -0
- package/rules/testing-discipline.mdc +4 -1
- package/skills/collection-standards/SKILL.md +63 -0
- 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>
|
package/dist/web-console.js
CHANGED
|
@@ -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:
|
|
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
|
-
.
|
|
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>
|
package/dist/web-console.js.map
CHANGED
|
@@ -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
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,GACf,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-approval-service.js","sourceRoot":"","sources":["../src/workflow-approval-service.ts"],"names":[],"mappings":"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"}
|