@fitlab-ai/agent-infra 0.9.14 → 0.10.0

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 (354) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/internal-cli.sh +45 -0
  4. package/dist/bin/internal-cli.js +93 -30
  5. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  6. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +9 -4
  7. package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +43 -3
  8. package/dist/lib/defaults.json +103 -103
  9. package/dist/lib/fs/durable-write.js +39 -0
  10. package/dist/lib/fs/file-lock.js +111 -0
  11. package/dist/lib/host-control/audit.js +19 -0
  12. package/dist/lib/host-control/client.js +142 -0
  13. package/dist/lib/host-control/command.js +49 -0
  14. package/dist/lib/host-control/path.js +160 -0
  15. package/dist/lib/host-control/secure-fs.js +140 -0
  16. package/dist/lib/host-control/server.js +159 -0
  17. package/dist/lib/host-control/service.js +112 -0
  18. package/dist/lib/init.js +11 -2
  19. package/dist/lib/internal/cli-route-inventory.js +4 -2
  20. package/dist/lib/internal/codex-lifecycle.js +6 -6
  21. package/dist/lib/internal/demo-promotion.js +322 -0
  22. package/dist/lib/internal/demo-transcript.js +454 -0
  23. package/dist/lib/internal/host-control.js +28 -0
  24. package/dist/lib/internal/manual-validation.js +331 -0
  25. package/dist/lib/internal/platform-pr.js +18 -4
  26. package/dist/lib/internal/release-workflow.js +63 -84
  27. package/dist/lib/internal/sandbox-control.js +149 -2
  28. package/dist/lib/internal/task-artifact.js +16 -263
  29. package/dist/lib/internal/task-create.js +6 -5
  30. package/dist/lib/internal/task-event.js +37 -37
  31. package/dist/lib/internal/task-lifecycle.js +2 -2
  32. package/dist/lib/internal/task-operation-registry.js +101 -4
  33. package/dist/lib/internal/task-review.js +11 -56
  34. package/dist/lib/internal/task-validate.js +30 -10
  35. package/dist/lib/owned-path.js +33 -0
  36. package/dist/lib/platform/check-status.js +11 -0
  37. package/dist/lib/platform/comment-safety.js +4 -1
  38. package/dist/lib/platform/completion-backfill.js +1 -1
  39. package/dist/lib/platform/github-data.js +241 -0
  40. package/dist/lib/platform/github-provider.js +15 -20
  41. package/dist/lib/platform/issue-comments.js +18 -12
  42. package/dist/lib/platform/issues.js +2 -180
  43. package/dist/lib/platform/pr-change-report.js +5 -4
  44. package/dist/lib/platform/pr-checks.js +12 -65
  45. package/dist/lib/platform/pr-summary.js +117 -33
  46. package/dist/lib/platform/pull-requests.js +5 -108
  47. package/dist/lib/platform/snapshots.js +2 -0
  48. package/dist/lib/platform/task-identities.js +2 -9
  49. package/dist/lib/platform/verification-sync.js +132 -143
  50. package/dist/lib/pr-review/evidence-grading.js +4 -8
  51. package/dist/lib/release/workflow.js +1 -1
  52. package/dist/lib/sandbox/commands/create.js +7 -2
  53. package/dist/lib/sandbox/commands/rm.js +19 -1511
  54. package/dist/lib/sandbox/control/audit.js +203 -0
  55. package/dist/lib/sandbox/control/client.js +93 -54
  56. package/dist/lib/sandbox/control/executor.js +129 -65
  57. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  58. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  59. package/dist/lib/sandbox/control/lifecycle.js +36 -2
  60. package/dist/lib/sandbox/control/native-file-lock.js +6 -98
  61. package/dist/lib/sandbox/control/protocol.js +55 -4
  62. package/dist/lib/sandbox/control/server.js +518 -127
  63. package/dist/lib/sandbox/control/state.js +64 -0
  64. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  65. package/dist/lib/sandbox/control/workflow-executor.js +89 -0
  66. package/dist/lib/sandbox/index.js +1 -2
  67. package/dist/lib/sandbox/recovery.js +28 -4
  68. package/dist/lib/sandbox/removal.js +822 -0
  69. package/dist/lib/sandbox/task-cleanup.js +217 -0
  70. package/dist/lib/sandbox/workspace-identity.js +17 -1
  71. package/dist/lib/sandbox/workspace-view.js +13 -14
  72. package/dist/lib/task/activity-intent.js +2 -1
  73. package/dist/lib/task/activity-log.js +30 -24
  74. package/dist/lib/task/artifact-command.js +79 -0
  75. package/dist/lib/task/artifact-lifecycle.js +30 -28
  76. package/dist/lib/task/artifact-name.js +36 -0
  77. package/dist/lib/task/artifact-operations.js +29 -289
  78. package/dist/lib/task/artifact-receipts.js +3 -15
  79. package/dist/lib/task/artifact-recovery.js +430 -0
  80. package/dist/lib/task/artifact-repair-intent.js +134 -29
  81. package/dist/lib/task/artifact-schema.js +6 -14
  82. package/dist/lib/task/capabilities.js +12 -19
  83. package/dist/lib/task/codex-orchestration.js +71 -25
  84. package/dist/lib/task/commit-identity.js +28 -0
  85. package/dist/lib/task/commit-operation.js +33 -20
  86. package/dist/lib/task/control-authority.js +403 -6
  87. package/dist/lib/task/control-recovery.js +140 -0
  88. package/dist/lib/task/create-service.js +1 -8
  89. package/dist/lib/task/create.js +62 -9
  90. package/dist/lib/task/decision-details.js +2 -46
  91. package/dist/lib/task/delegation-receipts.js +64 -3
  92. package/dist/lib/task/events.js +275 -22
  93. package/dist/lib/task/finalization-state.js +9 -0
  94. package/dist/lib/task/human-override.js +8 -14
  95. package/dist/lib/task/implementation-inputs.js +3 -3
  96. package/dist/lib/task/intermediate-cleanup.js +441 -0
  97. package/dist/lib/task/invalidation.js +18 -65
  98. package/dist/lib/task/ledger-intents.js +7 -22
  99. package/dist/lib/task/ledger.js +1 -3
  100. package/dist/lib/task/lifecycle-recovery.js +549 -0
  101. package/dist/lib/task/lifecycle.js +31 -4
  102. package/dist/lib/task/local-artifact-finalization.js +197 -197
  103. package/dist/lib/task/manual-validation-completion.js +26 -0
  104. package/dist/lib/task/manual-validation-evidence.js +130 -0
  105. package/dist/lib/task/manual-validation-receipt.js +105 -0
  106. package/dist/lib/task/manual-validation-shared.js +40 -0
  107. package/dist/lib/task/manual-validation-transaction.js +243 -0
  108. package/dist/lib/task/markdown.js +47 -0
  109. package/dist/lib/task/orchestration.js +66 -19
  110. package/dist/lib/task/pr-delivery-fact.js +12 -56
  111. package/dist/lib/task/qualification-audit.js +20 -34
  112. package/dist/lib/task/recovery-warning.js +19 -0
  113. package/dist/lib/task/review-artifacts.js +2 -18
  114. package/dist/lib/task/review-command.js +26 -0
  115. package/dist/lib/task/review-finalization.js +175 -216
  116. package/dist/lib/task/review-fingerprint.js +2 -2
  117. package/dist/lib/task/sections.js +34 -56
  118. package/dist/lib/task/short-id.js +15 -7
  119. package/dist/lib/task/task-execution-lock.js +1 -1
  120. package/dist/lib/task/verification-engine.js +119 -337
  121. package/dist/lib/task/verification.js +1 -1
  122. package/dist/lib/task/workflow-command.js +16 -0
  123. package/dist/lib/task/workflow-warning-intents.js +0 -16
  124. package/dist/lib/task/workflow-warnings.js +28 -2
  125. package/dist/lib/update.js +2 -0
  126. package/dist/lib/version.js +1 -11
  127. package/dist/lifecycle-build-manifest.json +3 -3
  128. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  129. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +10 -4
  130. package/lib/agent-clients/adapters/codex-lifecycle/store.ts +55 -3
  131. package/lib/fs/durable-write.ts +30 -0
  132. package/lib/fs/file-lock.ts +113 -0
  133. package/lib/host-control/audit.ts +22 -0
  134. package/lib/host-control/client.ts +172 -0
  135. package/lib/host-control/command.ts +60 -0
  136. package/lib/host-control/path.ts +167 -0
  137. package/lib/host-control/secure-fs.ts +135 -0
  138. package/lib/host-control/server.ts +180 -0
  139. package/lib/host-control/service.ts +133 -0
  140. package/lib/init.ts +15 -2
  141. package/lib/internal/cli-route-inventory.ts +4 -2
  142. package/lib/internal/codex-lifecycle.ts +6 -6
  143. package/lib/internal/demo-promotion.ts +354 -0
  144. package/lib/internal/demo-transcript.ts +419 -0
  145. package/lib/internal/host-control.ts +28 -0
  146. package/lib/internal/manual-validation.ts +315 -0
  147. package/lib/internal/platform-pr.ts +15 -4
  148. package/lib/internal/release-workflow.ts +74 -82
  149. package/lib/internal/sandbox-control.ts +162 -1
  150. package/lib/internal/task-artifact.ts +14 -217
  151. package/lib/internal/task-create.ts +5 -5
  152. package/lib/internal/task-event.ts +20 -11
  153. package/lib/internal/task-lifecycle.ts +4 -3
  154. package/lib/internal/task-operation-registry.ts +111 -4
  155. package/lib/internal/task-review.ts +9 -54
  156. package/lib/internal/task-validate.ts +26 -10
  157. package/lib/owned-path.ts +26 -0
  158. package/lib/platform/check-status.ts +9 -0
  159. package/lib/platform/comment-safety.ts +5 -0
  160. package/lib/platform/completion-backfill.ts +1 -1
  161. package/lib/platform/github-data.ts +322 -0
  162. package/lib/platform/github-provider.ts +15 -20
  163. package/lib/platform/issue-comments.ts +21 -14
  164. package/lib/platform/issues.ts +5 -246
  165. package/lib/platform/pr-change-report.ts +7 -5
  166. package/lib/platform/pr-checks.ts +13 -77
  167. package/lib/platform/pr-summary.ts +123 -35
  168. package/lib/platform/pull-requests.ts +6 -173
  169. package/lib/platform/snapshots.ts +53 -0
  170. package/lib/platform/task-identities.ts +3 -14
  171. package/lib/platform/verification-sync.ts +150 -156
  172. package/lib/pr-review/evidence-grading.ts +4 -9
  173. package/lib/release/workflow.ts +3 -3
  174. package/lib/sandbox/commands/create.ts +7 -6
  175. package/lib/sandbox/commands/rm.ts +21 -1895
  176. package/lib/sandbox/control/audit.ts +253 -0
  177. package/lib/sandbox/control/client.ts +109 -66
  178. package/lib/sandbox/control/executor.ts +134 -74
  179. package/lib/sandbox/control/finalization-response.ts +29 -0
  180. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  181. package/lib/sandbox/control/lifecycle.ts +45 -3
  182. package/lib/sandbox/control/native-file-lock.ts +6 -107
  183. package/lib/sandbox/control/protocol.ts +80 -6
  184. package/lib/sandbox/control/server.ts +567 -132
  185. package/lib/sandbox/control/state.ts +86 -0
  186. package/lib/sandbox/control/task-workflow.ts +95 -0
  187. package/lib/sandbox/control/workflow-executor.ts +92 -0
  188. package/lib/sandbox/index.ts +1 -2
  189. package/lib/sandbox/recovery.ts +28 -5
  190. package/lib/sandbox/removal.ts +1142 -0
  191. package/lib/sandbox/task-cleanup.ts +209 -0
  192. package/lib/sandbox/workspace-identity.ts +19 -3
  193. package/lib/sandbox/workspace-view.ts +17 -15
  194. package/lib/task/activity-intent.ts +2 -2
  195. package/lib/task/activity-log.ts +27 -19
  196. package/lib/task/artifact-command.ts +85 -0
  197. package/lib/task/artifact-lifecycle.ts +31 -26
  198. package/lib/task/artifact-name.ts +55 -0
  199. package/lib/task/artifact-operations.ts +34 -310
  200. package/lib/task/artifact-receipts.ts +3 -14
  201. package/lib/task/artifact-recovery.ts +519 -0
  202. package/lib/task/artifact-repair-intent.ts +162 -33
  203. package/lib/task/artifact-schema.ts +5 -34
  204. package/lib/task/capabilities.ts +13 -22
  205. package/lib/task/codex-orchestration.ts +85 -24
  206. package/lib/task/commit-identity.ts +31 -0
  207. package/lib/task/commit-operation.ts +37 -20
  208. package/lib/task/control-authority.ts +540 -10
  209. package/lib/task/control-recovery.ts +186 -0
  210. package/lib/task/create-service.ts +1 -10
  211. package/lib/task/create.ts +63 -8
  212. package/lib/task/decision-details.ts +3 -71
  213. package/lib/task/delegation-receipts.ts +73 -2
  214. package/lib/task/events.ts +309 -24
  215. package/lib/task/finalization-state.ts +11 -0
  216. package/lib/task/human-override.ts +8 -16
  217. package/lib/task/implementation-inputs.ts +3 -3
  218. package/lib/task/intermediate-cleanup.ts +493 -0
  219. package/lib/task/invalidation.ts +18 -62
  220. package/lib/task/ledger-intents.ts +7 -24
  221. package/lib/task/ledger.ts +1 -3
  222. package/lib/task/lifecycle-recovery.ts +691 -0
  223. package/lib/task/lifecycle.ts +30 -5
  224. package/lib/task/local-artifact-finalization.ts +244 -234
  225. package/lib/task/manual-validation-completion.ts +40 -0
  226. package/lib/task/manual-validation-evidence.ts +209 -0
  227. package/lib/task/manual-validation-receipt.ts +156 -0
  228. package/lib/task/manual-validation-shared.ts +50 -0
  229. package/lib/task/manual-validation-transaction.ts +304 -0
  230. package/lib/task/markdown.ts +70 -0
  231. package/lib/task/orchestration.ts +84 -19
  232. package/lib/task/pr-delivery-fact.ts +15 -62
  233. package/lib/task/qualification-audit.ts +22 -33
  234. package/lib/task/recovery-warning.ts +21 -0
  235. package/lib/task/review-artifacts.ts +1 -20
  236. package/lib/task/review-command.ts +24 -0
  237. package/lib/task/review-finalization.ts +183 -292
  238. package/lib/task/review-fingerprint.ts +2 -2
  239. package/lib/task/sections.ts +33 -54
  240. package/lib/task/short-id.ts +27 -5
  241. package/lib/task/task-execution-lock.ts +1 -1
  242. package/lib/task/verification-engine.ts +113 -383
  243. package/lib/task/verification-types.ts +15 -0
  244. package/lib/task/verification.ts +1 -1
  245. package/lib/task/workflow-command.ts +17 -0
  246. package/lib/task/workflow-warning-intents.ts +0 -13
  247. package/lib/task/workflow-warnings.ts +21 -2
  248. package/lib/update.ts +6 -0
  249. package/lib/version.ts +1 -15
  250. package/package.json +6 -6
  251. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  252. package/templates/.agents/rules/create-issue.en.md +1 -1
  253. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  254. package/templates/.agents/rules/issue-sync.en.md +4 -2
  255. package/templates/.agents/rules/issue-sync.zh-CN.md +4 -3
  256. package/templates/.agents/rules/local-artifact-repair.en.md +46 -39
  257. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +43 -36
  258. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  259. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  260. package/templates/.agents/scripts/package.json +3 -0
  261. package/templates/.agents/skills/analyze-task/SKILL.en.md +6 -6
  262. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +6 -6
  263. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -1
  264. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -1
  265. package/templates/.agents/skills/block-task/SKILL.en.md +2 -2
  266. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +2 -2
  267. package/templates/.agents/skills/block-task/config/verify.json +1 -1
  268. package/templates/.agents/skills/cancel-task/SKILL.en.md +3 -3
  269. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +3 -3
  270. package/templates/.agents/skills/cancel-task/config/verify.json +1 -1
  271. package/templates/.agents/skills/code-task/SKILL.en.md +7 -7
  272. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +7 -7
  273. package/templates/.agents/skills/code-task/config/verify.en.json +1 -1
  274. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +1 -1
  275. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
  276. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
  277. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +33 -21
  278. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +33 -21
  279. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  280. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  281. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  282. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  283. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  284. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  285. package/templates/.agents/skills/complete-task/SKILL.en.md +3 -3
  286. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +3 -3
  287. package/templates/.agents/skills/complete-task/config/verify.en.json +2 -2
  288. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +2 -2
  289. package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +1 -1
  290. package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +1 -1
  291. package/templates/.agents/skills/create-pr/SKILL.en.md +2 -2
  292. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +2 -2
  293. package/templates/.agents/skills/create-pr/config/verify.json +1 -1
  294. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +2 -2
  295. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +2 -2
  296. package/templates/.agents/skills/create-task/SKILL.en.md +5 -5
  297. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +5 -5
  298. package/templates/.agents/skills/create-task/config/verify.json +1 -1
  299. package/templates/.agents/skills/import-issue/SKILL.en.md +8 -8
  300. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +8 -8
  301. package/templates/.agents/skills/import-issue/config/verify.json +2 -2
  302. package/templates/.agents/skills/plan-task/SKILL.en.md +4 -4
  303. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +4 -4
  304. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -1
  305. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -1
  306. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  307. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  308. package/templates/.agents/skills/restore-task/SKILL.en.md +2 -2
  309. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +2 -2
  310. package/templates/.agents/skills/restore-task/config/verify.json +1 -1
  311. package/templates/.agents/skills/review-analysis/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -1
  314. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -1
  315. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +7 -7
  316. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +6 -6
  317. package/templates/.agents/skills/review-code/SKILL.en.md +2 -2
  318. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +2 -2
  319. package/templates/.agents/skills/review-code/config/verify.en.json +1 -1
  320. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -1
  321. package/templates/.agents/skills/review-code/reference/report-template.en.md +12 -12
  322. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -12
  323. package/templates/.agents/skills/review-plan/SKILL.en.md +2 -2
  324. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +2 -2
  325. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -1
  326. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -1
  327. package/templates/.agents/skills/review-plan/reference/report-template.en.md +7 -7
  328. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +7 -7
  329. package/templates/.agents/skills/review-pr/config/verify.en.json +1 -1
  330. package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +1 -1
  331. package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +3 -3
  332. package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +3 -3
  333. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +20 -3
  334. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +20 -3
  335. package/templates/.agents/skills/run-manual-validation/config/verify.en.json +1 -1
  336. package/templates/.agents/skills/run-manual-validation/config/verify.zh-CN.json +1 -1
  337. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  338. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  339. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +2 -0
  340. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +2 -0
  341. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  342. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  343. package/templates/.agents/skills/test/SKILL.en.md +17 -6
  344. package/templates/.agents/skills/test/SKILL.zh-CN.md +17 -6
  345. package/templates/.agents/templates/task.en.md +1 -1
  346. package/templates/.agents/templates/task.zh-CN.md +1 -1
  347. package/templates/.claude/commands/import-issue.en.md +1 -1
  348. package/templates/.claude/commands/import-issue.zh-CN.md +1 -1
  349. package/templates/.claude/commands/restore-task.en.md +1 -1
  350. package/templates/.claude/commands/restore-task.zh-CN.md +1 -1
  351. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  352. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  353. package/dist/lib/platform/adapters.js +0 -56
  354. package/lib/platform/adapters.ts +0 -197
