karajan-code 4.70.4 → 5.0.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/README.md +2 -2
- package/package.json +6 -14
- package/packages/hu-board/package.json +1 -1
- package/packages/hu-board/public/app.js +4 -18
- package/packages/hu-board/public/index.html +5 -2
- package/packages/hu-board/public/styles.css +26 -0
- package/packages/hu-board/public/utils/api.js +0 -74
- package/packages/hu-board/public/utils/board-tour.js +62 -0
- package/packages/hu-board/public/utils/board-view.js +49 -144
- package/packages/hu-board/public/utils/command-launcher.js +8 -70
- package/packages/hu-board/public/utils/formatters.js +10 -0
- package/packages/hu-board/public/utils/governance-view.js +13 -1
- package/packages/hu-board/public/utils/hu-actions.js +17 -68
- package/packages/hu-board/public/utils/init-listeners.js +7 -8
- package/packages/hu-board/public/utils/log-panel.js +3 -16
- package/packages/hu-board/public/utils/maggle-mode.js +2 -12
- package/packages/hu-board/public/utils/modals.js +7 -0
- package/packages/hu-board/public/utils/project-picker-view.js +1 -1
- package/packages/hu-board/public/utils/server-push.js +3 -22
- package/packages/hu-board/public/utils/shared-board-notice.js +33 -0
- package/packages/hu-board/public/utils/story-detail-view.js +5 -19
- package/packages/hu-board/src/cleanup-zombies.js +0 -1
- package/packages/hu-board/src/command-runner.js +36 -25
- package/packages/hu-board/src/db-connection.js +282 -0
- package/packages/hu-board/src/db-paths.js +113 -0
- package/packages/hu-board/src/db-queries.js +188 -0
- package/packages/hu-board/src/db-tombstones.js +51 -0
- package/packages/hu-board/src/db.js +28 -619
- package/packages/hu-board/src/ephemeral-cleaner.js +2 -3
- package/packages/hu-board/src/hu-zombie-reaper.js +5 -1
- package/packages/hu-board/src/plan-mutations.js +3 -153
- package/packages/hu-board/src/plans-service.js +55 -0
- package/packages/hu-board/src/routes/api/commands.js +122 -0
- package/packages/hu-board/src/routes/api/plans.js +55 -0
- package/packages/hu-board/src/routes/api/projects.js +267 -0
- package/packages/hu-board/src/routes/api/prompts.js +135 -0
- package/packages/hu-board/src/routes/api/sessions.js +95 -0
- package/packages/hu-board/src/routes/api/stories.js +183 -0
- package/packages/hu-board/src/routes/api/system.js +241 -0
- package/packages/hu-board/src/routes/api/tombstones.js +38 -0
- package/packages/hu-board/src/routes/api.js +24 -1371
- package/packages/hu-board/src/routes/governance.js +23 -1
- package/packages/hu-board/src/routes/lanes.js +40 -0
- package/packages/hu-board/src/routes/rag.js +4 -3
- package/packages/hu-board/src/server.js +20 -34
- package/packages/hu-board/src/sync-files.js +318 -0
- package/packages/hu-board/src/sync-project.js +99 -0
- package/packages/hu-board/src/sync.js +22 -566
- package/packages/hu-board/src/zombie-reaper.js +1 -1
- package/scripts/dual-publish.mjs +19 -3
- package/scripts/postinstall.js +15 -2
- package/scripts/verify-pack-mcp.mjs +11 -7
- package/scripts/verify-pack.mjs +4 -4
- package/src/audit/audit-history.js +3 -2
- package/src/audit/dead-exports.js +68 -59
- package/src/audit/deterministic-summary.js +33 -13
- package/src/audit/npm-signatures.js +41 -0
- package/src/audit/sbom.js +35 -0
- package/src/checks/agent-token.js +112 -0
- package/src/checks/dir-setup.js +34 -1
- package/src/checks/native-build.js +21 -39
- package/src/checks/runner.js +128 -142
- package/src/cli/advanced-commands.js +6 -6
- package/src/cli/register-meta.js +42 -82
- package/src/cli/register-pipeline.js +8 -143
- package/src/cli/register-plan.js +9 -100
- package/src/cli/retired-commands.js +49 -0
- package/src/cli.js +18 -5
- package/src/commands/agent-run.js +40 -26
- package/src/commands/audit.js +127 -124
- package/src/commands/board.js +5 -9
- package/src/commands/check.js +29 -16
- package/src/commands/doctor.js +2 -0
- package/src/commands/env.js +176 -150
- package/src/commands/go.js +71 -53
- package/src/commands/harden.js +90 -81
- package/src/commands/hu-start.js +52 -0
- package/src/commands/hu.js +288 -221
- package/src/commands/identity.js +111 -78
- package/src/commands/init-atril.js +47 -0
- package/src/commands/init.js +11 -40
- package/src/commands/install-tools.js +70 -85
- package/src/commands/main-guard.js +78 -0
- package/src/commands/policy.js +226 -184
- package/src/commands/qmd.js +27 -21
- package/src/commands/rag.js +75 -48
- package/src/commands/review-gate.js +421 -341
- package/src/commands/start.js +4 -5
- package/src/commands/steward.js +96 -47
- package/src/commands/tournament.js +46 -37
- package/src/commands/worktree.js +94 -25
- package/src/config/loader.js +34 -17
- package/src/config/secrets.js +36 -0
- package/src/config.js +1 -0
- package/src/environment/adr.js +16 -2
- package/src/git/karajan-label.js +20 -8
- package/src/guards/main-guard.js +54 -0
- package/src/harden/hook-templates.js +16 -1
- package/src/harden/sentinel/posttooluse.mjs +18 -6
- package/src/harden/sentinel/pretooluse-sentinel.mjs +64 -36
- package/src/harden/sentinel/sentinel-lib.mjs +129 -26
- package/src/harden/sentinel/sentinel-shell.mjs +5 -16
- package/src/harden/sentinel/sessionstart.mjs +3 -2
- package/src/harden/sentinel/stop.mjs +5 -4
- package/src/harden/workflow-templates.js +1 -1
- package/src/hu/board-lookup.js +29 -0
- package/src/hu/gh-identity.js +23 -0
- package/src/hu/github-board.js +4 -2
- package/src/hu/lane-prune.js +15 -7
- package/src/hu/lane-setup.js +65 -0
- package/src/hu/lanes.js +66 -0
- package/src/hu/team-board-mirror.js +3 -2
- package/src/infrastructure/command-runner.js +1 -1
- package/src/infrastructure/file-system-service.js +1 -1
- package/src/mcp/handlers/direct-handlers.js +2 -292
- package/src/mcp/handlers/hu-handlers.js +1 -35
- package/src/mcp/handlers/management-handlers.js +2 -42
- package/src/mcp/server-handlers.js +16 -22
- package/src/mcp/tools.js +1 -196
- package/src/plan/lane-plans.js +54 -0
- package/src/plan/plan-store.js +7 -4
- package/src/policy/add.js +26 -12
- package/src/policy/adr-number-check.js +31 -0
- package/src/prompts/audit.js +299 -339
- package/src/prompts/card-context.js +10 -5
- package/src/prompts/reviewer.js +5 -2
- package/src/rag/auto-update.js +56 -43
- package/src/rag/bootstrap-index.js +28 -54
- package/src/rag/migrate.js +1 -1
- package/src/rag/onnx-fallback.js +2 -2
- package/src/rag/pid-lease.js +70 -0
- package/src/rag/project-store.js +2 -12
- package/src/review/card-first.js +57 -46
- package/src/review/gate-gitignore.js +23 -4
- package/src/review/gate-hook.js +12 -4
- package/src/review/one-shot-review.js +45 -35
- package/src/review/publish-pr.js +14 -2
- package/src/review/repo-docs.js +73 -0
- package/src/review/repo-stack.js +59 -0
- package/src/review/reviewer-fallback.js +19 -4
- package/src/review/seal-commit.js +29 -0
- package/src/review/sonar-pregate.js +59 -44
- package/src/review/third-party-review.js +90 -16
- package/src/review/third-party-size.js +43 -0
- package/src/review/third-party-skills.js +54 -0
- package/src/review/verify-pr.js +1 -24
- package/src/roles/audit-role.js +106 -125
- package/src/skills/atril-skills.js +5 -4
- package/src/sonar/scanner.js +116 -101
- package/src/steward/invariants.js +5 -4
- package/src/steward/phantom-sweep.js +66 -0
- package/src/tournament/judge.js +60 -53
- package/src/utils/gh-account.js +37 -0
- package/src/utils/git.js +0 -13
- package/src/utils/home-migration.js +7 -1
- package/src/utils/main-checkout.js +53 -0
- package/src/utils/qmd-collection.js +3 -1
- package/src/utils/welcome.js +3 -3
- package/templates/{skills → atril/commands}/kj-architect.md +5 -0
- package/templates/{skills → atril/commands}/kj-audit.md +5 -0
- package/templates/{skills → atril/commands}/kj-board.md +5 -0
- package/templates/{skills → atril/commands}/kj-code.md +5 -0
- package/templates/{skills → atril/commands}/kj-csv-transform.md +5 -0
- package/templates/{skills → atril/commands}/kj-data-report.md +5 -0
- package/templates/{skills → atril/commands}/kj-discover.md +5 -0
- package/templates/{skills → atril/commands}/kj-rag-query.md +5 -0
- package/templates/{skills → atril/commands}/kj-review.md +5 -0
- package/templates/{skills → atril/commands}/kj-security.md +5 -0
- package/templates/{skills → atril/commands}/kj-sonar.md +5 -0
- package/templates/{skills → atril/commands}/kj-sql-analysis.md +5 -0
- package/templates/{skills → atril/commands}/kj-test.md +5 -0
- package/packages/hu-board/public/utils/run-launcher.js +0 -169
- package/packages/hu-board/src/run-tracker.js +0 -121
- package/src/activity-log.js +0 -59
- package/src/agents/host-agent.js +0 -38
- package/src/agents/model-registry.js +0 -142
- package/src/audit/plan-adherence.js +0 -224
- package/src/autonomy/arbiter-role.js +0 -71
- package/src/autonomy/arbiter.js +0 -22
- package/src/autonomy/decider.js +0 -18
- package/src/autonomy/decision-resolver.js +0 -58
- package/src/autonomy/outcome-report.js +0 -55
- package/src/autonomy/stage-ask.js +0 -30
- package/src/brain/decision-tracker.js +0 -125
- package/src/brain/decisor.js +0 -243
- package/src/brain/solomon-consult.js +0 -171
- package/src/brain/standby-scheduler.js +0 -8
- package/src/budget/comparison.js +0 -96
- package/src/canvas/parse-md.js +0 -238
- package/src/canvas/schema.js +0 -101
- package/src/canvas/to-flat.js +0 -85
- package/src/canvas/validate.js +0 -163
- package/src/ci/dispatch.js +0 -99
- package/src/ci/index.js +0 -3
- package/src/ci/pr-diff.js +0 -26
- package/src/cli/register-standby.js +0 -26
- package/src/commands/architect.js +0 -111
- package/src/commands/autorun.js +0 -49
- package/src/commands/researcher.js +0 -54
- package/src/commands/resume.js +0 -72
- package/src/commands/review.js +0 -89
- package/src/commands/run.js +0 -185
- package/src/commands/standby.js +0 -117
- package/src/commands/status.js +0 -36
- package/src/commands/triage.js +0 -78
- package/src/commands/undo.js +0 -62
- package/src/domains/domain-loader.js +0 -245
- package/src/domains/domain-registry.js +0 -140
- package/src/domains/domain-synthesizer.js +0 -129
- package/src/git/automation.js +0 -433
- package/src/git/coder-commit-guard.js +0 -40
- package/src/git/hu-automation.js +0 -243
- package/src/git/hu-snapshot.js +0 -10
- package/src/git/symlink-targets.js +0 -57
- package/src/golden/asserter.js +0 -92
- package/src/golden/loader.js +0 -52
- package/src/golden/runner.js +0 -92
- package/src/golden/schema.js +0 -41
- package/src/guards/duplicate-members.js +0 -86
- package/src/guards/intent-guard.js +0 -161
- package/src/guards/perf-guard.js +0 -126
- package/src/guards/policy-guard.js +0 -90
- package/src/guards/policy-resolver.js +0 -85
- package/src/guards/secret-redactor.js +0 -71
- package/src/hu/acceptance-runner.js +0 -138
- package/src/hu/lazy-planner.js +0 -109
- package/src/hu/parallel-executor.js +0 -94
- package/src/hu/routing-metrics.js +0 -17
- package/src/hu/split-validator.js +0 -143
- package/src/hu/splitting-detector.js +0 -158
- package/src/hu/splitting-generator.js +0 -175
- package/src/hu/store.js +0 -394
- package/src/infrastructure/mocks.js +0 -182
- package/src/mcp/handlers/run-handler.js +0 -318
- package/src/mcp/sovereignty-guard.js +0 -113
- package/src/mcp/tool-arg-normalizers.js +0 -16
- package/src/mutate/reviewer-signal.js +0 -76
- package/src/orchestrator/agent-fallback.js +0 -81
- package/src/orchestrator/brain-coordinator.js +0 -186
- package/src/orchestrator/ci-integration.js +0 -139
- package/src/orchestrator/config-init.js +0 -426
- package/src/orchestrator/direct-actions.js +0 -217
- package/src/orchestrator/drivers/error-recovery.js +0 -287
- package/src/orchestrator/drivers/init-context.js +0 -238
- package/src/orchestrator/drivers/iteration-loop.js +0 -382
- package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +0 -69
- package/src/orchestrator/drivers/iteration-phases/guards.js +0 -91
- package/src/orchestrator/drivers/iteration-phases/handle-approved.js +0 -29
- package/src/orchestrator/drivers/iteration-phases/quality-gates.js +0 -125
- package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +0 -62
- package/src/orchestrator/drivers/post-loop.js +0 -404
- package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +0 -137
- package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +0 -47
- package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +0 -84
- package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +0 -393
- package/src/orchestrator/drivers/pre-loop.js +0 -524
- package/src/orchestrator/drivers/run-hu-batch.js +0 -468
- package/src/orchestrator/feedback-enrichment.js +0 -140
- package/src/orchestrator/feedback-queue.js +0 -151
- package/src/orchestrator/flow-control.js +0 -170
- package/src/orchestrator/flow-runner.js +0 -365
- package/src/orchestrator/fs-leak-detector.js +0 -228
- package/src/orchestrator/hu-scheduler.js +0 -114
- package/src/orchestrator/hu-sub-pipeline.js +0 -642
- package/src/orchestrator/iteration-gate.js +0 -73
- package/src/orchestrator/iteration-stages.js +0 -9
- package/src/orchestrator/parallel-limiter.js +0 -74
- package/src/orchestrator/pipeline-context.js +0 -72
- package/src/orchestrator/post-loop-stages.js +0 -468
- package/src/orchestrator/pre-loop-stages.js +0 -11
- package/src/orchestrator/preflight-checks.js +0 -487
- package/src/orchestrator/repair/repair-detector.js +0 -117
- package/src/orchestrator/repair/repair-runner.js +0 -142
- package/src/orchestrator/reviewer-fallback.js +0 -45
- package/src/orchestrator/role-output-compressor.js +0 -189
- package/src/orchestrator/session-journal.js +0 -308
- package/src/orchestrator/solomon-escalation.js +0 -331
- package/src/orchestrator/solomon-rules.js +0 -212
- package/src/orchestrator/stages/acceptance-coverage-stage.js +0 -47
- package/src/orchestrator/stages/architect-stage.js +0 -172
- package/src/orchestrator/stages/coder-stage.js +0 -506
- package/src/orchestrator/stages/domain-curator-stage.js +0 -82
- package/src/orchestrator/stages/format-stage.js +0 -61
- package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +0 -127
- package/src/orchestrator/stages/hu-reviewer-stage.js +0 -419
- package/src/orchestrator/stages/perf-stage.js +0 -140
- package/src/orchestrator/stages/planner-stage.js +0 -85
- package/src/orchestrator/stages/rag-context-stage.js +0 -80
- package/src/orchestrator/stages/rag-preload-decisor.js +0 -58
- package/src/orchestrator/stages/research-stage.js +0 -69
- package/src/orchestrator/stages/reviewer-stage.js +0 -431
- package/src/orchestrator/stages/sonar-stage.js +0 -439
- package/src/orchestrator/stages/stage-classes.js +0 -84
- package/src/orchestrator/stages/stage-executor.js +0 -155
- package/src/orchestrator/stages/suite-green-stage.js +0 -62
- package/src/orchestrator/stages/tdd-discipline-stage.js +0 -56
- package/src/orchestrator/stages/tool-judge-stage.js +0 -53
- package/src/orchestrator/stages/triage-stage.js +0 -172
- package/src/orchestrator/standby.js +0 -71
- package/src/orchestrator/verification-gate.js +0 -183
- package/src/orchestrator.js +0 -22
- package/src/plan/adr-generator.js +0 -170
- package/src/plan/adr-loader.js +0 -60
- package/src/plan/plan-executor.js +0 -100
- package/src/plan/plan-validation.js +0 -4
- package/src/prompts/acceptance-coverage.js +0 -32
- package/src/prompts/arbiter.js +0 -38
- package/src/prompts/architect.js +0 -103
- package/src/prompts/hu-reviewer.js +0 -244
- package/src/prompts/tool-correctness-judge.js +0 -31
- package/src/prompts/triage.js +0 -57
- package/src/rag/embedder.js +0 -2
- package/src/rag/embedders/_cloud-base.js +0 -2
- package/src/rag/embedders/cohere.js +0 -2
- package/src/rag/embedders/mistral.js +0 -2
- package/src/rag/embedders/onnx.js +0 -2
- package/src/rag/embedders/openai.js +0 -2
- package/src/rag/embedders/voyage.js +0 -2
- package/src/rag/rerank.js +0 -4
- package/src/rag/where-parser.js +0 -4
- package/src/repeat-detector.js +0 -88
- package/src/review/diff-generator.js +0 -112
- package/src/review/git-stash-helper.js +0 -104
- package/src/review/schema.js +0 -31
- package/src/review/scope-filter.js +0 -152
- package/src/review/snapshot-diff.js +0 -122
- package/src/review/tdd-discipline.js +0 -90
- package/src/review/tdd-policy.js +0 -69
- package/src/roles/acceptance-coverage-role.js +0 -78
- package/src/roles/architect-role.js +0 -77
- package/src/roles/coder-role.js +0 -113
- package/src/roles/commiter-role.js +0 -113
- package/src/roles/domain-curator-role.js +0 -134
- package/src/roles/hu-reviewer-role.js +0 -64
- package/src/roles/impeccable-role.js +0 -85
- package/src/roles/index.js +0 -18
- package/src/roles/karajan-brain-role.js +0 -134
- package/src/roles/perf-role.js +0 -122
- package/src/roles/planner-role.js +0 -151
- package/src/roles/refactorer-role.js +0 -30
- package/src/roles/repairer-role.js +0 -181
- package/src/roles/researcher-role.js +0 -70
- package/src/roles/reviewer-role.js +0 -115
- package/src/roles/security-role.js +0 -73
- package/src/roles/solomon-role.js +0 -271
- package/src/roles/sonar-role.js +0 -72
- package/src/roles/tester-role.js +0 -235
- package/src/roles/tool-correctness-judge-role.js +0 -78
- package/src/roles/triage-role.js +0 -99
- package/src/session/journal/decisions-writer.js +0 -200
- package/src/session/journal/iteration-logger.js +0 -194
- package/src/session/journal/summary-writer.js +0 -320
- package/src/session/journal/tree-writer.js +0 -164
- package/src/session/journal/write-all.js +0 -89
- package/src/session-cleanup.js +0 -116
- package/src/skills/semantic-detector.js +0 -167
- package/src/skills/skill-detector.js +0 -385
- package/src/sonar/cloud-scanner.js +0 -78
- package/src/tracker-bootstrap.js +0 -44
- package/src/types/index.js +0 -38
- package/src/types/policy.js +0 -43
- package/src/types/solomon.js +0 -87
- package/src/utils/async-lock.js +0 -31
- package/src/utils/budget.js +0 -229
- package/src/utils/cwd-confirm.js +0 -39
- package/src/utils/display/event-handlers.js +0 -403
- package/src/utils/display/formatters.js +0 -132
- package/src/utils/display/header.js +0 -47
- package/src/utils/display/session-summary.js +0 -118
- package/src/utils/display/solomon.js +0 -42
- package/src/utils/pricing.js +0 -29
- package/src/utils/quota-simulator.js +0 -56
- package/src/utils/role-assigner.js +0 -137
- package/src/utils/rtk-wrapper.js +0 -87
- package/src/utils/run-registry.js +0 -9
- package/src/utils/status-dashboard.js +0 -254
- package/src/utils/tool-call-extractor.js +0 -56
- package/src/webperf/devtools-detect.js +0 -112
- package/src/webperf/webperf-role-integration.js +0 -66
- package/templates/skills/kj-run.md +0 -73
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
import { TesterRole } from "../roles/tester-role.js";
|
|
2
|
-
import { SecurityRole } from "../roles/security-role.js";
|
|
3
|
-
import { ImpeccableRole } from "../roles/impeccable-role.js";
|
|
4
|
-
import { AuditRole } from "../roles/audit-role.js";
|
|
5
|
-
import { addCheckpoint } from "../session/store.js";
|
|
6
|
-
import { resetRetryCount } from "../session/mutators.js";
|
|
7
|
-
import { emitProgress, makeEvent } from "../utils/events.js";
|
|
8
|
-
import { invokeSolomon } from "./solomon-escalation.js";
|
|
9
|
-
|
|
10
|
-
const KNOWN_AGENTS = ["claude", "codex", "gemini"];
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Build an ordered fallback chain for a role.
|
|
14
|
-
* Primary provider first, then remaining known agents (no duplicates).
|
|
15
|
-
*/
|
|
16
|
-
function buildFallbackChain(config, roleName) {
|
|
17
|
-
const primary =
|
|
18
|
-
config?.roles?.[roleName]?.provider ||
|
|
19
|
-
config?.roles?.coder?.provider ||
|
|
20
|
-
config?.coder ||
|
|
21
|
-
"claude";
|
|
22
|
-
return [primary, ...KNOWN_AGENTS.filter((a) => a !== primary)];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Detect if a role output is an agent/spawn failure (vs a genuine evaluation failure).
|
|
27
|
-
* Agent failures have `result.error` but no `result.verdict`.
|
|
28
|
-
*/
|
|
29
|
-
function isAgentFailure(output) {
|
|
30
|
-
if (!output || output.ok) return false;
|
|
31
|
-
return Boolean(output.result?.error) && !output.result?.verdict;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Run a role (TesterRole or SecurityRole) with agent fallback chain.
|
|
36
|
-
* If the primary agent fails to start (spawn/auth failure), tries the next agent.
|
|
37
|
-
* Genuine evaluation failures (agent ran but verdict=fail) are NOT retried.
|
|
38
|
-
*
|
|
39
|
-
* @returns {{ output, provider, attempts }}
|
|
40
|
-
*/
|
|
41
|
-
async function runRoleWithFallback(RoleClass, { roleName, config, logger, emitter, eventBase, task, iteration, diff, pendingGherkinTests = null, shellTestResults = null }) {
|
|
42
|
-
const chain = buildFallbackChain(config, roleName);
|
|
43
|
-
const attempts = [];
|
|
44
|
-
|
|
45
|
-
for (const provider of chain) {
|
|
46
|
-
const overrideConfig = {
|
|
47
|
-
...config,
|
|
48
|
-
roles: { ...config.roles, [roleName]: { ...config.roles?.[roleName], provider } }
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const role = new RoleClass({ config: overrideConfig, logger, emitter });
|
|
52
|
-
await role.init({ task, iteration });
|
|
53
|
-
|
|
54
|
-
const start = Date.now();
|
|
55
|
-
let output;
|
|
56
|
-
try {
|
|
57
|
-
// Tests-first Phase 3: the tester role accepts optional extra
|
|
58
|
-
// inputs. Other roles ignore them harmlessly (they destructure
|
|
59
|
-
// only what they need from the input object).
|
|
60
|
-
output = await role.run({ task, diff, pendingGherkinTests, shellTestResults });
|
|
61
|
-
} catch (err) {
|
|
62
|
-
output = {
|
|
63
|
-
ok: false,
|
|
64
|
-
result: { error: err.message, provider },
|
|
65
|
-
summary: `${roleName} threw: ${err.message}`
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
const duration = Date.now() - start;
|
|
69
|
-
|
|
70
|
-
attempts.push({ provider, ok: output.ok, duration, summary: output.summary });
|
|
71
|
-
|
|
72
|
-
if (output.ok || !isAgentFailure(output)) {
|
|
73
|
-
return { output, provider, attempts };
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
logger.warn(`${roleName} agent "${provider}" failed (${duration}ms): ${output.summary} — trying next agent`);
|
|
77
|
-
emitProgress(emitter, makeEvent(`${roleName}:fallback`, { ...eventBase, stage: roleName }, {
|
|
78
|
-
status: "warn",
|
|
79
|
-
message: `Agent "${provider}" failed, falling back`,
|
|
80
|
-
detail: { provider, duration, summary: output.summary, remaining: chain.length - attempts.length }
|
|
81
|
-
}));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// All agents failed
|
|
85
|
-
const lastAttempt = attempts[attempts.length - 1];
|
|
86
|
-
const allProviders = attempts.map((a) => a.provider).join(", ");
|
|
87
|
-
logger.error(`${roleName}: all agents failed (${allProviders})`);
|
|
88
|
-
|
|
89
|
-
return {
|
|
90
|
-
output: {
|
|
91
|
-
ok: false,
|
|
92
|
-
result: { error: `All agents failed: ${allProviders}`, attempts },
|
|
93
|
-
summary: `All ${roleName} agents failed (${allProviders}) — check agent installation and configuration`
|
|
94
|
-
},
|
|
95
|
-
provider: lastAttempt?.provider,
|
|
96
|
-
attempts
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function runTesterStage({ config, logger, emitter, eventBase, session, coderRole, trackBudget, iteration, task, diff, askQuestion: _askQuestion, pendingGherkinTests = null, shellTestResults = null }) {
|
|
101
|
-
logger.setContext({ iteration, stage: "tester" });
|
|
102
|
-
emitProgress(
|
|
103
|
-
emitter,
|
|
104
|
-
makeEvent("tester:start", { ...eventBase, stage: "tester" }, {
|
|
105
|
-
message: "Tester evaluating test quality",
|
|
106
|
-
detail: { provider: config?.roles?.tester?.provider || config?.roles?.coder?.provider || config?.coder || "claude", executorType: "agent" }
|
|
107
|
-
})
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
const testerStart = Date.now();
|
|
111
|
-
const { output: testerOutput, provider, attempts } = await runRoleWithFallback(
|
|
112
|
-
TesterRole,
|
|
113
|
-
{
|
|
114
|
-
roleName: "tester", config, logger, emitter, eventBase, task, iteration, diff,
|
|
115
|
-
// Tests-first Phase 3 (v2.7.5): hand the tester the HU's pending
|
|
116
|
-
// Gherkin scenarios and the upstream shell-test results so it
|
|
117
|
-
// translates and reports accurately instead of re-running the
|
|
118
|
-
// gate or ignoring the behavioural spec.
|
|
119
|
-
pendingGherkinTests,
|
|
120
|
-
shellTestResults,
|
|
121
|
-
}
|
|
122
|
-
);
|
|
123
|
-
const totalDuration = Date.now() - testerStart;
|
|
124
|
-
|
|
125
|
-
trackBudget({
|
|
126
|
-
role: "tester",
|
|
127
|
-
provider: provider || coderRole.provider,
|
|
128
|
-
model: config?.roles?.tester?.model || coderRole.model,
|
|
129
|
-
result: testerOutput,
|
|
130
|
-
duration_ms: totalDuration
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
await addCheckpoint(session, {
|
|
134
|
-
stage: "tester",
|
|
135
|
-
iteration,
|
|
136
|
-
ok: testerOutput.ok,
|
|
137
|
-
provider: provider || coderRole.provider,
|
|
138
|
-
model: config?.roles?.tester?.model || coderRole.model || null,
|
|
139
|
-
attempts: attempts.length > 1 ? attempts : undefined
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
const testerProvider = provider || coderRole.provider;
|
|
143
|
-
emitProgress(
|
|
144
|
-
emitter,
|
|
145
|
-
makeEvent("tester:end", { ...eventBase, stage: "tester" }, {
|
|
146
|
-
status: testerOutput.ok ? "ok" : "fail",
|
|
147
|
-
message: testerOutput.ok ? "Tester passed" : `Tester: ${testerOutput.summary}`,
|
|
148
|
-
detail: { ok: testerOutput.ok, summary: testerOutput.summary, provider: testerProvider, executorType: "agent" }
|
|
149
|
-
})
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
if (!testerOutput.ok) {
|
|
153
|
-
// Tester failed — blocking, return to coder for correction
|
|
154
|
-
logger.warn(`Tester failed (blocking): ${testerOutput.summary}`);
|
|
155
|
-
emitProgress(
|
|
156
|
-
emitter,
|
|
157
|
-
makeEvent("tester:blocking", { ...eventBase, stage: "tester" }, {
|
|
158
|
-
status: "fail",
|
|
159
|
-
message: `Tester failed — sending back to coder for correction: ${testerOutput.summary}`,
|
|
160
|
-
detail: { summary: testerOutput.summary, blocking: true, provider: testerProvider, executorType: "agent" }
|
|
161
|
-
})
|
|
162
|
-
);
|
|
163
|
-
return {
|
|
164
|
-
action: "continue",
|
|
165
|
-
stageResult: { ...testerOutput.result, summary: testerOutput.summary, provider: testerProvider }
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
resetRetryCount(session, "tester");
|
|
170
|
-
// Propagate the full tester result (verdict, failing_scenarios,
|
|
171
|
-
// translated_scenarios, coverage…) — not just {ok, summary}. Callers
|
|
172
|
-
// in the HU sub-pipeline read `stageResult.verdict === "pass"` to
|
|
173
|
-
// decide approve-vs-feedback when Gherkin translation is involved;
|
|
174
|
-
// dropping the verdict here forced every Gherkin-bearing HU into the
|
|
175
|
-
// "fail" branch even when the tester explicitly returned pass, which
|
|
176
|
-
// burned all max_iterations and broke the FASE-2 test-diet run.
|
|
177
|
-
return {
|
|
178
|
-
action: "ok",
|
|
179
|
-
stageResult: {
|
|
180
|
-
...testerOutput.result,
|
|
181
|
-
ok: true,
|
|
182
|
-
summary: testerOutput.summary || "All tests passed",
|
|
183
|
-
provider: testerProvider,
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export async function runSecurityStage({ config, logger, emitter, eventBase, session, coderRole, trackBudget, iteration, task, diff, askQuestion, brainCtx }) {
|
|
189
|
-
logger.setContext({ iteration, stage: "security" });
|
|
190
|
-
emitProgress(
|
|
191
|
-
emitter,
|
|
192
|
-
makeEvent("security:start", { ...eventBase, stage: "security" }, {
|
|
193
|
-
message: "Security auditing code",
|
|
194
|
-
detail: { provider: config?.roles?.security?.provider || config?.roles?.coder?.provider || config?.coder || "claude", executorType: "agent" }
|
|
195
|
-
})
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
const securityStart = Date.now();
|
|
199
|
-
const { output: securityOutput, provider, attempts } = await runRoleWithFallback(
|
|
200
|
-
SecurityRole,
|
|
201
|
-
{ roleName: "security", config, logger, emitter, eventBase, task, iteration, diff }
|
|
202
|
-
);
|
|
203
|
-
const totalDuration = Date.now() - securityStart;
|
|
204
|
-
|
|
205
|
-
trackBudget({
|
|
206
|
-
role: "security",
|
|
207
|
-
provider: provider || coderRole.provider,
|
|
208
|
-
model: config?.roles?.security?.model || coderRole.model,
|
|
209
|
-
result: securityOutput,
|
|
210
|
-
duration_ms: totalDuration
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
await addCheckpoint(session, {
|
|
214
|
-
stage: "security",
|
|
215
|
-
iteration,
|
|
216
|
-
ok: securityOutput.ok,
|
|
217
|
-
provider: provider || coderRole.provider,
|
|
218
|
-
model: config?.roles?.security?.model || coderRole.model || null,
|
|
219
|
-
attempts: attempts.length > 1 ? attempts : undefined
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
const securityProvider = provider || coderRole.provider;
|
|
223
|
-
emitProgress(
|
|
224
|
-
emitter,
|
|
225
|
-
makeEvent("security:end", { ...eventBase, stage: "security" }, {
|
|
226
|
-
status: securityOutput.ok ? "ok" : "fail",
|
|
227
|
-
message: securityOutput.ok ? "Security audit passed" : `Security: ${securityOutput.summary}`,
|
|
228
|
-
detail: { ok: securityOutput.ok, summary: securityOutput.summary, provider: securityProvider, executorType: "agent" }
|
|
229
|
-
})
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
if (!securityOutput.ok) {
|
|
233
|
-
// Check if the security finding is critical (SQL injection, RCE, auth bypass, etc.)
|
|
234
|
-
const summary = (securityOutput.summary || "").toLowerCase();
|
|
235
|
-
const criticalPatterns = ["injection", "rce", "remote code", "auth bypass", "authentication bypass", "privilege escalation", "credentials exposed", "secret", "critical vulnerability"];
|
|
236
|
-
const isCritical = criticalPatterns.some((p) => summary.includes(p));
|
|
237
|
-
|
|
238
|
-
if (isCritical) {
|
|
239
|
-
// Brain: when enabled, skip Solomon — Brain handles via feedback queue
|
|
240
|
-
if (brainCtx?.enabled) {
|
|
241
|
-
logger.warn(`Brain: critical security finding — Brain will handle (Solomon bypassed): ${securityOutput.summary}`);
|
|
242
|
-
const { processRoleOutput } = await import("./brain-coordinator.js");
|
|
243
|
-
processRoleOutput(brainCtx, { roleName: "security", output: { verdict: "fail", summary: securityOutput.summary, critical: true }, iteration });
|
|
244
|
-
emitProgress(emitter, makeEvent("brain:security-critical", { ...eventBase, stage: "security" }, {
|
|
245
|
-
message: `Critical security finding — Brain handling: ${securityOutput.summary.slice(0, 200)}`,
|
|
246
|
-
detail: { summary: securityOutput.summary }
|
|
247
|
-
}));
|
|
248
|
-
return {
|
|
249
|
-
action: "continue",
|
|
250
|
-
stageResult: { ...securityOutput.result, summary: securityOutput.summary, provider: securityProvider }
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Critical security issue — escalate to Solomon/human
|
|
255
|
-
logger.warn(`Critical security finding — escalating: ${securityOutput.summary}`);
|
|
256
|
-
const solomonResult = await invokeSolomon({
|
|
257
|
-
config, logger, emitter, eventBase, stage: "security", askQuestion, session, iteration,
|
|
258
|
-
conflict: {
|
|
259
|
-
stage: "security",
|
|
260
|
-
task,
|
|
261
|
-
diff,
|
|
262
|
-
iterationCount: 1,
|
|
263
|
-
maxIterations: 1,
|
|
264
|
-
history: [{ agent: "security", feedback: securityOutput.summary }]
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
if (solomonResult.action === "pause") {
|
|
269
|
-
return { action: "pause", result: { paused: true, sessionId: session.id, question: solomonResult.question, context: "security_critical" } };
|
|
270
|
-
}
|
|
271
|
-
if (solomonResult.action === "subtask") {
|
|
272
|
-
return { action: "pause", result: { paused: true, sessionId: session.id, subtask: solomonResult.subtask, context: "security_subtask" } };
|
|
273
|
-
}
|
|
274
|
-
return { action: "ok" };
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Non-critical security findings — blocking, return to coder for correction
|
|
278
|
-
logger.warn(`Security failed (blocking): ${securityOutput.summary}`);
|
|
279
|
-
emitProgress(
|
|
280
|
-
emitter,
|
|
281
|
-
makeEvent("security:blocking", { ...eventBase, stage: "security" }, {
|
|
282
|
-
status: "fail",
|
|
283
|
-
message: `Security failed — sending back to coder for correction: ${securityOutput.summary}`,
|
|
284
|
-
detail: { summary: securityOutput.summary, blocking: true, provider: securityProvider, executorType: "agent" }
|
|
285
|
-
})
|
|
286
|
-
);
|
|
287
|
-
return {
|
|
288
|
-
action: "continue",
|
|
289
|
-
stageResult: { ...securityOutput.result, summary: securityOutput.summary, provider: securityProvider }
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
resetRetryCount(session, "security");
|
|
294
|
-
return { action: "ok", stageResult: { ok: true, summary: securityOutput.summary || "No vulnerabilities found" } };
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
export async function runImpeccableStage({ config, logger, emitter, eventBase, session, coderRole, trackBudget, iteration, task, diff, mode = "audit" }) {
|
|
298
|
-
logger.setContext({ iteration, stage: "impeccable" });
|
|
299
|
-
const isRefactoring = mode === "refactoring";
|
|
300
|
-
const startMessage = isRefactoring
|
|
301
|
-
? "Impeccable applying design refactoring"
|
|
302
|
-
: "Impeccable auditing frontend design quality";
|
|
303
|
-
emitProgress(
|
|
304
|
-
emitter,
|
|
305
|
-
makeEvent("impeccable:start", { ...eventBase, stage: "impeccable" }, {
|
|
306
|
-
message: startMessage,
|
|
307
|
-
detail: { provider: config?.roles?.impeccable?.provider || coderRole.provider, executorType: "agent", mode }
|
|
308
|
-
})
|
|
309
|
-
);
|
|
310
|
-
|
|
311
|
-
const impeccable = new ImpeccableRole({ config, logger, emitter, mode });
|
|
312
|
-
await impeccable.init({ task, iteration });
|
|
313
|
-
const impeccableStart = Date.now();
|
|
314
|
-
let impeccableOutput;
|
|
315
|
-
try {
|
|
316
|
-
impeccableOutput = await impeccable.run({ task, diff });
|
|
317
|
-
} catch (err) {
|
|
318
|
-
logger.warn(`Impeccable threw: ${err.message}`);
|
|
319
|
-
impeccableOutput = { ok: false, summary: `Impeccable error: ${err.message}`, result: { error: err.message } };
|
|
320
|
-
}
|
|
321
|
-
trackBudget({
|
|
322
|
-
role: "impeccable",
|
|
323
|
-
provider: config?.roles?.impeccable?.provider || coderRole.provider,
|
|
324
|
-
model: config?.roles?.impeccable?.model || coderRole.model,
|
|
325
|
-
result: impeccableOutput,
|
|
326
|
-
duration_ms: Date.now() - impeccableStart
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
await addCheckpoint(session, {
|
|
330
|
-
stage: "impeccable",
|
|
331
|
-
iteration,
|
|
332
|
-
ok: impeccableOutput.ok,
|
|
333
|
-
provider: config?.roles?.impeccable?.provider || coderRole.provider,
|
|
334
|
-
model: config?.roles?.impeccable?.model || coderRole.model || null
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
const verdict = impeccableOutput.result?.verdict || "APPROVED";
|
|
338
|
-
const impeccableProvider = config?.roles?.impeccable?.provider || coderRole.provider;
|
|
339
|
-
emitProgress(
|
|
340
|
-
emitter,
|
|
341
|
-
makeEvent("impeccable:end", { ...eventBase, stage: "impeccable" }, {
|
|
342
|
-
status: impeccableOutput.ok ? "ok" : "fail",
|
|
343
|
-
message: impeccableOutput.ok
|
|
344
|
-
? (verdict === "IMPROVED" ? "Impeccable applied design fixes" : "Impeccable audit passed")
|
|
345
|
-
: `Impeccable: ${impeccableOutput.summary}`,
|
|
346
|
-
detail: { provider: impeccableProvider, executorType: "agent" }
|
|
347
|
-
})
|
|
348
|
-
);
|
|
349
|
-
|
|
350
|
-
// Impeccable is advisory — failures do not block the pipeline
|
|
351
|
-
return { action: "ok", stageResult: { ok: impeccableOutput.ok, verdict, summary: impeccableOutput.summary || "No frontend design issues found" } };
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
export async function runFinalAuditStage({ config, logger, emitter, eventBase, session, coderRole, trackBudget, iteration, task, diff }) {
|
|
355
|
-
logger.setContext({ iteration, stage: "audit" });
|
|
356
|
-
emitProgress(
|
|
357
|
-
emitter,
|
|
358
|
-
makeEvent("audit:start", { ...eventBase, stage: "audit" }, {
|
|
359
|
-
message: "Final audit — verifying code quality",
|
|
360
|
-
detail: { provider: config?.roles?.audit?.provider || config?.roles?.coder?.provider || config?.coder || "claude", executorType: "agent" }
|
|
361
|
-
})
|
|
362
|
-
);
|
|
363
|
-
|
|
364
|
-
const auditStart = Date.now();
|
|
365
|
-
const { output: auditOutput, provider, attempts } = await runRoleWithFallback(
|
|
366
|
-
AuditRole,
|
|
367
|
-
{ roleName: "audit", config, logger, emitter, eventBase, task, iteration, diff }
|
|
368
|
-
);
|
|
369
|
-
const totalDuration = Date.now() - auditStart;
|
|
370
|
-
|
|
371
|
-
trackBudget({
|
|
372
|
-
role: "audit",
|
|
373
|
-
provider: provider || coderRole.provider,
|
|
374
|
-
model: config?.roles?.audit?.model || coderRole.model,
|
|
375
|
-
result: auditOutput,
|
|
376
|
-
duration_ms: totalDuration
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
await addCheckpoint(session, {
|
|
380
|
-
stage: "audit",
|
|
381
|
-
iteration,
|
|
382
|
-
ok: auditOutput.ok,
|
|
383
|
-
provider: provider || coderRole.provider,
|
|
384
|
-
model: config?.roles?.audit?.model || coderRole.model || null,
|
|
385
|
-
attempts: attempts.length > 1 ? attempts : undefined
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
const auditProvider = provider || coderRole.provider;
|
|
389
|
-
if (!auditOutput.ok) {
|
|
390
|
-
// Audit agent failed to run — treat as advisory, don't block pipeline
|
|
391
|
-
logger.warn(`Audit agent error (advisory): ${auditOutput.summary}`);
|
|
392
|
-
emitProgress(
|
|
393
|
-
emitter,
|
|
394
|
-
makeEvent("audit:end", { ...eventBase, stage: "audit" }, {
|
|
395
|
-
status: "warn",
|
|
396
|
-
message: `Audit: agent error (advisory), continuing — ${auditOutput.summary}`,
|
|
397
|
-
detail: { provider: auditProvider, executorType: "agent" }
|
|
398
|
-
})
|
|
399
|
-
);
|
|
400
|
-
return { action: "ok", stageResult: { ok: false, summary: auditOutput.summary || "Audit agent error (advisory)", auto_continued: true } };
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Parse findings from audit result
|
|
404
|
-
const result = auditOutput.result || {};
|
|
405
|
-
const summary = result.summary || {};
|
|
406
|
-
const overallHealth = summary.overallHealth || "fair";
|
|
407
|
-
const criticalCount = summary.critical || 0;
|
|
408
|
-
const highCount = summary.high || 0;
|
|
409
|
-
|
|
410
|
-
// Collect critical and high findings for feedback
|
|
411
|
-
const actionableFindings = [];
|
|
412
|
-
if (result.dimensions) {
|
|
413
|
-
for (const [dimName, dim] of Object.entries(result.dimensions)) {
|
|
414
|
-
for (const finding of (dim.findings || [])) {
|
|
415
|
-
if (finding.severity === "critical" || finding.severity === "high") {
|
|
416
|
-
actionableFindings.push({
|
|
417
|
-
dimension: dimName,
|
|
418
|
-
...finding
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
const hasActionableIssues = (overallHealth === "poor" || overallHealth === "critical") && (criticalCount > 0 || highCount > 0);
|
|
426
|
-
|
|
427
|
-
if (hasActionableIssues) {
|
|
428
|
-
// Build feedback string for the coder
|
|
429
|
-
const feedbackLines = actionableFindings.map(f => {
|
|
430
|
-
const loc = f.file ? `${f.file}${f.line ? `:${f.line}` : ""}` : "";
|
|
431
|
-
return `[${f.severity.toUpperCase()}] ${loc} ${f.description}${f.recommendation ? ` — Fix: ${f.recommendation}` : ""}`;
|
|
432
|
-
});
|
|
433
|
-
const feedback = `Audit found ${criticalCount + highCount} critical/high issue(s) that must be fixed:\n${feedbackLines.join("\n")}`;
|
|
434
|
-
|
|
435
|
-
logger.warn(`Audit: ${criticalCount + highCount} actionable issues found, sending back to coder`);
|
|
436
|
-
emitProgress(
|
|
437
|
-
emitter,
|
|
438
|
-
makeEvent("audit:end", { ...eventBase, stage: "audit" }, {
|
|
439
|
-
status: "fail",
|
|
440
|
-
message: `Audit: ${criticalCount + highCount} issue(s) found, sending back to coder`,
|
|
441
|
-
detail: { provider: auditProvider, executorType: "agent" }
|
|
442
|
-
})
|
|
443
|
-
);
|
|
444
|
-
|
|
445
|
-
return { action: "retry", feedback, stageResult: { ok: false, summary: auditOutput.summary || `${criticalCount + highCount} actionable issues` } };
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Audit passed (good/fair or no critical/high findings)
|
|
449
|
-
const hasAdvisory = (summary.medium || 0) + (summary.low || 0) > 0;
|
|
450
|
-
const certifiedMsg = hasAdvisory
|
|
451
|
-
? `Audit: CERTIFIED (with ${(summary.medium || 0) + (summary.low || 0)} advisory warning(s))`
|
|
452
|
-
: "Audit: CERTIFIED";
|
|
453
|
-
|
|
454
|
-
logger.info(certifiedMsg);
|
|
455
|
-
emitProgress(
|
|
456
|
-
emitter,
|
|
457
|
-
makeEvent("audit:end", { ...eventBase, stage: "audit" }, {
|
|
458
|
-
status: "ok",
|
|
459
|
-
message: certifiedMsg,
|
|
460
|
-
detail: { provider: auditProvider, executorType: "agent" }
|
|
461
|
-
})
|
|
462
|
-
);
|
|
463
|
-
|
|
464
|
-
return { action: "ok", stageResult: { ok: true, summary: certifiedMsg } };
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// Exported for testing
|
|
468
|
-
export { buildFallbackChain, isAgentFailure, runRoleWithFallback };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pre-loop stage functions.
|
|
3
|
-
* Implementations have been extracted into ./stages/ sub-modules.
|
|
4
|
-
* This file re-exports everything for backward compatibility.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { runTriageStage } from "./stages/triage-stage.js";
|
|
8
|
-
export { runResearcherStage } from "./stages/research-stage.js";
|
|
9
|
-
export { runArchitectStage } from "./stages/architect-stage.js";
|
|
10
|
-
export { runPlannerStage } from "./stages/planner-stage.js";
|
|
11
|
-
export { runDiscoverStage, runHuReviewerStage } from "./stages/hu-reviewer-stage.js";
|