oxe-cc 1.0.0 → 1.3.0
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/.cursor/commands/oxe-ask.md +3 -3
- package/.cursor/commands/oxe-capabilities.md +3 -3
- package/.cursor/commands/oxe-checkpoint.md +3 -3
- package/.cursor/commands/oxe-compact.md +3 -3
- package/.cursor/commands/oxe-dashboard.md +3 -3
- package/.cursor/commands/oxe-debug.md +3 -3
- package/.cursor/commands/oxe-discuss.md +3 -3
- package/.cursor/commands/oxe-execute.md +7 -4
- package/.cursor/commands/oxe-forensics.md +3 -3
- package/.cursor/commands/oxe-help.md +3 -3
- package/.cursor/commands/oxe-loop.md +3 -3
- package/.cursor/commands/oxe-milestone.md +3 -3
- package/.cursor/commands/oxe-next.md +3 -3
- package/.cursor/commands/oxe-obs.md +3 -3
- package/.cursor/commands/oxe-plan-agent.md +3 -3
- package/.cursor/commands/oxe-plan.md +3 -3
- package/.cursor/commands/oxe-project.md +3 -3
- package/.cursor/commands/oxe-quick.md +3 -3
- package/.cursor/commands/oxe-research.md +3 -3
- package/.cursor/commands/oxe-retro.md +3 -3
- package/.cursor/commands/oxe-review-pr.md +3 -3
- package/.cursor/commands/oxe-route.md +3 -3
- package/.cursor/commands/oxe-scan.md +3 -3
- package/.cursor/commands/oxe-security.md +3 -3
- package/.cursor/commands/oxe-session.md +4 -4
- package/.cursor/commands/oxe-ship.md +45 -0
- package/.cursor/commands/oxe-skill.md +3 -3
- package/.cursor/commands/oxe-spec.md +3 -3
- package/.cursor/commands/oxe-ui-review.md +3 -3
- package/.cursor/commands/oxe-ui-spec.md +3 -3
- package/.cursor/commands/oxe-update.md +3 -3
- package/.cursor/commands/oxe-validate-gaps.md +3 -3
- package/.cursor/commands/oxe-verify.md +6 -3
- package/.cursor/commands/oxe-workstream.md +3 -3
- package/.cursor/commands/oxe.md +6 -6
- package/.github/copilot-instructions.md +94 -4
- package/.github/prompts/oxe-ask.prompt.md +3 -3
- package/.github/prompts/oxe-capabilities.prompt.md +3 -3
- package/.github/prompts/oxe-checkpoint.prompt.md +3 -3
- package/.github/prompts/oxe-compact.prompt.md +3 -3
- package/.github/prompts/oxe-dashboard.prompt.md +3 -3
- package/.github/prompts/oxe-debug.prompt.md +3 -3
- package/.github/prompts/oxe-discuss.prompt.md +3 -3
- package/.github/prompts/oxe-execute.prompt.md +7 -4
- package/.github/prompts/oxe-forensics.prompt.md +3 -3
- package/.github/prompts/oxe-help.prompt.md +3 -3
- package/.github/prompts/oxe-loop.prompt.md +3 -3
- package/.github/prompts/oxe-milestone.prompt.md +3 -3
- package/.github/prompts/oxe-next.prompt.md +3 -3
- package/.github/prompts/oxe-obs.prompt.md +3 -3
- package/.github/prompts/oxe-plan-agent.prompt.md +3 -3
- package/.github/prompts/oxe-plan.prompt.md +3 -3
- package/.github/prompts/oxe-project.prompt.md +3 -3
- package/.github/prompts/oxe-quick.prompt.md +3 -3
- package/.github/prompts/oxe-research.prompt.md +3 -3
- package/.github/prompts/oxe-retro.prompt.md +3 -3
- package/.github/prompts/oxe-review-pr.prompt.md +3 -3
- package/.github/prompts/oxe-route.prompt.md +3 -3
- package/.github/prompts/oxe-scan.prompt.md +3 -3
- package/.github/prompts/oxe-security.prompt.md +3 -3
- package/.github/prompts/oxe-session.prompt.md +4 -4
- package/.github/prompts/oxe-ship.prompt.md +45 -0
- package/.github/prompts/oxe-skill.prompt.md +3 -3
- package/.github/prompts/oxe-spec.prompt.md +3 -3
- package/.github/prompts/oxe-ui-review.prompt.md +3 -3
- package/.github/prompts/oxe-ui-spec.prompt.md +3 -3
- package/.github/prompts/oxe-update.prompt.md +3 -3
- package/.github/prompts/oxe-validate-gaps.prompt.md +3 -3
- package/.github/prompts/oxe-verify.prompt.md +6 -3
- package/.github/prompts/oxe-workstream.prompt.md +3 -3
- package/.github/prompts/oxe.prompt.md +5 -5
- package/AGENTS.md +43 -28
- package/CHANGELOG.md +193 -0
- package/README.md +610 -529
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-agent-install.cjs +69 -69
- package/bin/lib/oxe-azure.cjs +1445 -1445
- package/bin/lib/oxe-context-engine.cjs +867 -867
- package/bin/lib/oxe-dashboard.cjs +76 -28
- package/bin/lib/oxe-operational.cjs +2144 -1340
- package/bin/lib/oxe-project-health.cjs +483 -1
- package/bin/lib/oxe-runtime-semantics.cjs +12 -0
- package/bin/oxe-cc.js +554 -152
- package/commands/oxe/ask.md +7 -3
- package/commands/oxe/capabilities.md +2 -2
- package/commands/oxe/checkpoint.md +3 -3
- package/commands/oxe/compact.md +3 -3
- package/commands/oxe/dashboard.md +2 -2
- package/commands/oxe/debug.md +3 -3
- package/commands/oxe/discuss.md +2 -2
- package/commands/oxe/execute.md +7 -4
- package/commands/oxe/forensics.md +3 -3
- package/commands/oxe/help.md +2 -2
- package/commands/oxe/loop.md +3 -3
- package/commands/oxe/milestone.md +3 -3
- package/commands/oxe/next.md +3 -3
- package/commands/oxe/obs.md +3 -3
- package/commands/oxe/oxe.md +5 -5
- package/commands/oxe/plan-agent.md +2 -2
- package/commands/oxe/plan.md +2 -2
- package/commands/oxe/project.md +3 -3
- package/commands/oxe/quick.md +2 -2
- package/commands/oxe/research.md +3 -3
- package/commands/oxe/retro.md +3 -3
- package/commands/oxe/review-pr.md +3 -3
- package/commands/oxe/route.md +3 -3
- package/commands/oxe/scan.md +3 -3
- package/commands/oxe/security.md +3 -3
- package/commands/oxe/session.md +4 -4
- package/commands/oxe/ship.md +49 -0
- package/commands/oxe/skill.md +2 -2
- package/commands/oxe/spec.md +4 -4
- package/commands/oxe/ui-review.md +3 -3
- package/commands/oxe/ui-spec.md +3 -3
- package/commands/oxe/update.md +2 -2
- package/commands/oxe/validate-gaps.md +3 -3
- package/commands/oxe/verify.md +7 -4
- package/commands/oxe/workstream.md +3 -3
- package/lib/runtime/audit/audit-trail.d.ts +71 -0
- package/lib/runtime/audit/audit-trail.js +154 -0
- package/lib/runtime/audit/index.d.ts +2 -0
- package/lib/runtime/audit/index.js +18 -0
- package/lib/runtime/audit/policy-pack.d.ts +15 -0
- package/lib/runtime/audit/policy-pack.js +57 -0
- package/lib/runtime/context/context-pack-builder.d.ts +15 -0
- package/lib/runtime/context/context-pack-builder.js +42 -0
- package/lib/runtime/context/context-pack-store.d.ts +38 -0
- package/lib/runtime/context/context-pack-store.js +142 -0
- package/lib/runtime/context/context-profiles.d.ts +11 -0
- package/lib/runtime/context/context-profiles.js +51 -0
- package/lib/runtime/context/index.d.ts +2 -0
- package/lib/runtime/context/index.js +2 -0
- package/lib/runtime/decision/decision-engine.d.ts +43 -0
- package/lib/runtime/decision/decision-engine.js +127 -0
- package/lib/runtime/decision/decision-memo.d.ts +53 -0
- package/lib/runtime/decision/decision-memo.js +173 -0
- package/lib/runtime/decision/index.d.ts +2 -0
- package/lib/runtime/decision/index.js +18 -0
- package/lib/runtime/delivery/branch-manager.d.ts +1 -0
- package/lib/runtime/delivery/branch-manager.js +7 -0
- package/lib/runtime/delivery/ci-checks.js +34 -1
- package/lib/runtime/delivery/delivery-records.d.ts +34 -0
- package/lib/runtime/delivery/delivery-records.js +48 -0
- package/lib/runtime/delivery/index.d.ts +2 -0
- package/lib/runtime/delivery/index.js +2 -0
- package/lib/runtime/delivery/promotion-pipeline.d.ts +63 -0
- package/lib/runtime/delivery/promotion-pipeline.js +224 -0
- package/lib/runtime/gate/gate-manager.d.ts +41 -0
- package/lib/runtime/gate/gate-manager.js +108 -1
- package/lib/runtime/index.d.ts +5 -2
- package/lib/runtime/index.js +7 -1
- package/lib/runtime/models/gate-decision.d.ts +4 -1
- package/lib/runtime/models/workspace.d.ts +3 -0
- package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
- package/lib/runtime/plugins/capability-adapter.js +204 -0
- package/lib/runtime/plugins/capability-matrix.d.ts +25 -0
- package/lib/runtime/plugins/capability-matrix.js +90 -0
- package/lib/runtime/plugins/index.d.ts +3 -0
- package/lib/runtime/plugins/index.js +3 -0
- package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
- package/lib/runtime/plugins/plugin-manifest.d.ts +22 -0
- package/lib/runtime/plugins/plugin-manifest.js +95 -0
- package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
- package/lib/runtime/plugins/plugin-registry.js +84 -2
- package/lib/runtime/policy/policy-engine.d.ts +47 -1
- package/lib/runtime/policy/policy-engine.js +172 -9
- package/lib/runtime/projection/projection-engine.d.ts +9 -1
- package/lib/runtime/projection/projection-engine.js +73 -3
- package/lib/runtime/reducers/run-state-reducer.d.ts +26 -0
- package/lib/runtime/reducers/run-state-reducer.js +117 -1
- package/lib/runtime/scheduler/agent-registry.d.ts +44 -0
- package/lib/runtime/scheduler/agent-registry.js +96 -0
- package/lib/runtime/scheduler/agent-roles.d.ts +54 -0
- package/lib/runtime/scheduler/agent-roles.js +62 -0
- package/lib/runtime/scheduler/index.d.ts +3 -0
- package/lib/runtime/scheduler/index.js +3 -0
- package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +45 -1
- package/lib/runtime/scheduler/multi-agent-coordinator.js +234 -35
- package/lib/runtime/scheduler/run-journal.d.ts +18 -0
- package/lib/runtime/scheduler/run-journal.js +54 -0
- package/lib/runtime/scheduler/scheduler.d.ts +29 -1
- package/lib/runtime/scheduler/scheduler.js +387 -14
- package/lib/runtime/verification/index.d.ts +1 -0
- package/lib/runtime/verification/index.js +1 -0
- package/lib/runtime/verification/verification-compiler.d.ts +43 -0
- package/lib/runtime/verification/verification-compiler.js +137 -0
- package/lib/runtime/verification/verification-manifest.d.ts +67 -0
- package/lib/runtime/verification/verification-manifest.js +179 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
- package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
- package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
- package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
- package/lib/runtime/workspace/strategies/inplace.js +2 -0
- package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
- package/lib/sdk/README.md +9 -9
- package/lib/sdk/index.cjs +33 -24
- package/lib/sdk/index.d.ts +149 -14
- package/oxe/templates/ACTIVE-RUN.template.json +32 -32
- package/oxe/templates/CAPABILITIES.template.md +7 -7
- package/oxe/templates/CAPABILITY.template.md +45 -45
- package/oxe/templates/CHECKPOINTS.template.md +7 -7
- package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
- package/oxe/templates/HYPOTHESES.template.md +33 -33
- package/oxe/templates/LESSONS-METRICS.template.json +13 -13
- package/oxe/templates/NOTES.template.md +16 -16
- package/oxe/templates/PLAN-REVIEW.template.md +31 -31
- package/oxe/templates/SESSION.template.md +34 -34
- package/oxe/templates/SKILL.template.md +26 -26
- package/oxe/templates/STATE.md +55 -55
- package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
- package/oxe/workflows/ask.md +96 -92
- package/oxe/workflows/capabilities.md +25 -25
- package/oxe/workflows/checkpoint.md +14 -10
- package/oxe/workflows/dashboard.md +33 -33
- package/oxe/workflows/debug.md +19 -15
- package/oxe/workflows/discuss.md +12 -12
- package/oxe/workflows/execute.md +44 -2
- package/oxe/workflows/forensics.md +13 -9
- package/oxe/workflows/help.md +352 -304
- package/oxe/workflows/loop.md +17 -13
- package/oxe/workflows/next.md +22 -22
- package/oxe/workflows/obs.md +4 -0
- package/oxe/workflows/oxe.md +64 -31
- package/oxe/workflows/plan-agent.md +9 -9
- package/oxe/workflows/project.md +6 -1
- package/oxe/workflows/quick.md +10 -10
- package/oxe/workflows/references/reasoning-discovery.md +28 -28
- package/oxe/workflows/references/reasoning-execution.md +29 -29
- package/oxe/workflows/references/reasoning-planning.md +32 -32
- package/oxe/workflows/references/reasoning-review.md +29 -29
- package/oxe/workflows/references/reasoning-status.md +24 -24
- package/oxe/workflows/references/robustness-elevation.md +295 -295
- package/oxe/workflows/references/workflow-runtime-contracts.json +952 -907
- package/oxe/workflows/research.md +32 -28
- package/oxe/workflows/retro.md +4 -0
- package/oxe/workflows/review-pr.md +15 -11
- package/oxe/workflows/route.md +16 -16
- package/oxe/workflows/scan.md +4 -0
- package/oxe/workflows/security.md +14 -10
- package/oxe/workflows/session.md +213 -197
- package/oxe/workflows/ship.md +142 -0
- package/oxe/workflows/skill.md +44 -44
- package/oxe/workflows/spec.md +15 -0
- package/oxe/workflows/ui-review.md +20 -16
- package/oxe/workflows/ui-spec.md +7 -3
- package/oxe/workflows/validate-gaps.md +13 -9
- package/oxe/workflows/verify-audit.md +73 -73
- package/oxe/workflows/verify.md +52 -3
- package/package.json +92 -92
- package/packages/runtime/package.json +17 -17
- package/packages/runtime/src/audit/audit-trail.ts +243 -0
- package/packages/runtime/src/audit/index.ts +2 -0
- package/packages/runtime/src/audit/policy-pack.ts +62 -0
- package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
- package/packages/runtime/src/compiler/index.ts +1 -1
- package/packages/runtime/src/context/context-pack-builder.ts +259 -193
- package/packages/runtime/src/context/context-pack-store.ts +197 -0
- package/packages/runtime/src/context/context-profiles.ts +60 -0
- package/packages/runtime/src/context/index.ts +3 -1
- package/packages/runtime/src/decision/decision-engine.ts +174 -0
- package/packages/runtime/src/decision/decision-memo.ts +211 -0
- package/packages/runtime/src/decision/index.ts +2 -0
- package/packages/runtime/src/delivery/branch-manager.ts +91 -84
- package/packages/runtime/src/delivery/ci-checks.ts +285 -252
- package/packages/runtime/src/delivery/delivery-records.ts +75 -0
- package/packages/runtime/src/delivery/index.ts +5 -3
- package/packages/runtime/src/delivery/pr-manager.ts +112 -112
- package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -0
- package/packages/runtime/src/events/bus.ts +92 -92
- package/packages/runtime/src/events/catalog.ts +29 -29
- package/packages/runtime/src/events/envelope.ts +14 -14
- package/packages/runtime/src/events/index.ts +3 -3
- package/packages/runtime/src/evidence/evidence-store.ts +130 -130
- package/packages/runtime/src/evidence/index.ts +1 -1
- package/packages/runtime/src/gate/gate-manager.ts +289 -137
- package/packages/runtime/src/gate/index.ts +1 -1
- package/packages/runtime/src/index.ts +41 -32
- package/packages/runtime/src/models/attempt.ts +19 -19
- package/packages/runtime/src/models/evidence.ts +21 -21
- package/packages/runtime/src/models/gate-decision.ts +25 -21
- package/packages/runtime/src/models/index.ts +8 -8
- package/packages/runtime/src/models/run.ts +24 -24
- package/packages/runtime/src/models/session.ts +11 -11
- package/packages/runtime/src/models/verification-result.ts +10 -10
- package/packages/runtime/src/models/work-item.ts +25 -25
- package/packages/runtime/src/models/workspace.ts +31 -28
- package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
- package/packages/runtime/src/plugins/capability-matrix.ts +126 -0
- package/packages/runtime/src/plugins/index.ts +5 -2
- package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
- package/packages/runtime/src/plugins/plugin-manifest.ts +118 -0
- package/packages/runtime/src/plugins/plugin-registry.ts +232 -119
- package/packages/runtime/src/policy/index.ts +1 -1
- package/packages/runtime/src/policy/policy-engine.ts +330 -113
- package/packages/runtime/src/projection/index.ts +1 -1
- package/packages/runtime/src/projection/projection-engine.ts +328 -249
- package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
- package/packages/runtime/src/reducers/index.ts +2 -2
- package/packages/runtime/src/reducers/run-state-reducer.ts +269 -127
- package/packages/runtime/src/scheduler/agent-registry.ts +132 -0
- package/packages/runtime/src/scheduler/agent-roles.ts +109 -0
- package/packages/runtime/src/scheduler/index.ts +4 -1
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -231
- package/packages/runtime/src/scheduler/run-journal.ts +62 -0
- package/packages/runtime/src/scheduler/scheduler.ts +722 -281
- package/packages/runtime/src/verification/index.ts +2 -1
- package/packages/runtime/src/verification/verification-compiler.ts +436 -225
- package/packages/runtime/src/verification/verification-manifest.ts +252 -0
- package/packages/runtime/src/workspace/index.ts +5 -5
- package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
- package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
- package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
- package/packages/runtime/tsconfig.json +17 -17
- package/vscode-extension/.vscodeignore +7 -7
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/package.json +185 -185
- package/vscode-extension/src/extension.js +310 -310
- package/vscode-extension/src/shared/contextLoader.js +137 -137
- package/vscode-extension/src/shared/contractBuilder.js +159 -159
- package/vscode-extension/src/shared/stateReader.js +101 -101
|
@@ -354,11 +354,30 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
354
354
|
state: { path: globalPaths.state, raw: stateText, parsed: { phase: health.parseStatePhase(stateText), activeSession, runtimeStatus: firstMatch(stateText, /\*\*runtime_status:\*\*\s*([^\n]+)/i) } },
|
|
355
355
|
spec: { path: p.spec, raw: specText, objective: spec.objective, criteria: spec.criteria, uncoveredCriteria: spec.criteria.filter((c) => !plan.tasks.some((t) => (t.aceite || []).includes(c.id))) },
|
|
356
356
|
plan: { path: p.plan, raw: planText, tasks: plan.tasks, waves: plan.waves, totalTasks: plan.totalTasks, selfEvaluation: report.planSelfEvaluation },
|
|
357
|
-
runtime: { path: p.runtime, raw: runtimeText, summary: summarizeText(runtimeText, 800), parsed: runtime },
|
|
358
|
-
activeRun: activeRunState,
|
|
359
|
-
runtimeCanonical: activeRunState && activeRunState.canonical_state ? activeRunState.canonical_state : null,
|
|
360
|
-
compiledGraph: activeRunState && activeRunState.compiled_graph ? activeRunState.compiled_graph : null,
|
|
361
|
-
|
|
357
|
+
runtime: { path: p.runtime, raw: runtimeText, summary: summarizeText(runtimeText, 800), parsed: runtime },
|
|
358
|
+
activeRun: activeRunState,
|
|
359
|
+
runtimeCanonical: activeRunState && activeRunState.canonical_state ? activeRunState.canonical_state : null,
|
|
360
|
+
compiledGraph: activeRunState && activeRunState.compiled_graph ? activeRunState.compiled_graph : null,
|
|
361
|
+
enterprise: {
|
|
362
|
+
runtimeMode: report.runtimeMode || null,
|
|
363
|
+
fallbackMode: report.fallbackMode || null,
|
|
364
|
+
verificationSummary: report.verificationSummary || null,
|
|
365
|
+
residualRiskSummary: report.residualRiskSummary || null,
|
|
366
|
+
evidenceCoverage: report.evidenceCoverage || null,
|
|
367
|
+
pendingGates: report.pendingGates || null,
|
|
368
|
+
gateQueue: report.gateQueue || null,
|
|
369
|
+
policyDecisionSummary: report.policyDecisionSummary || null,
|
|
370
|
+
policyCoverage: report.policyCoverage || null,
|
|
371
|
+
quotaSummary: report.quotaSummary || null,
|
|
372
|
+
auditSummary: report.auditSummary || null,
|
|
373
|
+
promotionSummary: report.promotionSummary || null,
|
|
374
|
+
promotionReadiness: report.promotionReadiness || null,
|
|
375
|
+
recoveryState: report.recoveryState || null,
|
|
376
|
+
multiAgent: report.multiAgent || null,
|
|
377
|
+
providerCatalog: report.providerCatalog || null,
|
|
378
|
+
warnings: report.enterpriseWarn || [],
|
|
379
|
+
},
|
|
380
|
+
tracing: { path: operational.operationalPaths(projectRoot, activeSession || null).events, events: traceEvents, summary: traceSummary },
|
|
362
381
|
checkpoints: { path: p.checkpoints, raw: checkpointsText, parsed: checkpoints },
|
|
363
382
|
verify: { path: p.verify, raw: verifyText, summary: summarizeText(verifyText, 800), parsed: verify },
|
|
364
383
|
review: { markdownPath: p.planReview, commentsPath: p.reviewJson, comments: readJsonArrayIfExists(p.reviewJson) },
|
|
@@ -385,7 +404,15 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
385
404
|
sqlPath: azurePaths.sqlMd,
|
|
386
405
|
}
|
|
387
406
|
: null,
|
|
388
|
-
diagnostics: {
|
|
407
|
+
diagnostics: {
|
|
408
|
+
reviewWarnings: report.reviewWarn,
|
|
409
|
+
runtimeWarnings: report.runtimeWarn,
|
|
410
|
+
enterpriseWarnings: report.enterpriseWarn || [],
|
|
411
|
+
planWarnings: report.planWarn,
|
|
412
|
+
sessionWarnings: report.sessionWarn,
|
|
413
|
+
capabilityWarnings: report.capabilityWarn,
|
|
414
|
+
investigationWarnings: report.investigationWarn,
|
|
415
|
+
},
|
|
389
416
|
repositoryContext: readRepositoryContext(rootScoped.codebase),
|
|
390
417
|
};
|
|
391
418
|
if (ctx.azure) {
|
|
@@ -420,10 +447,10 @@ function loadDashboardContext(projectRoot, opts = {}) {
|
|
|
420
447
|
}
|
|
421
448
|
);
|
|
422
449
|
}
|
|
423
|
-
ctx.operationalGraph = ctx.activeRun ? operational.buildOperationalGraph(ctx.activeRun) : { nodes: [], edges: [] };
|
|
424
|
-
ctx.dashboard = { readOnly: false };
|
|
425
|
-
return ctx;
|
|
426
|
-
}
|
|
450
|
+
ctx.operationalGraph = ctx.activeRun ? operational.buildOperationalGraph(ctx.activeRun) : { nodes: [], edges: [] };
|
|
451
|
+
ctx.dashboard = { readOnly: false };
|
|
452
|
+
return ctx;
|
|
453
|
+
}
|
|
427
454
|
|
|
428
455
|
function dashboardHtml() {
|
|
429
456
|
return `<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>OXE Dashboard</title><style>
|
|
@@ -445,22 +472,23 @@ function dashboardHtml() {
|
|
|
445
472
|
const contextGaps=((ctx.context&&ctx.context.pack&&ctx.context.pack.gaps)||[]).map((gap)=>'<div class="entry small">['+esc(gap.severity)+'] '+esc(gap.alias)+': '+esc(gap.reason)+'</div>');
|
|
446
473
|
const contextConflicts=((ctx.context&&ctx.context.pack&&ctx.context.pack.conflicts)||[]).map((conflict)=>'<div class="entry small">'+esc(conflict.alias)+': '+esc(conflict.reason)+'</div>');
|
|
447
474
|
const semanticsWarnings=((ctx.context&&ctx.context.semantics&&ctx.context.semantics.audit&&ctx.context.semantics.audit.warnings)||[]).map((warning)=>'<div class="entry small">'+esc(warning)+'</div>');
|
|
448
|
-
|
|
475
|
+
const blockers=(ctx.readiness.blockers||[]).map((x)=>'<div class="entry small">'+esc(x)+'</div>'); const warnings=(ctx.readiness.warnings||[]).concat((ctx.diagnostics.enterpriseWarnings||[])).slice(0,10).map((x)=>'<div class="entry small">'+esc(x)+'</div>'); const evidence=(ctx.runtime.parsed.evidence||[]).map((x)=>'<div class="entry small">'+esc(x)+'</div>'); const blockages=(ctx.runtime.parsed.blockages||[]).map((x)=>'<div class="entry small">'+esc(x)+'</div>'); const history=((ctx.sessions.current&&ctx.sessions.current.history)||[]).map((x)=>'<div class="entry small">'+esc(x.date)+' · '+esc(x.event)+'</div>');
|
|
476
|
+
const enterpriseGates=((ctx.enterprise&&ctx.enterprise.pendingGates&&ctx.enterprise.pendingGates.pending)||[]).map((gate)=>'<div class="entry small">'+esc(gate.gate_id)+' · '+esc(gate.scope)+' · '+esc(gate.work_item_id||'run')+'</div>');
|
|
449
477
|
app.innerHTML='<div class="stats"><div class="metric"><div class="label">Saúde lógica</div><div class="value">'+badge(ctx.healthStatus)+'</div></div><div class="metric"><div class="label">Go / No-Go</div><div class="value">'+badge(ctx.readiness.decision,ctx.readiness.decision)+'</div></div><div class="metric"><div class="label">Review</div><div class="value">'+badge(ctx.planReviewStatus)+'</div></div><div class="metric"><div class="label">Checkpoints</div><div class="value">'+badge(ctx.readiness.checkpointPending?'pending_approval':'clear',ctx.readiness.checkpointPending?'pendente':'ok')+'</div></div><div class="metric"><div class="label">Runtime</div><div class="value">'+badge(ctx.runtime.parsed.status||ctx.state.parsed.runtimeStatus||'pending')+'</div></div></div>'
|
|
450
478
|
+'<div class="tabs">'+['decision','plan','execution','evidence','sessions','context','repository'].map((t)=>'<button class="tab'+(tab===t?' active':'')+'" onclick="setTab(\\''+t+'\\')">'+(t==='repository'?'repository context':t)+'</button>').join('')+'</div>'
|
|
451
479
|
+'<div class="view'+(tab==='decision'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Decision Control</h2><div class="muted">A pergunta principal: podemos executar agora?</div></div></div><div class="'+(ctx.readiness.go?'panel go':'panel nogo')+'" style="padding:18px"><div class="label">Decisão operacional</div><div style="font-size:38px;font-weight:900;margin-top:8px">'+(ctx.readiness.go?'GO':'NO-GO')+'</div><div class="small muted" style="margin-top:8px">'+esc(ctx.nextStep.reason||'—')+'</div><div class="actions">'+badge(ctx.planReviewStatus,'review:'+ctx.planReviewStatus)+badge(ctx.readiness.confidenceBand,'confiança:'+ctx.readiness.confidenceBand)+(ctx.readiness.checkpointPending?badge('pending_approval','checkpoint pendente'):'')+'</div></div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Decision Rail</h2><div class="muted">Spec → Plan → Review → Execute → Verify → Lessons.</div></div></div><div class="rail">'+flow.join('')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Readiness Map</h2><div class="muted">Bloqueios e sinais ativos antes do execute.</div></div></div><div class="grid2"><div><h3>Bloqueios</h3>'+list(blockers,'Sem bloqueios formais para executar.')+'</div><div><h3>Warnings</h3>'+list(warnings,'Sem warnings relevantes.')+'</div></div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Review e aprovação</h2><div class="muted">Persistida em STATE.md, PLAN-REVIEW.md e comentários.</div></div></div><div class="grid2"><div><div class="actions"><button class="primary" onclick="changeReview(\\'approved\\')">Aprovar</button><button class="warnbtn" onclick="changeReview(\\'needs_revision\\')">Pedir revisão</button><button class="secondary" onclick="changeReview(\\'in_review\\')">Marcar em revisão</button><button class="danger" onclick="changeReview(\\'rejected\\')">Rejeitar</button></div><div class="form"><input id="comment-target" placeholder="target ex.: wave:1, T2, checkpoint:CP-01"/><select id="comment-type"><option value="note">note</option><option value="risk">risk</option><option value="question">question</option><option value="approval">approval</option></select><textarea id="comment-text" rows="6" placeholder="Comentário de revisão"></textarea><button class="primary" onclick="addComment()">Adicionar comentário</button></div></div><div><h3>Comentários</h3>'+list(comments,'Nenhum comentário de revisão.')+'</div></div></div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Mapa de artefatos</h2><div class="muted">Fonte de verdade visual do ciclo atual.</div></div></div><div class="grid3">'+graph.join('')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Calibração do plano</h2><div class="muted">Confiança prevista versus resultado real.</div></div>'+badge(ctx.calibration.status)+'</div><div class="small">'+esc(ctx.calibration.summary)+'</div></div></div></div></div>'
|
|
452
480
|
+'<div class="view'+(tab==='plan'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Trilha do plano</h2><div class="muted">Ondas, dependências e vínculos com aceite e decisões.</div></div>'+badge(ctx.planReviewStatus)+'</div>'+list(waves,'PLAN.md ausente ou sem tarefas estruturadas.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Matriz de cobertura</h2><div class="muted">SPEC → PLAN → VERIFY em um único quadro.</div></div></div><div class="grid2">'+coverage.join('')+'</div></div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Autoavaliação do plano</h2><div class="muted">Melhor plano atual e faixa de confiança.</div></div></div><div class="grid3"><div class="item"><strong>Melhor plano atual</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.plan.selfEvaluation&&ctx.plan.selfEvaluation.bestPlan)||'—')+'</div></div><div class="item"><strong>Confiança</strong><div class="small muted" style="margin-top:8px">'+esc(ctx.readiness.confidence!=null?ctx.readiness.confidence+'%':'—')+'</div></div><div class="item"><strong>Faixa</strong><div class="small muted" style="margin-top:8px">'+esc(ctx.readiness.confidenceBand)+'</div></div></div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Lacunas da SPEC</h2><div class="muted">Critérios sem cobertura explícita no plano.</div></div></div>'+list((ctx.spec.uncoveredCriteria||[]).map((c)=>'<div class="entry small">'+esc(c.id)+' · '+esc(c.criterion)+'</div>'),'Sem lacunas detectadas.')+'</div></div></div></div>'
|
|
453
|
-
|
|
481
|
+
+'<div class="view'+(tab==='execution'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Runtime operacional</h2><div class="muted">Estado tático da execução.</div></div>'+badge(ctx.runtime.parsed.status||'pending')+'</div><div class="grid3"><div class="item"><strong>Onda atual</strong><div class="small muted" style="margin-top:8px">'+esc(ctx.runtime.parsed.currentWave||'—')+'</div></div><div class="item"><strong>Tarefas ativas</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.runtime.parsed.activeTasks||[]).join(', ')||'—')+'</div></div><div class="item"><strong>Próxima ação</strong><div class="small muted" style="margin-top:8px">'+esc(ctx.runtime.parsed.nextAction||'—')+'</div></div><div class="item"><strong>Motivo</strong><div class="small muted" style="margin-top:8px">'+esc(ctx.runtime.parsed.nextReason||'—')+'</div></div><div class="item"><strong>Modo runtime</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.enterprise&&ctx.enterprise.runtimeMode&&ctx.enterprise.runtimeMode.runtime_mode)||'—')+'</div></div><div class="item"><strong>Fallback</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.enterprise&&ctx.enterprise.fallbackMode)||'—')+'</div></div></div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Checkpoints</h2><div class="muted">Gates humanos formais.</div></div></div>'+list(checkpoints,'CHECKPOINTS.md ausente ou sem gates formais.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Gates pendentes</h2><div class="muted">Fila operacional persistida por run/work item.</div></div></div>'+list(enterpriseGates,'Sem gates pendentes no runtime.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Agentes</h2><div class="muted">Blueprint e runtime multiagente.</div></div></div>'+list(agents,'Sem blueprint de agentes ou runtime multiagente ativo.')+'</div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Evidências</h2><div class="muted">Artefatos e sinais da execução atual.</div></div></div>'+list(evidence,'Sem evidência operacional registrada.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Enterprise verify</h2><div class="muted">Manifest, risco residual, governança e promoção.</div></div></div><div class="grid3">'+kvItem('Checks',(ctx.enterprise&&ctx.enterprise.verificationSummary&&ctx.enterprise.verificationSummary.total)||'—')+kvItem('Fail',(ctx.enterprise&&ctx.enterprise.verificationSummary&&ctx.enterprise.verificationSummary.fail)||0)+kvItem('Coverage',(ctx.enterprise&&ctx.enterprise.evidenceCoverage&&String(ctx.enterprise.evidenceCoverage.coverage_percent)+'%')||'—')+kvItem('Residual risks',(ctx.enterprise&&ctx.enterprise.residualRiskSummary&&ctx.enterprise.residualRiskSummary.total)||0)+kvItem('High/Critical',(ctx.enterprise&&ctx.enterprise.residualRiskSummary&&ctx.enterprise.residualRiskSummary.highOrCritical)||0)+kvItem('Policy decisions',(ctx.enterprise&&ctx.enterprise.policyDecisionSummary&&ctx.enterprise.policyDecisionSummary.total)||0)+kvItem('Policy coverage',(ctx.enterprise&&ctx.enterprise.policyCoverage&&String(ctx.enterprise.policyCoverage.coveragePercent)+'%')||'—')+kvItem('Quota retries',(ctx.enterprise&&ctx.enterprise.quotaSummary&&ctx.enterprise.quotaSummary.consumed&&String(ctx.enterprise.quotaSummary.consumed.retries)+'/'+((ctx.enterprise.quotaSummary.limits&&ctx.enterprise.quotaSummary.limits.maxRetriesPerRun)!=null?ctx.enterprise.quotaSummary.limits.maxRetriesPerRun:'∞'))||'—')+kvItem('Audit critical',(ctx.enterprise&&ctx.enterprise.auditSummary&&ctx.enterprise.auditSummary.critical)||0)+kvItem('Promotion',(ctx.enterprise&&ctx.enterprise.promotionSummary&&ctx.enterprise.promotionSummary.status)||'—')+kvItem('Promotion readiness',(ctx.enterprise&&ctx.enterprise.promotionReadiness&&ctx.enterprise.promotionReadiness.status)||'—')+kvItem('Recovery',(ctx.enterprise&&ctx.enterprise.recoveryState&&ctx.enterprise.recoveryState.status)||'—')+kvItem('Providers',((ctx.enterprise&&ctx.enterprise.providerCatalog&&ctx.enterprise.providerCatalog.summary&&((ctx.enterprise.providerCatalog.summary.pluginsCount!=null?ctx.enterprise.providerCatalog.summary.pluginsCount:ctx.enterprise.providerCatalog.summary.total_plugins)!=null?(ctx.enterprise.providerCatalog.summary.pluginsCount!=null?ctx.enterprise.providerCatalog.summary.pluginsCount:ctx.enterprise.providerCatalog.summary.total_plugins):Array.isArray(ctx.enterprise.providerCatalog.summary.plugins)?ctx.enterprise.providerCatalog.summary.plugins.length:0)))||0)+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Bloqueios</h2><div class="muted">O que impede avanço agora.</div></div></div>'+list(blockages,'Sem bloqueios explícitos.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Runtime bruto</h2><div class="muted">Leitura direta do artefato operacional.</div></div></div><div class="raw">'+esc(ctx.runtime.summary||'EXECUTION-RUNTIME.md ausente.')+'</div></div></div></div></div>'
|
|
454
482
|
+'<div class="view'+(tab==='evidence'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Verify</h2><div class="muted">Evidência final e validação.</div></div>'+badge(ctx.calibration.status)+'</div><div class="raw">'+esc(ctx.verify.summary||'VERIFY.md ausente.')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Critérios no verify</h2><div class="muted">Evidências detectadas por critério A*.</div></div></div><div class="grid2">'+coverage.join('')+'</div></div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Investigações</h2><div class="muted">Base de evidência antes do plano.</div></div></div><div class="raw">'+esc(ctx.support.investigationsSummary||'INVESTIGATIONS.md ausente.')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Capabilities</h2><div class="muted">Recursos nativos do projeto.</div></div></div><div class="raw">'+esc(ctx.support.capabilitiesSummary||'CAPABILITIES.md ausente.')+'</div></div></div></div></div>'
|
|
455
483
|
+'<div class="view'+(tab==='sessions'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Sessão ativa</h2><div class="muted">Contexto atual resolvido pelo STATE global.</div></div></div><div class="grid2"><div class="item"><strong>ID</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.sessions.current&&ctx.sessions.current.id)||'—')+'</div></div><div class="item"><strong>Nome</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.sessions.current&&ctx.sessions.current.name)||ctx.activeSession||'—')+'</div></div><div class="item"><strong>Status</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.sessions.current&&ctx.sessions.current.status)||'—')+'</div></div><div class="item"><strong>Última atividade</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.sessions.current&&ctx.sessions.current.lastActivity)||'—')+'</div></div></div><div class="item" style="margin-top:14px"><strong>Resumo</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.sessions.current&&ctx.sessions.current.summary)||'Sem SESSION.md ativo ou modo legado.')+'</div><div class="small muted" style="margin-top:8px">'+esc(ctx.sessions.currentPath||'—')+'</div></div><div class="item" style="margin-top:14px"><strong>Tags</strong><div class="small" style="margin-top:8px">'+((ctx.sessions.current&&ctx.sessions.current.tags)||[]).map((x)=>'<span class="chip">'+esc(x)+'</span>').join('')+'</div></div><h3>Histórico</h3>'+list(history,'Sem histórico de sessão disponível.')+'</div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Lista de sessões</h2><div class="muted">Índice real lido de .oxe/SESSIONS.md.</div></div></div>'+list(sessions,'SESSIONS.md ausente ou sem sessões registradas.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Índice bruto</h2><div class="muted">Leitura direta do artefato global.</div></div></div><div class="raw">'+esc(ctx.sessions.raw||'SESSIONS.md ausente.')+'</div></div></div></div></div>'
|
|
456
484
|
+'<div class="view'+(tab==='context'?' active':'')+'"><div class="layout"><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Context Pack</h2><div class="muted">Seleção determinística de artefatos para este estado do OXE.</div></div>'+badge((ctx.context&&ctx.context.quality&&ctx.context.quality.primaryStatus)||((ctx.context&&ctx.context.pack&&ctx.context.pack.context_quality&&ctx.context.pack.context_quality.status)||'pending'))+'</div><div class="grid3"><div class="item"><strong>Workflow primário</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.context&&ctx.context.quality&&ctx.context.quality.primaryWorkflow)||'dashboard')+'</div></div><div class="item"><strong>Score</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.context&&ctx.context.quality&&ctx.context.quality.primaryScore)!=null?String(ctx.context.quality.primaryScore):'—')+'</div></div><div class="item"><strong>Freshness</strong><div class="small muted" style="margin-top:8px">'+esc((ctx.context&&ctx.context.pack&&ctx.context.pack.freshness&&ctx.context.pack.freshness.reason)||'—')+'</div></div></div><div class="small muted" style="margin-top:12px">Pack: '+esc((ctx.context&&ctx.context.pack&&ctx.context.pack.path)||'—')+' · semantics hash: '+esc((ctx.context&&ctx.context.pack&&ctx.context.pack.semantics_hash)||'—')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Artefatos selecionados</h2><div class="muted">Contexto efetivamente priorizado pelo pack.</div></div></div><div class="grid2">'+contextSelected.join('')+'</div></div></div><div class="stack"><div class="panel"><div class="head"><div><h2 style="margin:0">Gaps e conflitos</h2><div class="muted">Lacunas e divergências entre raiz e sessão.</div></div></div><h3>Gaps</h3>'+list(contextGaps,'Sem gaps no pack atual.')+'<h3>Conflitos</h3>'+list(contextConflicts,'Sem conflitos detectados.')+'</div><div class="panel"><div class="head"><div><h2 style="margin:0">Summaries ativos</h2><div class="muted">Referências persistidas para compressão de contexto.</div></div></div><div class="grid2">'+kvItem('Project summary',(ctx.context&&ctx.context.summaries&&ctx.context.summaries.project)||'—')+kvItem('Session summary',(ctx.context&&ctx.context.summaries&&ctx.context.summaries.session)||'—')+kvItem('Phase summary',(ctx.context&&ctx.context.summaries&&ctx.context.summaries.phase)||'—')+'</div></div><div class="panel"><div class="head"><div><h2 style="margin:0">Semântica multi-runtime</h2><div class="muted">Drift auditável entre workflow, wrapper e prompt renderizado.</div></div>'+badge(ctx.context&&ctx.context.semantics&&ctx.context.semantics.ok?'healthy':'warning',ctx.context&&ctx.context.semantics&&ctx.context.semantics.ok?'ok':'drift')+'</div><div class="small muted">Manifest: '+esc((ctx.context&&ctx.context.semantics&&ctx.context.semantics.manifestPath)||'—')+' · mismatch count: '+esc((ctx.context&&ctx.context.semantics&&ctx.context.semantics.audit&&ctx.context.semantics.audit.mismatchCount)||0)+'</div>'+list(semanticsWarnings,'Sem warnings semânticos ativos.')+'</div></div></div></div>'
|
|
457
485
|
+'<div class="view'+(tab==='repository'?' active':'')+'"><div class="panel"><div class="head"><div><h2 style="margin:0">Repository Context</h2><div class="muted">Contexto de repositório como suporte de decisão.</div></div></div><div class="grid3">'+repo.join('')+'</div></div></div>'; enhanceExecutionView();}
|
|
458
486
|
function executionViewElement(){return Array.from(app.querySelectorAll('.view')).find((view)=>view.textContent.includes('Runtime operacional'));}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
487
|
+
function panel(title,body){return '<div class="panel"><div class="head"><div><h2 style="margin:0">'+esc(title)+'</h2></div></div>'+body+'</div>';}
|
|
488
|
+
function kvItem(label,value){return '<div class="item"><strong>'+esc(label)+'</strong><div class="small muted" style="margin-top:8px">'+esc(value)+'</div></div>';}
|
|
489
|
+
function actionButton(label,action,klass){return '<button class="'+klass+'" '+(runtimeDisabled()?'disabled':'')+' onclick="runtimeAction(\\''+action+'\\')">'+label+'</button>';}
|
|
490
|
+
function enhanceExecutionView(){
|
|
491
|
+
const view=executionViewElement();
|
|
464
492
|
if(!view||!ctx)return;
|
|
465
493
|
const stacks=view.querySelectorAll('.stack');
|
|
466
494
|
if(stacks.length<2)return;
|
|
@@ -469,22 +497,35 @@ function dashboardHtml() {
|
|
|
469
497
|
const trace=((ctx.tracing&&ctx.tracing.events)||[]).slice(-8).reverse().map((event)=>'<div class="entry"><div class="head"><strong>'+esc(event.type)+'</strong>'+badge(event.timestamp?event.timestamp.slice(11,19):'—',event.timestamp?event.timestamp.slice(11,19):'—')+'</div><div class="small muted">run='+esc(event.run_id||'—')+' · wave='+esc(event.wave_id||'—')+' · task='+esc(event.task_id||'—')+'</div><div class="small" style="margin-top:8px">'+esc(JSON.stringify(event.payload||{}))+'</div></div>').join('')||'<div class="entry small">Sem eventos registrados.</div>';
|
|
470
498
|
const nodes=(graph.nodes||[]).map((node)=>'<div class="item"><div class="head"><strong>'+esc(node.label||node.id)+'</strong>'+badge(node.status||'pending')+'</div><div class="small muted">'+esc(node.kind||'node')+'</div><div class="small" style="margin-top:8px">'+esc(node.detail||'—')+'</div></div>').join('')||'<div class="entry small">Sem nós operacionais.</div>';
|
|
471
499
|
const edges=(graph.edges||[]).map((edge)=>'<div class="entry"><div class="small"><strong>'+esc(edge.from)+'</strong> → <strong>'+esc(edge.to)+'</strong></div><div class="small muted" style="margin-top:6px">'+esc(edge.type||'link')+' · '+esc(edge.status||'—')+'</div><div class="small" style="margin-top:6px">'+esc(edge.reason||edge.label||'—')+'</div></div>').join('')||'<div class="entry small">Sem handoffs ou dependências registradas.</div>';
|
|
472
|
-
|
|
473
|
-
|
|
500
|
+
const memory=Object.entries(ctx.memoryLayers||{}).filter(([key])=>key!=='readOrder').map(([key,val])=>kvItem(key,Array.isArray(val.source)?val.source.join(' | '):val.source||'—')).join('')||'<div class="entry small">Sem contrato de memória disponível.</div>';
|
|
501
|
+
const enterprise=ctx.enterprise||{};
|
|
502
|
+
const gateQueue=enterprise.gateQueue||{pending:[],stalePending:[],resolvedRecent:[],gateSlaHours:24};
|
|
503
|
+
const pendingGates=(gateQueue.pending||[]).map((gate)=>'<div class="entry"><div class="head"><strong>'+esc(gate.gate_id)+'</strong>'+badge(gate.status||'pending')+'</div><div class="small muted">scope='+esc(gate.scope||'—')+' · task='+esc(gate.work_item_id||'—')+' · actor='+(gate.actor?esc(gate.actor):'—')+'</div><div class="small" style="margin-top:8px">'+esc((gate.context&&gate.context.description)||gate.action||'Sem descrição')+'</div><div class="actions" style="margin-top:12px"><button class="primary" '+(runtimeDisabled()?'disabled':'')+' onclick="runtimeGateResolve(\\''+esc(gate.gate_id)+'\\',\\'approve\\')">Approve</button><button class="warnbtn" '+(runtimeDisabled()?'disabled':'')+' onclick="runtimeGateResolve(\\''+esc(gate.gate_id)+'\\',\\'waive\\')">Waive</button><button class="danger" '+(runtimeDisabled()?'disabled':'')+' onclick="runtimeGateResolve(\\''+esc(gate.gate_id)+'\\',\\'reject\\')">Reject</button></div></div>').join('')||'<div class="entry small">Sem gates pendentes.</div>';
|
|
504
|
+
const staleGates=(gateQueue.stalePending||[]).map((gate)=>'<div class="entry"><div class="head"><strong>'+esc(gate.gate_id)+'</strong>'+badge('stale','warning')+'</div><div class="small muted">requested_at='+esc(gate.requested_at||'—')+' · scope='+esc(gate.scope||'—')+'</div></div>').join('')||'<div class="entry small">Sem gates stale.</div>';
|
|
505
|
+
const recentResolved=(gateQueue.resolvedRecent||[]).map((gate)=>'<div class="entry"><div class="head"><strong>'+esc(gate.gate_id)+'</strong>'+badge(gate.decision||'resolved','ok')+'</div><div class="small muted">actor='+esc(gate.actor||'—')+' · reason='+esc(gate.reason||'—')+'</div></div>').join('')||'<div class="entry small">Sem resoluções recentes.</div>';
|
|
506
|
+
const gatePanel=panel('Runtime gates','<div class="grid3">'+kvItem('Pending',String((gateQueue.pending||[]).length))+kvItem('Stale',String(gateQueue.staleCount||0))+kvItem('SLA (h)',String(gateQueue.gateSlaHours||24))+'</div><h3>Pendentes</h3>'+pendingGates+'<h3>Stale</h3>'+staleGates+'<h3>Resolvidos nas últimas 24h</h3>'+recentResolved);
|
|
507
|
+
const multiAgent=enterprise.multiAgent||null;
|
|
508
|
+
const multiAgentPanel=multiAgent&&multiAgent.enabled?panel('Multi-agent','<div class="grid3">'+kvItem('Mode',multiAgent.mode||'—')+kvItem('Isolation',multiAgent.workspaceIsolationEnforced?'isolated':'shared')+kvItem('Agents',String((multiAgent.agents||[]).length))+'</div><h3>Ownership</h3>'+((multiAgent.ownership||[]).map((item)=>'<div class="entry"><div class="head"><strong>'+esc(item.work_item_id||'—')+'</strong>'+badge(item.owner_agent_id||'unassigned')+'</div></div>').join('')||'<div class="entry small">Sem ownership ativo.</div>')+'<h3>Handoffs</h3>'+((multiAgent.handoffs||[]).map((handoff)=>'<div class="entry"><div class="small"><strong>'+esc(handoff.from_agent_id||'—')+'</strong> → <strong>'+esc(handoff.to_agent_id||'—')+'</strong></div><div class="small muted" style="margin-top:6px">'+esc(handoff.work_item_id||'—')+'</div></div>').join('')||'<div class="entry small">Sem handoffs registrados.</div>')):'';
|
|
509
|
+
const recovery=enterprise.recoveryState||null;
|
|
510
|
+
const recoveryPanel=recovery?panel('Recovery','<div class="grid3">'+kvItem('Status',recovery.status||'—')+kvItem('Last recovery',recovery.lastRecoveredAt||'—')+kvItem('Issues',String((recovery.issues||[]).length))+'</div><h3>Issues</h3>'+((recovery.issues||[]).map((issue)=>'<div class="entry"><div class="small"><strong>'+esc(issue.code||'issue')+'</strong></div><div class="small muted" style="margin-top:6px">'+esc(issue.message||issue.reason||'—')+'</div></div>').join('')||'<div class="entry small">Sem inconsistências abertas.</div>')):'';
|
|
511
|
+
const promotion=enterprise.promotionReadiness||null;
|
|
512
|
+
const promotionPanel=promotion?panel('Promotion readiness','<div class="grid3">'+kvItem('Status',promotion.status||'—')+kvItem('Coverage',String(promotion.coveragePercent==null?'—':promotion.coveragePercent+'%'))+kvItem('Policy',String(promotion.policyCoveragePercent==null?'—':promotion.policyCoveragePercent+'%'))+'</div><h3>Blockers</h3>'+((promotion.reasons||promotion.blockers||[]).map((reason)=>'<div class="entry small">'+esc(reason)+'</div>').join('')||'<div class="entry small">Sem blockers ativos.</div>')):'';
|
|
513
|
+
const azure=ctx.azure||null;
|
|
474
514
|
const azureInventory=azure&&azure.inventorySummary?azure.inventorySummary:{total:0,servicebus:0,eventgrid:0,sql:0,other:0};
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
515
|
+
const azurePanel=azure?panel('Azure context operacional','<div class="grid3">'+kvItem('Login',azure.authStatus&&azure.authStatus.login_active?'ativo':'ausente')+kvItem('Subscription',azure.profile&&(azure.profile.subscription_name||azure.profile.subscription_id)||'—')+kvItem('Último sync',azure.inventorySyncedAt||'—')+kvItem('Service Bus',String(azureInventory.servicebus||0))+kvItem('Event Grid',String(azureInventory.eventgrid||0))+kvItem('Azure SQL',String(azureInventory.sql||0))+'</div><div class="small muted" style="margin-top:12px">Inventário: total '+esc(azureInventory.total||0)+' · pending operations: '+esc(azure.pendingOperations||0)+' · '+esc(azure.inventoryStale&&azure.inventoryStale.stale?'stale':'fresh')+'</div>'+(azure.lastOperation?'<div class="entry" style="margin-top:12px"><div class="head"><strong>Última operação</strong>'+badge(azure.lastOperation.phase||'pending')+'</div><div class="small">'+esc(azure.lastOperation.summary||azure.lastOperation.operation_id||'—')+'</div><div class="small muted" style="margin-top:8px">'+esc(azure.lastOperation.operation_id||'—')+'</div></div>':'')):'';
|
|
516
|
+
stacks[0].insertAdjacentHTML('afterbegin',panel('Run control','<div class="grid3">'+kvItem('Run ID',activeRun.run_id||'—')+kvItem('Status',activeRun.status||'pending')+kvItem('Cursor',(activeRun.cursor&&((activeRun.cursor.wave!=null?'wave '+activeRun.cursor.wave:'')+(activeRun.cursor.task?' · '+activeRun.cursor.task:'')+(activeRun.cursor.mode?' · '+activeRun.cursor.mode:'')))||'—')+'</div><div class="actions">'+actionButton('Start','start','primary')+actionButton('Pause','pause','warnbtn')+actionButton('Resume','resume','secondary')+actionButton('Replay','replay','danger')+'</div><div class="small muted" style="margin-top:12px">Transitions: '+esc((activeRun.metrics&&activeRun.metrics.transitions)||0)+' · pause_count: '+esc((activeRun.metrics&&activeRun.metrics.pause_count)||0)+' · replay_count: '+esc((activeRun.metrics&&activeRun.metrics.replay_count)||0)+'</div>'));
|
|
517
|
+
stacks[0].insertAdjacentHTML('beforeend',panel('Mapa operacional','<div class="grid3">'+nodes+'</div><h3>Handoffs e dependências</h3>'+edges)+(gatePanel||'')+(multiAgentPanel||'')+(azurePanel||''));
|
|
518
|
+
stacks[1].insertAdjacentHTML('afterbegin',panel('Trace operacional','<div class="small muted" style="margin-bottom:12px">Arquivo: '+esc((ctx.tracing&&ctx.tracing.path)||'—')+' · total: '+esc((ctx.tracing&&ctx.tracing.summary&&ctx.tracing.summary.total)||0)+' evento(s)</div>'+trace));
|
|
519
|
+
stacks[1].insertAdjacentHTML('beforeend',panel('Camadas de memória','<div class="small muted" style="margin-bottom:12px">'+esc(((ctx.memoryLayers&&ctx.memoryLayers.readOrder)||[]).join(' → ')||'—')+'</div><div class="grid2">'+memory+'</div>')+(recoveryPanel||'')+(promotionPanel||''));
|
|
520
|
+
}
|
|
481
521
|
function setTab(next){tab=next;render();}
|
|
482
522
|
async function openSession(path){session=path||null;await refresh();tab='sessions';render();}
|
|
483
523
|
async function changeReview(status){const note=prompt('Justificativa curta para o novo estado do plano:',status==='approved'?'Plano aprovado para execução.':'');if(note==null)return;await api('/api/review/status',{method:'POST',body:JSON.stringify({status,note,author:'user',activeSession:session})});await refresh();}
|
|
484
524
|
async function addComment(){const target=document.getElementById('comment-target').value||'plan';const type=document.getElementById('comment-type').value||'note';const text=document.getElementById('comment-text').value.trim();if(!text)return alert('Escreva um comentário.');await api('/api/review/comment',{method:'POST',body:JSON.stringify({target,type,text,author:'user',activeSession:session})});document.getElementById('comment-text').value='';await refresh();}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
525
|
+
async function resolveComment(id){await api('/api/review/comment-status',{method:'POST',body:JSON.stringify({commentId:id,status:'resolved',activeSession:session})});await refresh();}
|
|
526
|
+
async function runtimeAction(action){if(runtimeDisabled())return;const reason=prompt('Motivo da transição de runtime:',action==='start'?'iniciar execução':'');if(reason==null)return;const wave=prompt('Onda atual (opcional):',ctx.activeRun&&ctx.activeRun.current_wave!=null?String(ctx.activeRun.current_wave):'');if(wave===null)return;const task=prompt('Tarefa atual (opcional):',ctx.activeRun&&ctx.activeRun.cursor&&ctx.activeRun.cursor.task?String(ctx.activeRun.cursor.task):'');if(task===null)return;await api('/api/runtime/action',{method:'POST',body:JSON.stringify({action,reason,activeSession:session,wave:wave?Number(wave):null,task:task||null})});await refresh();}
|
|
527
|
+
async function runtimeGateResolve(gateId,decision){if(runtimeDisabled())return;const needsReason=decision==='reject'||decision==='waive';const reason=needsReason?prompt('Justificativa obrigatória para '+decision+':',''):'';if(needsReason&&(!reason||!reason.trim()))return alert('Justificativa é obrigatória para '+decision+'.');await api('/api/runtime/gates/resolve',{method:'POST',body:JSON.stringify({gateId,decision,actor:'dashboard',reason:reason&&reason.trim()?reason.trim():undefined,activeSession:session})});await refresh();}
|
|
528
|
+
window.setTab=setTab;window.openSession=openSession;window.changeReview=changeReview;window.addComment=addComment;window.resolveComment=resolveComment;window.runtimeAction=runtimeAction;window.runtimeGateResolve=runtimeGateResolve;refresh().catch((err)=>{app.innerHTML='<div class="panel"><h2>Erro</h2><div class="muted">'+esc(err.message)+'</div></div>';});
|
|
488
529
|
</script></body></html>`;
|
|
489
530
|
}
|
|
490
531
|
|
|
@@ -586,6 +627,13 @@ function createDashboardServer(projectRoot, opts = {}) {
|
|
|
586
627
|
return;
|
|
587
628
|
}
|
|
588
629
|
|
|
630
|
+
if (req.method === 'POST' && reqUrl.pathname === '/api/runtime/gates/resolve') {
|
|
631
|
+
const body = await readJsonBody(req);
|
|
632
|
+
const result = await operational.resolveRuntimeGate(root, body.activeSession || opts.activeSession || null, body || {});
|
|
633
|
+
sendJson(res, 200, result);
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
|
|
589
637
|
sendJson(res, 404, { error: 'Rota não encontrada.' });
|
|
590
638
|
} catch (err) {
|
|
591
639
|
sendJson(res, 500, { error: err && err.message ? err.message : 'Erro interno.' });
|