spawnfile 0.1.13 → 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 +61 -121
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/paths.d.ts +12 -1
- package/dist/auth/paths.js +21 -0
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +17 -0
- package/dist/auth/targetSecretSourceFsPublish.js +51 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +17 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +468 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +189 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- 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/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +230 -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.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +48 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +145 -0
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +15 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -181
- package/dist/cli/lifecycleMachine.d.ts +25 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- 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 +19 -2
- package/dist/cli/runCli.js +58 -74
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -33
- package/dist/cli/statusCommand.js +19 -249
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +30 -0
- package/dist/cli/targetCommands.js +227 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- 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/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +55 -0
- package/dist/cli/targetDefaultAuthorities.js +213 -0
- package/dist/cli/targetDefaultConfig.d.ts +75 -0
- package/dist/cli/targetDefaultConfig.js +334 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +221 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +268 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +162 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +197 -0
- 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/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +2 -1
- package/dist/compiler/buildCompilePlanTeams.js +9 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +11 -0
- package/dist/compiler/buildProject.js +77 -2
- package/dist/compiler/compilePlanHelpers.js +5 -0
- package/dist/compiler/compileProject.d.ts +15 -0
- package/dist/compiler/compileProject.js +31 -75
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +12 -0
- package/dist/compiler/containerArtifacts.js +180 -127
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +54 -124
- package/dist/compiler/containerArtifactsRender.d.ts +5 -2
- package/dist/compiler/containerArtifactsRender.js +106 -70
- package/dist/compiler/containerArtifactsTypes.d.ts +20 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -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 +8 -0
- package/dist/compiler/containerEntrypointRender.js +82 -72
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- 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/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -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 +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +56 -0
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +7 -0
- package/dist/compiler/index.js +7 -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 +26 -0
- package/dist/compiler/memoryArtifacts.js +210 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +7 -0
- package/dist/compiler/modelEnv.js +13 -1
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +31 -0
- package/dist/compiler/moltnetArtifactPaths.js +51 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +56 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +3 -41
- package/dist/compiler/moltnetArtifacts.js +87 -101
- package/dist/compiler/moltnetBinaries.d.ts +33 -4
- package/dist/compiler/moltnetBinaries.js +173 -26
- package/dist/compiler/moltnetClientConfig.js +7 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +18 -1
- package/dist/compiler/moltnetConfigLowering.js +92 -6
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +40 -0
- package/dist/compiler/moltnetReleaseAuthority.js +102 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +2 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +17 -3
- package/dist/compiler/moltnetResolution.js +67 -21
- package/dist/compiler/moltnetRoomMemberships.js +52 -9
- 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.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +151 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +21 -0
- package/dist/compiler/organizationIdentity.js +64 -0
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +57 -0
- package/dist/compiler/organizationReadyEvidence.js +281 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +8 -2
- package/dist/compiler/runProject.js +62 -27
- package/dist/compiler/runProjectAuth.d.ts +10 -2
- package/dist/compiler/runProjectAuth.js +105 -11
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +11 -0
- package/dist/compiler/runProjectDocker.js +64 -16
- 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.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- 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 +84 -1
- package/dist/compiler/upProject.d.ts +31 -1
- package/dist/compiler/upProject.js +197 -22
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +127 -0
- package/dist/compiler/updateProjectModels.js +43 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- 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/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +185 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- 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/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +5 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +124 -1
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +80 -6
- package/dist/deployment/dockerRecover.js +9 -1
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +39 -0
- package/dist/deployment/downDeployment.js +248 -0
- package/dist/deployment/downReceiptTypes.d.ts +36 -0
- package/dist/deployment/downReceiptTypes.js +45 -0
- package/dist/deployment/index.d.ts +20 -0
- package/dist/deployment/index.js +21 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +224 -0
- package/dist/deployment/lifecycleCompletionContracts.js +140 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionPaths.js +19 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +7 -0
- package/dist/deployment/lifecycleCompletionPublication.js +49 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- 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.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +187 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +431 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +355 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +149 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +54 -0
- package/dist/deployment/organizationReady.js +232 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +137 -0
- package/dist/deployment/upReceiptTypes.js +191 -0
- 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 +24 -9
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- 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 +16 -1
- package/dist/distribution/distributionReportSchema.js +21 -3
- 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 +3 -3
- package/dist/distribution/index.js +2 -2
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +21 -1
- package/dist/distribution/types.js +4 -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/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +18 -0
- package/dist/manifest/mcpSchemas.js +44 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +20 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -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 +2034 -40
- package/dist/manifest/schemas.js +82 -33
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +6 -2
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +25 -190
- package/dist/manifest/teamNetworkSchemas.js +21 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +155 -0
- package/dist/manifest/teamNetworkServerSchemas.js +215 -0
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/report/types.d.ts +173 -1
- package/dist/runtime/common.d.ts +63 -1
- package/dist/runtime/common.js +88 -3
- package/dist/runtime/container.d.ts +28 -1
- package/dist/runtime/container.js +78 -29
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- 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 +6 -0
- package/dist/runtime/index.js +6 -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 +28 -0
- package/dist/runtime/mnemeMcp.js +135 -0
- package/dist/runtime/openclaw/adapter.js +17 -6
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +1 -2
- package/dist/runtime/pi/adapter.js +87 -58
- package/dist/runtime/pi/appActivitySource.js +114 -2
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -1
- package/dist/runtime/pi/appCoreSource.js +104 -214
- package/dist/runtime/pi/appPreludeSource.js +140 -52
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +84 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -1
- package/dist/runtime/pi/appSource.js +6 -2
- package/dist/runtime/pi/appTemplate.d.ts +8 -22
- package/dist/runtime/pi/appTemplate.js +9 -126
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.js +126 -9
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +25 -29
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +3 -0
- package/dist/runtime/scheduleUtils.js +19 -0
- package/dist/runtime/types.d.ts +50 -2
- 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/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.js +3 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -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/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +476 -0
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +38 -0
- package/dist/target/dockerCommandExecutor.js +251 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +35 -0
- package/dist/target/dockerCommandExecutorCore.js +275 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +83 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +53 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +13 -0
- package/dist/target/dockerTargetBinding.js +95 -0
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +64 -0
- package/dist/target/dockerWorldServiceProvider.js +330 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +57 -0
- package/dist/target/evidenceExport.js +527 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +87 -0
- package/dist/target/evidenceExportProvider.js +197 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +72 -0
- package/dist/target/publicArtifactSnapshot.js +184 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- 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 +21 -0
- package/package.json +57 -14
- package/runtimes.yaml +11 -23
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -1,25 +1,60 @@
|
|
|
1
|
+
import os from "node:os";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { randomBytes } from "node:crypto";
|
|
3
4
|
import { parseEnvFile } from "../auth/index.js";
|
|
4
5
|
import { fileExists, readUtf8File } from "../filesystem/index.js";
|
|
5
6
|
import { SpawnfileError } from "../shared/index.js";
|
|
6
7
|
import { getRuntimeAdapter } from "../runtime/index.js";
|
|
8
|
+
import { CLI_CREDENTIAL_SECRET_NAME, modelAuthMethodNeedsCliCredential } from "./modelEnv.js";
|
|
7
9
|
const MODEL_AUTH_IMPORT_KINDS = {
|
|
8
10
|
api_key: null,
|
|
9
11
|
"claude-code": "claude-code",
|
|
10
12
|
codex: "codex",
|
|
13
|
+
grok: null,
|
|
11
14
|
none: null
|
|
12
15
|
};
|
|
16
|
+
export const resolveHostCliCredential = async (containerReport) => {
|
|
17
|
+
const needsCredential = containerReport.runtime_instances.some((instance) => Object.values(instance.model_auth_methods).some(modelAuthMethodNeedsCliCredential));
|
|
18
|
+
if (!needsCredential) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const codexHome = process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
|
|
22
|
+
const sourcePath = path.join(codexHome, "auth.json");
|
|
23
|
+
if (!await fileExists(sourcePath)) {
|
|
24
|
+
throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source does not exist: ${sourcePath}`);
|
|
25
|
+
}
|
|
26
|
+
let value;
|
|
27
|
+
try {
|
|
28
|
+
value = await readUtf8File(sourcePath);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
if (value.trim().length === 0) {
|
|
34
|
+
throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source is empty: ${sourcePath}`);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
return { name: CLI_CREDENTIAL_SECRET_NAME, sourcePath, value: JSON.stringify(JSON.parse(value)) };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: invalid JSON (${error instanceof Error ? error.message : String(error)})`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
13
43
|
const addCoveredModelSecrets = (coveredModelSecrets, instanceId, secretNames) => {
|
|
14
44
|
for (const secretName of secretNames) {
|
|
15
45
|
coveredModelSecrets.add(`${instanceId}:${secretName}`);
|
|
16
46
|
}
|
|
17
47
|
};
|
|
18
|
-
export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport, authProfile, env, tempRoot) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
48
|
+
export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport, authProfile, env, tempRoot, containerCredentialUid) => {
|
|
49
|
+
// No early return when `authProfile` is null: an adapter's
|
|
50
|
+
// `prepareRuntimeAuth` may still have host-credential staging to do that
|
|
51
|
+
// does not depend on an imported Spawnfile auth profile (e.g. the Pi
|
|
52
|
+
// adapter mounting the host's `~/.grok`/`~/.codex`/antigravity CLI homes
|
|
53
|
+
// for a real-engine org — see `src/runtime/pi/runAuth.ts`). Each adapter is
|
|
54
|
+
// responsible for treating a `null` `authProfile` as "no profile-derived
|
|
55
|
+
// imports available" rather than failing.
|
|
22
56
|
const coveredModelSecrets = new Set();
|
|
57
|
+
let launchIdentity;
|
|
23
58
|
const mountArgs = [];
|
|
24
59
|
for (const instance of containerReport.runtime_instances) {
|
|
25
60
|
const adapter = getRuntimeAdapter(instance.runtime);
|
|
@@ -28,17 +63,28 @@ export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport,
|
|
|
28
63
|
}
|
|
29
64
|
const prepared = await adapter.prepareRuntimeAuth({
|
|
30
65
|
authProfile,
|
|
66
|
+
...(containerCredentialUid === undefined ? {} : { containerCredentialUid }),
|
|
31
67
|
env,
|
|
32
68
|
instance,
|
|
33
69
|
outputDirectory,
|
|
34
70
|
tempRoot
|
|
35
71
|
});
|
|
36
72
|
addCoveredModelSecrets(coveredModelSecrets, instance.id, prepared.coveredModelSecrets);
|
|
73
|
+
if (prepared.launchIdentity) {
|
|
74
|
+
if (launchIdentity && launchIdentity.uid !== prepared.launchIdentity.uid) {
|
|
75
|
+
throw new SpawnfileError("validation_error", "Opaque runtime credentials resolve conflicting launch UIDs");
|
|
76
|
+
}
|
|
77
|
+
launchIdentity = prepared.launchIdentity;
|
|
78
|
+
}
|
|
37
79
|
mountArgs.push(...prepared.mountArgs);
|
|
38
80
|
}
|
|
39
|
-
return {
|
|
81
|
+
return {
|
|
82
|
+
coveredModelSecrets,
|
|
83
|
+
...(launchIdentity ? { launchIdentity } : {}),
|
|
84
|
+
mountArgs
|
|
85
|
+
};
|
|
40
86
|
};
|
|
41
|
-
export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) => {
|
|
87
|
+
export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile, cliCredentialProvided = false) => {
|
|
42
88
|
const requiredImportKinds = new Set();
|
|
43
89
|
for (const instance of containerReport.runtime_instances) {
|
|
44
90
|
for (const method of Object.values(instance.model_auth_methods)) {
|
|
@@ -51,9 +97,15 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
|
|
|
51
97
|
if (requiredImportKinds.size === 0) {
|
|
52
98
|
return;
|
|
53
99
|
}
|
|
54
|
-
if (!authProfile) {
|
|
100
|
+
if (!authProfile && !cliCredentialProvided) {
|
|
55
101
|
throw new SpawnfileError("validation_error", `Auth profile is required for declared model auth methods: ${[...requiredImportKinds].sort().join(", ")}`);
|
|
56
102
|
}
|
|
103
|
+
if (cliCredentialProvided) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!authProfile) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
57
109
|
const missingImportKinds = [...requiredImportKinds]
|
|
58
110
|
.filter((kind) => !authProfile.imports[kind])
|
|
59
111
|
.sort();
|
|
@@ -62,10 +114,16 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
|
|
|
62
114
|
}
|
|
63
115
|
};
|
|
64
116
|
const getImportMountTargetName = (kind) => kind === "claude-code" ? ".claude" : ".codex";
|
|
65
|
-
const createGeneratedRuntimeSecret = (secretName) => {
|
|
117
|
+
const createGeneratedRuntimeSecret = (secretName, generatedMoltnetSecrets) => {
|
|
66
118
|
if (secretName === "OPENCLAW_GATEWAY_TOKEN" || secretName === "OPENCLAW_HOOKS_TOKEN") {
|
|
67
119
|
return randomBytes(24).toString("hex");
|
|
68
120
|
}
|
|
121
|
+
if (generatedMoltnetSecrets.has(secretName)) {
|
|
122
|
+
return randomBytes(32).toString("base64url");
|
|
123
|
+
}
|
|
124
|
+
if (secretName === "SPAWNFILE_DAIMON_CONTROL_TOKEN") {
|
|
125
|
+
return randomBytes(32).toString("base64url");
|
|
126
|
+
}
|
|
69
127
|
return null;
|
|
70
128
|
};
|
|
71
129
|
const hasEnvValue = (env, name) => typeof env[name] === "string" && env[name].length > 0;
|
|
@@ -93,17 +151,23 @@ export const resolveRunEnvironment = (containerReport, authProfile, envFileEnv =
|
|
|
93
151
|
...(authProfile?.env ?? {}),
|
|
94
152
|
...envFileEnv
|
|
95
153
|
};
|
|
154
|
+
const generatedMoltnetSecrets = new Set((containerReport.moltnet?.server_plans ?? [])
|
|
155
|
+
.filter((server) => server.mode === "managed" && server.auth_mode === "bearer")
|
|
156
|
+
.flatMap((server) => (server.auth_tokens ?? []).map((token) => token.secret)));
|
|
96
157
|
for (const name of new Set([...Object.keys(env), ...containerReport.secrets_required])) {
|
|
97
158
|
const processValue = process.env[name];
|
|
98
159
|
if (typeof processValue === "string" && processValue.length > 0) {
|
|
99
160
|
env[name] = processValue;
|
|
100
161
|
}
|
|
101
162
|
}
|
|
102
|
-
for (const name of
|
|
163
|
+
for (const name of new Set([
|
|
164
|
+
...containerReport.runtime_secrets_required,
|
|
165
|
+
...generatedMoltnetSecrets
|
|
166
|
+
])) {
|
|
103
167
|
if (hasEnvValue(env, name)) {
|
|
104
168
|
continue;
|
|
105
169
|
}
|
|
106
|
-
const generatedValue = createGeneratedRuntimeSecret(name);
|
|
170
|
+
const generatedValue = createGeneratedRuntimeSecret(name, generatedMoltnetSecrets);
|
|
107
171
|
if (generatedValue) {
|
|
108
172
|
env[name] = generatedValue;
|
|
109
173
|
}
|
|
@@ -121,6 +185,27 @@ export const assertRunEnvironmentSatisfied = (containerReport, env, coveredModel
|
|
|
121
185
|
throw new SpawnfileError("validation_error", `Missing required runtime env: ${missing.sort().join(", ")}`);
|
|
122
186
|
}
|
|
123
187
|
};
|
|
188
|
+
export const assertMoltnetCredentialValuesDistinct = (containerReport, env) => {
|
|
189
|
+
for (const server of containerReport.moltnet?.server_plans ?? []) {
|
|
190
|
+
if (server.mode !== "managed" || server.auth_mode !== "bearer") {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const secretNames = (server.auth_tokens ?? []).map((token) => token.secret);
|
|
194
|
+
const normalizedValues = secretNames.map((name) => {
|
|
195
|
+
const value = env[name];
|
|
196
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
if (value !== value.trim()) {
|
|
200
|
+
throw new SpawnfileError("validation_error", `Moltnet credential ${name} must not contain leading or trailing whitespace`);
|
|
201
|
+
}
|
|
202
|
+
return value;
|
|
203
|
+
}).filter((value) => value !== null);
|
|
204
|
+
if (new Set(normalizedValues).size !== normalizedValues.length) {
|
|
205
|
+
throw new SpawnfileError("validation_error", `Moltnet network ${server.network_id} requires distinct credential values`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
124
209
|
export const renderDockerEnvFile = (env) => `${Object.entries(env)
|
|
125
210
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
126
211
|
.map(([name, value]) => `${name}=${value}`)
|
|
@@ -142,6 +227,15 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
|
|
|
142
227
|
return [];
|
|
143
228
|
}
|
|
144
229
|
const args = [];
|
|
230
|
+
// Pi owns its model and CLI-engine auth projection in preparePiRuntimeAuth.
|
|
231
|
+
// Mounting the generic imported home onto the same destination would create
|
|
232
|
+
// duplicate Docker mount points and bypass the adapter's minimal-file staging.
|
|
233
|
+
const piRuntimeHomes = new Set(containerReport.runtime_instances
|
|
234
|
+
.filter((instance) => instance.runtime === "pi")
|
|
235
|
+
.map((instance) => instance.home_path)
|
|
236
|
+
.filter((homePath) => homePath !== null));
|
|
237
|
+
const genericRuntimeHomes = containerReport.runtime_homes
|
|
238
|
+
.filter((runtimeHome) => !piRuntimeHomes.has(runtimeHome));
|
|
145
239
|
for (const [kind, entry] of Object.entries(authProfile.imports)) {
|
|
146
240
|
if (!entry) {
|
|
147
241
|
continue;
|
|
@@ -149,7 +243,7 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
|
|
|
149
243
|
if (!(await fileExists(entry.path))) {
|
|
150
244
|
throw new SpawnfileError("validation_error", `Imported auth path for ${kind} does not exist: ${entry.path}`);
|
|
151
245
|
}
|
|
152
|
-
for (const runtimeHome of
|
|
246
|
+
for (const runtimeHome of genericRuntimeHomes) {
|
|
153
247
|
args.push("-v", `${entry.path}:${path.posix.join(runtimeHome, getImportMountTargetName(kind))}`);
|
|
154
248
|
}
|
|
155
249
|
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CompileProjectResult } from "./compileProject.js";
|
|
2
|
+
export { DAIMON_CODEX_NATIVE_SANDBOX_DOCKER_SECURITY_OPTS } from "../shared/index.js";
|
|
3
|
+
export declare const resolveDaimonCodexNativeSandboxDockerSecurityOptions: (compileResult: CompileProjectResult) => Promise<string[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readUtf8File } from "../filesystem/index.js";
|
|
3
|
+
import { daimonEngineDockerSecurityArgsForConfigs, materializeDaimonGrokSeccompProfile, SpawnfileError } from "../shared/index.js";
|
|
4
|
+
export { DAIMON_CODEX_NATIVE_SANDBOX_DOCKER_SECURITY_OPTS } from "../shared/index.js";
|
|
5
|
+
const assertContainedPath = (root, candidate) => {
|
|
6
|
+
const normalizedRoot = path.resolve(root);
|
|
7
|
+
const normalizedCandidate = path.resolve(candidate);
|
|
8
|
+
const relative = path.relative(normalizedRoot, normalizedCandidate);
|
|
9
|
+
if (relative === "" || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
10
|
+
throw new SpawnfileError("validation_error", "Daimon generated config path escapes the compiled container rootfs");
|
|
11
|
+
}
|
|
12
|
+
return normalizedCandidate;
|
|
13
|
+
};
|
|
14
|
+
const configPathInOutput = (outputDirectory, instance) => {
|
|
15
|
+
if (!instance.config_path.startsWith("/")) {
|
|
16
|
+
throw new SpawnfileError("validation_error", "Daimon runtime instance has a non-absolute generated config path");
|
|
17
|
+
}
|
|
18
|
+
const rootfs = path.join(outputDirectory, "container", "rootfs");
|
|
19
|
+
return assertContainedPath(rootfs, path.join(rootfs, `.${instance.config_path}`));
|
|
20
|
+
};
|
|
21
|
+
export const resolveDaimonCodexNativeSandboxDockerSecurityOptions = async (compileResult) => {
|
|
22
|
+
const instances = compileResult.report.container?.runtime_instances
|
|
23
|
+
.filter((instance) => instance.runtime === "daimon") ?? [];
|
|
24
|
+
const sources = [];
|
|
25
|
+
for (const instance of instances) {
|
|
26
|
+
try {
|
|
27
|
+
sources.push(await readUtf8File(configPathInOutput(compileResult.outputDirectory, instance)));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof SpawnfileError)
|
|
31
|
+
throw error;
|
|
32
|
+
throw new SpawnfileError("validation_error", "Could not read Daimon's generated organization config before Docker launch");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return daimonEngineDockerSecurityArgsForConfigs(sources, () => materializeDaimonGrokSeccompProfile(path.join(compileResult.outputDirectory, "container", "security")));
|
|
36
|
+
};
|
|
@@ -5,15 +5,26 @@ export interface DockerRunInvocation {
|
|
|
5
5
|
cwd: string;
|
|
6
6
|
detach: boolean;
|
|
7
7
|
deploymentName?: string | null;
|
|
8
|
+
deploymentLabels?: Readonly<Record<string, string>>;
|
|
8
9
|
dockerContext?: string | null;
|
|
9
10
|
dockerHost?: string | null;
|
|
10
11
|
envFilePath: string;
|
|
12
|
+
/** Host-stable credential realms that must have at most one live deployment. */
|
|
13
|
+
exclusiveReattachVolumes?: readonly string[];
|
|
11
14
|
imageTag: string;
|
|
15
|
+
onDetachedStarted?: (result: DockerRunResult) => Promise<void>;
|
|
16
|
+
/** Ephemeral guard; never serialized into reports, records, or labels. */
|
|
17
|
+
opaqueDaimonCredentials?: boolean;
|
|
12
18
|
supportDirectory: string;
|
|
13
19
|
}
|
|
14
20
|
export interface DockerRunResult {
|
|
15
21
|
containerId?: string;
|
|
22
|
+
containerName?: string;
|
|
23
|
+
deploymentLabels?: Readonly<Record<string, string>>;
|
|
16
24
|
imageId?: string;
|
|
17
25
|
}
|
|
18
26
|
export type DockerRunRunner = (invocation: DockerRunInvocation) => Promise<DockerRunResult | void>;
|
|
27
|
+
export declare const createDetachedContainerInspectArgs: (invocation: DockerRunInvocation, containerId: string) => string[];
|
|
28
|
+
export declare const parseDetachedContainerInspect: (stdout: string, expectedContainerId: string, expectedLabels?: Readonly<Record<string, string>>, expectedContainerName?: string | null) => DockerRunResult;
|
|
29
|
+
export declare const inspectDetachedContainer: (invocation: DockerRunInvocation, containerId: string) => Promise<DockerRunResult>;
|
|
19
30
|
export declare const runDockerContainer: DockerRunRunner;
|
|
@@ -2,6 +2,8 @@ import { execFile as execFileCallback, spawn } from "node:child_process";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
|
+
import { assertOpaqueDaimonCredentialsHaveNoUserNamespace, pinOpaqueDaimonDockerEndpoint } from "./runProjectDockerDaimonGuards.js";
|
|
6
|
+
import { withExclusiveVolumeReservations } from "./runProjectDockerReservation.js";
|
|
5
7
|
const execFile = promisify(execFileCallback);
|
|
6
8
|
const parseDockerContextHost = (stdout) => {
|
|
7
9
|
const trimmed = stdout.trim();
|
|
@@ -132,25 +134,49 @@ const prepareRemoteBindMounts = async (invocation) => {
|
|
|
132
134
|
}
|
|
133
135
|
};
|
|
134
136
|
};
|
|
135
|
-
const
|
|
137
|
+
export const createDetachedContainerInspectArgs = (invocation, containerId) => {
|
|
136
138
|
const base = invocation.dockerContext
|
|
137
139
|
? ["--context", invocation.dockerContext, "inspect"]
|
|
138
140
|
: invocation.dockerHost
|
|
139
141
|
? ["--host", invocation.dockerHost, "inspect"]
|
|
140
142
|
: ["inspect"];
|
|
141
|
-
return [...base, "--format", "{{.Image}}", containerId];
|
|
143
|
+
return [...base, "--format", "{{json .Id}}\n{{json .Name}}\n{{json .Image}}\n{{json .Config.Labels}}", containerId];
|
|
142
144
|
};
|
|
143
|
-
const
|
|
145
|
+
export const parseDetachedContainerInspect = (stdout, expectedContainerId, expectedLabels, expectedContainerName) => {
|
|
146
|
+
const [idRaw, nameRaw, imageRaw, labelsRaw, ...extra] = stdout.trim().split("\n");
|
|
147
|
+
if (!idRaw || !nameRaw || !imageRaw || !labelsRaw || extra.length > 0)
|
|
148
|
+
throw new Error("unexpected inspect response");
|
|
149
|
+
const actualId = JSON.parse(idRaw);
|
|
150
|
+
const actualName = JSON.parse(nameRaw);
|
|
151
|
+
const imageId = JSON.parse(imageRaw);
|
|
152
|
+
const labels = JSON.parse(labelsRaw);
|
|
153
|
+
if (typeof actualId !== "string" || actualId !== expectedContainerId || !/^[a-f0-9]{64}$/u.test(actualId)
|
|
154
|
+
|| typeof actualName !== "string" || actualName !== `/${expectedContainerName ?? ""}`
|
|
155
|
+
|| typeof imageId !== "string" || !/^sha256:[a-f0-9]{64}$/u.test(imageId))
|
|
156
|
+
throw new Error("malformed detached container metadata");
|
|
157
|
+
if (!expectedLabels)
|
|
158
|
+
return { containerId: actualId, containerName: actualName.slice(1), imageId };
|
|
159
|
+
if (!labels || typeof labels !== "object" || Array.isArray(labels))
|
|
160
|
+
throw new Error("missing detached deployment labels");
|
|
161
|
+
const actual = Object.fromEntries(Object.keys(expectedLabels).sort().map((key) => {
|
|
162
|
+
const value = labels[key];
|
|
163
|
+
if (typeof value !== "string" || value !== expectedLabels[key])
|
|
164
|
+
throw new Error("detached deployment label drift");
|
|
165
|
+
return [key, value];
|
|
166
|
+
}));
|
|
167
|
+
return { containerId: actualId, containerName: actualName.slice(1), imageId, deploymentLabels: actual };
|
|
168
|
+
};
|
|
169
|
+
export const inspectDetachedContainer = async (invocation, containerId) => {
|
|
144
170
|
try {
|
|
145
|
-
const { stdout } = await execFile(invocation.command,
|
|
171
|
+
const { stdout } = await execFile(invocation.command, createDetachedContainerInspectArgs(invocation, containerId), {
|
|
146
172
|
cwd: invocation.cwd,
|
|
147
173
|
timeout: 10_000
|
|
148
174
|
});
|
|
149
|
-
return stdout.
|
|
175
|
+
return parseDetachedContainerInspect(stdout, containerId, invocation.deploymentLabels, invocation.containerName);
|
|
150
176
|
}
|
|
151
177
|
catch (error) {
|
|
152
178
|
const message = error instanceof Error ? error.message : String(error);
|
|
153
|
-
throw new SpawnfileError("runtime_error", `Unable to inspect detached container ${containerId}
|
|
179
|
+
throw new SpawnfileError("runtime_error", `Unable to inspect detached container ${containerId}: ${message}`);
|
|
154
180
|
}
|
|
155
181
|
};
|
|
156
182
|
const runPreparedDockerContainer = (prepared) => new Promise((resolve, reject) => {
|
|
@@ -181,8 +207,12 @@ const runPreparedDockerContainer = (prepared) => new Promise((resolve, reject) =
|
|
|
181
207
|
settle(() => resolve(undefined));
|
|
182
208
|
return;
|
|
183
209
|
}
|
|
184
|
-
|
|
185
|
-
.then((
|
|
210
|
+
Promise.resolve(inspectDetachedContainer(prepared.invocation, containerId))
|
|
211
|
+
.then(async (result) => {
|
|
212
|
+
await prepared.invocation.onDetachedStarted?.(result);
|
|
213
|
+
return result;
|
|
214
|
+
})
|
|
215
|
+
.then(resolve)
|
|
186
216
|
.catch(reject);
|
|
187
217
|
return;
|
|
188
218
|
}
|
|
@@ -191,12 +221,30 @@ const runPreparedDockerContainer = (prepared) => new Promise((resolve, reject) =
|
|
|
191
221
|
: `Docker run for ${prepared.invocation.imageTag} failed with exit code ${code ?? "unknown"}`));
|
|
192
222
|
});
|
|
193
223
|
});
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
224
|
+
const runDockerContainerPrepared = async (invocation) => {
|
|
225
|
+
const run = async () => {
|
|
226
|
+
if (!invocation.dockerContext || collectBindMountSources(invocation.args).length === 0) {
|
|
227
|
+
if (invocation.opaqueDaimonCredentials && !invocation.dockerEndpointPinned) {
|
|
228
|
+
await assertOpaqueDaimonCredentialsHaveNoUserNamespace(invocation);
|
|
229
|
+
return await runPreparedDockerContainer({
|
|
230
|
+
cleanup: async () => undefined,
|
|
231
|
+
invocation
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return await runPreparedDockerContainer({
|
|
235
|
+
cleanup: async () => undefined,
|
|
236
|
+
invocation
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return await runPreparedDockerContainer(await prepareRemoteBindMounts(invocation));
|
|
240
|
+
};
|
|
241
|
+
return withExclusiveVolumeReservations(invocation, run);
|
|
202
242
|
};
|
|
243
|
+
export const runDockerContainer = (invocation) => invocation.opaqueDaimonCredentials
|
|
244
|
+
? pinOpaqueDaimonDockerEndpoint(invocation)
|
|
245
|
+
.then(async (pinned) => {
|
|
246
|
+
await assertOpaqueDaimonCredentialsHaveNoUserNamespace(pinned);
|
|
247
|
+
return pinned;
|
|
248
|
+
})
|
|
249
|
+
.then((pinned) => runDockerContainerPrepared({ ...pinned, dockerEndpointPinned: true }))
|
|
250
|
+
: runDockerContainerPrepared(invocation);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface DaimonDockerGuardInvocation {
|
|
2
|
+
args: string[];
|
|
3
|
+
command: string;
|
|
4
|
+
cwd: string;
|
|
5
|
+
dockerContext?: string | null;
|
|
6
|
+
dockerHost?: string | null;
|
|
7
|
+
opaqueDaimonCredentials?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolves a possibly mutable Docker context once, validates that endpoint,
|
|
11
|
+
* then makes every remaining Docker operation use the immutable endpoint.
|
|
12
|
+
*/
|
|
13
|
+
export declare const pinOpaqueDaimonDockerEndpoint: <T extends DaimonDockerGuardInvocation>(invocation: T) => Promise<T>;
|
|
14
|
+
export declare const assertOpaqueDaimonCredentialsUseLocalDaemon: (invocation: DaimonDockerGuardInvocation) => Promise<void>;
|
|
15
|
+
export declare const assertOpaqueDaimonCredentialsHaveNoUserNamespace: (invocation: DaimonDockerGuardInvocation) => Promise<void>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
4
|
+
const execFile = promisify(execFileCallback);
|
|
5
|
+
const parseDockerContextHost = (stdout) => {
|
|
6
|
+
const trimmed = stdout.trim();
|
|
7
|
+
if (!trimmed)
|
|
8
|
+
return null;
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(trimmed);
|
|
11
|
+
return typeof parsed === "string" ? parsed : null;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return trimmed;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const resolveDockerContextHost = async (invocation, context) => {
|
|
18
|
+
const { stdout } = await execFile(invocation.command, [
|
|
19
|
+
"context", "inspect", context, "--format", "{{json .Endpoints.docker.Host}}"
|
|
20
|
+
], { cwd: invocation.cwd, timeout: 10_000 });
|
|
21
|
+
return parseDockerContextHost(stdout);
|
|
22
|
+
};
|
|
23
|
+
const resolveActiveDockerContext = async (invocation) => {
|
|
24
|
+
const { stdout } = await execFile(invocation.command, ["context", "show"], {
|
|
25
|
+
cwd: invocation.cwd,
|
|
26
|
+
timeout: 10_000
|
|
27
|
+
});
|
|
28
|
+
const context = stdout.trim();
|
|
29
|
+
if (!context || /\s/u.test(context)) {
|
|
30
|
+
throw new SpawnfileError("validation_error", "Unable to attest the active Docker context for opaque Daimon credentials");
|
|
31
|
+
}
|
|
32
|
+
return context;
|
|
33
|
+
};
|
|
34
|
+
const resolveDockerDaemonEndpoint = async (invocation) => {
|
|
35
|
+
if (invocation.dockerContext)
|
|
36
|
+
return resolveDockerContextHost(invocation, invocation.dockerContext);
|
|
37
|
+
if (invocation.dockerHost)
|
|
38
|
+
return invocation.dockerHost;
|
|
39
|
+
const ambientContext = process.env.DOCKER_CONTEXT?.trim();
|
|
40
|
+
if (ambientContext)
|
|
41
|
+
return resolveDockerContextHost(invocation, ambientContext);
|
|
42
|
+
const ambientHost = process.env.DOCKER_HOST?.trim();
|
|
43
|
+
if (ambientHost)
|
|
44
|
+
return ambientHost;
|
|
45
|
+
return resolveDockerContextHost(invocation, await resolveActiveDockerContext(invocation));
|
|
46
|
+
};
|
|
47
|
+
const isLocalDockerEndpoint = (host) => {
|
|
48
|
+
if (host.startsWith("/"))
|
|
49
|
+
return true;
|
|
50
|
+
if (host.startsWith("unix://")) {
|
|
51
|
+
try {
|
|
52
|
+
const endpoint = new URL(host);
|
|
53
|
+
return endpoint.host === "" && endpoint.pathname.startsWith("/");
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return host.startsWith("npipe:////./pipe/") || host.startsWith("npipe://./pipe/");
|
|
60
|
+
};
|
|
61
|
+
const explicitLocalEndpoint = (endpoint) => endpoint.startsWith("/") ? `unix://${endpoint}` : endpoint;
|
|
62
|
+
const withPinnedDockerEndpoint = (invocation, endpoint) => {
|
|
63
|
+
const run = invocation.args.indexOf("run");
|
|
64
|
+
if (run < 0) {
|
|
65
|
+
throw new SpawnfileError("validation_error", "Unable to pin Docker daemon endpoint for opaque Daimon credentials");
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
...invocation,
|
|
69
|
+
args: ["--host", endpoint, ...invocation.args.slice(run)],
|
|
70
|
+
dockerContext: null,
|
|
71
|
+
dockerHost: endpoint
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Resolves a possibly mutable Docker context once, validates that endpoint,
|
|
76
|
+
* then makes every remaining Docker operation use the immutable endpoint.
|
|
77
|
+
*/
|
|
78
|
+
export const pinOpaqueDaimonDockerEndpoint = async (invocation) => {
|
|
79
|
+
if (!invocation.opaqueDaimonCredentials)
|
|
80
|
+
return invocation;
|
|
81
|
+
let resolved;
|
|
82
|
+
try {
|
|
83
|
+
resolved = await resolveDockerDaemonEndpoint(invocation);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof SpawnfileError)
|
|
87
|
+
throw error;
|
|
88
|
+
throw new SpawnfileError("validation_error", "Unable to attest the Docker daemon locality for opaque Daimon credentials");
|
|
89
|
+
}
|
|
90
|
+
if (!resolved || !isLocalDockerEndpoint(resolved)) {
|
|
91
|
+
throw new SpawnfileError("validation_error", "Opaque Daimon credentials require a local Docker daemon; remote and SSH daemons are unsupported");
|
|
92
|
+
}
|
|
93
|
+
return withPinnedDockerEndpoint(invocation, explicitLocalEndpoint(resolved));
|
|
94
|
+
};
|
|
95
|
+
export const assertOpaqueDaimonCredentialsUseLocalDaemon = async (invocation) => {
|
|
96
|
+
await pinOpaqueDaimonDockerEndpoint(invocation);
|
|
97
|
+
};
|
|
98
|
+
export const assertOpaqueDaimonCredentialsHaveNoUserNamespace = async (invocation) => {
|
|
99
|
+
if (!invocation.opaqueDaimonCredentials)
|
|
100
|
+
return;
|
|
101
|
+
if (invocation.dockerContext || !invocation.dockerHost) {
|
|
102
|
+
throw new SpawnfileError("validation_error", "Opaque Daimon credentials require a pinned Docker daemon endpoint before Docker info");
|
|
103
|
+
}
|
|
104
|
+
const args = [
|
|
105
|
+
"--host", invocation.dockerHost,
|
|
106
|
+
"info", "--format", "{{json .SecurityOptions}}"
|
|
107
|
+
];
|
|
108
|
+
let securityOptions;
|
|
109
|
+
try {
|
|
110
|
+
const { stdout } = await execFile(invocation.command, args, {
|
|
111
|
+
cwd: invocation.cwd,
|
|
112
|
+
timeout: 10_000
|
|
113
|
+
});
|
|
114
|
+
securityOptions = JSON.parse(stdout.trim());
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
throw new SpawnfileError("validation_error", "Unable to verify that the Docker daemon has no user namespace remapping for opaque Daimon credentials");
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(securityOptions) || securityOptions.some((value) => typeof value !== "string" || /userns|rootless/iu.test(value))) {
|
|
120
|
+
throw new SpawnfileError("validation_error", "Opaque Daimon credentials require a Docker daemon without user namespace remapping");
|
|
121
|
+
}
|
|
122
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DockerRunInvocation, DockerRunResult } from "./runProjectDocker.js";
|
|
2
|
+
/** Holds daemon-side atomic volume reservations through verified startup. */
|
|
3
|
+
export declare const withExclusiveVolumeReservations: (invocation: DockerRunInvocation, operation: () => Promise<DockerRunResult | void>) => Promise<DockerRunResult | void>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
5
|
+
const execFile = promisify(execFileCallback);
|
|
6
|
+
const dockerId = /^[a-f0-9]{64}$/u;
|
|
7
|
+
const versionLabel = "com.spawnfile.exclusive-volume-reservation";
|
|
8
|
+
const ownerLabel = "com.spawnfile.exclusive-volume-owner";
|
|
9
|
+
const volumeLabel = "com.spawnfile.exclusive-volume-digest";
|
|
10
|
+
const endpointArgs = (invocation) => invocation.dockerContext
|
|
11
|
+
? ["--context", invocation.dockerContext]
|
|
12
|
+
: invocation.dockerHost ? ["--host", invocation.dockerHost] : [];
|
|
13
|
+
const execute = async (invocation, args) => {
|
|
14
|
+
const { stdout } = await execFile(invocation.command, [...endpointArgs(invocation), ...args], {
|
|
15
|
+
cwd: invocation.cwd,
|
|
16
|
+
timeout: 10_000
|
|
17
|
+
});
|
|
18
|
+
return stdout;
|
|
19
|
+
};
|
|
20
|
+
const reservationName = (digest) => `spawnfile-volume-reservation-${digest.slice("sha256:".length, "sha256:".length + 24)}`;
|
|
21
|
+
const verifyReservation = async (invocation, reservation) => {
|
|
22
|
+
try {
|
|
23
|
+
const [idRaw, labelsRaw, ...extra] = (await execute(invocation, [
|
|
24
|
+
"container", "inspect", "--format", "{{json .Id}}\n{{json .Config.Labels}}", reservation.id
|
|
25
|
+
])).trim().split("\n");
|
|
26
|
+
if (!idRaw || !labelsRaw || extra.length > 0)
|
|
27
|
+
throw new Error("shape");
|
|
28
|
+
const id = JSON.parse(idRaw);
|
|
29
|
+
const labels = JSON.parse(labelsRaw);
|
|
30
|
+
if (id !== reservation.id || !labels || typeof labels !== "object" || Array.isArray(labels))
|
|
31
|
+
throw new Error("identity");
|
|
32
|
+
const values = labels;
|
|
33
|
+
if (values[versionLabel] !== "v1" || values[ownerLabel] !== reservation.owner
|
|
34
|
+
|| values[volumeLabel] !== reservation.volumeDigest)
|
|
35
|
+
throw new Error("authority");
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation identity is unavailable");
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const release = async (invocation, reservations) => {
|
|
42
|
+
let failed = false;
|
|
43
|
+
for (const reservation of [...reservations].reverse()) {
|
|
44
|
+
try {
|
|
45
|
+
await verifyReservation(invocation, reservation);
|
|
46
|
+
await execute(invocation, ["container", "rm", reservation.id]);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
failed = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (failed)
|
|
53
|
+
throw new SpawnfileError("runtime_error", "Unable to release exclusive persistent mount reservation");
|
|
54
|
+
};
|
|
55
|
+
const assertAvailable = async (invocation) => {
|
|
56
|
+
for (const volume of invocation.exclusiveReattachVolumes ?? []) {
|
|
57
|
+
let stdout;
|
|
58
|
+
try {
|
|
59
|
+
stdout = await execute(invocation, [
|
|
60
|
+
"ps", "--filter", `volume=${volume}`, "--format", "{{.Names}}"
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new SpawnfileError("runtime_error", "Unable to verify exclusive persistent mount occupancy");
|
|
65
|
+
}
|
|
66
|
+
const occupants = stdout.split("\n").map((name) => name.trim()).filter(Boolean);
|
|
67
|
+
if (occupants.some((name) => name !== invocation.containerName)) {
|
|
68
|
+
throw new SpawnfileError("runtime_error", "Exclusive persistent mount is attached to another running deployment; stop it before reattaching this lineage");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const acquire = async (invocation) => {
|
|
73
|
+
const reservations = [];
|
|
74
|
+
const volumes = [...new Set(invocation.exclusiveReattachVolumes ?? [])].sort();
|
|
75
|
+
try {
|
|
76
|
+
for (const volume of volumes) {
|
|
77
|
+
const volumeDigest = `sha256:${createHash("sha256").update(volume).digest("hex")}`;
|
|
78
|
+
const owner = randomUUID();
|
|
79
|
+
let id;
|
|
80
|
+
try {
|
|
81
|
+
id = (await execute(invocation, [
|
|
82
|
+
"container", "create", "--name", reservationName(volumeDigest),
|
|
83
|
+
"--label", `${versionLabel}=v1`,
|
|
84
|
+
"--label", `${ownerLabel}=${owner}`,
|
|
85
|
+
"--label", `${volumeLabel}=${volumeDigest}`,
|
|
86
|
+
invocation.imageTag
|
|
87
|
+
])).trim();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation is already held");
|
|
91
|
+
}
|
|
92
|
+
if (!dockerId.test(id))
|
|
93
|
+
throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation returned invalid identity");
|
|
94
|
+
const reservation = { id, owner, volumeDigest };
|
|
95
|
+
reservations.push(reservation);
|
|
96
|
+
await verifyReservation(invocation, reservation);
|
|
97
|
+
}
|
|
98
|
+
await assertAvailable(invocation);
|
|
99
|
+
return reservations;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (reservations.length > 0)
|
|
103
|
+
await release(invocation, reservations);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
/** Holds daemon-side atomic volume reservations through verified startup. */
|
|
108
|
+
export const withExclusiveVolumeReservations = async (invocation, operation) => {
|
|
109
|
+
if ((invocation.exclusiveReattachVolumes?.length ?? 0) === 0)
|
|
110
|
+
return operation();
|
|
111
|
+
const reservations = await acquire(invocation);
|
|
112
|
+
try {
|
|
113
|
+
return await operation();
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await release(invocation, reservations);
|
|
117
|
+
}
|
|
118
|
+
};
|