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