@fitlab-ai/agent-infra 0.9.12 → 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 (402) hide show
  1. package/README.md +11 -11
  2. package/README.zh-CN.md +11 -11
  3. package/bin/cli.ts +26 -9
  4. package/dist/bin/cli.js +173 -157
  5. package/dist/bin/internal-cli.js +66 -40
  6. package/dist/lib/agent-client.js +5 -0
  7. package/dist/lib/agent-clients/next-steps.js +6 -1
  8. package/dist/lib/decide.js +3 -3
  9. package/dist/lib/internal/agent-client.js +5 -2
  10. package/dist/lib/internal/cli-route-inventory.js +152 -0
  11. package/dist/lib/internal/codex-lifecycle.js +9 -6
  12. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  13. package/dist/lib/internal/git-workflow.js +10 -6
  14. package/dist/lib/internal/platform-checks.js +19 -7
  15. package/dist/lib/internal/platform-comment.js +25 -13
  16. package/dist/lib/internal/platform-context.js +6 -3
  17. package/dist/lib/internal/platform-issue.js +20 -13
  18. package/dist/lib/internal/platform-metadata.js +88 -0
  19. package/dist/lib/internal/platform-pr-review.js +26 -13
  20. package/dist/lib/internal/platform-pr.js +84 -31
  21. package/dist/lib/internal/platform-release-notes.js +9 -6
  22. package/dist/lib/internal/platform-security.js +93 -0
  23. package/dist/lib/internal/pr-review-grade.js +25 -12
  24. package/dist/lib/internal/release-workflow.js +23 -9
  25. package/dist/lib/internal/sandbox-control.js +50 -7
  26. package/dist/lib/internal/task-activity.js +16 -7
  27. package/dist/lib/internal/task-artifact.js +235 -24
  28. package/dist/lib/internal/task-context.js +4 -1
  29. package/dist/lib/internal/task-create.js +50 -17
  30. package/dist/lib/internal/task-delivery.js +4 -1
  31. package/dist/lib/internal/task-event.js +10 -4
  32. package/dist/lib/internal/task-finalization.js +6 -3
  33. package/dist/lib/internal/task-invalidation.js +63 -0
  34. package/dist/lib/internal/task-ledger.js +20 -6
  35. package/dist/lib/internal/task-lifecycle.js +6 -3
  36. package/dist/lib/internal/task-operation-registry.js +421 -0
  37. package/dist/lib/internal/task-orchestration.js +12 -0
  38. package/dist/lib/internal/task-override.js +14 -7
  39. package/dist/lib/internal/task-qualification.js +90 -0
  40. package/dist/lib/internal/task-review.js +7 -4
  41. package/dist/lib/internal/task-short-id.js +11 -1
  42. package/dist/lib/internal/task-snapshot.js +4 -1
  43. package/dist/lib/internal/task-validate.js +7 -2
  44. package/dist/lib/internal/task-verify.js +11 -7
  45. package/dist/lib/internal/task-warning.js +11 -4
  46. package/dist/lib/platform/adapters.js +1 -3
  47. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  48. package/dist/lib/platform/comment-safety.js +226 -0
  49. package/dist/lib/platform/completion-backfill.js +6 -5
  50. package/dist/lib/platform/context.js +70 -130
  51. package/dist/lib/platform/github-client.js +1 -1
  52. package/dist/lib/platform/github-provider.js +1130 -0
  53. package/dist/lib/platform/in-label-sync.js +143 -0
  54. package/dist/lib/platform/issue-comments.js +237 -72
  55. package/dist/lib/platform/issues.js +335 -189
  56. package/dist/lib/platform/metadata-labels.js +6 -2
  57. package/dist/lib/platform/none-provider.js +28 -0
  58. package/dist/lib/platform/pr-change-report.js +545 -0
  59. package/dist/lib/platform/pr-checks.js +119 -104
  60. package/dist/lib/platform/pr-review.js +88 -72
  61. package/dist/lib/platform/pr-summary.js +541 -50
  62. package/dist/lib/platform/provider-bridge.js +45 -0
  63. package/dist/lib/platform/provider-contract.d.ts +553 -0
  64. package/dist/lib/platform/provider-contract.js +99 -0
  65. package/dist/lib/platform/provider-loader.js +251 -0
  66. package/dist/lib/platform/provider-validation.js +577 -0
  67. package/dist/lib/platform/pull-request-metadata.js +8 -6
  68. package/dist/lib/platform/pull-requests.js +734 -543
  69. package/dist/lib/platform/release-notes.js +78 -55
  70. package/dist/lib/platform/releases.js +79 -50
  71. package/dist/lib/platform/repository-metadata.js +377 -0
  72. package/dist/lib/platform/resource-identity.d.ts +26 -0
  73. package/dist/lib/platform/resource-identity.js +92 -0
  74. package/dist/lib/platform/security-alerts.js +155 -0
  75. package/dist/lib/platform/task-identities.js +31 -0
  76. package/dist/lib/platform/verification-required.js +11 -12
  77. package/dist/lib/platform/verification-sync.js +129 -248
  78. package/dist/lib/pr-review/evidence-grading.js +19 -6
  79. package/dist/lib/process-data/index.js +7 -0
  80. package/dist/lib/run/index.js +68 -23
  81. package/dist/lib/sandbox/commands/control-status.js +22 -0
  82. package/dist/lib/sandbox/commands/create.js +32 -6
  83. package/dist/lib/sandbox/commands/ls.js +5 -0
  84. package/dist/lib/sandbox/commands/rm.js +827 -120
  85. package/dist/lib/sandbox/commands/show.js +16 -0
  86. package/dist/lib/sandbox/control/client.js +174 -19
  87. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  88. package/dist/lib/sandbox/control/container-identity.js +28 -31
  89. package/dist/lib/sandbox/control/executor.js +151 -16
  90. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  91. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  92. package/dist/lib/sandbox/control/protocol.js +77 -0
  93. package/dist/lib/sandbox/control/server.js +677 -34
  94. package/dist/lib/sandbox/control/state.js +209 -4
  95. package/dist/lib/sandbox/control/task-view.js +183 -0
  96. package/dist/lib/sandbox/engines/authority.js +289 -0
  97. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  98. package/dist/lib/sandbox/index.js +5 -0
  99. package/dist/lib/sandbox/recovery.js +21 -1
  100. package/dist/lib/sandbox/workspace-view.js +2 -1
  101. package/dist/lib/sandbox/worktree-safety.js +4 -1
  102. package/dist/lib/server/index.js +8 -0
  103. package/dist/lib/server/protocol.js +38 -1
  104. package/dist/lib/task/activity-log.js +8 -1
  105. package/dist/lib/task/artifact-lifecycle.js +75 -18
  106. package/dist/lib/task/artifact-operations.js +520 -0
  107. package/dist/lib/task/artifact-repair-intent.js +59 -0
  108. package/dist/lib/task/artifact-schema.js +135 -0
  109. package/dist/lib/task/capabilities.js +310 -0
  110. package/dist/lib/task/commands/status.js +32 -0
  111. package/dist/lib/task/commit-operation.js +12 -1
  112. package/dist/lib/task/control-authority.js +12 -5
  113. package/dist/lib/task/create-service.js +111 -12
  114. package/dist/lib/task/create.js +25 -0
  115. package/dist/lib/task/current-contract.js +5 -1
  116. package/dist/lib/task/decision-details.js +1 -1
  117. package/dist/lib/task/events.js +416 -17
  118. package/dist/lib/task/finalization.js +37 -13
  119. package/dist/lib/task/human-override.js +58 -36
  120. package/dist/lib/task/index.js +11 -3
  121. package/dist/lib/task/invalidation-command.js +86 -0
  122. package/dist/lib/task/invalidation.js +260 -0
  123. package/dist/lib/task/ledger-intents.js +37 -0
  124. package/dist/lib/task/local-artifact-finalization.js +299 -0
  125. package/dist/lib/task/orchestration.js +240 -144
  126. package/dist/lib/task/pr-delivery-fact.js +102 -101
  127. package/dist/lib/task/qualification-audit.js +490 -0
  128. package/dist/lib/task/qualification-confirmation.js +109 -0
  129. package/dist/lib/task/qualification-intents.js +148 -0
  130. package/dist/lib/task/review-artifacts.js +22 -23
  131. package/dist/lib/task/review-finalization.js +121 -4
  132. package/dist/lib/task/review-fingerprint.js +24 -2
  133. package/dist/lib/task/rework-intent.js +138 -0
  134. package/dist/lib/task/sections.js +6 -4
  135. package/dist/lib/task/skill-scope.js +23 -0
  136. package/dist/lib/task/task-execution-lock.js +27 -17
  137. package/dist/lib/task/verification-config.js +11 -0
  138. package/dist/lib/task/verification-engine.js +93 -16
  139. package/dist/lib/task/verification.js +3 -3
  140. package/dist/lib/task/workflow-warning-intents.js +1 -1
  141. package/dist/lib/task/write.js +11 -0
  142. package/dist/lib/version.js +11 -1
  143. package/dist/lifecycle-build-manifest.json +3 -3
  144. package/lib/agent-client.ts +9 -0
  145. package/lib/agent-clients/next-steps.ts +6 -1
  146. package/lib/decide.ts +3 -3
  147. package/lib/init.ts +1 -1
  148. package/lib/internal/agent-client.ts +4 -2
  149. package/lib/internal/cli-route-inventory.ts +140 -0
  150. package/lib/internal/codex-lifecycle.ts +8 -6
  151. package/lib/internal/codex-sandbox-controller.ts +7 -2
  152. package/lib/internal/git-workflow.ts +9 -6
  153. package/lib/internal/platform-checks.ts +14 -6
  154. package/lib/internal/platform-comment.ts +20 -12
  155. package/lib/internal/platform-context.ts +5 -3
  156. package/lib/internal/platform-issue.ts +17 -11
  157. package/lib/internal/platform-metadata.ts +70 -0
  158. package/lib/internal/platform-pr-review.ts +23 -12
  159. package/lib/internal/platform-pr.ts +65 -27
  160. package/lib/internal/platform-release-notes.ts +8 -6
  161. package/lib/internal/platform-security.ts +83 -0
  162. package/lib/internal/pr-review-grade.ts +20 -11
  163. package/lib/internal/release-workflow.ts +21 -9
  164. package/lib/internal/sandbox-control.ts +44 -6
  165. package/lib/internal/task-activity.ts +15 -7
  166. package/lib/internal/task-artifact.ts +204 -22
  167. package/lib/internal/task-context.ts +3 -1
  168. package/lib/internal/task-create.ts +78 -17
  169. package/lib/internal/task-delivery.ts +3 -1
  170. package/lib/internal/task-event.ts +9 -4
  171. package/lib/internal/task-finalization.ts +6 -4
  172. package/lib/internal/task-invalidation.ts +41 -0
  173. package/lib/internal/task-ledger.ts +21 -8
  174. package/lib/internal/task-lifecycle.ts +5 -3
  175. package/lib/internal/task-operation-registry.ts +482 -0
  176. package/lib/internal/task-orchestration.ts +12 -0
  177. package/lib/internal/task-override.ts +15 -9
  178. package/lib/internal/task-qualification.ts +61 -0
  179. package/lib/internal/task-review.ts +6 -4
  180. package/lib/internal/task-short-id.ts +10 -1
  181. package/lib/internal/task-snapshot.ts +3 -1
  182. package/lib/internal/task-validate.ts +6 -2
  183. package/lib/internal/task-verify.ts +10 -7
  184. package/lib/internal/task-warning.ts +10 -4
  185. package/lib/platform/adapters.ts +3 -2
  186. package/lib/platform/change-request-git-evidence.ts +36 -9
  187. package/lib/platform/comment-safety.ts +250 -0
  188. package/lib/platform/completion-backfill.ts +9 -8
  189. package/lib/platform/context.ts +97 -134
  190. package/lib/platform/github-client.ts +2 -2
  191. package/lib/platform/github-provider.ts +1132 -0
  192. package/lib/platform/in-label-sync.ts +208 -0
  193. package/lib/platform/issue-comments.ts +255 -80
  194. package/lib/platform/issues.ts +344 -174
  195. package/lib/platform/metadata-labels.ts +5 -2
  196. package/lib/platform/none-provider.ts +35 -0
  197. package/lib/platform/pr-change-report.ts +639 -0
  198. package/lib/platform/pr-checks.ts +126 -106
  199. package/lib/platform/pr-review.ts +88 -85
  200. package/lib/platform/pr-summary.ts +581 -53
  201. package/lib/platform/provider-bridge.ts +82 -0
  202. package/lib/platform/provider-contract.ts +611 -0
  203. package/lib/platform/provider-loader.ts +307 -0
  204. package/lib/platform/provider-validation.ts +611 -0
  205. package/lib/platform/pull-request-metadata.ts +10 -7
  206. package/lib/platform/pull-requests.ts +781 -550
  207. package/lib/platform/release-notes.ts +76 -59
  208. package/lib/platform/releases.ts +77 -43
  209. package/lib/platform/repository-metadata.ts +453 -0
  210. package/lib/platform/resource-identity.ts +121 -0
  211. package/lib/platform/security-alerts.ts +191 -0
  212. package/lib/platform/task-identities.ts +40 -0
  213. package/lib/platform/types.ts +4 -2
  214. package/lib/platform/verification-required.ts +11 -13
  215. package/lib/platform/verification-sync.ts +128 -304
  216. package/lib/pr-review/evidence-grading.ts +25 -8
  217. package/lib/process-data/index.ts +7 -0
  218. package/lib/run/index.ts +62 -22
  219. package/lib/sandbox/commands/control-status.ts +26 -0
  220. package/lib/sandbox/commands/create.ts +46 -6
  221. package/lib/sandbox/commands/ls.ts +7 -0
  222. package/lib/sandbox/commands/rm.ts +1000 -87
  223. package/lib/sandbox/commands/show.ts +16 -0
  224. package/lib/sandbox/control/client.ts +203 -19
  225. package/lib/sandbox/control/completed-reentry.ts +98 -0
  226. package/lib/sandbox/control/container-identity.ts +27 -43
  227. package/lib/sandbox/control/executor.ts +180 -15
  228. package/lib/sandbox/control/lifecycle.ts +629 -17
  229. package/lib/sandbox/control/native-file-lock.ts +209 -0
  230. package/lib/sandbox/control/protocol.ts +118 -2
  231. package/lib/sandbox/control/server.ts +724 -34
  232. package/lib/sandbox/control/state.ts +257 -4
  233. package/lib/sandbox/control/task-view.ts +240 -0
  234. package/lib/sandbox/engines/authority.ts +365 -0
  235. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  236. package/lib/sandbox/index.ts +7 -0
  237. package/lib/sandbox/recovery.ts +21 -1
  238. package/lib/sandbox/workspace-view.ts +9 -3
  239. package/lib/sandbox/worktree-safety.ts +4 -1
  240. package/lib/server/index.ts +10 -0
  241. package/lib/server/protocol.ts +36 -1
  242. package/lib/task/activity-log.ts +8 -0
  243. package/lib/task/artifact-lifecycle.ts +70 -22
  244. package/lib/task/artifact-operations.ts +626 -0
  245. package/lib/task/artifact-repair-intent.ts +71 -0
  246. package/lib/task/artifact-schema.ts +192 -0
  247. package/lib/task/capabilities.ts +331 -0
  248. package/lib/task/commands/status.ts +38 -0
  249. package/lib/task/commit-operation.ts +12 -1
  250. package/lib/task/control-authority.ts +22 -9
  251. package/lib/task/create-service.ts +139 -14
  252. package/lib/task/create.ts +27 -0
  253. package/lib/task/current-contract.ts +6 -1
  254. package/lib/task/decision-details.ts +6 -2
  255. package/lib/task/events.ts +392 -16
  256. package/lib/task/finalization.ts +50 -14
  257. package/lib/task/human-override.ts +70 -46
  258. package/lib/task/index.ts +16 -3
  259. package/lib/task/invalidation-command.ts +86 -0
  260. package/lib/task/invalidation.ts +332 -0
  261. package/lib/task/ledger-intents.ts +35 -1
  262. package/lib/task/local-artifact-finalization.ts +432 -0
  263. package/lib/task/orchestration.ts +223 -133
  264. package/lib/task/pr-delivery-fact.ts +131 -148
  265. package/lib/task/qualification-audit.ts +599 -0
  266. package/lib/task/qualification-confirmation.ts +117 -0
  267. package/lib/task/qualification-intents.ts +150 -0
  268. package/lib/task/review-artifacts.ts +21 -22
  269. package/lib/task/review-finalization.ts +133 -4
  270. package/lib/task/review-fingerprint.ts +23 -2
  271. package/lib/task/rework-intent.ts +165 -0
  272. package/lib/task/sections.ts +6 -4
  273. package/lib/task/skill-scope.ts +24 -0
  274. package/lib/task/task-execution-lock.ts +23 -14
  275. package/lib/task/verification-config.ts +12 -0
  276. package/lib/task/verification-engine.ts +103 -17
  277. package/lib/task/verification.ts +4 -4
  278. package/lib/task/workflow-warning-intents.ts +1 -1
  279. package/lib/task/write.ts +19 -0
  280. package/lib/update.ts +1 -1
  281. package/lib/version.ts +15 -1
  282. package/package.json +12 -1
  283. package/templates/.agents/rules/README.en.md +3 -1
  284. package/templates/.agents/rules/README.zh-CN.md +3 -1
  285. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  286. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  287. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  288. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  289. package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
  290. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  291. package/templates/.agents/rules/issue-sync.en.md +2 -0
  292. package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
  293. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  294. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  295. package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
  296. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
  297. package/templates/.agents/rules/pr-sync.en.md +10 -4
  298. package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
  299. package/templates/.agents/rules/security-alerts.en.md +8 -8
  300. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  301. package/templates/.agents/rules/task-short-id.en.md +1 -4
  302. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  303. package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
  304. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
  305. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  306. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  307. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  308. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  309. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  310. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  311. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
  314. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
  315. package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
  316. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
  317. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  318. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  319. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  320. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  321. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  322. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  323. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  324. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  325. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  326. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  327. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
  328. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
  329. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
  330. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
  331. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  332. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  333. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
  334. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
  335. package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
  336. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
  337. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
  338. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
  339. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  340. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  341. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  342. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  343. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  344. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  345. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  346. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  347. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  348. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  349. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  350. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  351. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  352. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  353. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  354. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  355. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  356. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  357. package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
  358. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
  359. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  360. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  361. package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
  362. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
  363. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  364. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  365. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  366. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  367. package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
  368. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
  369. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  370. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  371. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  372. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  373. package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
  374. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
  375. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  376. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  377. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  378. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  379. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  380. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  381. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  382. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  383. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
  384. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
  385. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  386. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  387. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  388. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  389. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  390. package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
  391. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
  392. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  393. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  394. package/templates/.agents/templates/task.en.md +24 -1
  395. package/templates/.agents/templates/task.zh-CN.md +24 -1
  396. package/templates/.github/workflows/pr-label.yml +7 -26
  397. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  398. package/templates/.agents/scripts/security-alerts.sh +0 -31
  399. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  400. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  401. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  402. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -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();
