@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
@@ -3,11 +3,14 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import { getProcessStartTime } from '../../server/process-state.js';
6
- import { createTask } from '../../task/create-service.js';
6
+ import { createTask, projectTaskCreateResult, taskCreateExitCode, taskCreateFailure } from '../../task/create-service.js';
7
7
  import { applyTaskFinalization } from '../../task/finalization.js';
8
8
  import { bindSandboxControlTask, validateSandboxControlRequest } from './protocol.js';
9
9
  import { atomicWriteJson, executionPath, readActiveLease, terminateSandboxControlExecution } from './state.js';
10
- import { createSandboxExecutorExecutionContext, dispatchTaskControlOperation, parseTaskControlOperation } from '../../task/control-authority.js';
10
+ import { requestAuditFields, resultAuditFields, appendDiagnosticAudit, createSandboxControlAuditContext, appendCriticalAudit, writeSandboxControlTransition } from './audit.js';
11
+ import { validateSandboxControlIdentity } from './identity-sentinel.js';
12
+ import { createSandboxExecutorExecutionContext, dispatchTaskControlOperation, parseTaskControlOperation, validateLifecycleRecoveryAttestation } from '../../task/control-authority.js';
13
+ import { executeTaskWorkflow } from './workflow-executor.js';
11
14
  import { assertSandboxControlBrokerOwner, readSandboxControlManifest } from './lifecycle.js';
12
15
  import { computeLifecycleBuildIdentity } from '../../agent-clients/adapters/codex-lifecycle/build-identity.js';
13
16
  import { closeCodexControllerRegistration, CodexControllerRegistrationError, openCodexControllerRegistration, resolveCodexControllerBinding } from './controller-registration.js';
