@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":"dockerSandboxEnvironmentOperations.js","sourceRoot":"","sources":["../../../server/lib/dockerSandboxEnvironmentOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"dockerSandboxEnvironmentOperations.js","sourceRoot":"","sources":["../../../server/lib/dockerSandboxEnvironmentOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,38 +6,20 @@ import { promisify } from 'node:util';
|
|
|
6
6
|
import { networkDestinationTarget } from './executionEnvironmentLifecycle.js';
|
|
7
7
|
import { requireExecutionCapabilities } from './executionEnvironmentLifecycle.js';
|
|
8
8
|
import { assertExactSandboxNetworkAllowlist, applyScopedNetworkRules as applyScopedSandboxNetworkRules, checkDestinationAccess as checkSandboxDestinationAccess, inspectGlobalNetworkPosture as inspectSandboxGlobalNetworkPosture, inspectSandboxNetworkRules as inspectScopedSandboxNetworkRules, removeScopedNetworkRules as removeScopedSandboxNetworkRules, } from './dockerSandboxNetworkPolicy.js';
|
|
9
|
+
import { RECOMMENDED_DOCKER_SANDBOX_RELEASE, inspectDockerSandboxRelease, isDockerSandboxReleaseHostQualified, resolveDockerSandboxReleaseProfile, } from './dockerSandboxReleaseProfiles.js';
|
|
9
10
|
export const DOCKER_SANDBOX_PROVIDER = 'docker_sandbox';
|
|
10
|
-
export const QUALIFIED_SBX_VERSION =
|
|
11
|
-
export const QUALIFIED_SBX_BUILD =
|
|
12
|
-
export const DOCKER_SANDBOX_ADAPTER_CONTRACT_VERSION =
|
|
11
|
+
export const QUALIFIED_SBX_VERSION = RECOMMENDED_DOCKER_SANDBOX_RELEASE.version;
|
|
12
|
+
export const QUALIFIED_SBX_BUILD = RECOMMENDED_DOCKER_SANDBOX_RELEASE.acceptedBuilds[0];
|
|
13
|
+
export const DOCKER_SANDBOX_ADAPTER_CONTRACT_VERSION = RECOMMENDED_DOCKER_SANDBOX_RELEASE.adapterContractVersion;
|
|
13
14
|
export const DOCKER_SANDBOX_MAX_NAME_BYTES = 63;
|
|
14
|
-
export const QUALIFIED_DOCKER_SANDBOX_TEMPLATES =
|
|
15
|
-
opencode: 'docker.io/docker/sandbox-templates@sha256:b2176d0fdd0cf17754b3b9dff13a69bff003d608e43360687b00ce86d2c749d9',
|
|
16
|
-
claude: 'docker.io/docker/sandbox-templates@sha256:7fa049b8d7a0cf10f6a4200148ee475e94fc4fb5ef50dfacc4257699cb9a34bc',
|
|
17
|
-
};
|
|
15
|
+
export const QUALIFIED_DOCKER_SANDBOX_TEMPLATES = RECOMMENDED_DOCKER_SANDBOX_RELEASE.templates;
|
|
18
16
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
19
17
|
const DEFAULT_OUTPUT_LIMIT_BYTES = 256 * 1024;
|
|
20
18
|
const SANDBOX_NAME_HASH_LENGTH = 16;
|
|
21
|
-
const MINIMUM_MACOS_MAJOR = 14;
|
|
22
19
|
const KVM_DEVICE_PATH = '/dev/kvm';
|
|
23
20
|
const execFile = promisify(execFileCallback);
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
{ platform: 'darwin', architecture: 'arm64' },
|
|
27
|
-
];
|
|
28
|
-
export const isQualifiedDockerSandboxHost = (platform, architecture) => QUALIFIED_DOCKER_SANDBOX_HOSTS.some(host => host.platform === platform && host.architecture === architecture);
|
|
29
|
-
export const dockerSandboxExecutionEnvironmentCapabilities = {
|
|
30
|
-
isolation: 'microvm',
|
|
31
|
-
directWritableWorkspace: 'supported',
|
|
32
|
-
transparentHeadlessStreams: 'supported',
|
|
33
|
-
credentialBrokering: 'supported',
|
|
34
|
-
enforcedNetworkAllowlist: 'unknown',
|
|
35
|
-
persistentEnvironments: 'supported',
|
|
36
|
-
resourceIsolation: 'unknown',
|
|
37
|
-
nestedContainers: 'unsupported',
|
|
38
|
-
publishedPorts: 'unsupported',
|
|
39
|
-
resourceControls: 'unsupported',
|
|
40
|
-
};
|
|
21
|
+
export const isQualifiedDockerSandboxHost = (platform, architecture) => isDockerSandboxReleaseHostQualified(RECOMMENDED_DOCKER_SANDBOX_RELEASE, platform, architecture);
|
|
22
|
+
export const dockerSandboxExecutionEnvironmentCapabilities = RECOMMENDED_DOCKER_SANDBOX_RELEASE.capabilities;
|
|
41
23
|
export const deriveDockerSandboxGlobalNetworkPosture = (readiness) => readiness.observations.some(observation => (observation.code === 'network_policy' && observation.state === 'ready'))
|
|
42
24
|
? 'restrictive'
|
|
43
25
|
: 'unobserved';
|
|
@@ -45,9 +27,12 @@ export const deriveDockerSandboxExecutionEnvironmentCapabilities = (posture) =>
|
|
|
45
27
|
...dockerSandboxExecutionEnvironmentCapabilities,
|
|
46
28
|
enforcedNetworkAllowlist: posture === 'restrictive' ? 'supported' : 'unknown',
|
|
47
29
|
});
|
|
48
|
-
export const dockerSandboxExecutionEnvironmentObservation = (posture = 'unobserved') => ({
|
|
49
|
-
providerVersion:
|
|
50
|
-
capabilities:
|
|
30
|
+
export const dockerSandboxExecutionEnvironmentObservation = (posture = 'unobserved', profile = RECOMMENDED_DOCKER_SANDBOX_RELEASE) => ({
|
|
31
|
+
providerVersion: profile.version,
|
|
32
|
+
capabilities: {
|
|
33
|
+
...profile.capabilities,
|
|
34
|
+
enforcedNetworkAllowlist: posture === 'restrictive' ? 'supported' : 'unknown',
|
|
35
|
+
},
|
|
51
36
|
degradationReasons: posture === 'restrictive'
|
|
52
37
|
? []
|
|
53
38
|
: ['The selected direct workspace remains writable from the sandbox.'],
|
|
@@ -209,20 +194,31 @@ export const parseJsonObject = (command, output) => {
|
|
|
209
194
|
}
|
|
210
195
|
return record;
|
|
211
196
|
};
|
|
212
|
-
export const
|
|
197
|
+
export const parseSbxVersionIdentity = (output) => {
|
|
213
198
|
const match = /^sbx version: v(\d+\.\d+\.\d+) ([0-9a-f]{40})\r?\n?$/.exec(output);
|
|
214
199
|
if (!match) {
|
|
215
200
|
throw new SbxContractFailure('version', 'sbx version output did not match the qualified contract');
|
|
216
201
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
202
|
+
return { version: match[1], build: match[2] };
|
|
203
|
+
};
|
|
204
|
+
export const parseQualifiedSbxRelease = (output) => {
|
|
205
|
+
const identity = parseSbxVersionIdentity(output);
|
|
206
|
+
const profile = resolveDockerSandboxReleaseProfile(identity.version, identity.build);
|
|
207
|
+
if (!profile) {
|
|
208
|
+
const release = inspectDockerSandboxRelease(identity.version, identity.build);
|
|
209
|
+
throw new SbxContractFailure('version', release.status === 'security_blocked'
|
|
210
|
+
? release.reason ?? `Docker Sandbox ${identity.version} is blocked due to a security issue.`
|
|
211
|
+
: release.reason ?? `Unsupported sbx release ${identity.version} build ${identity.build}`);
|
|
222
212
|
}
|
|
223
|
-
return
|
|
213
|
+
return profile;
|
|
224
214
|
};
|
|
225
|
-
export const
|
|
215
|
+
export const parseQualifiedSbxVersion = (output) => {
|
|
216
|
+
return parseQualifiedSbxRelease(output).version;
|
|
217
|
+
};
|
|
218
|
+
export const parseSbxDiagnostics = (output, profile = RECOMMENDED_DOCKER_SANDBOX_RELEASE) => {
|
|
219
|
+
if (profile.parserContracts.diagnostics !== 'v0.38.0') {
|
|
220
|
+
throw new SbxContractFailure('diagnose', `No diagnostics parser is registered for ${profile.id}`);
|
|
221
|
+
}
|
|
226
222
|
const record = parseJsonObject('diagnose', output);
|
|
227
223
|
if (record.version !== '1.0' || !Array.isArray(record.checks)) {
|
|
228
224
|
throw new SbxContractFailure('diagnose', 'sbx diagnose returned an unsupported schema');
|
|
@@ -272,7 +268,10 @@ const QUALIFIED_NETWORK_POLICY_STRING_FIELDS = [
|
|
|
272
268
|
'layer',
|
|
273
269
|
'status',
|
|
274
270
|
];
|
|
275
|
-
export const parseSbxNetworkPolicy = (output) => {
|
|
271
|
+
export const parseSbxNetworkPolicy = (output, profile = RECOMMENDED_DOCKER_SANDBOX_RELEASE) => {
|
|
272
|
+
if (profile.parserContracts.networkPolicy !== 'v0.38.0') {
|
|
273
|
+
throw new SbxContractFailure('policy list', `No network policy parser is registered for ${profile.id}`);
|
|
274
|
+
}
|
|
276
275
|
const record = parseJsonObject('policy list', output);
|
|
277
276
|
if (Object.keys(record).some(field => field !== 'rules')
|
|
278
277
|
|| !Array.isArray(record.rules)
|
|
@@ -336,8 +335,8 @@ const macOsMajorVersion = (version) => {
|
|
|
336
335
|
const match = /^(\d+)(?:\.|$)/.exec(version);
|
|
337
336
|
return match ? Number(match[1]) : null;
|
|
338
337
|
};
|
|
339
|
-
const probeDockerSandboxPlatformReadiness = async (platform, architecture, options) => {
|
|
340
|
-
if (!
|
|
338
|
+
const probeDockerSandboxPlatformReadiness = async (platform, architecture, options, profile) => {
|
|
339
|
+
if (!isDockerSandboxReleaseHostQualified(profile, platform, architecture)) {
|
|
341
340
|
return {
|
|
342
341
|
code: 'platform',
|
|
343
342
|
state: 'unsupported',
|
|
@@ -365,7 +364,7 @@ const probeDockerSandboxPlatformReadiness = async (platform, architecture, optio
|
|
|
365
364
|
remediation: 'Run macOS Sonoma 14 or later on Apple silicon, then recheck.',
|
|
366
365
|
};
|
|
367
366
|
}
|
|
368
|
-
if (majorVersion <
|
|
367
|
+
if (majorVersion < profile.minimumMacosMajor) {
|
|
369
368
|
return {
|
|
370
369
|
code: 'platform',
|
|
371
370
|
state: 'unsupported',
|
|
@@ -464,6 +463,9 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
464
463
|
const architecture = options.architecture ?? process.arch;
|
|
465
464
|
const observations = [];
|
|
466
465
|
let providerVersion = null;
|
|
466
|
+
let providerBuild = null;
|
|
467
|
+
let releaseStatus = null;
|
|
468
|
+
let releaseProfile = null;
|
|
467
469
|
let versionResult;
|
|
468
470
|
try {
|
|
469
471
|
versionResult = await runner.run(['version'], options);
|
|
@@ -473,6 +475,9 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
473
475
|
if (error instanceof SbxCommandFailure && error.kind === 'missing_cli') {
|
|
474
476
|
return {
|
|
475
477
|
providerVersion: null,
|
|
478
|
+
providerBuild: null,
|
|
479
|
+
releaseStatus: null,
|
|
480
|
+
recommendedVersion: RECOMMENDED_DOCKER_SANDBOX_RELEASE.version,
|
|
476
481
|
observations: [
|
|
477
482
|
{ code: 'cli', state: 'not_ready', summary: 'sbx CLI is not installed.', remediation: 'Install the qualified sbx release from Docker.' },
|
|
478
483
|
...['version', 'platform', 'virtualization', 'daemon', 'docker_login', 'network_policy', 'opencode_template', 'claude_template']
|
|
@@ -486,8 +491,25 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
486
491
|
if (versionResult.exitCode !== 0) {
|
|
487
492
|
throw new SbxContractFailure('version', `sbx version exited with code ${versionResult.exitCode}`);
|
|
488
493
|
}
|
|
489
|
-
|
|
490
|
-
|
|
494
|
+
const identity = parseSbxVersionIdentity(versionResult.stdout);
|
|
495
|
+
providerVersion = identity.version;
|
|
496
|
+
providerBuild = identity.build;
|
|
497
|
+
const release = inspectDockerSandboxRelease(identity.version, identity.build);
|
|
498
|
+
releaseStatus = release.status;
|
|
499
|
+
releaseProfile = release.profile;
|
|
500
|
+
if (!releaseProfile || release.status === 'security_blocked') {
|
|
501
|
+
throw new SbxContractFailure('version', release.reason ?? `Docker Sandbox ${identity.version} is unsupported.`);
|
|
502
|
+
}
|
|
503
|
+
observations.push({
|
|
504
|
+
code: 'version',
|
|
505
|
+
state: 'ready',
|
|
506
|
+
summary: release.status === 'deprecated'
|
|
507
|
+
? `sbx ${providerVersion} is qualified but deprecated.`
|
|
508
|
+
: `sbx ${providerVersion} is qualified and recommended.`,
|
|
509
|
+
remediation: release.status === 'deprecated'
|
|
510
|
+
? `Upgrade to sbx ${RECOMMENDED_DOCKER_SANDBOX_RELEASE.version}.`
|
|
511
|
+
: null,
|
|
512
|
+
});
|
|
491
513
|
}
|
|
492
514
|
catch (error) {
|
|
493
515
|
observations.push({
|
|
@@ -497,14 +519,30 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
497
519
|
remediation: `Install sbx ${QUALIFIED_SBX_VERSION}.`,
|
|
498
520
|
});
|
|
499
521
|
}
|
|
500
|
-
|
|
522
|
+
if (!releaseProfile || releaseStatus === 'security_blocked') {
|
|
523
|
+
observations.push(...['platform', 'virtualization', 'daemon', 'docker_login', 'network_policy', 'opencode_template', 'claude_template']
|
|
524
|
+
.map(code => ({
|
|
525
|
+
code,
|
|
526
|
+
state: 'unknown',
|
|
527
|
+
summary: 'Not checked because the installed sbx release is not supported.',
|
|
528
|
+
remediation: null,
|
|
529
|
+
})));
|
|
530
|
+
return {
|
|
531
|
+
providerVersion,
|
|
532
|
+
providerBuild,
|
|
533
|
+
releaseStatus: releaseStatus ?? 'unsupported',
|
|
534
|
+
recommendedVersion: RECOMMENDED_DOCKER_SANDBOX_RELEASE.version,
|
|
535
|
+
observations,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
const platformObservation = await probeDockerSandboxPlatformReadiness(platform, architecture, options, releaseProfile);
|
|
501
539
|
observations.push(platformObservation);
|
|
502
540
|
observations.push(await probeDockerSandboxVirtualizationReadiness(platform, architecture, platformObservation, options.kvmAccess));
|
|
503
541
|
const diagnose = await runner.run(['diagnose', '--output', 'json'], options);
|
|
504
542
|
if (diagnose.exitCode !== 0 && diagnose.stdout.trim().length === 0) {
|
|
505
543
|
throw new SbxContractFailure('diagnose', 'sbx diagnose failed without structured output');
|
|
506
544
|
}
|
|
507
|
-
const checks = parseSbxDiagnostics(diagnose.stdout);
|
|
545
|
+
const checks = parseSbxDiagnostics(diagnose.stdout, releaseProfile);
|
|
508
546
|
observations.push(diagnosticObservation(checks, 'daemon', ['daemon'], 'Daemon readiness was not reported.'));
|
|
509
547
|
observations.push(diagnosticObservation(checks, 'docker_login', ['authentication'], 'Docker login readiness was not reported.'));
|
|
510
548
|
const daemonReady = observations.some(observation => observation.code === 'daemon' && observation.state === 'ready');
|
|
@@ -521,7 +559,7 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
521
559
|
}
|
|
522
560
|
else {
|
|
523
561
|
try {
|
|
524
|
-
const rules = parseSbxNetworkPolicy(policy.stdout);
|
|
562
|
+
const rules = parseSbxNetworkPolicy(policy.stdout, releaseProfile);
|
|
525
563
|
const activeGlobalNetworkRules = rules.filter(rule => (rule.scope === 'global'
|
|
526
564
|
&& rule.resourceType === 'network'
|
|
527
565
|
&& rule.status === 'active')).length;
|
|
@@ -564,7 +602,13 @@ export const probeDockerSandboxReadiness = async (runner, options = {}) => {
|
|
|
564
602
|
remediation: 'Review qualified template output before enabling this capability.',
|
|
565
603
|
});
|
|
566
604
|
}
|
|
567
|
-
return {
|
|
605
|
+
return {
|
|
606
|
+
providerVersion,
|
|
607
|
+
providerBuild,
|
|
608
|
+
releaseStatus,
|
|
609
|
+
recommendedVersion: RECOMMENDED_DOCKER_SANDBOX_RELEASE.version,
|
|
610
|
+
observations,
|
|
611
|
+
};
|
|
568
612
|
};
|
|
569
613
|
const slug = (value, maximum) => {
|
|
570
614
|
const normalized = value.toLowerCase().replace(/[^a-z0-9.-]+/g, '-').replace(/^[^a-z0-9]+|[^a-z0-9]+$/g, '');
|
|
@@ -630,7 +674,10 @@ const resolveInspectionTemplate = (image, imageDigest) => {
|
|
|
630
674
|
: image;
|
|
631
675
|
return `${repository}@${imageDigest}`;
|
|
632
676
|
};
|
|
633
|
-
export const parseDockerSandboxInspection = (output) => {
|
|
677
|
+
export const parseDockerSandboxInspection = (output, profile = RECOMMENDED_DOCKER_SANDBOX_RELEASE) => {
|
|
678
|
+
if (profile.parserContracts.inspection !== 'v0.38.0') {
|
|
679
|
+
throw new SbxContractFailure('inspect', `No inspection parser is registered for ${profile.id}`);
|
|
680
|
+
}
|
|
634
681
|
const record = parseJsonObject('inspect', output);
|
|
635
682
|
const fields = Object.keys(record).sort();
|
|
636
683
|
const workspace = record.workspace;
|
|
@@ -670,12 +717,22 @@ export const requireSuccessfulCommand = (command, result) => {
|
|
|
670
717
|
throw new SbxContractFailure(command, exitCodeFailureMessage(command, result));
|
|
671
718
|
}
|
|
672
719
|
};
|
|
673
|
-
const
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
720
|
+
const requireReleaseCommandContract = (profile, contract) => {
|
|
721
|
+
if (!profile.commandContracts.includes(contract)) {
|
|
722
|
+
throw new SbxContractFailure(contract, `Docker Sandbox release ${profile.id} does not qualify the ${contract} command`);
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
const isQualifiedMissingSandboxResult = (result, profile) => {
|
|
726
|
+
if (profile.parserContracts.missingSandbox !== 'v0.38.0') {
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
return result.args[0] === 'inspect'
|
|
730
|
+
&& typeof result.args[1] === 'string'
|
|
731
|
+
&& result.args[1].length > 0
|
|
732
|
+
&& result.exitCode === 1
|
|
733
|
+
&& result.stdout === ''
|
|
734
|
+
&& result.stderr === `ERROR: sandbox '${result.args[1]}' not found\n`;
|
|
735
|
+
};
|
|
679
736
|
export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) => {
|
|
680
737
|
let qualification = null;
|
|
681
738
|
const waitForQualification = (operation, signal) => {
|
|
@@ -690,9 +747,9 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
690
747
|
reject(new SbxCommandFailure('cancelled', ['version'], 'sbx version qualification was cancelled'));
|
|
691
748
|
};
|
|
692
749
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
693
|
-
operation.then(
|
|
750
|
+
operation.then(profile => {
|
|
694
751
|
signal.removeEventListener('abort', onAbort);
|
|
695
|
-
resolve();
|
|
752
|
+
resolve(profile);
|
|
696
753
|
}, error => {
|
|
697
754
|
signal.removeEventListener('abort', onAbort);
|
|
698
755
|
reject(error);
|
|
@@ -702,9 +759,6 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
702
759
|
const ensureQualified = (options) => {
|
|
703
760
|
const platform = qualificationOptions.platform ?? process.platform;
|
|
704
761
|
const architecture = qualificationOptions.architecture ?? process.arch;
|
|
705
|
-
if (!isQualifiedDockerSandboxHost(platform, architecture)) {
|
|
706
|
-
throw new SbxContractFailure('platform', `Unsupported sbx platform ${platform}/${architecture}; Archon requires linux/x64 or darwin/arm64`);
|
|
707
|
-
}
|
|
708
762
|
if (!qualification) {
|
|
709
763
|
const qualificationCommandOptions = {
|
|
710
764
|
timeoutMs: options.timeoutMs,
|
|
@@ -713,7 +767,11 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
713
767
|
};
|
|
714
768
|
const attempt = runner.run(['version'], qualificationCommandOptions).then(result => {
|
|
715
769
|
requireSuccessfulCommand('version', result);
|
|
716
|
-
|
|
770
|
+
const profile = parseQualifiedSbxRelease(result.stdout);
|
|
771
|
+
if (!isDockerSandboxReleaseHostQualified(profile, platform, architecture)) {
|
|
772
|
+
throw new SbxContractFailure('platform', `Unsupported sbx platform ${platform}/${architecture} for ${profile.version}`);
|
|
773
|
+
}
|
|
774
|
+
return profile;
|
|
717
775
|
});
|
|
718
776
|
qualification = attempt.catch(error => {
|
|
719
777
|
qualification = null;
|
|
@@ -723,25 +781,34 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
723
781
|
return waitForQualification(qualification, options.signal);
|
|
724
782
|
};
|
|
725
783
|
const inspect = async (name, options = {}) => {
|
|
726
|
-
await ensureQualified(options);
|
|
784
|
+
const profile = await ensureQualified(options);
|
|
785
|
+
requireReleaseCommandContract(profile, 'inspect');
|
|
727
786
|
const result = await runner.run(['inspect', name, '--json'], options);
|
|
728
787
|
if (result.exitCode !== 0) {
|
|
729
|
-
if (isQualifiedMissingSandboxResult(result)) {
|
|
788
|
+
if (isQualifiedMissingSandboxResult(result, profile)) {
|
|
730
789
|
return null;
|
|
731
790
|
}
|
|
732
791
|
throw new SbxContractFailure('inspect', exitCodeFailureMessage('inspect', result));
|
|
733
792
|
}
|
|
734
|
-
return parseDockerSandboxInspection(result.stdout);
|
|
793
|
+
return parseDockerSandboxInspection(result.stdout, profile);
|
|
735
794
|
};
|
|
736
|
-
const
|
|
795
|
+
const inspectExpected = async (expected, options) => {
|
|
737
796
|
const observed = await inspect(expected.name, options);
|
|
797
|
+
if (observed) {
|
|
798
|
+
assertInspectionMatches(expected, observed);
|
|
799
|
+
}
|
|
800
|
+
return observed;
|
|
801
|
+
};
|
|
802
|
+
const requireExpected = async (expected, options) => {
|
|
803
|
+
const observed = await inspectExpected(expected, options);
|
|
738
804
|
if (!observed) {
|
|
739
805
|
throw new SbxContractFailure('inspect', `Sandbox ${expected.name} does not exist`);
|
|
740
806
|
}
|
|
741
|
-
assertInspectionMatches(expected, observed);
|
|
742
807
|
return observed;
|
|
743
808
|
};
|
|
744
809
|
const reconnect = async (expected, options = {}) => {
|
|
810
|
+
const profile = await ensureQualified(options);
|
|
811
|
+
requireReleaseCommandContract(profile, 'exec');
|
|
745
812
|
let observed = await requireExpected(expected, options);
|
|
746
813
|
if (observed.state === 'stopped') {
|
|
747
814
|
const result = await runner.run(['exec', observed.name, '--', 'true'], options);
|
|
@@ -752,6 +819,8 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
752
819
|
};
|
|
753
820
|
return {
|
|
754
821
|
create: async (request, options = {}) => {
|
|
822
|
+
const profile = await ensureQualified(options);
|
|
823
|
+
requireReleaseCommandContract(profile, 'create');
|
|
755
824
|
const name = createDockerSandboxName(request.identity);
|
|
756
825
|
const existing = await inspect(name, options);
|
|
757
826
|
const expected = { name, agent: request.agent, workspacePath: request.workspacePath, template: request.template };
|
|
@@ -768,43 +837,89 @@ export const createDockerSandboxAdapter = (runner, qualificationOptions = {}) =>
|
|
|
768
837
|
inspect,
|
|
769
838
|
reconnect,
|
|
770
839
|
exec: async (expected, command, args, options = {}) => {
|
|
840
|
+
const profile = await ensureQualified(options);
|
|
841
|
+
requireReleaseCommandContract(profile, 'exec');
|
|
771
842
|
await requireExpected(expected, options);
|
|
772
843
|
const workdir = options.cwd === undefined ? [] : ['--workdir', options.cwd];
|
|
773
844
|
return runner.run(['exec', ...workdir, expected.name, '--', command, ...args], options);
|
|
774
845
|
},
|
|
775
846
|
stop: async (expected, options = {}) => {
|
|
776
|
-
|
|
847
|
+
const profile = await ensureQualified(options);
|
|
848
|
+
requireReleaseCommandContract(profile, 'stop');
|
|
849
|
+
let observed = await inspectExpected(expected, options);
|
|
850
|
+
if (!observed) {
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
777
853
|
if (observed.state === 'running') {
|
|
778
|
-
|
|
779
|
-
|
|
854
|
+
try {
|
|
855
|
+
requireSuccessfulCommand('stop', await runner.run(['stop', expected.name], options));
|
|
856
|
+
}
|
|
857
|
+
catch (error) {
|
|
858
|
+
try {
|
|
859
|
+
if (!await inspectExpected(expected, options)) {
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
catch {
|
|
864
|
+
// Preserve the original stop failure when the follow-up inspection cannot be completed.
|
|
865
|
+
}
|
|
866
|
+
throw error;
|
|
867
|
+
}
|
|
868
|
+
observed = await inspectExpected(expected, options);
|
|
869
|
+
if (!observed) {
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
780
872
|
}
|
|
781
873
|
if (observed.state !== 'stopped') {
|
|
782
874
|
throw new DockerSandboxStopVerificationFailure(`Sandbox ${expected.name} did not reach the stopped state`);
|
|
783
875
|
}
|
|
784
876
|
},
|
|
785
877
|
remove: async (expected, options = {}) => {
|
|
786
|
-
await
|
|
787
|
-
|
|
878
|
+
const profile = await ensureQualified(options);
|
|
879
|
+
requireReleaseCommandContract(profile, 'remove');
|
|
880
|
+
const observed = await inspectExpected(expected, options);
|
|
881
|
+
if (!observed) {
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
try {
|
|
885
|
+
requireSuccessfulCommand('rm', await runner.run(['rm', '--force', expected.name], options));
|
|
886
|
+
}
|
|
887
|
+
catch (error) {
|
|
888
|
+
try {
|
|
889
|
+
if (!await inspectExpected(expected, options)) {
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
catch {
|
|
894
|
+
// Preserve the original removal failure when the follow-up inspection cannot be completed.
|
|
895
|
+
}
|
|
896
|
+
throw error;
|
|
897
|
+
}
|
|
788
898
|
},
|
|
789
899
|
applyScopedNetworkRules: async (sandboxName, resources, options = {}) => {
|
|
790
|
-
await ensureQualified(options);
|
|
791
|
-
|
|
900
|
+
const profile = await ensureQualified(options);
|
|
901
|
+
requireReleaseCommandContract(profile, 'policy-allow');
|
|
902
|
+
return applyScopedSandboxNetworkRules(runner, sandboxName, resources, options, profile);
|
|
792
903
|
},
|
|
793
904
|
inspectSandboxNetworkRules: async (sandboxName, options = {}) => {
|
|
794
|
-
await ensureQualified(options);
|
|
795
|
-
|
|
905
|
+
const profile = await ensureQualified(options);
|
|
906
|
+
requireReleaseCommandContract(profile, 'policy-list');
|
|
907
|
+
return inspectScopedSandboxNetworkRules(runner, sandboxName, options, profile);
|
|
796
908
|
},
|
|
797
909
|
inspectGlobalNetworkPosture: async (options = {}) => {
|
|
798
|
-
await ensureQualified(options);
|
|
799
|
-
|
|
910
|
+
const profile = await ensureQualified(options);
|
|
911
|
+
requireReleaseCommandContract(profile, 'policy-list');
|
|
912
|
+
return inspectSandboxGlobalNetworkPosture(runner, options, profile);
|
|
800
913
|
},
|
|
801
914
|
checkDestinationAccess: async (sandboxName, target, options = {}) => {
|
|
802
|
-
await ensureQualified(options);
|
|
803
|
-
|
|
915
|
+
const profile = await ensureQualified(options);
|
|
916
|
+
requireReleaseCommandContract(profile, 'policy-check');
|
|
917
|
+
return checkSandboxDestinationAccess(runner, sandboxName, target, options, profile);
|
|
804
918
|
},
|
|
805
919
|
removeScopedNetworkRules: async (sandboxName, ruleIds, options = {}) => {
|
|
806
|
-
await ensureQualified(options);
|
|
807
|
-
|
|
920
|
+
const profile = await ensureQualified(options);
|
|
921
|
+
requireReleaseCommandContract(profile, 'policy-remove');
|
|
922
|
+
return removeScopedSandboxNetworkRules(runner, sandboxName, ruleIds, options, profile);
|
|
808
923
|
},
|
|
809
924
|
};
|
|
810
925
|
};
|
|
@@ -896,6 +1011,7 @@ export const removeScopedRulesBestEffort = async (adapter, sandboxName, ownedRul
|
|
|
896
1011
|
return failures;
|
|
897
1012
|
};
|
|
898
1013
|
export const createDockerSandboxExecutionEnvironmentLifecycle = (dependencies) => {
|
|
1014
|
+
const releaseProfile = dependencies.releaseProfile ?? RECOMMENDED_DOCKER_SANDBOX_RELEASE;
|
|
899
1015
|
const appliedNetworkPolicies = new Map();
|
|
900
1016
|
const inspect = async (environment, options = {}) => {
|
|
901
1017
|
const expected = dependencies.resolveExpected(environment);
|
|
@@ -942,7 +1058,7 @@ export const createDockerSandboxExecutionEnvironmentLifecycle = (dependencies) =
|
|
|
942
1058
|
};
|
|
943
1059
|
return {
|
|
944
1060
|
prepare: async (request) => {
|
|
945
|
-
requireExecutionCapabilities(DOCKER_SANDBOX_PROVIDER, dockerSandboxExecutionEnvironmentObservation(), request.requiredCapabilities);
|
|
1061
|
+
requireExecutionCapabilities(DOCKER_SANDBOX_PROVIDER, dockerSandboxExecutionEnvironmentObservation('unobserved', releaseProfile), request.requiredCapabilities);
|
|
946
1062
|
if (!request.persistent) {
|
|
947
1063
|
throw new SbxContractFailure('create', 'Docker Sandbox lifecycle requires persistent environments');
|
|
948
1064
|
}
|
|
@@ -958,7 +1074,7 @@ export const createDockerSandboxExecutionEnvironmentLifecycle = (dependencies) =
|
|
|
958
1074
|
return {
|
|
959
1075
|
id: preparation.id,
|
|
960
1076
|
provider: DOCKER_SANDBOX_PROVIDER,
|
|
961
|
-
providerVersion:
|
|
1077
|
+
providerVersion: releaseProfile.version,
|
|
962
1078
|
externalId: sandbox.name,
|
|
963
1079
|
target: request.target,
|
|
964
1080
|
state: 'ready',
|