@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,5 +1,7 @@
|
|
|
1
1
|
import type { SandboxControlManifest } from './protocol.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { runProbe } from '../shell.ts';
|
|
3
|
+
import { captureSandboxAuthority, isSandboxAuthorityEvidence, verifySandboxAuthority } from '../engines/authority.ts';
|
|
4
|
+
import { discoverExactContainer } from '../engines/docker-exact-discovery.ts';
|
|
3
5
|
|
|
4
6
|
export type ContainerObservation =
|
|
5
7
|
| Readonly<{ state: 'found'; id: string; running: boolean; labels: Readonly<Record<string, string>> }>
|
|
@@ -12,20 +14,13 @@ export type ContainerInspection = Readonly<{
|
|
|
12
14
|
labels?: unknown;
|
|
13
15
|
}>;
|
|
14
16
|
|
|
15
|
-
function isAuthoritativeNotFound(error: unknown): boolean {
|
|
16
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
17
|
-
return /(?:no such (?:container|object)|container .* not found|cannot find container)/i.test(message);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
17
|
export function classifySandboxContainerInspection(
|
|
21
18
|
expected: SandboxControlManifest['containerIdentity'],
|
|
22
19
|
inspection: ContainerInspection | { notFound: true } | { error: unknown }
|
|
23
20
|
): ContainerObservation {
|
|
24
21
|
if ('notFound' in inspection) return { state: 'absent', id: expected.id };
|
|
25
22
|
if ('error' in inspection) {
|
|
26
|
-
return
|
|
27
|
-
? { state: 'absent', id: expected.id }
|
|
28
|
-
: { state: 'unknown', reason: `container inspection failed: ${inspection.error instanceof Error ? inspection.error.message : String(inspection.error)}` };
|
|
23
|
+
return { state: 'unknown', reason: `container inspection failed: ${inspection.error instanceof Error ? inspection.error.message : String(inspection.error)}` };
|
|
29
24
|
}
|
|
30
25
|
const response = inspection as ContainerInspection;
|
|
31
26
|
if (typeof response.id !== 'string' || response.id !== expected.id
|
|
@@ -49,44 +44,33 @@ export function classifySandboxContainerInspection(
|
|
|
49
44
|
|
|
50
45
|
export async function inspectSandboxControlContainer(
|
|
51
46
|
manifest: SandboxControlManifest,
|
|
52
|
-
options: {
|
|
47
|
+
options: { probe?: typeof runProbe; timeoutMs?: number } = {}
|
|
53
48
|
): Promise<ContainerObservation> {
|
|
49
|
+
if (!isSandboxAuthorityEvidence(manifest.authorityEvidence)) {
|
|
50
|
+
return { state: 'unknown', reason: 'SANDBOX_AUTHORITY_EVIDENCE_MISSING' };
|
|
51
|
+
}
|
|
54
52
|
try {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
options.timeoutMs === undefined ? {} : { timeout: options.timeoutMs }
|
|
65
|
-
);
|
|
66
|
-
if (result.status !== 0) {
|
|
67
|
-
const stderr = typeof result.stderr === 'string' ? result.stderr : result.stderr?.toString('utf8') ?? '';
|
|
68
|
-
return classifySandboxContainerInspection(manifest.containerIdentity, {
|
|
69
|
-
error: new Error(stderr || `container inspection exited with ${result.status ?? 'unknown'}`)
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
raw = typeof result.stdout === 'string' ? result.stdout : result.stdout?.toString('utf8') ?? '';
|
|
53
|
+
const authority = captureSandboxAuthority(manifest.engine, {
|
|
54
|
+
probe: options.probe,
|
|
55
|
+
timeoutMs: options.timeoutMs,
|
|
56
|
+
lockDomain: manifest.authorityEvidence.lockDomain,
|
|
57
|
+
route: manifest.authorityEvidence
|
|
58
|
+
});
|
|
59
|
+
const authorityState = verifySandboxAuthority(manifest.authorityEvidence, authority);
|
|
60
|
+
if (authorityState.state !== 'verified') {
|
|
61
|
+
return { state: 'unknown', reason: authorityState.reason ?? 'SANDBOX_AUTHORITY_UNAVAILABLE' };
|
|
73
62
|
}
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
} | Array<{
|
|
79
|
-
Id?: unknown;
|
|
80
|
-
State?: { Running?: unknown };
|
|
81
|
-
Config?: { Labels?: unknown };
|
|
82
|
-
}>;
|
|
83
|
-
const value = Array.isArray(parsed) && parsed.length === 1 ? parsed[0] : parsed;
|
|
84
|
-
if (!value || Array.isArray(value)) return { state: 'unknown', reason: 'container inspection response is incomplete' };
|
|
85
|
-
return classifySandboxContainerInspection(manifest.containerIdentity, {
|
|
86
|
-
id: value.Id,
|
|
87
|
-
running: value.State?.Running,
|
|
88
|
-
labels: value.Config?.Labels
|
|
63
|
+
const discovered = discoverExactContainer(manifest.engine, manifest.containerIdentity.id, {
|
|
64
|
+
probe: options.probe,
|
|
65
|
+
timeoutMs: options.timeoutMs,
|
|
66
|
+
authority: manifest.authorityEvidence
|
|
89
67
|
});
|
|
68
|
+
if (discovered.state === 'absent') return { state: 'absent', id: discovered.id };
|
|
69
|
+
if (discovered.state === 'conflict') {
|
|
70
|
+
return { state: 'unknown', reason: `SANDBOX_CONTROL_CONTAINER_CONFLICT: ${discovered.reason}` };
|
|
71
|
+
}
|
|
72
|
+
if (discovered.state === 'unknown') return discovered;
|
|
73
|
+
return classifySandboxContainerInspection(manifest.containerIdentity, discovered);
|
|
90
74
|
} catch (error) {
|
|
91
75
|
return classifySandboxContainerInspection(manifest.containerIdentity, { error });
|
|
92
76
|
}
|
|
@@ -3,16 +3,40 @@ import fs from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { getProcessStartTime } from '../../server/process-state.ts';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createTask,
|
|
8
|
+
projectTaskCreateResult,
|
|
9
|
+
taskCreateExitCode,
|
|
10
|
+
taskCreateFailure,
|
|
11
|
+
type TaskCreateResult
|
|
12
|
+
} from '../../task/create-service.ts';
|
|
7
13
|
import { applyTaskFinalization } from '../../task/finalization.ts';
|
|
8
|
-
import {
|
|
9
|
-
|
|
14
|
+
import {
|
|
15
|
+
bindSandboxControlTask,
|
|
16
|
+
validateSandboxControlRequest,
|
|
17
|
+
type SandboxControlExecution,
|
|
18
|
+
type SandboxControlExecutorGateV2,
|
|
19
|
+
type SandboxControlManifest,
|
|
20
|
+
type SandboxControlRequest
|
|
21
|
+
} from './protocol.ts';
|
|
22
|
+
import {
|
|
23
|
+
atomicWriteJson,
|
|
24
|
+
executionPath,
|
|
25
|
+
readActiveLease,
|
|
26
|
+
terminateSandboxControlExecution
|
|
27
|
+
} from './state.ts';
|
|
28
|
+
import { requestAuditFields, resultAuditFields, appendDiagnosticAudit, createSandboxControlAuditContext, appendCriticalAudit, writeSandboxControlTransition } from './audit.ts';
|
|
29
|
+
import { validateSandboxControlIdentity } from './identity-sentinel.ts';
|
|
10
30
|
import {
|
|
11
31
|
createSandboxExecutorExecutionContext,
|
|
12
32
|
dispatchTaskControlOperation,
|
|
13
33
|
parseTaskControlOperation,
|
|
34
|
+
validateLifecycleRecoveryAttestation,
|
|
35
|
+
type LifecycleAuthorityResponseV1,
|
|
36
|
+
type LifecycleRecoveryAttestationV1,
|
|
14
37
|
type TaskControlOperation
|
|
15
38
|
} from '../../task/control-authority.ts';
|
|
39
|
+
import { executeTaskWorkflow } from './workflow-executor.ts';
|
|
16
40
|
import { assertSandboxControlBrokerOwner, readSandboxControlManifest, type BrokerOwner } from './lifecycle.ts';
|
|
17
41
|
import { computeLifecycleBuildIdentity } from '../../agent-clients/adapters/codex-lifecycle/build-identity.ts';
|
|
18
42
|
import {
|
|
@@ -21,6 +45,7 @@ import {
|
|
|
21
45
|
openCodexControllerRegistration,
|
|
22
46
|
resolveCodexControllerBinding
|
|
23
47
|
} from './controller-registration.ts';
|
|
48
|
+
import type { OrchestrationDiagnosticLogger } from '../../task/orchestration.ts';
|
|
24
49
|
|
|
25
50
|
export type SandboxControlExecutionResult = {
|
|
26
51
|
exitCode: number;
|
|
@@ -59,6 +84,27 @@ function safeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
|
59
84
|
return Object.fromEntries(Object.entries(env).filter(([key]) => !key.toUpperCase().startsWith('AGENT_INFRA_CONTROL_')));
|
|
60
85
|
}
|
|
61
86
|
|
|
87
|
+
function safeRealpath(value: string): string | null {
|
|
88
|
+
try {
|
|
89
|
+
return fs.realpathSync.native(value);
|
|
90
|
+
} catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function appendExecutorAudit(
|
|
96
|
+
manifest: SandboxControlManifest,
|
|
97
|
+
event: string,
|
|
98
|
+
fields: Record<string, string | number | boolean | null> = {}
|
|
99
|
+
): void {
|
|
100
|
+
try {
|
|
101
|
+
appendDiagnosticAudit(manifest, event, { source: 'executor', ...fields });
|
|
102
|
+
} catch {
|
|
103
|
+
// Diagnostics must never change the control protocol.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
62
108
|
export function nodeEntryArgs(entry: string, args: string[]): string[] {
|
|
63
109
|
return path.extname(entry) === '.ts'
|
|
64
110
|
? ['--experimental-strip-types', '--no-warnings', entry, ...args]
|
|
@@ -81,6 +127,7 @@ export async function prepareSandboxControlExecution(params: {
|
|
|
81
127
|
request: SandboxControlRequest;
|
|
82
128
|
requestPath: string;
|
|
83
129
|
internalCliPath: string;
|
|
130
|
+
lifecycleAuthority?: LifecycleAuthorityResponseV1;
|
|
84
131
|
}): Promise<PreparedSandboxControlExecution> {
|
|
85
132
|
const nonce = randomUUID();
|
|
86
133
|
const child = spawn(
|
|
@@ -134,7 +181,16 @@ export async function prepareSandboxControlExecution(params: {
|
|
|
134
181
|
if (!canWrite()) throw new Error('SANDBOX_CONTROL_OWNER_LOST');
|
|
135
182
|
atomicWriteJson(executionPath(params.manifest, params.request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
|
|
136
183
|
if (!canWrite()) throw new Error('SANDBOX_CONTROL_OWNER_LOST');
|
|
137
|
-
|
|
184
|
+
const authority = params.lifecycleAuthority?.attestation ?? null;
|
|
185
|
+
child.send({
|
|
186
|
+
version: 2,
|
|
187
|
+
nonce,
|
|
188
|
+
owner: gateOwner,
|
|
189
|
+
requestId: params.request.id,
|
|
190
|
+
operationId: authority?.operationId ?? params.request.id,
|
|
191
|
+
phase: authority?.phase ?? (params.request.family === 'task-workflow' ? 'artifact.finalize-local' : 'orchestration.prepare'),
|
|
192
|
+
authority
|
|
193
|
+
} satisfies SandboxControlExecutorGateV2);
|
|
138
194
|
},
|
|
139
195
|
completion,
|
|
140
196
|
terminate(updateState = true) {
|
|
@@ -148,7 +204,7 @@ export async function prepareSandboxControlExecution(params: {
|
|
|
148
204
|
};
|
|
149
205
|
}
|
|
150
206
|
|
|
151
|
-
function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner
|
|
207
|
+
function waitForGate(nonce: string, timeoutMs = 2_000): Promise<Readonly<{ owner: BrokerOwner; authority: LifecycleRecoveryAttestationV1 | null; requestId: string; operationId: string; phase: SandboxControlExecutorGateV2['phase'] }>> {
|
|
152
208
|
return new Promise((resolve, reject) => {
|
|
153
209
|
const timer = setTimeout(() => reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_TIMEOUT')), timeoutMs);
|
|
154
210
|
const onDisconnect = () => {
|
|
@@ -163,9 +219,14 @@ function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner> {
|
|
|
163
219
|
version?: unknown;
|
|
164
220
|
nonce?: unknown;
|
|
165
221
|
owner?: Partial<BrokerOwner> | null;
|
|
222
|
+
requestId?: unknown;
|
|
223
|
+
operationId?: unknown;
|
|
224
|
+
phase?: unknown;
|
|
225
|
+
authority?: unknown;
|
|
166
226
|
} | null;
|
|
167
227
|
const owner = value?.owner;
|
|
168
|
-
if (!value ||
|
|
228
|
+
if (!value || Object.keys(value).sort().join(',') !== 'authority,nonce,operationId,owner,phase,requestId,version'
|
|
229
|
+
|| value.version !== 2 || value.nonce !== nonce
|
|
169
230
|
|| !owner || owner.version !== 3 || !Number.isSafeInteger(owner.pid) || (owner.pid ?? 0) <= 0
|
|
170
231
|
|| typeof owner.startTime !== 'number' || !Number.isSafeInteger(owner.startTime)
|
|
171
232
|
|| typeof owner.brokerId !== 'string' || owner.brokerId.length === 0
|
|
@@ -173,7 +234,21 @@ function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner> {
|
|
|
173
234
|
reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
|
|
174
235
|
return;
|
|
175
236
|
}
|
|
176
|
-
|
|
237
|
+
if (typeof value.requestId !== 'string' || typeof value.operationId !== 'string'
|
|
238
|
+
|| !['orchestration.prepare', 'artifact.finalize-local', 'task-event.completed'].includes(value.phase as string)
|
|
239
|
+
|| (value.authority !== null && value.authority !== undefined && (() => {
|
|
240
|
+
try { validateLifecycleRecoveryAttestation(value.authority); return false; } catch { return true; }
|
|
241
|
+
})())) {
|
|
242
|
+
reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
resolve({
|
|
246
|
+
owner: owner as BrokerOwner,
|
|
247
|
+
authority: value.authority === null || value.authority === undefined ? null : value.authority as LifecycleRecoveryAttestationV1,
|
|
248
|
+
requestId: value.requestId,
|
|
249
|
+
operationId: value.operationId,
|
|
250
|
+
phase: value.phase as SandboxControlExecutorGateV2['phase']
|
|
251
|
+
});
|
|
177
252
|
});
|
|
178
253
|
});
|
|
179
254
|
}
|
|
@@ -218,6 +293,22 @@ function lifecycleFailure(code: string, message: string): SandboxControlExecutio
|
|
|
218
293
|
};
|
|
219
294
|
}
|
|
220
295
|
|
|
296
|
+
function taskCreateExecutionResult(result: TaskCreateResult): SandboxControlExecutionResult {
|
|
297
|
+
return {
|
|
298
|
+
exitCode: taskCreateExitCode(result),
|
|
299
|
+
stdout: `${JSON.stringify(result)}\n`,
|
|
300
|
+
stderr: ''
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function taskCreateExecutionFailure(requestId: string, code: string, message: string): SandboxControlExecutionResult {
|
|
305
|
+
return taskCreateExecutionResult(taskCreateFailure({ code, message, retryable: false }, {
|
|
306
|
+
requestId,
|
|
307
|
+
accepted: true,
|
|
308
|
+
recovery: 'inspect-domain-state'
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
|
|
221
312
|
function finalizationResult(result: Awaited<ReturnType<typeof applyTaskFinalization>>): SandboxControlExecutionResult {
|
|
222
313
|
const payload = {
|
|
223
314
|
version: 1,
|
|
@@ -237,21 +328,28 @@ function finalizationResult(result: Awaited<ReturnType<typeof applyTaskFinalizat
|
|
|
237
328
|
type ExecuteRequestOptions = Readonly<{
|
|
238
329
|
buildIdentity?: typeof computeLifecycleBuildIdentity;
|
|
239
330
|
resolveControllerBinding?: typeof resolveCodexControllerBinding;
|
|
331
|
+
lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
|
|
240
332
|
}>;
|
|
241
333
|
|
|
242
|
-
|
|
334
|
+
async function executeRequestInner(
|
|
243
335
|
manifest: SandboxControlManifest,
|
|
244
336
|
manifestPath: string,
|
|
245
337
|
request: SandboxControlRequest,
|
|
246
338
|
options: ExecuteRequestOptions = {}
|
|
247
339
|
): Promise<SandboxControlExecutionResult> {
|
|
248
340
|
if (request.family === 'task-create') {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
341
|
+
try {
|
|
342
|
+
const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
|
|
343
|
+
return taskCreateExecutionResult(projectTaskCreateResult(result, {
|
|
344
|
+
requestId: request.id,
|
|
345
|
+
accepted: true,
|
|
346
|
+
recovery: 'none'
|
|
347
|
+
}));
|
|
348
|
+
} catch (error) {
|
|
349
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
350
|
+
const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'TASK_CREATE_EXECUTION_FAILED';
|
|
351
|
+
return taskCreateExecutionFailure(request.id, code, detail);
|
|
352
|
+
}
|
|
255
353
|
}
|
|
256
354
|
if (request.family === 'codex-controller') {
|
|
257
355
|
try {
|
|
@@ -293,9 +391,20 @@ export async function executeRequest(
|
|
|
293
391
|
});
|
|
294
392
|
return { exitCode: 0, stdout: `${JSON.stringify(result)}\n`, stderr: '' };
|
|
295
393
|
} catch (error) {
|
|
394
|
+
const errorCode = error instanceof CodexControllerRegistrationError
|
|
395
|
+
? error.code
|
|
396
|
+
: /^([A-Z][A-Z0-9_]+)/u.exec(error instanceof Error ? error.message : String(error))?.[1]
|
|
397
|
+
?? 'CODEX_SANDBOX_CONTROLLER_FAILED';
|
|
398
|
+
appendExecutorAudit(manifest, 'controller-operation-failed', {
|
|
399
|
+
...requestAuditFields(manifest, request),
|
|
400
|
+
controllerCommand: request.command,
|
|
401
|
+
errorCode,
|
|
402
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
403
|
+
});
|
|
296
404
|
return controllerFailure(error);
|
|
297
405
|
}
|
|
298
406
|
}
|
|
407
|
+
if (request.family === 'task-workflow') return executeTaskWorkflow(manifest, request.workflow, options.lifecycleRecoveryAttestation ?? null);
|
|
299
408
|
if (request.family === 'task-finalization') {
|
|
300
409
|
const operation = parseTaskControlOperation(
|
|
301
410
|
'task-finalization', [manifest.taskId!, 'complete', '--agent', request.agent]
|
|
@@ -309,7 +418,8 @@ export async function executeRequest(
|
|
|
309
418
|
taskId: manifest.taskId!,
|
|
310
419
|
generation: manifest.generation,
|
|
311
420
|
manifestPath,
|
|
312
|
-
requestId: request.id
|
|
421
|
+
requestId: request.id,
|
|
422
|
+
lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
|
|
313
423
|
}),
|
|
314
424
|
operation
|
|
315
425
|
);
|
|
@@ -339,23 +449,31 @@ export async function executeRequest(
|
|
|
339
449
|
&& operation.input.client === 'codex';
|
|
340
450
|
if (codexPrepare) {
|
|
341
451
|
if (!request.controllerProof) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
452
|
+
const authority = options.lifecycleRecoveryAttestation;
|
|
453
|
+
if (!authority || authority.phase !== 'orchestration.prepare') {
|
|
454
|
+
return orchestrationFailure(
|
|
455
|
+
'CODEX_SANDBOX_CONTROLLER_PROOF_REQUIRED',
|
|
456
|
+
'Codex prepare requires a current controller lease proof'
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
controllerBinding = {
|
|
460
|
+
instanceDigest: authority.controllerInstanceDigest,
|
|
461
|
+
controlGeneration: authority.controlGeneration
|
|
462
|
+
};
|
|
463
|
+
} else {
|
|
464
|
+
try {
|
|
465
|
+
controllerBinding = (options.resolveControllerBinding ?? resolveCodexControllerBinding)({
|
|
466
|
+
manifest,
|
|
467
|
+
manifestPath,
|
|
468
|
+
proof: request.controllerProof,
|
|
469
|
+
buildIdentity: (options.buildIdentity ?? computeLifecycleBuildIdentity)(manifest.repoRoot)
|
|
470
|
+
});
|
|
471
|
+
} catch (error) {
|
|
472
|
+
const code = error instanceof CodexControllerRegistrationError
|
|
473
|
+
? error.code
|
|
474
|
+
: 'CODEX_SANDBOX_CONTROLLER_PROOF_INVALID';
|
|
475
|
+
return orchestrationFailure(code, `${code}: Codex controller proof was rejected`);
|
|
476
|
+
}
|
|
359
477
|
}
|
|
360
478
|
} else if (request.controllerProof !== null) {
|
|
361
479
|
return orchestrationFailure(
|
|
@@ -364,6 +482,14 @@ export async function executeRequest(
|
|
|
364
482
|
);
|
|
365
483
|
}
|
|
366
484
|
}
|
|
485
|
+
const diagnosticLog: OrchestrationDiagnosticLogger = (event, fields): void => {
|
|
486
|
+
appendExecutorAudit(manifest, event.startsWith('orchestration-') ? event : `orchestration-${event}`, {
|
|
487
|
+
requestId: request.id,
|
|
488
|
+
requestFamily: request.family,
|
|
489
|
+
sandboxTaskId: manifest.taskId,
|
|
490
|
+
...fields
|
|
491
|
+
});
|
|
492
|
+
};
|
|
367
493
|
const context = createSandboxExecutorExecutionContext({
|
|
368
494
|
repoRoot: manifest.repoRoot,
|
|
369
495
|
worktreeRoot: manifest.worktreeRoot,
|
|
@@ -372,7 +498,9 @@ export async function executeRequest(
|
|
|
372
498
|
generation: manifest.generation,
|
|
373
499
|
manifestPath,
|
|
374
500
|
requestId: request.id,
|
|
375
|
-
|
|
501
|
+
diagnosticLog,
|
|
502
|
+
...(controllerBinding ? { controllerBinding } : {}),
|
|
503
|
+
lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
|
|
376
504
|
});
|
|
377
505
|
const format = (value: unknown): SandboxControlExecutionResult => {
|
|
378
506
|
const result = value as { status?: string };
|
|
@@ -390,27 +518,116 @@ export async function executeRequest(
|
|
|
390
518
|
return format(await dispatchTaskControlOperation(context, operation));
|
|
391
519
|
}
|
|
392
520
|
|
|
521
|
+
export async function executeRequest(
|
|
522
|
+
manifest: SandboxControlManifest,
|
|
523
|
+
manifestPath: string,
|
|
524
|
+
request: SandboxControlRequest,
|
|
525
|
+
options: ExecuteRequestOptions = {}
|
|
526
|
+
): Promise<SandboxControlExecutionResult> {
|
|
527
|
+
const fields = requestAuditFields(manifest, request);
|
|
528
|
+
appendExecutorAudit(manifest, 'executor-request-start', fields);
|
|
529
|
+
try {
|
|
530
|
+
const result = await executeRequestInner(manifest, manifestPath, request, options);
|
|
531
|
+
appendExecutorAudit(manifest, 'executor-request-finished', {
|
|
532
|
+
requestId: request.id,
|
|
533
|
+
requestFamily: request.family,
|
|
534
|
+
sandboxTaskId: manifest.taskId,
|
|
535
|
+
...resultAuditFields(result)
|
|
536
|
+
});
|
|
537
|
+
return result;
|
|
538
|
+
} catch (error) {
|
|
539
|
+
appendExecutorAudit(manifest, 'executor-request-failed', {
|
|
540
|
+
requestId: request.id,
|
|
541
|
+
requestFamily: request.family,
|
|
542
|
+
sandboxTaskId: manifest.taskId,
|
|
543
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
544
|
+
});
|
|
545
|
+
throw error;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
393
549
|
export async function runSandboxControlExecutor(requestPath: string, nonce: string): Promise<void> {
|
|
394
|
-
const
|
|
550
|
+
const gate = await waitForGate(nonce);
|
|
551
|
+
const gateOwner = gate.owner;
|
|
395
552
|
process.disconnect?.();
|
|
396
553
|
const manifestPath = process.env.AGENT_INFRA_EXECUTOR_MANIFEST;
|
|
397
554
|
if (!manifestPath) throw new Error('SANDBOX_CONTROL_EXECUTOR_MANIFEST_MISSING');
|
|
398
555
|
const manifest = readSandboxControlManifest(manifestPath);
|
|
556
|
+
const identity = validateSandboxControlIdentity({
|
|
557
|
+
publicStatusDir: manifest.publicStatusDir,
|
|
558
|
+
root: path.dirname(path.resolve(manifestPath)),
|
|
559
|
+
mode: manifest.mode,
|
|
560
|
+
taskId: manifest.taskId,
|
|
561
|
+
generation: manifest.generation,
|
|
562
|
+
controlRootId: manifest.controlRootId
|
|
563
|
+
});
|
|
564
|
+
if (identity.state !== 'valid') {
|
|
565
|
+
throw new Error(`SANDBOX_CONTROL_IDENTITY_${identity.state.replaceAll('-', '_').toUpperCase()}`);
|
|
566
|
+
}
|
|
399
567
|
const root = fs.realpathSync.native(process.cwd());
|
|
400
|
-
|
|
568
|
+
const expectedRoot = safeRealpath(manifest.repoRoot);
|
|
569
|
+
if (expectedRoot !== root) {
|
|
570
|
+
appendExecutorAudit(manifest, 'executor-root-validation-failed', {
|
|
571
|
+
hostCwd: process.cwd(),
|
|
572
|
+
observedRoot: root,
|
|
573
|
+
expectedRoot
|
|
574
|
+
});
|
|
575
|
+
throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
|
|
576
|
+
}
|
|
401
577
|
const raw = JSON.parse(fs.readFileSync(requestPath, 'utf8')) as unknown;
|
|
402
578
|
const request = validateSandboxControlRequest(raw, manifest);
|
|
579
|
+
if (gate.requestId !== request.id) throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_REQUEST_MISMATCH');
|
|
580
|
+
if (gate.authority !== null
|
|
581
|
+
&& (gate.authority.requestId !== request.id
|
|
582
|
+
|| gate.authority.operationId !== gate.operationId
|
|
583
|
+
|| gate.authority.phase !== gate.phase)) {
|
|
584
|
+
throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_AUTHORITY_MISMATCH');
|
|
585
|
+
}
|
|
586
|
+
appendExecutorAudit(manifest, 'executor-request-validated', requestAuditFields(manifest, request));
|
|
403
587
|
const requestDirectory = path.resolve(path.dirname(requestPath));
|
|
404
588
|
const processingDirectory = path.resolve(path.join(manifest.processingDir, request.id));
|
|
405
589
|
const channelRequestDirectory = path.resolve(path.join(manifest.channelDir, 'requests'));
|
|
406
590
|
if (requestDirectory !== processingDirectory && requestDirectory !== channelRequestDirectory) {
|
|
591
|
+
appendExecutorAudit(manifest, 'executor-request-path-validation-failed', {
|
|
592
|
+
...requestAuditFields(manifest, request),
|
|
593
|
+
requestPath,
|
|
594
|
+
requestDirectory,
|
|
595
|
+
processingDirectory,
|
|
596
|
+
channelRequestDirectory
|
|
597
|
+
});
|
|
407
598
|
throw new Error('SANDBOX_CONTROL_EXECUTOR_REQUEST_INVALID');
|
|
408
599
|
}
|
|
409
600
|
let result: SandboxControlExecutionResult;
|
|
410
601
|
try {
|
|
411
602
|
assertSandboxControlExecutorAuthority(manifest, gateOwner);
|
|
412
|
-
|
|
603
|
+
const operation = request.family === 'task-lifecycle' || request.family === 'task-orchestration'
|
|
604
|
+
? (() => {
|
|
605
|
+
try { return parseTaskControlOperation(request.family, request.args); } catch { return null; }
|
|
606
|
+
})()
|
|
607
|
+
: null;
|
|
608
|
+
const context = createSandboxControlAuditContext(manifest, {
|
|
609
|
+
requestId: request.id,
|
|
610
|
+
family: request.family,
|
|
611
|
+
operation: operation?.family === 'task-orchestration'
|
|
612
|
+
? operation.intent
|
|
613
|
+
: operation?.family === 'task-lifecycle'
|
|
614
|
+
? operation.request.intent
|
|
615
|
+
: request.family === 'task-finalization' ? request.operation : null,
|
|
616
|
+
phase: 'started-committed',
|
|
617
|
+
outcome: 'in-progress'
|
|
618
|
+
});
|
|
619
|
+
appendCriticalAudit(manifest, context, { transition: 'started-committed' });
|
|
620
|
+
writeSandboxControlTransition(manifest, { requestId: request.id, phase: 'started-committed' });
|
|
621
|
+
const execution = readJsonExecution(executionPath(manifest, request.id));
|
|
622
|
+
atomicWriteJson(executionPath(manifest, request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
|
|
623
|
+
result = await executeRequest(manifest, manifestPath, request, {
|
|
624
|
+
lifecycleRecoveryAttestation: gate.authority
|
|
625
|
+
});
|
|
413
626
|
} catch (error) {
|
|
627
|
+
appendExecutorAudit(manifest, 'executor-authority-or-dispatch-failed', {
|
|
628
|
+
...requestAuditFields(manifest, request),
|
|
629
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
630
|
+
});
|
|
414
631
|
const detail = error instanceof Error ? error.message : String(error);
|
|
415
632
|
const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'SANDBOX_CONTROL_EXECUTOR_FAILED';
|
|
416
633
|
result = request.family === 'task-finalization'
|
|
@@ -422,7 +639,9 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
|
|
|
422
639
|
})}\n`,
|
|
423
640
|
stderr: ''
|
|
424
641
|
}
|
|
425
|
-
: request.family === 'task-
|
|
642
|
+
: request.family === 'task-create'
|
|
643
|
+
? taskCreateExecutionFailure(request.id, code, detail)
|
|
644
|
+
: request.family === 'task-lifecycle'
|
|
426
645
|
? lifecycleFailure(code, detail)
|
|
427
646
|
: orchestrationFailure(code, detail);
|
|
428
647
|
}
|
|
@@ -431,6 +650,12 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
|
|
|
431
650
|
process.exitCode = result.exitCode;
|
|
432
651
|
}
|
|
433
652
|
|
|
653
|
+
function readJsonExecution(filePath: string): SandboxControlExecution {
|
|
654
|
+
const value = JSON.parse(fs.readFileSync(filePath, 'utf8')) as SandboxControlExecution;
|
|
655
|
+
if (!value || value.requestId.length === 0) throw new Error('SANDBOX_CONTROL_EXECUTION_INVALID');
|
|
656
|
+
return value;
|
|
657
|
+
}
|
|
658
|
+
|
|
434
659
|
export function disconnectExecutor(child: ChildProcess): void {
|
|
435
660
|
if (child.connected) child.disconnect();
|
|
436
661
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TaskFinalizationReceipt } from '../../task/finalization.ts';
|
|
2
|
+
import type { SandboxControlResponse } from './protocol.ts';
|
|
3
|
+
|
|
4
|
+
export function finalizationTerminalResponse(taskId: string, requestId: string, receipt: TaskFinalizationReceipt): SandboxControlResponse {
|
|
5
|
+
const pendingSteps = [
|
|
6
|
+
receipt.taskComment === 'pending' ? 'task-comment' : null,
|
|
7
|
+
receipt.verification === 'pending' ? 'verification' : null
|
|
8
|
+
].filter((step): step is string => step !== null);
|
|
9
|
+
const completedSteps = ['lifecycle', receipt.taskComment === 'pending' ? null : 'task-comment', receipt.verification === 'pending' ? null : 'verification']
|
|
10
|
+
.filter((step): step is string => step !== null);
|
|
11
|
+
const warnings = receipt.warnings
|
|
12
|
+
.filter((warning) => warning.status === 'open')
|
|
13
|
+
.map(({ status: _status, resolvedAt: _resolvedAt, ...warning }) => warning);
|
|
14
|
+
const result = {
|
|
15
|
+
status: 'completed', changed: false, taskId,
|
|
16
|
+
lifecycle: { status: 'no-op', changed: false, error: null },
|
|
17
|
+
taskComment: receipt.taskComment === 'pending' ? null : { status: 'no-op', changed: false, error: null },
|
|
18
|
+
verification: receipt.verification === 'pending' ? null : { status: 'no-op', changed: false, error: null },
|
|
19
|
+
completedSteps, pendingSteps,
|
|
20
|
+
result: pendingSteps.length > 0 || receipt.warningProjection === 'pending' || warnings.length > 0
|
|
21
|
+
? 'completed_with_warnings' : 'completed',
|
|
22
|
+
warnings, error: null
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
version: 2, id: requestId, phase: 'completed', exitCode: 0,
|
|
26
|
+
stdout: `${JSON.stringify({ version: 1, status: 'completed', changed: false, accepted: true, result, error: null })}\n`,
|
|
27
|
+
stderr: '', error: null
|
|
28
|
+
};
|
|
29
|
+
}
|