@@ -30,6 +33,22 @@ export function assertSandboxControlExecutorAuthority(manifest, gateOwner) {
30
33
  function safeEnv(env) {
31
34
  return Object.fromEntries(Object.entries(env).filter(([key]) => !key.toUpperCase().startsWith('AGENT_INFRA_CONTROL_')));
32
35
  }
36
+ function safeRealpath(value) {
37
+ try {
38
+ return fs.realpathSync.native(value);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ function appendExecutorAudit(manifest, event, fields = {}) {
45
+ try {
46
+ appendDiagnosticAudit(manifest, event, { source: 'executor', ...fields });
47
+ }
48
+ catch {
49
+ // Diagnostics must never change the control protocol.
50
+ }
51
+ }
33
52
  export function nodeEntryArgs(entry, args) {
34
53
  return path.extname(entry) === '.ts'
35
54
  ? ['--experimental-strip-types', '--no-warnings', entry, ...args]
@@ -99,7 +118,16 @@ export async function prepareSandboxControlExecution(params) {
99
118
  atomicWriteJson(executionPath(params.manifest, params.request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
100
119
  if (!canWrite())
101
120
  throw new Error('SANDBOX_CONTROL_OWNER_LOST');
102
- child.send({ version: 1, nonce, owner: gateOwner });
121
+ const authority = params.lifecycleAuthority?.attestation ?? null;
122
+ child.send({
123
+ version: 2,
124
+ nonce,
125
+ owner: gateOwner,
126
+ requestId: params.request.id,
127
+ operationId: authority?.operationId ?? params.request.id,
128
+ phase: authority?.phase ?? (params.request.family === 'task-workflow' ? 'artifact.finalize-local' : 'orchestration.prepare'),
129
+ authority
130
+ });
103
131
  },
104
132
  completion,
105
133
  terminate(updateState = true) {
@@ -125,7 +153,8 @@ function waitForGate(nonce, timeoutMs = 2_000) {
125
153
  process.off('disconnect', onDisconnect);
126
154
  const value = message;
127
155
  const owner = value?.owner;
128
- if (!value || value.version !== 1 || value.nonce !== nonce
156
+ if (!value || Object.keys(value).sort().join(',') !== 'authority,nonce,operationId,owner,phase,requestId,version'
157
+ || value.version !== 2 || value.nonce !== nonce
129
158
  || !owner || owner.version !== 3 || !Number.isSafeInteger(owner.pid) || (owner.pid ?? 0) <= 0
130
159
  || typeof owner.startTime !== 'number' || !Number.isSafeInteger(owner.startTime)
131
160
  || typeof owner.brokerId !== 'string' || owner.brokerId.length === 0
@@ -133,7 +162,27 @@ function waitForGate(nonce, timeoutMs = 2_000) {
133
162
  reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
134
163
  return;
135
164
  }
136
- resolve(owner);
165
+ if (typeof value.requestId !== 'string' || typeof value.operationId !== 'string'
166
+ || !['orchestration.prepare', 'artifact.finalize-local', 'task-event.completed'].includes(value.phase)
167
+ || (value.authority !== null && value.authority !== undefined && (() => {
168
+ try {
169
+ validateLifecycleRecoveryAttestation(value.authority);
170
+ return false;
171
+ }
172
+ catch {
173
+ return true;
174
+ }
175
+ })())) {
176
+ reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
177
+ return;
178
+ }
179
+ resolve({
180
+ owner: owner,
181
+ authority: value.authority === null || value.authority === undefined ? null : value.authority,
182
+ requestId: value.requestId,
183
+ operationId: value.operationId,
184
+ phase: value.phase
185
+ });
137
186
  });
138
187
  });
139
188
  }
@@ -174,6 +223,20 @@ function lifecycleFailure(code, message) {
174
223
  stderr: ''
175
224
  };
176
225
  }
226
+ function taskCreateExecutionResult(result) {
227
+ return {
228
+ exitCode: taskCreateExitCode(result),
229
+ stdout: `${JSON.stringify(result)}\n`,
230
+ stderr: ''
231
+ };
232
+ }
233
+ function taskCreateExecutionFailure(requestId, code, message) {
234
+ return taskCreateExecutionResult(taskCreateFailure({ code, message, retryable: false }, {
235
+ requestId,
236
+ accepted: true,
237
+ recovery: 'inspect-domain-state'
238
+ }));
239
+ }
177
240
  function finalizationResult(result) {
178
241
  const payload = {
179
242
  version: 1,
@@ -189,14 +252,21 @@ function finalizationResult(result) {
189
252
  stderr: ''
190
253
  };
191
254
  }
192
- export async function executeRequest(manifest, manifestPath, request, options = {}) {
255
+ async function executeRequestInner(manifest, manifestPath, request, options = {}) {
193
256
  if (request.family === 'task-create') {
194
- const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
195
- return {
196
- exitCode: result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0,
197
- stdout: `${JSON.stringify(result)}\n`,
198
- stderr: ''
199
- };
257
+ try {
258
+ const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
259
+ return taskCreateExecutionResult(projectTaskCreateResult(result, {
260
+ requestId: request.id,
261
+ accepted: true,
262
+ recovery: 'none'
263
+ }));
264
+ }
265
+ catch (error) {
266
+ const detail = error instanceof Error ? error.message : String(error);
267
+ const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'TASK_CREATE_EXECUTION_FAILED';
268
+ return taskCreateExecutionFailure(request.id, code, detail);
269
+ }
200
270
  }
201
271
  if (request.family === 'codex-controller') {
202
272
  try {
@@ -239,9 +309,21 @@ export async function executeRequest(manifest, manifestPath, request, options =
239
309
  return { exitCode: 0, stdout: `${JSON.stringify(result)}\n`, stderr: '' };
240
310
  }
241
311
  catch (error) {
312
+ const errorCode = error instanceof CodexControllerRegistrationError
313
+ ? error.code
314
+ : /^([A-Z][A-Z0-9_]+)/u.exec(error instanceof Error ? error.message : String(error))?.[1]
315
+ ?? 'CODEX_SANDBOX_CONTROLLER_FAILED';
316
+ appendExecutorAudit(manifest, 'controller-operation-failed', {
317
+ ...requestAuditFields(manifest, request),
318
+ controllerCommand: request.command,
319
+ errorCode,
320
+ errorType: error instanceof Error ? error.name : typeof error,
321
+ });
242
322
  return controllerFailure(error);
243
323
  }
244
324
  }
325
+ if (request.family === 'task-workflow')
326
+ return executeTaskWorkflow(manifest, request.workflow, options.lifecycleRecoveryAttestation ?? null);
245
327
  if (request.family === 'task-finalization') {
246
328
  const operation = parseTaskControlOperation('task-finalization', [manifest.taskId, 'complete', '--agent', request.agent]);
247
329
  if (operation.family !== 'task-finalization')
@@ -253,7 +335,8 @@ export async function executeRequest(manifest, manifestPath, request, options =
253
335
  taskId: manifest.taskId,
254
336
  generation: manifest.generation,
255
337
  manifestPath,
256
- requestId: request.id
338
+ requestId: request.id,
339
+ lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
257
340
  }), operation);
258
341
  return finalizationResult(await result);
259
342
  }
@@ -279,27 +362,44 @@ export async function executeRequest(manifest, manifestPath, request, options =
279
362
  && operation.input.client === 'codex';
280
363
  if (codexPrepare) {
281
364
  if (!request.controllerProof) {
282
- return orchestrationFailure('CODEX_SANDBOX_CONTROLLER_PROOF_REQUIRED', 'Codex prepare requires a current controller lease proof');
283
- }
284
- try {
285
- controllerBinding = (options.resolveControllerBinding ?? resolveCodexControllerBinding)({
286
- manifest,
287
- manifestPath,
288
- proof: request.controllerProof,
289
- buildIdentity: (options.buildIdentity ?? computeLifecycleBuildIdentity)(manifest.repoRoot)
290
- });
365
+ const authority = options.lifecycleRecoveryAttestation;
366
+ if (!authority || authority.phase !== 'orchestration.prepare') {
367
+ return orchestrationFailure('CODEX_SANDBOX_CONTROLLER_PROOF_REQUIRED', 'Codex prepare requires a current controller lease proof');
368
+ }
369
+ controllerBinding = {
370
+ instanceDigest: authority.controllerInstanceDigest,
371
+ controlGeneration: authority.controlGeneration
372
+ };
291
373
  }
292
- catch (error) {
293
- const code = error instanceof CodexControllerRegistrationError
294
- ? error.code
295
- : 'CODEX_SANDBOX_CONTROLLER_PROOF_INVALID';
296
- return orchestrationFailure(code, `${code}: Codex controller proof was rejected`);
374
+ else {
375
+ try {
376
+ controllerBinding = (options.resolveControllerBinding ?? resolveCodexControllerBinding)({
377
+ manifest,
378
+ manifestPath,
379
+ proof: request.controllerProof,
380
+ buildIdentity: (options.buildIdentity ?? computeLifecycleBuildIdentity)(manifest.repoRoot)
381
+ });
382
+ }
383
+ catch (error) {
384
+ const code = error instanceof CodexControllerRegistrationError
385
+ ? error.code
386
+ : 'CODEX_SANDBOX_CONTROLLER_PROOF_INVALID';
387
+ return orchestrationFailure(code, `${code}: Codex controller proof was rejected`);
388
+ }
297
389
  }
298
390
  }
299
391
  else if (request.controllerProof !== null) {
300
392
  return orchestrationFailure('CODEX_SANDBOX_CONTROLLER_PROOF_INVALID', 'Controller proof is only accepted for canonical Codex prepare');
301
393
  }
302
394
  }
395
+ const diagnosticLog = (event, fields) => {
396
+ appendExecutorAudit(manifest, event.startsWith('orchestration-') ? event : `orchestration-${event}`, {
397
+ requestId: request.id,
398
+ requestFamily: request.family,
399
+ sandboxTaskId: manifest.taskId,
400
+ ...fields
401
+ });
402
+ };
303
403
  const context = createSandboxExecutorExecutionContext({
304
404
  repoRoot: manifest.repoRoot,
305
405
  worktreeRoot: manifest.worktreeRoot,
@@ -308,7 +408,9 @@ export async function executeRequest(manifest, manifestPath, request, options =
308
408
  generation: manifest.generation,
309
409
  manifestPath,
310
410
  requestId: request.id,
311
- ...(controllerBinding ? { controllerBinding } : {})
411
+ diagnosticLog,
412
+ ...(controllerBinding ? { controllerBinding } : {}),
413
+ lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
312
414
  });
313
415
  const format = (value) => {
314
416
  const result = value;
@@ -327,30 +429,119 @@ export async function executeRequest(manifest, manifestPath, request, options =
327
429
  throw new Error('SANDBOX_CONTROL_LIFECYCLE_OPERATION_INVALID');
328
430
  return format(await dispatchTaskControlOperation(context, operation));
329
431
  }
432
+ export async function executeRequest(manifest, manifestPath, request, options = {}) {
433
+ const fields = requestAuditFields(manifest, request);
434
+ appendExecutorAudit(manifest, 'executor-request-start', fields);
435
+ try {
436
+ const result = await executeRequestInner(manifest, manifestPath, request, options);
437
+ appendExecutorAudit(manifest, 'executor-request-finished', {
438
+ requestId: request.id,
439
+ requestFamily: request.family,
440
+ sandboxTaskId: manifest.taskId,
441
+ ...resultAuditFields(result)
442
+ });
443
+ return result;
444
+ }
445
+ catch (error) {
446
+ appendExecutorAudit(manifest, 'executor-request-failed', {
447
+ requestId: request.id,
448
+ requestFamily: request.family,
449
+ sandboxTaskId: manifest.taskId,
450
+ errorType: error instanceof Error ? error.name : typeof error,
451
+ });
452
+ throw error;
453
+ }
454
+ }
330
455
  export async function runSandboxControlExecutor(requestPath, nonce) {
331
- const gateOwner = await waitForGate(nonce);
456
+ const gate = await waitForGate(nonce);
457
+ const gateOwner = gate.owner;
332
458
  process.disconnect?.();
333
459
  const manifestPath = process.env.AGENT_INFRA_EXECUTOR_MANIFEST;
334
460
  if (!manifestPath)
335
461
  throw new Error('SANDBOX_CONTROL_EXECUTOR_MANIFEST_MISSING');
336
462
  const manifest = readSandboxControlManifest(manifestPath);
463
+ const identity = validateSandboxControlIdentity({
464
+ publicStatusDir: manifest.publicStatusDir,
465
+ root: path.dirname(path.resolve(manifestPath)),
466
+ mode: manifest.mode,
467
+ taskId: manifest.taskId,
468
+ generation: manifest.generation,
469
+ controlRootId: manifest.controlRootId
470
+ });
471
+ if (identity.state !== 'valid') {
472
+ throw new Error(`SANDBOX_CONTROL_IDENTITY_${identity.state.replaceAll('-', '_').toUpperCase()}`);
473
+ }
337
474
  const root = fs.realpathSync.native(process.cwd());
338
- if (fs.realpathSync.native(manifest.repoRoot) !== root)
475
+ const expectedRoot = safeRealpath(manifest.repoRoot);
476
+ if (expectedRoot !== root) {
477
+ appendExecutorAudit(manifest, 'executor-root-validation-failed', {
478
+ hostCwd: process.cwd(),
479
+ observedRoot: root,
480
+ expectedRoot
481
+ });
339
482
  throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
483
+ }
340
484
  const raw = JSON.parse(fs.readFileSync(requestPath, 'utf8'));
341
485
  const request = validateSandboxControlRequest(raw, manifest);
486
+ if (gate.requestId !== request.id)
487
+ throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_REQUEST_MISMATCH');
488
+ if (gate.authority !== null
489
+ && (gate.authority.requestId !== request.id
490
+ || gate.authority.operationId !== gate.operationId
491
+ || gate.authority.phase !== gate.phase)) {
492
+ throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_AUTHORITY_MISMATCH');
493
+ }
494
+ appendExecutorAudit(manifest, 'executor-request-validated', requestAuditFields(manifest, request));
342
495
  const requestDirectory = path.resolve(path.dirname(requestPath));
343
496
  const processingDirectory = path.resolve(path.join(manifest.processingDir, request.id));
344
497
  const channelRequestDirectory = path.resolve(path.join(manifest.channelDir, 'requests'));
345
498
  if (requestDirectory !== processingDirectory && requestDirectory !== channelRequestDirectory) {
499
+ appendExecutorAudit(manifest, 'executor-request-path-validation-failed', {
500
+ ...requestAuditFields(manifest, request),
501
+ requestPath,
502
+ requestDirectory,
503
+ processingDirectory,
504
+ channelRequestDirectory
505
+ });
346
506
  throw new Error('SANDBOX_CONTROL_EXECUTOR_REQUEST_INVALID');
347
507
  }
348
508
  let result;
349
509
  try {
350
510
  assertSandboxControlExecutorAuthority(manifest, gateOwner);
351
- result = await executeRequest(manifest, manifestPath, request);
511
+ const operation = request.family === 'task-lifecycle' || request.family === 'task-orchestration'
512
+ ? (() => {
513
+ try {
514
+ return parseTaskControlOperation(request.family, request.args);
515
+ }
516
+ catch {
517
+ return null;
518
+ }
519
+ })()
520
+ : null;
521
+ const context = createSandboxControlAuditContext(manifest, {
522
+ requestId: request.id,
523
+ family: request.family,
524
+ operation: operation?.family === 'task-orchestration'
525
+ ? operation.intent
526
+ : operation?.family === 'task-lifecycle'
527
+ ? operation.request.intent
528
+ : request.family === 'task-finalization' ? request.operation : null,
529
+ phase: 'started-committed',
530
+ outcome: 'in-progress'
531
+ });
532
+ appendCriticalAudit(manifest, context, { transition: 'started-committed' });
533
+ writeSandboxControlTransition(manifest, { requestId: request.id, phase: 'started-committed' });
534
+ const execution = readJsonExecution(executionPath(manifest, request.id));
535
+ atomicWriteJson(executionPath(manifest, request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
536
+ result = await executeRequest(manifest, manifestPath, request, {
537
+ lifecycleRecoveryAttestation: gate.authority
538
+ });
352
539
  }
353
540
  catch (error) {
541
+ appendExecutorAudit(manifest, 'executor-authority-or-dispatch-failed', {
542
+ ...requestAuditFields(manifest, request),
543
+ errorType: error instanceof Error ? error.name : typeof error,
544
+ });
354
545
  const detail = error instanceof Error ? error.message : String(error);
355
546
  const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'SANDBOX_CONTROL_EXECUTOR_FAILED';
356
547
  result = request.family === 'task-finalization'
@@ -362,14 +553,22 @@ export async function runSandboxControlExecutor(requestPath, nonce) {
362
553
  })}\n`,
363
554
  stderr: ''
364
555
  }
365
- : request.family === 'task-lifecycle'
366
- ? lifecycleFailure(code, detail)
367
- : orchestrationFailure(code, detail);
556
+ : request.family === 'task-create'
557
+ ? taskCreateExecutionFailure(request.id, code, detail)
558
+ : request.family === 'task-lifecycle'
559
+ ? lifecycleFailure(code, detail)
560
+ : orchestrationFailure(code, detail);
368
561
  }
369
562
  process.stdout.write(result.stdout);
370
563
  process.stderr.write(result.stderr);
371
564
  process.exitCode = result.exitCode;
372
565
  }
566
+ function readJsonExecution(filePath) {
567
+ const value = JSON.parse(fs.readFileSync(filePath, 'utf8'));
568
+ if (!value || value.requestId.length === 0)
569
+ throw new Error('SANDBOX_CONTROL_EXECUTION_INVALID');
570
+ return value;
571
+ }
373
572
  export function disconnectExecutor(child) {
374
573
  if (child.connected)
375
574
  child.disconnect();
@@ -0,0 +1,27 @@
1
+ export function finalizationTerminalResponse(taskId, requestId, receipt) {
2
+ const pendingSteps = [
3
+ receipt.taskComment === 'pending' ? 'task-comment' : null,
4
+ receipt.verification === 'pending' ? 'verification' : null
5
+ ].filter((step) => step !== null);
6
+ const completedSteps = ['lifecycle', receipt.taskComment === 'pending' ? null : 'task-comment', receipt.verification === 'pending' ? null : 'verification']
7
+ .filter((step) => step !== null);
8
+ const warnings = receipt.warnings
9
+ .filter((warning) => warning.status === 'open')
10
+ .map(({ status: _status, resolvedAt: _resolvedAt, ...warning }) => warning);
11
+ const result = {
12
+ status: 'completed', changed: false, taskId,
13
+ lifecycle: { status: 'no-op', changed: false, error: null },
14
+ taskComment: receipt.taskComment === 'pending' ? null : { status: 'no-op', changed: false, error: null },
15
+ verification: receipt.verification === 'pending' ? null : { status: 'no-op', changed: false, error: null },
16
+ completedSteps, pendingSteps,
17
+ result: pendingSteps.length > 0 || receipt.warningProjection === 'pending' || warnings.length > 0
18
+ ? 'completed_with_warnings' : 'completed',
19
+ warnings, error: null
20
+ };
21
+ return {
22
+ version: 2, id: requestId, phase: 'completed', exitCode: 0,
23
+ stdout: `${JSON.stringify({ version: 1, status: 'completed', changed: false, accepted: true, result, error: null })}\n`,
24
+ stderr: '', error: null
25
+ };
26
+ }
27
+ //# sourceMappingURL=finalization-response.js.map
@@ -0,0 +1,107 @@
1
+ import { createHash, randomBytes, randomUUID } from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { writeDurableFile } from '../../fs/durable-write.js';
5
+ export const SANDBOX_CONTROL_IDENTITY_FILE = 'identity.json';
6
+ function identityError(code) {
7
+ return new Error(`SANDBOX_CONTROL_IDENTITY_${code.replaceAll('-', '_').toUpperCase()}`);
8
+ }
9
+ function canonicalIdentity(value) {
10
+ return JSON.stringify({
11
+ version: value.version,
12
+ mode: value.mode,
13
+ taskId: value.taskId,
14
+ generation: value.generation,
15
+ controlRootId: value.controlRootId
16
+ });
17
+ }
18
+ export function identitySentinelPath(publicStatusDir) {
19
+ return path.join(publicStatusDir, SANDBOX_CONTROL_IDENTITY_FILE);
20
+ }
21
+ export function createSandboxControlRootId() {
22
+ return `${randomBytes(32).toString('hex')}${randomUUID().replaceAll('-', '')}`;
23
+ }
24
+ export function createSandboxControlIdentitySentinel(params) {
25
+ const sentinel = {
26
+ version: 1,
27
+ mode: params.mode,
28
+ taskId: params.mode === 'task-bound' ? params.taskId : null,
29
+ generation: params.generation,
30
+ controlRootId: params.controlRootId ?? createSandboxControlRootId()
31
+ };
32
+ parseSandboxControlIdentitySentinel(sentinel);
33
+ return sentinel;
34
+ }
35
+ export function identityDigest(value) {
36
+ const normalized = parseSandboxControlIdentitySentinel(value);
37
+ return createHash('sha256').update(canonicalIdentity(normalized), 'utf8').digest('hex');
38
+ }
39
+ export function parseSandboxControlIdentitySentinel(value) {
40
+ if (!value || typeof value !== 'object' || Array.isArray(value))
41
+ throw identityError('malformed');
42
+ const candidate = value;
43
+ if (Object.keys(candidate).sort().join(',') !== 'controlRootId,generation,mode,taskId,version'
44
+ || candidate.version !== 1
45
+ || (candidate.mode !== 'task-bound' && candidate.mode !== 'branch-only')
46
+ || (candidate.taskId !== null && typeof candidate.taskId !== 'string')
47
+ || (candidate.mode === 'task-bound' && !candidate.taskId)
48
+ || (candidate.mode === 'branch-only' && candidate.taskId !== null)
49
+ || typeof candidate.generation !== 'string' || candidate.generation.length === 0
50
+ || typeof candidate.controlRootId !== 'string' || !/^[a-f0-9]{64,128}$/u.test(candidate.controlRootId)) {
51
+ throw identityError('malformed');
52
+ }
53
+ return candidate;
54
+ }
55
+ export function writeSandboxControlIdentitySentinel(publicStatusDir, value) {
56
+ const sentinel = parseSandboxControlIdentitySentinel(value);
57
+ fs.mkdirSync(publicStatusDir, { recursive: true, mode: 0o700 });
58
+ const target = identitySentinelPath(publicStatusDir);
59
+ writeDurableFile(target, `${canonicalIdentity(sentinel)}\n`, { mode: 0o400, replace: true });
60
+ return sentinel;
61
+ }
62
+ export function readSandboxControlIdentitySentinel(publicStatusDir) {
63
+ const filePath = identitySentinelPath(publicStatusDir);
64
+ if (!fs.existsSync(filePath))
65
+ throw identityError('missing');
66
+ try {
67
+ const stat = fs.lstatSync(filePath);
68
+ if (!stat.isFile() || stat.isSymbolicLink())
69
+ throw identityError('malformed');
70
+ return parseSandboxControlIdentitySentinel(JSON.parse(fs.readFileSync(filePath, 'utf8')));
71
+ }
72
+ catch (error) {
73
+ if (error instanceof Error && error.message.startsWith('SANDBOX_CONTROL_IDENTITY_'))
74
+ throw error;
75
+ throw identityError('malformed');
76
+ }
77
+ }
78
+ export function validateSandboxControlIdentity(params) {
79
+ let sentinel;
80
+ try {
81
+ sentinel = readSandboxControlIdentitySentinel(params.publicStatusDir);
82
+ }
83
+ catch (error) {
84
+ const code = error instanceof Error ? error.message : '';
85
+ if (code.endsWith('MISSING'))
86
+ return { state: 'missing', sentinel: null };
87
+ return { state: 'malformed', sentinel: null };
88
+ }
89
+ if (sentinel.generation !== params.generation)
90
+ return { state: 'generation-mismatch', sentinel };
91
+ if (sentinel.controlRootId !== params.controlRootId)
92
+ return { state: 'root-id-mismatch', sentinel };
93
+ if (sentinel.mode !== params.mode || sentinel.taskId !== params.taskId)
94
+ return { state: 'topology-mismatch', sentinel };
95
+ if (params.manifestRoot && path.resolve(params.manifestRoot) !== path.resolve(params.root)) {
96
+ return { state: 'topology-mismatch', sentinel };
97
+ }
98
+ return { state: 'valid', sentinel };
99
+ }
100
+ export function assertSandboxControlIdentity(params) {
101
+ const result = validateSandboxControlIdentity(params);
102
+ if (result.state !== 'valid' || !result.sentinel) {
103
+ throw new Error(`SANDBOX_CONTROL_IDENTITY_${result.state.replaceAll('-', '_').toUpperCase()}`);
104
+ }
105
+ return result.sentinel;
106
+ }
107
+ //# sourceMappingURL=identity-sentinel.js.map