@jterrats/open-orchestra 0.4.1 → 0.4.2-beta.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 +5 -3
- package/dist/advisory-artifacts.d.ts +14 -0
- package/dist/advisory-artifacts.js +100 -0
- package/dist/advisory-artifacts.js.map +1 -0
- package/dist/assets/web-console.js +230 -1
- package/dist/autonomous-phase-lifecycle.d.ts +3 -2
- package/dist/autonomous-phase-lifecycle.js +28 -8
- package/dist/autonomous-phase-lifecycle.js.map +1 -1
- package/dist/autonomous-run-state.d.ts +6 -4
- package/dist/autonomous-run-state.js +82 -11
- package/dist/autonomous-run-state.js.map +1 -1
- package/dist/autonomous-run-store.d.ts +5 -0
- package/dist/autonomous-run-store.js +27 -2
- package/dist/autonomous-run-store.js.map +1 -1
- package/dist/autonomous-workflow-constants.d.ts +1 -0
- package/dist/autonomous-workflow-constants.js.map +1 -1
- package/dist/autonomous-workflow.d.ts +2 -2
- package/dist/autonomous-workflow.js +2 -2
- package/dist/autonomous-workflow.js.map +1 -1
- package/dist/benchmark.js +16 -0
- package/dist/benchmark.js.map +1 -1
- package/dist/clarification.d.ts +2 -0
- package/dist/clarification.js +23 -5
- package/dist/clarification.js.map +1 -1
- package/dist/cli.js +97 -18
- package/dist/cli.js.map +1 -1
- package/dist/command-manifest.d.ts +3 -0
- package/dist/command-manifest.js +17 -1
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +10 -2
- package/dist/commands.js +484 -49
- package/dist/commands.js.map +1 -1
- package/dist/constants.js +13 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-budget.d.ts +4 -0
- package/dist/context-budget.js +119 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +79 -0
- package/dist/mcp-oauth-proxy.js +396 -0
- package/dist/mcp-oauth-proxy.js.map +1 -1
- package/dist/memory.d.ts +11 -0
- package/dist/memory.js +224 -0
- package/dist/memory.js.map +1 -0
- package/dist/metrics-commands.js +9 -0
- package/dist/metrics-commands.js.map +1 -1
- package/dist/model-commands.js +18 -1
- package/dist/model-commands.js.map +1 -1
- package/dist/notifications.d.ts +25 -0
- package/dist/notifications.js +187 -11
- package/dist/notifications.js.map +1 -1
- package/dist/package-update-check.d.ts +19 -0
- package/dist/package-update-check.js +123 -0
- package/dist/package-update-check.js.map +1 -0
- package/dist/runtime-bootstrap.js +4 -2
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.js +10 -0
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-renderer.js +5 -0
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +4 -2
- package/dist/runtime-execution.js +17 -4
- package/dist/runtime-execution.js.map +1 -1
- package/dist/setup-agents-import.d.ts +42 -0
- package/dist/setup-agents-import.js +337 -0
- package/dist/setup-agents-import.js.map +1 -0
- package/dist/skills-commands.d.ts +1 -0
- package/dist/skills-commands.js +9 -1
- package/dist/skills-commands.js.map +1 -1
- package/dist/skills.d.ts +7 -1
- package/dist/skills.js +120 -11
- package/dist/skills.js.map +1 -1
- package/dist/subagent-protocol.js +6 -0
- package/dist/subagent-protocol.js.map +1 -1
- package/dist/tool-commands.d.ts +2 -0
- package/dist/tool-commands.js +113 -13
- package/dist/tool-commands.js.map +1 -1
- package/dist/types.d.ts +163 -4
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +216 -1
- package/dist/web-api.js.map +1 -1
- package/dist/web-chart-contracts.d.ts +3 -1
- package/dist/web-chart-contracts.js +6 -0
- package/dist/web-chart-contracts.js.map +1 -1
- package/dist/web-console.js +2 -2
- package/dist/workflow-services.d.ts +24 -4
- package/dist/workflow-services.js +478 -12
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-templates.d.ts +1 -0
- package/dist/workflow-templates.js +1 -0
- package/dist/workflow-templates.js.map +1 -1
- package/dist/workspace.js +6 -0
- package/dist/workspace.js.map +1 -1
- package/docs/command-contracts.md +22 -0
- package/docs/mcp-oauth-proxy-evaluation.md +14 -0
- package/docs/runtime-adapters.md +4 -0
- package/docs/setup-agents-bridge.md +61 -0
- package/docs/traceability-flow.md +89 -0
- package/package.json +8 -6
- package/skills/proactive-orchestra/SKILL.md +27 -0
- package/skills/proactive-orchestra/manifest.json +41 -0
package/AGENTS.md
CHANGED
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
- Mark breaking changes with `!` and a `BREAKING CHANGE:` footer.
|
|
151
151
|
- Keep PRs <400 lines. Review your own diff before requesting review.
|
|
152
152
|
|
|
153
|
-
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="
|
|
153
|
+
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="411e2d184a03aafe61fc4b71d49011f83a4f94d33d3a64cc4cd590a979d07319" updated-at="2026-05-10T05:17:06.513Z" -->
|
|
154
154
|
# Open Orchestra Runtime Bootstrap
|
|
155
155
|
|
|
156
156
|
Runtime target: Codex. Reference Open Orchestra from AGENTS.md so local CLI work follows workflow gates.
|
|
@@ -210,9 +210,11 @@ orchestra benchmark --task <ID>
|
|
|
210
210
|
```
|
|
211
211
|
|
|
212
212
|
## Active Work
|
|
213
|
-
-
|
|
214
|
-
- Run `orchestra task list --json` and identify
|
|
213
|
+
- At session start, run `orchestra health --json` before implementation or file edits.
|
|
214
|
+
- Run `orchestra task list --json --status pending,blocked,in_progress` and identify resumable work before creating a new task.
|
|
215
215
|
- For the active task, run context, delegation, plan, skills, protocol, and workflow render commands.
|
|
216
|
+
- Run `orchestra validate --pre-run --task <ID> --json` before implementation; resolve missing estimate, workflow run, evidence, or review checks.
|
|
217
|
+
- If a user accepts a smaller/advisory path, record it with `orchestra validate --pre-run --task <ID> --bypass --bypass-rationale "..."`.
|
|
216
218
|
|
|
217
219
|
## Task Loop
|
|
218
220
|
- `orchestra health` - Check local tools and workflow readiness.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WorkspaceClassification } from "./types.js";
|
|
2
|
+
export interface AdvisoryArtifactsResult {
|
|
3
|
+
files: string[];
|
|
4
|
+
projectTask: {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
ownerRole: string;
|
|
8
|
+
acceptanceCriteria: string[];
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function writeAdvisoryArtifacts({ root, classification, }: {
|
|
12
|
+
root: string;
|
|
13
|
+
classification: WorkspaceClassification;
|
|
14
|
+
}): Promise<AdvisoryArtifactsResult>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { WORKFLOW_DIR } from "./constants.js";
|
|
2
|
+
import { defaultRoles } from "./defaults.js";
|
|
3
|
+
import { writeArtifact } from "./workspace.js";
|
|
4
|
+
const ADVISORY_DIRECTORY = "advisory";
|
|
5
|
+
export async function writeAdvisoryArtifacts({ root, classification, }) {
|
|
6
|
+
const projectTask = advisoryProjectTask();
|
|
7
|
+
const files = [
|
|
8
|
+
await writeArtifact(root, ADVISORY_DIRECTORY, "README.md", renderAdvisoryReadme(classification)),
|
|
9
|
+
await writeArtifact(root, ADVISORY_DIRECTORY, "role-guides.md", renderRoleGuides(defaultRoles)),
|
|
10
|
+
await writeArtifact(root, ADVISORY_DIRECTORY, "decisions.md", renderPortableDecisions()),
|
|
11
|
+
await writeArtifact(root, ADVISORY_DIRECTORY, "project-task.json", `${JSON.stringify(projectTask, null, 2)}\n`),
|
|
12
|
+
];
|
|
13
|
+
return { files, projectTask };
|
|
14
|
+
}
|
|
15
|
+
function advisoryProjectTask() {
|
|
16
|
+
return {
|
|
17
|
+
id: "ADVISORY-CONVERSION",
|
|
18
|
+
title: "Convert advisory findings into a project task",
|
|
19
|
+
ownerRole: "product_owner",
|
|
20
|
+
acceptanceCriteria: [
|
|
21
|
+
"Target project is confirmed",
|
|
22
|
+
"Backlog item and scope are approved",
|
|
23
|
+
"Risks and assumptions are reviewed",
|
|
24
|
+
"Evidence from advisory artifacts is linked",
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function renderAdvisoryReadme(classification) {
|
|
29
|
+
return `# Advisory Workspace
|
|
30
|
+
|
|
31
|
+
This workspace was initialized in advisory mode. Open Orchestra created workflow
|
|
32
|
+
state and portable guidance under \`${WORKFLOW_DIR}/advisory\` without writing
|
|
33
|
+
root instruction files.
|
|
34
|
+
|
|
35
|
+
## Use This For
|
|
36
|
+
|
|
37
|
+
- Product and technical discovery before choosing a target repository.
|
|
38
|
+
- Reviewing requirements, risks, acceptance criteria, and delivery evidence.
|
|
39
|
+
- Preparing a project task that can be copied into a real project workspace.
|
|
40
|
+
|
|
41
|
+
## Safe Next Steps
|
|
42
|
+
|
|
43
|
+
1. Refine findings in \`${WORKFLOW_DIR}/advisory/decisions.md\`.
|
|
44
|
+
2. Review role-specific responsibilities in \`${WORKFLOW_DIR}/advisory/role-guides.md\`.
|
|
45
|
+
3. Convert \`${WORKFLOW_DIR}/advisory/project-task.json\` into a project task after the target repo is confirmed.
|
|
46
|
+
|
|
47
|
+
## Classification
|
|
48
|
+
|
|
49
|
+
- Kind: \`${classification.kind}\`
|
|
50
|
+
- Write policy: \`${classification.writePolicy}\`
|
|
51
|
+
- Signals: ${classification.signals.map((signal) => `\`${signal}\``).join(", ")}
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
function renderRoleGuides(roles) {
|
|
55
|
+
const advisoryRoles = roles.filter((role) => [
|
|
56
|
+
"product_owner",
|
|
57
|
+
"analyst",
|
|
58
|
+
"architect",
|
|
59
|
+
"developer",
|
|
60
|
+
"qa",
|
|
61
|
+
"security",
|
|
62
|
+
"release_manager",
|
|
63
|
+
"technical_writer",
|
|
64
|
+
].includes(role.id));
|
|
65
|
+
return `# Advisory Role Guides
|
|
66
|
+
|
|
67
|
+
${advisoryRoles.map(renderRoleGuide).join("\n\n")}
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
function renderRoleGuide(role) {
|
|
71
|
+
const activates = (role.activationCriteria ?? ["requested by workflow"])
|
|
72
|
+
.slice(0, 3)
|
|
73
|
+
.map((item) => `- ${item}`)
|
|
74
|
+
.join("\n");
|
|
75
|
+
return `## ${role.name}
|
|
76
|
+
|
|
77
|
+
Focus: ${role.description}
|
|
78
|
+
|
|
79
|
+
Activation:
|
|
80
|
+
${activates}
|
|
81
|
+
`;
|
|
82
|
+
}
|
|
83
|
+
function renderPortableDecisions() {
|
|
84
|
+
return `# Portable Advisory Decisions
|
|
85
|
+
|
|
86
|
+
Use this file for decisions that should survive the move from advisory mode to a
|
|
87
|
+
project workspace.
|
|
88
|
+
|
|
89
|
+
## Decision Template
|
|
90
|
+
|
|
91
|
+
- Title:
|
|
92
|
+
- Context:
|
|
93
|
+
- Decision:
|
|
94
|
+
- Consequences:
|
|
95
|
+
- Evidence:
|
|
96
|
+
- Owner:
|
|
97
|
+
- Status: proposed
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=advisory-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisory-artifacts.js","sourceRoot":"","sources":["../src/advisory-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAa/C,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,IAAI,EACJ,cAAc,GAIf;IACC,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG;QACZ,MAAM,aAAa,CACjB,IAAI,EACJ,kBAAkB,EAClB,WAAW,EACX,oBAAoB,CAAC,cAAc,CAAC,CACrC;QACD,MAAM,aAAa,CACjB,IAAI,EACJ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,CAAC,YAAY,CAAC,CAC/B;QACD,MAAM,aAAa,CACjB,IAAI,EACJ,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EAAE,CAC1B;QACD,MAAM,aAAa,CACjB,IAAI,EACJ,kBAAkB,EAClB,mBAAmB,EACnB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5C;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,+CAA+C;QACtD,SAAS,EAAE,eAAe;QAC1B,kBAAkB,EAAE;YAClB,6BAA6B;YAC7B,qCAAqC;YACrC,oCAAoC;YACpC,4CAA4C;SAC7C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,cAAuC;IACnE,OAAO;;;sCAG6B,YAAY;;;;;;;;;;;0BAWxB,YAAY;gDACU,YAAY;eAC7C,YAAY;;;;YAIf,cAAc,CAAC,IAAI;oBACX,cAAc,CAAC,WAAW;aACjC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAC9E,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C;QACE,eAAe;QACf,SAAS;QACT,WAAW;QACX,WAAW;QACX,IAAI;QACJ,UAAU;QACV,iBAAiB;QACjB,kBAAkB;KACnB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CACpB,CAAC;IACF,OAAO;;EAEP,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;CAChD,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACrE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,MAAM,IAAI,CAAC,IAAI;;SAEf,IAAI,CAAC,WAAW;;;EAGvB,SAAS;CACV,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC"}
|
|
@@ -6,6 +6,10 @@ function buildDashboardChartData(input) {
|
|
|
6
6
|
graphState: GRAPH_STATE_LABELS.map((label) => ({
|
|
7
7
|
label,
|
|
8
8
|
value: input.graph[label].length
|
|
9
|
+
})).filter((slice) => slice.value > 0),
|
|
10
|
+
costByProvider: (input.usage?.byProvider ?? []).map((provider) => ({
|
|
11
|
+
label: provider.key,
|
|
12
|
+
value: provider.estimatedCostUsd
|
|
9
13
|
})).filter((slice) => slice.value > 0)
|
|
10
14
|
};
|
|
11
15
|
}
|
|
@@ -18,7 +22,10 @@ var endpoints = [
|
|
|
18
22
|
["roles", "/api/roles"],
|
|
19
23
|
["evidence", "/api/evidence"],
|
|
20
24
|
["approvals", "/api/approvals"],
|
|
25
|
+
["usage", "/api/usage"],
|
|
26
|
+
["budget", "/api/budget"],
|
|
21
27
|
["tasks", "/api/tasks"],
|
|
28
|
+
["workflowRuns", "/api/workflow/runs"],
|
|
22
29
|
["evidenceView", "/api/evidence/view"],
|
|
23
30
|
["roleActivation", "/api/roles/activation"],
|
|
24
31
|
["skills", "/api/skills"],
|
|
@@ -34,12 +41,16 @@ var validation = document.querySelector("#validation");
|
|
|
34
41
|
var workspaceView = document.querySelector("#workspace-view");
|
|
35
42
|
var graph = document.querySelector("#graph");
|
|
36
43
|
var actions = document.querySelector("#actions");
|
|
44
|
+
var taskOwner = document.querySelector("#task-owner");
|
|
37
45
|
var charts = document.querySelector("#charts");
|
|
38
46
|
var evidenceTask = document.querySelector("#evidence-task");
|
|
39
47
|
var evidenceType = document.querySelector("#evidence-type");
|
|
40
48
|
var evidenceList = document.querySelector("#evidence-list");
|
|
41
49
|
var rolesView = document.querySelector("#roles-view");
|
|
42
50
|
var planningView = document.querySelector("#planning-view");
|
|
51
|
+
var workflowTask = document.querySelector("#workflow-task");
|
|
52
|
+
var workflowRuns = document.querySelector("#workflow-runs");
|
|
53
|
+
var costView = document.querySelector("#cost-view");
|
|
43
54
|
var playwrightTask = document.querySelector("#playwright-task");
|
|
44
55
|
var playwrightPlan = document.querySelector("#playwright-plan");
|
|
45
56
|
var skillsTask = document.querySelector("#skills-task");
|
|
@@ -56,6 +67,7 @@ var lessonPromotionResult = document.querySelector(
|
|
|
56
67
|
);
|
|
57
68
|
var taskStatusChart;
|
|
58
69
|
var graphStateChart;
|
|
70
|
+
var providerCostChart;
|
|
59
71
|
var themeToggle = document.querySelector("#theme-toggle");
|
|
60
72
|
applyStoredTheme();
|
|
61
73
|
themeToggle.addEventListener("click", toggleTheme);
|
|
@@ -69,6 +81,9 @@ document.querySelector("#skills-plan").addEventListener("click", loadSkillPlan);
|
|
|
69
81
|
document.querySelector("#skills-render").addEventListener("click", loadSkillRender);
|
|
70
82
|
document.querySelector("#lesson-add").addEventListener("click", addLesson);
|
|
71
83
|
document.querySelector("#lesson-promote").addEventListener("click", promoteLessons);
|
|
84
|
+
document.querySelector("#task-add").addEventListener("click", addTaskFromWeb);
|
|
85
|
+
document.querySelector("#workflow-start").addEventListener("click", startWorkflowFromWeb);
|
|
86
|
+
workflowRuns.addEventListener("click", handleWorkflowAction);
|
|
72
87
|
loadDashboard();
|
|
73
88
|
function applyStoredTheme() {
|
|
74
89
|
const stored = localStorage.getItem("open-orchestra-theme");
|
|
@@ -115,17 +130,22 @@ function render(data) {
|
|
|
115
130
|
metric(String(data.roles.length), "Roles"),
|
|
116
131
|
metric(String(data.evidence.length), "Evidence"),
|
|
117
132
|
metric(String(data.approvals.length), "Approvals"),
|
|
133
|
+
metric(formatCurrency(data.usage.totals.estimatedCostUsd), "Est. Cost"),
|
|
118
134
|
metric(data.validation.valid ? "Valid" : "Needs work", "Workspace")
|
|
119
135
|
]);
|
|
120
136
|
renderValidation(data.validation);
|
|
121
137
|
renderWorkspace(data.workspaceClassification, data.runtimeAdapters);
|
|
122
138
|
renderGraph(data.graph);
|
|
123
139
|
renderActions(data);
|
|
140
|
+
renderTaskWriteControls(data.roles);
|
|
124
141
|
renderCharts(data);
|
|
125
142
|
renderEvidenceControls(data);
|
|
126
143
|
renderEvidence(data.evidenceView);
|
|
127
144
|
renderRoles(data.roleActivation);
|
|
128
145
|
renderPlanning(data.roleActivation);
|
|
146
|
+
renderWorkflowControls(data.tasks, data.workflowRuns);
|
|
147
|
+
renderWorkflowRuns(data.workflowRuns);
|
|
148
|
+
renderCost(data.usage, data.budget);
|
|
129
149
|
renderPlaywrightTasks(data.tasks);
|
|
130
150
|
renderSkillControls(data);
|
|
131
151
|
renderSkillCatalog(data.skills, data.sources);
|
|
@@ -134,6 +154,46 @@ function render(data) {
|
|
|
134
154
|
loadPlaywrightPlan();
|
|
135
155
|
loadSkillPlan();
|
|
136
156
|
}
|
|
157
|
+
function renderTaskWriteControls(roles) {
|
|
158
|
+
replace(
|
|
159
|
+
taskOwner,
|
|
160
|
+
roles.map(function(role) {
|
|
161
|
+
return option(role.id, role.id);
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
async function addTaskFromWeb() {
|
|
166
|
+
const id = document.querySelector("#task-id").value.trim();
|
|
167
|
+
const title = document.querySelector("#task-title").value.trim();
|
|
168
|
+
if (!id || !title || !taskOwner.value) {
|
|
169
|
+
setLoading("Task id, title, and owner are required", "warn");
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const response = await fetch("/api/tasks/add", {
|
|
173
|
+
method: "POST",
|
|
174
|
+
headers: { "content-type": "application/json" },
|
|
175
|
+
body: JSON.stringify({
|
|
176
|
+
id,
|
|
177
|
+
title,
|
|
178
|
+
ownerRole: taskOwner.value,
|
|
179
|
+
paths: csvValues(document.querySelector("#task-paths").value),
|
|
180
|
+
acceptanceCriteria: csvValues(
|
|
181
|
+
document.querySelector("#task-acceptance").value
|
|
182
|
+
),
|
|
183
|
+
risks: csvValues(document.querySelector("#task-risks").value)
|
|
184
|
+
})
|
|
185
|
+
});
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
setLoading("Task add failed", "warn");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
["#task-id", "#task-title", "#task-paths", "#task-acceptance", "#task-risks"].map(function(selector) {
|
|
191
|
+
return document.querySelector(selector);
|
|
192
|
+
}).forEach(function(input) {
|
|
193
|
+
input.value = "";
|
|
194
|
+
});
|
|
195
|
+
await loadDashboard();
|
|
196
|
+
}
|
|
137
197
|
function renderWorkspace(classification, adapters) {
|
|
138
198
|
const adapterNames = adapters.map(function(adapter) {
|
|
139
199
|
return adapter.label;
|
|
@@ -149,7 +209,7 @@ function renderWorkspace(classification, adapters) {
|
|
|
149
209
|
}
|
|
150
210
|
function renderCharts(data) {
|
|
151
211
|
const chartData = buildDashboardChartData(data);
|
|
152
|
-
const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0;
|
|
212
|
+
const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0 || chartData.costByProvider.length > 0;
|
|
153
213
|
charts.hidden = !hasChartData;
|
|
154
214
|
if (!hasChartData || !globalThis.Chart) {
|
|
155
215
|
return;
|
|
@@ -166,6 +226,12 @@ function renderCharts(data) {
|
|
|
166
226
|
"bar",
|
|
167
227
|
chartData.graphState
|
|
168
228
|
);
|
|
229
|
+
providerCostChart = renderChart(
|
|
230
|
+
providerCostChart,
|
|
231
|
+
"provider-cost-chart",
|
|
232
|
+
"bar",
|
|
233
|
+
chartData.costByProvider
|
|
234
|
+
);
|
|
169
235
|
}
|
|
170
236
|
function renderChart(current, canvasId, type, slices) {
|
|
171
237
|
const style = getComputedStyle(document.documentElement);
|
|
@@ -214,6 +280,166 @@ function renderChart(current, canvasId, type, slices) {
|
|
|
214
280
|
}
|
|
215
281
|
});
|
|
216
282
|
}
|
|
283
|
+
function renderWorkflowControls(tasks, runs) {
|
|
284
|
+
const currentValue = workflowTask.value;
|
|
285
|
+
replace(
|
|
286
|
+
workflowTask,
|
|
287
|
+
tasks.length > 0 ? tasks.map(function(task) {
|
|
288
|
+
return option(task.id, task.id);
|
|
289
|
+
}) : [option("", "No tasks")]
|
|
290
|
+
);
|
|
291
|
+
if (currentValue) {
|
|
292
|
+
workflowTask.value = currentValue;
|
|
293
|
+
}
|
|
294
|
+
const runningTaskIds = new Set(
|
|
295
|
+
runs.filter(function(run) {
|
|
296
|
+
return run.status === "running" || run.status === "paused";
|
|
297
|
+
}).map(function(run) {
|
|
298
|
+
return run.taskId;
|
|
299
|
+
})
|
|
300
|
+
);
|
|
301
|
+
document.querySelector("#workflow-start").disabled = !workflowTask.value || runningTaskIds.has(workflowTask.value);
|
|
302
|
+
}
|
|
303
|
+
function renderWorkflowRuns(runs) {
|
|
304
|
+
replace(
|
|
305
|
+
workflowRuns,
|
|
306
|
+
runs.length > 0 ? runs.slice(0, 8).map(workflowRunItem) : [
|
|
307
|
+
empty(
|
|
308
|
+
"No workflow runs yet",
|
|
309
|
+
"Start a task workflow to track phases, gates, and handoffs."
|
|
310
|
+
)
|
|
311
|
+
]
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
function workflowRunItem(run) {
|
|
315
|
+
const phases = (run.phases || []).map(function(phase) {
|
|
316
|
+
return phase.phase + ":" + phase.status;
|
|
317
|
+
}).join(" -> ");
|
|
318
|
+
const node = listItem(
|
|
319
|
+
run.id + " [" + run.status + "]",
|
|
320
|
+
run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "")
|
|
321
|
+
);
|
|
322
|
+
const pausedGate = [...run.phases || []].reverse().find(function(phase) {
|
|
323
|
+
return phase.status === "gate_paused";
|
|
324
|
+
});
|
|
325
|
+
const row = document.createElement("div");
|
|
326
|
+
row.className = "tag-row";
|
|
327
|
+
if (pausedGate) {
|
|
328
|
+
const approve = document.createElement("button");
|
|
329
|
+
approve.className = "text-button";
|
|
330
|
+
approve.type = "button";
|
|
331
|
+
approve.dataset.workflowAction = "approve";
|
|
332
|
+
approve.dataset.run = run.id;
|
|
333
|
+
approve.dataset.task = run.taskId;
|
|
334
|
+
approve.dataset.gate = pausedGate.gateId || "";
|
|
335
|
+
approve.textContent = "Approve Gate";
|
|
336
|
+
row.append(approve);
|
|
337
|
+
}
|
|
338
|
+
if (run.status === "paused") {
|
|
339
|
+
const resume = document.createElement("button");
|
|
340
|
+
resume.className = "text-button";
|
|
341
|
+
resume.type = "button";
|
|
342
|
+
resume.dataset.workflowAction = "resume";
|
|
343
|
+
resume.dataset.run = run.id;
|
|
344
|
+
resume.dataset.task = run.taskId;
|
|
345
|
+
resume.textContent = "Resume";
|
|
346
|
+
row.append(resume);
|
|
347
|
+
}
|
|
348
|
+
node.append(row);
|
|
349
|
+
return node;
|
|
350
|
+
}
|
|
351
|
+
async function startWorkflowFromWeb() {
|
|
352
|
+
if (!workflowTask.value) {
|
|
353
|
+
setLoading("Select a task to start workflow", "warn");
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const response = await fetch("/api/workflow/start", {
|
|
357
|
+
method: "POST",
|
|
358
|
+
headers: { "content-type": "application/json" },
|
|
359
|
+
body: JSON.stringify({
|
|
360
|
+
task: workflowTask.value,
|
|
361
|
+
gates: document.querySelector("#workflow-gates").value
|
|
362
|
+
})
|
|
363
|
+
});
|
|
364
|
+
if (!response.ok) {
|
|
365
|
+
setLoading("Workflow start failed", "warn");
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
await loadDashboard();
|
|
369
|
+
}
|
|
370
|
+
async function handleWorkflowAction(event) {
|
|
371
|
+
const button = event.target.closest("[data-workflow-action]");
|
|
372
|
+
if (!button) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (button.dataset.workflowAction === "approve") {
|
|
376
|
+
await approveWorkflowGateFromWeb(button);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
if (button.dataset.workflowAction === "resume") {
|
|
380
|
+
await resumeWorkflowFromWeb(button);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
async function approveWorkflowGateFromWeb(button) {
|
|
384
|
+
const response = await fetch("/api/workflow/gate-approve", {
|
|
385
|
+
method: "POST",
|
|
386
|
+
headers: { "content-type": "application/json" },
|
|
387
|
+
body: JSON.stringify({
|
|
388
|
+
run: button.dataset.run,
|
|
389
|
+
gate: button.dataset.gate,
|
|
390
|
+
approver: document.querySelector("#workflow-approver").value,
|
|
391
|
+
rationale: document.querySelector("#workflow-rationale").value
|
|
392
|
+
})
|
|
393
|
+
});
|
|
394
|
+
if (!response.ok) {
|
|
395
|
+
setLoading("Gate approval failed", "warn");
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
await loadDashboard();
|
|
399
|
+
}
|
|
400
|
+
async function resumeWorkflowFromWeb(button) {
|
|
401
|
+
const response = await fetch("/api/workflow/resume", {
|
|
402
|
+
method: "POST",
|
|
403
|
+
headers: { "content-type": "application/json" },
|
|
404
|
+
body: JSON.stringify({
|
|
405
|
+
task: button.dataset.task,
|
|
406
|
+
run: button.dataset.run
|
|
407
|
+
})
|
|
408
|
+
});
|
|
409
|
+
if (!response.ok) {
|
|
410
|
+
setLoading("Workflow resume failed", "warn");
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
await loadDashboard();
|
|
414
|
+
}
|
|
415
|
+
function renderCost(usage, budget) {
|
|
416
|
+
const rows = [
|
|
417
|
+
listItem("Requests", String(usage.totals.requests)),
|
|
418
|
+
listItem("Total tokens", String(usage.totals.totalTokens)),
|
|
419
|
+
listItem("Estimated cost", formatCurrency(usage.totals.estimatedCostUsd)),
|
|
420
|
+
listItem(
|
|
421
|
+
"Budget",
|
|
422
|
+
budget.passed ? "Within configured limits" : budget.violations.length + " violation(s)"
|
|
423
|
+
)
|
|
424
|
+
];
|
|
425
|
+
usage.byProvider.slice(0, 6).forEach(function(provider) {
|
|
426
|
+
rows.push(
|
|
427
|
+
listItem(
|
|
428
|
+
provider.key,
|
|
429
|
+
provider.requests + " request(s) - " + provider.totalTokens + " tokens - " + formatCurrency(provider.estimatedCostUsd)
|
|
430
|
+
)
|
|
431
|
+
);
|
|
432
|
+
});
|
|
433
|
+
budget.violations.slice(0, 6).forEach(function(violation) {
|
|
434
|
+
rows.push(
|
|
435
|
+
listItem(
|
|
436
|
+
"Budget violation: " + violation.scope,
|
|
437
|
+
violation.metric + " " + violation.actual + " / " + violation.limit
|
|
438
|
+
)
|
|
439
|
+
);
|
|
440
|
+
});
|
|
441
|
+
replace(costView, rows);
|
|
442
|
+
}
|
|
217
443
|
async function loadEvidence() {
|
|
218
444
|
const query = new URLSearchParams();
|
|
219
445
|
if (evidenceTask.value) {
|
|
@@ -706,6 +932,9 @@ function metric(value, label) {
|
|
|
706
932
|
node.append(strong, span);
|
|
707
933
|
return node;
|
|
708
934
|
}
|
|
935
|
+
function formatCurrency(value) {
|
|
936
|
+
return "$" + Number(value || 0).toFixed(4);
|
|
937
|
+
}
|
|
709
938
|
function listItem(title, detail) {
|
|
710
939
|
const node = document.createElement("li");
|
|
711
940
|
node.className = "list-item";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
1
2
|
import type { AutonomousPhase, AutonomousRun, SizingLabel } from "./types.js";
|
|
2
3
|
export type SizingCheckResult = {
|
|
3
4
|
found: true;
|
|
@@ -17,8 +18,8 @@ export type PhaseOutcome = {
|
|
|
17
18
|
kind: "qa_fail";
|
|
18
19
|
notes: string;
|
|
19
20
|
};
|
|
20
|
-
export declare function initPhase(root: string, run: AutonomousRun, phaseIndex: number, retryContext?: string): Promise<AutonomousPhase>;
|
|
21
|
-
export declare function closePhase(root: string, run: AutonomousRun, phaseIndex: number, outcome: PhaseOutcome): Promise<{
|
|
21
|
+
export declare function initPhase(root: string, run: AutonomousRun, phaseIndex: number, retryContext?: string, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousPhase>;
|
|
22
|
+
export declare function closePhase(root: string, run: AutonomousRun, phaseIndex: number, outcome: PhaseOutcome, sequence?: AutonomousPhaseDefinition[]): Promise<{
|
|
22
23
|
run: AutonomousRun;
|
|
23
24
|
handoffArtifact?: string;
|
|
24
25
|
reviewArtifact?: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { appendEvent, readEvents, writeArtifact } from "./workspace.js";
|
|
2
2
|
import { addTask, createHandoff, updateTask } from "./workflow-services.js";
|
|
3
|
-
import { notifyGatePaused } from "./notifications.js";
|
|
3
|
+
import { notifyGatePaused, notifyWorkflowLifecycle } from "./notifications.js";
|
|
4
4
|
import { AUTONOMOUS_PHASE_SEQUENCE, PHASE_GATES, } from "./autonomous-workflow-constants.js";
|
|
5
5
|
import { persistRun } from "./autonomous-run-store.js";
|
|
6
6
|
import { SIZING_LABELS } from "./types.js";
|
|
@@ -26,8 +26,8 @@ export async function checkArchitectSizing(root, taskId) {
|
|
|
26
26
|
}
|
|
27
27
|
return { found: false };
|
|
28
28
|
}
|
|
29
|
-
export async function initPhase(root, run, phaseIndex, retryContext) {
|
|
30
|
-
const def =
|
|
29
|
+
export async function initPhase(root, run, phaseIndex, retryContext, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
30
|
+
const def = sequence[phaseIndex];
|
|
31
31
|
if (!def)
|
|
32
32
|
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
33
33
|
const now = new Date().toISOString();
|
|
@@ -36,7 +36,7 @@ export async function initPhase(root, run, phaseIndex, retryContext) {
|
|
|
36
36
|
const phaseTaskId = iteration === 0
|
|
37
37
|
? `${run.taskId}-${def.phase}-${runSuffix}`
|
|
38
38
|
: `${run.taskId}-${def.phase}-${runSuffix}-retry${iteration}`;
|
|
39
|
-
const prevDef = phaseIndex > 0 ?
|
|
39
|
+
const prevDef = phaseIndex > 0 ? sequence[phaseIndex - 1] : undefined;
|
|
40
40
|
const prevPhaseTaskId = prevDef
|
|
41
41
|
? `${run.taskId}-${prevDef.phase}-${runSuffix}`
|
|
42
42
|
: undefined;
|
|
@@ -56,11 +56,11 @@ export async function initPhase(root, run, phaseIndex, retryContext) {
|
|
|
56
56
|
...(retryContext ? { notes: retryContext } : {}),
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
export async function closePhase(root, run, phaseIndex, outcome) {
|
|
59
|
+
export async function closePhase(root, run, phaseIndex, outcome, sequence = AUTONOMOUS_PHASE_SEQUENCE) {
|
|
60
60
|
let resolvedOutcome = outcome;
|
|
61
61
|
const now = new Date().toISOString();
|
|
62
|
-
const def =
|
|
63
|
-
const nextDef =
|
|
62
|
+
const def = sequence[phaseIndex];
|
|
63
|
+
const nextDef = sequence[phaseIndex + 1];
|
|
64
64
|
if (!def)
|
|
65
65
|
throw new Error(`invalid phase index: ${phaseIndex}`);
|
|
66
66
|
const phase = run.phases.find((p) => p.phase === def.phase);
|
|
@@ -95,6 +95,9 @@ export async function closePhase(root, run, phaseIndex, outcome) {
|
|
|
95
95
|
const updatedPhase = {
|
|
96
96
|
...phase,
|
|
97
97
|
status: outcomeToPhaseStatus(resolvedOutcome),
|
|
98
|
+
...(resolvedOutcome.kind === "gate_pause" && nextDef
|
|
99
|
+
? { gateId: `${def.phase}->${nextDef.phase}` }
|
|
100
|
+
: {}),
|
|
98
101
|
...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
|
|
99
102
|
...(reviewArtifact !== undefined ? { reviewArtifact } : {}),
|
|
100
103
|
notes: resolvedOutcome.kind !== "gate_pause"
|
|
@@ -126,7 +129,12 @@ export async function closePhase(root, run, phaseIndex, outcome) {
|
|
|
126
129
|
taskId: run.taskId,
|
|
127
130
|
actor: def.role,
|
|
128
131
|
summary: `Gate pause at ${def.phase}→${nextDef?.phase ?? "end"}`,
|
|
129
|
-
metadata: {
|
|
132
|
+
metadata: {
|
|
133
|
+
runId: run.id,
|
|
134
|
+
phase: def.phase,
|
|
135
|
+
gateId: `${def.phase}->${nextDef?.phase ?? "end"}`,
|
|
136
|
+
reviewArtifact,
|
|
137
|
+
},
|
|
130
138
|
});
|
|
131
139
|
if (reviewArtifact) {
|
|
132
140
|
await notifyGatePaused({
|
|
@@ -147,6 +155,18 @@ export async function closePhase(root, run, phaseIndex, outcome) {
|
|
|
147
155
|
});
|
|
148
156
|
await updateTask({ id: phase.taskId, status: "done" }, root);
|
|
149
157
|
}
|
|
158
|
+
else if (resolvedOutcome.kind === "qa_fail") {
|
|
159
|
+
await notifyWorkflowLifecycle({
|
|
160
|
+
root,
|
|
161
|
+
taskId: run.taskId,
|
|
162
|
+
kind: "qa_retry",
|
|
163
|
+
runId: run.id,
|
|
164
|
+
phase: def.phase,
|
|
165
|
+
actor: def.role,
|
|
166
|
+
detail: resolvedOutcome.notes,
|
|
167
|
+
idempotencyKey: `qa_retry:${run.id}:${updatedRun.qaIterations}`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
150
170
|
return {
|
|
151
171
|
run: updatedRun,
|
|
152
172
|
...(handoffArtifact !== undefined ? { handoffArtifact } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomous-phase-lifecycle.js","sourceRoot":"","sources":["../src/autonomous-phase-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"autonomous-phase-lifecycle.js","sourceRoot":"","sources":["../src/autonomous-phase-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
1
2
|
import type { AutonomousRun } from "./types.js";
|
|
2
|
-
export declare function
|
|
3
|
+
export declare function cancelRun(root: string, runId: string, reason?: string): Promise<AutonomousRun>;
|
|
4
|
+
export declare function markRunFailed(root: string, run: AutonomousRun, reason: string, failedPhase?: string): Promise<AutonomousRun>;
|
|
3
5
|
export declare function markRunDone(root: string, run: AutonomousRun): Promise<AutonomousRun>;
|
|
4
|
-
export declare function resumePhaseIndex(run: AutonomousRun): number;
|
|
5
|
-
export declare function suspendPhaseForClarification(root: string, run: AutonomousRun, phaseIndex: number): Promise<AutonomousRun>;
|
|
6
|
-
export declare function resumePhaseFromClarification(root: string, run: AutonomousRun, phaseIndex: number): Promise<AutonomousRun>;
|
|
6
|
+
export declare function resumePhaseIndex(run: AutonomousRun, sequence?: AutonomousPhaseDefinition[]): number;
|
|
7
|
+
export declare function suspendPhaseForClarification(root: string, run: AutonomousRun, phaseIndex: number, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousRun>;
|
|
8
|
+
export declare function resumePhaseFromClarification(root: string, run: AutonomousRun, phaseIndex: number, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousRun>;
|