@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
package/dist/bin/internal-cli.js
CHANGED
|
@@ -1,63 +1,123 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { formatTaskViewDiagnostic, guardTaskOperation, resolveSandboxControlTransport, TaskViewOperationError } from '../lib/internal/task-operation-registry.js';
|
|
3
|
+
import { INTERNAL_HANDLER_ROUTE_SELECTORS } from '../lib/internal/cli-route-inventory.js';
|
|
4
|
+
import { hostControlRequestForCommand, requestHostControl, HostControlClientError, HOST_CONTROL_TEST_ENVIRONMENT_KEYS } from '../lib/host-control/client.js';
|
|
5
|
+
import { resolveHostControlEndpoint, readHostControlWorkerToken } from '../lib/host-control/path.js';
|
|
2
6
|
const [major = 0, minor = 0] = process.versions.node.split('.').map((part) => parseInt(part, 10));
|
|
3
7
|
if (major < 22 || (major === 22 && minor < 9)) {
|
|
4
8
|
process.stderr.write(`agent-infra-internal requires Node.js >= 22.9.0 (current: ${process.version})\n`);
|
|
5
9
|
process.exit(1);
|
|
6
10
|
}
|
|
7
11
|
const command = process.argv[2] || '';
|
|
12
|
+
const internalRouteRegistered = Object.hasOwn(INTERNAL_HANDLER_ROUTE_SELECTORS, command);
|
|
8
13
|
const taskControlCommand = command === 'task-lifecycle' || command === 'task-orchestration' || command === 'task-finalization';
|
|
9
|
-
|
|
14
|
+
const taskWorkflowCommand = command === 'task-artifact'
|
|
15
|
+
|| command === 'task-review'
|
|
16
|
+
|| command === 'task-event'
|
|
17
|
+
|| command === 'task-ledger'
|
|
18
|
+
|| command === 'task-invalidation'
|
|
19
|
+
|| command === 'task-warning';
|
|
20
|
+
const manualValidationWorkflowCommand = command === 'manual-validation';
|
|
21
|
+
const localTaskControlHelp = taskControlCommand
|
|
22
|
+
&& (process.argv[3] === '--help' || process.argv[3] === '-h')
|
|
23
|
+
&& !process.env.AGENT_INFRA_TEST_HOST_CONTROL_ENDPOINT;
|
|
24
|
+
let taskViewGuardFailed = false;
|
|
25
|
+
try {
|
|
26
|
+
const guard = guardTaskOperation('internal', command, process.argv.slice(3));
|
|
27
|
+
if (guard.taskView && guard.descriptor.effect === 'diagnostic') {
|
|
28
|
+
process.stderr.write(formatTaskViewDiagnostic(guard.taskView));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
taskViewGuardFailed = true;
|
|
33
|
+
if (error instanceof TaskViewOperationError) {
|
|
34
|
+
process.stderr.write(`${error.message}\n`);
|
|
35
|
+
process.exitCode = error.exitCode;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function taskControlTransportFailure(message, code = 'TASK_CONTROL_TRANSPORT_INVALID', changed = false) {
|
|
10
42
|
process.stdout.write(`${JSON.stringify({
|
|
11
|
-
status: 'failed', changed
|
|
12
|
-
error: { code
|
|
43
|
+
status: 'failed', changed,
|
|
44
|
+
error: { code, message }
|
|
13
45
|
})}\n`);
|
|
14
46
|
process.exit(1);
|
|
15
47
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
&& !env.AGENT_INFRA_CONTROL_CONTROLLER_BINDING
|
|
28
|
-
&& (!taskBindingMarker || Boolean(env.AGENT_INFRA_RUNTIME_DIR));
|
|
29
|
-
if (executorMarked) {
|
|
30
|
-
taskControlTransportFailure('executor context is only valid for sandbox-control execute');
|
|
48
|
+
async function runHostControlCommand(commandName, args) {
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
const testEndpoint = process.env.AGENT_INFRA_TEST_HOST_CONTROL_ENDPOINT;
|
|
52
|
+
const forwardedEnvironment = testEndpoint
|
|
53
|
+
? Object.fromEntries(HOST_CONTROL_TEST_ENVIRONMENT_KEYS.flatMap((key) => process.env[key] === undefined ? [] : [[key, process.env[key]]]))
|
|
54
|
+
: {};
|
|
55
|
+
response = await requestHostControl({
|
|
56
|
+
request: hostControlRequestForCommand(commandName, args, process.cwd(), forwardedEnvironment),
|
|
57
|
+
endpoint: process.env.AGENT_INFRA_TEST_HOST_CONTROL_ENDPOINT ?? resolveHostControlEndpoint()
|
|
58
|
+
});
|
|
31
59
|
}
|
|
32
|
-
|
|
33
|
-
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof HostControlClientError) {
|
|
62
|
+
taskControlTransportFailure(error.message, error.changed === false
|
|
63
|
+
? 'SANDBOX_CONTROL_HOST_AUTHORITY_UNAVAILABLE' : error.code, error.changed);
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
34
66
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
67
|
+
process.stdout.write(response.stdout);
|
|
68
|
+
process.stderr.write(response.stderr);
|
|
69
|
+
process.exitCode = response.exitCode;
|
|
70
|
+
}
|
|
71
|
+
const hostWorkerRequested = process.env.AGENT_INFRA_HOST_CONTROL_WORKER === '1';
|
|
72
|
+
const hostWorker = hostWorkerRequested && (() => {
|
|
73
|
+
try {
|
|
74
|
+
const endpoint = process.env.AGENT_INFRA_TEST_HOST_CONTROL_ENDPOINT ?? resolveHostControlEndpoint();
|
|
75
|
+
return process.env.AGENT_INFRA_HOST_CONTROL_WORKER_TOKEN === readHostControlWorkerToken(endpoint);
|
|
38
76
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
if (hostWorkerRequested && !hostWorker && (taskControlCommand || taskWorkflowCommand || manualValidationWorkflowCommand)) {
|
|
82
|
+
taskControlTransportFailure('host-control worker authorization is invalid', 'SANDBOX_CONTROL_HOST_AUTHORITY_UNAVAILABLE');
|
|
83
|
+
}
|
|
84
|
+
let controlRouted = false;
|
|
85
|
+
if (!taskViewGuardFailed && (taskControlCommand || taskWorkflowCommand || manualValidationWorkflowCommand) && !hostWorker && !localTaskControlHelp) {
|
|
86
|
+
const transport = resolveSandboxControlTransport(process.env);
|
|
87
|
+
switch (transport.kind) {
|
|
88
|
+
case 'fail-closed': {
|
|
89
|
+
const reason = transport.reasonCode ?? 'TASK_CONTROL_TRANSPORT_INVALID';
|
|
90
|
+
taskControlTransportFailure(reason, reason.startsWith('SANDBOX_CONTROL_IDENTITY_') ? reason : undefined);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case 'direct-host':
|
|
94
|
+
await runHostControlCommand(command, process.argv.slice(3));
|
|
95
|
+
break;
|
|
96
|
+
case 'broker-client': {
|
|
97
|
+
const { sandboxControl } = await import('../lib/internal/sandbox-control.js');
|
|
98
|
+
await sandboxControl(['client', ...(taskControlCommand ? [command] : ['task-workflow', command]), ...process.argv.slice(3)]);
|
|
99
|
+
break;
|
|
56
100
|
}
|
|
57
101
|
}
|
|
102
|
+
controlRouted = true;
|
|
58
103
|
}
|
|
59
|
-
|
|
104
|
+
if (!controlRouted && !taskViewGuardFailed && internalRouteRegistered)
|
|
60
105
|
switch (command) {
|
|
106
|
+
case 'task-orchestration': {
|
|
107
|
+
const { taskOrchestration } = await import('../lib/internal/task-orchestration.js');
|
|
108
|
+
await taskOrchestration(process.argv.slice(3));
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'task-lifecycle': {
|
|
112
|
+
const { taskLifecycle } = await import('../lib/internal/task-lifecycle.js');
|
|
113
|
+
await taskLifecycle(process.argv.slice(3));
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
case 'task-finalization': {
|
|
117
|
+
const { taskFinalization } = await import('../lib/internal/task-finalization.js');
|
|
118
|
+
await taskFinalization(process.argv.slice(3));
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
61
121
|
case 'task-create': {
|
|
62
122
|
const { taskCreate } = await import('../lib/internal/task-create.js');
|
|
63
123
|
await taskCreate(process.argv.slice(3));
|
|
@@ -68,6 +128,11 @@ else
|
|
|
68
128
|
await sandboxControl(process.argv.slice(3));
|
|
69
129
|
break;
|
|
70
130
|
}
|
|
131
|
+
case 'host-control': {
|
|
132
|
+
const { hostControl } = await import('../lib/internal/host-control.js');
|
|
133
|
+
await hostControl(process.argv.slice(3));
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
71
136
|
case 'agent-client': {
|
|
72
137
|
const { agentClient } = await import('../lib/internal/agent-client.js');
|
|
73
138
|
agentClient(process.argv.slice(3));
|
|
@@ -138,6 +203,16 @@ else
|
|
|
138
203
|
await platformChecks(process.argv.slice(3));
|
|
139
204
|
break;
|
|
140
205
|
}
|
|
206
|
+
case 'platform-security': {
|
|
207
|
+
const { platformSecurity } = await import('../lib/internal/platform-security.js');
|
|
208
|
+
await platformSecurity(process.argv.slice(3));
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case 'platform-metadata': {
|
|
212
|
+
const { platformMetadata } = await import('../lib/internal/platform-metadata.js');
|
|
213
|
+
await platformMetadata(process.argv.slice(3));
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
141
216
|
case 'task-context': {
|
|
142
217
|
const { taskContext } = await import('../lib/internal/task-context.js');
|
|
143
218
|
taskContext(process.argv.slice(3));
|
|
@@ -148,6 +223,11 @@ else
|
|
|
148
223
|
await taskLedger(process.argv.slice(3));
|
|
149
224
|
break;
|
|
150
225
|
}
|
|
226
|
+
case 'task-qualification': {
|
|
227
|
+
const { taskQualification } = await import('../lib/internal/task-qualification.js');
|
|
228
|
+
await taskQualification(process.argv.slice(3));
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
151
231
|
case 'task-warning': {
|
|
152
232
|
const { taskWarning } = await import('../lib/internal/task-warning.js');
|
|
153
233
|
await taskWarning(process.argv.slice(3));
|
|
@@ -218,6 +298,11 @@ else
|
|
|
218
298
|
taskValidate(process.argv.slice(3));
|
|
219
299
|
break;
|
|
220
300
|
}
|
|
301
|
+
case 'manual-validation': {
|
|
302
|
+
const { manualValidation } = await import('../lib/internal/manual-validation.js');
|
|
303
|
+
await manualValidation(process.argv.slice(3));
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
221
306
|
default:
|
|
222
307
|
process.stdout.write(`${JSON.stringify({
|
|
223
308
|
status: 'failed',
|
|
@@ -226,5 +311,4 @@ else
|
|
|
226
311
|
})}\n`);
|
|
227
312
|
process.exitCode = 1;
|
|
228
313
|
}
|
|
229
|
-
export {};
|
|
230
314
|
//# sourceMappingURL=internal-cli.js.map
|
package/dist/lib/agent-client.js
CHANGED
|
@@ -6,6 +6,8 @@ import { listAgentClientAdapters } from './agent-clients/registry.js';
|
|
|
6
6
|
import { AGENT_CLIENT_IDS, isAgentClientId } from './agent-clients/types.js';
|
|
7
7
|
import { closePrompt, multiSelect } from './prompt.js';
|
|
8
8
|
import { resolveTemplateDir } from './paths.js';
|
|
9
|
+
import { PUBLIC_CLI_ROUTE_SELECTORS } from './internal/cli-route-inventory.js';
|
|
10
|
+
const AGENT_CLIENT_OPERATIONS = PUBLIC_CLI_ROUTE_SELECTORS['agent-client'];
|
|
9
11
|
const USAGE = `Usage: ai agent-client <operation>
|
|
10
12
|
|
|
11
13
|
Operations:
|
|
@@ -79,6 +81,9 @@ async function cmdAgentClient(args) {
|
|
|
79
81
|
process.stdout.write(USAGE);
|
|
80
82
|
return 0;
|
|
81
83
|
}
|
|
84
|
+
if (!AGENT_CLIENT_OPERATIONS.includes(operation)) {
|
|
85
|
+
throw new AgentClientCommandError('AGENT_CLIENT_OPERATION_INVALID', `Unknown operation '${operation}'`);
|
|
86
|
+
}
|
|
82
87
|
if (operation === 'list') {
|
|
83
88
|
if (args.length !== 1) {
|
|
84
89
|
throw new AgentClientCommandError('AGENT_CLIENT_ARGUMENT_INVALID', 'list accepts no arguments');
|
|
@@ -89,6 +89,21 @@ function provenanceDetail(record, expected) {
|
|
|
89
89
|
function exactKeys(value, keys) {
|
|
90
90
|
return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
|
|
91
91
|
}
|
|
92
|
+
function isRecoveryPhase(value) {
|
|
93
|
+
return value === 'orchestration.prepare'
|
|
94
|
+
|| value === 'artifact.finalize-local'
|
|
95
|
+
|| value === 'task-event.completed';
|
|
96
|
+
}
|
|
97
|
+
function isRecoveryPhaseRecord(value) {
|
|
98
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
99
|
+
return false;
|
|
100
|
+
const phase = value;
|
|
101
|
+
return exactKeys(phase, ['phase', 'requestId', 'state'])
|
|
102
|
+
&& isRecoveryPhase(phase.phase)
|
|
103
|
+
&& typeof phase.requestId === 'string'
|
|
104
|
+
&& /^[a-f0-9-]{16,64}$/u.test(phase.requestId)
|
|
105
|
+
&& (phase.state === 'issued' || phase.state === 'consumed');
|
|
106
|
+
}
|
|
92
107
|
function isCodexControllerBinding(value) {
|
|
93
108
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
94
109
|
return false;
|
|
@@ -176,18 +191,26 @@ function createCodexCapabilityStore(options = {}) {
|
|
|
176
191
|
const root = options.root
|
|
177
192
|
?? resolveAgentRuntimeStoreRoot({ store: 'capabilities' });
|
|
178
193
|
const now = options.now ?? Date.now;
|
|
179
|
-
const
|
|
194
|
+
const createReference = options.reference ?? (() => crypto.randomBytes(32).toString('base64url'));
|
|
180
195
|
const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
181
196
|
const tombstoneMs = options.tombstoneMs ?? DEFAULT_TOMBSTONE_MS;
|
|
182
197
|
const maxRecords = options.maxRecords ?? DEFAULT_MAX_RECORDS;
|
|
183
198
|
fs.mkdirSync(root, { recursive: true, mode: 0o700 });
|
|
184
199
|
fs.chmodSync(root, 0o700);
|
|
185
|
-
function fileFor(
|
|
186
|
-
return path.join(root, `${digest(
|
|
200
|
+
function fileFor(capabilityRef) {
|
|
201
|
+
return path.join(root, `${digest(capabilityRef)}.json`);
|
|
187
202
|
}
|
|
188
203
|
function read(file) {
|
|
189
204
|
const value = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
190
|
-
|
|
205
|
+
const keys = Object.keys(value).sort().join(',');
|
|
206
|
+
if (keys !== 'armedAt,attestedAt,buildIdentity,capabilityRefDigest,consumedAt,controller,expiresAt,hookDefinitionHash,recoveryOperationId,recoveryPhases,recoveryState,reservedAt,revision,schemaVersion,sessionId,status,taskId,toolUseId,turnId'
|
|
207
|
+
|| value.schemaVersion !== 2 || !Number.isSafeInteger(value.revision) || value.revision < 1
|
|
208
|
+
|| typeof value.capabilityRefDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(value.capabilityRefDigest)
|
|
209
|
+
|| !['unreserved', 'reserved', 'consumed'].includes(value.recoveryState)
|
|
210
|
+
|| (value.recoveryOperationId !== null && typeof value.recoveryOperationId !== 'string')
|
|
211
|
+
|| (value.reservedAt !== null && !Number.isSafeInteger(value.reservedAt))
|
|
212
|
+
|| !Array.isArray(value.recoveryPhases)
|
|
213
|
+
|| !value.recoveryPhases.every((phase) => isRecoveryPhaseRecord(phase))) {
|
|
191
214
|
throw capabilityError('CODEX_CAPABILITY_STATE_INVALID', 'capability record schema is invalid');
|
|
192
215
|
}
|
|
193
216
|
return value;
|
|
@@ -294,17 +317,21 @@ function createCodexCapabilityStore(options = {}) {
|
|
|
294
317
|
}
|
|
295
318
|
function arm(input) {
|
|
296
319
|
sweep();
|
|
297
|
-
const
|
|
298
|
-
const file = fileFor(
|
|
320
|
+
const capabilityRef = createReference();
|
|
321
|
+
const file = fileFor(capabilityRef);
|
|
299
322
|
if (fs.existsSync(file))
|
|
300
323
|
throw capabilityError('CODEX_CAPABILITY_TOKEN_COLLISION', 'capability token already exists');
|
|
301
324
|
const timestamp = now();
|
|
302
325
|
const record = Object.freeze({
|
|
303
|
-
schemaVersion:
|
|
326
|
+
schemaVersion: 2,
|
|
304
327
|
revision: 1,
|
|
305
|
-
|
|
328
|
+
capabilityRefDigest: digest(capabilityRef),
|
|
306
329
|
taskId: input.taskId,
|
|
307
330
|
status: 'armed',
|
|
331
|
+
recoveryOperationId: null,
|
|
332
|
+
recoveryState: 'unreserved',
|
|
333
|
+
reservedAt: null,
|
|
334
|
+
recoveryPhases: Object.freeze([]),
|
|
308
335
|
buildIdentity: input.buildIdentity,
|
|
309
336
|
controller: input.controller ?? null,
|
|
310
337
|
sessionId: null,
|
|
@@ -317,26 +344,27 @@ function createCodexCapabilityStore(options = {}) {
|
|
|
317
344
|
consumedAt: null
|
|
318
345
|
});
|
|
319
346
|
write(file, record, 0);
|
|
320
|
-
|
|
347
|
+
const result = {
|
|
321
348
|
...record,
|
|
322
|
-
|
|
349
|
+
capabilityRef,
|
|
323
350
|
path: file,
|
|
324
|
-
marker: `agent-infra-codex-capability:${
|
|
325
|
-
}
|
|
351
|
+
marker: `agent-infra-codex-capability:${capabilityRef}`
|
|
352
|
+
};
|
|
353
|
+
return Object.freeze(result);
|
|
326
354
|
}
|
|
327
|
-
function loadActive(
|
|
328
|
-
const file = fileFor(
|
|
355
|
+
function loadActive(capabilityRef, options = {}) {
|
|
356
|
+
const file = fileFor(capabilityRef);
|
|
329
357
|
if (!fs.existsSync(file)) {
|
|
330
358
|
throw capabilityError('CODEX_CAPABILITY_MISSING', 'capability token was not found');
|
|
331
359
|
}
|
|
332
360
|
const record = expire(read(file), file, now());
|
|
333
|
-
if (record.status === 'expired') {
|
|
361
|
+
if (record.status === 'expired' && !options.allowExpiredReserved) {
|
|
334
362
|
throw capabilityError('CODEX_CAPABILITY_EXPIRED', 'capability token expired');
|
|
335
363
|
}
|
|
336
364
|
return { file, record };
|
|
337
365
|
}
|
|
338
|
-
function
|
|
339
|
-
const { file, record } = loadActive(input.
|
|
366
|
+
function attestByReference(input) {
|
|
367
|
+
const { file, record } = loadActive(input.capabilityRef);
|
|
340
368
|
if (record.status !== 'armed') {
|
|
341
369
|
throw capabilityError(record.status === 'consumed' ? 'CODEX_CAPABILITY_REPLAY' : 'CODEX_CAPABILITY_STATE_INVALID', `capability is ${record.status}, expected armed`);
|
|
342
370
|
}
|
|
@@ -362,11 +390,14 @@ function createCodexCapabilityStore(options = {}) {
|
|
|
362
390
|
write(file, next, record.revision);
|
|
363
391
|
return next;
|
|
364
392
|
}
|
|
365
|
-
function validateRecord(record, expected) {
|
|
393
|
+
function validateRecord(record, expected, options = {}) {
|
|
366
394
|
if (record.status === 'consumed') {
|
|
367
395
|
throw capabilityError('CODEX_CAPABILITY_REPLAY', 'capability token was already consumed');
|
|
368
396
|
}
|
|
369
|
-
|
|
397
|
+
const expiredReserved = options.allowExpiredReserved
|
|
398
|
+
&& record.status === 'expired'
|
|
399
|
+
&& record.recoveryState === 'reserved';
|
|
400
|
+
if (record.status !== 'attested' && !expiredReserved) {
|
|
370
401
|
throw capabilityError('CODEX_CAPABILITY_NOT_ATTESTED', 'capability token has no current-session hook attestation');
|
|
371
402
|
}
|
|
372
403
|
const identity = record.buildIdentity && typeof record.buildIdentity === 'object'
|
|
@@ -380,28 +411,135 @@ function createCodexCapabilityStore(options = {}) {
|
|
|
380
411
|
}
|
|
381
412
|
return record;
|
|
382
413
|
}
|
|
383
|
-
function
|
|
414
|
+
function validateReference(capabilityRef, expected) {
|
|
384
415
|
sweep();
|
|
385
|
-
const { record } = loadActive(
|
|
416
|
+
const { record } = loadActive(capabilityRef);
|
|
386
417
|
return validateRecord(record, expected);
|
|
387
418
|
}
|
|
388
|
-
function
|
|
419
|
+
function consumeReference(capabilityRef, operationId, expected, options = {}) {
|
|
389
420
|
sweep();
|
|
390
|
-
|
|
391
|
-
|
|
421
|
+
if (!operationId || /[\r\n]/u.test(operationId)) {
|
|
422
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'recovery operation id is invalid');
|
|
423
|
+
}
|
|
424
|
+
const { file, record } = loadActive(capabilityRef, options);
|
|
425
|
+
if (record.status === 'consumed' && record.recoveryState === 'consumed' && record.recoveryOperationId === operationId) {
|
|
426
|
+
return record;
|
|
427
|
+
}
|
|
428
|
+
validateRecord(record, expected, options);
|
|
429
|
+
if (record.recoveryState === 'consumed') {
|
|
430
|
+
if (record.recoveryOperationId === operationId)
|
|
431
|
+
return record;
|
|
432
|
+
throw capabilityError('CODEX_CAPABILITY_REPLAY', 'capability recovery operation was already consumed');
|
|
433
|
+
}
|
|
434
|
+
if (record.recoveryState !== 'reserved' || record.recoveryOperationId !== operationId) {
|
|
435
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'capability must be reserved by this operation before consumption');
|
|
436
|
+
}
|
|
392
437
|
const next = Object.freeze({
|
|
393
438
|
...record,
|
|
394
439
|
revision: record.revision + 1,
|
|
395
440
|
status: 'consumed',
|
|
441
|
+
recoveryState: 'consumed',
|
|
396
442
|
consumedAt: now()
|
|
397
443
|
});
|
|
398
444
|
write(file, next, record.revision);
|
|
399
445
|
return next;
|
|
400
446
|
}
|
|
401
|
-
function
|
|
402
|
-
|
|
447
|
+
function reserveRecoveryPhase(capabilityRef, operationId, phase, requestId, expected) {
|
|
448
|
+
if (!operationId || /[\r\n]/u.test(operationId) || !isRecoveryPhase(phase)
|
|
449
|
+
|| !/^[a-f0-9-]{16,64}$/u.test(requestId)) {
|
|
450
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'recovery phase identity is invalid');
|
|
451
|
+
}
|
|
452
|
+
sweep();
|
|
453
|
+
const { file, record } = loadActive(capabilityRef);
|
|
454
|
+
validateRecord(record, expected);
|
|
455
|
+
if (record.recoveryState !== 'reserved' || record.recoveryOperationId !== operationId) {
|
|
456
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'capability must be reserved by this operation before phase reservation');
|
|
457
|
+
}
|
|
458
|
+
if (record.recoveryPhases.some((entry) => entry.phase === phase)) {
|
|
459
|
+
throw capabilityError('CODEX_CAPABILITY_PHASE_REPLAY', 'recovery phase was already reserved');
|
|
460
|
+
}
|
|
461
|
+
const next = Object.freeze({
|
|
462
|
+
...record,
|
|
463
|
+
revision: record.revision + 1,
|
|
464
|
+
recoveryPhases: Object.freeze([
|
|
465
|
+
...record.recoveryPhases,
|
|
466
|
+
Object.freeze({ phase, requestId, state: 'issued' })
|
|
467
|
+
])
|
|
468
|
+
});
|
|
469
|
+
write(file, next, record.revision);
|
|
470
|
+
return next;
|
|
471
|
+
}
|
|
472
|
+
function consumeRecoveryPhase(capabilityRef, operationId, phase, requestId, expected, options = {}) {
|
|
473
|
+
if (!operationId || /[\r\n]/u.test(operationId) || !isRecoveryPhase(phase)
|
|
474
|
+
|| !/^[a-f0-9-]{16,64}$/u.test(requestId)) {
|
|
475
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'recovery phase identity is invalid');
|
|
476
|
+
}
|
|
477
|
+
sweep();
|
|
478
|
+
const { file, record } = loadActive(capabilityRef, options);
|
|
479
|
+
validateRecord(record, expected, options);
|
|
480
|
+
if (record.recoveryState !== 'reserved' && record.recoveryState !== 'consumed') {
|
|
481
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'capability has no reserved recovery operation');
|
|
482
|
+
}
|
|
483
|
+
if (record.recoveryOperationId !== operationId) {
|
|
484
|
+
throw capabilityError('CODEX_CAPABILITY_REPLAY', 'capability recovery operation does not match');
|
|
485
|
+
}
|
|
486
|
+
const current = record.recoveryPhases.find((entry) => entry.phase === phase);
|
|
487
|
+
if (!current || current.requestId !== requestId) {
|
|
488
|
+
throw capabilityError('CODEX_CAPABILITY_PHASE_REPLAY', 'recovery phase identity does not match');
|
|
489
|
+
}
|
|
490
|
+
if (current.state === 'consumed')
|
|
491
|
+
return record;
|
|
492
|
+
const next = Object.freeze({
|
|
493
|
+
...record,
|
|
494
|
+
revision: record.revision + 1,
|
|
495
|
+
recoveryPhases: Object.freeze(record.recoveryPhases.map((entry) => entry.phase === phase ? Object.freeze({ ...entry, state: 'consumed' }) : entry))
|
|
496
|
+
});
|
|
497
|
+
write(file, next, record.revision);
|
|
498
|
+
return next;
|
|
499
|
+
}
|
|
500
|
+
function reserveReference(capabilityRef, operationId, expected) {
|
|
501
|
+
if (!operationId || /[\r\n]/u.test(operationId)) {
|
|
502
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'recovery operation id is invalid');
|
|
503
|
+
}
|
|
504
|
+
sweep();
|
|
505
|
+
const { file, record } = loadActive(capabilityRef);
|
|
506
|
+
validateRecord(record, expected);
|
|
507
|
+
if (record.recoveryState === 'reserved') {
|
|
508
|
+
if (record.recoveryOperationId === operationId)
|
|
509
|
+
return record;
|
|
510
|
+
throw capabilityError('CODEX_CAPABILITY_BUSY', 'capability is reserved by another recovery operation');
|
|
511
|
+
}
|
|
512
|
+
if (record.recoveryState === 'consumed') {
|
|
513
|
+
if (record.recoveryOperationId === operationId)
|
|
514
|
+
return record;
|
|
515
|
+
throw capabilityError('CODEX_CAPABILITY_REPLAY', 'capability recovery operation was already consumed');
|
|
516
|
+
}
|
|
517
|
+
const next = Object.freeze({
|
|
518
|
+
...record,
|
|
519
|
+
revision: record.revision + 1,
|
|
520
|
+
recoveryOperationId: operationId,
|
|
521
|
+
recoveryState: 'reserved',
|
|
522
|
+
reservedAt: now()
|
|
523
|
+
});
|
|
524
|
+
write(file, next, record.revision);
|
|
525
|
+
return next;
|
|
526
|
+
}
|
|
527
|
+
function inspectReference(capabilityRef) {
|
|
528
|
+
return loadActive(capabilityRef).record;
|
|
529
|
+
}
|
|
530
|
+
function findByRecoveryOperation(operationId) {
|
|
531
|
+
if (!operationId || /[\r\n]/u.test(operationId)) {
|
|
532
|
+
throw capabilityError('CODEX_CAPABILITY_RECOVERY_INVALID', 'recovery operation id is invalid');
|
|
533
|
+
}
|
|
534
|
+
return Object.freeze(files()
|
|
535
|
+
.map((file) => read(file))
|
|
536
|
+
.filter((record) => record.recoveryOperationId === operationId));
|
|
403
537
|
}
|
|
404
|
-
return Object.freeze({
|
|
538
|
+
return Object.freeze({
|
|
539
|
+
arm, attestByReference, reserveReference, reserveRecoveryPhase, consumeRecoveryPhase,
|
|
540
|
+
consumeReference, inspectReference,
|
|
541
|
+
findByRecoveryOperation, validateReference, sweep
|
|
542
|
+
});
|
|
405
543
|
}
|
|
406
544
|
export { createCodexCapabilityStore };
|
|
407
545
|
export { isCodexCapabilityProvenanceDetail };
|
|
@@ -274,9 +274,10 @@ function prepareCodexSandboxController(input, options = {}) {
|
|
|
274
274
|
const shimDir = path.join(home, 'bin');
|
|
275
275
|
fs.mkdirSync(shimDir, { mode: 0o700 });
|
|
276
276
|
const internalCli = path.resolve(process.argv[1] ?? path.join(repoRoot, 'bin', 'internal-cli.ts'));
|
|
277
|
+
const launcherPrefix = ['#!/bin/sh', 'set -eu', 'unset NODE_OPTIONS NODE_PATH'].join('\n') + '\n';
|
|
277
278
|
const source = internalCli.endsWith('.ts')
|
|
278
|
-
?
|
|
279
|
-
:
|
|
279
|
+
? `${launcherPrefix}exec ${shellQuote(process.execPath)} --experimental-strip-types ${shellQuote(internalCli)} "$@"\n`
|
|
280
|
+
: `${launcherPrefix}exec ${shellQuote(process.execPath)} ${shellQuote(internalCli)} "$@"\n`;
|
|
280
281
|
fs.writeFileSync(path.join(shimDir, 'agent-infra-internal'), source, { mode: 0o700 });
|
|
281
282
|
const policy = [
|
|
282
283
|
input.executorModel ? `--executor-model ${input.executorModel}` : '',
|