@straiffi/archon 1.8.22 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/dist/client/assets/{ActivityView-CdEPjmqD.js → ActivityView-Y5IaJiim.js} +1 -1
  2. package/dist/client/assets/GitHubActionsDialog-GWVxWGPK.js +1 -0
  3. package/dist/client/assets/VerificationDialog-C4RMuI4y.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BrZ08mqq.js → architectureDiagram-3BPJPVTR-CeM6gbLN.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-b93XwJ6Z.js → blockDiagram-GPEHLZMM-BP4hta96.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-BKOdbZ_v.js → c4Diagram-AAUBKEIU-5aJScvhn.js} +1 -1
  7. package/dist/client/assets/channel-B3DjZXbm.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-D7Vxn_1m.js → chunk-2J33WTMH-BKc2IelV.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-B1zo2UZq.js → chunk-3OPIFGDE-DCc15la5.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-BajvkDdQ.js → chunk-5ZQYHXKU-DSD9HbTp.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-CSH7cVpV.js → chunk-727SXJPM-DrAjnKiA.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-DE-wgUNP.js → chunk-AQP2D5EJ-DxKnpHfQ.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-Ba7JgCEf.js → chunk-CSCIHK7Q-DLejrAB_.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-0o3YWkHM.js → chunk-KSCS5N6A-BWRNmF8S.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-DihWczP8.js → chunk-L5ZTLDWV-D48i966f.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-Bxnu-hme.js → chunk-LZXEDZCA-DLhg6Bok.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-CoaR5kmP.js → chunk-ND2GUHAM-B4-7cOEq.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-By92Rd3d.js → chunk-NZK2D7GU-D2ttXA_d.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-D83Pkgfu.js → chunk-O5CBEL6O-BrWrOVCq.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-v8OVf5Lz.js → chunk-WU5MYG2G-CLcPwxPe.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-DproSkn2.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-JVMMzJxJ.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-Dq1ALF7Z.js → dagre-BM42HDAG-DIXN8_VX.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-1t1_TKtu.js → diagram-2AECGRRQ-D2wjdCij.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-DtvYRL6f.js → diagram-5GNKFQAL-E1Og_PHE.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-PRNrSX5F.js → diagram-KO2AKTUF-B6P1Ud8a.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-DaTX0DhT.js → diagram-LMA3HP47-C3Jxq56v.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-C2p9p-92.js → diagram-OG6HWLK6-Do9LVhdL.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-DKzLtnp-.js → erDiagram-TEJ5UH35-DLb5E4-f.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-GdL8lm6e.js → flowDiagram-I6XJVG4X-CcTs_wU9.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Ok-4XYwT.js → ganttDiagram-6RSMTGT7-q9ez5fri.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DSMrOCK7.js → gitGraphDiagram-PVQCEYII-BcaKiz4c.js} +1 -1
  33. package/dist/client/assets/index-1CokwSFm.css +2 -0
  34. package/dist/client/assets/index-CSOKbu3w.js +276 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-Dl4hRXis.js → infoDiagram-5YYISTIA-Cu0w4frE.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-C1Dc1fTT.js → ishikawaDiagram-YF4QCWOH-CJ47Z-ak.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-CUscmJze.js → journeyDiagram-JHISSGLW-fAL_Zcvs.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-C0nwYjQV.js → kanban-definition-UN3LZRKU-BTNIybMC.js} +1 -1
  39. package/dist/client/assets/{line-ByiuEIg_.js → line-BvsadeZR.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-B-XdAyDR.js → mermaid-parser.core-C0EkH2y_.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-D_bIfuZD.js → mermaid.core-BU5QIIbY.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BGNiPJDK.js → mindmap-definition-RKZ34NQL-CWbSYK8f.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-CP6FpAoO.js → pieDiagram-4H26LBE5-t4w2cB-y.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-dsAWBAQn.js → quadrantDiagram-W4KKPZXB-Cqasvrpa.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DJH-zHqF.js → requirementDiagram-4Y6WPE33-_l-mY-tb.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BJMnZrqH.js → sankeyDiagram-5OEKKPKP-Cr9YrZ-Y.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CzNjUSlM.js → sequenceDiagram-3UESZ5HK-DvzZhQpb.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-jppMhOwh.js → stateDiagram-AJRCARHV-cFjPpAO3.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-btHMH5Cg.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-BX2CI5H_.js → timeline-definition-PNZ67QCA-BjRNrEJY.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-Bd1KZaXh.js → vennDiagram-CIIHVFJN-xs9afjrw.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D-0BNz49.js → wardleyDiagram-YWT4CUSO-DH68ZYti.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DbYa0ZWK.js → xychartDiagram-2RQKCTM6-DLW5ktTU.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +231 -14
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +93 -9
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agent.js +368 -143
  60. package/dist/server/lib/agent.js.map +1 -1
  61. package/dist/server/lib/agentProvider.js.map +1 -1
  62. package/dist/server/lib/approvalReconciliation.js +14 -2
  63. package/dist/server/lib/approvalReconciliation.js.map +1 -1
  64. package/dist/server/lib/buildExecutionEnvironment.js +251 -57
  65. package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
  66. package/dist/server/lib/chatOperations.js +125 -3
  67. package/dist/server/lib/chatOperations.js.map +1 -1
  68. package/dist/server/lib/chatPostBuildRuns.js +12 -6
  69. package/dist/server/lib/chatPostBuildRuns.js.map +1 -1
  70. package/dist/server/lib/chatTargets.js +2 -1
  71. package/dist/server/lib/chatTargets.js.map +1 -1
  72. package/dist/server/lib/checkDefinitionCwd.js +34 -0
  73. package/dist/server/lib/checkDefinitionCwd.js.map +1 -0
  74. package/dist/server/lib/checkExecutionEnvironment.js +95 -0
  75. package/dist/server/lib/checkExecutionEnvironment.js.map +1 -0
  76. package/dist/server/lib/checkPolicyDefinitionIds.js +41 -0
  77. package/dist/server/lib/checkPolicyDefinitionIds.js.map +1 -0
  78. package/dist/server/lib/checkRepairDispatch.js +2 -0
  79. package/dist/server/lib/checkRepairDispatch.js.map +1 -1
  80. package/dist/server/lib/checkRunner.js +371 -175
  81. package/dist/server/lib/checkRunner.js.map +1 -1
  82. package/dist/server/lib/checkRuns.js +99 -8
  83. package/dist/server/lib/checkRuns.js.map +1 -1
  84. package/dist/server/lib/claudeAgentProvider.js +3 -6
  85. package/dist/server/lib/claudeAgentProvider.js.map +1 -1
  86. package/dist/server/lib/claudeStdin.js +27 -0
  87. package/dist/server/lib/claudeStdin.js.map +1 -0
  88. package/dist/server/lib/completedAssistantOutput.js +38 -0
  89. package/dist/server/lib/completedAssistantOutput.js.map +1 -0
  90. package/dist/server/lib/consequentialActionAuthority.js +99 -8
  91. package/dist/server/lib/consequentialActionAuthority.js.map +1 -1
  92. package/dist/server/lib/consequentialActions.js +42 -2
  93. package/dist/server/lib/consequentialActions.js.map +1 -1
  94. package/dist/server/lib/dockerSandboxCredentials.js +10 -3
  95. package/dist/server/lib/dockerSandboxCredentials.js.map +1 -1
  96. package/dist/server/lib/dockerSandboxEnvironmentOperations.js +9 -8
  97. package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
  98. package/dist/server/lib/dockerSandboxExecutionEnvironment.js +167 -75
  99. package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
  100. package/dist/server/lib/dockerSandboxExecutionProvider.js +22 -14
  101. package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -1
  102. package/dist/server/lib/dockerSandboxNetworkPolicy.js +23 -14
  103. package/dist/server/lib/dockerSandboxNetworkPolicy.js.map +1 -1
  104. package/dist/server/lib/dockerSandboxReleaseProfiles.js +91 -0
  105. package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -0
  106. package/dist/server/lib/dockerSandboxRuntimeController.js +16 -1
  107. package/dist/server/lib/dockerSandboxRuntimeController.js.map +1 -1
  108. package/dist/server/lib/executionCredentialCapabilities.js +9 -6
  109. package/dist/server/lib/executionCredentialCapabilities.js.map +1 -1
  110. package/dist/server/lib/executionEnvironment.js.map +1 -1
  111. package/dist/server/lib/executionEnvironmentLifecycle.js +7 -0
  112. package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -1
  113. package/dist/server/lib/executionEnvironmentOperations.js +241 -0
  114. package/dist/server/lib/executionEnvironmentOperations.js.map +1 -0
  115. package/dist/server/lib/executionEnvironmentReconciliation.js +98 -3
  116. package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
  117. package/dist/server/lib/executionEnvironmentRoutes.js +83 -29
  118. package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
  119. package/dist/server/lib/executionEnvironmentValidation.js +19 -5
  120. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
  121. package/dist/server/lib/executionEnvironmentValidationOperations.js +58 -31
  122. package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
  123. package/dist/server/lib/executionEnvironments.js +187 -9
  124. package/dist/server/lib/executionEnvironments.js.map +1 -1
  125. package/dist/server/lib/executionProfileCheckPolicy.js +14 -0
  126. package/dist/server/lib/executionProfileCheckPolicy.js.map +1 -0
  127. package/dist/server/lib/executionProfileRoutes.js +9 -1
  128. package/dist/server/lib/executionProfileRoutes.js.map +1 -1
  129. package/dist/server/lib/executionProfileStore.js +5 -3
  130. package/dist/server/lib/executionProfileStore.js.map +1 -1
  131. package/dist/server/lib/executionProfiles.js +97 -15
  132. package/dist/server/lib/executionProfiles.js.map +1 -1
  133. package/dist/server/lib/executionReconciliation.js +43 -6
  134. package/dist/server/lib/executionReconciliation.js.map +1 -1
  135. package/dist/server/lib/executionRunAuthority.js +115 -24
  136. package/dist/server/lib/executionRunAuthority.js.map +1 -1
  137. package/dist/server/lib/executionTargets.js +30 -4
  138. package/dist/server/lib/executionTargets.js.map +1 -1
  139. package/dist/server/lib/executionWorkloads.js +75 -0
  140. package/dist/server/lib/executionWorkloads.js.map +1 -0
  141. package/dist/server/lib/git.js +10 -1
  142. package/dist/server/lib/git.js.map +1 -1
  143. package/dist/server/lib/opencodeAgentProvider.js +3 -1
  144. package/dist/server/lib/opencodeAgentProvider.js.map +1 -1
  145. package/dist/server/lib/opencodeSessionOperations.js +5 -3
  146. package/dist/server/lib/opencodeSessionOperations.js.map +1 -1
  147. package/dist/server/lib/planQuestions.js +2 -1
  148. package/dist/server/lib/planQuestions.js.map +1 -1
  149. package/dist/server/lib/postBuildCheckRuns.js +9 -5
  150. package/dist/server/lib/postBuildCheckRuns.js.map +1 -1
  151. package/dist/server/lib/preview.js +47 -6
  152. package/dist/server/lib/preview.js.map +1 -1
  153. package/dist/server/lib/previewProxy.js +11 -3
  154. package/dist/server/lib/previewProxy.js.map +1 -1
  155. package/dist/server/lib/productionCheckApprovals.js +97 -35
  156. package/dist/server/lib/productionCheckApprovals.js.map +1 -1
  157. package/dist/server/lib/projectMemorySuggestions.js +29 -6
  158. package/dist/server/lib/projectMemorySuggestions.js.map +1 -1
  159. package/dist/server/lib/requiredCheckPolicy.js +3 -40
  160. package/dist/server/lib/requiredCheckPolicy.js.map +1 -1
  161. package/dist/server/lib/reviewAgentWatchdog.js +75 -0
  162. package/dist/server/lib/reviewAgentWatchdog.js.map +1 -0
  163. package/dist/server/lib/reviewFindingReconciliation.js +176 -0
  164. package/dist/server/lib/reviewFindingReconciliation.js.map +1 -0
  165. package/dist/server/lib/reviewFindings.js +45 -17
  166. package/dist/server/lib/reviewFindings.js.map +1 -1
  167. package/dist/server/lib/run.js +370 -80
  168. package/dist/server/lib/run.js.map +1 -1
  169. package/dist/server/lib/serviceRuns.js +196 -0
  170. package/dist/server/lib/serviceRuns.js.map +1 -0
  171. package/dist/server/lib/sessionTargets.js +34 -0
  172. package/dist/server/lib/sessionTargets.js.map +1 -1
  173. package/dist/server/lib/shell.js +20 -0
  174. package/dist/server/lib/shell.js.map +1 -1
  175. package/dist/server/lib/specArtifact.js +36 -15
  176. package/dist/server/lib/specArtifact.js.map +1 -1
  177. package/dist/server/lib/specBundleGroups.js +4 -4
  178. package/dist/server/lib/specBundleGroups.js.map +1 -1
  179. package/dist/server/lib/specOperations.js +2 -0
  180. package/dist/server/lib/specOperations.js.map +1 -1
  181. package/dist/server/lib/specReviewOperations.js +2 -0
  182. package/dist/server/lib/specReviewOperations.js.map +1 -1
  183. package/dist/server/lib/specTicketMaterialization.js +37 -24
  184. package/dist/server/lib/specTicketMaterialization.js.map +1 -1
  185. package/dist/server/lib/ticketFollowUpOperations.js +9 -4
  186. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  187. package/dist/server/lib/ticketRunOperations.js +1 -0
  188. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  189. package/dist/server/lib/types.js +1 -0
  190. package/dist/server/lib/types.js.map +1 -1
  191. package/dist/server/lib/workloadExecutionEnvironment.js +2 -0
  192. package/dist/server/lib/workloadExecutionEnvironment.js.map +1 -0
  193. package/dist/server/lib/workspaceIdentity.js +30 -6
  194. package/dist/server/lib/workspaceIdentity.js.map +1 -1
  195. package/dist/server/workers/build.js +39 -8
  196. package/dist/server/workers/build.js.map +1 -1
  197. package/dist/server/workers/chat.js +142 -15
  198. package/dist/server/workers/chat.js.map +1 -1
  199. package/dist/server/workers/followUp.js +77 -20
  200. package/dist/server/workers/followUp.js.map +1 -1
  201. package/dist/server/workers/plan.js +295 -48
  202. package/dist/server/workers/plan.js.map +1 -1
  203. package/dist/server/workers/planFollowUp.js +77 -7
  204. package/dist/server/workers/planFollowUp.js.map +1 -1
  205. package/dist/server/workers/review.js +153 -40
  206. package/dist/server/workers/review.js.map +1 -1
  207. package/dist/server/workers/specReview.js +43 -5
  208. package/dist/server/workers/specReview.js.map +1 -1
  209. package/dist/server/workers/specSession.js +156 -31
  210. package/dist/server/workers/specSession.js.map +1 -1
  211. package/package.json +1 -1
  212. package/dist/client/assets/GitHubActionsDialog-CA189pr2.js +0 -1
  213. package/dist/client/assets/VerificationDialog-BPVkhKRj.js +0 -4
  214. package/dist/client/assets/channel-D0zqzBT_.js +0 -1
  215. package/dist/client/assets/classDiagram-4FO5ZUOK-ChhyvHH2.js +0 -1
  216. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Cl02kurK.js +0 -1
  217. package/dist/client/assets/index-Bs8KsdV9.js +0 -276
  218. package/dist/client/assets/index-DdwM8Wgt.css +0 -2
  219. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CLR1WgdV.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agentProvider.js","sourceRoot":"","sources":["../../../server/lib/agentProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentProvider.js","sourceRoot":"","sources":["../../../server/lib/agentProvider.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ import { expireApprovalRequests, getApprovalRequest, invalidateApprovalRequest }
4
4
  import { getActiveExecutionProfileRevision } from './executionProfileStore.js';
5
5
  import { getCheckDefinitionFingerprint } from './checkDefinitions.js';
6
6
  import { getProjectById, getProjectCheckDefinitions } from './projects.js';
7
- const invalidReason = (request) => {
7
+ import { fingerprintConsequentialAction } from './consequentialActions.js';
8
+ import { rebuildProductionCheckAction } from './productionCheckApprovals.js';
9
+ const invalidReason = async (request) => {
8
10
  const activeProfile = getActiveExecutionProfileRevision(request.project_id);
9
11
  if (!activeProfile
10
12
  || activeProfile.id !== request.authority.selected_profile.revision_id
@@ -42,6 +44,16 @@ const invalidReason = (request) => {
42
44
  || getCheckDefinitionFingerprint(definition) !== target.check_definition_fingerprint) {
43
45
  return 'custom_check_definition_changed';
44
46
  }
47
+ try {
48
+ const current = await rebuildProductionCheckAction(request);
49
+ if (fingerprintConsequentialAction(current.action) !== request.action_fingerprint
50
+ || JSON.stringify(current.authority) !== JSON.stringify(request.authority)) {
51
+ return 'custom_check_action_or_authority_changed';
52
+ }
53
+ }
54
+ catch {
55
+ return 'custom_check_revalidation_failed';
56
+ }
45
57
  }
46
58
  return null;
47
59
  };
@@ -69,7 +81,7 @@ export const reconcileApprovalRequests = async (input = {}) => {
69
81
  await input.reconcileConsumed?.(request);
70
82
  continue;
71
83
  }
72
- const reason = invalidReason(request);
84
+ const reason = await invalidReason(request);
73
85
  if (reason) {
74
86
  const invalidatedRequest = invalidateApprovalRequest({
75
87
  projectId: request.project_id,
@@ -1 +1 @@
1
- {"version":3,"file":"approvalReconciliation.js","sourceRoot":"","sources":["../../../server/lib/approvalReconciliation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approvalReconciliation.js","sourceRoot":"","sources":["../../../server/lib/approvalReconciliation.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import db from '../db.js';
2
+ import { isDeepStrictEqual } from 'node:util';
2
3
  import { ExecutionEnvironmentFailure, } from './executionEnvironment.js';
3
- import { QUALIFIED_DOCKER_SANDBOX_TEMPLATES, QUALIFIED_SBX_VERSION, DockerSandboxNetworkRollbackFailure, proveScopedDestinationAccess, removeScopedRulesBestEffort, } from './dockerSandboxExecutionEnvironment.js';
4
+ import { DockerSandboxNetworkRollbackFailure, proveScopedDestinationAccess, removeScopedRulesBestEffort, } from './dockerSandboxExecutionEnvironment.js';
5
+ import { resolveDockerSandboxReleaseForPersistedEnvironment } from './dockerSandboxReleaseProfiles.js';
4
6
  import { createDockerSandboxExecutionProvider } from './dockerSandboxExecutionProvider.js';
5
7
  import { createDockerSandboxOpencodeSessionOperations } from './dockerSandboxOpencodeSessionOperations.js';
6
8
  import { defaultDockerSandboxEnvironmentDependencies, dockerSandboxRunner, ensureDockerSandboxRuntimeReady, reconnectAndInspectDockerSandbox, resolveExpectedDockerSandboxIdentity, stopAndVerifyDockerSandbox, } from './dockerSandboxEnvironmentOperations.js';
@@ -9,8 +11,9 @@ import { validateExecutionEnvironmentSkills } from './executionEnvironmentValida
9
11
  import { acquireExecutionEnvironmentLease, appendExecutionEnvironmentEvent, captureExecutionEnvironmentPlacement, getExecutionEnvironment, getExecutionEnvironmentBindingForRun, listExecutionEnvironments, releaseExecutionEnvironmentLease, transitionExecutionEnvironment, } from './executionEnvironments.js';
10
12
  import { hostExecutionEnvironment } from './hostExecutionEnvironment.js';
11
13
  import { getModelProvider, normalizeModelId } from './models.js';
12
- import { createExecutionRunAuthority, persistExecutionRunAuthority, resolveEnvironmentCredentialEvidence, resolveExecutionRunProfile, } from './executionRunAuthority.js';
14
+ import { createExecutionRunAuthority, getExecutionRunAuthority, persistExecutionRunAuthority, resolveEnvironmentCredentialEvidence, resolveExecutionRunProfile, } from './executionRunAuthority.js';
13
15
  import { fingerprintCredentialRequirements } from './executionProfiles.js';
16
+ import { isExecutionProfileEligibleForWorkload, resolveExecutionCredentialRequirements, resolveExecutionTemplateAgent, } from './executionWorkloads.js';
14
17
  import { normalizeExecutionEnvironmentDestinations } from './executionEnvironmentLifecycle.js';
15
18
  import { createDockerSandboxLauncherEnvironment, createGovernedHostRuntimeEnvironment, createHostLauncherEnvironment, createLegacyHostRuntimeEnvironment, createProviderManagedRuntimeEnvironment, } from './workspaceProcessEnvironment.js';
16
19
  export class BuildExecutionEnvironmentFailure extends Error {
@@ -29,13 +32,14 @@ const describePreparationFailure = (error) => {
29
32
  }
30
33
  return '';
31
34
  };
32
- const getLatestValidation = (projectId, environmentId, agent, provider) => db.prepare(`
35
+ const getLatestValidation = (projectId, environmentId, agent, provider, workload) => db.prepare(`
33
36
  SELECT run.id, run.status, run.domain_status, run.metadata_json
34
37
  FROM execution_environment_run_bindings binding
35
38
  JOIN execution_runs run ON run.id = binding.execution_run_id AND run.project_id = binding.project_id
36
39
  WHERE binding.project_id = ? AND binding.environment_id = ?
37
40
  AND binding.relationship = 'validation' AND run.kind = 'environment_validation'
38
41
  AND json_extract(run.metadata_json, '$.agent') = ?
42
+ AND COALESCE(json_extract(run.metadata_json, '$.workload'), 'build') = ?
39
43
  AND (
40
44
  (? IS NULL AND json_extract(run.metadata_json, '$.provider') IS NULL AND json_extract(run.metadata_json, '$.model') IS NULL)
41
45
  OR json_extract(run.metadata_json, '$.provider') = ?
@@ -44,7 +48,7 @@ const getLatestValidation = (projectId, environmentId, agent, provider) => db.pr
44
48
  )
45
49
  ORDER BY run.created_at DESC, run.id DESC
46
50
  LIMIT 1
47
- `).get(projectId, environmentId, agent, provider, provider, provider, provider ? `${provider}/%` : null, provider) ?? null;
51
+ `).get(projectId, environmentId, agent, workload, provider, provider, provider, provider ? `${provider}/%` : null, provider) ?? null;
48
52
  const validationAgent = (row) => {
49
53
  if (!row.metadata_json) {
50
54
  return null;
@@ -86,7 +90,7 @@ const validationProvider = (row) => {
86
90
  return null;
87
91
  }
88
92
  };
89
- const getValidationCredentialCapability = (projectId, environmentId, validationRunId) => {
93
+ const getValidationCredentialCapability = (projectId, environmentId, validationRunId, workload) => {
90
94
  const row = db.prepare(`
91
95
  SELECT metadata_json
92
96
  FROM execution_environment_events
@@ -111,7 +115,7 @@ const getValidationCredentialCapability = (projectId, environmentId, validationR
111
115
  const capability = value;
112
116
  if ((capability.execution_provider !== 'host' && capability.execution_provider !== 'docker_sandbox')
113
117
  || (capability.agent !== 'opencode' && capability.agent !== 'claude')
114
- || capability.workload !== 'build'
118
+ || capability.workload !== workload
115
119
  || typeof capability.satisfies_requested_protection !== 'boolean'
116
120
  || !capability.inventory
117
121
  || !capability.destination
@@ -125,40 +129,50 @@ const getValidationCredentialCapability = (projectId, environmentId, validationR
125
129
  }
126
130
  };
127
131
  const findExecutionEnvironment = (project, agent, target, profileRevision, pinnedEnvironmentId, pinnedEnvironmentRevision, pinnedEnvironmentValidationFingerprint) => {
128
- const fingerprint = currentExecutionEnvironmentValidationFingerprint(agent);
129
- return listExecutionEnvironments(project.id).find(candidate => ((!pinnedEnvironmentId || candidate.id === pinnedEnvironmentId)
130
- && (pinnedEnvironmentRevision === undefined || candidate.environment_revision === pinnedEnvironmentRevision)
131
- && (pinnedEnvironmentValidationFingerprint === undefined
132
- || candidate.environment_validation_fingerprint === pinnedEnvironmentValidationFingerprint)
133
- &&
134
- candidate.provider_kind === 'docker_sandbox'
135
- && candidate.provider_version === QUALIFIED_SBX_VERSION
136
- && candidate.target_kind === target.identity.kind
137
- && candidate.target_key === target.identity.key
138
- && candidate.target_workspace_path === target.workspacePath
139
- && candidate.environment_validation_fingerprint === fingerprint
140
- && (candidate.execution_profile_fingerprint === profileRevision.fingerprint
141
- || (profileRevision.revision === 0 && candidate.execution_profile_fingerprint == null))
142
- && (candidate.credential_requirements_fingerprint === fingerprintCredentialRequirements(profileRevision.profile.credential_requirements)
143
- || (profileRevision.revision === 0 && candidate.credential_requirements_fingerprint == null))
144
- && candidate.retirement_requested_at == null
145
- && candidate.template_identity === QUALIFIED_DOCKER_SANDBOX_TEMPLATES[agent]
146
- && candidate.agent_identity === agent
147
- && candidate.compatible_agents.length === 1
148
- && candidate.compatible_agents[0] === agent
149
- && ['ready', 'running', 'stopped'].includes(candidate.lifecycle_state))) ?? null;
132
+ return listExecutionEnvironments(project.id).find(candidate => {
133
+ const releaseProfile = resolveDockerSandboxReleaseForPersistedEnvironment(candidate.provider_version, candidate.template_identity, candidate.agent_identity);
134
+ if (!releaseProfile) {
135
+ return false;
136
+ }
137
+ const fingerprint = currentExecutionEnvironmentValidationFingerprint(agent, releaseProfile);
138
+ return ((!pinnedEnvironmentId || candidate.id === pinnedEnvironmentId)
139
+ && (pinnedEnvironmentRevision === undefined || candidate.environment_revision === pinnedEnvironmentRevision)
140
+ && (pinnedEnvironmentValidationFingerprint === undefined
141
+ || candidate.environment_validation_fingerprint === pinnedEnvironmentValidationFingerprint)
142
+ && candidate.provider_kind === 'docker_sandbox'
143
+ && candidate.provider_version === releaseProfile.version
144
+ && candidate.target_kind === target.identity.kind
145
+ && candidate.target_key === target.identity.key
146
+ && candidate.target_workspace_path === target.workspacePath
147
+ && candidate.environment_validation_fingerprint === fingerprint
148
+ && (candidate.execution_profile_fingerprint === profileRevision.fingerprint
149
+ || (profileRevision.revision === 0 && candidate.execution_profile_fingerprint == null))
150
+ && (candidate.credential_requirements_fingerprint === fingerprintCredentialRequirements(profileRevision.profile.credential_requirements)
151
+ || (profileRevision.revision === 0 && candidate.credential_requirements_fingerprint == null))
152
+ && candidate.retirement_requested_at == null
153
+ && candidate.template_identity === releaseProfile.templates[agent]
154
+ && candidate.agent_identity === agent
155
+ && candidate.compatible_agents.length === 1
156
+ && candidate.compatible_agents[0] === agent
157
+ && ['ready', 'running', 'stopped'].includes(candidate.lifecycle_state));
158
+ }) ?? null;
150
159
  };
151
- const resolveValidatedEnvironment = (project, agent, target, model, profileRevision, pinnedEnvironmentId, pinnedEnvironmentRevision, pinnedEnvironmentValidationFingerprint) => {
160
+ const resolveValidatedEnvironment = (project, agent, target, model, profileRevision, workload, pinnedEnvironmentId, pinnedEnvironmentRevision, pinnedEnvironmentValidationFingerprint) => {
152
161
  const requestedModel = agent === 'opencode' ? normalizeModelId(model) : null;
153
- const requestedProvider = agent === 'opencode' ? getModelProvider(requestedModel) : 'anthropic';
154
- if (agent === 'opencode' && !requestedProvider) {
162
+ const requestedProvider = workload === 'check'
163
+ ? null
164
+ : agent === 'opencode' ? getModelProvider(requestedModel) : 'anthropic';
165
+ if (workload !== 'check' && agent === 'opencode' && !requestedProvider) {
155
166
  throw new BuildExecutionEnvironmentFailure('validation_provider_missing', 'OpenCode Build requires a model with a provider before a Docker Sandbox can be used.', 'Choose a provider-backed OpenCode model for this ticket, then retry Build.');
156
167
  }
157
168
  const environment = findExecutionEnvironment(project, agent, target, profileRevision, pinnedEnvironmentId, pinnedEnvironmentRevision, pinnedEnvironmentValidationFingerprint);
158
169
  if (!environment) {
159
170
  throw new BuildExecutionEnvironmentFailure('environment_missing', 'No validated Docker Sandbox matches this exact Build target and agent.', `Select this target and validate its ${agent} Docker Sandbox before starting Build.`);
160
171
  }
161
- const validation = getLatestValidation(project.id, environment.id, agent, requestedProvider);
172
+ if (workload === 'check') {
173
+ return environment;
174
+ }
175
+ const validation = getLatestValidation(project.id, environment.id, agent, requestedProvider, workload);
162
176
  if (!validation) {
163
177
  throw new BuildExecutionEnvironmentFailure('validation_missing', 'The matching Docker Sandbox has no durable validation evidence.', `Validate the environment for ${agent} before starting Build.`);
164
178
  }
@@ -184,6 +198,7 @@ const validateBuildProvider = async (input) => {
184
198
  initiatedBy: 'automation',
185
199
  signal: input.signal,
186
200
  profileRevision: input.profileRevision,
201
+ workload: input.workload,
187
202
  }, {
188
203
  adapter: input.dependencies.adapter,
189
204
  runtimeController: input.dependencies.runtimeController,
@@ -326,6 +341,102 @@ export const resolveBuildLineage = (projectId, ticketId, currentRunId, sessionId
326
341
  return parseBuildLineage(row);
327
342
  };
328
343
  export const resolveBuildLineageProvider = (projectId, ticketId, currentRunId, sessionId) => resolveBuildLineage(projectId, ticketId, currentRunId, sessionId)?.provider ?? null;
344
+ const resolveChatLineageRow = (projectId, chatSessionId, currentRunId, sessionId) => db.prepare(`${buildLineageSelect}
345
+ INNER JOIN agent_runs agent_run
346
+ ON agent_run.execution_run_id = run.id
347
+ AND agent_run.parent_type = 'chat'
348
+ AND agent_run.parent_id = run.source_id
349
+ AND agent_run.role = 'main'
350
+ AND agent_run.session_id = ?
351
+ WHERE run.project_id = ? AND run.source_kind = 'chat_session' AND run.source_id = ?
352
+ AND run.id <> ? AND run.kind = 'chat_turn'
353
+ AND json_extract(run.metadata_json, '$.retry_mode') = 'build'
354
+ ORDER BY run.created_at DESC, run.id DESC
355
+ LIMIT 1
356
+ `).get(sessionId, projectId, chatSessionId, currentRunId);
357
+ const resolveChatLineageForRow = (projectId, row) => {
358
+ const lineage = parseBuildLineage(row);
359
+ if (!lineage || !row) {
360
+ return null;
361
+ }
362
+ const authority = getExecutionRunAuthority(projectId, row.id);
363
+ if (!authority || authority.workload !== 'chat_build') {
364
+ throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The historical Chat Build authority is unavailable or belongs to another workload.', 'Start a fresh Chat Build session under the selected execution profile.');
365
+ }
366
+ if (authority.effective.provider !== lineage.provider
367
+ || authority.effective.environment_id !== lineage.environmentId
368
+ || authority.effective.environment_revision !== lineage.environmentRevision
369
+ || authority.effective.environment_validation_fingerprint !== lineage.environmentValidationFingerprint) {
370
+ throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The historical Chat Build provider metadata does not match its immutable authority.', 'Start a fresh Chat Build session under the selected execution profile.');
371
+ }
372
+ let metadata = null;
373
+ try {
374
+ metadata = row.metadata_json ? JSON.parse(row.metadata_json) : null;
375
+ }
376
+ catch {
377
+ metadata = null;
378
+ }
379
+ const historicalAgent = metadata?.retry_tool;
380
+ const historicalModel = typeof metadata?.retry_model === 'string' ? metadata.retry_model : null;
381
+ const modelProvider = historicalAgent === 'claude' ? 'anthropic' : getModelProvider(historicalModel);
382
+ if ((historicalAgent !== 'opencode' && historicalAgent !== 'claude')
383
+ || authority.agent.agent !== historicalAgent
384
+ || !modelProvider) {
385
+ throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The historical Chat Build agent or model provider authority is incomplete.', 'Start a fresh Chat Build session under the selected agent and model provider.');
386
+ }
387
+ return {
388
+ ...lineage,
389
+ agent: authority.agent.agent,
390
+ modelProvider,
391
+ target: {
392
+ kind: authority.target.kind,
393
+ key: authority.target.key,
394
+ workspacePath: authority.target.workspace_path,
395
+ },
396
+ };
397
+ };
398
+ export const resolveChatLineage = (projectId, chatSessionId, currentRunId, sessionId) => resolveChatLineageForRow(projectId, resolveChatLineageRow(projectId, chatSessionId, currentRunId, sessionId));
399
+ export const resolvePlanChatProviderSession = (projectId, chatSessionId, sessionId) => {
400
+ const row = db.prepare(`
401
+ SELECT run.metadata_json
402
+ FROM execution_runs run
403
+ INNER JOIN agent_runs agent_run
404
+ ON agent_run.execution_run_id = run.id
405
+ AND agent_run.parent_type = 'chat'
406
+ AND agent_run.parent_id = run.source_id
407
+ AND agent_run.role = 'main'
408
+ AND agent_run.session_id = ?
409
+ WHERE run.project_id = ? AND run.source_kind = 'chat_session' AND run.source_id = ?
410
+ AND run.kind = 'chat_turn'
411
+ AND json_extract(run.metadata_json, '$.retry_mode') = 'plan'
412
+ ORDER BY run.created_at DESC, run.id DESC
413
+ LIMIT 1
414
+ `).get(sessionId, projectId, chatSessionId);
415
+ if (!row?.metadata_json) {
416
+ return null;
417
+ }
418
+ try {
419
+ const metadata = JSON.parse(row.metadata_json);
420
+ const agent = metadata.retry_tool;
421
+ const model = typeof metadata.retry_model === 'string' ? metadata.retry_model : null;
422
+ const modelProvider = agent === 'claude' ? 'anthropic' : getModelProvider(model);
423
+ if ((agent !== 'opencode' && agent !== 'claude') || !modelProvider) {
424
+ return null;
425
+ }
426
+ return { agent, modelProvider };
427
+ }
428
+ catch {
429
+ return null;
430
+ }
431
+ };
432
+ export const resolveChatLineageForRun = (projectId, executionRunId) => {
433
+ const row = db.prepare(`${buildLineageSelect}
434
+ WHERE run.project_id = ? AND run.id = ? AND run.kind = 'chat_turn'
435
+ AND json_extract(run.metadata_json, '$.retry_mode') = 'build'
436
+ LIMIT 1
437
+ `).get(projectId, executionRunId);
438
+ return resolveChatLineageForRow(projectId, row);
439
+ };
329
440
  export const recordBuildExecutionProvider = (projectId, executionRunId, provider) => {
330
441
  const updated = db.prepare(`
331
442
  UPDATE execution_runs
@@ -337,9 +448,40 @@ export const recordBuildExecutionProvider = (projectId, executionRunId, provider
337
448
  throw new Error('Build execution provider lineage could not be recorded');
338
449
  }
339
450
  };
340
- export const resolveBuildExecutionEnvironment = async (input) => {
451
+ export const recordChatExecutionProvider = (projectId, executionRunId, provider) => {
452
+ const updated = db.prepare(`
453
+ UPDATE execution_runs
454
+ SET metadata_json = json_set(COALESCE(metadata_json, '{}'), '$.build_execution_provider', ?),
455
+ updated_at = CURRENT_TIMESTAMP
456
+ WHERE id = ? AND project_id = ? AND kind = 'chat_turn'
457
+ AND json_extract(metadata_json, '$.retry_mode') = 'build'
458
+ `).run(provider, executionRunId, projectId);
459
+ if (updated.changes !== 1) {
460
+ throw new Error('Chat Build execution provider lineage could not be recorded');
461
+ }
462
+ };
463
+ export const resolveWorkloadExecutionEnvironment = async (input) => {
341
464
  const profileRevision = resolveExecutionRunProfile(input.project, input.executionRunId);
342
- const selectedProvider = profileRevision.profile.provider_preference;
465
+ if (!isExecutionProfileEligibleForWorkload(profileRevision.profile, input.workload)) {
466
+ throw new Error(`The selected execution profile is not eligible for ${input.workload} workloads`);
467
+ }
468
+ const templateAgent = resolveExecutionTemplateAgent({
469
+ profile: profileRevision.profile,
470
+ workload: input.workload,
471
+ agent: input.agent,
472
+ });
473
+ if (!templateAgent || templateAgent !== input.agent) {
474
+ throw new Error(`The selected execution profile has no matching template for ${input.workload} and ${input.agent}`);
475
+ }
476
+ const selectedProvider = input.pinnedProvider ?? profileRevision.profile.provider_preference;
477
+ if (input.pinnedProvider
478
+ && input.pinnedProvider !== profileRevision.profile.provider_preference
479
+ && !(input.pinnedProvider === 'host'
480
+ && profileRevision.profile.provider_preference === 'docker_sandbox'
481
+ && profileRevision.profile.fallback === 'explicit_host'
482
+ && profileRevision.profile.isolation === 'host_process_allowed')) {
483
+ throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The historical execution provider conflicts with the selected execution profile.', 'Start a fresh execution under the selected profile.');
484
+ }
343
485
  const hasPinnedEnvironmentLineage = input.pinnedEnvironmentId !== undefined
344
486
  || input.pinnedEnvironmentRevision !== undefined
345
487
  || input.pinnedEnvironmentValidationFingerprint !== undefined;
@@ -350,7 +492,9 @@ export const resolveBuildExecutionEnvironment = async (input) => {
350
492
  || !input.pinnedEnvironmentValidationFingerprint)) {
351
493
  throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The historical Docker Sandbox lineage is incomplete or conflicts with the selected execution profile.', 'Retry as a fresh Build instead of resuming this historical provider session.');
352
494
  }
353
- const modelProvider = input.agent === 'opencode' ? getModelProvider(input.model) || null : 'anthropic';
495
+ const modelProvider = input.workload === 'check'
496
+ ? null
497
+ : input.agent === 'opencode' ? getModelProvider(input.model) || null : 'anthropic';
354
498
  const resolveHostEnvironment = (fallback) => {
355
499
  const runAuthority = createExecutionRunAuthority({
356
500
  profileRevision,
@@ -360,6 +504,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
360
504
  target: input.target,
361
505
  environment: null,
362
506
  fallback: fallback ? { used: true, from: fallback.from, reason: fallback.reason } : undefined,
507
+ workload: input.workload,
363
508
  });
364
509
  persistExecutionRunAuthority({
365
510
  projectId: input.project.id,
@@ -368,7 +513,14 @@ export const resolveBuildExecutionEnvironment = async (input) => {
368
513
  authority: runAuthority,
369
514
  });
370
515
  if (fallback) {
371
- recordBuildExecutionProvider(input.project.id, input.executionRunId, 'host');
516
+ const runKind = db.prepare('SELECT kind FROM execution_runs WHERE id = ? AND project_id = ?')
517
+ .get(input.executionRunId, input.project.id);
518
+ if (runKind?.kind === 'chat_turn') {
519
+ recordChatExecutionProvider(input.project.id, input.executionRunId, 'host');
520
+ }
521
+ else if (runKind?.kind !== 'service') {
522
+ recordBuildExecutionProvider(input.project.id, input.executionRunId, 'host');
523
+ }
372
524
  }
373
525
  return {
374
526
  provider: hostExecutionEnvironment,
@@ -383,10 +535,17 @@ export const resolveBuildExecutionEnvironment = async (input) => {
383
535
  };
384
536
  };
385
537
  if (selectedProvider !== 'docker_sandbox') {
386
- return resolveHostEnvironment();
538
+ return resolveHostEnvironment(input.pinnedProvider === 'host' && profileRevision.profile.provider_preference === 'docker_sandbox'
539
+ ? { from: 'docker_sandbox', reason: 'historical_provider_lineage' }
540
+ : undefined);
387
541
  }
388
542
  const dependencies = input.dependencies ?? defaultDockerSandboxEnvironmentDependencies;
389
- const applicableRequirements = profileRevision.profile.credential_requirements.filter(requirement => (requirement.agent === input.agent && requirement.model_provider === modelProvider));
543
+ const applicableRequirements = resolveExecutionCredentialRequirements({
544
+ profile: profileRevision.profile,
545
+ workload: input.workload,
546
+ agent: input.agent,
547
+ modelProvider,
548
+ });
390
549
  const canFallback = profileRevision.profile.fallback === 'explicit_host'
391
550
  && !hasPinnedEnvironmentLineage
392
551
  && profileRevision.profile.isolation === 'host_process_allowed'
@@ -407,12 +566,13 @@ export const resolveBuildExecutionEnvironment = async (input) => {
407
566
  let validatedDuringResolution = false;
408
567
  try {
409
568
  try {
410
- environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
569
+ environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.workload, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
411
570
  }
412
571
  catch (error) {
413
572
  if (error instanceof BuildExecutionEnvironmentFailure
414
573
  && error.code === 'environment_missing'
415
- && !input.pinnedEnvironmentId) {
574
+ && !input.pinnedEnvironmentId
575
+ && input.workload !== 'check') {
416
576
  const requestedProvider = input.agent === 'opencode' ? getModelProvider(input.model) : 'anthropic';
417
577
  try {
418
578
  await prepareAndValidateExecutionEnvironmentForTarget({
@@ -424,6 +584,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
424
584
  initiatedBy: 'automation',
425
585
  signal: input.signal,
426
586
  profileRevision,
587
+ workload: input.workload,
427
588
  }, {
428
589
  adapter: dependencies.adapter,
429
590
  runtimeController: dependencies.runtimeController,
@@ -434,7 +595,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
434
595
  catch (preparationError) {
435
596
  throw new BuildExecutionEnvironmentFailure('validation_stale', `The exact ticket Build target could not be prepared for Docker Sandbox execution.${describePreparationFailure(preparationError)}`, 'Review the reported Docker Sandbox preparation failure, resolve it, then retry Build.', { cause: preparationError });
436
597
  }
437
- environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
598
+ environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.workload, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
438
599
  }
439
600
  else if (!shouldRetryValidation(error)) {
440
601
  throw error;
@@ -454,6 +615,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
454
615
  signal: input.signal,
455
616
  dependencies,
456
617
  profileRevision,
618
+ workload: input.workload,
457
619
  });
458
620
  validatedDuringResolution = true;
459
621
  }
@@ -463,7 +625,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
463
625
  }
464
626
  throw new BuildExecutionEnvironmentFailure('validation_stale', 'The Docker Sandbox provider preflight failed before Build could start.', `Resolve ${input.agent} authentication and provider access, then retry Build.`, { cause: validationError });
465
627
  }
466
- environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
628
+ environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.workload, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
467
629
  }
468
630
  }
469
631
  }
@@ -476,7 +638,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
476
638
  || environment.environment_validation_fingerprint !== input.pinnedEnvironmentValidationFingerprint)) {
477
639
  throw new BuildExecutionEnvironmentFailure('environment_identity_invalid', 'The resolved Docker Sandbox does not match the historical environment lineage.', 'Restore the exact historical environment or retry as a fresh Build.');
478
640
  }
479
- if (!validatedDuringResolution) {
641
+ if (!validatedDuringResolution && input.workload !== 'check') {
480
642
  try {
481
643
  await validateBuildProvider({
482
644
  project: input.project,
@@ -487,29 +649,46 @@ export const resolveBuildExecutionEnvironment = async (input) => {
487
649
  signal: input.signal,
488
650
  dependencies,
489
651
  profileRevision,
652
+ workload: input.workload,
490
653
  });
491
654
  }
492
655
  catch (error) {
493
656
  return resolveFallback(new BuildExecutionEnvironmentFailure('validation_stale', 'The Docker Sandbox provider preflight could not refresh credential and destination evidence before Build.', `Resolve ${input.agent} authentication and provider access, then retry Build.`, { cause: error }));
494
657
  }
495
658
  }
496
- const validation = getLatestValidation(input.project.id, environment.id, input.agent, modelProvider);
659
+ const validation = getLatestValidation(input.project.id, environment.id, input.agent, modelProvider, input.workload);
497
660
  const credentialCapability = validation
498
- ? getValidationCredentialCapability(input.project.id, environment.id, validation.id)
661
+ ? getValidationCredentialCapability(input.project.id, environment.id, validation.id, input.workload)
499
662
  : null;
500
663
  const authority = createAuthority(environment, input.agent, resolveEnvironmentCredentialEvidence({
501
664
  profileRevision,
502
665
  agent: input.agent,
503
666
  modelProvider,
504
667
  credentialCapability,
668
+ workload: input.workload,
505
669
  }));
506
670
  try {
507
- acquireExecutionEnvironmentLease({
508
- projectId: input.project.id,
509
- environmentId: environment.id,
510
- executionRunId: input.executionRunId,
511
- authority,
512
- });
671
+ const existingBinding = getExecutionEnvironmentBindingForRun(input.project.id, input.executionRunId);
672
+ if (existingBinding?.released_at === null) {
673
+ const existingAuthority = existingBinding.authority_json
674
+ ? JSON.parse(existingBinding.authority_json)
675
+ : null;
676
+ if (existingBinding.environment_id !== environment.id
677
+ || existingBinding.environment_revision !== environment.environment_revision
678
+ || existingBinding.environment_validation_fingerprint !== environment.environment_validation_fingerprint
679
+ || existingBinding.execution_profile_fingerprint !== environment.execution_profile_fingerprint
680
+ || !isDeepStrictEqual(existingAuthority, authority)) {
681
+ throw new Error('The retained execution environment lease does not match current authority');
682
+ }
683
+ }
684
+ else {
685
+ acquireExecutionEnvironmentLease({
686
+ projectId: input.project.id,
687
+ environmentId: environment.id,
688
+ executionRunId: input.executionRunId,
689
+ authority,
690
+ });
691
+ }
513
692
  }
514
693
  catch (error) {
515
694
  return resolveFallback(new BuildExecutionEnvironmentFailure('environment_leased', 'The selected Docker Sandbox is already leased by another run.', 'Wait for the active Build or reconciliation to release the environment.', { cause: error }));
@@ -584,6 +763,16 @@ export const resolveBuildExecutionEnvironment = async (input) => {
584
763
  try {
585
764
  await ensureDockerSandboxRuntimeReady(dependencies, input.signal);
586
765
  await reconnectAndInspectDockerSandbox(environment, dependencies, input.signal);
766
+ if (environment.lifecycle_state === 'stopped') {
767
+ transitionExecutionEnvironment({
768
+ projectId: input.project.id,
769
+ environmentId: environment.id,
770
+ state: 'ready',
771
+ eventType: 'environment_execution_reconnected',
772
+ message: 'Docker Sandbox was reconnected for workload execution.',
773
+ metadata: { executionRunId: input.executionRunId },
774
+ });
775
+ }
587
776
  }
588
777
  catch (error) {
589
778
  if (input.signal?.aborted) {
@@ -721,6 +910,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
721
910
  environment,
722
911
  credentialCapability,
723
912
  networkEvidence,
913
+ workload: input.workload,
724
914
  });
725
915
  }
726
916
  catch (error) {
@@ -744,6 +934,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
744
934
  binding: {
745
935
  environmentId: environment.id,
746
936
  environmentRevision: environment.environment_revision,
937
+ providerVersion: environment.provider_version,
747
938
  executionRunId: input.executionRunId,
748
939
  target: input.target,
749
940
  sandbox: expected,
@@ -766,12 +957,14 @@ export const resolveBuildExecutionEnvironment = async (input) => {
766
957
  return null;
767
958
  }
768
959
  try {
769
- captureExecutionEnvironmentPlacement({
770
- projectId: input.project.id,
771
- environmentId: environment.id,
772
- executionRunId: input.executionRunId,
773
- placement,
774
- });
960
+ if (placement.executionRunId === input.executionRunId) {
961
+ captureExecutionEnvironmentPlacement({
962
+ projectId: input.project.id,
963
+ environmentId: environment.id,
964
+ executionRunId: input.executionRunId,
965
+ placement,
966
+ });
967
+ }
775
968
  transitionExecutionEnvironment({
776
969
  projectId: input.project.id,
777
970
  environmentId: environment.id,
@@ -816,4 +1009,5 @@ export const resolveBuildExecutionEnvironment = async (input) => {
816
1009
  release,
817
1010
  };
818
1011
  };
1012
+ export const resolveBuildExecutionEnvironment = (input) => resolveWorkloadExecutionEnvironment({ ...input, workload: 'build' });
819
1013
  //# sourceMappingURL=buildExecutionEnvironment.js.map