@@ -28,15 +29,17 @@ function finish(result) {
28
29
  process.stdout.write(`${JSON.stringify(result)}\n`);
29
30
  process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
30
31
  }
31
- function platformReleaseNotes(args = []) {
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'));
37
40
  const cwd = path.resolve(parsed.values.get('--cwd') || process.cwd());
38
41
  const historyRaw = parsed.values.get('--history-limit') ?? null;
39
- finish(releaseNoteContext({
42
+ finish(await releaseNoteContext({
40
43
  fromTag: parsed.values.get('--from-tag') || '',
41
44
  toTag: parsed.values.get('--to-tag') || '',
42
45
  branch: parsed.values.get('--branch') || '',
@@ -44,7 +47,7 @@ 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 @@ 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'));
@@ -69,7 +72,7 @@ function platformReleaseNotes(args = []) {
69
72
  fs.writeFileSync(resolvedNotesPath, fs.readFileSync(0));
70
73
  }
71
74
  try {
72
- finish(publishReleaseNotes({
75
+ finish(await publishReleaseNotes({
73
76
  tag: parsed.values.get('--tag') || '',
74
77
  title: parsed.values.get('--title') || parsed.values.get('--tag') || '',
75
78
  notesFile: resolvedNotesPath,
@@ -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,8 +3,9 @@ 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
- agent-infra-internal pr-review-grade resolve-host --pr <N> [--cwd <path>]
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>]
9
10
  `;
10
11
  function fail(message) {
@@ -38,13 +39,19 @@ function parseFlags(args, start) {
38
39
  function readInput(value, cwd) {
39
40
  return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
40
41
  }
41
- function prReviewGrade(args = []) {
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 @@ 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,13 +95,13 @@ function prReviewGrade(args = []) {
88
95
  }
89
96
  return;
90
97
  }
91
- if (operation === 'resolve-host') {
92
- const pr = Number(values.pr);
93
- if (!Number.isInteger(pr) || pr <= 0) {
94
- fail('resolve-host requires a positive --pr');
98
+ if (internalHandlerRoute('pr-review-grade', 'resolve-host', operation)) {
99
+ const pr = typeof values.pr === 'string' ? values.pr : '';
100
+ if (!pr) {
101
+ fail('resolve-host requires --pr <token>');
95
102
  return;
96
103
  }
97
- const inspected = inspectPlatformPullRequestByNumber(pr, { cwd });
104
+ const inspected = await inspectPlatformPullRequestByNumber(pr, { cwd });
98
105
  if (!inspected.pullRequest) {
99
106
  finish({
100
107
  status: 'failed', changed: false, host: null, candidates: [], closingIssues: [],
@@ -102,17 +109,23 @@ function prReviewGrade(args = []) {
102
109
  }, inspected.status === 'blocked' ? 2 : 1);
103
110
  return;
104
111
  }
112
+ const prNumber = inspected.pullRequest.number;
113
+ const prIdentity = inspected.pullRequest.identity || { kind: 'number', value: prNumber };
105
114
  const closingIssues = extractClosingIssueNumbers(inspected.pullRequest.body);
106
- const candidates = collectHostCandidates({ prNumber: pr, closingIssues, workspaceRoot: cwd });
115
+ const candidates = collectHostCandidates({ prNumber, prIdentity, closingIssues, workspaceRoot: cwd });
107
116
  const host = resolveHostFromCandidates(candidates);
108
117
  finish({
109
118
  status: 'ok', changed: false,
110
- pr: { number: pr, baseSha: inspected.pullRequest.base.sha, headSha: inspected.pullRequest.head.sha, state: inspected.pullRequest.state },
119
+ pr: { number: prNumber, identity: prIdentity, baseSha: inspected.pullRequest.base.sha, headSha: inspected.pullRequest.head.sha, state: inspected.pullRequest.state },
111
120
  closingIssues, candidates, host,
112
121
  taskIssueMatches: deriveTaskIssueMatches(host, closingIssues), error: null
113
122
  });
114
123
  return;
115
124
  }
125
+ if (!internalHandlerRoute('pr-review-grade', 'verify-artifact', operation)) {
126
+ fail('operation is not registered');
127
+ return;
128
+ }
116
129
  if (typeof values.artifactFile !== 'string') {
117
130
  fail('verify-artifact requires --artifact-file');
118
131
  return;
@@ -120,7 +133,7 @@ function prReviewGrade(args = []) {
120
133
  const artifactPath = path.resolve(cwd, values.artifactFile);
121
134
  let result;
122
135
  try {
123
- result = verifyInProcess({
136
+ result = await verifyInProcess({
124
137
  mode: 'checks',
125
138
  skillName: 'review-pr',
126
139
  taskDir: path.dirname(artifactPath),
@@ -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
  }
@@ -236,7 +237,7 @@ async function inspectFacts(cwd, version) {
236
237
  const local = inspectLocalReleaseFacts(cwd, version);
237
238
  const remoteBranch = branch ? git(cwd, ['ls-remote', '--heads', 'origin', branch]) : null;
238
239
  const remoteTag = git(cwd, ['ls-remote', '--tags', 'origin', `refs/tags/${tag}`]);
239
- const platform = inspectPlatformRelease(tag, { cwd });
240
+ const platform = await inspectPlatformRelease(tag, { cwd });
240
241
  const npm = await inspectNpmChannel(pkg.name, version);
241
242
  const formulaUrl = `https://raw.githubusercontent.com/${config.org}/homebrew-tap/main/Formula/${config.project}.rb`;
242
243
  const homebrew = await inspectHomebrewChannel(formulaUrl, version);
@@ -247,7 +248,7 @@ async function inspectFacts(cwd, version) {
247
248
  localTagAncestor: local.localTagAncestor,
248
249
  localTagConflict: local.localTagConflict,
249
250
  remoteBranch: Boolean(remoteBranch && remoteBranch.split(/\s+/)[0] === head), remoteTag: Boolean(remoteTag),
250
- githubRelease: platform.platform.type !== 'github'
251
+ githubRelease: platform.error?.code === 'PLATFORM_CAPABILITY_UNSUPPORTED'
251
252
  ? true
252
253
  : platform.status === 'blocked' ? null : Boolean(platform.release?.published),
253
254
  npm: npm.published, homebrew: homebrew.published, smoke,
@@ -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,9 +319,9 @@ 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
- const milestones = reconcileReleaseMilestones(version, { cwd });
324
+ const milestones = await reconcileReleaseMilestones(version, { cwd });
316
325
  process.stdout.write(`${JSON.stringify({ ...milestones, snapshot: before })}\n`);
317
326
  process.exitCode = milestones.status === 'failed' ? 1 : milestones.status === 'blocked' ? 2 : 0;
318
327
  return;
@@ -354,7 +363,7 @@ async function releaseWorkflow(args = []) {
354
363
  return;
355
364
  }
356
365
  const tagged = command(cwd, 'git', ['tag', '-a', `v${version}`, '-m', `Release v${version}`]);
357
- const milestones = tagged.status === 0 ? reconcileReleaseMilestones(version, { cwd }) : null;
366
+ const milestones = tagged.status === 0 ? await reconcileReleaseMilestones(version, { cwd }) : null;
358
367
  const snapshot = releaseSnapshot(version, await inspectFacts(cwd, version));
359
368
  const failed = tagged.status !== 0 || milestones?.status === 'failed';
360
369
  const blocked = milestones?.status === 'blocked';
@@ -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;
@@ -1,8 +1,10 @@
1
- import { requestSandboxControl, requestSandboxTaskFinalization, requestSandboxTaskControl, SandboxControlClientError } from '../sandbox/control/client.js';
1
+ import { recoverSandboxControl, requestSandboxControl, requestSandboxTaskFinalization, requestSandboxTaskControl, SandboxControlClientError } from '../sandbox/control/client.js';
2
2
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
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;
@@ -23,6 +25,24 @@ function finalizationErrorStatus(error) {
23
25
  return 'unknown';
24
26
  return error.retryable ? 'blocked' : 'failed';
25
27
  }
28
+ function writeClientError(error) {
29
+ process.stderr.write(`${error.detail.message}\n`);
30
+ if (error.requestId)
31
+ process.stderr.write(`SANDBOX_CONTROL_REQUEST_ID: ${error.requestId}\n`);
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
+ }
26
46
  function sandboxFinalizationClient(args) {
27
47
  if (args.length !== 4 || !args[0] || args[1] !== 'complete' || args[2] !== '--agent' || !args[3]) {
28
48
  const error = { code: 'TASK_FINALIZATION_PAYLOAD_INVALID', message: 'task ref, complete intent, and --agent are required', retryable: false };
@@ -46,7 +66,7 @@ function sandboxFinalizationClient(args) {
46
66
  if (!(error instanceof SandboxControlClientError))
47
67
  throw error;
48
68
  writeFinalizationEnvelope(finalizationErrorStatus(error.detail), error.accepted, error.detail);
49
- process.stderr.write(`${error.detail.message}\n`);
69
+ writeClientError(error);
50
70
  process.exitCode = error.detail.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN' ? 1 : error.detail.retryable ? 2 : 1;
51
71
  return;
52
72
  }
@@ -66,8 +86,10 @@ function sandboxFinalizationClient(args) {
66
86
  process.exitCode = response.exitCode ?? 1;
67
87
  }
68
88
  async function sandboxControl(args) {
89
+ if (!ensureInternalHandlerRoute('sandbox-control', args))
90
+ return;
69
91
  const [operation, ...rest] = args;
70
- if (operation === 'serve') {
92
+ if (internalHandlerRoute('sandbox-control', 'serve', operation ?? '')) {
71
93
  const manifestIndex = rest.indexOf('--manifest');
72
94
  const manifest = manifestIndex >= 0 ? rest[manifestIndex + 1] : undefined;
73
95
  if (!manifest)
@@ -85,7 +107,7 @@ async function sandboxControl(args) {
85
107
  }
86
108
  return;
87
109
  }
88
- if (operation === 'execute') {
110
+ if (internalHandlerRoute('sandbox-control', 'execute', operation ?? '')) {
89
111
  const requestIndex = rest.indexOf('--request');
90
112
  const nonceIndex = rest.indexOf('--nonce');
91
113
  const request = requestIndex >= 0 ? rest[requestIndex + 1] : undefined;
@@ -95,7 +117,28 @@ async function sandboxControl(args) {
95
117
  await runSandboxControlExecutor(request, nonce);
96
118
  return;
97
119
  }
98
- if (operation === 'client') {
120
+ if (internalHandlerRoute('sandbox-control', 'recover', operation ?? '')) {
121
+ if (rest.length !== 1 || !rest[0])
122
+ throw new Error('sandbox-control recover requires <request-id>');
123
+ let response;
124
+ try {
125
+ response = recoverSandboxControl(rest[0]);
126
+ }
127
+ catch (error) {
128
+ if (!(error instanceof SandboxControlClientError))
129
+ throw error;
130
+ writeClientError(error);
131
+ process.exitCode = error.detail.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN' ? 1 : error.detail.retryable ? 75 : 1;
132
+ return;
133
+ }
134
+ process.stdout.write(response.stdout);
135
+ process.stderr.write(response.stderr);
136
+ process.exitCode = response.phase === 'rejected'
137
+ ? response.error?.retryable ? 75 : 1
138
+ : recoveredExitCode(response);
139
+ return;
140
+ }
141
+ if (internalHandlerRoute('sandbox-control', 'client', operation ?? '')) {
99
142
  const [family = '', ...commandArgs] = rest;
100
143
  if (family === 'task-finalization') {
101
144
  sandboxFinalizationClient(commandArgs);
@@ -117,7 +160,7 @@ async function sandboxControl(args) {
117
160
  catch (error) {
118
161
  if (!(error instanceof SandboxControlClientError))
119
162
  throw error;
120
- process.stderr.write(`${error.detail.message}\n`);
163
+ writeClientError(error);
121
164
  process.exitCode = error.detail.retryable ? 75 : 1;
122
165
  return;
123
166
  }
@@ -132,7 +175,7 @@ async function sandboxControl(args) {
132
175
  }
133
176
  return;
134
177
  }
135
- throw new Error('Usage: agent-infra-internal sandbox-control serve --manifest <path> | execute --request <path> --nonce <nonce> | client <family> [args...]');
178
+ throw new Error('Usage: agent-infra-internal sandbox-control serve --manifest <path> | execute --request <path> --nonce <nonce> | client <family> [args...] | recover <request-id>');
136
179
  }
137
180
  export { sandboxControl };
138
181
  //# sourceMappingURL=sandbox-control.js.map
@@ -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]
@@ -32,13 +33,21 @@ function usageFailure(message) {
32
33
  process.stderr.write(USAGE);
33
34
  process.exitCode = 1;
34
35
  }
35
- function taskActivity(args = []) {
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 @@ 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 @@ 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}'`);
@@ -113,7 +122,7 @@ function taskActivity(args = []) {
113
122
  let result;
114
123
  let humanOverride = null;
115
124
  try {
116
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-activity.${kind}`, () => {
125
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-activity.${kind}`, async () => {
117
126
  let current = applyPrReviewActivityIntent(values, { lockAlreadyHeld: true });
118
127
  if (current.status !== 'failed' || !values.overrideTicket)
119
128
  return current;
@@ -121,7 +130,7 @@ function taskActivity(args = []) {
121
130
  usageFailure('override ticket requires target and scope');
122
131
  return current;
123
132
  }
124
- const consumed = consumeHumanOverride({
133
+ const consumed = await consumeHumanOverride({
125
134
  taskRef, ticketId: String(values.overrideTicket),
126
135
  failureId: failureId('activity-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
127
136
  target: String(values.overrideTarget), scope: String(values.overrideScope)