@fitlab-ai/agent-infra 0.9.13 → 0.9.14
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/bin/cli.ts +26 -9
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +42 -21
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/internal/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +152 -0
- package/dist/lib/internal/codex-lifecycle.js +9 -6
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/git-workflow.js +10 -6
- 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 +24 -10
- 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 +19 -5
- package/dist/lib/internal/sandbox-control.js +22 -5
- package/dist/lib/internal/task-activity.js +13 -4
- package/dist/lib/internal/task-artifact.js +186 -27
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +48 -15
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +4 -1
- 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 +421 -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 +4 -1
- 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 +7 -2
- package/dist/lib/internal/task-verify.js +5 -1
- package/dist/lib/internal/task-warning.js +8 -1
- package/dist/lib/platform/comment-safety.js +226 -0
- package/dist/lib/platform/github-provider.js +233 -6
- package/dist/lib/platform/issue-comments.js +146 -34
- package/dist/lib/platform/pr-change-report.js +6 -12
- package/dist/lib/platform/pr-summary.js +28 -7
- 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 +115 -170
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/verification-sync.js +33 -26
- package/dist/lib/process-data/index.js +7 -0
- 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 +32 -6
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +827 -120
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/client.js +83 -9
- 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 +149 -14
- package/dist/lib/sandbox/control/lifecycle.js +621 -127
- package/dist/lib/sandbox/control/native-file-lock.js +177 -0
- package/dist/lib/sandbox/control/server.js +305 -35
- package/dist/lib/sandbox/control/state.js +5 -3
- package/dist/lib/sandbox/control/task-view.js +183 -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 +5 -0
- package/dist/lib/sandbox/recovery.js +21 -1
- package/dist/lib/sandbox/workspace-view.js +2 -1
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- package/dist/lib/task/artifact-lifecycle.js +42 -13
- package/dist/lib/task/artifact-operations.js +520 -0
- package/dist/lib/task/artifact-repair-intent.js +59 -0
- package/dist/lib/task/artifact-schema.js +135 -0
- package/dist/lib/task/capabilities.js +72 -1
- package/dist/lib/task/control-authority.js +4 -0
- package/dist/lib/task/create-service.js +103 -4
- package/dist/lib/task/create.js +25 -0
- package/dist/lib/task/events.js +186 -67
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/local-artifact-finalization.js +75 -150
- package/dist/lib/task/orchestration.js +192 -52
- package/dist/lib/task/qualification-audit.js +490 -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 +22 -23
- package/dist/lib/task/review-finalization.js +121 -4
- package/dist/lib/task/sections.js +6 -4
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +54 -4
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/internal/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +140 -0
- package/lib/internal/codex-lifecycle.ts +8 -6
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/git-workflow.ts +9 -6
- 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 +23 -10
- 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 +17 -5
- package/lib/internal/sandbox-control.ts +19 -5
- package/lib/internal/task-activity.ts +12 -4
- package/lib/internal/task-artifact.ts +164 -25
- 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 +3 -1
- 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 +482 -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 +3 -1
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +6 -2
- package/lib/internal/task-verify.ts +4 -1
- package/lib/internal/task-warning.ts +7 -1
- package/lib/platform/comment-safety.ts +250 -0
- package/lib/platform/github-provider.ts +229 -7
- package/lib/platform/issue-comments.ts +160 -35
- package/lib/platform/pr-change-report.ts +6 -12
- package/lib/platform/pr-summary.ts +27 -6
- package/lib/platform/provider-contract.ts +78 -3
- package/lib/platform/provider-validation.ts +85 -3
- package/lib/platform/pull-requests.ts +126 -178
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/verification-sync.ts +32 -28
- package/lib/process-data/index.ts +7 -0
- package/lib/run/index.ts +5 -0
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +46 -6
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +1000 -87
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/client.ts +103 -9
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +177 -12
- package/lib/sandbox/control/lifecycle.ts +629 -17
- package/lib/sandbox/control/native-file-lock.ts +209 -0
- package/lib/sandbox/control/protocol.ts +5 -2
- package/lib/sandbox/control/server.ts +319 -37
- package/lib/sandbox/control/state.ts +6 -3
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +7 -0
- package/lib/sandbox/recovery.ts +21 -1
- package/lib/sandbox/workspace-view.ts +9 -3
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/task/artifact-lifecycle.ts +38 -16
- package/lib/task/artifact-operations.ts +626 -0
- package/lib/task/artifact-repair-intent.ts +71 -0
- package/lib/task/artifact-schema.ts +192 -0
- package/lib/task/capabilities.ts +70 -1
- package/lib/task/control-authority.ts +11 -1
- package/lib/task/create-service.ts +131 -6
- package/lib/task/create.ts +27 -0
- package/lib/task/events.ts +161 -65
- package/lib/task/index.ts +16 -3
- package/lib/task/local-artifact-finalization.ts +87 -218
- package/lib/task/orchestration.ts +172 -49
- package/lib/task/qualification-audit.ts +599 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -22
- package/lib/task/review-finalization.ts +133 -4
- package/lib/task/sections.ts +6 -4
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +55 -4
- package/package.json +6 -1
- 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/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 +5 -1
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
- 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/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 +5 -1
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
- package/templates/.agents/skills/test/SKILL.en.md +13 -2
- package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
- 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/.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
|
@@ -2,6 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { inspectPlatformPullRequestByNumber } from '../platform/pull-requests.js';
|
|
4
4
|
import { listPrReviews, publishPrReview } from '../platform/pr-review.js';
|
|
5
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
5
6
|
const USAGE = `Usage: agent-infra-internal platform-pr-review inspect --pr <token> [--cwd <path>]
|
|
6
7
|
agent-infra-internal platform-pr-review list --pr <token> [--cwd <path>]
|
|
7
8
|
agent-infra-internal platform-pr-review publish --pr <token> --scope <taskId|pr{N}> --round <N> --commit <sha> --event <COMMENT|APPROVE|REQUEST_CHANGES> --body-file <path|-> [--dry-run] [--cwd <path>]
|
|
@@ -48,12 +49,18 @@ function readBodyFile(value, cwd) {
|
|
|
48
49
|
return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
|
|
49
50
|
}
|
|
50
51
|
async function platformPrReview(args = []) {
|
|
52
|
+
if (!ensureInternalHandlerRoute('platform-pr-review', args))
|
|
53
|
+
return;
|
|
51
54
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
52
55
|
process.stdout.write(USAGE);
|
|
53
56
|
return;
|
|
54
57
|
}
|
|
55
58
|
const operation = args[0];
|
|
56
|
-
if (!operation || ![
|
|
59
|
+
if (!operation || ![
|
|
60
|
+
internalHandlerRoute('platform-pr-review', 'inspect', operation),
|
|
61
|
+
internalHandlerRoute('platform-pr-review', 'list', operation),
|
|
62
|
+
operation === 'publish'
|
|
63
|
+
].some(Boolean)) {
|
|
57
64
|
fail('a valid operation is required');
|
|
58
65
|
return;
|
|
59
66
|
}
|
|
@@ -79,15 +86,16 @@ async function platformPrReview(args = []) {
|
|
|
79
86
|
fail(`${operation} requires --pr <token>`);
|
|
80
87
|
return;
|
|
81
88
|
}
|
|
82
|
-
if (
|
|
89
|
+
if (internalHandlerRoute('platform-pr-review', 'inspect', operation)) {
|
|
83
90
|
finish(await inspectPlatformPullRequestByNumber(pr, { cwd }));
|
|
84
91
|
return;
|
|
85
92
|
}
|
|
86
|
-
if (
|
|
93
|
+
if (internalHandlerRoute('platform-pr-review', 'list', operation)) {
|
|
87
94
|
finish(await listPrReviews(pr, { cwd }));
|
|
88
95
|
return;
|
|
89
96
|
}
|
|
90
97
|
const scope = typeof values.scope === 'string' ? values.scope : '';
|
|
98
|
+
const publishSelector = /^TASK-\d{8}-\d{6}$/u.test(scope) ? 'publish-task' : /^pr\d+$/u.test(scope) ? 'publish-pr' : '';
|
|
91
99
|
const round = Number(values.round);
|
|
92
100
|
const commit = typeof values.commit === 'string' ? values.commit : '';
|
|
93
101
|
const event = values.event;
|
|
@@ -95,6 +103,11 @@ async function platformPrReview(args = []) {
|
|
|
95
103
|
fail('publish requires --scope <taskId|pr{N}>');
|
|
96
104
|
return;
|
|
97
105
|
}
|
|
106
|
+
if (!internalHandlerRoute('platform-pr-review', 'publish-task', publishSelector)
|
|
107
|
+
&& !internalHandlerRoute('platform-pr-review', 'publish-pr', publishSelector)) {
|
|
108
|
+
fail('publish scope is not registered');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
98
111
|
if (!Number.isInteger(round) || round <= 0) {
|
|
99
112
|
fail('publish requires a positive --round');
|
|
100
113
|
return;
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
|
|
4
4
|
import { bindPlatformPullRequest, createPlatformPullRequest, inspectPlatformPullRequest, resolveExternalPullRequest, skipPlatformPullRequestFact, syncPlatformPullRequest, syncPlatformPullRequestInLabels } from '../platform/pull-requests.js';
|
|
5
5
|
import { reportWrite, summaryContext, syncPullRequestSummary } from '../platform/pr-summary.js';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
6
7
|
const USAGE = `Usage: agent-infra-internal platform-pr inspect <task-ref> [--cwd <path>]
|
|
7
8
|
agent-infra-internal platform-pr resolve-external <task-ref> --agent <agent> [--pr <token>] [--dry-run] [--cwd <path>]
|
|
8
9
|
agent-infra-internal platform-pr create <task-ref> --agent <agent> --base <branch> --head <branch> --title-file <path|-> --body-file <path|-> [--draft] [--dry-run] [--cwd <path>]
|
|
@@ -56,16 +57,29 @@ function readFile(value, cwd) {
|
|
|
56
57
|
return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
|
|
57
58
|
}
|
|
58
59
|
async function platformPr(args = []) {
|
|
60
|
+
if (!ensureInternalHandlerRoute('platform-pr', args))
|
|
61
|
+
return;
|
|
59
62
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
60
63
|
process.stdout.write(USAGE);
|
|
61
64
|
return;
|
|
62
65
|
}
|
|
63
66
|
const operation = args[0];
|
|
64
|
-
if (!operation || ![
|
|
67
|
+
if (!operation || ![
|
|
68
|
+
internalHandlerRoute('platform-pr', 'inspect', operation),
|
|
69
|
+
internalHandlerRoute('platform-pr', 'resolve-external', operation),
|
|
70
|
+
internalHandlerRoute('platform-pr', 'create', operation),
|
|
71
|
+
internalHandlerRoute('platform-pr', 'bind', operation),
|
|
72
|
+
internalHandlerRoute('platform-pr', 'skip', operation),
|
|
73
|
+
internalHandlerRoute('platform-pr', 'sync', operation),
|
|
74
|
+
internalHandlerRoute('platform-pr', 'sync-in-labels', operation),
|
|
75
|
+
internalHandlerRoute('platform-pr', 'summary-context', operation),
|
|
76
|
+
internalHandlerRoute('platform-pr', 'change-report', operation),
|
|
77
|
+
internalHandlerRoute('platform-pr', 'summary-sync', operation)
|
|
78
|
+
].some(Boolean)) {
|
|
65
79
|
fail('a valid operation is required');
|
|
66
80
|
return;
|
|
67
81
|
}
|
|
68
|
-
if (
|
|
82
|
+
if (internalHandlerRoute('platform-pr', 'sync-in-labels', operation)) {
|
|
69
83
|
const parsed = parse(args, 1);
|
|
70
84
|
if (parsed.error) {
|
|
71
85
|
fail(parsed.error);
|
|
@@ -115,11 +129,11 @@ async function platformPr(args = []) {
|
|
|
115
129
|
fail(`${operation} does not accept --${unexpected}`);
|
|
116
130
|
return;
|
|
117
131
|
}
|
|
118
|
-
if (
|
|
132
|
+
if (internalHandlerRoute('platform-pr', 'inspect', operation)) {
|
|
119
133
|
finish(await inspectPlatformPullRequest(taskRef, { cwd }));
|
|
120
134
|
return;
|
|
121
135
|
}
|
|
122
|
-
if (
|
|
136
|
+
if (internalHandlerRoute('platform-pr', 'summary-context', operation)) {
|
|
123
137
|
finish(await summaryContext(taskRef, { cwd }));
|
|
124
138
|
return;
|
|
125
139
|
}
|
|
@@ -133,7 +147,7 @@ async function platformPr(args = []) {
|
|
|
133
147
|
return;
|
|
134
148
|
}
|
|
135
149
|
values.agent = agent;
|
|
136
|
-
if (
|
|
150
|
+
if (internalHandlerRoute('platform-pr', 'change-report', operation)) {
|
|
137
151
|
if (typeof values.mechanicalFile !== 'string' || typeof values.precheckFile !== 'string') {
|
|
138
152
|
fail('change-report requires --mechanical-file and --precheck-file');
|
|
139
153
|
return;
|
|
@@ -143,7 +157,7 @@ async function platformPr(args = []) {
|
|
|
143
157
|
}));
|
|
144
158
|
return;
|
|
145
159
|
}
|
|
146
|
-
if (
|
|
160
|
+
if (internalHandlerRoute('platform-pr', 'skip', operation)) {
|
|
147
161
|
finish(await skipPlatformPullRequestFact(taskRef, { cwd, agent, dryRun: values.dryRun === true }));
|
|
148
162
|
return;
|
|
149
163
|
}
|
|
@@ -152,7 +166,7 @@ async function platformPr(args = []) {
|
|
|
152
166
|
fail('--result must be pr_created, pr_reused, or no_op');
|
|
153
167
|
return;
|
|
154
168
|
}
|
|
155
|
-
if (
|
|
169
|
+
if (internalHandlerRoute('platform-pr', 'resolve-external', operation)) {
|
|
156
170
|
const pr = values.pr === undefined ? undefined : values.pr;
|
|
157
171
|
if (pr !== undefined && (typeof pr !== 'string' || !pr)) {
|
|
158
172
|
fail('resolve-external requires --pr <token>');
|
|
@@ -161,7 +175,7 @@ async function platformPr(args = []) {
|
|
|
161
175
|
finish(await resolveExternalPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
|
|
162
176
|
return;
|
|
163
177
|
}
|
|
164
|
-
if (
|
|
178
|
+
if (internalHandlerRoute('platform-pr', 'bind', operation)) {
|
|
165
179
|
const pr = values.pr;
|
|
166
180
|
if (typeof pr !== 'string' || !pr) {
|
|
167
181
|
fail('bind requires --pr <token>');
|
|
@@ -170,7 +184,7 @@ async function platformPr(args = []) {
|
|
|
170
184
|
finish(await bindPlatformPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
|
|
171
185
|
return;
|
|
172
186
|
}
|
|
173
|
-
if (
|
|
187
|
+
if (internalHandlerRoute('platform-pr', 'sync', operation)) {
|
|
174
188
|
if (values.metadata !== true && values.closingIssue !== true) {
|
|
175
189
|
fail('sync requires --metadata or --closing-issue');
|
|
176
190
|
return;
|
|
@@ -182,7 +196,7 @@ async function platformPr(args = []) {
|
|
|
182
196
|
finish(await syncPlatformPullRequest(taskRef, { cwd, agent: values.agent, metadata: values.metadata === true, closingIssue: values.closingIssue === true, primaryResult: primaryResult, dryRun: values.dryRun === true }));
|
|
183
197
|
return;
|
|
184
198
|
}
|
|
185
|
-
if (
|
|
199
|
+
if (internalHandlerRoute('platform-pr', 'summary-sync', operation)) {
|
|
186
200
|
if (typeof values.bodyFile !== 'string') {
|
|
187
201
|
fail('summary-sync requires --body-file');
|
|
188
202
|
return;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { publishReleaseNotes, releaseNoteContext, stageReleaseNotes } from '../platform/release-notes.js';
|
|
4
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
4
5
|
function parseOptions(args, valueFlags, switchFlags = []) {
|
|
5
6
|
const values = new Map();
|
|
6
7
|
const switches = new Set();
|
|
@@ -29,8 +30,10 @@ function finish(result) {
|
|
|
29
30
|
process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
30
31
|
}
|
|
31
32
|
async function platformReleaseNotes(args = []) {
|
|
33
|
+
if (!ensureInternalHandlerRoute('platform-release-notes', args))
|
|
34
|
+
return;
|
|
32
35
|
const [action, ...rest] = args;
|
|
33
|
-
if (action
|
|
36
|
+
if (internalHandlerRoute('platform-release-notes', 'context', action ?? '')) {
|
|
34
37
|
const parsed = parseOptions(rest, ['--cwd', '--history-limit', '--from-tag', '--to-tag', '--branch']);
|
|
35
38
|
if (!parsed)
|
|
36
39
|
return finish(invalidInput('invalid context options'));
|
|
@@ -44,7 +47,7 @@ async function platformReleaseNotes(args = []) {
|
|
|
44
47
|
}, { cwd }));
|
|
45
48
|
return;
|
|
46
49
|
}
|
|
47
|
-
if (action
|
|
50
|
+
if (internalHandlerRoute('platform-release-notes', 'stage', action ?? '')) {
|
|
48
51
|
const parsed = parseOptions(rest, ['--cwd', '--notes-file']);
|
|
49
52
|
if (!parsed)
|
|
50
53
|
return finish(invalidInput('invalid stage options'));
|
|
@@ -54,7 +57,7 @@ async function platformReleaseNotes(args = []) {
|
|
|
54
57
|
finish(stageReleaseNotes({ notesFile }, { cwd: path.resolve(parsed.values.get('--cwd') || process.cwd()) }));
|
|
55
58
|
return;
|
|
56
59
|
}
|
|
57
|
-
if (action
|
|
60
|
+
if (internalHandlerRoute('platform-release-notes', 'publish', action ?? '')) {
|
|
58
61
|
const parsed = parseOptions(rest, ['--cwd', '--notes-file', '--tag', '--title', '--expected-sha256'], ['--dry-run']);
|
|
59
62
|
if (!parsed)
|
|
60
63
|
return finish(invalidInput('invalid publish options'));
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { dismissSecurityAlert, readCommentFile, readSecurityAlert } from '../platform/security-alerts.js';
|
|
3
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
4
|
+
const USAGE = `Usage: agent-infra-internal platform-security read --kind <dependabot|code-scanning> --number <number> [--cwd <path>]
|
|
5
|
+
agent-infra-internal platform-security dismiss --kind <dependabot|code-scanning> --number <number> --reason <reason> --comment-file <path> [--cwd <path>]
|
|
6
|
+
`;
|
|
7
|
+
function fail(message) {
|
|
8
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'SECURITY_INPUT_INVALID', message, retryable: false } })}\n`);
|
|
9
|
+
process.stderr.write(USAGE);
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
}
|
|
12
|
+
function finish(result) {
|
|
13
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
14
|
+
process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
15
|
+
}
|
|
16
|
+
function parseOptions(args) {
|
|
17
|
+
const values = new Map();
|
|
18
|
+
const switches = new Set();
|
|
19
|
+
const valueFlags = new Set(['--cwd', '--kind', '--number', '--reason', '--comment-file']);
|
|
20
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
21
|
+
const flag = args[index];
|
|
22
|
+
if (flag === '--help' || flag === '-h')
|
|
23
|
+
return null;
|
|
24
|
+
if (!valueFlags.has(flag) || values.has(flag) || switches.has(flag))
|
|
25
|
+
return null;
|
|
26
|
+
const value = args[++index];
|
|
27
|
+
if (!value || value.startsWith('--'))
|
|
28
|
+
return null;
|
|
29
|
+
values.set(flag, value);
|
|
30
|
+
}
|
|
31
|
+
return { values, switches };
|
|
32
|
+
}
|
|
33
|
+
function required(values, flag) {
|
|
34
|
+
const value = values.get(flag);
|
|
35
|
+
return value && !value.startsWith('--') ? value : null;
|
|
36
|
+
}
|
|
37
|
+
async function platformSecurity(args = []) {
|
|
38
|
+
if (!ensureInternalHandlerRoute('platform-security', args))
|
|
39
|
+
return;
|
|
40
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
41
|
+
process.stdout.write(USAGE);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const action = args[0];
|
|
45
|
+
if (!internalHandlerRoute('platform-security', 'read', action ?? '')
|
|
46
|
+
&& !internalHandlerRoute('platform-security', 'dismiss', action ?? '')) {
|
|
47
|
+
fail('a valid operation is required');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (action !== 'read' && action !== 'dismiss') {
|
|
51
|
+
fail('a valid operation is required');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const parsed = parseOptions(args.slice(1));
|
|
55
|
+
if (!parsed) {
|
|
56
|
+
fail('invalid security alert options');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const kind = required(parsed.values, '--kind');
|
|
60
|
+
const numberRaw = required(parsed.values, '--number');
|
|
61
|
+
const cwd = path.resolve(required(parsed.values, '--cwd') || process.cwd());
|
|
62
|
+
if (!kind || !numberRaw) {
|
|
63
|
+
fail(`${action} requires --kind and --number`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const number = Number(numberRaw);
|
|
67
|
+
if (!Number.isSafeInteger(number) || number <= 0) {
|
|
68
|
+
fail('--number must be a positive integer');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (action === 'read') {
|
|
72
|
+
if ([...parsed.values.keys()].some((flag) => !['--kind', '--number', '--cwd'].includes(flag))) {
|
|
73
|
+
fail('read does not accept dismissal options');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
finish(await readSecurityAlert({ kind: kind, number }, { cwd }));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const reason = required(parsed.values, '--reason');
|
|
80
|
+
const commentFile = required(parsed.values, '--comment-file');
|
|
81
|
+
if (!reason || !commentFile) {
|
|
82
|
+
fail('dismiss requires --reason and --comment-file');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const comment = readCommentFile(commentFile, cwd);
|
|
86
|
+
if (!comment.ok) {
|
|
87
|
+
finish({ status: 'failed', changed: false, error: comment.error });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
finish(await dismissSecurityAlert({ kind: kind, number, reason, comment: comment.value }, { cwd }));
|
|
91
|
+
}
|
|
92
|
+
export { platformSecurity };
|
|
93
|
+
//# sourceMappingURL=platform-security.js.map
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { collectHostCandidates, decide, deriveTaskIssueMatches, extractClosingIssueNumbers, resolveHostFromCandidates } from '../pr-review/evidence-grading.js';
|
|
4
4
|
import { inspectPlatformPullRequestByNumber } from '../platform/pull-requests.js';
|
|
5
5
|
import { verifyInProcess } from '../task/verification-engine.js';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
6
7
|
const USAGE = `Usage: agent-infra-internal pr-review-grade decide --input-file <path|-> [--cwd <path>]
|
|
7
8
|
agent-infra-internal pr-review-grade resolve-host --pr <token> [--cwd <path>]
|
|
8
9
|
agent-infra-internal pr-review-grade verify-artifact --artifact-file <path> [--cwd <path>]
|
|
@@ -39,12 +40,18 @@ function readInput(value, cwd) {
|
|
|
39
40
|
return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
|
|
40
41
|
}
|
|
41
42
|
async function prReviewGrade(args = []) {
|
|
43
|
+
if (!ensureInternalHandlerRoute('pr-review-grade', args))
|
|
44
|
+
return;
|
|
42
45
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
43
46
|
process.stdout.write(USAGE);
|
|
44
47
|
return;
|
|
45
48
|
}
|
|
46
49
|
const operation = args[0];
|
|
47
|
-
if (!operation || ![
|
|
50
|
+
if (!operation || ![
|
|
51
|
+
internalHandlerRoute('pr-review-grade', 'decide', operation),
|
|
52
|
+
internalHandlerRoute('pr-review-grade', 'resolve-host', operation),
|
|
53
|
+
internalHandlerRoute('pr-review-grade', 'verify-artifact', operation)
|
|
54
|
+
].some(Boolean)) {
|
|
48
55
|
fail('a valid operation is required');
|
|
49
56
|
return;
|
|
50
57
|
}
|
|
@@ -65,7 +72,7 @@ async function prReviewGrade(args = []) {
|
|
|
65
72
|
fail(`${operation} does not accept '--${unexpected}'`);
|
|
66
73
|
return;
|
|
67
74
|
}
|
|
68
|
-
if (
|
|
75
|
+
if (internalHandlerRoute('pr-review-grade', 'decide', operation)) {
|
|
69
76
|
if (typeof values.inputFile !== 'string') {
|
|
70
77
|
fail('decide requires --input-file');
|
|
71
78
|
return;
|
|
@@ -88,7 +95,7 @@ async function prReviewGrade(args = []) {
|
|
|
88
95
|
}
|
|
89
96
|
return;
|
|
90
97
|
}
|
|
91
|
-
if (
|
|
98
|
+
if (internalHandlerRoute('pr-review-grade', 'resolve-host', operation)) {
|
|
92
99
|
const pr = typeof values.pr === 'string' ? values.pr : '';
|
|
93
100
|
if (!pr) {
|
|
94
101
|
fail('resolve-host requires --pr <token>');
|
|
@@ -115,6 +122,10 @@ async function prReviewGrade(args = []) {
|
|
|
115
122
|
});
|
|
116
123
|
return;
|
|
117
124
|
}
|
|
125
|
+
if (!internalHandlerRoute('pr-review-grade', 'verify-artifact', operation)) {
|
|
126
|
+
fail('operation is not registered');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
118
129
|
if (typeof values.artifactFile !== 'string') {
|
|
119
130
|
fail('verify-artifact requires --artifact-file');
|
|
120
131
|
return;
|
|
@@ -7,6 +7,7 @@ import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/wor
|
|
|
7
7
|
import { inspectPlatformRelease, reconcileReleaseMilestones } from '../platform/releases.js';
|
|
8
8
|
import { inspectHomebrewChannel, inspectNpmChannel } from '../release/channels.js';
|
|
9
9
|
import { releaseSnapshot } from '../release/workflow.js';
|
|
10
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
10
11
|
function command(cwd, executable, args) {
|
|
11
12
|
return spawnSync(executable, args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
12
13
|
}
|
|
@@ -295,13 +296,21 @@ async function releaseWorkflow(args = []) {
|
|
|
295
296
|
const version = String(rawVersion || '').replace(/^v/, '');
|
|
296
297
|
const cwdIndex = rest.indexOf('--cwd');
|
|
297
298
|
const cwd = path.resolve(cwdIndex >= 0 && rest[cwdIndex + 1] ? rest[cwdIndex + 1] : process.cwd());
|
|
298
|
-
if (![
|
|
299
|
+
if (![
|
|
300
|
+
internalHandlerRoute('release-workflow', 'inspect', action || ''),
|
|
301
|
+
internalHandlerRoute('release-workflow', 'prepare', action || ''),
|
|
302
|
+
internalHandlerRoute('release-workflow', 'publish', action || ''),
|
|
303
|
+
internalHandlerRoute('release-workflow', 'post-prepare', action || ''),
|
|
304
|
+
internalHandlerRoute('release-workflow', 'post-publish', action || '')
|
|
305
|
+
].some(Boolean) || !semver.valid(version)) {
|
|
299
306
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'RELEASE_INPUT_INVALID', message: 'Usage: release-workflow inspect|prepare|publish|post-prepare|post-publish <version>' } })}\n`);
|
|
300
307
|
process.exitCode = 1;
|
|
301
308
|
return;
|
|
302
309
|
}
|
|
310
|
+
if (!ensureInternalHandlerRoute('release-workflow', args))
|
|
311
|
+
return;
|
|
303
312
|
const before = releaseSnapshot(version, await inspectFacts(cwd, version));
|
|
304
|
-
if (action
|
|
313
|
+
if (internalHandlerRoute('release-workflow', 'inspect', action || '')) {
|
|
305
314
|
process.stdout.write(`${JSON.stringify({ status: 'no-op', changed: false, snapshot: before, error: null })}\n`);
|
|
306
315
|
return;
|
|
307
316
|
}
|
|
@@ -310,7 +319,7 @@ async function releaseWorkflow(args = []) {
|
|
|
310
319
|
process.exitCode = 1;
|
|
311
320
|
return;
|
|
312
321
|
}
|
|
313
|
-
if (action
|
|
322
|
+
if (internalHandlerRoute('release-workflow', 'prepare', action || '')) {
|
|
314
323
|
if (before.phase !== 'unprepared') {
|
|
315
324
|
const milestones = await reconcileReleaseMilestones(version, { cwd });
|
|
316
325
|
process.stdout.write(`${JSON.stringify({ ...milestones, snapshot: before })}\n`);
|
|
@@ -363,7 +372,7 @@ async function releaseWorkflow(args = []) {
|
|
|
363
372
|
process.exitCode = failed ? 1 : blocked ? 2 : 0;
|
|
364
373
|
return;
|
|
365
374
|
}
|
|
366
|
-
if (action
|
|
375
|
+
if (internalHandlerRoute('release-workflow', 'publish', action || '')) {
|
|
367
376
|
if (!before.facts.localTag || !['prepared', 'partially-published'].includes(before.phase)) {
|
|
368
377
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_PHASE_INVALID', message: `Cannot publish from ${before.phase}` } })}\n`);
|
|
369
378
|
process.exitCode = 1;
|
|
@@ -376,7 +385,7 @@ async function releaseWorkflow(args = []) {
|
|
|
376
385
|
process.exitCode = result.status === 'failed' ? 1 : result.status === 'degraded' ? 2 : 0;
|
|
377
386
|
return;
|
|
378
387
|
}
|
|
379
|
-
if (
|
|
388
|
+
if (internalHandlerRoute('release-workflow', 'post-publish', action || '')) {
|
|
380
389
|
const expectedValues = optionValues(rest, '--expected-sha256');
|
|
381
390
|
if (expectedValues.length !== 1 || !/^sha256:[0-9a-f]{64}$/.test(expectedValues[0])) {
|
|
382
391
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_INPUT_INVALID', message: 'post-publish requires one --expected-sha256 sha256:<64 hex>' } })}\n`);
|
|
@@ -415,6 +424,11 @@ async function releaseWorkflow(args = []) {
|
|
|
415
424
|
process.exitCode = blocked ? 2 : 1;
|
|
416
425
|
return;
|
|
417
426
|
}
|
|
427
|
+
if (!internalHandlerRoute('release-workflow', 'post-prepare', action || '')) {
|
|
428
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_INPUT_INVALID', message: 'release-workflow action is not registered' } })}\n`);
|
|
429
|
+
process.exitCode = 1;
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
418
432
|
if (before.phase === 'complete') {
|
|
419
433
|
process.stdout.write(`${JSON.stringify({ status: 'no-op', changed: false, snapshot: before, error: null })}\n`);
|
|
420
434
|
return;
|
|
@@ -3,6 +3,8 @@ import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.j
|
|
|
3
3
|
import { serveSandboxControl } from '../sandbox/control/server.js';
|
|
4
4
|
import { runSandboxControlExecutor } from '../sandbox/control/executor.js';
|
|
5
5
|
import { controllerProofFromContext, verifyCodexSandboxControllerContextWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
7
|
+
import { parseTaskCreateResult, taskCreateExitCode } from '../task/create-service.js';
|
|
6
8
|
function isCanonicalCodexPrepare(args) {
|
|
7
9
|
if (args[1] !== 'prepare')
|
|
8
10
|
return false;
|
|
@@ -28,6 +30,19 @@ function writeClientError(error) {
|
|
|
28
30
|
if (error.requestId)
|
|
29
31
|
process.stderr.write(`SANDBOX_CONTROL_REQUEST_ID: ${error.requestId}\n`);
|
|
30
32
|
}
|
|
33
|
+
function recoveredExitCode(response) {
|
|
34
|
+
if (response.phase !== 'completed')
|
|
35
|
+
return response.exitCode ?? 1;
|
|
36
|
+
try {
|
|
37
|
+
const result = parseTaskCreateResult(JSON.parse(response.stdout));
|
|
38
|
+
if (result.control?.requestId === response.id)
|
|
39
|
+
return taskCreateExitCode(result);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Other control families use their own result envelopes.
|
|
43
|
+
}
|
|
44
|
+
return response.exitCode ?? 1;
|
|
45
|
+
}
|
|
31
46
|
function sandboxFinalizationClient(args) {
|
|
32
47
|
if (args.length !== 4 || !args[0] || args[1] !== 'complete' || args[2] !== '--agent' || !args[3]) {
|
|
33
48
|
const error = { code: 'TASK_FINALIZATION_PAYLOAD_INVALID', message: 'task ref, complete intent, and --agent are required', retryable: false };
|
|
@@ -71,8 +86,10 @@ function sandboxFinalizationClient(args) {
|
|
|
71
86
|
process.exitCode = response.exitCode ?? 1;
|
|
72
87
|
}
|
|
73
88
|
async function sandboxControl(args) {
|
|
89
|
+
if (!ensureInternalHandlerRoute('sandbox-control', args))
|
|
90
|
+
return;
|
|
74
91
|
const [operation, ...rest] = args;
|
|
75
|
-
if (operation
|
|
92
|
+
if (internalHandlerRoute('sandbox-control', 'serve', operation ?? '')) {
|
|
76
93
|
const manifestIndex = rest.indexOf('--manifest');
|
|
77
94
|
const manifest = manifestIndex >= 0 ? rest[manifestIndex + 1] : undefined;
|
|
78
95
|
if (!manifest)
|
|
@@ -90,7 +107,7 @@ async function sandboxControl(args) {
|
|
|
90
107
|
}
|
|
91
108
|
return;
|
|
92
109
|
}
|
|
93
|
-
if (operation
|
|
110
|
+
if (internalHandlerRoute('sandbox-control', 'execute', operation ?? '')) {
|
|
94
111
|
const requestIndex = rest.indexOf('--request');
|
|
95
112
|
const nonceIndex = rest.indexOf('--nonce');
|
|
96
113
|
const request = requestIndex >= 0 ? rest[requestIndex + 1] : undefined;
|
|
@@ -100,7 +117,7 @@ async function sandboxControl(args) {
|
|
|
100
117
|
await runSandboxControlExecutor(request, nonce);
|
|
101
118
|
return;
|
|
102
119
|
}
|
|
103
|
-
if (operation
|
|
120
|
+
if (internalHandlerRoute('sandbox-control', 'recover', operation ?? '')) {
|
|
104
121
|
if (rest.length !== 1 || !rest[0])
|
|
105
122
|
throw new Error('sandbox-control recover requires <request-id>');
|
|
106
123
|
let response;
|
|
@@ -118,10 +135,10 @@ async function sandboxControl(args) {
|
|
|
118
135
|
process.stderr.write(response.stderr);
|
|
119
136
|
process.exitCode = response.phase === 'rejected'
|
|
120
137
|
? response.error?.retryable ? 75 : 1
|
|
121
|
-
: response
|
|
138
|
+
: recoveredExitCode(response);
|
|
122
139
|
return;
|
|
123
140
|
}
|
|
124
|
-
if (operation
|
|
141
|
+
if (internalHandlerRoute('sandbox-control', 'client', operation ?? '')) {
|
|
125
142
|
const [family = '', ...commandArgs] = rest;
|
|
126
143
|
if (family === 'task-finalization') {
|
|
127
144
|
sandboxFinalizationClient(commandArgs);
|
|
@@ -2,6 +2,7 @@ import { applyPrReviewActivityIntent, inspectPrReviewActivity } from '../task/ac
|
|
|
2
2
|
import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.js';
|
|
3
3
|
import { resolveTaskRef } from '../task/resolve-ref.js';
|
|
4
4
|
import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
|
|
5
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
5
6
|
const USAGE = `Usage: agent-infra-internal task-activity <task-ref> pr-review-inspect
|
|
6
7
|
agent-infra-internal task-activity <task-ref> pr-review-start --agent <agent> --artifact <canonical.md> --head <40hex> [--dry-run]
|
|
7
8
|
agent-infra-internal task-activity <task-ref> pr-review-complete --agent <agent> --artifact <canonical.md> --head <40hex> --verdict <approved|changes-requested|commented> --blockers <N> --major <N> --minor <N> [--dry-run]
|
|
@@ -33,12 +34,20 @@ function usageFailure(message) {
|
|
|
33
34
|
process.exitCode = 1;
|
|
34
35
|
}
|
|
35
36
|
async function taskActivity(args = []) {
|
|
37
|
+
if (!ensureInternalHandlerRoute('task-activity', args))
|
|
38
|
+
return;
|
|
36
39
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
37
40
|
process.stdout.write(USAGE);
|
|
38
41
|
return;
|
|
39
42
|
}
|
|
40
43
|
const [taskRef, kind] = args;
|
|
41
|
-
if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)
|
|
44
|
+
if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)
|
|
45
|
+
|| ![
|
|
46
|
+
internalHandlerRoute('task-activity', 'pr-review-inspect', kind),
|
|
47
|
+
internalHandlerRoute('task-activity', 'pr-review-start', kind),
|
|
48
|
+
internalHandlerRoute('task-activity', 'pr-review-complete', kind),
|
|
49
|
+
internalHandlerRoute('task-activity', 'pr-review-terminate', kind)
|
|
50
|
+
].some(Boolean)) {
|
|
42
51
|
usageFailure('task ref and a supported PR review intent are required');
|
|
43
52
|
return;
|
|
44
53
|
}
|
|
@@ -78,7 +87,7 @@ async function taskActivity(args = []) {
|
|
|
78
87
|
usageFailure(`${kind} does not accept '${unexpected}'`);
|
|
79
88
|
return;
|
|
80
89
|
}
|
|
81
|
-
if (
|
|
90
|
+
if (internalHandlerRoute('task-activity', 'pr-review-inspect', kind)) {
|
|
82
91
|
const result = inspectPrReviewActivity(values);
|
|
83
92
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
84
93
|
if (result.status === 'failed')
|
|
@@ -91,9 +100,9 @@ async function taskActivity(args = []) {
|
|
|
91
100
|
return;
|
|
92
101
|
}
|
|
93
102
|
}
|
|
94
|
-
const operationRequired =
|
|
103
|
+
const operationRequired = internalHandlerRoute('task-activity', 'pr-review-complete', kind)
|
|
95
104
|
? ['verdict', 'blockers', 'major', 'minor']
|
|
96
|
-
:
|
|
105
|
+
: internalHandlerRoute('task-activity', 'pr-review-terminate', kind) ? ['outcome', 'reason'] : [];
|
|
97
106
|
for (const key of operationRequired) {
|
|
98
107
|
if (values[key] === undefined) {
|
|
99
108
|
usageFailure(`${kind} requires '${key}'`);
|