spawnfile 0.1.14 → 0.1.17
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/README.md +60 -159
- package/dist/audit/checksShared.d.ts +1 -1
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
- package/dist/auth/targetSecretSourceFsPublish.js +3 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
- package/dist/auth/targetSecretSourceFsRead.js +5 -14
- package/dist/auth/trainingAuth.d.ts +21 -0
- package/dist/auth/trainingAuth.js +86 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +9 -0
- package/dist/cli/canaryCutoverCommand.d.ts +2 -0
- package/dist/cli/canaryCutoverCommand.js +30 -0
- package/dist/cli/capabilitiesCommand.d.ts +3 -0
- package/dist/cli/capabilitiesCommand.js +12 -0
- package/dist/cli/capabilitiesReceipt.d.ts +56 -0
- package/dist/cli/capabilitiesReceipt.js +56 -0
- package/dist/cli/compileBuildCommands.js +13 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.js +19 -8
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +12 -3
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/paideiaDelegation.d.ts +17 -0
- package/dist/cli/paideiaDelegation.js +210 -0
- package/dist/cli/paideiaSupervisor.d.ts +17 -0
- package/dist/cli/paideiaSupervisor.js +48 -0
- package/dist/cli/productStateCloneCommand.d.ts +2 -0
- package/dist/cli/productStateCloneCommand.js +34 -0
- package/dist/cli/runCli.d.ts +13 -3
- package/dist/cli/runCli.js +37 -9
- package/dist/cli/targetCommands.d.ts +4 -7
- package/dist/cli/targetCommands.js +16 -46
- package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
- package/dist/cli/targetConfigPreparedPlan.js +74 -0
- package/dist/cli/targetConfigResolver.d.ts +3 -0
- package/dist/cli/targetConfigResolver.js +111 -0
- package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
- package/dist/cli/targetConfigResolverCommand.js +43 -0
- package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
- package/dist/cli/targetConfigResolverContracts.js +30 -0
- package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
- package/dist/cli/targetConfigResolverDocker.js +47 -0
- package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
- package/dist/cli/targetConfigResolverValidation.js +94 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
- package/dist/cli/targetDefaultAuthorities.js +3 -0
- package/dist/cli/targetDefaultConfig.d.ts +7 -0
- package/dist/cli/targetDefaultConfig.js +22 -5
- package/dist/cli/targetDefaultConfigStdin.js +7 -1
- package/dist/cli/targetDefaultHandlerFactory.js +23 -2
- package/dist/cli/targetDefaultHandlers.d.ts +2 -2
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.js +35 -6
- package/dist/cli/upLifecycleRecovery.d.ts +2 -2
- package/dist/cli/upLifecycleRecovery.js +188 -44
- package/dist/cli/usageCommand.d.ts +40 -0
- package/dist/cli/usageCommand.js +284 -0
- package/dist/cli/usageCommandLive.d.ts +84 -0
- package/dist/cli/usageCommandLive.js +95 -0
- package/dist/cli/usageDeploymentSource.d.ts +9 -0
- package/dist/cli/usageDeploymentSource.js +22 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/compilePlanHelpers.js +3 -0
- package/dist/compiler/compileProject.d.ts +2 -0
- package/dist/compiler/compileProject.js +5 -1
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifacts.d.ts +3 -1
- package/dist/compiler/containerArtifacts.js +92 -40
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +24 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
- package/dist/compiler/containerDaimonBrokerRender.js +191 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
- package/dist/compiler/containerEntrypointRender.d.ts +7 -0
- package/dist/compiler/containerEntrypointRender.js +28 -22
- package/dist/compiler/containerPersistentMounts.d.ts +30 -0
- package/dist/compiler/containerPersistentMounts.js +66 -0
- package/dist/compiler/containerReadinessPaths.d.ts +1 -0
- package/dist/compiler/containerReadinessPaths.js +1 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
- package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
- package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
- package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
- package/dist/compiler/containerStateOwnershipRender.js +75 -0
- package/dist/compiler/containerTargetResources.d.ts +22 -1
- package/dist/compiler/containerTargetResources.js +94 -2
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
- package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.js +3 -0
- package/dist/compiler/initProject.d.ts +2 -0
- package/dist/compiler/initProject.js +39 -1
- package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
- package/dist/compiler/localMoltnetAuthority.js +177 -0
- package/dist/compiler/memoryArtifacts.d.ts +1 -1
- package/dist/compiler/memoryArtifacts.js +108 -32
- package/dist/compiler/modelEnv.d.ts +5 -0
- package/dist/compiler/modelEnv.js +8 -2
- package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
- package/dist/compiler/moltnetArtifactPaths.js +17 -15
- package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +52 -12
- package/dist/compiler/moltnetBinaries.d.ts +16 -4
- package/dist/compiler/moltnetBinaries.js +46 -6
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
- package/dist/compiler/moltnetConfigLowering.js +30 -6
- package/dist/compiler/moltnetNodeConfig.js +1 -1
- package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
- package/dist/compiler/moltnetReleaseAuthority.js +33 -4
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
- package/dist/compiler/moltnetResolution.js +9 -15
- package/dist/compiler/moltnetRoomMemberships.js +20 -5
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +22 -2
- package/dist/compiler/moltnetServerPlans.js +19 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +3 -9
- package/dist/compiler/organizationIdentity.js +37 -270
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
- package/dist/compiler/organizationReadyEvidence.js +23 -3
- package/dist/compiler/runProject.d.ts +4 -2
- package/dist/compiler/runProject.js +32 -6
- package/dist/compiler/runProjectAuth.d.ts +3 -1
- package/dist/compiler/runProjectAuth.js +19 -3
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +8 -4
- package/dist/compiler/runProjectDocker.js +43 -18
- package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
- package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
- package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
- package/dist/compiler/runProjectDockerReservation.js +118 -0
- package/dist/compiler/runProjectLifecycle.js +1 -1
- package/dist/compiler/training/broker/declaration.d.ts +45 -0
- package/dist/compiler/training/broker/declaration.js +55 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +111 -0
- package/dist/compiler/training/broker/index.d.ts +10 -0
- package/dist/compiler/training/broker/index.js +10 -0
- package/dist/compiler/training/broker/main.d.ts +2 -0
- package/dist/compiler/training/broker/main.js +14 -0
- package/dist/compiler/training/broker/paths.d.ts +196 -0
- package/dist/compiler/training/broker/paths.js +241 -0
- package/dist/compiler/training/broker/processes.d.ts +42 -0
- package/dist/compiler/training/broker/processes.js +99 -0
- package/dist/compiler/training/broker/projection.d.ts +51 -0
- package/dist/compiler/training/broker/projection.js +76 -0
- package/dist/compiler/training/broker/provisioning.d.ts +87 -0
- package/dist/compiler/training/broker/provisioning.js +213 -0
- package/dist/compiler/training/broker/receipt.d.ts +77 -0
- package/dist/compiler/training/broker/receipt.js +110 -0
- package/dist/compiler/training/broker/registration.d.ts +41 -0
- package/dist/compiler/training/broker/registration.js +102 -0
- package/dist/compiler/training/broker/runtime.d.ts +25 -0
- package/dist/compiler/training/broker/runtime.js +173 -0
- package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
- package/dist/compiler/training/broker/seccompRoutes.js +36 -0
- package/dist/compiler/training/broker/supervisor.d.ts +109 -0
- package/dist/compiler/training/broker/supervisor.js +173 -0
- package/dist/compiler/training/container/contract.d.ts +31 -0
- package/dist/compiler/training/container/contract.js +33 -0
- package/dist/compiler/training/container/index.d.ts +4 -0
- package/dist/compiler/training/container/index.js +2 -0
- package/dist/compiler/training/container/launch.d.ts +18 -0
- package/dist/compiler/training/container/launch.js +173 -0
- package/dist/compiler/training/container/prepare.d.ts +8 -0
- package/dist/compiler/training/container/prepare.js +80 -0
- package/dist/compiler/training/container/process.d.ts +14 -0
- package/dist/compiler/training/container/process.js +70 -0
- package/dist/compiler/training/container/security.d.ts +36 -0
- package/dist/compiler/training/container/security.js +58 -0
- package/dist/compiler/training/context.d.ts +7 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +142 -0
- package/dist/compiler/training/contract.js +34 -0
- package/dist/compiler/training/index.d.ts +4 -0
- package/dist/compiler/training/index.js +3 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
- package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
- package/dist/compiler/training/preparation/broker.d.ts +21 -0
- package/dist/compiler/training/preparation/broker.js +43 -0
- package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
- package/dist/compiler/training/preparation/contextModes.js +38 -0
- package/dist/compiler/training/preparation/contract.d.ts +182 -0
- package/dist/compiler/training/preparation/contract.js +94 -0
- package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
- package/dist/compiler/training/preparation/copyAssets.js +8 -0
- package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
- package/dist/compiler/training/preparation/daimonParent.js +114 -0
- package/dist/compiler/training/preparation/files.d.ts +25 -0
- package/dist/compiler/training/preparation/files.js +85 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +102 -0
- package/dist/compiler/training/preparation/index.d.ts +3 -0
- package/dist/compiler/training/preparation/index.js +2 -0
- package/dist/compiler/training/preparation/inputs.d.ts +23 -0
- package/dist/compiler/training/preparation/inputs.js +93 -0
- package/dist/compiler/training/preparation/prepare.d.ts +33 -0
- package/dist/compiler/training/preparation/prepare.js +186 -0
- package/dist/compiler/training/preparation/scratch.d.ts +19 -0
- package/dist/compiler/training/preparation/scratch.js +48 -0
- package/dist/compiler/training/repair/compatibility.d.ts +11 -0
- package/dist/compiler/training/repair/compatibility.js +34 -0
- package/dist/compiler/training/repair/contract.d.ts +506 -0
- package/dist/compiler/training/repair/contract.js +31 -0
- package/dist/compiler/training/repair/index.d.ts +3 -0
- package/dist/compiler/training/repair/index.js +3 -0
- package/dist/compiler/training/repair/prepare.d.ts +230 -0
- package/dist/compiler/training/repair/prepare.js +74 -0
- package/dist/compiler/training/repair/witness.d.ts +203 -0
- package/dist/compiler/training/repair/witness.js +42 -0
- package/dist/compiler/types.d.ts +2 -0
- package/dist/compiler/upProject.d.ts +26 -1
- package/dist/compiler/upProject.js +117 -178
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.js +49 -4
- package/dist/compiler/updateProjectModels.js +1 -0
- package/dist/compiler/view/types.d.ts +1 -1
- package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
- package/dist/compiler/workspaceBundleArtifacts.js +106 -0
- package/dist/compiler/workspaceResources.d.ts +4 -1
- package/dist/compiler/workspaceResources.js +12 -7
- package/dist/deployment/artifactsExportPlan.js +51 -1
- package/dist/deployment/canaryCutover.d.ts +42 -0
- package/dist/deployment/canaryCutover.js +140 -0
- package/dist/deployment/candidateDiagnostics.d.ts +15 -0
- package/dist/deployment/candidateDiagnostics.js +90 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.js +9 -3
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +5 -0
- package/dist/deployment/downDeployment.js +109 -8
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/index.d.ts +4 -0
- package/dist/deployment/index.js +4 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
- package/dist/deployment/lifecycleCompletionContracts.js +34 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
- package/dist/deployment/lifecycleCompletionPaths.js +3 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionPublication.js +18 -4
- package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
- package/dist/deployment/lifecycleCompletionStore.js +7 -7
- package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
- package/dist/deployment/lifecycleUpRecords.js +127 -0
- package/dist/deployment/native/AGENTS.md +11 -0
- package/dist/deployment/native/rename-noreplace-arm64 +0 -0
- package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
- package/dist/deployment/native/rename-noreplace-x64 +0 -0
- package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
- package/dist/deployment/noReplaceActivation.d.ts +17 -0
- package/dist/deployment/noReplaceActivation.js +50 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
- package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
- package/dist/deployment/organizationReady.d.ts +2 -0
- package/dist/deployment/organizationReady.js +36 -4
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +32 -6
- package/dist/deployment/upReceiptTypes.js +29 -2
- package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
- package/dist/deployment/workspaceResourceMigration.js +315 -0
- package/dist/dev/project.d.ts +7 -0
- package/dist/dev/project.js +9 -0
- package/dist/distribution/consumeImage.d.ts +2 -0
- package/dist/distribution/consumeImage.js +98 -73
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
- package/dist/distribution/consumeImageLifecycle.js +231 -0
- package/dist/distribution/consumeImageSupport.d.ts +12 -0
- package/dist/distribution/consumeImageSupport.js +15 -0
- package/dist/distribution/distributionReportSchema.d.ts +11 -1
- package/dist/distribution/distributionReportSchema.js +15 -2
- package/dist/distribution/dockerRunner.d.ts +6 -1
- package/dist/distribution/dockerRunner.js +31 -4
- package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
- package/dist/distribution/imageRuntimeAuth.js +70 -1
- package/dist/distribution/index.d.ts +1 -1
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +14 -1
- package/dist/distribution/types.js +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
- package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
- package/dist/evidenceExportHelper/index.d.ts +4 -0
- package/dist/evidenceExportHelper/index.js +4 -0
- package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
- package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
- package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
- package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
- package/dist/evidenceExportHelper/recipe.d.ts +7 -0
- package/dist/evidenceExportHelper/recipe.js +83 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/mcpSchemas.d.ts +1 -0
- package/dist/manifest/mcpSchemas.js +3 -0
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +237 -12
- package/dist/manifest/schemas.js +5 -2
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
- package/dist/manifest/teamNetworkSchemas.js +19 -1
- package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
- package/dist/manifest/teamNetworkServerSchemas.js +18 -2
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/report/types.d.ts +34 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +49 -33
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +243 -0
- package/dist/runtime/daimon/attention.d.ts +8 -0
- package/dist/runtime/daimon/attention.js +32 -0
- package/dist/runtime/daimon/config.d.ts +25 -0
- package/dist/runtime/daimon/config.js +272 -0
- package/dist/runtime/daimon/contractManifest.d.ts +295 -0
- package/dist/runtime/daimon/contractManifest.js +319 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
- package/dist/runtime/daimon/grokWorkerContract.js +48 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/runAuth.d.ts +51 -0
- package/dist/runtime/daimon/runAuth.js +279 -0
- package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
- package/dist/runtime/daimon/runtimeIdentity.js +22 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
- package/dist/runtime/daimon/scheduleAuthority.js +17 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/install.d.ts +3 -0
- package/dist/runtime/install.js +3 -0
- package/dist/runtime/localDaimonAuthority.d.ts +11 -0
- package/dist/runtime/localDaimonAuthority.js +77 -0
- package/dist/runtime/mnemeMcp.d.ts +13 -0
- package/dist/runtime/mnemeMcp.js +26 -0
- package/dist/runtime/openclaw/adapter.js +2 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +2 -6
- package/dist/runtime/pi/appCliSource.js +1 -1
- package/dist/runtime/pi/appScheduleSource.js +6 -2
- package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
- package/dist/runtime/picoclaw/adapter.js +2 -2
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +25 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +48 -0
- package/dist/runtime/usageLedgerRead.js +102 -0
- package/dist/runtime/usageRequestLedger.d.ts +42 -0
- package/dist/runtime/usageRequestLedger.js +72 -0
- package/dist/shared/daimonCodexDocker.d.ts +32 -0
- package/dist/shared/daimonCodexDocker.js +120 -0
- package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
- package/dist/shared/daimonGrokSeccompProfile.js +11 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/volumeNames.d.ts +6 -0
- package/dist/shared/volumeNames.js +14 -0
- package/dist/target/dockerArtifactsProvider.js +34 -7
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +11 -0
- package/dist/target/dockerCommandExecutor.js +53 -2
- package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
- package/dist/target/dockerCommandExecutorCore.js +4 -2
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
- package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
- package/dist/target/dockerTarget.d.ts +1 -0
- package/dist/target/dockerTargetBinding.d.ts +1 -2
- package/dist/target/dockerTargetBinding.js +2 -3
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
- package/dist/target/dockerWorldServiceProvider.js +13 -1
- package/dist/target/evidenceExport.d.ts +3 -1
- package/dist/target/evidenceExport.js +12 -3
- package/dist/target/evidenceExportOperationsTestKit.js +3 -3
- package/dist/target/evidenceExportProvider.d.ts +2 -0
- package/dist/target/evidenceExportProvider.js +15 -5
- package/dist/target/publicArtifactSnapshot.d.ts +31 -0
- package/dist/target/publicArtifactSnapshot.js +37 -3
- package/examples/README.md +45 -0
- package/examples/agent-with-subagents/AGENTS.md +3 -0
- package/examples/agent-with-subagents/Spawnfile +30 -0
- package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
- package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
- package/examples/daimon-org/Spawnfile +68 -0
- package/examples/daimon-org/TEAM.md +4 -0
- package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
- package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
- package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
- package/examples/daimon-org/teams/review/Spawnfile +53 -0
- package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
- package/examples/daimon-public-host/AGENTS.md +3 -0
- package/examples/daimon-public-host/Spawnfile +21 -0
- package/examples/distribution-org/Spawnfile +43 -0
- package/examples/distribution-org/TEAM.md +4 -0
- package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
- package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
- package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
- package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
- package/examples/jungian-daimon-org/Spawnfile +41 -0
- package/examples/jungian-daimon-org/TEAM.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
- package/examples/mixed-runtime-org/Spawnfile +71 -0
- package/examples/mixed-runtime-org/TEAM.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
- package/examples/moltnet-team-chat/Spawnfile +43 -0
- package/examples/moltnet-team-chat/TEAM.md +5 -0
- package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
- package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
- package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
- package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
- package/examples/single-agent/AGENTS.md +3 -0
- package/examples/single-agent/HEARTBEAT.md +3 -0
- package/examples/single-agent/IDENTITY.md +3 -0
- package/examples/single-agent/MEMORY.md +3 -0
- package/examples/single-agent/SOUL.md +3 -0
- package/examples/single-agent/Spawnfile +41 -0
- package/examples/single-agent/skills/web_search/SKILL.md +6 -0
- package/moltnet-releases.json +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +5 -2
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
- package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
- package/dist/ownership/simfileRunOperatorInputs.js +0 -139
- package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
- package/dist/target/cleanupRunDocker.test-helper.js +0 -238
|
@@ -10,6 +10,7 @@ const MAX_OUTPUT_BYTES = 32_768;
|
|
|
10
10
|
const MAX_REPOSITORY_BYTES = 255;
|
|
11
11
|
const MAX_REFERENCE_BYTES = MAX_REPOSITORY_BYTES + 72;
|
|
12
12
|
const MAX_IDENTITY_BYTES = 262_144;
|
|
13
|
+
const IDENTITY_RETRY_ATTEMPTS = 64;
|
|
13
14
|
const DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/u;
|
|
14
15
|
const PORT_PATTERN = /^[1-9][0-9]{0,4}$/u;
|
|
15
16
|
const NAME_COMPONENT_PATTERN = /^[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*$/u;
|
|
@@ -282,7 +283,9 @@ const openSecureIdentity = async (filePath) => {
|
|
|
282
283
|
};
|
|
283
284
|
const openIdentity = async (filePath, links) => {
|
|
284
285
|
const value = await openSecureIdentity(filePath);
|
|
285
|
-
if (value
|
|
286
|
+
if (value === null || value.nlink === 0)
|
|
287
|
+
return null;
|
|
288
|
+
if (!links.includes(value.nlink))
|
|
286
289
|
return fail();
|
|
287
290
|
return value;
|
|
288
291
|
};
|
|
@@ -295,6 +298,12 @@ const syncDirectory = async (directory) => {
|
|
|
295
298
|
await handle.close();
|
|
296
299
|
}
|
|
297
300
|
};
|
|
301
|
+
const retryTurn = (attempt) => new Promise((resolve) => {
|
|
302
|
+
if ((attempt + 1) % 8 === 0)
|
|
303
|
+
setTimeout(resolve, 1);
|
|
304
|
+
else
|
|
305
|
+
setImmediate(resolve);
|
|
306
|
+
});
|
|
298
307
|
/* One canonical immutable record exists for one exact operation/request pair. */
|
|
299
308
|
const keyPath = (root, operationHandle, requestDigest) => path.join(root, `${digest("identity-operation", `${operationHandle}\0${requestDigest}`)}.identity.json`);
|
|
300
309
|
const pendingPath = (file) => path.join(path.dirname(file), `.${path.basename(file)}.pending`);
|
|
@@ -308,7 +317,7 @@ const sameInode = (left, right) => left.dev === right.dev && left.ino === right.
|
|
|
308
317
|
* what makes unlink-after-same-inode-proof safe here.
|
|
309
318
|
*/
|
|
310
319
|
const reconcilePublishedIdentity = async (root, file, expected) => {
|
|
311
|
-
for (let attempt = 0; attempt <
|
|
320
|
+
for (let attempt = 0; attempt < IDENTITY_RETRY_ATTEMPTS; attempt += 1) {
|
|
312
321
|
const final = await openIdentity(file, [1, 2]);
|
|
313
322
|
if (!final || final.bytes !== expected)
|
|
314
323
|
return fail();
|
|
@@ -316,15 +325,24 @@ const reconcilePublishedIdentity = async (root, file, expected) => {
|
|
|
316
325
|
if (final.nlink === 1) {
|
|
317
326
|
if (pending === null)
|
|
318
327
|
return;
|
|
319
|
-
if (pending.bytes !== expected)
|
|
328
|
+
if (pending.bytes !== expected) {
|
|
329
|
+
if (pending.nlink === 1 && expected.startsWith(pending.bytes)) {
|
|
330
|
+
await retryTurn(attempt);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
320
333
|
return fail();
|
|
321
|
-
|
|
334
|
+
}
|
|
335
|
+
if (pending.nlink !== 1) {
|
|
336
|
+
await retryTurn(attempt);
|
|
322
337
|
continue;
|
|
338
|
+
}
|
|
323
339
|
}
|
|
324
340
|
else {
|
|
325
341
|
/* A concurrent unlink can make a just-read two-link final become one-link. */
|
|
326
|
-
if (pending === null || pending.nlink !== 2)
|
|
342
|
+
if (pending === null || pending.nlink !== 2) {
|
|
343
|
+
await retryTurn(attempt);
|
|
327
344
|
continue;
|
|
345
|
+
}
|
|
328
346
|
if (!sameInode(final, pending) || pending.bytes !== expected)
|
|
329
347
|
return fail();
|
|
330
348
|
}
|
|
@@ -337,6 +355,7 @@ const reconcilePublishedIdentity = async (root, file, expected) => {
|
|
|
337
355
|
return fail();
|
|
338
356
|
if (await openIdentity(pendingPath(file), [1]) === null)
|
|
339
357
|
return;
|
|
358
|
+
await retryTurn(attempt);
|
|
340
359
|
}
|
|
341
360
|
return fail();
|
|
342
361
|
};
|
|
@@ -357,7 +376,7 @@ const exactPublishedIdentity = async (root, file, content) => {
|
|
|
357
376
|
};
|
|
358
377
|
const publishIdentity = async (root, file, content, options) => {
|
|
359
378
|
const pending = pendingPath(file);
|
|
360
|
-
for (let attempt = 0; attempt <
|
|
379
|
+
for (let attempt = 0; attempt < IDENTITY_RETRY_ATTEMPTS; attempt += 1) {
|
|
361
380
|
if (await exactPublishedIdentity(root, file, content))
|
|
362
381
|
return;
|
|
363
382
|
let created = false;
|
|
@@ -385,13 +404,20 @@ const publishIdentity = async (root, file, content, options) => {
|
|
|
385
404
|
if (pendingRecord === null) {
|
|
386
405
|
if (await exactPublishedIdentity(root, file, content))
|
|
387
406
|
return;
|
|
407
|
+
await retryTurn(attempt);
|
|
388
408
|
continue;
|
|
389
409
|
}
|
|
390
|
-
if (pendingRecord.bytes !== content)
|
|
410
|
+
if (pendingRecord.bytes !== content) {
|
|
411
|
+
if (pendingRecord.nlink === 1 && content.startsWith(pendingRecord.bytes)) {
|
|
412
|
+
await retryTurn(attempt);
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
391
415
|
return fail();
|
|
416
|
+
}
|
|
392
417
|
if (pendingRecord.nlink === 2) {
|
|
393
418
|
if (await exactPublishedIdentity(root, file, content))
|
|
394
419
|
return;
|
|
420
|
+
await retryTurn(attempt);
|
|
395
421
|
continue;
|
|
396
422
|
}
|
|
397
423
|
if (created)
|
|
@@ -409,6 +435,7 @@ const publishIdentity = async (root, file, content, options) => {
|
|
|
409
435
|
/* EEXIST may mean another exact binder linked first or a final vanished; retry only after an exact proof. */
|
|
410
436
|
if (await exactPublishedIdentity(root, file, content))
|
|
411
437
|
return;
|
|
438
|
+
await retryTurn(attempt);
|
|
412
439
|
}
|
|
413
440
|
return fail();
|
|
414
441
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { parseImageReference } from "../distribution/index.js";
|
|
2
|
+
const CONFIG_DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
3
|
+
const MAX_REFERENCE_BYTES = 512;
|
|
4
|
+
/** Strict portable image-reference grammar shared by target resolution and local helper setup. */
|
|
5
|
+
export const parseDockerBaseImageReference = (raw) => {
|
|
6
|
+
if (typeof raw !== "string" || raw !== raw.trim() || raw.includes("\0")
|
|
7
|
+
|| Buffer.byteLength(raw, "utf8") > MAX_REFERENCE_BYTES || CONFIG_DIGEST.test(raw)
|
|
8
|
+
|| parseImageReference(raw) === null)
|
|
9
|
+
return null;
|
|
10
|
+
return raw;
|
|
11
|
+
};
|
|
@@ -5,6 +5,12 @@ import { type DockerSecretExecutor } from "./dockerSecretsProvider.js";
|
|
|
5
5
|
import { type DockerWorldServiceExecutor } from "./dockerWorldServiceProvider.js";
|
|
6
6
|
import type { DockerEvidenceExportExecutor } from "./evidenceExportProvider.js";
|
|
7
7
|
import { type DockerCommandSpawn } from "./dockerCommandExecutorCore.js";
|
|
8
|
+
export declare const PUBLIC_ARTIFACT_READER_PROGRAM: string;
|
|
9
|
+
/** Private control signal emitted only for an exact missing public path probe. */
|
|
10
|
+
export declare class DockerPublicArtifactNotPresentError extends Error {
|
|
11
|
+
readonly kind: "not_present";
|
|
12
|
+
constructor();
|
|
13
|
+
}
|
|
8
14
|
export interface DockerTargetExecutors {
|
|
9
15
|
readonly artifact: DockerArtifactExecutor;
|
|
10
16
|
readonly attachment: DockerOrganizationAttachmentExecutor;
|
|
@@ -19,6 +25,11 @@ export interface DockerTargetExecutors {
|
|
|
19
25
|
readonly secret: DockerSecretExecutor;
|
|
20
26
|
readonly world: DockerWorldServiceExecutor;
|
|
21
27
|
}
|
|
28
|
+
export declare const createPublicArtifactReadCommand: (input: {
|
|
29
|
+
readonly containerId: string;
|
|
30
|
+
readonly context: string;
|
|
31
|
+
readonly path: string;
|
|
32
|
+
}) => string[];
|
|
22
33
|
export interface CreateDockerTargetExecutorsOptions {
|
|
23
34
|
readonly dockerCommand?: string;
|
|
24
35
|
readonly spawn?: DockerCommandSpawn;
|
|
@@ -5,8 +5,34 @@ import { DockerArtifactProviderError } from "./dockerArtifactsProvider.js";
|
|
|
5
5
|
import { DockerResourceProviderError } from "./dockerResourcesProvider.js";
|
|
6
6
|
import { DockerSecretProviderError } from "./dockerSecretsProvider.js";
|
|
7
7
|
import { DockerWorldServiceProviderError } from "./dockerWorldServiceProvider.js";
|
|
8
|
-
import { MAX_TARGET_PUBLIC_ARTIFACT_BYTES } from "./publicArtifactSnapshot.js";
|
|
8
|
+
import { MAX_TARGET_PUBLIC_ARTIFACT_BYTES, isTargetPublicArtifactPath } from "./publicArtifactSnapshot.js";
|
|
9
9
|
import { DOCKER_COMMAND_ERROR, DockerCommandFailure, executeDockerCommandCore } from "./dockerCommandExecutorCore.js";
|
|
10
|
+
const PUBLIC_ARTIFACT_NOT_PRESENT_EXIT = 42;
|
|
11
|
+
// The public directory is a separately mounted tmpfs and paths are restricted
|
|
12
|
+
// to direct children. Open the leaf exactly once with O_NOFOLLOW: no path
|
|
13
|
+
// preflight is permitted because it would turn a replacement into a TOCTOU
|
|
14
|
+
// disclosure. Only ENOENT from that open denotes the terminal absence state.
|
|
15
|
+
export const PUBLIC_ARTIFACT_READER_PROGRAM = [
|
|
16
|
+
"import fs from 'node:fs';",
|
|
17
|
+
"const path = process.argv[1];",
|
|
18
|
+
"let fd;",
|
|
19
|
+
"try { fd = fs.openSync(path, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); }",
|
|
20
|
+
"catch (error) { process.exitCode = error?.code === 'ENOENT' ? 42 : 43; }",
|
|
21
|
+
"if (fd !== undefined) {",
|
|
22
|
+
" try {",
|
|
23
|
+
" if (!fs.fstatSync(fd).isFile()) process.exitCode = 43;",
|
|
24
|
+
" else { const chunks = []; let bytes; do { const chunk = Buffer.allocUnsafe(65536); bytes = fs.readSync(fd, chunk); if (bytes) chunks.push(chunk.subarray(0, bytes)); } while (bytes); process.stdout.write(Buffer.concat(chunks)); }",
|
|
25
|
+
" } catch { process.exitCode = 43; } finally { fs.closeSync(fd); }",
|
|
26
|
+
"}"
|
|
27
|
+
].join(" ");
|
|
28
|
+
/** Private control signal emitted only for an exact missing public path probe. */
|
|
29
|
+
export class DockerPublicArtifactNotPresentError extends Error {
|
|
30
|
+
kind = "not_present";
|
|
31
|
+
constructor() {
|
|
32
|
+
super("Target public artifact is not present");
|
|
33
|
+
this.name = "DockerPublicArtifactNotPresentError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
10
36
|
const role = (args) => {
|
|
11
37
|
if (args[0] === "--context") {
|
|
12
38
|
return args.length >= 3 && /^[a-z][a-z0-9_-]{0,63}$/u.test(args[1]) ? args.slice(2) : [];
|
|
@@ -19,6 +45,23 @@ const role = (args) => {
|
|
|
19
45
|
}
|
|
20
46
|
return args;
|
|
21
47
|
};
|
|
48
|
+
const exactPublicArtifactAbsence = (args, error) => {
|
|
49
|
+
if (!(error instanceof DockerCommandFailure)
|
|
50
|
+
|| error.code !== PUBLIC_ARTIFACT_NOT_PRESENT_EXIT || error.stderr !== ""
|
|
51
|
+
|| error.stdoutBytes !== 0)
|
|
52
|
+
return undefined;
|
|
53
|
+
const command = role(args);
|
|
54
|
+
const path = command[8];
|
|
55
|
+
if (command.length !== 9
|
|
56
|
+
|| command[0] !== "container" || command[1] !== "exec"
|
|
57
|
+
|| !/^[a-f0-9]{64}$/u.test(command[2])
|
|
58
|
+
|| command[3] !== "/usr/local/bin/node" || command[4] !== "--input-type=module"
|
|
59
|
+
|| command[5] !== "-e" || command[6] !== PUBLIC_ARTIFACT_READER_PROGRAM
|
|
60
|
+
|| command[7] !== "spawnfile-public-artifact-read"
|
|
61
|
+
|| !isTargetPublicArtifactPath(path))
|
|
62
|
+
return undefined;
|
|
63
|
+
return new DockerPublicArtifactNotPresentError();
|
|
64
|
+
};
|
|
22
65
|
const exactMissingImageReference = (requested, reported) => {
|
|
23
66
|
if (requested === undefined || reported === requested)
|
|
24
67
|
return reported === requested;
|
|
@@ -112,6 +155,11 @@ const classify = (kind, args, error) => {
|
|
|
112
155
|
}
|
|
113
156
|
return new Error(DOCKER_COMMAND_ERROR);
|
|
114
157
|
};
|
|
158
|
+
export const createPublicArtifactReadCommand = (input) => [
|
|
159
|
+
"--context", input.context, "container", "exec", input.containerId,
|
|
160
|
+
"/usr/local/bin/node", "--input-type=module", "-e", PUBLIC_ARTIFACT_READER_PROGRAM,
|
|
161
|
+
"spawnfile-public-artifact-read", input.path
|
|
162
|
+
];
|
|
115
163
|
const normalizeCommandOptions = (raw, allowStdin) => {
|
|
116
164
|
if (!raw || typeof raw !== "object" || Array.isArray(raw) || nodeTypes.isProxy(raw)
|
|
117
165
|
|| Object.getPrototypeOf(raw) !== Object.prototype)
|
|
@@ -189,7 +237,10 @@ export const createDockerTargetExecutors = (options = {}) => {
|
|
|
189
237
|
});
|
|
190
238
|
return { bytes: Uint8Array.from(result.stdout) };
|
|
191
239
|
}
|
|
192
|
-
catch {
|
|
240
|
+
catch (error) {
|
|
241
|
+
const absence = exactPublicArtifactAbsence(args, error);
|
|
242
|
+
if (absence)
|
|
243
|
+
throw absence;
|
|
193
244
|
throw new Error(DOCKER_COMMAND_ERROR);
|
|
194
245
|
}
|
|
195
246
|
},
|
|
@@ -18,7 +18,8 @@ export type DockerCommandSpawn = (file: string, args: readonly string[], options
|
|
|
18
18
|
export declare class DockerCommandFailure extends Error {
|
|
19
19
|
readonly code: number;
|
|
20
20
|
readonly stderr: string;
|
|
21
|
-
|
|
21
|
+
readonly stdoutBytes: number;
|
|
22
|
+
constructor(code: number, stderr: string, stdoutBytes: number);
|
|
22
23
|
}
|
|
23
24
|
export interface DockerCommandCoreOptions {
|
|
24
25
|
readonly binary: boolean;
|
|
@@ -7,10 +7,12 @@ const FALLBACK_MS = 50;
|
|
|
7
7
|
export class DockerCommandFailure extends Error {
|
|
8
8
|
code;
|
|
9
9
|
stderr;
|
|
10
|
-
|
|
10
|
+
stdoutBytes;
|
|
11
|
+
constructor(code, stderr, stdoutBytes) {
|
|
11
12
|
super(DOCKER_COMMAND_ERROR);
|
|
12
13
|
this.code = code;
|
|
13
14
|
this.stderr = stderr;
|
|
15
|
+
this.stdoutBytes = stdoutBytes;
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
const ordinaryOptions = (raw) => {
|
|
@@ -197,7 +199,7 @@ export const executeDockerCommandCore = (spawnCommand, file, args, rawOptions) =
|
|
|
197
199
|
return;
|
|
198
200
|
}
|
|
199
201
|
if (closeCode !== 0) {
|
|
200
|
-
settle(new DockerCommandFailure(closeCode, stderr));
|
|
202
|
+
settle(new DockerCommandFailure(closeCode, stderr, typeof stdout === "string" ? Buffer.byteLength(stdout, "utf8") : stdout.byteLength));
|
|
201
203
|
return;
|
|
202
204
|
}
|
|
203
205
|
settle(undefined, { stderr, stdout });
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { type
|
|
1
|
+
import { type DockerTargetExecutors } from "./dockerCommandExecutor.js";
|
|
2
|
+
import { type TargetPublicArtifactSnapshotResult } from "./publicArtifactSnapshot.js";
|
|
3
3
|
import { type DockerWorldServiceExecutor } from "./dockerWorldServiceProvider.js";
|
|
4
4
|
import type { WorldServiceAuthorityStore } from "./dockerWorldServiceStore.js";
|
|
5
5
|
export declare const TARGET_PUBLIC_ARTIFACT_SNAPSHOT_ERROR = "Target public artifact snapshot failed";
|
|
@@ -12,6 +12,6 @@ export interface DockerPublicArtifactSnapshotOptions {
|
|
|
12
12
|
readonly timeoutMs: number;
|
|
13
13
|
}
|
|
14
14
|
export interface PublicArtifactSnapshotReader {
|
|
15
|
-
snapshot(raw: unknown): Promise<
|
|
15
|
+
snapshot(raw: unknown): Promise<TargetPublicArtifactSnapshotResult>;
|
|
16
16
|
}
|
|
17
17
|
export declare const createDockerPublicArtifactSnapshotReader: (options: DockerPublicArtifactSnapshotOptions) => PublicArtifactSnapshotReader;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createPublicArtifactReadCommand, DockerPublicArtifactNotPresentError } from "./dockerCommandExecutor.js";
|
|
3
|
+
import { createTargetPublicArtifactSnapshot, createTargetPublicArtifactSnapshotNotPresent, parseTargetPublicArtifactSnapshotRequest } from "./publicArtifactSnapshot.js";
|
|
3
4
|
import { inspectDockerWorldService, sameWorldServiceValue, worldServiceSpecForBinding } from "./dockerWorldServiceLifecycle.js";
|
|
4
5
|
export const TARGET_PUBLIC_ARTIFACT_SNAPSHOT_ERROR = "Target public artifact snapshot failed";
|
|
5
6
|
const CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
@@ -29,45 +30,26 @@ const exactBinding = async (request, options) => {
|
|
|
29
30
|
return binding;
|
|
30
31
|
};
|
|
31
32
|
const readPublicArtifact = async (containerId, request, options) => {
|
|
33
|
+
let result;
|
|
32
34
|
try {
|
|
33
|
-
|
|
34
|
-
"--context", options.context,
|
|
35
|
-
"container", "exec",
|
|
35
|
+
result = await options.contentExecutor("docker", createPublicArtifactReadCommand({
|
|
36
36
|
containerId,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
], {
|
|
37
|
+
context: options.context,
|
|
38
|
+
path: request.artifact.path
|
|
39
|
+
}), {
|
|
41
40
|
signal: options.signal,
|
|
42
41
|
timeout: options.timeoutMs
|
|
43
42
|
});
|
|
44
|
-
if (!resolved || !(resolved.bytes instanceof Uint8Array))
|
|
45
|
-
return fail();
|
|
46
|
-
const resolvedPath = new TextDecoder("utf-8", { fatal: true })
|
|
47
|
-
.decode(resolved.bytes);
|
|
48
|
-
// Reject the final file and every parent alias. The world may publish only
|
|
49
|
-
// the exact regular path that its descriptor declared, never a symlink
|
|
50
|
-
// into private evidence, credentials, or another runtime surface.
|
|
51
|
-
if (resolvedPath !== `${request.artifact.path}\n`)
|
|
52
|
-
return fail();
|
|
53
|
-
const result = await options.contentExecutor("docker", [
|
|
54
|
-
"--context", options.context,
|
|
55
|
-
"container", "exec",
|
|
56
|
-
containerId,
|
|
57
|
-
"/bin/cat",
|
|
58
|
-
request.artifact.path
|
|
59
|
-
], {
|
|
60
|
-
signal: options.signal,
|
|
61
|
-
timeout: options.timeoutMs
|
|
62
|
-
});
|
|
63
|
-
if (!result || !(result.bytes instanceof Uint8Array)
|
|
64
|
-
|| result.bytes.byteLength > request.artifact.max_bytes)
|
|
65
|
-
return fail();
|
|
66
|
-
return Uint8Array.from(result.bytes);
|
|
67
43
|
}
|
|
68
|
-
catch {
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof DockerPublicArtifactNotPresentError)
|
|
46
|
+
return null;
|
|
69
47
|
return fail();
|
|
70
48
|
}
|
|
49
|
+
if (!result || !(result.bytes instanceof Uint8Array)
|
|
50
|
+
|| result.bytes.byteLength > request.artifact.max_bytes)
|
|
51
|
+
return fail();
|
|
52
|
+
return Uint8Array.from(result.bytes);
|
|
71
53
|
};
|
|
72
54
|
class DockerPublicArtifactSnapshotReader {
|
|
73
55
|
#options;
|
|
@@ -93,7 +75,9 @@ class DockerPublicArtifactSnapshotReader {
|
|
|
93
75
|
if (!after || after.containerId !== before.containerId
|
|
94
76
|
|| after.status !== "running")
|
|
95
77
|
return fail();
|
|
96
|
-
return
|
|
78
|
+
return content === null
|
|
79
|
+
? createTargetPublicArtifactSnapshotNotPresent(request)
|
|
80
|
+
: createTargetPublicArtifactSnapshot({ content, request });
|
|
97
81
|
}
|
|
98
82
|
}
|
|
99
83
|
export const createDockerPublicArtifactSnapshotReader = (options) => new DockerPublicArtifactSnapshotReader(options);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { execFile as execFileCallback } from "node:child_process";
|
|
2
1
|
import { type SelectedTargetReceipt } from "./contracts.js";
|
|
3
2
|
import type { ResolveDockerDeploymentTargetOptions, SelectTargetOptions } from "./dockerTarget.js";
|
|
4
|
-
export
|
|
3
|
+
export { defaultDockerTargetExecFile } from "./dockerTargetExecFile.js";
|
|
5
4
|
/** Private owner-only endpoint binding. Never export this module through the target barrel. */
|
|
6
5
|
export interface ResolvedSelectedTargetBinding {
|
|
7
6
|
readonly endpoint: string;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { execFile as execFileCallback } from "node:child_process";
|
|
2
1
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { promisify } from "node:util";
|
|
4
2
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
3
|
import { SELECTED_TARGET_VERSION, parseOpaqueTargetHandle, parseSelectedTargetReceipt } from "./contracts.js";
|
|
6
4
|
import { createEndpointFingerprint } from "./dockerEndpointFingerprint.js";
|
|
7
|
-
|
|
5
|
+
import { defaultDockerTargetExecFile } from "./dockerTargetExecFile.js";
|
|
6
|
+
export { defaultDockerTargetExecFile } from "./dockerTargetExecFile.js";
|
|
8
7
|
const TARGET_SELECTION_ERROR = "Target selection failed";
|
|
9
8
|
const DOCKER_CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
10
9
|
const MAX_RAW_EXECUTOR_STDOUT_BYTES = 4_096;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DockerTargetExecFile } from "./dockerTarget.js";
|
|
2
|
+
export type DockerTargetExecutionFailureKind = "aborted" | "cleanup_failed" | "failed" | "timeout";
|
|
3
|
+
export declare class DockerTargetExecutionError extends Error {
|
|
4
|
+
readonly kind: DockerTargetExecutionFailureKind;
|
|
5
|
+
constructor(kind: DockerTargetExecutionFailureKind);
|
|
6
|
+
}
|
|
7
|
+
export declare class DockerTargetCommandFailure extends DockerTargetExecutionError {
|
|
8
|
+
readonly code: number;
|
|
9
|
+
readonly stderr: string;
|
|
10
|
+
readonly stdoutBytes: number;
|
|
11
|
+
constructor(code: number, stderr: string, stdoutBytes: number);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Docker target probe/build transport with exact stdin and bounded tree teardown.
|
|
15
|
+
* POSIX children lead a private process group so timeout/abort cannot strand a
|
|
16
|
+
* buildx descendant that inherited the CLI's stdio handles.
|
|
17
|
+
*/
|
|
18
|
+
export declare const createBoundedDockerTargetExecFile: () => DockerTargetExecFile;
|
|
19
|
+
export declare const defaultDockerTargetExecFile: DockerTargetExecFile;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
const ERROR = "Docker target command failed";
|
|
3
|
+
const OUTPUT_CAP = 65_536;
|
|
4
|
+
const TERM_GRACE_MS = 50;
|
|
5
|
+
const KILL_GRACE_MS = 250;
|
|
6
|
+
export class DockerTargetExecutionError extends Error {
|
|
7
|
+
kind;
|
|
8
|
+
constructor(kind) {
|
|
9
|
+
super(ERROR);
|
|
10
|
+
this.name = "DockerTargetExecutionError";
|
|
11
|
+
this.kind = kind;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class DockerTargetCommandFailure extends DockerTargetExecutionError {
|
|
15
|
+
code;
|
|
16
|
+
stderr;
|
|
17
|
+
stdoutBytes;
|
|
18
|
+
constructor(code, stderr, stdoutBytes) {
|
|
19
|
+
super("failed");
|
|
20
|
+
this.name = "DockerTargetCommandFailure";
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.stderr = stderr;
|
|
23
|
+
this.stdoutBytes = stdoutBytes;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const decode = (chunks) => {
|
|
27
|
+
try {
|
|
28
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new DockerTargetExecutionError("failed");
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Docker target probe/build transport with exact stdin and bounded tree teardown.
|
|
36
|
+
* POSIX children lead a private process group so timeout/abort cannot strand a
|
|
37
|
+
* buildx descendant that inherited the CLI's stdio handles.
|
|
38
|
+
*/
|
|
39
|
+
export const createBoundedDockerTargetExecFile = () => (file, args, options) => {
|
|
40
|
+
if (typeof file !== "string" || file.length < 1 || file.includes("\0")
|
|
41
|
+
|| !Array.isArray(args) || args.some((arg) => typeof arg !== "string" || arg.includes("\0"))
|
|
42
|
+
|| !options || !Number.isSafeInteger(options.timeout) || options.timeout < 1
|
|
43
|
+
|| options.timeout > 120_000
|
|
44
|
+
|| options.signal !== undefined && !(options.signal instanceof AbortSignal)
|
|
45
|
+
|| options.stdin !== undefined && !(options.stdin instanceof Uint8Array)) {
|
|
46
|
+
return Promise.reject(new DockerTargetExecutionError("failed"));
|
|
47
|
+
}
|
|
48
|
+
if (options.signal?.aborted) {
|
|
49
|
+
return Promise.reject(new DockerTargetExecutionError("aborted"));
|
|
50
|
+
}
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const grouped = process.platform !== "win32";
|
|
53
|
+
let child;
|
|
54
|
+
try {
|
|
55
|
+
child = spawn(file, args, {
|
|
56
|
+
detached: grouped,
|
|
57
|
+
shell: false,
|
|
58
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
reject(new DockerTargetExecutionError("failed"));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const stdout = [];
|
|
66
|
+
const stderr = [];
|
|
67
|
+
let stdoutBytes = 0;
|
|
68
|
+
let stderrBytes = 0;
|
|
69
|
+
let terminal;
|
|
70
|
+
let settled = false;
|
|
71
|
+
let termTimer;
|
|
72
|
+
let killTimer;
|
|
73
|
+
const groupAbsent = () => {
|
|
74
|
+
if (!grouped || !child.pid)
|
|
75
|
+
return false;
|
|
76
|
+
try {
|
|
77
|
+
process.kill(-child.pid, 0);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return error.code === "ESRCH";
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const signalTree = (signal) => {
|
|
85
|
+
try {
|
|
86
|
+
if (grouped && child.pid)
|
|
87
|
+
process.kill(-child.pid, signal);
|
|
88
|
+
else
|
|
89
|
+
child.kill(signal);
|
|
90
|
+
}
|
|
91
|
+
catch { /* only a later ESRCH liveness probe proves quiescence */ }
|
|
92
|
+
};
|
|
93
|
+
const destroyPipes = () => {
|
|
94
|
+
child.stdin.on("error", () => undefined);
|
|
95
|
+
child.stdout.on("error", () => undefined);
|
|
96
|
+
child.stderr.on("error", () => undefined);
|
|
97
|
+
child.stdin.destroy();
|
|
98
|
+
child.stdout.destroy();
|
|
99
|
+
child.stderr.destroy();
|
|
100
|
+
};
|
|
101
|
+
const cleanup = () => {
|
|
102
|
+
clearTimeout(timeoutTimer);
|
|
103
|
+
if (termTimer)
|
|
104
|
+
clearTimeout(termTimer);
|
|
105
|
+
if (killTimer)
|
|
106
|
+
clearTimeout(killTimer);
|
|
107
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
108
|
+
};
|
|
109
|
+
const finish = (error, unresolved = false) => {
|
|
110
|
+
if (settled || !unresolved && !groupAbsent())
|
|
111
|
+
return;
|
|
112
|
+
settled = true;
|
|
113
|
+
cleanup();
|
|
114
|
+
destroyPipes();
|
|
115
|
+
reject(error);
|
|
116
|
+
};
|
|
117
|
+
const terminate = (kind) => {
|
|
118
|
+
if (terminal || settled)
|
|
119
|
+
return;
|
|
120
|
+
terminal = new DockerTargetExecutionError(kind);
|
|
121
|
+
signalTree("SIGTERM");
|
|
122
|
+
termTimer = setTimeout(() => {
|
|
123
|
+
signalTree("SIGKILL");
|
|
124
|
+
destroyPipes();
|
|
125
|
+
const started = Date.now();
|
|
126
|
+
const poll = () => {
|
|
127
|
+
if (!terminal || settled)
|
|
128
|
+
return;
|
|
129
|
+
if (groupAbsent()) {
|
|
130
|
+
finish(terminal);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
signalTree("SIGKILL");
|
|
134
|
+
if (Date.now() - started >= KILL_GRACE_MS) {
|
|
135
|
+
finish(new DockerTargetExecutionError("cleanup_failed"), true);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
killTimer = setTimeout(poll, 10);
|
|
139
|
+
};
|
|
140
|
+
poll();
|
|
141
|
+
}, TERM_GRACE_MS);
|
|
142
|
+
};
|
|
143
|
+
const append = (target, chunk, output) => {
|
|
144
|
+
const value = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
145
|
+
if (output === "stdout")
|
|
146
|
+
stdoutBytes += value.byteLength;
|
|
147
|
+
else
|
|
148
|
+
stderrBytes += value.byteLength;
|
|
149
|
+
if (stdoutBytes > OUTPUT_CAP || stderrBytes > OUTPUT_CAP) {
|
|
150
|
+
terminate("failed");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
target.push(Buffer.from(value));
|
|
154
|
+
};
|
|
155
|
+
function onAbort() { terminate("aborted"); }
|
|
156
|
+
child.stdout.on("data", (chunk) => append(stdout, chunk, "stdout"));
|
|
157
|
+
child.stderr.on("data", (chunk) => append(stderr, chunk, "stderr"));
|
|
158
|
+
child.stdin.on("error", () => terminate("failed"));
|
|
159
|
+
child.on("error", () => terminate("failed"));
|
|
160
|
+
child.on("close", (code) => {
|
|
161
|
+
if (terminal || settled)
|
|
162
|
+
return;
|
|
163
|
+
settled = true;
|
|
164
|
+
cleanup();
|
|
165
|
+
try {
|
|
166
|
+
const stderrText = decode(stderr);
|
|
167
|
+
const stdoutText = decode(stdout);
|
|
168
|
+
if (code !== 0) {
|
|
169
|
+
reject(new DockerTargetCommandFailure(code ?? -1, stderrText, Buffer.byteLength(stdoutText, "utf8")));
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
resolve({ stderr: stderrText, stdout: stdoutText });
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
reject(error);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
179
|
+
const timeoutTimer = setTimeout(() => terminate("timeout"), options.timeout);
|
|
180
|
+
if (options.signal?.aborted) {
|
|
181
|
+
terminate("aborted");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const input = options.stdin === undefined ? undefined
|
|
186
|
+
: Buffer.from(options.stdin.buffer, options.stdin.byteOffset, options.stdin.byteLength);
|
|
187
|
+
child.stdin.end(input);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
terminate("failed");
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
export const defaultDockerTargetExecFile = createBoundedDockerTargetExecFile();
|
|
@@ -5,6 +5,10 @@ export declare const WORLD_RUNTIME_TMPFS: Readonly<{
|
|
|
5
5
|
path: "/tmp";
|
|
6
6
|
options: "rw,noexec,nosuid,nodev,size=1m,mode=1777";
|
|
7
7
|
}>;
|
|
8
|
+
export declare const WORLD_PUBLIC_ARTIFACT_TMPFS: Readonly<{
|
|
9
|
+
path: "/tmp/spawnfile-public";
|
|
10
|
+
options: "rw,noexec,nosuid,nodev,size=1m,mode=1777";
|
|
11
|
+
}>;
|
|
8
12
|
export type DockerWorldServiceFailureKind = "collision" | "not_found";
|
|
9
13
|
export interface DockerWorldServiceExecutor {
|
|
10
14
|
(file: string, args: string[], options: {
|
|
@@ -9,6 +9,16 @@ export const WORLD_RUNTIME_TMPFS = Object.freeze({
|
|
|
9
9
|
path: "/tmp",
|
|
10
10
|
options: "rw,noexec,nosuid,nodev,size=1m,mode=1777"
|
|
11
11
|
});
|
|
12
|
+
/*
|
|
13
|
+
* A distinct mount point is a confinement boundary, not merely a convenient
|
|
14
|
+
* directory. The public-artifact reader opens one direct child with
|
|
15
|
+
* O_NOFOLLOW; this mount prevents that child from being hard-linked or
|
|
16
|
+
* replaced with a path from the world root, secrets, or evidence mounts.
|
|
17
|
+
*/
|
|
18
|
+
export const WORLD_PUBLIC_ARTIFACT_TMPFS = Object.freeze({
|
|
19
|
+
path: "/tmp/spawnfile-public",
|
|
20
|
+
options: "rw,noexec,nosuid,nodev,size=1m,mode=1777"
|
|
21
|
+
});
|
|
12
22
|
const MAX_OUTPUT_BYTES = 32_768;
|
|
13
23
|
const MAX_NAME_LENGTH = 63;
|
|
14
24
|
const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/u;
|
|
@@ -183,6 +193,7 @@ export const createDockerWorldServiceSpec = (input) => {
|
|
|
183
193
|
"--cap-drop", "ALL", "--security-opt", "no-new-privileges=true",
|
|
184
194
|
"--ipc", "none", "--cgroupns", "private",
|
|
185
195
|
"--tmpfs", `${WORLD_RUNTIME_TMPFS.path}:${WORLD_RUNTIME_TMPFS.options}`,
|
|
196
|
+
"--tmpfs", `${WORLD_PUBLIC_ARTIFACT_TMPFS.path}:${WORLD_PUBLIC_ARTIFACT_TMPFS.options}`,
|
|
186
197
|
...labelArgs,
|
|
187
198
|
"--mount", `type=volume,src=${evidence.name},dst=${evidenceMountPath},volume-nocopy`,
|
|
188
199
|
"--mount", `type=volume,src=${secrets.name},dst=${WORLD_SECRETS_PATH},readonly,volume-nocopy`,
|
|
@@ -304,8 +315,9 @@ export const parseExpectedDockerWorldService = (stdout, spec) => {
|
|
|
304
315
|
&& value.PidMode === "" && value.IpcMode === "none" && value.UTSMode === ""
|
|
305
316
|
&& value.UsernsMode === "" && value.CgroupnsMode === "private"
|
|
306
317
|
&& exactRecord(value.Tmpfs)
|
|
307
|
-
&& exactKeys(value.Tmpfs, [WORLD_RUNTIME_TMPFS.path])
|
|
318
|
+
&& exactKeys(value.Tmpfs, [WORLD_RUNTIME_TMPFS.path, WORLD_PUBLIC_ARTIFACT_TMPFS.path])
|
|
308
319
|
&& value.Tmpfs[WORLD_RUNTIME_TMPFS.path] === WORLD_RUNTIME_TMPFS.options
|
|
320
|
+
&& value.Tmpfs[WORLD_PUBLIC_ARTIFACT_TMPFS.path] === WORLD_PUBLIC_ARTIFACT_TMPFS.options
|
|
309
321
|
&& value.ReadonlyRootfs === true
|
|
310
322
|
&& JSON.stringify(value.SecurityOpt) === JSON.stringify(["no-new-privileges=true"])
|
|
311
323
|
&& value.LogType === "none" && value.RestartPolicyName === "no"
|