@@ -1,5 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { parseArtifactName } from './artifact-name.js';
3
4
  import { invalidationBlocks, isArtifactInvalidated, parseInvalidationDocument } from './invalidation.js';
4
5
  import { receiptForOutput } from './artifact-receipts.js';
5
6
  import { parseTypedTaskFrontmatter } from './frontmatter.js';
@@ -108,12 +109,9 @@ function canStart(action, facts, trigger) {
108
109
  }
109
110
  return deny('CAPABILITY_ACTION_UNKNOWN');
110
111
  }
111
- function artifactRound(name) {
112
- const match = /-r(\d+)\.md$/.exec(name);
113
- return match ? Number(match[1]) : 1;
114
- }
115
112
  function latestArtifact(names) {
116
- return [...names].sort((left, right) => artifactRound(right) - artifactRound(left) || left.localeCompare(right))[0] ?? null;
113
+ return names.map(parseArtifactName).filter((identity) => identity !== null)
114
+ .sort((left, right) => right.round - left.round || left.name.localeCompare(right.name))[0]?.name ?? null;
117
115
  }
118
116
  function reviewedInputName(content, expectedFamily) {
119
117
  const header = content.split(/\r?\n/).findIndex((line) => /\*\*(?:审查输入|Review Input)\*\*[::]/.test(line));
@@ -208,16 +206,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
208
206
  const stat = fs.lstatSync(path.join(taskDir, name));
209
207
  return stat.isFile() && !stat.isSymbolicLink();
210
208
  });
