spawnfile 0.1.14 → 0.1.18
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 +46 -5
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +13 -10
- 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/trainingGrokWriteback.d.ts +4 -0
- package/dist/auth/trainingGrokWriteback.js +119 -0
- package/dist/auth/trainingGrokWritebackLock.d.ts +5 -0
- package/dist/auth/trainingGrokWritebackLock.js +56 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +18 -5
- 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 +17 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +6 -2
- package/dist/cli/downCommand.d.ts +2 -0
- package/dist/cli/downCommand.js +22 -8
- package/dist/cli/envFileOption.d.ts +18 -0
- package/dist/cli/envFileOption.js +20 -0
- 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/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +3 -1
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/lifecyclePlan.d.ts +1 -0
- package/dist/cli/lifecyclePlan.js +2 -0
- package/dist/cli/paideiaDelegation.d.ts +18 -0
- package/dist/cli/paideiaDelegation.js +211 -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/recordCommands.d.ts +17 -0
- package/dist/cli/recordCommands.js +43 -0
- package/dist/cli/releaseCommand.d.ts +6 -0
- package/dist/cli/releaseCommand.js +91 -0
- package/dist/cli/runCli.d.ts +19 -3
- package/dist/cli/runCli.js +43 -10
- package/dist/cli/runPublishCommands.js +5 -3
- 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 +114 -0
- package/dist/cli/upCommand.js +40 -7
- 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/volumeCommands.d.ts +8 -0
- package/dist/cli/volumeCommands.js +53 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/agentNodeMerge.js +3 -2
- package/dist/compiler/buildCompilePlan.js +4 -0
- package/dist/compiler/buildCompilePlanAgent.js +3 -1
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/buildCompilePlanTraversal.js +2 -0
- package/dist/compiler/buildCompilePlanTraversalHelpers.d.ts +2 -2
- package/dist/compiler/buildCompilePlanTraversalHelpers.js +4 -3
- package/dist/compiler/buildProject.d.ts +10 -0
- package/dist/compiler/buildProject.js +14 -2
- package/dist/compiler/cleanCompileOutput.d.ts +2 -0
- package/dist/compiler/cleanCompileOutput.js +14 -0
- package/dist/compiler/compilePlanHelpers.js +5 -0
- package/dist/compiler/compileProject.d.ts +12 -0
- package/dist/compiler/compileProject.js +33 -3
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifactSummaries.js +1 -0
- package/dist/compiler/containerArtifacts.d.ts +7 -5
- package/dist/compiler/containerArtifacts.js +77 -41
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +31 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +15 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +114 -0
- package/dist/compiler/containerDaimonBrokerRender.js +194 -0
- package/dist/compiler/containerDaimonGrokTaskClock.d.ts +5 -0
- package/dist/compiler/containerDaimonGrokTaskClock.js +29 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +130 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +197 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +281 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +25 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +204 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +291 -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 +32 -1
- package/dist/compiler/containerTargetResources.js +115 -15
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +52 -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 +5 -0
- package/dist/compiler/index.js +5 -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/mcpPlaceholders.d.ts +11 -0
- package/dist/compiler/mcpPlaceholders.js +58 -0
- package/dist/compiler/mcpServerInheritance.d.ts +18 -0
- package/dist/compiler/mcpServerInheritance.js +43 -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 +11 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +53 -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/preflightCompilePlan.d.ts +9 -0
- package/dist/compiler/preflightCompilePlan.js +38 -0
- package/dist/compiler/recordingAgentFacts.d.ts +4 -0
- package/dist/compiler/recordingAgentFacts.js +35 -0
- package/dist/compiler/recordingCapability.d.ts +4 -0
- package/dist/compiler/recordingCapability.js +22 -0
- package/dist/compiler/recordingReport.d.ts +4 -0
- package/dist/compiler/recordingReport.js +18 -0
- package/dist/compiler/runProject.d.ts +6 -3
- package/dist/compiler/runProject.js +34 -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/surfaces.d.ts +1 -2
- package/dist/compiler/surfaces.js +0 -1
- package/dist/compiler/syncProjectAuth.js +2 -1
- package/dist/compiler/training/broker/clockProbe.d.ts +6 -0
- package/dist/compiler/training/broker/clockProbe.js +27 -0
- package/dist/compiler/training/broker/declaration.d.ts +47 -0
- package/dist/compiler/training/broker/declaration.js +57 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +126 -0
- package/dist/compiler/training/broker/evaluatorSecrets.d.ts +2 -0
- package/dist/compiler/training/broker/evaluatorSecrets.js +60 -0
- package/dist/compiler/training/broker/index.d.ts +11 -0
- package/dist/compiler/training/broker/index.js +11 -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 +236 -0
- package/dist/compiler/training/broker/paths.js +249 -0
- package/dist/compiler/training/broker/processes.d.ts +51 -0
- package/dist/compiler/training/broker/processes.js +102 -0
- package/dist/compiler/training/broker/projection.d.ts +52 -0
- package/dist/compiler/training/broker/projection.js +88 -0
- package/dist/compiler/training/broker/provisioning.d.ts +78 -0
- package/dist/compiler/training/broker/provisioning.js +231 -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 +43 -0
- package/dist/compiler/training/broker/registration.js +110 -0
- package/dist/compiler/training/broker/reset.d.ts +9 -0
- package/dist/compiler/training/broker/reset.js +71 -0
- package/dist/compiler/training/broker/runtime.d.ts +22 -0
- package/dist/compiler/training/broker/runtime.js +127 -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 +108 -0
- package/dist/compiler/training/broker/supervisor.js +172 -0
- package/dist/compiler/training/broker/taskClock.d.ts +5 -0
- package/dist/compiler/training/broker/taskClock.js +41 -0
- package/dist/compiler/training/compiledAgent.d.ts +21 -0
- package/dist/compiler/training/compiledAgent.js +62 -0
- package/dist/compiler/training/container/contract.d.ts +54 -0
- package/dist/compiler/training/container/contract.js +51 -0
- package/dist/compiler/training/container/evaluators.d.ts +48 -0
- package/dist/compiler/training/container/evaluators.js +50 -0
- package/dist/compiler/training/container/grokWriteback.d.ts +8 -0
- package/dist/compiler/training/container/grokWriteback.js +26 -0
- package/dist/compiler/training/container/index.d.ts +5 -0
- package/dist/compiler/training/container/index.js +3 -0
- package/dist/compiler/training/container/launch.d.ts +21 -0
- package/dist/compiler/training/container/launch.js +264 -0
- package/dist/compiler/training/container/nativeSlots.d.ts +14 -0
- package/dist/compiler/training/container/nativeSlots.js +13 -0
- package/dist/compiler/training/container/outputCopy.d.ts +2 -0
- package/dist/compiler/training/container/outputCopy.js +72 -0
- package/dist/compiler/training/container/outputVolume.d.ts +27 -0
- package/dist/compiler/training/container/outputVolume.js +161 -0
- package/dist/compiler/training/container/prepare.d.ts +10 -0
- package/dist/compiler/training/container/prepare.js +125 -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 +38 -0
- package/dist/compiler/training/container/security.js +68 -0
- package/dist/compiler/training/container/subjectIsolation.d.ts +5 -0
- package/dist/compiler/training/container/subjectIsolation.js +15 -0
- package/dist/compiler/training/context.d.ts +15 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +144 -0
- package/dist/compiler/training/contract.js +36 -0
- package/dist/compiler/training/execution.d.ts +417 -0
- package/dist/compiler/training/execution.js +160 -0
- package/dist/compiler/training/index.d.ts +12 -0
- package/dist/compiler/training/index.js +10 -0
- package/dist/compiler/training/moments.d.ts +80 -0
- package/dist/compiler/training/moments.js +118 -0
- package/dist/compiler/training/output.d.ts +2 -0
- package/dist/compiler/training/output.js +20 -0
- package/dist/compiler/training/plan/contract.d.ts +287 -0
- package/dist/compiler/training/plan/contract.js +49 -0
- package/dist/compiler/training/plan/index.d.ts +5 -0
- package/dist/compiler/training/plan/index.js +4 -0
- package/dist/compiler/training/plan/load.d.ts +9 -0
- package/dist/compiler/training/plan/load.js +153 -0
- package/dist/compiler/training/plan/references.d.ts +19 -0
- package/dist/compiler/training/plan/references.js +57 -0
- package/dist/compiler/training/plan/resolve.d.ts +4 -0
- package/dist/compiler/training/plan/resolve.js +73 -0
- package/dist/compiler/training/plan/targets.d.ts +11 -0
- package/dist/compiler/training/plan/targets.js +71 -0
- package/dist/compiler/training/plan/types.d.ts +36 -0
- package/dist/compiler/training/plan/types.js +1 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +109 -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 +45 -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 +207 -0
- package/dist/compiler/training/preparation/contract.js +113 -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 +29 -0
- package/dist/compiler/training/preparation/files.js +146 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +107 -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 +24 -0
- package/dist/compiler/training/preparation/inputs.js +101 -0
- package/dist/compiler/training/preparation/prepare.d.ts +38 -0
- package/dist/compiler/training/preparation/prepare.js +223 -0
- package/dist/compiler/training/preparation/scratch.d.ts +8 -0
- package/dist/compiler/training/preparation/scratch.js +114 -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 +840 -0
- package/dist/compiler/training/repair/contract.js +33 -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 +382 -0
- package/dist/compiler/training/repair/prepare.js +78 -0
- package/dist/compiler/training/repair/witness.d.ts +352 -0
- package/dist/compiler/training/repair/witness.js +48 -0
- package/dist/compiler/training/resolution.d.ts +25 -0
- package/dist/compiler/training/resolution.js +69 -0
- package/dist/compiler/training/rewind/contract.d.ts +321 -0
- package/dist/compiler/training/rewind/contract.js +39 -0
- package/dist/compiler/training/rewind/deployedResource.d.ts +22 -0
- package/dist/compiler/training/rewind/deployedResource.js +19 -0
- package/dist/compiler/training/rewind/feed.d.ts +12 -0
- package/dist/compiler/training/rewind/feed.js +182 -0
- package/dist/compiler/training/rewind/feedContent.d.ts +6 -0
- package/dist/compiler/training/rewind/feedContent.js +38 -0
- package/dist/compiler/training/rewind/git.d.ts +8 -0
- package/dist/compiler/training/rewind/git.js +159 -0
- package/dist/compiler/training/rewind/gitArchive.d.ts +2 -0
- package/dist/compiler/training/rewind/gitArchive.js +7 -0
- package/dist/compiler/training/rewind/gitHistory.d.ts +3 -0
- package/dist/compiler/training/rewind/gitHistory.js +55 -0
- package/dist/compiler/training/rewind/gitProcess.d.ts +19 -0
- package/dist/compiler/training/rewind/gitProcess.js +81 -0
- package/dist/compiler/training/rewind/gitTree.d.ts +14 -0
- package/dist/compiler/training/rewind/gitTree.js +90 -0
- package/dist/compiler/training/rewind/history.d.ts +28 -0
- package/dist/compiler/training/rewind/history.js +239 -0
- package/dist/compiler/training/rewind/index.d.ts +18 -0
- package/dist/compiler/training/rewind/index.js +15 -0
- package/dist/compiler/training/rewind/inputs.d.ts +9 -0
- package/dist/compiler/training/rewind/inputs.js +67 -0
- package/dist/compiler/training/rewind/instant.d.ts +4 -0
- package/dist/compiler/training/rewind/instant.js +24 -0
- package/dist/compiler/training/rewind/leakCheck.d.ts +10 -0
- package/dist/compiler/training/rewind/leakCheck.js +56 -0
- package/dist/compiler/training/rewind/leakFeed.d.ts +5 -0
- package/dist/compiler/training/rewind/leakFeed.js +25 -0
- package/dist/compiler/training/rewind/leakFiles.d.ts +10 -0
- package/dist/compiler/training/rewind/leakFiles.js +106 -0
- package/dist/compiler/training/rewind/leakGit.d.ts +3 -0
- package/dist/compiler/training/rewind/leakGit.js +78 -0
- package/dist/compiler/training/rewind/leakGitPayload.d.ts +4 -0
- package/dist/compiler/training/rewind/leakGitPayload.js +57 -0
- package/dist/compiler/training/rewind/leakInputs.d.ts +7 -0
- package/dist/compiler/training/rewind/leakInputs.js +135 -0
- package/dist/compiler/training/rewind/leakLayout.d.ts +2 -0
- package/dist/compiler/training/rewind/leakLayout.js +17 -0
- package/dist/compiler/training/rewind/leakProvenance.d.ts +3 -0
- package/dist/compiler/training/rewind/leakProvenance.js +88 -0
- package/dist/compiler/training/rewind/materialize.d.ts +136 -0
- package/dist/compiler/training/rewind/materialize.js +212 -0
- package/dist/compiler/training/rewind/memory.d.ts +10 -0
- package/dist/compiler/training/rewind/memory.js +84 -0
- package/dist/compiler/training/rewind/memorySchemas.d.ts +87 -0
- package/dist/compiler/training/rewind/memorySchemas.js +50 -0
- package/dist/compiler/training/rewind/moltnet.d.ts +2 -0
- package/dist/compiler/training/rewind/moltnet.js +54 -0
- package/dist/compiler/training/rewind/moltnetJson.d.ts +13 -0
- package/dist/compiler/training/rewind/moltnetJson.js +180 -0
- package/dist/compiler/training/rewind/moltnetSchemas.d.ts +1226 -0
- package/dist/compiler/training/rewind/moltnetSchemas.js +75 -0
- package/dist/compiler/training/rewind/moltnetSqlite.d.ts +31 -0
- package/dist/compiler/training/rewind/moltnetSqlite.js +192 -0
- package/dist/compiler/training/rewind/moltnetSqliteData.d.ts +10 -0
- package/dist/compiler/training/rewind/moltnetSqliteData.js +113 -0
- package/dist/compiler/training/rewind/recordInput.d.ts +40 -0
- package/dist/compiler/training/rewind/recordInput.js +49 -0
- package/dist/compiler/training/rewind/recordedBundle.d.ts +4 -0
- package/dist/compiler/training/rewind/recordedBundle.js +58 -0
- package/dist/compiler/training/rewind/recordedCommit.d.ts +2 -0
- package/dist/compiler/training/rewind/recordedCommit.js +10 -0
- package/dist/compiler/training/rewind/select.d.ts +18 -0
- package/dist/compiler/training/rewind/select.js +64 -0
- package/dist/compiler/training/rewind/snapshotManifest.d.ts +42 -0
- package/dist/compiler/training/rewind/snapshotManifest.js +134 -0
- package/dist/compiler/training/rewind/taskClock.d.ts +12 -0
- package/dist/compiler/training/rewind/taskClock.js +40 -0
- package/dist/compiler/training/rewind/timestamps.d.ts +4 -0
- package/dist/compiler/training/rewind/timestamps.js +26 -0
- package/dist/compiler/training/rewind/types.d.ts +43 -0
- package/dist/compiler/training/rewind/types.js +1 -0
- package/dist/compiler/training/rewind/volumes.d.ts +12 -0
- package/dist/compiler/training/rewind/volumes.js +58 -0
- package/dist/compiler/training/selection.d.ts +7 -0
- package/dist/compiler/training/selection.js +15 -0
- package/dist/compiler/types.d.ts +7 -2
- package/dist/compiler/upProject.d.ts +27 -1
- package/dist/compiler/upProject.js +135 -180
- 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 +18 -0
- package/dist/compiler/workspaceBundleArtifacts.js +155 -0
- package/dist/compiler/workspaceBundleCache.d.ts +23 -0
- package/dist/compiler/workspaceBundleCache.js +79 -0
- package/dist/compiler/workspaceBundleDependencies.d.ts +21 -0
- package/dist/compiler/workspaceBundleDependencies.js +122 -0
- package/dist/compiler/workspaceBundleFiles.d.ts +51 -0
- package/dist/compiler/workspaceBundleFiles.js +251 -0
- package/dist/compiler/workspaceBundleGenerated.d.ts +25 -0
- package/dist/compiler/workspaceBundleGenerated.js +103 -0
- package/dist/compiler/workspaceBundleGit.d.ts +64 -0
- package/dist/compiler/workspaceBundleGit.js +154 -0
- package/dist/compiler/workspaceBundleKey.d.ts +34 -0
- package/dist/compiler/workspaceBundleKey.js +17 -0
- package/dist/compiler/workspaceBundleResolve.d.ts +56 -0
- package/dist/compiler/workspaceBundleResolve.js +144 -0
- package/dist/compiler/workspaceBundleRun.d.ts +41 -0
- package/dist/compiler/workspaceBundleRun.js +79 -0
- package/dist/compiler/workspaceBundleTar.d.ts +47 -0
- package/dist/compiler/workspaceBundleTar.js +140 -0
- package/dist/compiler/workspaceBundleTree.d.ts +15 -0
- package/dist/compiler/workspaceBundleTree.js +58 -0
- package/dist/compiler/workspaceGitFetch.d.ts +41 -0
- package/dist/compiler/workspaceGitFetch.js +155 -0
- package/dist/compiler/workspaceGitPins.d.ts +33 -0
- package/dist/compiler/workspaceGitPins.js +127 -0
- package/dist/compiler/workspaceResources.d.ts +9 -2
- package/dist/compiler/workspaceResources.js +39 -7
- package/dist/deployment/activation.d.ts +3 -0
- package/dist/deployment/activation.js +12 -0
- 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/candidateRecording.d.ts +8 -0
- package/dist/deployment/candidateRecording.js +22 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.d.ts +5 -3
- package/dist/deployment/dockerManager.js +21 -5
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +7 -0
- package/dist/deployment/downDeployment.js +114 -9
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/homeStore.d.ts +9 -1
- package/dist/deployment/homeStore.js +16 -53
- package/dist/deployment/index.d.ts +10 -0
- package/dist/deployment/index.js +10 -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/pidLock.d.ts +25 -0
- package/dist/deployment/pidLock.js +81 -0
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/record.d.ts +85 -1
- package/dist/deployment/record.js +11 -5
- package/dist/deployment/recordPublication.d.ts +15 -0
- package/dist/deployment/recordPublication.js +76 -0
- package/dist/deployment/recordedMemoryRetention.d.ts +18 -0
- package/dist/deployment/recordedMemoryRetention.js +27 -0
- package/dist/deployment/resourceLog.d.ts +140 -0
- package/dist/deployment/resourceLog.js +78 -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/buildDistributionReport.d.ts +3 -0
- package/dist/distribution/buildDistributionReport.js +5 -0
- package/dist/distribution/consumeImage.d.ts +5 -0
- package/dist/distribution/consumeImage.js +115 -98
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +20 -0
- package/dist/distribution/consumeImageLifecycle.js +242 -0
- package/dist/distribution/consumeImageSupport.d.ts +19 -0
- package/dist/distribution/consumeImageSupport.js +40 -0
- package/dist/distribution/distributionReportSchema.d.ts +58 -1
- package/dist/distribution/distributionReportSchema.js +35 -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/renderImageInterface.js +1 -1
- package/dist/distribution/types.d.ts +29 -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/durableWrite.d.ts +10 -0
- package/dist/filesystem/durableWrite.js +87 -0
- package/dist/filesystem/index.d.ts +2 -0
- package/dist/filesystem/index.js +2 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/filesystem/retainedJsonl.d.ts +23 -0
- package/dist/filesystem/retainedJsonl.js +123 -0
- package/dist/manifest/commandSchemas.d.ts +5 -0
- package/dist/manifest/commandSchemas.js +5 -0
- package/dist/manifest/executionSchemas.d.ts +47 -0
- package/dist/manifest/executionSchemas.js +31 -2
- package/dist/manifest/index.d.ts +2 -0
- package/dist/manifest/index.js +2 -0
- package/dist/manifest/loadManifest.js +3 -26
- package/dist/manifest/mcpSchemas.d.ts +62 -0
- package/dist/manifest/mcpSchemas.js +57 -8
- package/dist/manifest/memorySchemas.d.ts +1 -1
- package/dist/manifest/memorySchemas.js +1 -1
- package/dist/manifest/parseManifest.d.ts +7 -0
- package/dist/manifest/parseManifest.js +65 -0
- package/dist/manifest/renderSpawnfile.js +4 -1
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +10 -1
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +1419 -120
- package/dist/manifest/schemas.js +19 -6
- 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 +18 -4
- 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/trainingDataSchemas.d.ts +357 -0
- package/dist/manifest/trainingDataSchemas.js +31 -0
- package/dist/manifest/trainingSchemas.d.ts +49 -0
- package/dist/manifest/trainingSchemas.js +44 -0
- package/dist/manifest/volumeFeedSchemas.d.ts +52 -0
- package/dist/manifest/volumeFeedSchemas.js +104 -0
- package/dist/manifest/workspaceSchemas.d.ts +194 -1
- package/dist/manifest/workspaceSchemas.js +117 -2
- package/dist/recording/compose.d.ts +3 -0
- package/dist/recording/compose.js +93 -0
- package/dist/recording/deployment.d.ts +15 -0
- package/dist/recording/deployment.js +38 -0
- package/dist/recording/history.d.ts +16 -0
- package/dist/recording/history.js +47 -0
- package/dist/recording/index.d.ts +9 -0
- package/dist/recording/index.js +9 -0
- package/dist/recording/moment.d.ts +61 -0
- package/dist/recording/moment.js +36 -0
- package/dist/recording/parse.d.ts +15 -0
- package/dist/recording/parse.js +74 -0
- package/dist/recording/read.d.ts +8 -0
- package/dist/recording/read.js +61 -0
- package/dist/recording/store.d.ts +10 -0
- package/dist/recording/store.js +94 -0
- package/dist/recording/sync.d.ts +24 -0
- package/dist/recording/sync.js +126 -0
- package/dist/recording/types.d.ts +45 -0
- package/dist/recording/types.js +2 -0
- package/dist/release/drainControl.d.ts +54 -0
- package/dist/release/drainControl.js +137 -0
- package/dist/release/drainPhase.d.ts +37 -0
- package/dist/release/drainPhase.js +161 -0
- package/dist/release/index.d.ts +11 -0
- package/dist/release/index.js +11 -0
- package/dist/release/ledger.d.ts +75 -0
- package/dist/release/ledger.js +111 -0
- package/dist/release/notify.d.ts +58 -0
- package/dist/release/notify.js +126 -0
- package/dist/release/pending.d.ts +35 -0
- package/dist/release/pending.js +60 -0
- package/dist/release/postDeploy.d.ts +32 -0
- package/dist/release/postDeploy.js +62 -0
- package/dist/release/releaseDefaults.d.ts +9 -0
- package/dist/release/releaseDefaults.js +115 -0
- package/dist/release/releaseDocker.d.ts +38 -0
- package/dist/release/releaseDocker.js +94 -0
- package/dist/release/releaseTypes.d.ts +94 -0
- package/dist/release/releaseTypes.js +1 -0
- package/dist/release/runRelease.d.ts +9 -0
- package/dist/release/runRelease.js +218 -0
- package/dist/release/swap.d.ts +23 -0
- package/dist/release/swap.js +55 -0
- package/dist/release/types.d.ts +50 -0
- package/dist/release/types.js +29 -0
- package/dist/report/index.d.ts +1 -0
- package/dist/report/index.js +1 -0
- package/dist/report/recording.d.ts +57 -0
- package/dist/report/recording.js +26 -0
- package/dist/report/types.d.ts +92 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +46 -35
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +254 -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 +29 -0
- package/dist/runtime/daimon/config.js +321 -0
- package/dist/runtime/daimon/contract-manifest.json +1 -0
- package/dist/runtime/daimon/contract-manifest.sha256 +1 -0
- package/dist/runtime/daimon/contractManifest.d.ts +346 -0
- package/dist/runtime/daimon/contractManifest.js +335 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokTurnLimits.d.ts +25 -0
- package/dist/runtime/daimon/grokTurnLimits.js +51 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +43 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +53 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +27 -0
- package/dist/runtime/daimon/grokWorkerContract.js +60 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/recording.d.ts +19 -0
- package/dist/runtime/daimon/recording.js +50 -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 +11 -0
- package/dist/runtime/daimon/scheduleAuthority.js +31 -0
- package/dist/runtime/daimon/wakeMoments.d.ts +15 -0
- package/dist/runtime/daimon/wakeMoments.js +17 -0
- package/dist/runtime/daimonInstall.d.ts +3 -0
- package/dist/runtime/daimonInstall.js +25 -0
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/install.d.ts +5 -0
- package/dist/runtime/install.js +4 -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 +5 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +5 -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/pi/containerTargets.js +6 -0
- package/dist/runtime/picoclaw/adapter.js +5 -2
- package/dist/runtime/registry.d.ts +6 -0
- package/dist/runtime/registry.js +32 -3
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +40 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +54 -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 +3 -0
- package/dist/shared/index.js +3 -0
- package/dist/shared/recording.d.ts +8 -0
- package/dist/shared/recording.js +25 -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 +5 -3
- 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 +4 -4
- 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/dist/volume/feedLand.d.ts +31 -0
- package/dist/volume/feedLand.js +174 -0
- package/dist/volume/feedLandings.d.ts +45 -0
- package/dist/volume/feedLandings.js +111 -0
- package/dist/volume/feedLayout.d.ts +61 -0
- package/dist/volume/feedLayout.js +234 -0
- package/dist/volume/feedLock.d.ts +7 -0
- package/dist/volume/feedLock.js +131 -0
- package/dist/volume/feedManifest.d.ts +27 -0
- package/dist/volume/feedManifest.js +123 -0
- package/dist/volume/feedPrepare.d.ts +16 -0
- package/dist/volume/feedPrepare.js +228 -0
- package/dist/volume/feedProject.d.ts +39 -0
- package/dist/volume/feedProject.js +92 -0
- package/dist/volume/feedRecord.d.ts +55 -0
- package/dist/volume/feedRecord.js +148 -0
- package/dist/volume/feedRef.d.ts +43 -0
- package/dist/volume/feedRef.js +117 -0
- package/dist/volume/feedRefresh.d.ts +15 -0
- package/dist/volume/feedRefresh.js +187 -0
- package/dist/volume/feedSource.d.ts +66 -0
- package/dist/volume/feedSource.js +104 -0
- package/dist/volume/feedTarget.d.ts +70 -0
- package/dist/volume/feedTarget.js +9 -0
- package/dist/volume/feedTestKit.d.ts +11 -0
- package/dist/volume/feedTestKit.js +45 -0
- package/dist/volume/feedVerify.d.ts +18 -0
- package/dist/volume/feedVerify.js +104 -0
- package/dist/volume/index.d.ts +13 -0
- package/dist/volume/index.js +13 -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 +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +8 -3
- 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
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/local/bin/node
|
|
2
|
+
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { lstat, open, opendir } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
const ROOT = "/spawnfile/evidence";
|
|
8
|
+
const BLOCK = 512;
|
|
9
|
+
const MAX_BYTES = 67_108_864;
|
|
10
|
+
const MAX_ENTRIES = 10_000;
|
|
11
|
+
const MAX_DEPTH = 32;
|
|
12
|
+
const MAX_PATH_BYTES = 255;
|
|
13
|
+
|
|
14
|
+
const fail = () => { throw new Error("Evidence export helper failed"); };
|
|
15
|
+
const pad = (size) => Math.ceil(size / BLOCK) * BLOCK;
|
|
16
|
+
const same = (left, right) => left.dev === right.dev && left.ino === right.ino
|
|
17
|
+
&& left.size === right.size && left.mode === right.mode;
|
|
18
|
+
|
|
19
|
+
const safePath = (value) => {
|
|
20
|
+
const bytes = Buffer.from(value, "utf8");
|
|
21
|
+
if (value.length < 1 || bytes.toString("utf8") !== value
|
|
22
|
+
|| bytes.byteLength > MAX_PATH_BYTES || value.startsWith("/")
|
|
23
|
+
|| value.includes("\\") || value.includes("\0") || value.includes("//")) fail();
|
|
24
|
+
const parts = value.split("/");
|
|
25
|
+
if (parts.length > MAX_DEPTH || parts.some((part) => part === "" || part === "." || part === "..")) fail();
|
|
26
|
+
for (const part of parts) {
|
|
27
|
+
for (let index = 0; index < part.length; index += 1) {
|
|
28
|
+
const code = part.charCodeAt(index);
|
|
29
|
+
if (code < 0x20 || code === 0x7f) fail();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const comparePaths = (left, right) => Buffer.compare(
|
|
36
|
+
Buffer.from(left.path, "utf8"),
|
|
37
|
+
Buffer.from(right.path, "utf8"),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const collect = async (directory, prefix, entries) => {
|
|
41
|
+
const before = await lstat(directory);
|
|
42
|
+
if (!before.isDirectory() || before.isSymbolicLink()) fail();
|
|
43
|
+
const handle = await opendir(directory);
|
|
44
|
+
const names = [];
|
|
45
|
+
try {
|
|
46
|
+
for await (const item of handle) names.push(item.name);
|
|
47
|
+
} finally {
|
|
48
|
+
await handle.close().catch(() => undefined);
|
|
49
|
+
}
|
|
50
|
+
names.sort((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right)));
|
|
51
|
+
for (const name of names) {
|
|
52
|
+
const relative = safePath(prefix ? `${prefix}/${name}` : name);
|
|
53
|
+
const absolute = path.join(directory, name);
|
|
54
|
+
const info = await lstat(absolute);
|
|
55
|
+
if (info.isSymbolicLink()) fail();
|
|
56
|
+
if (info.isDirectory()) {
|
|
57
|
+
entries.push({ info, path: relative, type: "directory" });
|
|
58
|
+
await collect(absolute, relative, entries);
|
|
59
|
+
} else if (info.isFile()) {
|
|
60
|
+
entries.push({ info, path: relative, type: "file" });
|
|
61
|
+
} else fail();
|
|
62
|
+
if (entries.length > MAX_ENTRIES) fail();
|
|
63
|
+
}
|
|
64
|
+
const after = await lstat(directory);
|
|
65
|
+
if (!same(before, after)) fail();
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const octal = (value, width) => {
|
|
69
|
+
const raw = value.toString(8);
|
|
70
|
+
if (!Number.isSafeInteger(value) || value < 0 || raw.length > width - 1) fail();
|
|
71
|
+
return Buffer.from(`${raw.padStart(width - 1, "0")}\0`, "ascii");
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const storedPath = (entry) => entry.type === "directory" ? `${entry.path}/` : entry.path;
|
|
75
|
+
const splitPath = (stored) => {
|
|
76
|
+
const bytes = Buffer.from(stored, "utf8");
|
|
77
|
+
if (bytes.byteLength <= 100) return { name: bytes, prefix: Buffer.alloc(0) };
|
|
78
|
+
for (let split = stored.lastIndexOf("/"); split > 0; split = stored.lastIndexOf("/", split - 1)) {
|
|
79
|
+
const prefix = Buffer.from(stored.slice(0, split), "utf8");
|
|
80
|
+
const name = Buffer.from(stored.slice(split + 1), "utf8");
|
|
81
|
+
if (prefix.byteLength <= 155 && name.byteLength > 0 && name.byteLength <= 100) {
|
|
82
|
+
return { name, prefix };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return fail();
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const header = (entry) => {
|
|
89
|
+
const stored = storedPath(entry);
|
|
90
|
+
const { name, prefix } = splitPath(stored);
|
|
91
|
+
const output = Buffer.alloc(BLOCK);
|
|
92
|
+
output.set(name, 0);
|
|
93
|
+
output.set(octal(entry.type === "directory" ? 0o755 : 0o644, 8), 100);
|
|
94
|
+
output.set(octal(0, 8), 108);
|
|
95
|
+
output.set(octal(0, 8), 116);
|
|
96
|
+
output.set(octal(entry.type === "file" ? entry.info.size : 0, 12), 124);
|
|
97
|
+
output.set(octal(0, 12), 136);
|
|
98
|
+
output[156] = entry.type === "directory" ? 53 : 48;
|
|
99
|
+
output.set(Buffer.from("ustar\0", "ascii"), 257);
|
|
100
|
+
output.set(Buffer.from("00", "ascii"), 263);
|
|
101
|
+
output.set(octal(0, 8), 329);
|
|
102
|
+
output.set(octal(0, 8), 337);
|
|
103
|
+
output.set(prefix, 345);
|
|
104
|
+
output.fill(0x20, 148, 156);
|
|
105
|
+
let sum = 0;
|
|
106
|
+
for (const byte of output) sum += byte;
|
|
107
|
+
if (sum > 0o777777) fail();
|
|
108
|
+
output.set(Buffer.from(`${sum.toString(8).padStart(6, "0")}\0 `, "ascii"), 148);
|
|
109
|
+
return output;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const write = async (bytes) => {
|
|
113
|
+
if (process.stdout.write(bytes)) return;
|
|
114
|
+
await new Promise((resolve, reject) => {
|
|
115
|
+
process.stdout.once("drain", resolve);
|
|
116
|
+
process.stdout.once("error", reject);
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const main = async () => {
|
|
121
|
+
const root = await lstat(ROOT);
|
|
122
|
+
if (!root.isDirectory() || root.isSymbolicLink()) fail();
|
|
123
|
+
const entries = [];
|
|
124
|
+
await collect(ROOT, "", entries);
|
|
125
|
+
entries.sort(comparePaths);
|
|
126
|
+
if (entries.length < 1) fail();
|
|
127
|
+
let total = BLOCK * 2;
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
total += BLOCK + (entry.type === "file" ? pad(entry.info.size) : 0);
|
|
130
|
+
if (!Number.isSafeInteger(total) || total > MAX_BYTES) fail();
|
|
131
|
+
}
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
await write(header(entry));
|
|
134
|
+
if (entry.type !== "file") continue;
|
|
135
|
+
const absolute = path.join(ROOT, entry.path);
|
|
136
|
+
const file = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
137
|
+
try {
|
|
138
|
+
const before = await file.stat();
|
|
139
|
+
if (!before.isFile() || !same(before, entry.info)) fail();
|
|
140
|
+
const bytes = await file.readFile();
|
|
141
|
+
const after = await file.stat();
|
|
142
|
+
if (!same(before, after) || bytes.byteLength !== before.size) fail();
|
|
143
|
+
await write(bytes);
|
|
144
|
+
const padding = pad(bytes.byteLength) - bytes.byteLength;
|
|
145
|
+
if (padding > 0) await write(Buffer.alloc(padding));
|
|
146
|
+
} finally {
|
|
147
|
+
await file.close().catch(() => undefined);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await write(Buffer.alloc(BLOCK * 2));
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
main().catch(() => {
|
|
154
|
+
process.stderr.write("Evidence export helper failed\n");
|
|
155
|
+
process.exitCode = 1;
|
|
156
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type OpaqueTargetHandle } from "../target/contracts.js";
|
|
2
|
+
export declare const PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION: "spawnfile.target-evidence-export-helper.prepared.v1";
|
|
3
|
+
export declare const PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION: "spawnfile.target-evidence-export-helper.private.v3";
|
|
4
|
+
export interface PreparedEvidenceHelperReceipt {
|
|
5
|
+
readonly digest: `sha256:${string}`;
|
|
6
|
+
readonly handle: OpaqueTargetHandle;
|
|
7
|
+
readonly version: typeof PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION;
|
|
8
|
+
}
|
|
9
|
+
export interface PreparedEvidenceHelperPendingRecord {
|
|
10
|
+
readonly base_config_digest: `sha256:${string}`;
|
|
11
|
+
readonly base_image: string;
|
|
12
|
+
readonly context: string;
|
|
13
|
+
readonly daemon_digest: `sha256:${string}`;
|
|
14
|
+
readonly endpoint_digest: `sha256:${string}`;
|
|
15
|
+
readonly platform: {
|
|
16
|
+
readonly architecture: "amd64" | "arm64";
|
|
17
|
+
readonly os: "linux";
|
|
18
|
+
};
|
|
19
|
+
readonly recipe_digest: `sha256:${string}`;
|
|
20
|
+
readonly version: typeof PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION;
|
|
21
|
+
}
|
|
22
|
+
export interface PreparedEvidenceHelperCompletionRecord {
|
|
23
|
+
readonly accepted_image_config_digest: `sha256:${string}`;
|
|
24
|
+
readonly pending_digest: `sha256:${string}`;
|
|
25
|
+
readonly receipt: PreparedEvidenceHelperReceipt;
|
|
26
|
+
readonly version: typeof PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION;
|
|
27
|
+
}
|
|
28
|
+
export interface PreparedEvidenceHelperAuthority {
|
|
29
|
+
readonly completion: PreparedEvidenceHelperCompletionRecord | null;
|
|
30
|
+
readonly pending: PreparedEvidenceHelperPendingRecord;
|
|
31
|
+
}
|
|
32
|
+
export declare const parsePreparedEvidenceHelperReceipt: (raw: unknown) => PreparedEvidenceHelperReceipt;
|
|
33
|
+
export declare const createPreparedEvidenceHelperReceiptBytes: (raw: unknown) => string;
|
|
34
|
+
export declare const pendingDigest: (raw: unknown) => `sha256:${string}`;
|
|
35
|
+
export declare const createPreparedEvidenceHelperReceipt: (input: {
|
|
36
|
+
readonly configDigest: unknown;
|
|
37
|
+
readonly pendingDigest: unknown;
|
|
38
|
+
}) => PreparedEvidenceHelperReceipt;
|
|
39
|
+
export declare const parsePreparedEvidenceHelperPendingRecord: (raw: unknown) => PreparedEvidenceHelperPendingRecord;
|
|
40
|
+
export declare const createPreparedEvidenceHelperPendingBytes: (raw: unknown) => string;
|
|
41
|
+
export declare const parsePreparedEvidenceHelperCompletionRecord: (raw: unknown) => PreparedEvidenceHelperCompletionRecord;
|
|
42
|
+
export declare const createPreparedEvidenceHelperCompletionBytes: (raw: unknown) => string;
|
|
43
|
+
export declare const createPreparedEvidenceHelperKey: (input: {
|
|
44
|
+
readonly baseConfigDigest: string;
|
|
45
|
+
readonly context: string;
|
|
46
|
+
readonly daemonDigest: string;
|
|
47
|
+
readonly endpointDigest: string;
|
|
48
|
+
readonly platform: {
|
|
49
|
+
readonly architecture: string;
|
|
50
|
+
readonly os: string;
|
|
51
|
+
};
|
|
52
|
+
readonly recipeDigest: string;
|
|
53
|
+
}) => string;
|
|
54
|
+
export declare const newPreparedEvidenceHelperPendingRecord: (input: Omit<PreparedEvidenceHelperPendingRecord, "version">) => PreparedEvidenceHelperPendingRecord;
|
|
55
|
+
export declare const newPreparedEvidenceHelperCompletionRecord: (pending: unknown, configDigest: unknown) => PreparedEvidenceHelperCompletionRecord;
|
|
56
|
+
/** Immutable, fsynced pending/completion authority records keyed by exact target facts. */
|
|
57
|
+
export declare class PreparedEvidenceHelperAuthorityStore {
|
|
58
|
+
#private;
|
|
59
|
+
constructor(privateRoot: string);
|
|
60
|
+
load(key: string): Promise<PreparedEvidenceHelperAuthority | null>;
|
|
61
|
+
reserve(key: string, raw: unknown): Promise<PreparedEvidenceHelperPendingRecord>;
|
|
62
|
+
complete(key: string, raw: unknown): Promise<PreparedEvidenceHelperCompletionRecord>;
|
|
63
|
+
}
|
|
64
|
+
export declare const initializePreparedEvidenceHelperAuthorityStore: (privateRoot: unknown) => Promise<PreparedEvidenceHelperAuthorityStore>;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { link, lstat, mkdir, open, realpath, unlink } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { types as nodeTypes } from "node:util";
|
|
6
|
+
import { parseOpaqueTargetHandle } from "../target/contracts.js";
|
|
7
|
+
export const PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION = "spawnfile.target-evidence-export-helper.prepared.v1";
|
|
8
|
+
export const PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION = "spawnfile.target-evidence-export-helper.private.v3";
|
|
9
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
10
|
+
const HANDLE = /^opaque_[a-f0-9]{64}$/u;
|
|
11
|
+
const CONTEXT = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
12
|
+
const ERROR = "Prepared evidence-export helper failed";
|
|
13
|
+
const OWNER = process.getuid?.();
|
|
14
|
+
const fail = () => { throw new Error(ERROR); };
|
|
15
|
+
const hash = (domain, value) => `sha256:${createHash("sha256").update(`spawnfile.evidence-helper.${domain}.v1\0`).update(value).digest("hex")}`;
|
|
16
|
+
const exact = (raw, keys) => raw !== null && typeof raw === "object" && !Array.isArray(raw)
|
|
17
|
+
&& !nodeTypes.isProxy(raw) && Object.getPrototypeOf(raw) === Object.prototype
|
|
18
|
+
&& Reflect.ownKeys(raw).every((key) => typeof key === "string")
|
|
19
|
+
&& Object.keys(raw).sort().join("\0") === [...keys].sort().join("\0")
|
|
20
|
+
&& Object.values(Object.getOwnPropertyDescriptors(raw)).every((item) => item.enumerable && "value" in item);
|
|
21
|
+
const digest = (raw) => typeof raw === "string" && DIGEST.test(raw) ? raw : fail();
|
|
22
|
+
const text = (raw, maximum) => typeof raw === "string" && raw === raw.trim() && !raw.includes("\0")
|
|
23
|
+
&& Buffer.byteLength(raw, "utf8") > 0 && Buffer.byteLength(raw, "utf8") <= maximum ? raw : fail();
|
|
24
|
+
export const parsePreparedEvidenceHelperReceipt = (raw) => {
|
|
25
|
+
if (!exact(raw, ["digest", "handle", "version"])
|
|
26
|
+
|| raw.version !== PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION
|
|
27
|
+
|| typeof raw.handle !== "string" || !HANDLE.test(raw.handle))
|
|
28
|
+
return fail();
|
|
29
|
+
return Object.freeze({ digest: digest(raw.digest), handle: parseOpaqueTargetHandle(raw.handle),
|
|
30
|
+
version: PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION });
|
|
31
|
+
};
|
|
32
|
+
export const createPreparedEvidenceHelperReceiptBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperReceipt(raw));
|
|
33
|
+
export const pendingDigest = (raw) => hash("pending", createPreparedEvidenceHelperPendingBytes(raw));
|
|
34
|
+
export const createPreparedEvidenceHelperReceipt = (input) => {
|
|
35
|
+
const config = digest(input.configDigest);
|
|
36
|
+
const pending = digest(input.pendingDigest);
|
|
37
|
+
const handle = parseOpaqueTargetHandle(`opaque_${hash("prepared-handle", `${pending}\0${config}`).slice(7)}`);
|
|
38
|
+
return Object.freeze({ digest: hash("prepared-receipt", `${PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION}\0${handle}\0${pending}\0${config}`),
|
|
39
|
+
handle, version: PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION });
|
|
40
|
+
};
|
|
41
|
+
export const parsePreparedEvidenceHelperPendingRecord = (raw) => {
|
|
42
|
+
if (!exact(raw, ["base_config_digest", "base_image", "context", "daemon_digest", "endpoint_digest",
|
|
43
|
+
"platform", "recipe_digest", "version"])
|
|
44
|
+
|| raw.version !== PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION
|
|
45
|
+
|| !exact(raw.platform, ["architecture", "os"])
|
|
46
|
+
|| raw.platform.os !== "linux"
|
|
47
|
+
|| raw.platform.architecture !== "amd64" && raw.platform.architecture !== "arm64")
|
|
48
|
+
return fail();
|
|
49
|
+
const context = text(raw.context, 64);
|
|
50
|
+
if (!CONTEXT.test(context))
|
|
51
|
+
return fail();
|
|
52
|
+
return Object.freeze({ base_config_digest: digest(raw.base_config_digest), base_image: text(raw.base_image, 512),
|
|
53
|
+
context, daemon_digest: digest(raw.daemon_digest), endpoint_digest: digest(raw.endpoint_digest),
|
|
54
|
+
platform: Object.freeze({ architecture: raw.platform.architecture, os: "linux" }),
|
|
55
|
+
recipe_digest: digest(raw.recipe_digest),
|
|
56
|
+
version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
|
|
57
|
+
};
|
|
58
|
+
export const createPreparedEvidenceHelperPendingBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperPendingRecord(raw));
|
|
59
|
+
export const parsePreparedEvidenceHelperCompletionRecord = (raw) => {
|
|
60
|
+
if (!exact(raw, ["accepted_image_config_digest", "pending_digest", "receipt", "version"])
|
|
61
|
+
|| raw.version !== PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION)
|
|
62
|
+
return fail();
|
|
63
|
+
const accepted = digest(raw.accepted_image_config_digest);
|
|
64
|
+
const pending = digest(raw.pending_digest);
|
|
65
|
+
const receipt = parsePreparedEvidenceHelperReceipt(raw.receipt);
|
|
66
|
+
const expected = createPreparedEvidenceHelperReceipt({ configDigest: accepted, pendingDigest: pending });
|
|
67
|
+
if (receipt.handle !== expected.handle || receipt.digest !== expected.digest)
|
|
68
|
+
return fail();
|
|
69
|
+
return Object.freeze({ accepted_image_config_digest: accepted, pending_digest: pending, receipt,
|
|
70
|
+
version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
|
|
71
|
+
};
|
|
72
|
+
export const createPreparedEvidenceHelperCompletionBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperCompletionRecord(raw));
|
|
73
|
+
export const createPreparedEvidenceHelperKey = (input) => hash("private-record", [input.context, input.endpointDigest, input.daemonDigest,
|
|
74
|
+
input.platform.os, input.platform.architecture, input.baseConfigDigest, input.recipeDigest].join("\0")).slice(7);
|
|
75
|
+
export const newPreparedEvidenceHelperPendingRecord = (input) => parsePreparedEvidenceHelperPendingRecord({ ...input, version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
|
|
76
|
+
export const newPreparedEvidenceHelperCompletionRecord = (pending, configDigest) => {
|
|
77
|
+
const pendingRecord = parsePreparedEvidenceHelperPendingRecord(pending);
|
|
78
|
+
const pendingHash = pendingDigest(pendingRecord);
|
|
79
|
+
const accepted = digest(configDigest);
|
|
80
|
+
return parsePreparedEvidenceHelperCompletionRecord({ accepted_image_config_digest: accepted, pending_digest: pendingHash,
|
|
81
|
+
receipt: createPreparedEvidenceHelperReceipt({ configDigest: accepted, pendingDigest: pendingHash }),
|
|
82
|
+
version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
|
|
83
|
+
};
|
|
84
|
+
const root = async (raw) => {
|
|
85
|
+
if (typeof raw !== "string" || !path.isAbsolute(raw) || path.normalize(raw) !== raw
|
|
86
|
+
|| raw === path.parse(raw).root)
|
|
87
|
+
return fail();
|
|
88
|
+
let existed = true;
|
|
89
|
+
try {
|
|
90
|
+
await lstat(raw);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error.code !== "ENOENT")
|
|
94
|
+
return fail();
|
|
95
|
+
existed = false;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await mkdir(raw, { mode: 0o700, recursive: true });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return fail();
|
|
102
|
+
}
|
|
103
|
+
const info = await lstat(raw).catch(fail);
|
|
104
|
+
if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o777) !== 0o700
|
|
105
|
+
|| OWNER !== undefined && info.uid !== OWNER || await realpath(raw).catch(fail) !== raw)
|
|
106
|
+
return fail();
|
|
107
|
+
await syncRoot(raw);
|
|
108
|
+
if (!existed)
|
|
109
|
+
await syncRoot(path.dirname(raw));
|
|
110
|
+
return raw;
|
|
111
|
+
};
|
|
112
|
+
const readFile = async (file, links = [1]) => {
|
|
113
|
+
let handle;
|
|
114
|
+
try {
|
|
115
|
+
handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (error.code === "ENOENT")
|
|
119
|
+
return null;
|
|
120
|
+
return fail();
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const info = await handle.stat();
|
|
124
|
+
if (!info.isFile() || !links.includes(info.nlink) || info.size < 1 || info.size > 16_384
|
|
125
|
+
|| (info.mode & 0o777) !== 0o600 || OWNER !== undefined && info.uid !== OWNER)
|
|
126
|
+
return fail();
|
|
127
|
+
return await handle.readFile({ encoding: "utf8" });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return fail();
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
await handle?.close().catch(() => undefined);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const syncRoot = async (directory) => {
|
|
137
|
+
const handle = await open(directory, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW).catch(fail);
|
|
138
|
+
try {
|
|
139
|
+
await handle.sync();
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await handle.close().catch(() => undefined);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
/** Immutable, fsynced pending/completion authority records keyed by exact target facts. */
|
|
146
|
+
export class PreparedEvidenceHelperAuthorityStore {
|
|
147
|
+
#root;
|
|
148
|
+
constructor(privateRoot) { this.#root = privateRoot; }
|
|
149
|
+
async load(key) {
|
|
150
|
+
const pending = await this.#read(key, "pending", parsePreparedEvidenceHelperPendingRecord);
|
|
151
|
+
if (!pending)
|
|
152
|
+
return null;
|
|
153
|
+
// A writer fsyncs before and after publication. A racing reader may observe
|
|
154
|
+
// the link before that writer reaches its directory fsync, so it must make
|
|
155
|
+
// the accepted transaction durable before proceeding to a Docker mutation.
|
|
156
|
+
await syncRoot(this.#root);
|
|
157
|
+
const completion = await this.#read(key, "complete", parsePreparedEvidenceHelperCompletionRecord);
|
|
158
|
+
if (completion)
|
|
159
|
+
await syncRoot(this.#root);
|
|
160
|
+
if (completion && completion.pending_digest !== pendingDigest(pending))
|
|
161
|
+
return fail();
|
|
162
|
+
return Object.freeze({ completion, pending });
|
|
163
|
+
}
|
|
164
|
+
async reserve(key, raw) {
|
|
165
|
+
const record = parsePreparedEvidenceHelperPendingRecord(raw);
|
|
166
|
+
return this.#publish(key, "pending", record, createPreparedEvidenceHelperPendingBytes, parsePreparedEvidenceHelperPendingRecord);
|
|
167
|
+
}
|
|
168
|
+
async complete(key, raw) {
|
|
169
|
+
const pending = await this.#read(key, "pending", parsePreparedEvidenceHelperPendingRecord);
|
|
170
|
+
if (!pending)
|
|
171
|
+
return fail();
|
|
172
|
+
const record = parsePreparedEvidenceHelperCompletionRecord(raw);
|
|
173
|
+
if (record.pending_digest !== pendingDigest(pending))
|
|
174
|
+
return fail();
|
|
175
|
+
return this.#publish(key, "complete", record, createPreparedEvidenceHelperCompletionBytes, parsePreparedEvidenceHelperCompletionRecord);
|
|
176
|
+
}
|
|
177
|
+
async #read(key, phase, parser) {
|
|
178
|
+
if (!/^[a-f0-9]{64}$/u.test(key))
|
|
179
|
+
return fail();
|
|
180
|
+
const file = path.join(this.#root, `${key}.${phase}.json`);
|
|
181
|
+
const complete = await readFile(file, [1, 2]);
|
|
182
|
+
if (complete === null)
|
|
183
|
+
return null;
|
|
184
|
+
try {
|
|
185
|
+
return parser(JSON.parse(complete));
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return fail();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async #publish(key, phase, raw, bytesFor, parser) {
|
|
192
|
+
if (!/^[a-f0-9]{64}$/u.test(key))
|
|
193
|
+
return fail();
|
|
194
|
+
const bytes = bytesFor(raw);
|
|
195
|
+
const existing = await this.#read(key, phase, parser);
|
|
196
|
+
if (existing) {
|
|
197
|
+
await syncRoot(this.#root);
|
|
198
|
+
return bytesFor(existing) === bytes ? existing : fail();
|
|
199
|
+
}
|
|
200
|
+
const file = path.join(this.#root, `${key}.${phase}.json`);
|
|
201
|
+
const stage = path.join(this.#root, `.${key}.${phase}.${randomBytes(12).toString("hex")}.stage`);
|
|
202
|
+
let handle;
|
|
203
|
+
try {
|
|
204
|
+
handle = await open(stage, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
|
|
205
|
+
await handle.writeFile(bytes, "utf8");
|
|
206
|
+
await handle.sync();
|
|
207
|
+
await handle.close();
|
|
208
|
+
handle = undefined;
|
|
209
|
+
await syncRoot(this.#root);
|
|
210
|
+
await link(stage, file);
|
|
211
|
+
await syncRoot(this.#root);
|
|
212
|
+
await unlink(stage);
|
|
213
|
+
await syncRoot(this.#root);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
await handle?.close().catch(() => undefined);
|
|
217
|
+
const published = await this.#read(key, phase, parser);
|
|
218
|
+
if (!published || bytesFor(published) !== bytes)
|
|
219
|
+
return fail();
|
|
220
|
+
await syncRoot(this.#root);
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
await unlink(stage).catch(() => undefined);
|
|
224
|
+
}
|
|
225
|
+
return (await this.#read(key, phase, parser)) ?? fail();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export const initializePreparedEvidenceHelperAuthorityStore = async (privateRoot) => new PreparedEvidenceHelperAuthorityStore(await root(privateRoot));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type PreparedEvidenceHelperReceipt } from "./preparedAuthority.js";
|
|
2
|
+
import type { PrepareEvidenceHelperInput } from "./preparedBuilderTypes.js";
|
|
3
|
+
export type { PrepareEvidenceHelperInput } from "./preparedBuilderTypes.js";
|
|
4
|
+
/** Re-attests a completion-bound local config identity or rebuilds an absent exact config. */
|
|
5
|
+
export declare const prepareEvidenceExportHelper: (input: PrepareEvidenceHelperInput) => Promise<PreparedEvidenceHelperReceipt>;
|
|
6
|
+
/** Private target lowering resolves the config digest only after receipt-correlated reattestation. */
|
|
7
|
+
export declare const resolvePreparedEvidenceHelperImage: (input: PrepareEvidenceHelperInput, receipt: PreparedEvidenceHelperReceipt) => Promise<{
|
|
8
|
+
readonly configDigest: `sha256:${string}`;
|
|
9
|
+
readonly imageReference: string;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { parseDockerBaseImageReference } from "../target/dockerBaseImage.js";
|
|
3
|
+
import { DockerArtifactProviderError, } from "../target/dockerArtifactsProvider.js";
|
|
4
|
+
import { EVIDENCE_EXPORT_HELPER_CONTRACT_LABEL, EVIDENCE_EXPORT_HELPER_CONTRACT_VERSION, EVIDENCE_EXPORT_HELPER_ENTRYPOINT, EVIDENCE_EXPORT_HELPER_ENV, EVIDENCE_EXPORT_HELPER_USER, } from "../target/evidenceExportProvider.js";
|
|
5
|
+
import { createPreparedEvidenceHelperKey, initializePreparedEvidenceHelperAuthorityStore, newPreparedEvidenceHelperCompletionRecord, newPreparedEvidenceHelperPendingRecord, } from "./preparedAuthority.js";
|
|
6
|
+
import { loadLocalEvidenceHelperRecipe } from "./recipe.js";
|
|
7
|
+
const ERROR = "Prepared evidence-export helper failed";
|
|
8
|
+
const CONTEXT = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
9
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
10
|
+
const BUILD_ID = /^(sha256:[a-f0-9]{64})(?:\r?\n)?$/u;
|
|
11
|
+
const MAX_OUTPUT = 65_536;
|
|
12
|
+
const BASE_FORMAT = "[{\"Architecture\":{{json .Architecture}},\"Id\":{{json .Id}},\"Os\":{{json .Os}}}]";
|
|
13
|
+
const IMAGE_FORMAT = "[{\"Architecture\":{{json .Architecture}},\"Config\":{\"Cmd\":{{json (index .Config \"Cmd\")}},\"Entrypoint\":{{json (index .Config \"Entrypoint\")}},\"Env\":{{json (index .Config \"Env\")}},\"ExposedPorts\":{{json (index .Config \"ExposedPorts\")}},\"Healthcheck\":{{json (index .Config \"Healthcheck\")}},\"Labels\":{{json (index .Config \"Labels\")}},\"User\":{{json (index .Config \"User\")}},\"Volumes\":{{json (index .Config \"Volumes\")}}},\"Id\":{{json .Id}},\"Os\":{{json .Os}}}]";
|
|
14
|
+
const live = new Map();
|
|
15
|
+
const fail = () => { throw new Error(ERROR); };
|
|
16
|
+
const hash = (domain, value) => `sha256:${createHash("sha256").update(`spawnfile.evidence-helper.${domain}.v1\0`).update(value).digest("hex")}`;
|
|
17
|
+
const exact = (raw, keys) => raw !== null && typeof raw === "object" && !Array.isArray(raw)
|
|
18
|
+
&& Object.getPrototypeOf(raw) === Object.prototype
|
|
19
|
+
&& Object.keys(raw).sort().join("\0") === [...keys].sort().join("\0");
|
|
20
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
21
|
+
const digest = (raw) => typeof raw === "string" && DIGEST.test(raw) ? raw : fail();
|
|
22
|
+
const timeout = (raw) => raw === undefined ? 120_000
|
|
23
|
+
: typeof raw === "number" && Number.isSafeInteger(raw) && raw >= 1 && raw <= 120_000 ? raw : fail();
|
|
24
|
+
const parse = (raw) => { try {
|
|
25
|
+
return JSON.parse(raw);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return fail();
|
|
29
|
+
} };
|
|
30
|
+
const hook = async (value) => { if (value)
|
|
31
|
+
await value(); };
|
|
32
|
+
const execution = (input, value) => {
|
|
33
|
+
if (!CONTEXT.test(input.context) || typeof input.executor !== "function")
|
|
34
|
+
return fail();
|
|
35
|
+
const run = async (args, stdin) => {
|
|
36
|
+
const result = await input.executor("docker", ["--context", input.context, ...args], {
|
|
37
|
+
...(input.signal ? { signal: input.signal } : {}), timeout: value, ...(stdin ? { stdin } : {}),
|
|
38
|
+
});
|
|
39
|
+
if (!result || typeof result.stdout !== "string" || typeof result.stderr !== "string"
|
|
40
|
+
|| Buffer.byteLength(result.stdout, "utf8") > MAX_OUTPUT || Buffer.byteLength(result.stderr, "utf8") > MAX_OUTPUT)
|
|
41
|
+
return fail();
|
|
42
|
+
return result.stdout;
|
|
43
|
+
};
|
|
44
|
+
return Object.freeze({ run });
|
|
45
|
+
};
|
|
46
|
+
const localFacts = async (run, context, baseImage) => {
|
|
47
|
+
const endpoint = parse((await run([
|
|
48
|
+
"context", "inspect", context, "--format", "{{json .Endpoints.docker.Host}}",
|
|
49
|
+
])).trim());
|
|
50
|
+
if (typeof endpoint !== "string" || !/^(?:fd|npipe|unix):\/\/[^\s]+$/u.test(endpoint))
|
|
51
|
+
return fail();
|
|
52
|
+
const daemon = parse(await run(["info", "--format", "{\"Architecture\":{{json .Architecture}},\"DockerRootDir\":{{json .DockerRootDir}},\"OSType\":{{json .OSType}},\"ServerVersion\":{{json .ServerVersion}}}"]));
|
|
53
|
+
if (!exact(daemon, ["Architecture", "DockerRootDir", "OSType", "ServerVersion"])
|
|
54
|
+
|| daemon.OSType !== "linux" || typeof daemon.DockerRootDir !== "string" || typeof daemon.ServerVersion !== "string")
|
|
55
|
+
return fail();
|
|
56
|
+
const architecture = ["amd64", "x64", "x86_64"].includes(daemon.Architecture) ? "amd64"
|
|
57
|
+
: ["arm64", "aarch64"].includes(daemon.Architecture) ? "arm64" : fail();
|
|
58
|
+
const image = parse(await run(["image", "inspect", baseImage, "--format", BASE_FORMAT]));
|
|
59
|
+
if (!Array.isArray(image) || image.length !== 1 || !exact(image[0], ["Architecture", "Id", "Os"])
|
|
60
|
+
|| image[0].Os !== "linux" || image[0].Architecture !== architecture)
|
|
61
|
+
return fail();
|
|
62
|
+
return Object.freeze({ baseConfig: digest(image[0].Id), daemonDigest: hash("daemon", JSON.stringify(daemon)),
|
|
63
|
+
endpointDigest: hash("endpoint", endpoint), platform: Object.freeze({ architecture, os: "linux" }) });
|
|
64
|
+
};
|
|
65
|
+
const inspectHelper = async (run, reference, facts) => {
|
|
66
|
+
const image = parse(await run(["image", "inspect", reference, "--format", IMAGE_FORMAT]));
|
|
67
|
+
if (!Array.isArray(image) || image.length !== 1 || !exact(image[0], ["Architecture", "Config", "Id", "Os"])
|
|
68
|
+
|| image[0].Architecture !== facts.platform.architecture || image[0].Os !== "linux"
|
|
69
|
+
|| !exact(image[0].Config, ["Cmd", "Entrypoint", "Env", "ExposedPorts", "Healthcheck", "Labels", "User", "Volumes"]))
|
|
70
|
+
return fail();
|
|
71
|
+
const config = image[0].Config;
|
|
72
|
+
if (!same(config.Entrypoint, EVIDENCE_EXPORT_HELPER_ENTRYPOINT)
|
|
73
|
+
|| config.Cmd !== null && !same(config.Cmd, []) || !same(config.Env, EVIDENCE_EXPORT_HELPER_ENV)
|
|
74
|
+
|| config.ExposedPorts !== null
|
|
75
|
+
|| config.Healthcheck !== null || config.Volumes !== null || config.User !== EVIDENCE_EXPORT_HELPER_USER
|
|
76
|
+
|| !exact(config.Labels, [EVIDENCE_EXPORT_HELPER_CONTRACT_LABEL])
|
|
77
|
+
|| config.Labels[EVIDENCE_EXPORT_HELPER_CONTRACT_LABEL] !== EVIDENCE_EXPORT_HELPER_CONTRACT_VERSION)
|
|
78
|
+
return fail();
|
|
79
|
+
return digest(image[0].Id);
|
|
80
|
+
};
|
|
81
|
+
const inspectMaybe = async (run, reference, facts) => {
|
|
82
|
+
try {
|
|
83
|
+
return await inspectHelper(run, reference, facts);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof DockerArtifactProviderError && error.kind === "image_not_found")
|
|
87
|
+
return null;
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const matching = (record, baseImage, facts, recipe) => record.base_image === baseImage && record.base_config_digest === facts.baseConfig && record.daemon_digest === facts.daemonDigest
|
|
92
|
+
&& record.endpoint_digest === facts.endpointDigest && same(record.platform, facts.platform)
|
|
93
|
+
&& record.recipe_digest === recipe.recipeDigest;
|
|
94
|
+
const build = async (input, run, facts, recipe) => {
|
|
95
|
+
await hook(input.testHooks?.beforeBuild);
|
|
96
|
+
const output = await run(["build", "--quiet", "--pull=false", "--network=none", "--platform",
|
|
97
|
+
`${facts.platform.os}/${facts.platform.architecture}`, "--build-arg", `SPAWNFILE_HELPER_BASE=${facts.baseConfig}`,
|
|
98
|
+
"-"], recipe.context);
|
|
99
|
+
const produced = BUILD_ID.exec(output)?.[1];
|
|
100
|
+
if (!produced)
|
|
101
|
+
return fail();
|
|
102
|
+
await hook(input.testHooks?.afterBuild);
|
|
103
|
+
// Docker's quiet build result is the image config ID produced by this exact
|
|
104
|
+
// invocation. Re-attest that immutable ID, never a mutable tag.
|
|
105
|
+
const inspected = await inspectHelper(run, produced, facts);
|
|
106
|
+
return inspected === produced ? inspected : fail();
|
|
107
|
+
};
|
|
108
|
+
const receiptOwner = async (input, baseImage, facts, recipe, key, run) => {
|
|
109
|
+
const store = await initializePreparedEvidenceHelperAuthorityStore(input.privateRoot);
|
|
110
|
+
await hook(input.testHooks?.beforeReserve);
|
|
111
|
+
const pending = await store.reserve(key, newPreparedEvidenceHelperPendingRecord({
|
|
112
|
+
base_config_digest: facts.baseConfig, base_image: baseImage, context: input.context,
|
|
113
|
+
daemon_digest: facts.daemonDigest, endpoint_digest: facts.endpointDigest, platform: facts.platform,
|
|
114
|
+
recipe_digest: recipe.recipeDigest
|
|
115
|
+
}));
|
|
116
|
+
await hook(input.testHooks?.afterReserve);
|
|
117
|
+
if (!matching(pending, baseImage, facts, recipe))
|
|
118
|
+
return fail();
|
|
119
|
+
const authority = await store.load(key);
|
|
120
|
+
if (!authority)
|
|
121
|
+
return fail();
|
|
122
|
+
if (authority.completion) {
|
|
123
|
+
let observed = await inspectMaybe(run, authority.completion.accepted_image_config_digest, facts);
|
|
124
|
+
if (observed === null)
|
|
125
|
+
observed = await build(input, run, facts, recipe);
|
|
126
|
+
if (observed !== authority.completion.accepted_image_config_digest)
|
|
127
|
+
return fail();
|
|
128
|
+
await hook(input.testHooks?.beforeReceipt);
|
|
129
|
+
return authority.completion.receipt;
|
|
130
|
+
}
|
|
131
|
+
const produced = await build(input, run, facts, recipe);
|
|
132
|
+
await hook(input.testHooks?.beforeComplete);
|
|
133
|
+
const completion = await store.complete(key, newPreparedEvidenceHelperCompletionRecord(pending, produced));
|
|
134
|
+
await hook(input.testHooks?.afterComplete);
|
|
135
|
+
if (completion.accepted_image_config_digest !== produced)
|
|
136
|
+
return fail();
|
|
137
|
+
await hook(input.testHooks?.beforeReceipt);
|
|
138
|
+
return completion.receipt;
|
|
139
|
+
};
|
|
140
|
+
/** Re-attests a completion-bound local config identity or rebuilds an absent exact config. */
|
|
141
|
+
export const prepareEvidenceExportHelper = async (input) => {
|
|
142
|
+
const targetTimeout = timeout(input.timeoutMs);
|
|
143
|
+
const baseImage = parseDockerBaseImageReference(input.baseImage) ?? fail();
|
|
144
|
+
const run = execution(input, targetTimeout).run;
|
|
145
|
+
const recipe = await loadLocalEvidenceHelperRecipe();
|
|
146
|
+
const facts = await localFacts(run, input.context, baseImage);
|
|
147
|
+
const key = createPreparedEvidenceHelperKey({ baseConfigDigest: facts.baseConfig, context: input.context,
|
|
148
|
+
daemonDigest: facts.daemonDigest, endpointDigest: facts.endpointDigest, platform: facts.platform,
|
|
149
|
+
recipeDigest: recipe.recipeDigest });
|
|
150
|
+
const mapKey = `${input.privateRoot}\0${key}`;
|
|
151
|
+
const joined = live.get(mapKey);
|
|
152
|
+
if (joined)
|
|
153
|
+
return joined;
|
|
154
|
+
const promise = receiptOwner(input, baseImage, facts, recipe, key, run);
|
|
155
|
+
live.set(mapKey, promise);
|
|
156
|
+
try {
|
|
157
|
+
return await promise;
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
if (live.get(mapKey) === promise)
|
|
161
|
+
live.delete(mapKey);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
/** Private target lowering resolves the config digest only after receipt-correlated reattestation. */
|
|
165
|
+
export const resolvePreparedEvidenceHelperImage = async (input, receipt) => {
|
|
166
|
+
const actual = await prepareEvidenceExportHelper(input);
|
|
167
|
+
if (actual.handle !== receipt.handle || actual.digest !== receipt.digest)
|
|
168
|
+
return fail();
|
|
169
|
+
const baseImage = parseDockerBaseImageReference(input.baseImage) ?? fail();
|
|
170
|
+
const run = execution(input, timeout(input.timeoutMs)).run;
|
|
171
|
+
const facts = await localFacts(run, input.context, baseImage);
|
|
172
|
+
const recipe = await loadLocalEvidenceHelperRecipe();
|
|
173
|
+
const store = await initializePreparedEvidenceHelperAuthorityStore(input.privateRoot);
|
|
174
|
+
const key = createPreparedEvidenceHelperKey({ baseConfigDigest: facts.baseConfig, context: input.context,
|
|
175
|
+
daemonDigest: facts.daemonDigest, endpointDigest: facts.endpointDigest, platform: facts.platform,
|
|
176
|
+
recipeDigest: recipe.recipeDigest });
|
|
177
|
+
const authority = await store.load(key);
|
|
178
|
+
if (!authority?.completion || authority.completion.receipt.handle !== receipt.handle
|
|
179
|
+
|| authority.completion.receipt.digest !== receipt.digest)
|
|
180
|
+
return fail();
|
|
181
|
+
return Object.freeze({ configDigest: authority.completion.accepted_image_config_digest,
|
|
182
|
+
imageReference: authority.completion.accepted_image_config_digest });
|
|
183
|
+
};
|