@straiffi/archon 1.8.14 → 1.8.16

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 (250) hide show
  1. package/dist/client/assets/ActivityView-p8gBUxYN.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-BRxGcSyq.js +1 -0
  3. package/dist/client/assets/VerificationDialog-B6l5TYOS.js +4 -0
  4. package/dist/client/assets/{arc-C83vRtlz.js → arc-D2Nn9xIj.js} +1 -1
  5. package/dist/client/assets/architecture-7EHR7CIX-C-4Cp4ml.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DFbki8mi.js → architectureDiagram-3BPJPVTR-DnuKO1RY.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-GPEHLZMM-BZFehG8P.js → blockDiagram-GPEHLZMM-CnQ7FwEp.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-AAUBKEIU-FVDXRu1t.js → c4Diagram-AAUBKEIU-BF1hFXwp.js} +1 -1
  9. package/dist/client/assets/channel-TJtf4cBJ.js +1 -0
  10. package/dist/client/assets/{chunk-2J33WTMH-4tuVZaT0.js → chunk-2J33WTMH-UvCFvkZO.js} +1 -1
  11. package/dist/client/assets/{chunk-3OPIFGDE-DSn14S35.js → chunk-3OPIFGDE-z1l5nBD0.js} +1 -1
  12. package/dist/client/assets/{chunk-4BX2VUAB-C5pU9ApX.js → chunk-4BX2VUAB-CtLS8D71.js} +1 -1
  13. package/dist/client/assets/{chunk-4EGX6M5U-CAjWPjND.js → chunk-4EGX6M5U-Btnm0QNe.js} +1 -1
  14. package/dist/client/assets/{chunk-55IACEB6-DhO4-AG4.js → chunk-55IACEB6-74CcJaub.js} +1 -1
  15. package/dist/client/assets/{chunk-5DO6E6H7-BDKA-zHS.js → chunk-5DO6E6H7-WLZ8L4ko.js} +1 -1
  16. package/dist/client/assets/{chunk-5ZQYHXKU-Cwx1KNjg.js → chunk-5ZQYHXKU-Bis0Pw2_.js} +1 -1
  17. package/dist/client/assets/{chunk-727SXJPM-Odza4hes.js → chunk-727SXJPM-B3gUO8rD.js} +1 -1
  18. package/dist/client/assets/{chunk-AQP2D5EJ-BmVoQT7M.js → chunk-AQP2D5EJ-hPBzrrh5.js} +1 -1
  19. package/dist/client/assets/{chunk-BR22UD5L-12D2GWh4.js → chunk-BR22UD5L-Cou5beGe.js} +1 -1
  20. package/dist/client/assets/{chunk-BSJP7CBP-DMi77e84.js → chunk-BSJP7CBP-DJ57XcV5.js} +1 -1
  21. package/dist/client/assets/{chunk-CSCIHK7Q-Bg7Ktx0B.js → chunk-CSCIHK7Q-BfOng_VY.js} +2 -2
  22. package/dist/client/assets/{chunk-FHYWG6QK-BhSajKiB.js → chunk-FHYWG6QK-Ba10e2kj.js} +1 -1
  23. package/dist/client/assets/{chunk-FMBD7UC4-Drmlc0wM.js → chunk-FMBD7UC4-CEo2wZMx.js} +1 -1
  24. package/dist/client/assets/{chunk-KSCS5N6A-2tnhar2x.js → chunk-KSCS5N6A-B2Jg7PW5.js} +1 -1
  25. package/dist/client/assets/{chunk-L5ZTLDWV-dAyg8qMJ.js → chunk-L5ZTLDWV-CUYujZxt.js} +1 -1
  26. package/dist/client/assets/{chunk-LZXEDZCA-0gElxrlR.js → chunk-LZXEDZCA-CH_eV8jH.js} +2 -2
  27. package/dist/client/assets/{chunk-MPE355IW-Cw8YmjTC.js → chunk-MPE355IW-MqEt-J8G.js} +1 -1
  28. package/dist/client/assets/{chunk-MZUSXYTE-jvxRCZ7x.js → chunk-MZUSXYTE-DdNi9lhx.js} +1 -1
  29. package/dist/client/assets/{chunk-N66VUXT2-00i4y0yD.js → chunk-N66VUXT2-CjemTW4E.js} +1 -1
  30. package/dist/client/assets/{chunk-ND2GUHAM-Bu-8Lz91.js → chunk-ND2GUHAM-BVF5evM9.js} +1 -1
  31. package/dist/client/assets/{chunk-NZK2D7GU-CInZFdzd.js → chunk-NZK2D7GU-WfG-2AOS.js} +1 -1
  32. package/dist/client/assets/{chunk-O5CBEL6O-rAzpvdNR.js → chunk-O5CBEL6O-CSF9ozqy.js} +1 -1
  33. package/dist/client/assets/{chunk-PUPMXCY4-DfWourL7.js → chunk-PUPMXCY4-ZvwTw0To.js} +1 -1
  34. package/dist/client/assets/chunk-QZHKN3VN-LI_RZca2.js +1 -0
  35. package/dist/client/assets/{chunk-UIBZB4QT-v-a5ZfN6.js → chunk-UIBZB4QT-BTY9be9s.js} +1 -1
  36. package/dist/client/assets/{chunk-WCWK7LTN-CtYzhvvb.js → chunk-WCWK7LTN-Db1n3n3-.js} +1 -1
  37. package/dist/client/assets/chunk-WU5MYG2G-DoVpb2oe.js +1 -0
  38. package/dist/client/assets/{chunk-XPW4576I-CvnAuXH2.js → chunk-XPW4576I-DObFPxjB.js} +1 -1
  39. package/dist/client/assets/classDiagram-4FO5ZUOK-CnKIRKWC.js +1 -0
  40. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-5ZgjUwTv.js +1 -0
  41. package/dist/client/assets/{cose-bilkent-S5V4N54A-fchD-dH2.js → cose-bilkent-S5V4N54A-MlOPiG6P.js} +1 -1
  42. package/dist/client/assets/{dagre-BM42HDAG-Dgua1iuh.js → dagre-BM42HDAG-rekDIYnC.js} +1 -1
  43. package/dist/client/assets/{dagre-DSrzm-Gq.js → dagre-BWNHuDdf.js} +1 -1
  44. package/dist/client/assets/{diagram-2AECGRRQ-odacwlwu.js → diagram-2AECGRRQ-Z4mXdhW0.js} +1 -1
  45. package/dist/client/assets/{diagram-5GNKFQAL-BiKjFmJ1.js → diagram-5GNKFQAL-DqeVe5Vc.js} +1 -1
  46. package/dist/client/assets/{diagram-KO2AKTUF-CmYcvFri.js → diagram-KO2AKTUF-ijppTuNc.js} +1 -1
  47. package/dist/client/assets/{diagram-LMA3HP47-ncx0RBuX.js → diagram-LMA3HP47-CDGLx0-N.js} +1 -1
  48. package/dist/client/assets/{diagram-OG6HWLK6-DbchKIzw.js → diagram-OG6HWLK6-DDlnjzF8.js} +1 -1
  49. package/dist/client/assets/{erDiagram-TEJ5UH35-CMnpvRyQ.js → erDiagram-TEJ5UH35-V_axe9oz.js} +1 -1
  50. package/dist/client/assets/eventmodeling-FCH6USID-Dqb6QKoI.js +1 -0
  51. package/dist/client/assets/{flowDiagram-I6XJVG4X-Bi02_PK5.js → flowDiagram-I6XJVG4X-GH5q79jg.js} +1 -1
  52. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BiS992US.js → ganttDiagram-6RSMTGT7-BMWVdLeQ.js} +1 -1
  53. package/dist/client/assets/gitGraph-WXDBUCRP-DYEsqh93.js +1 -0
  54. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-Cc1hrTsT.js → gitGraphDiagram-PVQCEYII-VrV8jMUg.js} +1 -1
  55. package/dist/client/assets/index-B7J4DYDu.js +275 -0
  56. package/dist/client/assets/index-CsZfTdMO.css +2 -0
  57. package/dist/client/assets/info-J43DQDTF-CfjXFZai.js +1 -0
  58. package/dist/client/assets/{infoDiagram-5YYISTIA-BKVfqJCe.js → infoDiagram-5YYISTIA-EGiVbp17.js} +1 -1
  59. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B-IbFOty.js → ishikawaDiagram-YF4QCWOH-Dw3CiXbm.js} +1 -1
  60. package/dist/client/assets/{journeyDiagram-JHISSGLW-DAZBgAQW.js → journeyDiagram-JHISSGLW-2S631RY5.js} +1 -1
  61. package/dist/client/assets/{kanban-definition-UN3LZRKU-Bkr_fXev.js → kanban-definition-UN3LZRKU-pc9vzUtB.js} +1 -1
  62. package/dist/client/assets/{line-CROuuXDO.js → line-BBMBmEjI.js} +1 -1
  63. package/dist/client/assets/{linear-BOwW57yX.js → linear-DT4rSZvy.js} +1 -1
  64. package/dist/client/assets/{mermaid-parser.core-DrBw_Rsc.js → mermaid-parser.core-ClNeolx0.js} +2 -2
  65. package/dist/client/assets/{mermaid.core-pPd6OYYj.js → mermaid.core-Q4IJbm5V.js} +3 -3
  66. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BXSd3TZU.js → mindmap-definition-RKZ34NQL-DUTZxR8H.js} +1 -1
  67. package/dist/client/assets/{ordinal-CZ33lFpK.js → ordinal-k--hYEme.js} +1 -1
  68. package/dist/client/assets/packet-YPE3B663-Dv0HkRHU.js +1 -0
  69. package/dist/client/assets/pie-LRSECV5Y-S5zPzZFN.js +1 -0
  70. package/dist/client/assets/{pieDiagram-4H26LBE5-DoT7PIZC.js → pieDiagram-4H26LBE5-RW5hNtJq.js} +1 -1
  71. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ycZkLowm.js → quadrantDiagram-W4KKPZXB-CK60c7X9.js} +1 -1
  72. package/dist/client/assets/radar-GUYGQ44K-B7psLv22.js +1 -0
  73. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BPkO1yLu.js → requirementDiagram-4Y6WPE33-Dz35FvcC.js} +1 -1
  74. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-D7AvhhCw.js → sankeyDiagram-5OEKKPKP-ByyluoXu.js} +1 -1
  75. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C982swnH.js → sequenceDiagram-3UESZ5HK-C-879UFe.js} +1 -1
  76. package/dist/client/assets/{stateDiagram-AJRCARHV-xvJ3u8lc.js → stateDiagram-AJRCARHV-B8neDlUu.js} +1 -1
  77. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B4Mq8Abu.js +1 -0
  78. package/dist/client/assets/{timeline-definition-PNZ67QCA-D89qjzb5.js → timeline-definition-PNZ67QCA-iAwrltn1.js} +1 -1
  79. package/dist/client/assets/treeView-BLDUP644-B8H0kT67.js +1 -0
  80. package/dist/client/assets/treemap-LRROVOQU-DPLhFHnh.js +1 -0
  81. package/dist/client/assets/{vennDiagram-CIIHVFJN-CoKeC__u.js → vennDiagram-CIIHVFJN-DHN61m8d.js} +1 -1
  82. package/dist/client/assets/wardley-L42UT6IY-B5-Vb08V.js +1 -0
  83. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DKhjzvSE.js → wardleyDiagram-YWT4CUSO-XDVo7Jy1.js} +1 -1
  84. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DFn9ass1.js → xychartDiagram-2RQKCTM6-Cb-HLpaN.js} +1 -1
  85. package/dist/client/index.html +2 -2
  86. package/dist/server/db.js +237 -0
  87. package/dist/server/db.js.map +1 -1
  88. package/dist/server/index.js +211 -87
  89. package/dist/server/index.js.map +1 -1
  90. package/dist/server/lib/agent.js +198 -100
  91. package/dist/server/lib/agent.js.map +1 -1
  92. package/dist/server/lib/agentProvider.js +14 -9
  93. package/dist/server/lib/agentProvider.js.map +1 -1
  94. package/dist/server/lib/agentRuns.js +20 -9
  95. package/dist/server/lib/agentRuns.js.map +1 -1
  96. package/dist/server/lib/buildExecutionEnvironment.js +517 -0
  97. package/dist/server/lib/buildExecutionEnvironment.js.map +1 -0
  98. package/dist/server/lib/buildOpenQuestionOperations.js +9 -3
  99. package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -1
  100. package/dist/server/lib/chatOperations.js +30 -1
  101. package/dist/server/lib/chatOperations.js.map +1 -1
  102. package/dist/server/lib/checkAutoFix.js +1 -0
  103. package/dist/server/lib/checkAutoFix.js.map +1 -1
  104. package/dist/server/lib/checkRepairDispatch.js +3 -1
  105. package/dist/server/lib/checkRepairDispatch.js.map +1 -1
  106. package/dist/server/lib/dockerSandboxCredentials.js +62 -0
  107. package/dist/server/lib/dockerSandboxCredentials.js.map +1 -0
  108. package/dist/server/lib/dockerSandboxEnvironmentOperations.js +54 -0
  109. package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -0
  110. package/dist/server/lib/dockerSandboxExecutionEnvironment.js +631 -0
  111. package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -0
  112. package/dist/server/lib/dockerSandboxExecutionProvider.js +196 -0
  113. package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -0
  114. package/dist/server/lib/dockerSandboxOpencodeSessionOperations.js +29 -0
  115. package/dist/server/lib/dockerSandboxOpencodeSessionOperations.js.map +1 -0
  116. package/dist/server/lib/dockerSandboxRuntimeController.js +187 -0
  117. package/dist/server/lib/dockerSandboxRuntimeController.js.map +1 -0
  118. package/dist/server/lib/executionEnvironment.js +22 -0
  119. package/dist/server/lib/executionEnvironment.js.map +1 -1
  120. package/dist/server/lib/executionEnvironmentContexts.js +144 -0
  121. package/dist/server/lib/executionEnvironmentContexts.js.map +1 -0
  122. package/dist/server/lib/executionEnvironmentLifecycle.js +63 -0
  123. package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -0
  124. package/dist/server/lib/executionEnvironmentReconciliation.js +782 -0
  125. package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -0
  126. package/dist/server/lib/executionEnvironmentRoutes.js +354 -0
  127. package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -0
  128. package/dist/server/lib/executionEnvironmentValidation.js +486 -0
  129. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -0
  130. package/dist/server/lib/executionEnvironmentValidationOperations.js +635 -0
  131. package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -0
  132. package/dist/server/lib/executionEnvironments.js +726 -0
  133. package/dist/server/lib/executionEnvironments.js.map +1 -0
  134. package/dist/server/lib/executionReconciliation.js +77 -0
  135. package/dist/server/lib/executionReconciliation.js.map +1 -1
  136. package/dist/server/lib/executionRetry.js +3 -0
  137. package/dist/server/lib/executionRetry.js.map +1 -1
  138. package/dist/server/lib/executionRuns.js +1 -0
  139. package/dist/server/lib/executionRuns.js.map +1 -1
  140. package/dist/server/lib/executionTargets.js +107 -0
  141. package/dist/server/lib/executionTargets.js.map +1 -0
  142. package/dist/server/lib/executionTimeline.js +3 -0
  143. package/dist/server/lib/executionTimeline.js.map +1 -1
  144. package/dist/server/lib/git.js +32 -1
  145. package/dist/server/lib/git.js.map +1 -1
  146. package/dist/server/lib/hostExecutionEnvironment.js +47 -1
  147. package/dist/server/lib/hostExecutionEnvironment.js.map +1 -1
  148. package/dist/server/lib/lightweightPrompt.js +1 -0
  149. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  150. package/dist/server/lib/mobileAccess.js +2 -2
  151. package/dist/server/lib/mobileAccess.js.map +1 -1
  152. package/dist/server/lib/models.js +11 -0
  153. package/dist/server/lib/models.js.map +1 -1
  154. package/dist/server/lib/opencodeErrors.js +31 -3
  155. package/dist/server/lib/opencodeErrors.js.map +1 -1
  156. package/dist/server/lib/opencodeExecutionReliability.js +52 -0
  157. package/dist/server/lib/opencodeExecutionReliability.js.map +1 -0
  158. package/dist/server/lib/opencodeSessionOperations.js +210 -20
  159. package/dist/server/lib/opencodeSessionOperations.js.map +1 -1
  160. package/dist/server/lib/opencodeTaskSessions.js +7 -12
  161. package/dist/server/lib/opencodeTaskSessions.js.map +1 -1
  162. package/dist/server/lib/postBuildChecks.js +2 -1
  163. package/dist/server/lib/postBuildChecks.js.map +1 -1
  164. package/dist/server/lib/projectAutoConfig.js +1 -0
  165. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  166. package/dist/server/lib/projects.js +10 -0
  167. package/dist/server/lib/projects.js.map +1 -1
  168. package/dist/server/lib/specArtifact.js +20 -1
  169. package/dist/server/lib/specArtifact.js.map +1 -1
  170. package/dist/server/lib/specBundleGroups.js +151 -0
  171. package/dist/server/lib/specBundleGroups.js.map +1 -0
  172. package/dist/server/lib/specDraft.js +1 -5
  173. package/dist/server/lib/specDraft.js.map +1 -1
  174. package/dist/server/lib/specExport.js +2 -6
  175. package/dist/server/lib/specExport.js.map +1 -1
  176. package/dist/server/lib/specFormatting.js +13 -0
  177. package/dist/server/lib/specFormatting.js.map +1 -1
  178. package/dist/server/lib/specGraphFeature.js +3 -0
  179. package/dist/server/lib/specGraphFeature.js.map +1 -0
  180. package/dist/server/lib/specRepositoryEvidenceFormatting.js +2 -1
  181. package/dist/server/lib/specRepositoryEvidenceFormatting.js.map +1 -1
  182. package/dist/server/lib/specRepositoryImpact.js +4 -0
  183. package/dist/server/lib/specRepositoryImpact.js.map +1 -1
  184. package/dist/server/lib/specReviewContext.js +6 -20
  185. package/dist/server/lib/specReviewContext.js.map +1 -1
  186. package/dist/server/lib/specReviewValidation.js +22 -1
  187. package/dist/server/lib/specReviewValidation.js.map +1 -1
  188. package/dist/server/lib/specReviews.js +1 -1
  189. package/dist/server/lib/specSections.js +8 -1
  190. package/dist/server/lib/specSections.js.map +1 -1
  191. package/dist/server/lib/specSnapshotEvidence.js +4 -0
  192. package/dist/server/lib/specSnapshotEvidence.js.map +1 -1
  193. package/dist/server/lib/specTicketMaterialization.js +122 -0
  194. package/dist/server/lib/specTicketMaterialization.js.map +1 -0
  195. package/dist/server/lib/specs.js +27 -5
  196. package/dist/server/lib/specs.js.map +1 -1
  197. package/dist/server/lib/ticketFollowUpOperations.js +8 -1
  198. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  199. package/dist/server/lib/ticketRunOperations.js +0 -3
  200. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  201. package/dist/server/lib/types.js +1 -0
  202. package/dist/server/lib/types.js.map +1 -1
  203. package/dist/server/lib/workspaceIdentity.js +3 -0
  204. package/dist/server/lib/workspaceIdentity.js.map +1 -1
  205. package/dist/server/workers/build.js +114 -8
  206. package/dist/server/workers/build.js.map +1 -1
  207. package/dist/server/workers/followUp.js +143 -7
  208. package/dist/server/workers/followUp.js.map +1 -1
  209. package/dist/server/workers/plan.js +57 -24
  210. package/dist/server/workers/plan.js.map +1 -1
  211. package/dist/server/workers/review.js +43 -23
  212. package/dist/server/workers/review.js.map +1 -1
  213. package/dist/server/workers/specReview.js +7 -2
  214. package/dist/server/workers/specReview.js.map +1 -1
  215. package/dist/server/workers/specSession.js +109 -153
  216. package/dist/server/workers/specSession.js.map +1 -1
  217. package/package.json +1 -1
  218. package/dist/client/assets/ActivityView-DYDYyqIN.js +0 -1
  219. package/dist/client/assets/GitHubActionsDialog-jhi4GOyV.js +0 -1
  220. package/dist/client/assets/RepositoryGraphDialog-BZV0vHu6.js +0 -1
  221. package/dist/client/assets/VerificationDialog-Sc6e8AKH.js +0 -4
  222. package/dist/client/assets/architecture-7EHR7CIX-Dm8H7N6Z.js +0 -1
  223. package/dist/client/assets/channel-D1kOpezG.js +0 -1
  224. package/dist/client/assets/chunk-QZHKN3VN-CtbsU1Bj.js +0 -1
  225. package/dist/client/assets/chunk-WU5MYG2G-DOOw2vq7.js +0 -1
  226. package/dist/client/assets/classDiagram-4FO5ZUOK-C253nwny.js +0 -1
  227. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DFgDA23g.js +0 -1
  228. package/dist/client/assets/eventmodeling-FCH6USID-BWhw0UJ8.js +0 -1
  229. package/dist/client/assets/gitGraph-WXDBUCRP-BSnxAa1J.js +0 -1
  230. package/dist/client/assets/index-B1gdJKwK.js +0 -275
  231. package/dist/client/assets/index-CCQwWUKF.css +0 -2
  232. package/dist/client/assets/info-J43DQDTF-DcFwF1-h.js +0 -1
  233. package/dist/client/assets/packet-YPE3B663-1VZiO_9r.js +0 -1
  234. package/dist/client/assets/pie-LRSECV5Y-BX1-tQCu.js +0 -1
  235. package/dist/client/assets/radar-GUYGQ44K-B2HRrCR4.js +0 -1
  236. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BKQG8NCn.js +0 -1
  237. package/dist/client/assets/treeView-BLDUP644-CDfUVbUi.js +0 -1
  238. package/dist/client/assets/treemap-LRROVOQU-DUWqu8sK.js +0 -1
  239. package/dist/client/assets/wardley-L42UT6IY-BEFuPUCy.js +0 -1
  240. /package/dist/client/assets/{array-B2f2amhX.js → array-BNor45A1.js} +0 -0
  241. /package/dist/client/assets/{chunk-NNHCCRGN-DgKrp8T-.js → chunk-NNHCCRGN-CZB-V-Gv.js} +0 -0
  242. /package/dist/client/assets/{cytoscape.esm-BInZCgaJ.js → cytoscape.esm-B2lJcMSI.js} +0 -0
  243. /package/dist/client/assets/{defaultLocale-sPXJ5urm.js → defaultLocale-DPzUsThw.js} +0 -0
  244. /package/dist/client/assets/{dist-DfHDMDTt.js → dist-CERhmQhR.js} +0 -0
  245. /package/dist/client/assets/{graphlib-DacNv4Jd.js → graphlib-BHOW-eWz.js} +0 -0
  246. /package/dist/client/assets/{init-BVCnG1lj.js → init-C0L3woqb.js} +0 -0
  247. /package/dist/client/assets/{katex-BlkrXOwm.js → katex-CpjQsUQe.js} +0 -0
  248. /package/dist/client/assets/{path-Bw5AvBNC.js → path-sMK4d_s9.js} +0 -0
  249. /package/dist/client/assets/{rough.esm-DeLgKbOI.js → rough.esm-BoTisKeL.js} +0 -0
  250. /package/dist/client/assets/{src-CFGsdLiG.js → src-BRjoYtUW.js} +0 -0
