@fitlab-ai/agent-infra 0.9.13 → 0.9.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -1,8 +1,13 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { readFileSync } from 'node:fs';
3
+ import path from 'node:path';
1
4
  import {
2
5
  recoverSandboxControl,
3
6
  requestSandboxControl,
4
7
  requestSandboxTaskFinalization,
5
8
  requestSandboxTaskControl,
9
+ requestSandboxTaskWorkflow,
10
+ resolveVisibleActiveShortId,
6
11
  SandboxControlClientError
7
12
  } from '../sandbox/control/client.ts';
8
13
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.ts';
@@ -12,6 +17,115 @@ import {
12
17
  controllerProofFromContext,
13
18
  verifyCodexSandboxControllerContextWithWarnings
14
19
  } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.ts';
20
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
21
+ import { parseTaskCreateResult, taskCreateExitCode } from '../task/create-service.ts';
22
+ import { createTaskWorkflowRequest } from '../sandbox/control/task-workflow.ts';
23
+ import { computeLifecycleBuildIdentity } from '../agent-clients/adapters/codex-lifecycle/build-identity.ts';
24
+ import { routeOrchestration } from '../task/orchestration.ts';
25
+ import { parseArtifactName } from '../task/artifact-name.ts';
26
+ import type { LifecycleAuthorityRequestV1 } from '../task/control-authority.ts';
27
+
28
+ function valueAfter(args: readonly string[], flag: string): string | undefined {
29
+ for (let index = 0; index < args.length; index += 1) {
30
+ if (args[index] === flag) return args[index + 1];
31
+ if (args[index]?.startsWith(`${flag}=`)) return args[index]!.slice(flag.length + 1);
32
+ }
33
+ return undefined;
34
+ }
35
+
36
+ function withoutValue(args: readonly string[], flag: string): string[] {
37
+ const result: string[] = [];
38
+ for (let index = 0; index < args.length; index += 1) {
39
+ if (args[index] === flag) { index += 1; continue; }
40
+ if (args[index]?.startsWith(`${flag}=`)) continue;
41
+ result.push(args[index]!);
42
+ }
43
+ return result;
44
+ }
45
+
46
+ function lifecycleIds(authorityRef: string, taskId: string): Readonly<{ operationId: string; lifecycleRequestId: string }> {
47
+ const digest = (label: string) => createHash('sha256')
48
+ .update(`${label}\0${taskId}\0${authorityRef}`, 'utf8')
49
+ .digest('hex');
50
+ return { operationId: digest('operation'), lifecycleRequestId: digest('lifecycle-request') };
51
+ }
52
+
53
+ function lifecycleAuthorityIdentity(
54
+ authorityRef: string,
55
+ taskId: string,
56
+ requestId: string,
57
+ phase: LifecycleAuthorityRequestV1['phase'],
58
+ family: LifecycleAuthorityRequestV1['family'],
59
+ artifact: string,
60
+ round: number
61
+ ): LifecycleAuthorityRequestV1 | undefined {
62
+ const contextPath = process.env.AGENT_INFRA_CODEX_CONTROLLER_CONTEXT;
63
+ if (!authorityRef || !contextPath) return undefined;
64
+ const routed = verifyCodexSandboxControllerContextWithWarnings(contextPath, { repoRoot: process.cwd() });
65
+ const buildIdentity = computeLifecycleBuildIdentity(process.cwd());
66
+ const hookDefinitionHash = createHash('sha256')
67
+ .update(readFileSync(path.join(process.cwd(), '.codex', 'hooks.json')))
68
+ .digest('hex');
69
+ const ids = lifecycleIds(authorityRef, taskId);
70
+ return {
71
+ version: 1,
72
+ requestId,
73
+ operationId: ids.operationId,
74
+ phase,
75
+ taskId,
76
+ family,
77
+ artifact,
78
+ round,
79
+ lifecycleRequestId: ids.lifecycleRequestId,
80
+ authorityRef,
81
+ expectedControlGeneration: routed.context.controlGeneration,
82
+ expectedControllerInstanceDigest: routed.context.controllerInstanceDigest,
83
+ expectedBuildIdentityDigest: createHash('sha256').update(JSON.stringify(buildIdentity)).digest('hex'),
84
+ expectedHookDefinitionHash: hookDefinitionHash
85
+ };
86
+ }
87
+
88
+ function lifecycleAuthoritySelector(args: readonly string[]): LifecycleAuthorityRequestV1 | undefined {
89
+ if (!isCanonicalCodexPrepare(args)) return undefined;
90
+ const authorityRef = valueAfter(args, '--capability-ref');
91
+ const taskId = args[0];
92
+ if (!authorityRef || !taskId) return undefined;
93
+ const routed = routeOrchestration(taskId);
94
+ if (!routed.next || !['analysis', 'plan', 'code'].includes(routed.next.stage)) return undefined;
95
+ return lifecycleAuthorityIdentity(
96
+ authorityRef,
97
+ taskId,
98
+ randomUUID(),
99
+ 'orchestration.prepare',
100
+ routed.next.stage === 'analysis' ? 'analysis' : routed.next.stage === 'plan' ? 'plan' : 'code',
101
+ routed.next.artifact,
102
+ routed.next.round
103
+ );
104
+ }
105
+
106
+ function lifecycleWorkflowAuthoritySelector(
107
+ originalArgs: readonly string[],
108
+ workflow: ReturnType<typeof createTaskWorkflowRequest>
109
+ ): LifecycleAuthorityRequestV1 | undefined {
110
+ const authorityRef = valueAfter(originalArgs, '--capability-ref');
111
+ if (!authorityRef) return undefined;
112
+ if (workflow.operation === 'artifact-finalize-local') {
113
+ const family = valueAfter(workflow.args, '--family');
114
+ const artifact = valueAfter(workflow.args, '--artifact');
115
+ const parsed = artifact ? parseArtifactName(artifact) : null;
116
+ if ((family !== 'analysis' && family !== 'plan' && family !== 'code')
117
+ || !parsed || parsed.family !== family) return undefined;
118
+ return lifecycleAuthorityIdentity(authorityRef, workflow.taskId, workflow.id,
119
+ 'artifact.finalize-local', family, artifact!, parsed.round);
120
+ }
121
+ if (workflow.operation !== 'event') return undefined;
122
+ const completed = /^(analysis|plan|code)\.completed$/u.exec(workflow.args[1] ?? '');
123
+ const artifact = valueAfter(workflow.args, '--artifact');
124
+ const parsed = artifact ? parseArtifactName(artifact) : null;
125
+ if (!completed || !parsed || parsed.family !== completed[1]) return undefined;
126
+ return lifecycleAuthorityIdentity(authorityRef, workflow.taskId, workflow.id,
127
+ 'task-event.completed', completed[1] as LifecycleAuthorityRequestV1['family'], artifact!, parsed.round);
128
+ }
15
129
 
