@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.
Files changed (280) hide show
  1. package/bin/cli.ts +26 -9
  2. package/dist/bin/cli.js +173 -157
  3. package/dist/bin/internal-cli.js +42 -21
  4. package/dist/lib/agent-client.js +5 -0
  5. package/dist/lib/internal/agent-client.js +5 -2
  6. package/dist/lib/internal/cli-route-inventory.js +152 -0
  7. package/dist/lib/internal/codex-lifecycle.js +9 -6
  8. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  9. package/dist/lib/internal/git-workflow.js +10 -6
  10. package/dist/lib/internal/platform-checks.js +16 -4
  11. package/dist/lib/internal/platform-comment.js +16 -4
  12. package/dist/lib/internal/platform-context.js +4 -1
  13. package/dist/lib/internal/platform-issue.js +12 -4
  14. package/dist/lib/internal/platform-metadata.js +88 -0
  15. package/dist/lib/internal/platform-pr-review.js +16 -3
  16. package/dist/lib/internal/platform-pr.js +24 -10
  17. package/dist/lib/internal/platform-release-notes.js +6 -3
  18. package/dist/lib/internal/platform-security.js +93 -0
  19. package/dist/lib/internal/pr-review-grade.js +14 -3
  20. package/dist/lib/internal/release-workflow.js +19 -5
  21. package/dist/lib/internal/sandbox-control.js +22 -5
  22. package/dist/lib/internal/task-activity.js +13 -4
  23. package/dist/lib/internal/task-artifact.js +186 -27
  24. package/dist/lib/internal/task-context.js +4 -1
  25. package/dist/lib/internal/task-create.js +48 -15
  26. package/dist/lib/internal/task-delivery.js +4 -1
  27. package/dist/lib/internal/task-event.js +4 -1
  28. package/dist/lib/internal/task-finalization.js +4 -1
  29. package/dist/lib/internal/task-invalidation.js +4 -1
  30. package/dist/lib/internal/task-ledger.js +12 -1
  31. package/dist/lib/internal/task-lifecycle.js +4 -1
  32. package/dist/lib/internal/task-operation-registry.js +421 -0
  33. package/dist/lib/internal/task-orchestration.js +12 -0
  34. package/dist/lib/internal/task-override.js +10 -3
  35. package/dist/lib/internal/task-qualification.js +90 -0
  36. package/dist/lib/internal/task-review.js +4 -1
  37. package/dist/lib/internal/task-short-id.js +11 -1
  38. package/dist/lib/internal/task-snapshot.js +4 -1
  39. package/dist/lib/internal/task-validate.js +7 -2
  40. package/dist/lib/internal/task-verify.js +5 -1
  41. package/dist/lib/internal/task-warning.js +8 -1
  42. package/dist/lib/platform/comment-safety.js +226 -0
  43. package/dist/lib/platform/github-provider.js +233 -6
  44. package/dist/lib/platform/issue-comments.js +146 -34
  45. package/dist/lib/platform/pr-change-report.js +6 -12
  46. package/dist/lib/platform/pr-summary.js +28 -7
  47. package/dist/lib/platform/provider-contract.d.ts +67 -1
  48. package/dist/lib/platform/provider-contract.js +6 -2
  49. package/dist/lib/platform/provider-validation.js +76 -3
  50. package/dist/lib/platform/pull-requests.js +115 -170
  51. package/dist/lib/platform/repository-metadata.js +377 -0
  52. package/dist/lib/platform/security-alerts.js +155 -0
  53. package/dist/lib/platform/verification-sync.js +33 -26
  54. package/dist/lib/process-data/index.js +7 -0
  55. package/dist/lib/run/index.js +5 -0
  56. package/dist/lib/sandbox/commands/control-status.js +22 -0
  57. package/dist/lib/sandbox/commands/create.js +32 -6
  58. package/dist/lib/sandbox/commands/ls.js +5 -0
  59. package/dist/lib/sandbox/commands/rm.js +827 -120
  60. package/dist/lib/sandbox/commands/show.js +16 -0
  61. package/dist/lib/sandbox/control/client.js +83 -9
  62. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  63. package/dist/lib/sandbox/control/container-identity.js +28 -31
  64. package/dist/lib/sandbox/control/executor.js +149 -14
  65. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  66. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  67. package/dist/lib/sandbox/control/server.js +305 -35
  68. package/dist/lib/sandbox/control/state.js +5 -3
  69. package/dist/lib/sandbox/control/task-view.js +183 -0
  70. package/dist/lib/sandbox/engines/authority.js +289 -0
  71. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  72. package/dist/lib/sandbox/index.js +5 -0
  73. package/dist/lib/sandbox/recovery.js +21 -1
  74. package/dist/lib/sandbox/workspace-view.js +2 -1
  75. package/dist/lib/sandbox/worktree-safety.js +4 -1
  76. package/dist/lib/server/index.js +8 -0
  77. package/dist/lib/task/artifact-lifecycle.js +42 -13
  78. package/dist/lib/task/artifact-operations.js +520 -0
  79. package/dist/lib/task/artifact-repair-intent.js +59 -0
  80. package/dist/lib/task/artifact-schema.js +135 -0
  81. package/dist/lib/task/capabilities.js +72 -1
  82. package/dist/lib/task/control-authority.js +4 -0
  83. package/dist/lib/task/create-service.js +103 -4
  84. package/dist/lib/task/create.js +25 -0
  85. package/dist/lib/task/events.js +186 -67
  86. package/dist/lib/task/index.js +11 -3
  87. package/dist/lib/task/local-artifact-finalization.js +75 -150
  88. package/dist/lib/task/orchestration.js +192 -52
  89. package/dist/lib/task/qualification-audit.js +490 -0
  90. package/dist/lib/task/qualification-confirmation.js +109 -0
  91. package/dist/lib/task/qualification-intents.js +148 -0
  92. package/dist/lib/task/review-artifacts.js +22 -23
  93. package/dist/lib/task/review-finalization.js +121 -4
  94. package/dist/lib/task/sections.js +6 -4
  95. package/dist/lib/task/verification-config.js +11 -0
  96. package/dist/lib/task/verification-engine.js +54 -4
  97. package/dist/lifecycle-build-manifest.json +3 -3
  98. package/lib/agent-client.ts +9 -0
  99. package/lib/internal/agent-client.ts +4 -2
  100. package/lib/internal/cli-route-inventory.ts +140 -0
  101. package/lib/internal/codex-lifecycle.ts +8 -6
  102. package/lib/internal/codex-sandbox-controller.ts +7 -2
  103. package/lib/internal/git-workflow.ts +9 -6
  104. package/lib/internal/platform-checks.ts +12 -4
  105. package/lib/internal/platform-comment.ts +12 -4
  106. package/lib/internal/platform-context.ts +3 -1
  107. package/lib/internal/platform-issue.ts +11 -4
  108. package/lib/internal/platform-metadata.ts +70 -0
  109. package/lib/internal/platform-pr-review.ts +14 -3
  110. package/lib/internal/platform-pr.ts +23 -10
  111. package/lib/internal/platform-release-notes.ts +5 -3
  112. package/lib/internal/platform-security.ts +83 -0
  113. package/lib/internal/pr-review-grade.ts +10 -3
  114. package/lib/internal/release-workflow.ts +17 -5
  115. package/lib/internal/sandbox-control.ts +19 -5
  116. package/lib/internal/task-activity.ts +12 -4
  117. package/lib/internal/task-artifact.ts +164 -25
  118. package/lib/internal/task-context.ts +3 -1
  119. package/lib/internal/task-create.ts +76 -15
  120. package/lib/internal/task-delivery.ts +3 -1
  121. package/lib/internal/task-event.ts +3 -1
  122. package/lib/internal/task-finalization.ts +3 -1
  123. package/lib/internal/task-invalidation.ts +3 -1
  124. package/lib/internal/task-ledger.ts +11 -1
  125. package/lib/internal/task-lifecycle.ts +3 -1
  126. package/lib/internal/task-operation-registry.ts +482 -0
  127. package/lib/internal/task-orchestration.ts +12 -0
  128. package/lib/internal/task-override.ts +9 -3
  129. package/lib/internal/task-qualification.ts +61 -0
  130. package/lib/internal/task-review.ts +3 -1
  131. package/lib/internal/task-short-id.ts +10 -1
  132. package/lib/internal/task-snapshot.ts +3 -1
  133. package/lib/internal/task-validate.ts +6 -2
  134. package/lib/internal/task-verify.ts +4 -1
  135. package/lib/internal/task-warning.ts +7 -1
  136. package/lib/platform/comment-safety.ts +250 -0
  137. package/lib/platform/github-provider.ts +229 -7
  138. package/lib/platform/issue-comments.ts +160 -35
  139. package/lib/platform/pr-change-report.ts +6 -12
  140. package/lib/platform/pr-summary.ts +27 -6
  141. package/lib/platform/provider-contract.ts +78 -3
  142. package/lib/platform/provider-validation.ts +85 -3
  143. package/lib/platform/pull-requests.ts +126 -178
  144. package/lib/platform/repository-metadata.ts +453 -0
  145. package/lib/platform/security-alerts.ts +191 -0
  146. package/lib/platform/verification-sync.ts +32 -28
  147. package/lib/process-data/index.ts +7 -0
  148. package/lib/run/index.ts +5 -0
  149. package/lib/sandbox/commands/control-status.ts +26 -0
  150. package/lib/sandbox/commands/create.ts +46 -6
  151. package/lib/sandbox/commands/ls.ts +7 -0
  152. package/lib/sandbox/commands/rm.ts +1000 -87
  153. package/lib/sandbox/commands/show.ts +16 -0
  154. package/lib/sandbox/control/client.ts +103 -9
  155. package/lib/sandbox/control/completed-reentry.ts +98 -0
  156. package/lib/sandbox/control/container-identity.ts +27 -43
  157. package/lib/sandbox/control/executor.ts +177 -12
  158. package/lib/sandbox/control/lifecycle.ts +629 -17
  159. package/lib/sandbox/control/native-file-lock.ts +209 -0
  160. package/lib/sandbox/control/protocol.ts +5 -2
  161. package/lib/sandbox/control/server.ts +319 -37
  162. package/lib/sandbox/control/state.ts +6 -3
  163. package/lib/sandbox/control/task-view.ts +240 -0
  164. package/lib/sandbox/engines/authority.ts +365 -0
  165. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  166. package/lib/sandbox/index.ts +7 -0
  167. package/lib/sandbox/recovery.ts +21 -1
  168. package/lib/sandbox/workspace-view.ts +9 -3
  169. package/lib/sandbox/worktree-safety.ts +4 -1
  170. package/lib/server/index.ts +10 -0
  171. package/lib/task/artifact-lifecycle.ts +38 -16
  172. package/lib/task/artifact-operations.ts +626 -0
  173. package/lib/task/artifact-repair-intent.ts +71 -0
  174. package/lib/task/artifact-schema.ts +192 -0
  175. package/lib/task/capabilities.ts +70 -1
  176. package/lib/task/control-authority.ts +11 -1
  177. package/lib/task/create-service.ts +131 -6
  178. package/lib/task/create.ts +27 -0
  179. package/lib/task/events.ts +161 -65
  180. package/lib/task/index.ts +16 -3
  181. package/lib/task/local-artifact-finalization.ts +87 -218
  182. package/lib/task/orchestration.ts +172 -49
  183. package/lib/task/qualification-audit.ts +599 -0
  184. package/lib/task/qualification-confirmation.ts +117 -0
  185. package/lib/task/qualification-intents.ts +150 -0
  186. package/lib/task/review-artifacts.ts +21 -22
  187. package/lib/task/review-finalization.ts +133 -4
  188. package/lib/task/sections.ts +6 -4
  189. package/lib/task/verification-config.ts +12 -0
  190. package/lib/task/verification-engine.ts +55 -4
  191. package/package.json +6 -1
  192. package/templates/.agents/rules/README.en.md +2 -0
  193. package/templates/.agents/rules/README.zh-CN.md +2 -0
  194. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  195. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  196. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  197. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  198. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  199. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  200. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  201. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  202. package/templates/.agents/rules/security-alerts.en.md +8 -8
  203. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  204. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  205. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  206. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  207. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  208. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  209. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  210. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  211. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  212. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  213. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  214. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  215. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  216. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  217. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  218. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  219. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  220. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  221. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  222. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  223. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  224. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +5 -1
  225. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
  226. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  227. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  228. package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
  229. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
  230. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  231. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  232. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  233. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  234. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  235. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  236. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  237. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  238. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  239. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  240. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  241. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  242. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  243. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  244. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  245. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  246. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  247. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  248. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  249. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  250. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  251. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  252. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  253. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  254. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  255. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  256. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  257. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  258. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  259. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  260. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  261. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  262. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  263. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  264. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  265. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  266. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -1
  267. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
  268. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  269. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  270. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  271. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  272. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  273. package/templates/.agents/templates/task.en.md +6 -0
  274. package/templates/.agents/templates/task.zh-CN.md +6 -0
  275. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  276. package/templates/.agents/scripts/security-alerts.sh +0 -31
  277. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  278. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  279. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  280. 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 || !['inspect', 'list', 'publish'].includes(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 (operation === 'inspect') {
89
+ if (internalHandlerRoute('platform-pr-review', 'inspect', operation)) {
83
90
  finish(await inspectPlatformPullRequestByNumber(pr, { cwd }));
84
91
  return;
85
92
  }
86
- if (operation === 'list') {
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 || !['inspect', 'resolve-external', 'create', 'bind', 'skip', 'sync', 'sync-in-labels', 'summary-context', 'change-report', 'summary-sync'].includes(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 (operation === 'sync-in-labels') {
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 (operation === 'inspect') {
132
+ if (internalHandlerRoute('platform-pr', 'inspect', operation)) {
119
133
  finish(await inspectPlatformPullRequest(taskRef, { cwd }));
120
134
  return;
121
135
  }
122
- if (operation === 'summary-context') {
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 (operation === 'change-report') {
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 (operation === 'skip') {
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 (operation === 'resolve-external') {
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 (operation === 'bind') {
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 (operation === 'sync') {
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 (operation === 'summary-sync') {
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 === 'context') {
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 === 'stage') {
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 === 'publish') {
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 || !['decide', 'resolve-host', 'verify-artifact'].includes(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 (operation === 'decide') {
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 (operation === 'resolve-host') {
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 (!['inspect', 'prepare', 'publish', 'post-prepare', 'post-publish'].includes(action || '') || !semver.valid(version)) {
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 === 'inspect') {
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 === 'prepare') {
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 === 'publish') {
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 (action === 'post-publish') {
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 === 'serve') {
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 === 'execute') {
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 === 'recover') {
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.exitCode ?? 1;
138
+ : recoveredExitCode(response);
122
139
  return;
123
140
  }
124
- if (operation === 'client') {
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 (kind === 'pr-review-inspect') {
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 = kind === 'pr-review-complete'
103
+ const operationRequired = internalHandlerRoute('task-activity', 'pr-review-complete', kind)
95
104
  ? ['verdict', 'blockers', 'major', 'minor']
96
- : kind === 'pr-review-terminate' ? ['outcome', 'reason'] : [];
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}'`);