211
- const artifactFamilies = {
212
- analysis: /^analysis(?:-r\d+)?\.md$/,
213
- 'review-analysis': /^review-analysis(?:-r\d+)?\.md$/,
214
- plan: /^plan(?:-r\d+)?\.md$/,
215
- 'review-plan': /^review-plan(?:-r\d+)?\.md$/,
216
- code: /^code(?:-r\d+)?\.md$/,
217
- 'review-code': /^review-code(?:-r\d+)?\.md$/
209
+ const artifactFamilies = ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code'];
210
+ const familyFor = (name) => {
211
+ const family = parseArtifactName(name)?.family;
212
+ return artifactFamilies.find((candidate) => candidate === family) ?? null;
218
213
  };
219
- const familyFor = (name) => Object.keys(artifactFamilies)
220
- .find((family) => artifactFamilies[family].test(name)) ?? null;
221
214
  const activeFiles = files.filter((name) => {
222
215
  const family = familyFor(name);
223
216
  return !family || !isArtifactInvalidated(invalidation.document, family, name);
@@ -225,11 +218,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
225
218
  const artifactHashes = {};
226
219
  for (const name of activeFiles)
227
220
  artifactHashes[name] = sha256File(path.join(taskDir, name));
228
- const artifacts = Object.fromEntries(Object.keys(artifactFamilies).map((family) => [
229
- family, activeFiles.filter((name) => artifactFamilies[family].test(name))
221
+ const artifacts = Object.fromEntries(artifactFamilies.map((family) => [
222
+ family, activeFiles.filter((name) => familyFor(name) === family)
230
223
  ]));
231
- const staleArtifacts = Object.fromEntries(Object.keys(artifactFamilies).map((family) => [
232
- family, files.filter((name) => artifactFamilies[family].test(name) && isArtifactInvalidated(invalidation.document, family, name))
224
+ const staleArtifacts = Object.fromEntries(artifactFamilies.map((family) => [
225
+ family, files.filter((name) => familyFor(name) === family && isArtifactInvalidated(invalidation.document, family, name))
233
226
  ]));
234
227
  const qualification = parseTaskQualification(content);
235
228
  if (!qualification.ok)
@@ -237,7 +230,7 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
237
230
  const qualificationStaleArtifacts = [];
238
231
  if (qualification.qualification.present) {
239
232
  const constraints = new Map(qualification.qualification.constraints.map((row) => [row.constraintId, row.digest]));
240
- for (const family of Object.keys(artifactFamilies)) {
233
+ for (const family of artifactFamilies) {
241
234
  if (!ARTIFACT_AUDIT_FAMILIES.has(family))
242
235
  continue;
243
236
  const name = latestArtifact(artifacts[family] ?? []);
@@ -5,7 +5,12 @@ import { computeLifecycleBuildIdentity, verifyLifecycleBuildIdentity } from '../
5
5
  import { verifyCodexSandboxControllerContextWithWarnings as verifySandboxControllerWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
6
6
  import { verifyCodexSandboxControllerContextWithWarnings as verifyControllerContextFileWithWarnings } from '../agent-clients/adapters/codex-lifecycle/controller-context.js';
7
7
  import { resolveTaskRef } from './resolve-ref.js';
8
- import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
8
+ import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, routeOrchestration, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
9
+ import { randomUUID, createHash } from 'node:crypto';
10
+ import { consumeLifecycleRecoveryAttestation, issueLifecycleRecoveryAttestation, validateLifecycleRecoveryAttestation } from './control-authority.js';
11
+ function buildIdentityDigest(value) {
12
+ return createHash('sha256').update(JSON.stringify(value), 'utf8').digest('hex');
13
+ }
9
14
  function coreOptions(options) {
10
15
  return { ...options.orchestrationOptions, repoRoot: options.repoRoot ?? options.orchestrationOptions?.repoRoot };
11
16
  }
@@ -73,8 +78,9 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
73
78
  if (!resolved.ok)
74
79
  return bridgeFailure(resolved.code, resolved.message);
75
80
  const preflight = await (options.preflight ?? preflightCodexLifecycleEvidence)(repoRoot);
76
- if (!input.capabilityToken) {
77
- return bridgeFailure('ORCHESTRATION_CODEX_CAPABILITY_REQUIRED', 'Codex prepare requires a current-session capability token');
81
+ const capabilityRef = input.capabilityRef;
82
+ if (!capabilityRef) {
83
+ return bridgeFailure('ORCHESTRATION_CODEX_CAPABILITY_REQUIRED', 'Codex prepare requires a current-session capability reference');
78
84
  }
79
85
  const buildIdentity = options.buildIdentity ?? computeLifecycleBuildIdentity(repoRoot);
80
86
  const brokerController = options.controllerBinding ?? brokerControllerBinding();
@@ -99,7 +105,7 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
99
105
  controlGeneration: localController.controlGeneration
100
106
  } : null);
101
107
  const capabilityStore = options.capabilityStore ?? createCodexCapabilityStore();
102
- const attested = capabilityStore.inspect(input.capabilityToken);
108
+ const attested = capabilityStore.inspectReference(capabilityRef);
103
109
  const capabilityIdentity = verifyLifecycleBuildIdentity(attested.buildIdentity, buildIdentity);
104
110
  if (!capabilityIdentity.ok) {
105
111
  return bridgeFailure(capabilityIdentity.code, capabilityIdentity.message);
@@ -124,14 +130,57 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
124
130
  controlGeneration: controller.controlGeneration
125
131
  } } : {})
126
132
  };
133
+ if (input.lifecycleRecoveryAttestation) {
134
+ try {
135
+ validateLifecycleRecoveryAttestation(input.lifecycleRecoveryAttestation);
136
+ }
137
+ catch (error) {
138
+ return bridgeFailure('LIFECYCLE_AUTHORITY_ATTESTATION_INVALID', error instanceof Error ? error.message : String(error));
139
+ }
140
+ }
141
+ let lifecycleRecoveryAttestation = input.lifecycleRecoveryAttestation ?? null;
142
+ const routed = input.capabilityRef && !lifecycleRecoveryAttestation
143
+ ? routeOrchestration(taskRef, coreOptions(options))
144
+ : null;
145
+ if (routed && !routed.next)
146
+ return routed;
147
+ if (routed?.next && ['analysis', 'plan', 'code'].includes(routed.next.stage)) {
148
+ const recoveryRequest = {
149
+ version: 1,
150
+ requestId: randomUUID(),
151
+ operationId: randomUUID(),
152
+ phase: 'orchestration.prepare',
153
+ taskId: resolved.taskId,
154
+ family: routed.next.stage === 'analysis' ? 'analysis'
155
+ : routed.next.stage === 'plan' ? 'plan' : 'code',
156
+ artifact: routed.next.artifact,
157
+ round: routed.next.round,
158
+ lifecycleRequestId: randomUUID(),
159
+ authorityRef: capabilityRef,
160
+ expectedControlGeneration: controller?.controlGeneration ?? '',
161
+ expectedControllerInstanceDigest: controller?.instanceDigest ?? '0'.repeat(64),
162
+ expectedBuildIdentityDigest: buildIdentityDigest(buildIdentity),
163
+ expectedHookDefinitionHash: preflight.hookDefinitionHash
164
+ };
165
+ const authority = issueLifecycleRecoveryAttestation(recoveryRequest, {
166
+ capabilityStore,
167
+ ...(controller ? { controllerBinding: controller } : {}),
168
+ buildIdentity
169
+ });
170
+ if (authority.status === 'rejected' || !authority.attestation) {
171
+ return bridgeFailure(authority.error?.code ?? 'LIFECYCLE_AUTHORITY_REJECTED', authority.error?.message ?? 'lifecycle authority was rejected');
172
+ }
173
+ lifecycleRecoveryAttestation = authority.attestation;
174
+ }
127
175
  const prepared = prepareOrchestrationDelegation(taskRef, {
128
176
  ...input,
129
- lifecycleProvenance
177
+ lifecycleProvenance,
178
+ lifecycleRecoveryAttestation
130
179
  }, {
131
180
  ...coreOptions(options),
132
181
  validateLifecycleCapability: () => {
133
182
  try {
134
- const validated = capabilityStore.validate(input.capabilityToken, capabilityExpected);
183
+ const validated = capabilityStore.validateReference(capabilityRef, capabilityExpected);
135
184
  if (validated.sessionId !== attested.sessionId
136
185
  || validated.turnId !== attested.turnId
137
186
  || validated.toolUseId !== attested.toolUseId) {
@@ -146,24 +195,16 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
146
195
  return capabilityFailure(error);
147
196
  }
148
197
  },
149
- consumeLifecycleCapability: () => {
150
- try {
151
- const consumed = capabilityStore.consume(input.capabilityToken, capabilityExpected);
152
- if (consumed.sessionId !== attested.sessionId
153
- || consumed.turnId !== attested.turnId
154
- || consumed.toolUseId !== attested.toolUseId) {
155
- return {
156
- code: 'CODEX_CAPABILITY_IDENTITY_CHANGED',
157
- message: 'capability identity changed during consumption'
158
- };
159
- }
160
- return null;
161
- }
162
- catch (error) {
163
- return capabilityFailure(error);
164
- }
165
- }
198
+ consumeLifecycleCapability: () => null
166
199
  });
200
+ if (lifecycleRecoveryAttestation && !options.deferLifecycleRecoveryConsumption && prepared.status !== 'failed') {
201
+ try {
202
+ consumeLifecycleRecoveryAttestation(lifecycleRecoveryAttestation);
203
+ }
204
+ catch (error) {
205
+ return bridgeFailure(error instanceof Error ? error.name : 'LIFECYCLE_AUTHORITY_CONSUME_FAILED', error instanceof Error ? error.message : String(error));
206
+ }
207
+ }
167
208
  return identityWarnings.length > 0 && prepared.status !== 'failed'
168
209
  ? { ...prepared, warnings: Object.freeze(identityWarnings) }
169
210
  : prepared;
@@ -211,7 +252,12 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
211
252
  const contextVerification = contextPath
212
253
  ? verifySandboxControllerWithWarnings(contextPath, { repoRoot })
213
254
  : null;
214
- const controller = contextVerification?.context ?? null;
255
+ const controller = options.controllerBinding
256
+ ?? brokerControllerBinding()
257
+ ?? (contextVerification?.context ? {
258
+ instanceDigest: contextVerification.context.controllerInstanceDigest,
259
+ controlGeneration: contextVerification.context.controlGeneration
260
+ } : null);
215
261
  const activated = activateMatchingOrchestrationDelegation('codex', {
216
262
  nativeAgent: evidence.nativeAgent,
217
263
  childId: evidence.childThreadId,
@@ -233,7 +279,7 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
233
279
  capabilityTurnId: evidence.parentTurnId,
234
280
  spawnToolUseId: evidence.spawnToolUseId,
235
281
  spawnObservedAt: record.spawnObservedAt ?? undefined,
236
- controllerInstanceDigest: controller?.controllerInstanceDigest ?? null,
282
+ controllerInstanceDigest: controller?.instanceDigest ?? null,
237
283
  controlGeneration: controller?.controlGeneration ?? null
238
284
  }
239
285
  }, coreOptions(options));
@@ -0,0 +1,28 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ function gitText(repoRoot, args) {
3
+ return execFileSync('git', [...args], {
4
+ cwd: repoRoot,
5
+ encoding: 'utf8',
6
+ stdio: ['ignore', 'pipe', 'pipe']
7
+ }).trim();
8
+ }
9
+ function checkpointCommitMatches(repoRoot, intent, head) {
10
+ try {
11
+ const parent = gitText(repoRoot, ['rev-parse', `${head}^`]);
12
+ const tree = gitText(repoRoot, ['rev-parse', `${head}^{tree}`]);
13
+ const message = gitText(repoRoot, ['show', '-s', '--format=%s', head]);
14
+ const changed = gitText(repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head])
15
+ .split('\n')
16
+ .filter(Boolean)
17
+ .sort();
18
+ return parent === intent.expectedHead
19
+ && tree === intent.expectedTree
20
+ && message === intent.message
21
+ && JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ export { checkpointCommitMatches };
28
+ //# sourceMappingURL=commit-identity.js.map
@@ -2,6 +2,7 @@ import fs from 'node:fs';
2
2
  import { execFileSync } from 'node:child_process';
3
3
  import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/workflow.js';
4
4
  import { parseTaskFrontmatter } from './frontmatter.js';
5
+ import { checkpointCommitMatches } from './commit-identity.js';
5
6
  import { resolveTaskContext, resolveTaskRef } from './resolve-ref.js';
6
7
  import { commitPushDecision } from './commit-policy.js';
7
8
  import { mergeOperationWarnings } from './operation-outcome.js';
@@ -163,21 +164,6 @@ function syncTaskCommit(input, task, committedHead) {
163
164
  return warning('TASK_STATUS_SYNC_FAILED', error instanceof Error ? error.message : String(error), true, 'task', task.taskId, 'ACTION_REQUIRED');
164
165
  }
165
166
  }
166
- function checkpointChildMatches(task, intent, head) {
167
- try {
168
- const parent = gitText(task.repoRoot, ['rev-parse', `${head}^`]);
169
- const tree = gitText(task.repoRoot, ['rev-parse', `${head}^{tree}`]);
170
- const message = gitText(task.repoRoot, ['show', '-s', '--format=%s', head]);
171
- const changed = gitText(task.repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head]).split('\n').filter(Boolean).sort();
172
- return parent === intent.expectedHead
173
- && tree === intent.expectedTree
174
- && message === intent.message
175
- && JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
176
- }
177
- catch {
178
- return false;
179
- }
180
- }
181
167
  function checkpointIdentity(input, task, delivery) {
182
168
  if (delivery.mode !== 'local')
183
169
  throw new Error('checkpoint identity requires local delivery');
@@ -195,6 +181,16 @@ function checkpointIdentity(input, task, delivery) {
195
181
  function checkpointTimestamp() {
196
182
  return new Date().toISOString();
197
183
  }
184
+ function samePreparedCheckpointIdentity(pending, identity) {
185
+ return pending.state === 'prepared'
186
+ && pending.taskId === identity.taskId
187
+ && pending.branch === identity.branch
188
+ && pending.mode === identity.mode
189
+ && pending.expectedHead === identity.expectedHead
190
+ && pending.message === identity.message
191
+ && pending.round === identity.round
192
+ && JSON.stringify(pending.paths) === JSON.stringify(identity.paths);
193
+ }
198
194
  function executeUnlocked(input, task, mode) {
199
195
  const inspected = inspectGitWorkflow(input.cwd);
200
196
  if (!inspected.snapshot)
@@ -228,11 +224,28 @@ function executeUnlocked(input, task, mode) {
228
224
  error: { code: 'COMMIT_INTENT_INVALID', message: error instanceof Error ? error.message : String(error) }
229
225
  };
230
226
  }
231
- if (pendingIntent && !sameCheckpointIntent(pendingIntent, identity))
232
- return {
233
- status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
234
- error: { code: 'COMMIT_INTENT_CONFLICT', message: 'A different checkpoint intent is still pending for this task' }
227
+ if (pendingIntent && !sameCheckpointIntent(pendingIntent, identity)) {
228
+ if (!input.recoverPreparedIntent || !samePreparedCheckpointIdentity(pendingIntent, identity))
229
+ return {
230
+ status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
231
+ error: { code: 'COMMIT_INTENT_CONFLICT', message: 'A different checkpoint intent is still pending for this task' }
232
+ };
233
+ pendingIntent = {
234
+ ...pendingIntent,
235
+ expectedTree: identity.expectedTree,
236
+ digest: checkpointIntentDigest(identity),
237
+ updatedAt: checkpointTimestamp()
235
238
  };
239
+ try {
240
+ writeCheckpointIntent(task.repoRoot, pendingIntent);
241
+ }
242
+ catch (error) {
243
+ return {
244
+ status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
245
+ error: { code: 'COMMIT_INTENT_WRITE_FAILED', message: error instanceof Error ? error.message : String(error) }
246
+ };
247
+ }
248
+ }
236
249
  if (!pendingIntent) {
237
250
  const timestamp = checkpointTimestamp();
238
251
  pendingIntent = {
@@ -256,7 +269,7 @@ function executeUnlocked(input, task, mode) {
256
269
  operations: [{ name: 'commit', status: 'no-op' }], error: null
257
270
  };
258
271
  }
259
- if (inspected.snapshot.head !== identity.expectedHead && !checkpointChildMatches(task, pendingIntent, inspected.snapshot.head))
272
+ if (inspected.snapshot.head !== identity.expectedHead && !checkpointCommitMatches(task.repoRoot, pendingIntent, inspected.snapshot.head))
260
273
  return {
261
274
  status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
262
275
  error: { code: 'COMMIT_INTENT_HEAD_CONFLICT', message: 'Current HEAD does not match the pending checkpoint intent' }