@@ -0,0 +1,635 @@
1
+ import db from '../db.js';
2
+ import { DOCKER_SANDBOX_ADAPTER_CONTRACT_VERSION, QUALIFIED_DOCKER_SANDBOX_TEMPLATES, QUALIFIED_SBX_VERSION, SbxCommandFailure, createDockerSandboxName, dockerSandboxExecutionEnvironmentCapabilities, } from './dockerSandboxExecutionEnvironment.js';
3
+ import { DockerSandboxRuntimeFailure, } from './dockerSandboxRuntimeController.js';
4
+ import { createEnvironmentValidationFingerprint } from './executionEnvironmentLifecycle.js';
5
+ import { EXECUTION_ENVIRONMENT_VALIDATION_SCHEMA_VERSION, validateExecutionEnvironmentForAgent, } from './executionEnvironmentValidation.js';
6
+ import { listDockerSandboxCredentials } from './dockerSandboxCredentials.js';
7
+ import { appendExecutionEnvironmentEvent, bindExecutionRunToEnvironment, claimExecutionEnvironmentPreparation, getExecutionEnvironment, markExecutionEnvironmentValidated, releaseExecutionRunFromEnvironment, transitionExecutionEnvironment, } from './executionEnvironments.js';
8
+ import { resolveExpectedDockerSandbox, stopAndRecordEnvironmentValidationCleanup, } from './executionEnvironmentReconciliation.js';
9
+ import { createExecutionRun, getExecutionRun, listLifecycleEvents, toCanonicalLifecycleEvent, transitionExecutionRun, } from './executionRuns.js';
10
+ import { getLocalProjectBranch } from './git.js';
11
+ import { getProjectById, getProjectActiveTarget } from './projects.js';
12
+ import { resolveExecutionTarget } from './executionTargets.js';
13
+ import { getBundle } from './tickets.js';
14
+ import { workspaceIdentitiesMatch } from './workspaceIdentity.js';
15
+ import { getModelProvider, normalizeModelId, normalizeModelProvider } from './models.js';
16
+ export class ExecutionEnvironmentRouteError extends Error {
17
+ status;
18
+ reason;
19
+ constructor(status, reason, message) {
20
+ super(message);
21
+ this.name = 'ExecutionEnvironmentRouteError';
22
+ this.status = status;
23
+ this.reason = reason;
24
+ }
25
+ }
26
+ const SANDBOX_CREATE_TIMEOUT_MS = 300_000;
27
+ const isValidationCancelled = (error, signal) => (signal?.aborted === true
28
+ || (error instanceof SbxCommandFailure && error.kind === 'cancelled')
29
+ || (error instanceof DockerSandboxRuntimeFailure && error.kind === 'cancelled'));
30
+ export const parseExecutionEnvironmentAgent = (value) => {
31
+ if (value !== 'opencode' && value !== 'claude') {
32
+ throw new ExecutionEnvironmentRouteError(400, 'invalid_agent', 'agent must be opencode or claude');
33
+ }
34
+ return value;
35
+ };
36
+ export const parseExecutionEnvironmentModel = (value) => {
37
+ if (value == null) {
38
+ return null;
39
+ }
40
+ const model = normalizeModelId(value);
41
+ if (!model) {
42
+ throw new ExecutionEnvironmentRouteError(400, 'invalid_model', 'model must be a valid OpenCode model id');
43
+ }
44
+ return model;
45
+ };
46
+ export const parseExecutionEnvironmentProvider = (value, model = null) => {
47
+ if (value != null) {
48
+ const provider = normalizeModelProvider(value);
49
+ if (!provider) {
50
+ throw new ExecutionEnvironmentRouteError(400, 'invalid_provider', 'provider must be a valid provider id');
51
+ }
52
+ const modelProvider = getModelProvider(model);
53
+ if (modelProvider && modelProvider !== provider) {
54
+ throw new ExecutionEnvironmentRouteError(400, 'provider_model_mismatch', 'provider must match the provider in model');
55
+ }
56
+ return provider;
57
+ }
58
+ return getModelProvider(model) || null;
59
+ };
60
+ export const resolveCurrentExecutionEnvironmentDescriptor = (project) => {
61
+ const target = getProjectActiveTarget(project);
62
+ if (target.kind === 'repo_root') {
63
+ const branch = getLocalProjectBranch(project);
64
+ if (!branch) {
65
+ throw new ExecutionEnvironmentRouteError(409, 'target_unavailable', 'The project target branch is unavailable.');
66
+ }
67
+ return { kind: 'project-root', bundleId: null, branch };
68
+ }
69
+ if (!target.bundle_id) {
70
+ throw new ExecutionEnvironmentRouteError(409, 'target_unavailable', 'The selected project bundle is unavailable.');
71
+ }
72
+ const bundle = getBundle(target.bundle_id, project.id);
73
+ if (!bundle) {
74
+ throw new ExecutionEnvironmentRouteError(409, 'target_unavailable', 'The selected project bundle is unavailable.');
75
+ }
76
+ return { kind: 'bundle-worktree', bundleId: bundle.id, branch: bundle.branch };
77
+ };
78
+ export const currentExecutionEnvironmentValidationFingerprint = (agent) => (createEnvironmentValidationFingerprint({
79
+ workspaceMode: 'direct',
80
+ template: { kind: 'identity', value: QUALIFIED_DOCKER_SANDBOX_TEMPLATES[agent] },
81
+ compatibleAgents: [agent],
82
+ validationSuiteSchemaVersion: EXECUTION_ENVIRONMENT_VALIDATION_SCHEMA_VERSION,
83
+ adapterContractVersion: DOCKER_SANDBOX_ADAPTER_CONTRACT_VERSION,
84
+ qualifiedSbxVersion: QUALIFIED_SBX_VERSION,
85
+ }));
86
+ const descriptorsMatch = (left, right) => (left.kind === right.kind
87
+ && left.branch === right.branch
88
+ && left.bundleId === right.bundleId);
89
+ const assertValidationTargetCurrent = async (projectId, capturedDescriptor, capturedTarget, requiresActiveProjectTarget = true) => {
90
+ try {
91
+ const currentProject = getProjectById(projectId);
92
+ if (!currentProject) {
93
+ throw new Error('Project no longer exists.');
94
+ }
95
+ const currentDescriptor = requiresActiveProjectTarget
96
+ ? resolveCurrentExecutionEnvironmentDescriptor(currentProject)
97
+ : capturedDescriptor;
98
+ if (!descriptorsMatch(capturedDescriptor, currentDescriptor)) {
99
+ throw new Error('Target descriptor changed.');
100
+ }
101
+ const currentTarget = await resolveExecutionTarget({
102
+ project: currentProject,
103
+ descriptor: currentDescriptor,
104
+ expectedWorkspacePath: capturedTarget.workspacePath,
105
+ });
106
+ const capturedIdentity = capturedTarget.workspaceEvidence.workspaceIdentity;
107
+ const currentIdentity = currentTarget.workspaceEvidence.workspaceIdentity;
108
+ if (capturedIdentity.state !== 'available' || currentIdentity.state !== 'available') {
109
+ throw new ExecutionEnvironmentRouteError(409, 'target_evidence_unavailable', 'The project target workspace identity could not be verified during validation.');
110
+ }
111
+ if (currentTarget.identity.key !== capturedTarget.identity.key
112
+ || currentTarget.identity.kind !== capturedTarget.identity.kind
113
+ || !workspaceIdentitiesMatch(currentIdentity, capturedIdentity)) {
114
+ throw new Error('Workspace identity changed.');
115
+ }
116
+ }
117
+ catch (error) {
118
+ if (error instanceof ExecutionEnvironmentRouteError && error.reason === 'target_evidence_unavailable') {
119
+ throw error;
120
+ }
121
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The project target changed during validation.');
122
+ }
123
+ };
124
+ const emitRunAndEvent = (emitter, run, event) => {
125
+ emitter?.emit('execution-run:updated', run);
126
+ emitter?.emit('lifecycle-event:created', toCanonicalLifecycleEvent(event));
127
+ };
128
+ const requireRunAndLatestEvent = (projectId, runId) => {
129
+ const run = getExecutionRun(projectId, runId);
130
+ const event = listLifecycleEvents(projectId, runId).at(-1);
131
+ if (!run || !event) {
132
+ throw new Error(`Environment validation run ${runId} was not persisted`);
133
+ }
134
+ return { run, event };
135
+ };
136
+ const emitLatestRun = (projectId, runId, dependencies) => {
137
+ const latest = requireRunAndLatestEvent(projectId, runId);
138
+ emitRunAndEvent(dependencies.emitter, latest.run, latest.event);
139
+ };
140
+ const createBoundValidationRun = (preparation, agent, model, provider, initiatedBy) => {
141
+ const { project, descriptor, target, environment } = preparation;
142
+ let runId = '';
143
+ db.transaction(() => {
144
+ const currentTarget = db.prepare(`
145
+ SELECT active_target_kind, active_target_bundle_id
146
+ FROM projects WHERE id = ? AND deletion_started_at IS NULL
147
+ `).get(project.id);
148
+ if (!currentTarget) {
149
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The project target changed while validation was being prepared.');
150
+ }
151
+ if (preparation.requiresActiveProjectTarget) {
152
+ const expectedTargetKind = descriptor.kind === 'bundle-worktree' ? 'bundle' : 'repo_root';
153
+ const expectedBundleId = descriptor.kind === 'bundle-worktree' ? descriptor.bundleId : null;
154
+ if (currentTarget.active_target_kind !== expectedTargetKind
155
+ || currentTarget.active_target_bundle_id !== expectedBundleId) {
156
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The project target changed while validation was being prepared.');
157
+ }
158
+ }
159
+ const active = db.prepare(`
160
+ SELECT run.id, binding.relationship
161
+ FROM execution_environment_run_bindings binding
162
+ JOIN execution_runs run ON run.id = binding.execution_run_id AND run.project_id = binding.project_id
163
+ WHERE binding.project_id = ? AND binding.environment_id = ?
164
+ AND binding.released_at IS NULL
165
+ LIMIT 1
166
+ `).get(project.id, environment.id);
167
+ if (active) {
168
+ throw new ExecutionEnvironmentRouteError(409, active.relationship === 'validation' ? 'validation_active' : 'environment_in_use', active.relationship === 'validation' ? 'Environment validation is already active.' : 'The environment is already in use.');
169
+ }
170
+ const run = createExecutionRun({
171
+ projectId: project.id,
172
+ kind: 'environment_validation',
173
+ initiatedBy,
174
+ domainStatus: 'queued',
175
+ sourceReference: { kind: 'project', id: project.id, label: project.name },
176
+ metadata: {
177
+ environment_id: environment.id,
178
+ agent,
179
+ provider,
180
+ model,
181
+ target: target.identity,
182
+ workspace_path: target.workspacePath,
183
+ workspace_evidence: target.workspaceEvidence,
184
+ },
185
+ eventType: 'environment_validation_created',
186
+ eventMessage: `Environment validation was requested for ${agent}.`,
187
+ });
188
+ bindExecutionRunToEnvironment({
189
+ projectId: project.id,
190
+ environmentId: environment.id,
191
+ executionRunId: run.id,
192
+ relationship: 'validation',
193
+ });
194
+ runId = run.id;
195
+ }).immediate();
196
+ return runId;
197
+ };
198
+ const persistFailureOutcome = (preparation, runId, code, message, dependencies, runStatus = 'failed', failCreatedEnvironment = false) => {
199
+ let transitionedRun = false;
200
+ db.transaction(() => {
201
+ const currentEnvironment = getExecutionEnvironment(preparation.project.id, preparation.environment.id);
202
+ if (!currentEnvironment) {
203
+ throw new Error(`Execution environment ${preparation.environment.id} was not persisted`);
204
+ }
205
+ if (failCreatedEnvironment && preparation.created && !['failed', 'retired'].includes(currentEnvironment.lifecycle_state)) {
206
+ transitionExecutionEnvironment({
207
+ projectId: preparation.project.id,
208
+ environmentId: preparation.environment.id,
209
+ state: 'failed',
210
+ eventType: 'environment_preparation_failed',
211
+ failure: { code, message },
212
+ metadata: { executionRunId: runId },
213
+ });
214
+ }
215
+ else {
216
+ appendExecutionEnvironmentEvent({
217
+ projectId: preparation.project.id,
218
+ environmentId: preparation.environment.id,
219
+ eventType: runStatus === 'cancelled' ? 'environment_validation_cancelled' : 'environment_validation_failed',
220
+ fromState: currentEnvironment.lifecycle_state,
221
+ toState: currentEnvironment.lifecycle_state,
222
+ message,
223
+ metadata: { executionRunId: runId, failureCode: code },
224
+ });
225
+ }
226
+ const run = getExecutionRun(preparation.project.id, runId);
227
+ if (run && ['queued', 'running', 'waiting'].includes(run.status)) {
228
+ transitionExecutionRun({
229
+ projectId: preparation.project.id,
230
+ runId,
231
+ status: runStatus,
232
+ domainStatus: runStatus === 'cancelled' ? 'cancelled' : 'error',
233
+ failure: runStatus === 'failed' ? { code, message } : null,
234
+ eventType: runStatus === 'cancelled' ? 'environment_validation_cancelled' : 'environment_validation_failed',
235
+ eventMessage: message,
236
+ });
237
+ transitionedRun = true;
238
+ }
239
+ })();
240
+ if (transitionedRun) {
241
+ emitLatestRun(preparation.project.id, runId, dependencies);
242
+ }
243
+ };
244
+ const persistValidationOutcome = (preparation, runId, agent, validation) => {
245
+ const status = validation.cancelled ? 'cancelled' : validation.agent.ready ? 'completed' : 'failed';
246
+ const domainStatus = validation.cancelled ? 'cancelled' : validation.agent.ready ? 'ready' : 'not_ready';
247
+ const message = validation.cancelled
248
+ ? `Environment validation for ${agent} was cancelled.`
249
+ : validation.agent.ready
250
+ ? `Environment validation for ${agent} passed.`
251
+ : `Environment validation for ${agent} did not pass.`;
252
+ db.transaction(() => {
253
+ const currentEnvironment = getExecutionEnvironment(preparation.project.id, preparation.environment.id);
254
+ if (!currentEnvironment) {
255
+ throw new Error(`Execution environment ${preparation.environment.id} was not persisted`);
256
+ }
257
+ appendExecutionEnvironmentEvent({
258
+ projectId: preparation.project.id,
259
+ environmentId: preparation.environment.id,
260
+ eventType: 'environment_validation_completed',
261
+ fromState: currentEnvironment.lifecycle_state,
262
+ toState: currentEnvironment.lifecycle_state,
263
+ message,
264
+ metadata: { executionRunId: runId, agent, validation },
265
+ });
266
+ transitionExecutionRun({
267
+ projectId: preparation.project.id,
268
+ runId,
269
+ status,
270
+ domainStatus,
271
+ failure: status === 'failed' ? { code: 'validation_failed', message } : null,
272
+ eventType: 'environment_validation_completed',
273
+ eventMessage: message,
274
+ });
275
+ if (status === 'completed') {
276
+ markExecutionEnvironmentValidated({
277
+ projectId: preparation.project.id,
278
+ environmentId: preparation.environment.id,
279
+ });
280
+ }
281
+ })();
282
+ };
283
+ const cleanupAfterValidation = async (preparation, agent, runId, adapter) => {
284
+ await stopAndRecordEnvironmentValidationCleanup({
285
+ environment: preparation.environment,
286
+ executionRunId: runId,
287
+ adapter,
288
+ requestedAgent: agent,
289
+ });
290
+ };
291
+ const releaseTerminalValidationBinding = (preparation, runId) => {
292
+ const run = getExecutionRun(preparation.project.id, runId);
293
+ if (!run || ['queued', 'running', 'waiting'].includes(run.status)) {
294
+ return;
295
+ }
296
+ releaseExecutionRunFromEnvironment({
297
+ projectId: preparation.project.id,
298
+ environmentId: preparation.environment.id,
299
+ executionRunId: runId,
300
+ relationship: 'validation',
301
+ });
302
+ };
303
+ const runtimeFailureMessage = (error) => `${error.message} ${error.remediation}`;
304
+ const runtimeFailureRouteError = (error) => {
305
+ if (error.kind === 'cancelled') {
306
+ return new ExecutionEnvironmentRouteError(499, 'validation_cancelled', 'Environment validation was cancelled.');
307
+ }
308
+ return new ExecutionEnvironmentRouteError(503, `docker_runtime_${error.kind}`, runtimeFailureMessage(error));
309
+ };
310
+ const logProviderValidationFailures = (preparation, run, validation) => {
311
+ for (const check of validation.agent.checks) {
312
+ const providerError = check.details?.providerError;
313
+ if (check.kind !== 'destination' || check.state !== 'failed' || !providerError) {
314
+ continue;
315
+ }
316
+ console.warn('[execution-validation] destination provider error', {
317
+ project_id: preparation.project.id,
318
+ environment_id: preparation.environment.id,
319
+ execution_run_id: run.id,
320
+ correlation_id: run.correlation_id,
321
+ agent: validation.agent.agent,
322
+ model: validation.model,
323
+ error_name: providerError.name ?? null,
324
+ error_message: providerError.message ?? null,
325
+ provider_reference: providerError.reference ?? null,
326
+ provider: providerError.provider ?? null,
327
+ provider_model: providerError.model ?? null,
328
+ });
329
+ }
330
+ };
331
+ const executePreparedValidation = async (preparation, agent, model, provider, initiatedBy, dependencies, signal) => {
332
+ let runId;
333
+ try {
334
+ runId = createBoundValidationRun(preparation, agent, model, provider, initiatedBy);
335
+ }
336
+ catch (error) {
337
+ if (preparation.created) {
338
+ const message = error instanceof Error ? error.message : 'Environment validation could not be bound.';
339
+ transitionExecutionEnvironment({
340
+ projectId: preparation.project.id,
341
+ environmentId: preparation.environment.id,
342
+ state: 'failed',
343
+ eventType: 'environment_preparation_failed',
344
+ failure: {
345
+ code: error instanceof ExecutionEnvironmentRouteError ? error.reason : 'validation_binding_failed',
346
+ message,
347
+ },
348
+ });
349
+ }
350
+ throw error;
351
+ }
352
+ emitLatestRun(preparation.project.id, runId, dependencies);
353
+ let runtimeReady = false;
354
+ let running = null;
355
+ let validationOutcomePersistenceFailed = false;
356
+ try {
357
+ try {
358
+ await dependencies.runtimeController.ensureReady({ signal });
359
+ runtimeReady = true;
360
+ }
361
+ catch (error) {
362
+ const runtimeError = error instanceof DockerSandboxRuntimeFailure
363
+ ? error
364
+ : new DockerSandboxRuntimeFailure('unsupported_prerequisite');
365
+ const cancelled = runtimeError.kind === 'cancelled';
366
+ persistFailureOutcome(preparation, runId, cancelled ? 'validation_cancelled' : `docker_runtime_${runtimeError.kind}`, runtimeFailureMessage(runtimeError), dependencies, cancelled ? 'cancelled' : 'failed', true);
367
+ throw runtimeFailureRouteError(runtimeError);
368
+ }
369
+ const expected = resolveExpectedDockerSandbox(preparation.environment, agent);
370
+ if (preparation.created) {
371
+ const sandbox = await dependencies.adapter.create({
372
+ identity: {
373
+ projectId: preparation.project.id,
374
+ targetKey: preparation.target.identity.key,
375
+ environmentRevision: preparation.environment.environment_revision,
376
+ validationFingerprint: preparation.environment.environment_validation_fingerprint,
377
+ },
378
+ agent,
379
+ workspacePath: preparation.target.workspacePath,
380
+ template: QUALIFIED_DOCKER_SANDBOX_TEMPLATES[agent],
381
+ }, { signal, timeoutMs: SANDBOX_CREATE_TIMEOUT_MS });
382
+ if (sandbox.name !== preparation.environment.external_id) {
383
+ throw new Error('Docker Sandbox returned an unexpected external identity.');
384
+ }
385
+ transitionExecutionEnvironment({
386
+ projectId: preparation.project.id,
387
+ environmentId: preparation.environment.id,
388
+ state: 'ready',
389
+ eventType: 'environment_ready',
390
+ });
391
+ }
392
+ else if (preparation.environment.lifecycle_state === 'stopped') {
393
+ const reconnected = await dependencies.adapter.reconnect(expected, { signal });
394
+ if (reconnected.state !== 'running') {
395
+ throw new Error('Docker Sandbox did not reach the running state after reconnecting.');
396
+ }
397
+ transitionExecutionEnvironment({
398
+ projectId: preparation.project.id,
399
+ environmentId: preparation.environment.id,
400
+ state: 'running',
401
+ eventType: 'environment_reconnected',
402
+ message: 'Docker Sandbox was reconnected for environment validation.',
403
+ });
404
+ }
405
+ await assertValidationTargetCurrent(preparation.project.id, preparation.descriptor, preparation.target, preparation.requiresActiveProjectTarget);
406
+ running = transitionExecutionRun({
407
+ projectId: preparation.project.id,
408
+ runId,
409
+ status: 'running',
410
+ domainStatus: 'validating',
411
+ eventType: 'environment_validation_started',
412
+ }, dependencies.emitter);
413
+ let credentialInventory;
414
+ let credentialInventoryUnavailable = agent === 'opencode' && !dependencies.runner;
415
+ if (agent === 'opencode' && dependencies.runner) {
416
+ try {
417
+ credentialInventory = await listDockerSandboxCredentials(dependencies.runner, { signal });
418
+ }
419
+ catch {
420
+ credentialInventory = undefined;
421
+ credentialInventoryUnavailable = true;
422
+ }
423
+ }
424
+ const validation = await validateExecutionEnvironmentForAgent(dependencies.adapter, expected, agent, {
425
+ signal,
426
+ model,
427
+ provider,
428
+ sandboxName: expected.name,
429
+ credentialInventory,
430
+ credentialInventoryUnavailable,
431
+ });
432
+ await assertValidationTargetCurrent(preparation.project.id, preparation.descriptor, preparation.target, preparation.requiresActiveProjectTarget);
433
+ logProviderValidationFailures(preparation, running, validation);
434
+ try {
435
+ persistValidationOutcome(preparation, runId, agent, validation);
436
+ }
437
+ catch (error) {
438
+ validationOutcomePersistenceFailed = true;
439
+ const message = error instanceof Error ? error.message : 'Environment validation could not be persisted.';
440
+ try {
441
+ persistFailureOutcome(preparation, runId, 'validation_persistence_failed', message, dependencies);
442
+ }
443
+ catch {
444
+ // Preserve the validation-outcome persistence error while cleanup still runs in finally.
445
+ }
446
+ throw error;
447
+ }
448
+ emitLatestRun(preparation.project.id, runId, dependencies);
449
+ const completed = requireRunAndLatestEvent(preparation.project.id, runId);
450
+ return {
451
+ run: completed.run,
452
+ environment_id: preparation.environment.id,
453
+ agent,
454
+ validation,
455
+ started_at: running.started_at,
456
+ };
457
+ }
458
+ catch (error) {
459
+ if (error instanceof ExecutionEnvironmentRouteError && !runtimeReady) {
460
+ throw error;
461
+ }
462
+ const currentRun = getExecutionRun(preparation.project.id, runId);
463
+ if (currentRun && ['queued', 'running', 'waiting'].includes(currentRun.status) && !validationOutcomePersistenceFailed) {
464
+ const cancelled = isValidationCancelled(error, signal);
465
+ const targetInvalid = error instanceof ExecutionEnvironmentRouteError
466
+ && (error.reason === 'target_changed' || error.reason === 'target_evidence_unavailable');
467
+ const code = cancelled
468
+ ? 'validation_cancelled'
469
+ : targetInvalid
470
+ ? error.reason
471
+ : preparation.created && !running
472
+ ? 'preparation_failed'
473
+ : 'validation_error';
474
+ const message = error instanceof Error ? error.message : 'Environment validation failed unexpectedly.';
475
+ persistFailureOutcome(preparation, runId, code, message, dependencies, cancelled ? 'cancelled' : 'failed');
476
+ }
477
+ if (error instanceof ExecutionEnvironmentRouteError) {
478
+ throw error;
479
+ }
480
+ if (isValidationCancelled(error, signal)) {
481
+ throw new ExecutionEnvironmentRouteError(499, 'validation_cancelled', 'Environment validation was cancelled.');
482
+ }
483
+ if (preparation.created && !running) {
484
+ throw new ExecutionEnvironmentRouteError(502, 'preparation_failed', 'Docker Sandbox preparation failed.');
485
+ }
486
+ throw new ExecutionEnvironmentRouteError(502, 'validation_error', error instanceof Error ? error.message : 'Environment validation failed unexpectedly.');
487
+ }
488
+ finally {
489
+ try {
490
+ if (runtimeReady) {
491
+ await cleanupAfterValidation(preparation, agent, runId, dependencies.adapter);
492
+ }
493
+ }
494
+ finally {
495
+ releaseTerminalValidationBinding(preparation, runId);
496
+ }
497
+ }
498
+ };
499
+ const resolveExistingValidation = async (projectId, environmentId, agent, expectedTarget, requestedTarget) => {
500
+ const project = getProjectById(projectId);
501
+ if (!project) {
502
+ throw new ExecutionEnvironmentRouteError(404, 'project_not_found', 'Not found');
503
+ }
504
+ const environment = getExecutionEnvironment(project.id, environmentId);
505
+ if (!environment) {
506
+ throw new ExecutionEnvironmentRouteError(404, 'environment_not_found', 'Execution environment not found');
507
+ }
508
+ if (!environment.compatible_agents.includes(agent)) {
509
+ throw new ExecutionEnvironmentRouteError(409, 'agent_incompatible', 'The selected environment is not compatible with this agent.');
510
+ }
511
+ if (environment.environment_validation_fingerprint !== currentExecutionEnvironmentValidationFingerprint(agent)
512
+ || environment.workspace_mode !== 'direct'
513
+ || environment.template_identity !== QUALIFIED_DOCKER_SANDBOX_TEMPLATES[agent]
514
+ || environment.agent_identity !== agent) {
515
+ throw new ExecutionEnvironmentRouteError(409, 'environment_obsolete', 'The selected environment uses an obsolete validation contract.');
516
+ }
517
+ if (environment.provider_kind !== 'docker_sandbox'
518
+ || environment.provider_version !== QUALIFIED_SBX_VERSION
519
+ || !['ready', 'running', 'stopped'].includes(environment.lifecycle_state)) {
520
+ throw new ExecutionEnvironmentRouteError(409, 'environment_unavailable', 'The selected environment is not ready for validation.');
521
+ }
522
+ const descriptor = requestedTarget
523
+ ? descriptorForResolvedTarget(project, requestedTarget)
524
+ : resolveCurrentExecutionEnvironmentDescriptor(project);
525
+ const target = await resolveExecutionTarget({
526
+ project,
527
+ descriptor,
528
+ expectedWorkspacePath: environment.target_workspace_path,
529
+ });
530
+ if (target.identity.key !== environment.target_key || target.identity.kind !== environment.target_kind) {
531
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The selected environment does not match the current project target.');
532
+ }
533
+ if (expectedTarget
534
+ && (target.identity.kind !== expectedTarget.kind
535
+ || target.identity.key !== expectedTarget.key
536
+ || target.workspacePath !== expectedTarget.workspacePath)) {
537
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The selected environment does not match the requested execution target.');
538
+ }
539
+ return {
540
+ project,
541
+ descriptor,
542
+ target,
543
+ environment,
544
+ created: false,
545
+ requiresActiveProjectTarget: requestedTarget === undefined,
546
+ };
547
+ };
548
+ const prepareValidationForTarget = async (project, descriptor, target, agent, requiresActiveProjectTarget) => {
549
+ const claim = claimExecutionEnvironmentPreparation({
550
+ projectId: project.id,
551
+ providerKind: 'docker_sandbox',
552
+ providerVersion: QUALIFIED_SBX_VERSION,
553
+ target: { kind: target.identity.kind, key: target.identity.key, workspacePath: target.workspacePath },
554
+ validation: {
555
+ workspaceMode: 'direct',
556
+ template: { kind: 'identity', value: QUALIFIED_DOCKER_SANDBOX_TEMPLATES[agent] },
557
+ compatibleAgents: [agent],
558
+ validationSuiteSchemaVersion: EXECUTION_ENVIRONMENT_VALIDATION_SCHEMA_VERSION,
559
+ adapterContractVersion: DOCKER_SANDBOX_ADAPTER_CONTRACT_VERSION,
560
+ qualifiedSbxVersion: QUALIFIED_SBX_VERSION,
561
+ },
562
+ agentIdentity: agent,
563
+ capabilities: dockerSandboxExecutionEnvironmentCapabilities,
564
+ resolveExternalId: (environmentRevision, validationFingerprint) => createDockerSandboxName({
565
+ projectId: project.id,
566
+ targetKey: target.identity.key,
567
+ environmentRevision,
568
+ validationFingerprint,
569
+ }),
570
+ });
571
+ if (claim.kind === 'preparing') {
572
+ throw new ExecutionEnvironmentRouteError(409, 'preparation_active', 'Equivalent environment preparation is already active.');
573
+ }
574
+ return {
575
+ project,
576
+ descriptor,
577
+ target,
578
+ environment: claim.environment,
579
+ created: claim.kind === 'created',
580
+ requiresActiveProjectTarget,
581
+ };
582
+ };
583
+ const prepareValidation = async (projectId, agent) => {
584
+ const project = getProjectById(projectId);
585
+ if (!project) {
586
+ throw new ExecutionEnvironmentRouteError(404, 'project_not_found', 'Not found');
587
+ }
588
+ const descriptor = resolveCurrentExecutionEnvironmentDescriptor(project);
589
+ const target = await resolveExecutionTarget({ project, descriptor });
590
+ return prepareValidationForTarget(project, descriptor, target, agent, true);
591
+ };
592
+ const descriptorForResolvedTarget = (project, target) => {
593
+ if (target.identity.kind === 'project-root') {
594
+ const branch = getLocalProjectBranch(project);
595
+ if (!branch) {
596
+ throw new ExecutionEnvironmentRouteError(409, 'target_unavailable', 'The project target branch is unavailable.');
597
+ }
598
+ return { kind: 'project-root', bundleId: null, branch };
599
+ }
600
+ if (target.identity.kind === 'bundle-worktree') {
601
+ const bundle = getBundle(target.identity.bundleId, project.id);
602
+ if (!bundle) {
603
+ throw new ExecutionEnvironmentRouteError(409, 'target_unavailable', 'The selected ticket bundle is unavailable.');
604
+ }
605
+ return { kind: 'bundle-worktree', bundleId: bundle.id, branch: bundle.branch };
606
+ }
607
+ return { kind: 'branch-worktree', bundleId: null, branch: target.identity.branch };
608
+ };
609
+ const prepareValidationForResolvedTarget = async (projectId, agent, requestedTarget) => {
610
+ const project = getProjectById(projectId);
611
+ if (!project) {
612
+ throw new ExecutionEnvironmentRouteError(404, 'project_not_found', 'Not found');
613
+ }
614
+ const descriptor = descriptorForResolvedTarget(project, requestedTarget);
615
+ const target = await resolveExecutionTarget({
616
+ project,
617
+ descriptor,
618
+ expectedWorkspacePath: requestedTarget.workspacePath,
619
+ });
620
+ if (target.identity.kind !== requestedTarget.identity.kind
621
+ || target.identity.key !== requestedTarget.identity.key
622
+ || target.workspacePath !== requestedTarget.workspacePath) {
623
+ throw new ExecutionEnvironmentRouteError(409, 'target_changed', 'The requested Build target changed before validation.');
624
+ }
625
+ return prepareValidationForTarget(project, descriptor, target, agent, false);
626
+ };
627
+ export const validateExecutionEnvironment = async (input, dependencies) => executePreparedValidation(await resolveExistingValidation(input.projectId, input.environmentId, input.agent, input.expectedTarget), input.agent, input.model ?? null, input.provider ?? getModelProvider(input.model), input.initiatedBy ?? 'user', dependencies, input.signal);
628
+ export const validateExecutionEnvironmentForTarget = async (input, dependencies) => executePreparedValidation(await resolveExistingValidation(input.projectId, input.environmentId, input.agent, {
629
+ kind: input.target.identity.kind,
630
+ key: input.target.identity.key,
631
+ workspacePath: input.target.workspacePath,
632
+ }, input.target), input.agent, input.model ?? null, input.provider ?? getModelProvider(input.model), input.initiatedBy ?? 'user', dependencies, input.signal);
633
+ export const prepareAndValidateExecutionEnvironment = async (input, dependencies) => executePreparedValidation(await prepareValidation(input.projectId, input.agent), input.agent, input.model ?? null, input.provider ?? getModelProvider(input.model), input.initiatedBy ?? 'user', dependencies, input.signal);
634
+ export const prepareAndValidateExecutionEnvironmentForTarget = async (input, dependencies) => executePreparedValidation(await prepareValidationForResolvedTarget(input.projectId, input.agent, input.target), input.agent, input.model ?? null, input.provider ?? getModelProvider(input.model), input.initiatedBy ?? 'user', dependencies, input.signal);
635
+ //# sourceMappingURL=executionEnvironmentValidationOperations.js.map