16
130
  function isCanonicalCodexPrepare(args: readonly string[]): boolean {
17
131
  if (args[1] !== 'prepare') return false;
@@ -45,6 +159,17 @@ function writeClientError(error: SandboxControlClientError): void {
45
159
  if (error.requestId) process.stderr.write(`SANDBOX_CONTROL_REQUEST_ID: ${error.requestId}\n`);
46
160
  }
47
161
 
162
+ function recoveredExitCode(response: Awaited<ReturnType<typeof recoverSandboxControl>>): number {
163
+ if (response.phase !== 'completed') return response.exitCode ?? 1;
164
+ try {
165
+ const result = parseTaskCreateResult(JSON.parse(response.stdout));
166
+ if (result.control?.requestId === response.id) return taskCreateExitCode(result);
167
+ } catch {
168
+ // Other control families use their own result envelopes.
169
+ }
170
+ return response.exitCode ?? 1;
171
+ }
172
+
48
173
  function sandboxFinalizationClient(args: string[]): void {
49
174
  if (args.length !== 4 || !args[0] || args[1] !== 'complete' || args[2] !== '--agent' || !args[3]) {
50
175
  const error = { code: 'TASK_FINALIZATION_PAYLOAD_INVALID', message: 'task ref, complete intent, and --agent are required', retryable: false };
@@ -87,8 +212,9 @@ function sandboxFinalizationClient(args: string[]): void {
87
212
  }
88
213
 
89
214
  async function sandboxControl(args: string[]): Promise<void> {
215
+ if (!ensureInternalHandlerRoute('sandbox-control', args)) return;
90
216
  const [operation, ...rest] = args;
91
- if (operation === 'serve') {
217
+ if (internalHandlerRoute('sandbox-control', 'serve', operation ?? '')) {
92
218
  const manifestIndex = rest.indexOf('--manifest');
93
219
  const manifest = manifestIndex >= 0 ? rest[manifestIndex + 1] : undefined;
94
220
  if (!manifest) throw new Error('sandbox-control serve requires --manifest');
@@ -104,7 +230,7 @@ async function sandboxControl(args: string[]): Promise<void> {
104
230
  }
105
231
  return;
106
232
  }
107
- if (operation === 'execute') {
233
+ if (internalHandlerRoute('sandbox-control', 'execute', operation ?? '')) {
108
234
  const requestIndex = rest.indexOf('--request');
109
235
  const nonceIndex = rest.indexOf('--nonce');
110
236
  const request = requestIndex >= 0 ? rest[requestIndex + 1] : undefined;
@@ -113,7 +239,7 @@ async function sandboxControl(args: string[]): Promise<void> {
113
239
  await runSandboxControlExecutor(request, nonce);
114
240
  return;
115
241
  }
116
- if (operation === 'recover') {
242
+ if (internalHandlerRoute('sandbox-control', 'recover', operation ?? '')) {
117
243
  if (rest.length !== 1 || !rest[0]) throw new Error('sandbox-control recover requires <request-id>');
118
244
  let response;
119
245
  try {
@@ -128,15 +254,58 @@ async function sandboxControl(args: string[]): Promise<void> {
128
254
  process.stderr.write(response.stderr);
129
255
  process.exitCode = response.phase === 'rejected'
130
256
  ? response.error?.retryable ? 75 : 1
131
- : response.exitCode ?? 1;
257
+ : recoveredExitCode(response);
132
258
  return;
133
259
  }
134
- if (operation === 'client') {
260
+ if (internalHandlerRoute('sandbox-control', 'client', operation ?? '')) {
135
261
  const [family = '', ...commandArgs] = rest;
136
262
  if (family === 'task-finalization') {
137
263
  sandboxFinalizationClient(commandArgs);
138
264
  return;
139
265
  }
266
+ if (family === 'task-workflow') {
267
+ const command = commandArgs[0] as Parameters<typeof createTaskWorkflowRequest>[0] | undefined;
268
+ const taskId = process.env.AGENT_INFRA_TASK_ID;
269
+ const generation = process.env.AGENT_INFRA_CONTROL_GENERATION;
270
+ if (!command || !taskId || !generation) {
271
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'SANDBOX_CONTROL_REQUEST_INVALID', message: 'task-workflow requires a bound task and generation' } })}\n`);
272
+ process.exitCode = 1;
273
+ return;
274
+ }
275
+ let workflow;
276
+ try {
277
+ const args = withoutValue(commandArgs.slice(1), '--capability-ref');
278
+ if (/^\d+$/.test(args[0] ?? '')) {
279
+ const resolved = resolveVisibleActiveShortId(args[0]!);
280
+ if (resolved !== taskId) throw new Error('SANDBOX_TASK_REF_MISMATCH');
281
+ args[0] = resolved;
282
+ }
283
+ workflow = createTaskWorkflowRequest(command, args, taskId, generation);
284
+ }
285
+ catch (error) {
286
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'SANDBOX_CONTROL_REQUEST_INVALID', message: error instanceof Error ? error.message : String(error) } })}\n`);
287
+ process.exitCode = 1;
288
+ return;
289
+ }
290
+ let response;
291
+ try {
292
+ const authority = lifecycleWorkflowAuthoritySelector(commandArgs, workflow);
293
+ response = requestSandboxTaskWorkflow({
294
+ workflow,
295
+ ...(authority ? { authority } : {})
296
+ });
297
+ }
298
+ catch (error) {
299
+ if (!(error instanceof SandboxControlClientError)) throw error;
300
+ writeClientError(error);
301
+ process.exitCode = error.detail.retryable ? 75 : 1;
302
+ return;
303
+ }
304
+ process.stdout.write(response.stdout);
305
+ process.stderr.write(response.stderr);
306
+ process.exitCode = response.phase === 'rejected' ? response.error?.retryable ? 75 : 1 : response.exitCode ?? 1;
307
+ return;
308
+ }
140
309
  let response;
141
310
  try {
142
311
  if (family === 'task-orchestration' && isCanonicalCodexPrepare(commandArgs)) {
@@ -144,7 +313,13 @@ async function sandboxControl(args: string[]): Promise<void> {
144
313
  const proof = contextPath
145
314
  ? controllerProofFromContext(verifyCodexSandboxControllerContextWithWarnings(contextPath).context)
146
315
  : null;
147
- response = requestSandboxTaskControl({ family, args: commandArgs, controllerProof: proof });
316
+ const authority = lifecycleAuthoritySelector(commandArgs);
317
+ response = requestSandboxTaskControl({
318
+ family,
319
+ args: commandArgs,
320
+ controllerProof: authority ? null : proof,
321
+ ...(authority ? { authority } : {})
322
+ });
148
323
  } else {
149
324
  response = requestSandboxControl({ family, args: commandArgs });
150
325
  }
@@ -9,6 +9,7 @@ import type {
9
9
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.ts';
10
10
  import { resolveTaskRef } from '../task/resolve-ref.ts';
11
11
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
12
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
12
13
 
13
14
  const USAGE = `Usage: agent-infra-internal task-activity <task-ref> pr-review-inspect
14
15
  agent-infra-internal task-activity <task-ref> pr-review-start --agent <agent> --artifact <canonical.md> --head <40hex> [--dry-run]
@@ -44,9 +45,16 @@ function usageFailure(message: string): void {
44
45
  }
45
46
 
46
47
  async function taskActivity(args: string[] = []): Promise<void> {
48
+ if (!ensureInternalHandlerRoute('task-activity', args)) return;
47
49
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
48
50
  const [taskRef, kind] = args;
49
- if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)) {
51
+ if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)
52
+ || ![
53
+ internalHandlerRoute('task-activity', 'pr-review-inspect', kind),
54
+ internalHandlerRoute('task-activity', 'pr-review-start', kind),
55
+ internalHandlerRoute('task-activity', 'pr-review-complete', kind),
56
+ internalHandlerRoute('task-activity', 'pr-review-terminate', kind)
57
+ ].some(Boolean)) {
50
58
  usageFailure('task ref and a supported PR review intent are required');
51
59
  return;
52
60
  }
@@ -72,7 +80,7 @@ async function taskActivity(args: string[] = []): Promise<void> {
72
80
  const allowed = ALLOWED[kind]!;
73
81
  const unexpected = Object.keys(values).find((key) => !allowed.has(key));
74
82
  if (unexpected) { usageFailure(`${kind} does not accept '${unexpected}'`); return; }
75
- if (kind === 'pr-review-inspect') {
83
+ if (internalHandlerRoute('task-activity', 'pr-review-inspect', kind)) {
76
84
  const result = inspectPrReviewActivity(values as PrReviewInspectIntent);
77
85
  process.stdout.write(`${JSON.stringify(result)}\n`);
78
86
  if (result.status === 'failed') process.exitCode = 1;
@@ -81,9 +89,9 @@ async function taskActivity(args: string[] = []): Promise<void> {
81
89
  for (const key of COMMON) {
82
90
  if (values[key] === undefined) { usageFailure(`${kind} requires '${key}'`); return; }
83
91
  }
84
- const operationRequired = kind === 'pr-review-complete'
92
+ const operationRequired = internalHandlerRoute('task-activity', 'pr-review-complete', kind)
85
93
  ? ['verdict', 'blockers', 'major', 'minor']
86
- : kind === 'pr-review-terminate' ? ['outcome', 'reason'] : [];
94
+ : internalHandlerRoute('task-activity', 'pr-review-terminate', kind) ? ['outcome', 'reason'] : [];
87
95
  for (const key of operationRequired) {
88
96
  if (values[key] === undefined) { usageFailure(`${kind} requires '${key}'`); return; }
89
97
  }
@@ -1,90 +1,26 @@
1
- import { resolveArtifactContext } from '../task/artifact-lifecycle.ts';
2
- import { finalizeLocalArtifact } from '../task/local-artifact-finalization.ts';
3
- import type { LocalArtifactFamily } from '../task/local-artifact-finalization.ts';
4
- import { resolveTaskRef } from '../task/resolve-ref.ts';
5
- import { loadVerificationConfig } from '../task/verification-config.ts';
1
+ import { parseArtifactCommand, executeArtifactCommand } from '../task/artifact-command.ts';
2
+ import { ensureInternalHandlerRoute } from './cli-route-inventory.ts';
6
3
 
7
- const USAGE = `Usage: agent-infra-internal task-artifact <N | TASK-id> inspect --family <family>\n agent-infra-internal task-artifact <N | TASK-id> finalize-local --family <analysis|plan|code> --artifact <artifact>\n\nInspect workflow artifact context or finalize a local analysis/plan/code artifact without changing task state.\n`;
4
+ const USAGE = `Usage: agent-infra-internal task-artifact <N | TASK-id> inspect --family <family>\n agent-infra-internal task-artifact <N | TASK-id> init --family <family> --artifact <artifact> [--locale <zh-CN|en>]\n agent-infra-internal task-artifact <N | TASK-id> repair --family <family> --artifact <artifact> --expected-sha256 <sha256> --expected-semantic-digest <digest>\n agent-infra-internal task-artifact <N | TASK-id> finalize-local --family <analysis|plan|code> --artifact <artifact>\n\nInspect, initialize, repair, or finalize a workflow artifact without changing task state.\n`;
8
5
 
9
- function failUsage(message: string): void {
10
- process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'ARTIFACT_PAYLOAD_INVALID', message } })}\n`);
11
- process.stderr.write(USAGE);
12
- process.exitCode = 2;
13
- }
14
6
 
15
7
  function taskArtifact(args: string[] = []): void {
8
+ if (!ensureInternalHandlerRoute('task-artifact', args)) return;
16
9
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
17
- if (args.length < 2) { failUsage('task ref and operation are required'); return; }
18
- const operation = args[1];
19
- if (operation !== 'inspect' && operation !== 'finalize-local') { failUsage(`unknown operation '${operation}'`); return; }
20
- let family = '';
21
- let artifact = '';
22
- const seen = new Set<string>();
23
- for (let index = 2; index < args.length; index += 1) {
24
- const flag = args[index]!;
25
- if (flag !== '--family' && flag !== '--artifact') { failUsage(`unknown option '${flag}'`); return; }
26
- if (seen.has(flag)) { failUsage(`duplicate option '${flag}'`); return; }
27
- const value = args[++index];
28
- if (!value || value.startsWith('--')) { failUsage(`option '${flag}' requires a value`); return; }
29
- seen.add(flag);
30
- if (flag === '--family') family = value;
31
- else artifact = value;
32
- }
33
- if (!family) { failUsage("option '--family' is required"); return; }
34
- if (operation === 'inspect') {
35
- if (artifact) { failUsage("option '--artifact' is only valid for finalize-local"); return; }
36
- const result = resolveArtifactContext(args[0]!, family);
37
- const output = family === 'code' && result.codeMode ? {
38
- ...result,
39
- mode: result.codeMode.mode,
40
- code_max: result.codeMode.codeMax,
41
- rev_max: result.codeMode.reviewMax,
42
- verdict: result.codeMode.verdict,
43
- next_round: result.next?.round ?? null,
44
- next_artifact: result.next?.name ?? null,
45
- review_artifact: result.codeMode.reviewArtifact,
46
- implementation_input: result.codeMode.implementationInput,
47
- decision_id: result.codeMode.decisionId,
48
- decision_evidence: result.codeMode.decisionEvidence,
49
- message: result.codeMode.message
50
- } : result;
51
- process.stdout.write(`${JSON.stringify(output)}\n`);
52
- if (result.status === 'refused') process.exitCode = 1;
53
- else if (result.status === 'failed') process.exitCode = 2;
10
+ let command;
11
+ try { command = parseArtifactCommand(args); }
12
+ catch (error) {
13
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: {
14
+ code: 'ARTIFACT_PAYLOAD_INVALID', message: error instanceof Error ? error.message : String(error)
15
+ } })}\n`);
16
+ process.stderr.write(USAGE);
17
+ process.exitCode = 2;
54
18
  return;
55
19
  }
56
- const resolved = resolveTaskRef(args[0]!);
57
- const repositoryRoot = resolved.ok ? resolved.repoRoot : process.cwd();
58
- if (!artifact) { failUsage("option '--artifact' is required"); return; }
59
- if (family !== 'analysis' && family !== 'plan' && family !== 'code') {
60
- failUsage("finalize-local only supports 'analysis', 'plan', and 'code'");
61
- return;
62
- }
63
- const skillName = family === 'analysis' ? 'analyze-task' : family === 'plan' ? 'plan-task' : 'code-task';
64
- let config: { requiredSections?: readonly string[]; requiredPatterns?: readonly string[] } = {};
65
- try {
66
- const loaded = loadVerificationConfig(repositoryRoot, skillName);
67
- const artifactConfig = loaded.checks.artifact;
68
- if (artifactConfig && typeof artifactConfig === 'object' && !Array.isArray(artifactConfig)) {
69
- const sections = artifactConfig.required_sections;
70
- const patterns = artifactConfig.required_patterns;
71
- config = {
72
- requiredSections: Array.isArray(sections) ? sections.filter((value): value is string => typeof value === 'string') : undefined,
73
- requiredPatterns: Array.isArray(patterns) ? patterns.filter((value): value is string => typeof value === 'string') : undefined
74
- };
75
- }
76
- } catch {
77
- // Isolated fixture repositories may not contain the project's verification config.
78
- }
79
- const result = finalizeLocalArtifact({
80
- taskRef: args[0]!,
81
- family: family as LocalArtifactFamily,
82
- artifact,
83
- repoRoot: repositoryRoot,
84
- ...config
85
- });
20
+ const result = executeArtifactCommand(command);
86
21
  process.stdout.write(`${JSON.stringify(result)}\n`);
87
- if (result.status === 'failed') process.exitCode = 1;
22
+ if (result.status === 'refused') process.exitCode = 1;
23
+ else if (result.status === 'failed') process.exitCode = command.operation === 'inspect' ? 2 : 1;
88
24
  }
89
25
 
90
26
  export { taskArtifact };
@@ -1,5 +1,6 @@
1
1
  import { parseTaskScope } from '../task/command-options.ts';
2
2
  import { resolveTaskContext } from '../task/resolve-ref.ts';
3
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
3
4
 
4
5
  const USAGE = `Usage: agent-infra-internal task-context resolve [<task-ref> | --task <task-ref> | -t <task-ref>]\n`;
5
6
 
@@ -10,8 +11,9 @@ function fail(code: string, message: string, usage = false): void {
10
11
  }
11
12
 
12
13
  function taskContext(args: string[] = []): void {
14
+ if (!ensureInternalHandlerRoute('task-context', args)) return;
13
15
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
14
- if (args[0] !== 'resolve') { fail('TASK_CONTEXT_PAYLOAD_INVALID', "operation 'resolve' is required", true); return; }
16
+ if (!internalHandlerRoute('task-context', 'resolve', args[0] ?? '')) { fail('TASK_CONTEXT_PAYLOAD_INVALID', "operation 'resolve' is required", true); return; }
15
17
  let scope;
16
18
  try {
17
19
  scope = parseTaskScope(args.slice(1));
@@ -1,25 +1,77 @@
1
1
  import fs from 'node:fs';
2
+ import { resolveSandboxControlTransport } from './task-operation-registry.ts';
2
3
  import path from 'node:path';
3
4
 
4
- import { requestSandboxTaskCreate, SandboxControlClientError } from '../sandbox/control/client.ts';
5
+ import {
6
+ requestSandboxTaskCreate,
7
+ SandboxControlClientError
8
+ } from '../sandbox/control/client.ts';
5
9
  import { SANDBOX_CONTROL_MAX_BYTES } from '../sandbox/control/protocol.ts';
6
10
  import { validateTaskCreateCandidate } from '../task/create.ts';
7
- import { createTask, type TaskCreateResult } from '../task/create-service.ts';
11
+ import {
12
+ createTask,
13
+ parseTaskCreateResult,
14
+ projectTaskCreateResult,
15
+ taskCreateExitCode,
16
+ taskCreateFailure,
17
+ type TaskCreateControl,
18
+ type TaskCreateResult
19
+ } from '../task/create-service.ts';
20
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
8
21
 
9
- function failed(code: string, message: string, retryable = false): TaskCreateResult {
10
- return {
11
- status: retryable ? 'blocked' : 'failed', changed: false, task: { id: null, shortId: null }, issue: null,
12
- operations: [], warnings: [], error: { code, message, retryable }
13
- };
22
+ function failed(code: string, message: string, retryable = false, control?: TaskCreateControl): TaskCreateResult {
23
+ return taskCreateFailure({ code, message, retryable }, control);
14
24
  }
15
25
 
16
26
  function output(result: TaskCreateResult): void {
17
27
  process.stdout.write(`${JSON.stringify(result)}\n`);
18
- process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
28
+ process.exitCode = taskCreateExitCode(result);
29
+ }
30
+
31
+ function clientErrorControl(error: SandboxControlClientError): TaskCreateControl {
32
+ return {
33
+ requestId: error.requestId,
34
+ accepted: error.accepted,
35
+ recovery: error.accepted ? 'same-request-id' : error.detail.retryable ? 'new-request-id' : 'none'
36
+ };
37
+ }
38
+
39
+ function parseControlledResult(response: ReturnType<typeof requestSandboxTaskCreate>): TaskCreateResult {
40
+ if (response.phase !== 'completed' || response.error !== null) {
41
+ return failed(
42
+ 'SANDBOX_CONTROL_RESPONSE_INVALID',
43
+ 'SANDBOX_CONTROL_RESPONSE_INVALID: completed task-create response is invalid',
44
+ false,
45
+ { requestId: response.id, accepted: true, recovery: 'same-request-id' }
46
+ );
47
+ }
48
+ let result: TaskCreateResult;
49
+ try {
50
+ result = parseTaskCreateResult(JSON.parse(response.stdout));
51
+ } catch {
52
+ return failed(
53
+ 'TASK_CREATE_RESULT_INVALID',
54
+ 'TASK_CREATE_RESULT_INVALID: task-create result payload is invalid',
55
+ false,
56
+ { requestId: response.id, accepted: true, recovery: 'same-request-id' }
57
+ );
58
+ }
59
+ if (!result.control || result.control.requestId !== response.id || result.control.accepted !== true) {
60
+ return failed(
61
+ 'TASK_CREATE_RESULT_INVALID',
62
+ 'TASK_CREATE_RESULT_INVALID: controlled task-create result is missing request evidence',
63
+ false,
64
+ { requestId: response.id, accepted: true, recovery: 'same-request-id' }
65
+ );
66
+ }
67
+ process.stderr.write(response.stderr);
68
+ return result;
19
69
  }
20
70
 
21
71
  async function taskCreate(args: string[]): Promise<void> {
22
- const inputIndex = args.indexOf('--input');
72
+ if (!ensureInternalHandlerRoute('task-create', args)) return;
73
+ const inputSelector = args.includes('--input') ? 'input' : '';
74
+ const inputIndex = internalHandlerRoute('task-create', 'input', inputSelector) ? args.indexOf('--input') : -1;
23
75
  const input = inputIndex >= 0 ? args[inputIndex + 1] : undefined;
24
76
  if (!input || args.length !== 2 || inputIndex !== 0) {
25
77
  output(failed('TASK_CREATE_PAYLOAD_INVALID', 'Usage: agent-infra-internal task-create --input <candidate.json>'));
@@ -31,25 +83,34 @@ async function taskCreate(args: string[]): Promise<void> {
31
83
  if (!stat.isFile() || stat.isSymbolicLink()) throw new Error('TASK_CREATE_INPUT_INVALID: input must be a regular file');
32
84
  if (stat.size > SANDBOX_CONTROL_MAX_BYTES) throw new Error('TASK_CREATE_INPUT_TOO_LARGE: input exceeds the control limit');
33
85
  const candidate = validateTaskCreateCandidate(JSON.parse(fs.readFileSync(inputPath, 'utf8')));
34
- if (process.env.AGENT_INFRA_CONTROL_TOKEN) {
86
+ const environment = resolveSandboxControlTransport();
87
+ if (environment.kind === 'fail-closed') {
88
+ output(failed(environment.reasonCode ?? 'TASK_CONTROL_TRANSPORT_INVALID', 'sandbox client control configuration is invalid'));
89
+ return;
90
+ }
91
+ if (environment.kind === 'broker-client') {
35
92
  const response = requestSandboxTaskCreate({ candidate });
36
93
  if (response.phase === 'rejected') {
94
+ const accepted = response.error?.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN';
37
95
  output(failed(
38
96
  response.error?.code ?? 'SANDBOX_CONTROL_REJECTED',
39
97
  response.error?.message ?? response.stderr,
40
- response.error?.retryable ?? false
98
+ response.error?.retryable ?? false,
99
+ {
100
+ requestId: response.id,
101
+ accepted,
102
+ recovery: accepted ? 'same-request-id' : response.error?.retryable ? 'new-request-id' : 'none'
103
+ }
41
104
  ));
42
105
  return;
43
106
  }
44
- process.stdout.write(response.stdout);
45
- process.stderr.write(response.stderr);
46
- process.exitCode = response.exitCode;
107
+ output(parseControlledResult(response));
47
108
  return;
48
109
  }
49
110
  output(await createTask(candidate, { repoRoot: process.cwd() }));
50
111
  } catch (error) {
51
112
  if (error instanceof SandboxControlClientError) {
52
- output(failed(error.detail.code, error.detail.message, error.detail.retryable));
113
+ output(failed(error.detail.code, error.detail.message, error.detail.retryable, clientErrorControl(error)));
53
114
  return;
54
115
  }
55
116
  const message = error instanceof Error ? error.message : String(error);
@@ -2,13 +2,15 @@ import path from 'node:path';
2
2
 
3
3
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.ts';
4
4
  import { deliverTaskBranch } from '../task/delivery.ts';
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
5
6
 
6
7
  const USAGE = `Usage: agent-infra-internal task-delivery <task-ref> deliver --agent <agent> [--remote <name>] [--base <branch>] [--dry-run] [--cwd <path>]\n`;
7
8
 
8
9
  function taskDelivery(args: string[] = []): void {
10
+ if (!ensureInternalHandlerRoute('task-delivery', args)) return;
9
11
  const taskRef = args[0];
10
12
  const operation = args[1];
11
- if (!taskRef || operation !== 'deliver') {
13
+ if (!taskRef || !internalHandlerRoute('task-delivery', 'deliver', operation ?? '')) {
12
14
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'DELIVERY_PAYLOAD_INVALID', message: 'task ref and deliver operation are required' } })}\n`);
13
15
  process.stderr.write(USAGE);
14
16
  process.exitCode = 1;
@@ -4,6 +4,7 @@ import type { TaskEventRequest, Verdict } from '../task/events.ts';
4
4
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.ts';
5
5
  import { resolveTaskRef } from '../task/resolve-ref.ts';
6
6
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
7
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
7
8
 
8
9
  const USAGE = `Usage: agent-infra-internal task-event <N | TASK-id> <event> --agent <agent> [event options] [--orchestrated] [--dry-run]
9
10
 
@@ -20,6 +21,7 @@ const FLAGS: Record<string, keyof TaskEventRequest> = {
20
21
  '--verdict': 'verdict', '--blockers': 'blockers', '--major': 'major',
21
22
  '--minor': 'minor', '--manual-validation': 'manualValidation', '--files-modified': 'filesModified',
22
23
  '--tests-passed': 'testsPassed', '--summary-result': 'summaryResult',
24
+ '--transaction-id': 'transactionId', '--receipt-digest': 'receiptDigest', '--pr-head-sha': 'prHeadSha',
23
25
  '--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
24
26
  };
25
27
  const NUMERIC = new Set(['round', 'question', 'blockers', 'major', 'minor', 'manualValidation', 'filesModified', 'testsPassed']);
@@ -30,36 +32,45 @@ function usageFailure(message: string): void {
30
32
  process.exitCode = 1;
31
33
  }
32
34
 
33
- async function taskEvent(args: string[] = []): Promise<void> {
34
- if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
35
- if (args.length < 2) { usageFailure('task ref and event are required'); return; }
35
+ export function parseTaskEventRequest(args: readonly string[]): TaskEventRequest {
36
+ if (args.length < 2) throw new Error('task ref and event are required');
36
37
  const request: TaskEventRequest = { taskRef: args[0]!, event: args[1]!, agent: '' };
37
38
  const seen = new Set<string>();
38
39
  for (let index = 2; index < args.length; index += 1) {
39
40
  const flag = args[index]!;
40
41
  if (flag === '--orchestrated') {
41
- if (seen.has(flag)) { usageFailure(`duplicate option '${flag}'`); return; }
42
+ if (seen.has(flag)) throw new Error(`duplicate option '${flag}'`);
42
43
  seen.add(flag); request.orchestrated = true; continue;
43
44
  }
44
45
  if (flag === '--dry-run') {
45
- if (seen.has(flag)) { usageFailure(`duplicate option '${flag}'`); return; }
46
+ if (seen.has(flag)) throw new Error(`duplicate option '${flag}'`);
46
47
  seen.add(flag); request.dryRun = true; continue;
47
48
  }
48
49
  const key = FLAGS[flag];
49
- if (!key) { usageFailure(`unknown option '${flag}'`); return; }
50
- if (seen.has(flag)) { usageFailure(`duplicate option '${flag}'`); return; }
50
+ if (!key) throw new Error(`unknown option '${flag}'`);
51
+ if (seen.has(flag)) throw new Error(`duplicate option '${flag}'`);
51
52
  const value = args[++index];
52
- if (value === undefined || value.startsWith('--')) { usageFailure(`option '${flag}' requires a value`); return; }
53
+ if (value === undefined || value.startsWith('--')) throw new Error(`option '${flag}' requires a value`);
53
54
  seen.add(flag);
54
55
  if (NUMERIC.has(key)) (request as Record<string, unknown>)[key] = Number(value);
55
56
  else if (key === 'verdict') request.verdict = value as Verdict;
56
57
  else (request as Record<string, unknown>)[key] = value;
57
58
  }
58
59
  const agent = normalizeAgentToken(String(request.agent ?? ''));
59
- if (!agent) { usageFailure(`invalid --agent '${request.agent}': ${AGENT_USAGE_HINT}`); return; }
60
+ if (!agent) throw new Error(`invalid --agent '${request.agent}': ${AGENT_USAGE_HINT}`);
60
61
  request.agent = agent;
61
62
  const dryRunConflict = overrideDryRunConflict(request as unknown as Record<string, unknown>);
62
- if (dryRunConflict) { usageFailure(dryRunConflict.message); return; }
63
+ if (dryRunConflict) throw new Error(dryRunConflict.message);
64
+ return request;
65
+ }
66
+
67
+ async function taskEvent(args: string[] = []): Promise<void> {
68
+ if (!ensureInternalHandlerRoute('task-event', args)) return;
69
+ if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
70
+ if (!internalHandlerRoute('task-event', 'event', args[1] ? 'event' : '')) { usageFailure('task ref and event are required'); return; }
71
+ let request: TaskEventRequest;
72
+ try { request = parseTaskEventRequest(args); }
73
+ catch (error) { usageFailure(error instanceof Error ? error.message : String(error)); return; }
63
74
  const resolved = resolveTaskRef(request.taskRef);
64
75
  if (!resolved.ok) {
65
76
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: resolved.code, message: resolved.message } })}\n`);