@straiffi/archon 1.8.23 → 1.10.1
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.
- package/dist/client/assets/{ActivityView-BaIZ8eHC.js → ActivityView-C5OrI0uK.js} +1 -1
- package/dist/client/assets/GitHubActionsDialog-BABPYwJP.js +1 -0
- package/dist/client/assets/VerificationDialog-LN87YY0r.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Dl5UF67P.js → architectureDiagram-3BPJPVTR-DBXhcjPI.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DCcERfrZ.js → blockDiagram-GPEHLZMM-c3auwNH7.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BGhbASFm.js → c4Diagram-AAUBKEIU-DH2YznEQ.js} +1 -1
- package/dist/client/assets/channel-CYsnLOcX.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-C1ARozTV.js → chunk-2J33WTMH-D0_MoyXZ.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-BEovLizF.js → chunk-3OPIFGDE-DLvSp1DN.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-C5MmlLa_.js → chunk-5ZQYHXKU-B4sX8Htk.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-8y8jBk4n.js → chunk-727SXJPM-CkdnShG1.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-q-mByAd3.js → chunk-AQP2D5EJ-BdPfgkcs.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-BOx2mLSz.js → chunk-CSCIHK7Q-CK-DpVF6.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-zEwQFq7q.js → chunk-KSCS5N6A-DSbTWVl2.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-C80z6rY_.js → chunk-L5ZTLDWV-DuQ4EPLl.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-BLaEsGPd.js → chunk-LZXEDZCA-CtpoXWMY.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-x26BZ95L.js → chunk-ND2GUHAM-CDfNOP6o.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-D2WAxr1p.js → chunk-NZK2D7GU-s6ReY4ev.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-DDPCrzKh.js → chunk-O5CBEL6O-DxqYGKhS.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-CE-JcvIc.js → chunk-WU5MYG2G-BvrhxyV8.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CElk31Q4.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-lnAahwmt.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-Bf7wpUk_.js → dagre-BM42HDAG-DEK_rftr.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BQoKmc3B.js → diagram-2AECGRRQ-CpobcZnv.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-D2jarPLn.js → diagram-5GNKFQAL-zL1D1L_8.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-Bcbbjvsl.js → diagram-KO2AKTUF-gyW-Vc7c.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-t862RRBQ.js → diagram-LMA3HP47-DDEYc8sh.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CacbMcO0.js → diagram-OG6HWLK6-BtUrfJnE.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DRQ79baI.js → erDiagram-TEJ5UH35-qGrmpmmk.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-BfW4KEdc.js → flowDiagram-I6XJVG4X-DO1Nm1FA.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BPIl0TAj.js → ganttDiagram-6RSMTGT7-DGuMVCAc.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CRIusBMV.js → gitGraphDiagram-PVQCEYII-CehPAc8-.js} +1 -1
- package/dist/client/assets/index-1CokwSFm.css +2 -0
- package/dist/client/assets/index-DtefHOHC.js +276 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-DTKzK8EJ.js → infoDiagram-5YYISTIA-BkRaMDId.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DVIHZLvL.js → ishikawaDiagram-YF4QCWOH-B45ubODJ.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-CQBZ4tCx.js → journeyDiagram-JHISSGLW-BLxrlitK.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-D7naegR0.js → kanban-definition-UN3LZRKU-DmyeJDyy.js} +1 -1
- package/dist/client/assets/{line-CizZlaeV.js → line-BhwjsX6t.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-NrDqgpZa.js → mermaid-parser.core-CPvivy_u.js} +1 -1
- package/dist/client/assets/{mermaid.core-CwVO3oX0.js → mermaid.core-Dr0kld-g.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BWxy3Aa_.js → mindmap-definition-RKZ34NQL-dfudPzBR.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-B3gXpmBn.js → pieDiagram-4H26LBE5-BhsIQVNX.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Dpp4g8Al.js → quadrantDiagram-W4KKPZXB-CAKxScLD.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-lFKXnxml.js → requirementDiagram-4Y6WPE33-Br6jIbke.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BBdtwqrS.js → sankeyDiagram-5OEKKPKP-BqujNgnY.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-ANpVZzqm.js → sequenceDiagram-3UESZ5HK-Dr_VM_ei.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-D58ZxmKY.js → stateDiagram-AJRCARHV-CDbSbbTW.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-p-kfFJi7.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-B6FK8IQC.js → timeline-definition-PNZ67QCA-CnuLuWDs.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-lFWtZEEY.js → vennDiagram-CIIHVFJN-CVAhxdBZ.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DteAVp4l.js → wardleyDiagram-YWT4CUSO-Dmczey27.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-CNcDlRLN.js → xychartDiagram-2RQKCTM6-Bl6JGLCU.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +225 -12
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +88 -27
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent.js +368 -143
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/agentProvider.js.map +1 -1
- package/dist/server/lib/approvalReconciliation.js +14 -2
- package/dist/server/lib/approvalReconciliation.js.map +1 -1
- package/dist/server/lib/buildExecutionEnvironment.js +255 -58
- package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/chatOperations.js +125 -3
- package/dist/server/lib/chatOperations.js.map +1 -1
- package/dist/server/lib/chatPostBuildRuns.js +12 -6
- package/dist/server/lib/chatPostBuildRuns.js.map +1 -1
- package/dist/server/lib/chatTargets.js +2 -1
- package/dist/server/lib/chatTargets.js.map +1 -1
- package/dist/server/lib/checkDefinitionCwd.js +34 -0
- package/dist/server/lib/checkDefinitionCwd.js.map +1 -0
- package/dist/server/lib/checkExecutionEnvironment.js +95 -0
- package/dist/server/lib/checkExecutionEnvironment.js.map +1 -0
- package/dist/server/lib/checkPolicyDefinitionIds.js +41 -0
- package/dist/server/lib/checkPolicyDefinitionIds.js.map +1 -0
- package/dist/server/lib/checkRepairDispatch.js +2 -0
- package/dist/server/lib/checkRepairDispatch.js.map +1 -1
- package/dist/server/lib/checkRunner.js +371 -175
- package/dist/server/lib/checkRunner.js.map +1 -1
- package/dist/server/lib/checkRuns.js +99 -8
- package/dist/server/lib/checkRuns.js.map +1 -1
- package/dist/server/lib/claudeAgentProvider.js +3 -6
- package/dist/server/lib/claudeAgentProvider.js.map +1 -1
- package/dist/server/lib/claudeStdin.js +27 -0
- package/dist/server/lib/claudeStdin.js.map +1 -0
- package/dist/server/lib/claudeValidationOutput.js +4 -4
- package/dist/server/lib/claudeValidationOutput.js.map +1 -1
- package/dist/server/lib/completedAssistantOutput.js +38 -0
- package/dist/server/lib/completedAssistantOutput.js.map +1 -0
- package/dist/server/lib/consequentialActionAuthority.js +99 -8
- package/dist/server/lib/consequentialActionAuthority.js.map +1 -1
- package/dist/server/lib/consequentialActions.js +42 -2
- package/dist/server/lib/consequentialActions.js.map +1 -1
- package/dist/server/lib/dockerSandboxCredentials.js +10 -3
- package/dist/server/lib/dockerSandboxCredentials.js.map +1 -1
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js +9 -8
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js +197 -81
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/dockerSandboxExecutionProvider.js +22 -14
- package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -1
- package/dist/server/lib/dockerSandboxNetworkPolicy.js +23 -14
- package/dist/server/lib/dockerSandboxNetworkPolicy.js.map +1 -1
- package/dist/server/lib/dockerSandboxReleaseProfiles.js +91 -0
- package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -0
- package/dist/server/lib/dockerSandboxRuntimeController.js +16 -1
- package/dist/server/lib/dockerSandboxRuntimeController.js.map +1 -1
- package/dist/server/lib/executionCredentialCapabilities.js +9 -6
- package/dist/server/lib/executionCredentialCapabilities.js.map +1 -1
- package/dist/server/lib/executionEnvironment.js.map +1 -1
- package/dist/server/lib/executionEnvironmentLifecycle.js +7 -0
- package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -1
- package/dist/server/lib/executionEnvironmentOperations.js +241 -0
- package/dist/server/lib/executionEnvironmentOperations.js.map +1 -0
- package/dist/server/lib/executionEnvironmentReconciliation.js +98 -3
- package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
- package/dist/server/lib/executionEnvironmentRoutes.js +66 -27
- package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
- package/dist/server/lib/executionEnvironmentValidation.js +21 -12
- package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
- package/dist/server/lib/executionEnvironmentValidationOperations.js +58 -31
- package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
- package/dist/server/lib/executionEnvironments.js +187 -9
- package/dist/server/lib/executionEnvironments.js.map +1 -1
- package/dist/server/lib/executionProfileCheckPolicy.js +14 -0
- package/dist/server/lib/executionProfileCheckPolicy.js.map +1 -0
- package/dist/server/lib/executionProfileRoutes.js +9 -1
- package/dist/server/lib/executionProfileRoutes.js.map +1 -1
- package/dist/server/lib/executionProfileStore.js +5 -3
- package/dist/server/lib/executionProfileStore.js.map +1 -1
- package/dist/server/lib/executionProfiles.js +97 -15
- package/dist/server/lib/executionProfiles.js.map +1 -1
- package/dist/server/lib/executionReconciliation.js +43 -6
- package/dist/server/lib/executionReconciliation.js.map +1 -1
- package/dist/server/lib/executionRunAuthority.js +145 -24
- package/dist/server/lib/executionRunAuthority.js.map +1 -1
- package/dist/server/lib/executionTargets.js +30 -4
- package/dist/server/lib/executionTargets.js.map +1 -1
- package/dist/server/lib/executionWorkloads.js +75 -0
- package/dist/server/lib/executionWorkloads.js.map +1 -0
- package/dist/server/lib/git.js +10 -1
- package/dist/server/lib/git.js.map +1 -1
- package/dist/server/lib/opencodeAgentProvider.js +3 -1
- package/dist/server/lib/opencodeAgentProvider.js.map +1 -1
- package/dist/server/lib/opencodeSessionOperations.js +5 -3
- package/dist/server/lib/opencodeSessionOperations.js.map +1 -1
- package/dist/server/lib/planQuestions.js +2 -1
- package/dist/server/lib/planQuestions.js.map +1 -1
- package/dist/server/lib/postBuildCheckRuns.js +88 -7
- package/dist/server/lib/postBuildCheckRuns.js.map +1 -1
- package/dist/server/lib/preview.js +47 -6
- package/dist/server/lib/preview.js.map +1 -1
- package/dist/server/lib/previewProxy.js +11 -3
- package/dist/server/lib/previewProxy.js.map +1 -1
- package/dist/server/lib/productionCheckApprovals.js +97 -35
- package/dist/server/lib/productionCheckApprovals.js.map +1 -1
- package/dist/server/lib/projectMemorySuggestions.js +29 -6
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -1
- package/dist/server/lib/requiredCheckPolicy.js +3 -40
- package/dist/server/lib/requiredCheckPolicy.js.map +1 -1
- package/dist/server/lib/reviewAgentWatchdog.js +75 -0
- package/dist/server/lib/reviewAgentWatchdog.js.map +1 -0
- package/dist/server/lib/reviewFindingReconciliation.js +176 -0
- package/dist/server/lib/reviewFindingReconciliation.js.map +1 -0
- package/dist/server/lib/reviewFindings.js +33 -11
- package/dist/server/lib/reviewFindings.js.map +1 -1
- package/dist/server/lib/run.js +370 -80
- package/dist/server/lib/run.js.map +1 -1
- package/dist/server/lib/serviceRuns.js +196 -0
- package/dist/server/lib/serviceRuns.js.map +1 -0
- package/dist/server/lib/sessionTargets.js +34 -0
- package/dist/server/lib/sessionTargets.js.map +1 -1
- package/dist/server/lib/shell.js +20 -0
- package/dist/server/lib/shell.js.map +1 -1
- package/dist/server/lib/specArtifact.js +36 -15
- package/dist/server/lib/specArtifact.js.map +1 -1
- package/dist/server/lib/specBundleGroups.js +4 -4
- package/dist/server/lib/specBundleGroups.js.map +1 -1
- package/dist/server/lib/specOperations.js +2 -0
- package/dist/server/lib/specOperations.js.map +1 -1
- package/dist/server/lib/specReviewOperations.js +2 -0
- package/dist/server/lib/specReviewOperations.js.map +1 -1
- package/dist/server/lib/specTicketMaterialization.js +37 -24
- package/dist/server/lib/specTicketMaterialization.js.map +1 -1
- package/dist/server/lib/ticketFollowUpOperations.js +28 -7
- package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
- package/dist/server/lib/ticketRunOperations.js +1 -0
- package/dist/server/lib/ticketRunOperations.js.map +1 -1
- package/dist/server/lib/types.js +1 -0
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/lib/workloadExecutionEnvironment.js +2 -0
- package/dist/server/lib/workloadExecutionEnvironment.js.map +1 -0
- package/dist/server/lib/workspaceIdentity.js +30 -6
- package/dist/server/lib/workspaceIdentity.js.map +1 -1
- package/dist/server/workers/build.js +150 -9
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/chat.js +142 -15
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/followUp.js +97 -28
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/plan.js +295 -48
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/planFollowUp.js +77 -7
- package/dist/server/workers/planFollowUp.js.map +1 -1
- package/dist/server/workers/review.js +149 -38
- package/dist/server/workers/review.js.map +1 -1
- package/dist/server/workers/specReview.js +43 -5
- package/dist/server/workers/specReview.js.map +1 -1
- package/dist/server/workers/specSession.js +156 -31
- package/dist/server/workers/specSession.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/GitHubActionsDialog-BFCqikDY.js +0 -1
- package/dist/client/assets/VerificationDialog-B1_6HMdt.js +0 -4
- package/dist/client/assets/channel-BfskvH2B.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-D4HPfxL3.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DQQ_WqAU.js +0 -1
- package/dist/client/assets/index-CZ1z72fo.js +0 -276
- package/dist/client/assets/index-SMj5ZmMs.css +0 -2
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Cv8cmDfz.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentProvider.js","sourceRoot":"","sources":["../../../server/lib/agentProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AACjH,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAC7G,OAAO,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAA;AAG9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;
|
|
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 {
|
|
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 !==
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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 =
|
|
154
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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,23 +566,28 @@ 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
574
|
&& !input.pinnedEnvironmentId) {
|
|
416
|
-
const requestedProvider = input.
|
|
575
|
+
const requestedProvider = input.workload === 'check'
|
|
576
|
+
? null
|
|
577
|
+
: input.agent === 'opencode' ? getModelProvider(input.model) : 'anthropic';
|
|
417
578
|
try {
|
|
418
579
|
await prepareAndValidateExecutionEnvironmentForTarget({
|
|
419
580
|
projectId: input.project.id,
|
|
420
581
|
agent: input.agent,
|
|
421
582
|
provider: requestedProvider,
|
|
422
|
-
model: input.
|
|
583
|
+
model: input.workload !== 'check' && input.agent === 'opencode'
|
|
584
|
+
? normalizeModelId(input.model) || null
|
|
585
|
+
: null,
|
|
423
586
|
target: input.target,
|
|
424
587
|
initiatedBy: 'automation',
|
|
425
588
|
signal: input.signal,
|
|
426
589
|
profileRevision,
|
|
590
|
+
workload: input.workload,
|
|
427
591
|
}, {
|
|
428
592
|
adapter: dependencies.adapter,
|
|
429
593
|
runtimeController: dependencies.runtimeController,
|
|
@@ -434,7 +598,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
434
598
|
catch (preparationError) {
|
|
435
599
|
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
600
|
}
|
|
437
|
-
environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
|
|
601
|
+
environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.workload, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
|
|
438
602
|
}
|
|
439
603
|
else if (!shouldRetryValidation(error)) {
|
|
440
604
|
throw error;
|
|
@@ -454,6 +618,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
454
618
|
signal: input.signal,
|
|
455
619
|
dependencies,
|
|
456
620
|
profileRevision,
|
|
621
|
+
workload: input.workload,
|
|
457
622
|
});
|
|
458
623
|
validatedDuringResolution = true;
|
|
459
624
|
}
|
|
@@ -463,7 +628,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
463
628
|
}
|
|
464
629
|
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
630
|
}
|
|
466
|
-
environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
|
|
631
|
+
environment = resolveValidatedEnvironment(input.project, input.agent, input.target, input.model ?? null, profileRevision, input.workload, input.pinnedEnvironmentId, input.pinnedEnvironmentRevision, input.pinnedEnvironmentValidationFingerprint);
|
|
467
632
|
}
|
|
468
633
|
}
|
|
469
634
|
}
|
|
@@ -476,7 +641,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
476
641
|
|| environment.environment_validation_fingerprint !== input.pinnedEnvironmentValidationFingerprint)) {
|
|
477
642
|
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
643
|
}
|
|
479
|
-
if (!validatedDuringResolution) {
|
|
644
|
+
if (!validatedDuringResolution && input.workload !== 'check') {
|
|
480
645
|
try {
|
|
481
646
|
await validateBuildProvider({
|
|
482
647
|
project: input.project,
|
|
@@ -487,29 +652,46 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
487
652
|
signal: input.signal,
|
|
488
653
|
dependencies,
|
|
489
654
|
profileRevision,
|
|
655
|
+
workload: input.workload,
|
|
490
656
|
});
|
|
491
657
|
}
|
|
492
658
|
catch (error) {
|
|
493
659
|
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
660
|
}
|
|
495
661
|
}
|
|
496
|
-
const validation = getLatestValidation(input.project.id, environment.id, input.agent, modelProvider);
|
|
662
|
+
const validation = getLatestValidation(input.project.id, environment.id, input.agent, modelProvider, input.workload);
|
|
497
663
|
const credentialCapability = validation
|
|
498
|
-
? getValidationCredentialCapability(input.project.id, environment.id, validation.id)
|
|
664
|
+
? getValidationCredentialCapability(input.project.id, environment.id, validation.id, input.workload)
|
|
499
665
|
: null;
|
|
500
666
|
const authority = createAuthority(environment, input.agent, resolveEnvironmentCredentialEvidence({
|
|
501
667
|
profileRevision,
|
|
502
668
|
agent: input.agent,
|
|
503
669
|
modelProvider,
|
|
504
670
|
credentialCapability,
|
|
671
|
+
workload: input.workload,
|
|
505
672
|
}));
|
|
506
673
|
try {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
674
|
+
const existingBinding = getExecutionEnvironmentBindingForRun(input.project.id, input.executionRunId);
|
|
675
|
+
if (existingBinding?.released_at === null) {
|
|
676
|
+
const existingAuthority = existingBinding.authority_json
|
|
677
|
+
? JSON.parse(existingBinding.authority_json)
|
|
678
|
+
: null;
|
|
679
|
+
if (existingBinding.environment_id !== environment.id
|
|
680
|
+
|| existingBinding.environment_revision !== environment.environment_revision
|
|
681
|
+
|| existingBinding.environment_validation_fingerprint !== environment.environment_validation_fingerprint
|
|
682
|
+
|| existingBinding.execution_profile_fingerprint !== environment.execution_profile_fingerprint
|
|
683
|
+
|| !isDeepStrictEqual(existingAuthority, authority)) {
|
|
684
|
+
throw new Error('The retained execution environment lease does not match current authority');
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
else {
|
|
688
|
+
acquireExecutionEnvironmentLease({
|
|
689
|
+
projectId: input.project.id,
|
|
690
|
+
environmentId: environment.id,
|
|
691
|
+
executionRunId: input.executionRunId,
|
|
692
|
+
authority,
|
|
693
|
+
});
|
|
694
|
+
}
|
|
513
695
|
}
|
|
514
696
|
catch (error) {
|
|
515
697
|
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 +766,16 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
584
766
|
try {
|
|
585
767
|
await ensureDockerSandboxRuntimeReady(dependencies, input.signal);
|
|
586
768
|
await reconnectAndInspectDockerSandbox(environment, dependencies, input.signal);
|
|
769
|
+
if (environment.lifecycle_state === 'stopped') {
|
|
770
|
+
transitionExecutionEnvironment({
|
|
771
|
+
projectId: input.project.id,
|
|
772
|
+
environmentId: environment.id,
|
|
773
|
+
state: 'ready',
|
|
774
|
+
eventType: 'environment_execution_reconnected',
|
|
775
|
+
message: 'Docker Sandbox was reconnected for workload execution.',
|
|
776
|
+
metadata: { executionRunId: input.executionRunId },
|
|
777
|
+
});
|
|
778
|
+
}
|
|
587
779
|
}
|
|
588
780
|
catch (error) {
|
|
589
781
|
if (input.signal?.aborted) {
|
|
@@ -721,6 +913,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
721
913
|
environment,
|
|
722
914
|
credentialCapability,
|
|
723
915
|
networkEvidence,
|
|
916
|
+
workload: input.workload,
|
|
724
917
|
});
|
|
725
918
|
}
|
|
726
919
|
catch (error) {
|
|
@@ -744,6 +937,7 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
744
937
|
binding: {
|
|
745
938
|
environmentId: environment.id,
|
|
746
939
|
environmentRevision: environment.environment_revision,
|
|
940
|
+
providerVersion: environment.provider_version,
|
|
747
941
|
executionRunId: input.executionRunId,
|
|
748
942
|
target: input.target,
|
|
749
943
|
sandbox: expected,
|
|
@@ -766,12 +960,14 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
766
960
|
return null;
|
|
767
961
|
}
|
|
768
962
|
try {
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
963
|
+
if (placement.executionRunId === input.executionRunId) {
|
|
964
|
+
captureExecutionEnvironmentPlacement({
|
|
965
|
+
projectId: input.project.id,
|
|
966
|
+
environmentId: environment.id,
|
|
967
|
+
executionRunId: input.executionRunId,
|
|
968
|
+
placement,
|
|
969
|
+
});
|
|
970
|
+
}
|
|
775
971
|
transitionExecutionEnvironment({
|
|
776
972
|
projectId: input.project.id,
|
|
777
973
|
environmentId: environment.id,
|
|
@@ -816,4 +1012,5 @@ export const resolveBuildExecutionEnvironment = async (input) => {
|
|
|
816
1012
|
release,
|
|
817
1013
|
};
|
|
818
1014
|
};
|
|
1015
|
+
export const resolveBuildExecutionEnvironment = (input) => resolveWorkloadExecutionEnvironment({ ...input, workload: 'build' });
|
|
819
1016
|
//# sourceMappingURL=buildExecutionEnvironment.js.map
|