@fitlab-ai/agent-infra 0.9.13 → 0.9.15
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 +10 -0
- package/README.zh-CN.md +10 -0
- package/bin/cli.ts +26 -9
- package/bin/internal-cli.sh +45 -0
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +126 -42
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
- package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
- package/dist/lib/defaults.json +103 -103
- package/dist/lib/fs/durable-write.js +37 -0
- package/dist/lib/fs/file-lock.js +111 -0
- package/dist/lib/host-control/audit.js +19 -0
- package/dist/lib/host-control/client.js +142 -0
- package/dist/lib/host-control/command.js +49 -0
- package/dist/lib/host-control/path.js +160 -0
- package/dist/lib/host-control/secure-fs.js +140 -0
- package/dist/lib/host-control/server.js +159 -0
- package/dist/lib/host-control/service.js +112 -0
- package/dist/lib/init.js +11 -2
- package/dist/lib/internal/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +154 -0
- package/dist/lib/internal/codex-lifecycle.js +15 -12
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/demo-promotion.js +322 -0
- package/dist/lib/internal/demo-transcript.js +454 -0
- package/dist/lib/internal/git-workflow.js +10 -6
- package/dist/lib/internal/host-control.js +28 -0
- package/dist/lib/internal/manual-validation.js +322 -0
- package/dist/lib/internal/platform-checks.js +16 -4
- package/dist/lib/internal/platform-comment.js +16 -4
- package/dist/lib/internal/platform-context.js +4 -1
- package/dist/lib/internal/platform-issue.js +12 -4
- package/dist/lib/internal/platform-metadata.js +88 -0
- package/dist/lib/internal/platform-pr-review.js +16 -3
- package/dist/lib/internal/platform-pr.js +42 -14
- package/dist/lib/internal/platform-release-notes.js +6 -3
- package/dist/lib/internal/platform-security.js +93 -0
- package/dist/lib/internal/pr-review-grade.js +14 -3
- package/dist/lib/internal/release-workflow.js +82 -89
- package/dist/lib/internal/sandbox-control.js +171 -7
- package/dist/lib/internal/task-activity.js +13 -4
- package/dist/lib/internal/task-artifact.js +19 -107
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +48 -14
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +38 -35
- package/dist/lib/internal/task-finalization.js +4 -1
- package/dist/lib/internal/task-invalidation.js +4 -1
- package/dist/lib/internal/task-ledger.js +12 -1
- package/dist/lib/internal/task-lifecycle.js +4 -1
- package/dist/lib/internal/task-operation-registry.js +519 -0
- package/dist/lib/internal/task-orchestration.js +12 -0
- package/dist/lib/internal/task-override.js +10 -3
- package/dist/lib/internal/task-qualification.js +90 -0
- package/dist/lib/internal/task-review.js +10 -52
- package/dist/lib/internal/task-short-id.js +11 -1
- package/dist/lib/internal/task-snapshot.js +4 -1
- package/dist/lib/internal/task-validate.js +37 -12
- package/dist/lib/internal/task-verify.js +5 -1
- package/dist/lib/internal/task-warning.js +8 -1
- package/dist/lib/owned-path.js +33 -0
- package/dist/lib/platform/check-status.js +11 -0
- package/dist/lib/platform/comment-safety.js +229 -0
- package/dist/lib/platform/completion-backfill.js +1 -1
- package/dist/lib/platform/github-data.js +241 -0
- package/dist/lib/platform/github-provider.js +248 -26
- package/dist/lib/platform/issue-comments.js +146 -34
- package/dist/lib/platform/issues.js +1 -179
- package/dist/lib/platform/pr-change-report.js +6 -12
- package/dist/lib/platform/pr-checks.js +12 -65
- package/dist/lib/platform/pr-summary.js +83 -10
- package/dist/lib/platform/provider-contract.d.ts +67 -1
- package/dist/lib/platform/provider-contract.js +6 -2
- package/dist/lib/platform/provider-validation.js +76 -3
- package/dist/lib/platform/pull-requests.js +117 -275
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/snapshots.js +2 -0
- package/dist/lib/platform/verification-sync.js +154 -162
- package/dist/lib/process-data/index.js +7 -0
- package/dist/lib/release/workflow.js +1 -1
- package/dist/lib/run/index.js +5 -0
- package/dist/lib/sandbox/commands/control-status.js +22 -0
- package/dist/lib/sandbox/commands/create.js +39 -8
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +3 -807
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/audit.js +203 -0
- package/dist/lib/sandbox/control/client.js +125 -12
- package/dist/lib/sandbox/control/completed-reentry.js +85 -0
- package/dist/lib/sandbox/control/container-identity.js +28 -31
- package/dist/lib/sandbox/control/executor.js +233 -34
- package/dist/lib/sandbox/control/finalization-response.js +27 -0
- package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
- package/dist/lib/sandbox/control/lifecycle.js +656 -128
- package/dist/lib/sandbox/control/native-file-lock.js +85 -0
- package/dist/lib/sandbox/control/protocol.js +55 -4
- package/dist/lib/sandbox/control/server.js +720 -79
- package/dist/lib/sandbox/control/state.js +63 -3
- package/dist/lib/sandbox/control/task-view.js +183 -0
- package/dist/lib/sandbox/control/task-workflow.js +74 -0
- package/dist/lib/sandbox/control/workflow-executor.js +99 -0
- package/dist/lib/sandbox/engines/authority.js +289 -0
- package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
- package/dist/lib/sandbox/index.js +7 -2
- package/dist/lib/sandbox/recovery.js +49 -5
- package/dist/lib/sandbox/removal.js +1717 -0
- package/dist/lib/sandbox/task-cleanup.js +217 -0
- package/dist/lib/sandbox/workspace-view.js +15 -15
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- package/dist/lib/task/activity-intent.js +2 -1
- package/dist/lib/task/activity-log.js +30 -24
- package/dist/lib/task/artifact-command.js +101 -0
- package/dist/lib/task/artifact-lifecycle.js +71 -40
- package/dist/lib/task/artifact-name.js +36 -0
- package/dist/lib/task/artifact-operations.js +474 -0
- package/dist/lib/task/artifact-receipts.js +3 -15
- package/dist/lib/task/artifact-repair-intent.js +130 -0
- package/dist/lib/task/artifact-schema.js +127 -0
- package/dist/lib/task/capabilities.js +83 -19
- package/dist/lib/task/codex-orchestration.js +71 -25
- package/dist/lib/task/commit-identity.js +28 -0
- package/dist/lib/task/commit-operation.js +2 -16
- package/dist/lib/task/control-authority.js +375 -5
- package/dist/lib/task/control-recovery.js +128 -0
- package/dist/lib/task/create-service.js +103 -4
- package/dist/lib/task/create.js +80 -2
- package/dist/lib/task/decision-details.js +2 -46
- package/dist/lib/task/events.js +306 -76
- package/dist/lib/task/finalization-state.js +9 -0
- package/dist/lib/task/human-override.js +3 -6
- package/dist/lib/task/implementation-inputs.js +3 -3
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/intermediate-cleanup.js +383 -0
- package/dist/lib/task/invalidation.js +18 -65
- package/dist/lib/task/ledger-intents.js +7 -22
- package/dist/lib/task/ledger.js +1 -3
- package/dist/lib/task/lifecycle.js +19 -1
- package/dist/lib/task/local-artifact-finalization.js +190 -290
- package/dist/lib/task/manual-validation-completion.js +26 -0
- package/dist/lib/task/manual-validation-evidence.js +130 -0
- package/dist/lib/task/manual-validation-receipt.js +101 -0
- package/dist/lib/task/manual-validation-shared.js +40 -0
- package/dist/lib/task/manual-validation-transaction.js +243 -0
- package/dist/lib/task/markdown.js +47 -0
- package/dist/lib/task/orchestration.js +206 -69
- package/dist/lib/task/qualification-audit.js +476 -0
- package/dist/lib/task/qualification-confirmation.js +109 -0
- package/dist/lib/task/qualification-intents.js +148 -0
- package/dist/lib/task/review-artifacts.js +23 -40
- package/dist/lib/task/review-command.js +25 -0
- package/dist/lib/task/review-finalization.js +146 -97
- package/dist/lib/task/review-fingerprint.js +2 -2
- package/dist/lib/task/sections.js +34 -54
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +170 -327
- package/dist/lib/task/verification.js +1 -1
- package/dist/lib/task/workflow-command.js +17 -0
- package/dist/lib/task/workflow-warning-intents.js +0 -16
- package/dist/lib/task/workflow-warnings.js +28 -2
- package/dist/lib/update.js +2 -0
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
- package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
- package/lib/fs/durable-write.ts +29 -0
- package/lib/fs/file-lock.ts +113 -0
- package/lib/host-control/audit.ts +22 -0
- package/lib/host-control/client.ts +172 -0
- package/lib/host-control/command.ts +60 -0
- package/lib/host-control/path.ts +167 -0
- package/lib/host-control/secure-fs.ts +135 -0
- package/lib/host-control/server.ts +180 -0
- package/lib/host-control/service.ts +133 -0
- package/lib/init.ts +15 -2
- package/lib/internal/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +142 -0
- package/lib/internal/codex-lifecycle.ts +14 -12
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/demo-promotion.ts +354 -0
- package/lib/internal/demo-transcript.ts +419 -0
- package/lib/internal/git-workflow.ts +9 -6
- package/lib/internal/host-control.ts +28 -0
- package/lib/internal/manual-validation.ts +306 -0
- package/lib/internal/platform-checks.ts +12 -4
- package/lib/internal/platform-comment.ts +12 -4
- package/lib/internal/platform-context.ts +3 -1
- package/lib/internal/platform-issue.ts +11 -4
- package/lib/internal/platform-metadata.ts +70 -0
- package/lib/internal/platform-pr-review.ts +14 -3
- package/lib/internal/platform-pr.ts +38 -14
- package/lib/internal/platform-release-notes.ts +5 -3
- package/lib/internal/platform-security.ts +83 -0
- package/lib/internal/pr-review-grade.ts +10 -3
- package/lib/internal/release-workflow.ts +91 -87
- package/lib/internal/sandbox-control.ts +181 -6
- package/lib/internal/task-activity.ts +12 -4
- package/lib/internal/task-artifact.ts +15 -79
- package/lib/internal/task-context.ts +3 -1
- package/lib/internal/task-create.ts +76 -15
- package/lib/internal/task-delivery.ts +3 -1
- package/lib/internal/task-event.ts +21 -10
- package/lib/internal/task-finalization.ts +3 -1
- package/lib/internal/task-invalidation.ts +3 -1
- package/lib/internal/task-ledger.ts +11 -1
- package/lib/internal/task-lifecycle.ts +3 -1
- package/lib/internal/task-operation-registry.ts +590 -0
- package/lib/internal/task-orchestration.ts +12 -0
- package/lib/internal/task-override.ts +9 -3
- package/lib/internal/task-qualification.ts +61 -0
- package/lib/internal/task-review.ts +7 -50
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +32 -12
- package/lib/internal/task-verify.ts +4 -1
- package/lib/internal/task-warning.ts +7 -1
- package/lib/owned-path.ts +26 -0
- package/lib/platform/check-status.ts +9 -0
- package/lib/platform/comment-safety.ts +255 -0
- package/lib/platform/completion-backfill.ts +1 -1
- package/lib/platform/github-data.ts +322 -0
- package/lib/platform/github-provider.ts +244 -27
- package/lib/platform/issue-comments.ts +159 -35
- package/lib/platform/issues.ts +4 -245
- package/lib/platform/pr-change-report.ts +6 -12
- package/lib/platform/pr-checks.ts +13 -77
- package/lib/platform/pr-summary.ts +88 -11
- package/lib/platform/provider-contract.ts +78 -3
- package/lib/platform/provider-validation.ts +85 -3
- package/lib/platform/pull-requests.ts +129 -348
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/snapshots.ts +53 -0
- package/lib/platform/verification-sync.ts +171 -177
- package/lib/process-data/index.ts +7 -0
- package/lib/release/workflow.ts +3 -3
- package/lib/run/index.ts +5 -0
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +53 -12
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +3 -996
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/audit.ts +253 -0
- package/lib/sandbox/control/client.ts +150 -13
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +262 -37
- package/lib/sandbox/control/finalization-response.ts +29 -0
- package/lib/sandbox/control/identity-sentinel.ts +137 -0
- package/lib/sandbox/control/lifecycle.ts +672 -18
- package/lib/sandbox/control/native-file-lock.ts +108 -0
- package/lib/sandbox/control/protocol.ts +80 -8
- package/lib/sandbox/control/server.ts +779 -82
- package/lib/sandbox/control/state.ts +84 -3
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/control/task-workflow.ts +95 -0
- package/lib/sandbox/control/workflow-executor.ts +102 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +9 -2
- package/lib/sandbox/recovery.ts +49 -6
- package/lib/sandbox/removal.ts +2144 -0
- package/lib/sandbox/task-cleanup.ts +209 -0
- package/lib/sandbox/workspace-view.ts +26 -18
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/task/activity-intent.ts +2 -2
- package/lib/task/activity-log.ts +27 -19
- package/lib/task/artifact-command.ts +104 -0
- package/lib/task/artifact-lifecycle.ts +66 -39
- package/lib/task/artifact-name.ts +55 -0
- package/lib/task/artifact-operations.ts +580 -0
- package/lib/task/artifact-receipts.ts +3 -14
- package/lib/task/artifact-repair-intent.ts +152 -0
- package/lib/task/artifact-schema.ts +163 -0
- package/lib/task/capabilities.ts +82 -22
- package/lib/task/codex-orchestration.ts +85 -24
- package/lib/task/commit-identity.ts +31 -0
- package/lib/task/commit-operation.ts +2 -16
- package/lib/task/control-authority.ts +513 -6
- package/lib/task/control-recovery.ts +174 -0
- package/lib/task/create-service.ts +131 -6
- package/lib/task/create.ts +83 -1
- package/lib/task/decision-details.ts +3 -71
- package/lib/task/events.ts +292 -75
- package/lib/task/finalization-state.ts +11 -0
- package/lib/task/human-override.ts +3 -8
- package/lib/task/implementation-inputs.ts +3 -3
- package/lib/task/index.ts +16 -3
- package/lib/task/intermediate-cleanup.ts +455 -0
- package/lib/task/invalidation.ts +18 -62
- package/lib/task/ledger-intents.ts +7 -24
- package/lib/task/ledger.ts +1 -3
- package/lib/task/lifecycle.ts +17 -1
- package/lib/task/local-artifact-finalization.ts +223 -388
- package/lib/task/manual-validation-completion.ts +40 -0
- package/lib/task/manual-validation-evidence.ts +209 -0
- package/lib/task/manual-validation-receipt.ts +152 -0
- package/lib/task/manual-validation-shared.ts +50 -0
- package/lib/task/manual-validation-transaction.ts +304 -0
- package/lib/task/markdown.ts +70 -0
- package/lib/task/orchestration.ts +191 -68
- package/lib/task/qualification-audit.ts +588 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -41
- package/lib/task/review-command.ts +23 -0
- package/lib/task/review-finalization.ts +154 -153
- package/lib/task/review-fingerprint.ts +2 -2
- package/lib/task/sections.ts +33 -52
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +165 -370
- package/lib/task/verification-types.ts +17 -0
- package/lib/task/verification.ts +1 -1
- package/lib/task/workflow-command.ts +18 -0
- package/lib/task/workflow-warning-intents.ts +0 -13
- package/lib/task/workflow-warnings.ts +21 -2
- package/lib/update.ts +6 -0
- package/package.json +7 -2
- package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
- package/templates/.agents/rules/README.en.md +2 -0
- package/templates/.agents/rules/README.zh-CN.md +2 -0
- package/templates/.agents/rules/decision-qualification.en.md +22 -0
- package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
- package/templates/.agents/rules/evidence-reporting.en.md +28 -0
- package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
- package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
- package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
- package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
- package/templates/.agents/rules/security-alerts.en.md +8 -8
- package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
- package/templates/.agents/rules/testing-discipline.en.md +2 -0
- package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
- package/templates/.agents/scripts/package.json +3 -0
- package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
- package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
- package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
- package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
- package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
- package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
- package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
- package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
- package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
- package/templates/.agents/skills/release/SKILL.en.md +7 -3
- package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
- package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
- package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
- package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
- package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/test/SKILL.en.md +29 -7
- package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
- package/templates/.agents/templates/task.en.md +6 -0
- package/templates/.agents/templates/task.zh-CN.md +6 -0
- package/templates/.claude/commands/run-manual-validation.en.md +1 -1
- package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
- package/dist/lib/platform/adapters.js +0 -56
- package/lib/platform/adapters.ts +0 -197
- package/templates/.agents/scripts/security-alerts.github.sh +0 -151
- package/templates/.agents/scripts/security-alerts.sh +0 -31
- package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
- package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
4
|
|
|
5
|
+
import { artifactName, maxArtifactRound } from './artifact-name.ts';
|
|
5
6
|
import { parseTypedTaskFrontmatter } from './frontmatter.ts';
|
|
6
7
|
import { validateCurrentTaskContract } from './current-contract.ts';
|
|
7
8
|
import { parseReviewSummary } from './review-artifacts.ts';
|
|
@@ -39,6 +40,7 @@ import type {
|
|
|
39
40
|
OrchestrationModelPolicy,
|
|
40
41
|
OrchestrationRolePolicy
|
|
41
42
|
} from '../agent-clients/types.ts';
|
|
43
|
+
import type { LifecycleRecoveryAttestationV1 } from './control-authority.ts';
|
|
42
44
|
import {
|
|
43
45
|
captureRepositorySnapshot,
|
|
44
46
|
captureWorkspaceSnapshot,
|
|
@@ -154,6 +156,7 @@ type OrchestrationCompletionPlanResult = Readonly<{
|
|
|
154
156
|
type OrchestrationOptions = {
|
|
155
157
|
repoRoot?: string;
|
|
156
158
|
gitWorktreeRoot?: string;
|
|
159
|
+
diagnosticLog?: OrchestrationDiagnosticLogger;
|
|
157
160
|
id?: () => string;
|
|
158
161
|
now?: () => string;
|
|
159
162
|
maxSteps?: number;
|
|
@@ -172,12 +175,17 @@ type OrchestrationOptions = {
|
|
|
172
175
|
supportsLifecycleDelegation?: (client: AgentClientId) => boolean;
|
|
173
176
|
validateLifecycleCapability?: () => Exclude<OrchestrationResult['error'], null> | null;
|
|
174
177
|
consumeLifecycleCapability?: () => Exclude<OrchestrationResult['error'], null> | null;
|
|
178
|
+
lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
|
|
175
179
|
token?: () => string;
|
|
176
180
|
monotonicNow?: () => number;
|
|
177
181
|
sleep?: (milliseconds: number) => Promise<void>;
|
|
178
182
|
hasActiveLifecycleEvidence?: (receipt: DelegationReceipt) => boolean;
|
|
179
183
|
};
|
|
180
184
|
|
|
185
|
+
export type OrchestrationDiagnosticValue = string | number | boolean | null;
|
|
186
|
+
export type OrchestrationDiagnosticFields = Readonly<Record<string, OrchestrationDiagnosticValue>>;
|
|
187
|
+
export type OrchestrationDiagnosticLogger = (event: string, fields: OrchestrationDiagnosticFields) => void;
|
|
188
|
+
|
|
181
189
|
function supportsLifecycleDelegation(client: AgentClientId): boolean {
|
|
182
190
|
return getAgentClientCapability(client, 'subagents').level !== 'unsupported'
|
|
183
191
|
&& getAgentClientCapability(client, 'orchestration').level !== 'unsupported'
|
|
@@ -194,11 +202,13 @@ const ORCHESTRATION_STATE_INVALID_MESSAGE = 'orchestration.json does not match t
|
|
|
194
202
|
class OrchestrationStateError extends Error {
|
|
195
203
|
readonly code = 'ORCHESTRATION_STATE_INVALID';
|
|
196
204
|
readonly taskId: string | null;
|
|
205
|
+
readonly reasonCodes: readonly string[];
|
|
197
206
|
|
|
198
|
-
constructor(taskId: string | null = null) {
|
|
207
|
+
constructor(taskId: string | null = null, reasonCodes: readonly string[] = []) {
|
|
199
208
|
super(ORCHESTRATION_STATE_INVALID_MESSAGE);
|
|
200
209
|
this.name = 'OrchestrationStateError';
|
|
201
210
|
this.taskId = taskId;
|
|
211
|
+
this.reasonCodes = Object.freeze([...reasonCodes]);
|
|
202
212
|
}
|
|
203
213
|
}
|
|
204
214
|
|
|
@@ -268,7 +278,7 @@ function isRecovery(value: unknown): value is OrchestrationRecovery {
|
|
|
268
278
|
&& value.resultingStatus === 'running';
|
|
269
279
|
}
|
|
270
280
|
|
|
271
|
-
function isCompletionEvidence(value: unknown): value is CleanCompletionEvidence {
|
|
281
|
+
export function isCompletionEvidence(value: unknown): value is CleanCompletionEvidence {
|
|
272
282
|
return hasExactKeys(value, [
|
|
273
283
|
'kind', 'observedAt', 'head', 'headTree', 'worktreeTree', 'lastReviewedCommit', 'prNumber', 'prHead'
|
|
274
284
|
])
|
|
@@ -288,46 +298,128 @@ const ORCHESTRATION_RUN_KEYS = [
|
|
|
288
298
|
'pause', 'commitAuthorization', 'completionEvidence', 'createdAt', 'updatedAt'
|
|
289
299
|
] as const;
|
|
290
300
|
|
|
291
|
-
function
|
|
292
|
-
if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
301
|
+
function orchestrationStateReasonCodes(value: unknown, expectedTaskId?: string): string[] {
|
|
302
|
+
if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)) return ['top-level-keys'];
|
|
303
|
+
const record = value;
|
|
304
|
+
const reasons: string[] = [];
|
|
305
|
+
if (!exactText(record.taskId)) reasons.push('taskId');
|
|
306
|
+
else if (expectedTaskId !== undefined && record.taskId !== expectedTaskId) reasons.push('taskId-mismatch');
|
|
307
|
+
if (!exactText(record.runId)) reasons.push('runId');
|
|
308
|
+
if (!['running', 'paused', 'completed'].includes(record.status as string)) reasons.push('status');
|
|
309
|
+
if (!(record.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(record.nextStage as string))) {
|
|
310
|
+
reasons.push('nextStage');
|
|
311
|
+
}
|
|
312
|
+
if (!Number.isSafeInteger(record.stepCount) || (record.stepCount as number) < 0) reasons.push('stepCount');
|
|
313
|
+
if (!Number.isSafeInteger(record.maxSteps) || (record.maxSteps as number) < 1) reasons.push('maxSteps');
|
|
314
|
+
if (!isModelPolicy(record.modelPolicy)) reasons.push('modelPolicy');
|
|
315
|
+
if (!isModelPolicySource(record.modelPolicySource)) reasons.push('modelPolicySource');
|
|
316
|
+
if (!Array.isArray(record.recoveryHistory) || !record.recoveryHistory.every(isRecovery)) reasons.push('recoveryHistory');
|
|
317
|
+
if (typeof record.baseline !== 'string') reasons.push('baseline');
|
|
318
|
+
if (!(record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) reasons.push('pendingDelegation');
|
|
319
|
+
if (!Array.isArray(record.receipts) || !record.receipts.every(isDelegationReceipt)) reasons.push('receipts');
|
|
320
|
+
if (!(record.pause === null || isPause(record.pause))) reasons.push('pause');
|
|
321
|
+
if (!hasExactKeys(record.commitAuthorization, ['issuedAt', 'consumedAt'])) {
|
|
322
|
+
reasons.push('commitAuthorization');
|
|
323
|
+
} else {
|
|
324
|
+
if (!nullableText(record.commitAuthorization.issuedAt)) reasons.push('commitAuthorization.issuedAt');
|
|
325
|
+
if (!nullableText(record.commitAuthorization.consumedAt)) reasons.push('commitAuthorization.consumedAt');
|
|
326
|
+
}
|
|
327
|
+
if (!(record.completionEvidence === null || isCompletionEvidence(record.completionEvidence))) reasons.push('completionEvidence');
|
|
328
|
+
if (!exactText(record.createdAt)) reasons.push('createdAt');
|
|
329
|
+
if (!exactText(record.updatedAt)) reasons.push('updatedAt');
|
|
330
|
+
if (Array.isArray(record.receipts) && record.receipts.every(isDelegationReceipt)
|
|
331
|
+
&& (record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) {
|
|
332
|
+
const receipts = [...record.receipts, ...(record.pendingDelegation ? [record.pendingDelegation] : [])];
|
|
333
|
+
if (receipts.some((receipt) => receipt.taskId !== record.taskId || receipt.runId !== record.runId)) {
|
|
334
|
+
reasons.push('receipt-identity');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return reasons;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function emitDiagnostic(options: Pick<OrchestrationOptions, 'diagnosticLog'> | undefined, event: string, fields: OrchestrationDiagnosticFields): void {
|
|
341
|
+
try {
|
|
342
|
+
options?.diagnosticLog?.(event, fields);
|
|
343
|
+
} catch {
|
|
344
|
+
// Diagnostics must never change lifecycle behavior.
|
|
314
345
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function fileObservation(file: string): OrchestrationDiagnosticFields {
|
|
349
|
+
try {
|
|
350
|
+
const stat = fs.lstatSync(file);
|
|
351
|
+
let realpath: string | null = null;
|
|
352
|
+
try { realpath = fs.realpathSync.native(file); } catch { /* retain the lstat observation */ }
|
|
353
|
+
return {
|
|
354
|
+
file,
|
|
355
|
+
exists: true,
|
|
356
|
+
fileType: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',
|
|
357
|
+
symbolicLink: stat.isSymbolicLink(),
|
|
358
|
+
bytes: stat.isFile() ? stat.size : null,
|
|
359
|
+
mtimeMs: stat.mtimeMs,
|
|
360
|
+
device: stat.dev,
|
|
361
|
+
inode: stat.ino,
|
|
362
|
+
realpath
|
|
363
|
+
};
|
|
364
|
+
} catch (error) {
|
|
365
|
+
return {
|
|
366
|
+
file,
|
|
367
|
+
exists: false,
|
|
368
|
+
fileType: null,
|
|
369
|
+
symbolicLink: null,
|
|
370
|
+
bytes: null,
|
|
371
|
+
mtimeMs: null,
|
|
372
|
+
device: null,
|
|
373
|
+
inode: null,
|
|
374
|
+
realpath: null,
|
|
375
|
+
fsError: error instanceof Error && 'code' in error ? String(error.code) : null
|
|
376
|
+
};
|
|
318
377
|
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function parseOrchestrationRun(value: unknown, expectedTaskId?: string): OrchestrationRun {
|
|
381
|
+
const reasonCodes = orchestrationStateReasonCodes(value, expectedTaskId);
|
|
382
|
+
if (reasonCodes.length > 0) throw new OrchestrationStateError(expectedTaskId ?? null, reasonCodes);
|
|
319
383
|
return value as OrchestrationRun;
|
|
320
384
|
}
|
|
321
385
|
|
|
322
|
-
function readRun(taskDir: string): OrchestrationRun | null {
|
|
386
|
+
function readRun(taskDir: string, options: Pick<OrchestrationOptions, 'diagnosticLog'> = {}): OrchestrationRun | null {
|
|
323
387
|
const file = orchestrationPath(taskDir);
|
|
324
|
-
if (!fs.existsSync(file)) return null;
|
|
325
388
|
const taskId = path.basename(taskDir);
|
|
389
|
+
const observed = options.diagnosticLog ? fileObservation(file) : {};
|
|
390
|
+
if (!fs.existsSync(file)) {
|
|
391
|
+
emitDiagnostic(options, 'orchestration-state-missing', { taskId, taskDir, ...observed });
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
emitDiagnostic(options, 'orchestration-state-read-start', { taskId, taskDir, ...observed });
|
|
395
|
+
let rawBytes: number | null = null;
|
|
396
|
+
let rawSha256: string | null = null;
|
|
326
397
|
try {
|
|
327
|
-
|
|
398
|
+
const raw = fs.readFileSync(file, 'utf8');
|
|
399
|
+
if (options.diagnosticLog) {
|
|
400
|
+
rawBytes = Buffer.byteLength(raw, 'utf8');
|
|
401
|
+
rawSha256 = createHash('sha256').update(raw, 'utf8').digest('hex');
|
|
402
|
+
}
|
|
403
|
+
const run = parseOrchestrationRun(JSON.parse(raw), taskId);
|
|
404
|
+
emitDiagnostic(options, 'orchestration-state-read-ok', {
|
|
405
|
+
taskId, taskDir, file, rawBytes, rawSha256, status: run.status, runId: run.runId,
|
|
406
|
+
stepCount: run.stepCount, pendingDelegation: run.pendingDelegation !== null
|
|
407
|
+
});
|
|
408
|
+
return run;
|
|
328
409
|
} catch (error) {
|
|
329
|
-
|
|
330
|
-
|
|
410
|
+
const reasonCodes = error instanceof OrchestrationStateError && error.reasonCodes.length > 0
|
|
411
|
+
? error.reasonCodes
|
|
412
|
+
: [error instanceof SyntaxError ? 'json-parse' : 'file-read'];
|
|
413
|
+
emitDiagnostic(options, 'orchestration-state-read-failed', {
|
|
414
|
+
taskId,
|
|
415
|
+
taskDir,
|
|
416
|
+
...observed,
|
|
417
|
+
rawBytes,
|
|
418
|
+
rawSha256,
|
|
419
|
+
reasonCodes: reasonCodes.join(','),
|
|
420
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
421
|
+
});
|
|
422
|
+
throw new OrchestrationStateError(taskId, reasonCodes);
|
|
331
423
|
}
|
|
332
424
|
}
|
|
333
425
|
|
|
@@ -417,7 +509,7 @@ function beginOrResumeOrchestration(taskRef: string, options: OrchestrationOptio
|
|
|
417
509
|
}
|
|
418
510
|
let existing: OrchestrationRun | null;
|
|
419
511
|
try {
|
|
420
|
-
existing = readRun(resolved.taskDir);
|
|
512
|
+
existing = readRun(resolved.taskDir, options);
|
|
421
513
|
} catch (error) {
|
|
422
514
|
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
423
515
|
}
|
|
@@ -515,25 +607,13 @@ function beginOrResumeOrchestration(taskRef: string, options: OrchestrationOptio
|
|
|
515
607
|
return { status: 'running', changed: true, taskId: resolved.taskId, run, next: null, error: null };
|
|
516
608
|
}
|
|
517
609
|
|
|
518
|
-
function highestRound(taskDir: string, family: string): number {
|
|
519
|
-
const pattern = new RegExp(`^${family}(?:-r(\\d+))?\\.md$`);
|
|
520
|
-
return fs.readdirSync(taskDir).reduce((max, name) => {
|
|
521
|
-
const match = pattern.exec(name);
|
|
522
|
-
return match ? Math.max(max, match[1] ? Number(match[1]) : 1) : max;
|
|
523
|
-
}, 0);
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
function artifactName(family: string, round: number): string {
|
|
527
|
-
return round === 1 ? `${family}.md` : `${family}-r${round}.md`;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
610
|
function validateSavedCurrentDiffBase(
|
|
531
611
|
repoRoot: string,
|
|
532
612
|
metadata: ReturnType<typeof parseTypedTaskFrontmatter>,
|
|
533
613
|
taskDir: string,
|
|
534
614
|
reviewedHead: string
|
|
535
615
|
): Readonly<{ code: string; message: string }> | null {
|
|
536
|
-
const reviewRound =
|
|
616
|
+
const reviewRound = maxArtifactRound(fs.readdirSync(taskDir), 'review-code');
|
|
537
617
|
const reviewContent = fs.readFileSync(path.join(taskDir, artifactName('review-code', reviewRound)), 'utf8');
|
|
538
618
|
const savedTargetHead = extractReviewTargetHead(reviewContent);
|
|
539
619
|
const savedDiffBase = extractReviewDiffBase(reviewContent);
|
|
@@ -571,10 +651,9 @@ function routeFromFacts(facts: LifecycleFacts): Omit<OrchestrationNext, 'request
|
|
|
571
651
|
const action = recommendation.action;
|
|
572
652
|
if (action === 'manual-validation' || action === 'validation-run') return null;
|
|
573
653
|
const family = action === 'analysis' ? 'analysis' : action;
|
|
574
|
-
const round =
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
})) + 1;
|
|
654
|
+
const round = maxArtifactRound([
|
|
655
|
+
...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])
|
|
656
|
+
], family) + 1;
|
|
578
657
|
const command = action === 'analysis' ? 'analyze-task' : action === 'plan' ? 'plan-task' : action === 'code' ? 'code-task' : action;
|
|
579
658
|
const role = action.startsWith('review-') ? 'reviewer' : 'executor';
|
|
580
659
|
return { action: command, role, stage: action, round, artifact: artifactName(family, round) };
|
|
@@ -616,7 +695,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
|
|
|
616
695
|
}
|
|
617
696
|
let run: OrchestrationRun | null;
|
|
618
697
|
try {
|
|
619
|
-
run = readRun(resolved.taskDir);
|
|
698
|
+
run = readRun(resolved.taskDir, options);
|
|
620
699
|
} catch (error) {
|
|
621
700
|
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
622
701
|
}
|
|
@@ -630,7 +709,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
|
|
|
630
709
|
const routed = routeFromFacts(facts.facts);
|
|
631
710
|
if (!routed) return failed('ORCHESTRATION_ROUTE_UNKNOWN', 'cannot determine a unique lifecycle action', resolved.taskId);
|
|
632
711
|
if ('completion' in routed) {
|
|
633
|
-
const reviewRound =
|
|
712
|
+
const reviewRound = maxArtifactRound(fs.readdirSync(resolved.taskDir), 'review-code');
|
|
634
713
|
const review = parseReviewSummary(fs.readFileSync(
|
|
635
714
|
path.join(resolved.taskDir, artifactName('review-code', reviewRound)),
|
|
636
715
|
'utf8'
|
|
@@ -729,7 +808,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
|
|
|
729
808
|
function statusOrchestration(taskRef: string, options: OrchestrationOptions = {}): OrchestrationResult {
|
|
730
809
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
731
810
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
732
|
-
const run = readRun(resolved.taskDir);
|
|
811
|
+
const run = readRun(resolved.taskDir, options);
|
|
733
812
|
if (!run) return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
|
|
734
813
|
return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
|
|
735
814
|
}
|
|
@@ -741,6 +820,7 @@ function prepareOrchestrationDelegationUnlocked(
|
|
|
741
820
|
requestedModel?: string;
|
|
742
821
|
requestedReasoningEffort?: string;
|
|
743
822
|
lifecycleProvenance?: DelegationLifecycleProvenance;
|
|
823
|
+
lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
|
|
744
824
|
}>,
|
|
745
825
|
options: OrchestrationOptions = {}
|
|
746
826
|
): OrchestrationResult {
|
|
@@ -749,7 +829,15 @@ function prepareOrchestrationDelegationUnlocked(
|
|
|
749
829
|
if (!(options.supportsLifecycleDelegation ?? supportsLifecycleDelegation)(input.client)) {
|
|
750
830
|
return failed('ORCHESTRATION_CLIENT_UNSUPPORTED', `client '${input.client}' does not support lifecycle orchestration`, resolved.taskId);
|
|
751
831
|
}
|
|
752
|
-
|
|
832
|
+
emitDiagnostic(options, 'orchestration-prepare-start', {
|
|
833
|
+
taskId: resolved.taskId,
|
|
834
|
+
taskDir: resolved.taskDir,
|
|
835
|
+
repoRoot: resolved.repoRoot,
|
|
836
|
+
client: input.client,
|
|
837
|
+
requestedModel: input.requestedModel ?? null,
|
|
838
|
+
requestedReasoningEffort: input.requestedReasoningEffort ?? null
|
|
839
|
+
});
|
|
840
|
+
const run = readRun(resolved.taskDir, options);
|
|
753
841
|
if (!run || run.status !== 'running') return failed('ORCHESTRATION_RUN_NOT_RUNNING', 'a running orchestration is required', resolved.taskId);
|
|
754
842
|
if (run.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_BUSY', 'the run already has a pending delegation', resolved.taskId);
|
|
755
843
|
const repositoryPending = matchingDelegations(() => true, options);
|
|
@@ -769,6 +857,13 @@ function prepareOrchestrationDelegationUnlocked(
|
|
|
769
857
|
if (input.client === 'codex' && !input.lifecycleProvenance) {
|
|
770
858
|
return failed('ORCHESTRATION_CODEX_PROVENANCE_REQUIRED', 'Codex prepare requires lifecycle provenance', resolved.taskId);
|
|
771
859
|
}
|
|
860
|
+
if (input.lifecycleRecoveryAttestation
|
|
861
|
+
&& (input.lifecycleRecoveryAttestation.phase !== 'orchestration.prepare'
|
|
862
|
+
|| input.lifecycleRecoveryAttestation.taskId !== resolved.taskId
|
|
863
|
+
|| input.lifecycleRecoveryAttestation.artifact !== next.artifact
|
|
864
|
+
|| input.lifecycleRecoveryAttestation.round !== next.round)) {
|
|
865
|
+
return failed('LIFECYCLE_AUTHORITY_TUPLE_MISMATCH', 'orchestration authority does not match the routed stage', resolved.taskId);
|
|
866
|
+
}
|
|
772
867
|
const expectedPolicy = run.modelPolicy[next.role];
|
|
773
868
|
if (input.requestedModel !== expectedPolicy.model) {
|
|
774
869
|
return failed('ORCHESTRATION_REQUESTED_MODEL_MISMATCH', `requested model does not match the persisted ${next.role} model`, resolved.taskId);
|
|
@@ -833,6 +928,7 @@ function prepareOrchestrationDelegation(
|
|
|
833
928
|
requestedModel?: string;
|
|
834
929
|
requestedReasoningEffort?: string;
|
|
835
930
|
lifecycleProvenance?: DelegationLifecycleProvenance;
|
|
931
|
+
lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
|
|
836
932
|
}>,
|
|
837
933
|
options: OrchestrationOptions = {}
|
|
838
934
|
): OrchestrationResult {
|
|
@@ -862,7 +958,7 @@ function dispatchOrchestrationDelegationUnlocked(
|
|
|
862
958
|
): OrchestrationResult {
|
|
863
959
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
864
960
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
865
|
-
const run = readRun(resolved.taskDir);
|
|
961
|
+
const run = readRun(resolved.taskDir, options);
|
|
866
962
|
if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
867
963
|
if (run.status !== 'running') {
|
|
868
964
|
return failed('ORCHESTRATION_STATE_INVALID', 'spawn dispatch requires a running orchestration', resolved.taskId);
|
|
@@ -908,16 +1004,42 @@ function matchingDelegations(
|
|
|
908
1004
|
const repoRoot = options.repoRoot ?? process.cwd();
|
|
909
1005
|
const activeRoot = path.join(repoRoot, '.agents', 'workspace', 'active');
|
|
910
1006
|
if (!fs.existsSync(activeRoot)) return [];
|
|
911
|
-
|
|
1007
|
+
emitDiagnostic(options, 'orchestration-active-scan-start', {
|
|
1008
|
+
activeRoot
|
|
1009
|
+
});
|
|
1010
|
+
const matches = fs.readdirSync(activeRoot, { withFileTypes: true })
|
|
912
1011
|
.filter((entry) => entry.isDirectory())
|
|
913
1012
|
.flatMap((entry) => {
|
|
914
|
-
const
|
|
1013
|
+
const candidateTaskId = entry.name;
|
|
1014
|
+
const candidateTaskDir = path.join(activeRoot, candidateTaskId);
|
|
1015
|
+
emitDiagnostic(options, 'orchestration-active-scan-candidate', {
|
|
1016
|
+
candidateTaskId,
|
|
1017
|
+
candidateTaskDir,
|
|
1018
|
+
orchestrationPath: orchestrationPath(candidateTaskDir)
|
|
1019
|
+
});
|
|
1020
|
+
let run: OrchestrationRun | null;
|
|
1021
|
+
try {
|
|
1022
|
+
run = readRun(candidateTaskDir, options);
|
|
1023
|
+
} catch (error) {
|
|
1024
|
+
emitDiagnostic(options, 'orchestration-active-scan-candidate-failed', {
|
|
1025
|
+
candidateTaskId,
|
|
1026
|
+
candidateTaskDir,
|
|
1027
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
1028
|
+
reasonCodes: error instanceof OrchestrationStateError ? error.reasonCodes.join(',') : null
|
|
1029
|
+
});
|
|
1030
|
+
throw error;
|
|
1031
|
+
}
|
|
915
1032
|
if (!run || run.status !== 'running' || !run.pendingDelegation) return [];
|
|
916
1033
|
const receipt = run.pendingDelegation;
|
|
917
1034
|
return predicate(receipt)
|
|
918
|
-
? [{ taskId:
|
|
1035
|
+
? [{ taskId: candidateTaskId, run }]
|
|
919
1036
|
: [];
|
|
920
1037
|
});
|
|
1038
|
+
emitDiagnostic(options, 'orchestration-active-scan-finished', {
|
|
1039
|
+
activeRoot,
|
|
1040
|
+
matchingDelegations: matches.length
|
|
1041
|
+
});
|
|
1042
|
+
return matches;
|
|
921
1043
|
}
|
|
922
1044
|
|
|
923
1045
|
function uniqueMatchingDelegation(
|
|
@@ -1163,7 +1285,7 @@ function activateOrchestrationDelegation(
|
|
|
1163
1285
|
): OrchestrationResult {
|
|
1164
1286
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1165
1287
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1166
|
-
const run = readRun(resolved.taskDir);
|
|
1288
|
+
const run = readRun(resolved.taskDir, options);
|
|
1167
1289
|
if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1168
1290
|
if (run.status !== 'running') {
|
|
1169
1291
|
return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
|
|
@@ -1191,7 +1313,7 @@ async function awaitOrchestrationDelegationActivation(
|
|
|
1191
1313
|
while (true) {
|
|
1192
1314
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1193
1315
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1194
|
-
const run = readRun(resolved.taskDir);
|
|
1316
|
+
const run = readRun(resolved.taskDir, options);
|
|
1195
1317
|
if (!run?.pendingDelegation) {
|
|
1196
1318
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1197
1319
|
}
|
|
@@ -1257,7 +1379,7 @@ function recoverPreparedOrchestrationDelegation(
|
|
|
1257
1379
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1258
1380
|
try {
|
|
1259
1381
|
return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-orchestration.recover-prepared', () => {
|
|
1260
|
-
const run = readRun(resolved.taskDir);
|
|
1382
|
+
const run = readRun(resolved.taskDir, options);
|
|
1261
1383
|
const receipt = run?.pendingDelegation;
|
|
1262
1384
|
if (!run || !receipt) {
|
|
1263
1385
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
@@ -1329,7 +1451,7 @@ function completeOrchestrationStage(
|
|
|
1329
1451
|
): OrchestrationResult {
|
|
1330
1452
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1331
1453
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1332
|
-
const run = readRun(resolved.taskDir);
|
|
1454
|
+
const run = readRun(resolved.taskDir, options);
|
|
1333
1455
|
if (!run) return { status: 'running', changed: false, taskId: resolved.taskId, run: null, next: null, error: null };
|
|
1334
1456
|
if (!run.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'active run has no pending delegation', resolved.taskId);
|
|
1335
1457
|
const result = completeDelegationStage(run.pendingDelegation, event);
|
|
@@ -1348,7 +1470,7 @@ function inspectOrchestrationStage(
|
|
|
1348
1470
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1349
1471
|
let run: OrchestrationRun | null;
|
|
1350
1472
|
try {
|
|
1351
|
-
run = readRun(resolved.taskDir);
|
|
1473
|
+
run = readRun(resolved.taskDir, options);
|
|
1352
1474
|
} catch (error) {
|
|
1353
1475
|
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
1354
1476
|
}
|
|
@@ -1409,7 +1531,7 @@ function sealOrchestrationDelegation(
|
|
|
1409
1531
|
): OrchestrationResult {
|
|
1410
1532
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1411
1533
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1412
|
-
const run = readRun(resolved.taskDir);
|
|
1534
|
+
const run = readRun(resolved.taskDir, options);
|
|
1413
1535
|
if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1414
1536
|
const result = sealDelegation(run.pendingDelegation, event, { now: options.now });
|
|
1415
1537
|
if (!result.ok) return pauseOrchestration(taskRef, result.code, result.message, true, options);
|
|
@@ -1421,7 +1543,7 @@ function sealOrchestrationDelegation(
|
|
|
1421
1543
|
function advanceOrchestration(taskRef: string, options: OrchestrationOptions = {}): OrchestrationResult {
|
|
1422
1544
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1423
1545
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1424
|
-
const run = readRun(resolved.taskDir);
|
|
1546
|
+
const run = readRun(resolved.taskDir, options);
|
|
1425
1547
|
if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1426
1548
|
const result = consumeDelegation(run.pendingDelegation, { now: options.now });
|
|
1427
1549
|
if (!result.ok) return pauseOrchestration(taskRef, result.code, result.message, true, options);
|
|
@@ -1448,7 +1570,7 @@ function pauseOrchestration(
|
|
|
1448
1570
|
): OrchestrationResult {
|
|
1449
1571
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1450
1572
|
if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1451
|
-
const run = readRun(resolved.taskDir);
|
|
1573
|
+
const run = readRun(resolved.taskDir, options);
|
|
1452
1574
|
if (!run) return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
|
|
1453
1575
|
const updated = withUpdatedRun(run, { status: 'paused', pause: { code, message, recoverable } });
|
|
1454
1576
|
saveRun(resolved.taskDir, updated);
|
|
@@ -1483,6 +1605,7 @@ export {
|
|
|
1483
1605
|
statusOrchestration,
|
|
1484
1606
|
};
|
|
1485
1607
|
export type {
|
|
1608
|
+
CleanCompletionEvidence,
|
|
1486
1609
|
OrchestrationCompletionPlanResult,
|
|
1487
1610
|
OrchestrationModelPolicy,
|
|
1488
1611
|
OrchestrationNext,
|