spawnfile 0.1.14 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -159
- package/dist/audit/checksShared.d.ts +1 -1
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
- package/dist/auth/targetSecretSourceFsPublish.js +3 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
- package/dist/auth/targetSecretSourceFsRead.js +5 -14
- package/dist/auth/trainingAuth.d.ts +21 -0
- package/dist/auth/trainingAuth.js +86 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +9 -0
- package/dist/cli/canaryCutoverCommand.d.ts +2 -0
- package/dist/cli/canaryCutoverCommand.js +30 -0
- package/dist/cli/capabilitiesCommand.d.ts +3 -0
- package/dist/cli/capabilitiesCommand.js +12 -0
- package/dist/cli/capabilitiesReceipt.d.ts +56 -0
- package/dist/cli/capabilitiesReceipt.js +56 -0
- package/dist/cli/compileBuildCommands.js +13 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.js +19 -8
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +12 -3
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/paideiaDelegation.d.ts +17 -0
- package/dist/cli/paideiaDelegation.js +210 -0
- package/dist/cli/paideiaSupervisor.d.ts +17 -0
- package/dist/cli/paideiaSupervisor.js +48 -0
- package/dist/cli/productStateCloneCommand.d.ts +2 -0
- package/dist/cli/productStateCloneCommand.js +34 -0
- package/dist/cli/runCli.d.ts +13 -3
- package/dist/cli/runCli.js +37 -9
- package/dist/cli/targetCommands.d.ts +4 -7
- package/dist/cli/targetCommands.js +16 -46
- package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
- package/dist/cli/targetConfigPreparedPlan.js +74 -0
- package/dist/cli/targetConfigResolver.d.ts +3 -0
- package/dist/cli/targetConfigResolver.js +111 -0
- package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
- package/dist/cli/targetConfigResolverCommand.js +43 -0
- package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
- package/dist/cli/targetConfigResolverContracts.js +30 -0
- package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
- package/dist/cli/targetConfigResolverDocker.js +47 -0
- package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
- package/dist/cli/targetConfigResolverValidation.js +94 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
- package/dist/cli/targetDefaultAuthorities.js +3 -0
- package/dist/cli/targetDefaultConfig.d.ts +7 -0
- package/dist/cli/targetDefaultConfig.js +22 -5
- package/dist/cli/targetDefaultConfigStdin.js +7 -1
- package/dist/cli/targetDefaultHandlerFactory.js +23 -2
- package/dist/cli/targetDefaultHandlers.d.ts +2 -2
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.js +35 -6
- package/dist/cli/upLifecycleRecovery.d.ts +2 -2
- package/dist/cli/upLifecycleRecovery.js +188 -44
- package/dist/cli/usageCommand.d.ts +40 -0
- package/dist/cli/usageCommand.js +284 -0
- package/dist/cli/usageCommandLive.d.ts +84 -0
- package/dist/cli/usageCommandLive.js +95 -0
- package/dist/cli/usageDeploymentSource.d.ts +9 -0
- package/dist/cli/usageDeploymentSource.js +22 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/compilePlanHelpers.js +3 -0
- package/dist/compiler/compileProject.d.ts +2 -0
- package/dist/compiler/compileProject.js +5 -1
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifacts.d.ts +3 -1
- package/dist/compiler/containerArtifacts.js +92 -40
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +24 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
- package/dist/compiler/containerDaimonBrokerRender.js +191 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
- package/dist/compiler/containerEntrypointRender.d.ts +7 -0
- package/dist/compiler/containerEntrypointRender.js +28 -22
- package/dist/compiler/containerPersistentMounts.d.ts +30 -0
- package/dist/compiler/containerPersistentMounts.js +66 -0
- package/dist/compiler/containerReadinessPaths.d.ts +1 -0
- package/dist/compiler/containerReadinessPaths.js +1 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
- package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
- package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
- package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
- package/dist/compiler/containerStateOwnershipRender.js +75 -0
- package/dist/compiler/containerTargetResources.d.ts +22 -1
- package/dist/compiler/containerTargetResources.js +94 -2
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
- package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.js +3 -0
- package/dist/compiler/initProject.d.ts +2 -0
- package/dist/compiler/initProject.js +39 -1
- package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
- package/dist/compiler/localMoltnetAuthority.js +177 -0
- package/dist/compiler/memoryArtifacts.d.ts +1 -1
- package/dist/compiler/memoryArtifacts.js +108 -32
- package/dist/compiler/modelEnv.d.ts +5 -0
- package/dist/compiler/modelEnv.js +8 -2
- package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
- package/dist/compiler/moltnetArtifactPaths.js +17 -15
- package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +52 -12
- package/dist/compiler/moltnetBinaries.d.ts +16 -4
- package/dist/compiler/moltnetBinaries.js +46 -6
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
- package/dist/compiler/moltnetConfigLowering.js +30 -6
- package/dist/compiler/moltnetNodeConfig.js +1 -1
- package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
- package/dist/compiler/moltnetReleaseAuthority.js +33 -4
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
- package/dist/compiler/moltnetResolution.js +9 -15
- package/dist/compiler/moltnetRoomMemberships.js +20 -5
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +22 -2
- package/dist/compiler/moltnetServerPlans.js +19 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +3 -9
- package/dist/compiler/organizationIdentity.js +37 -270
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
- package/dist/compiler/organizationReadyEvidence.js +23 -3
- package/dist/compiler/runProject.d.ts +4 -2
- package/dist/compiler/runProject.js +32 -6
- package/dist/compiler/runProjectAuth.d.ts +3 -1
- package/dist/compiler/runProjectAuth.js +19 -3
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +8 -4
- package/dist/compiler/runProjectDocker.js +43 -18
- package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
- package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
- package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
- package/dist/compiler/runProjectDockerReservation.js +118 -0
- package/dist/compiler/runProjectLifecycle.js +1 -1
- package/dist/compiler/training/broker/declaration.d.ts +45 -0
- package/dist/compiler/training/broker/declaration.js +55 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +111 -0
- package/dist/compiler/training/broker/index.d.ts +10 -0
- package/dist/compiler/training/broker/index.js +10 -0
- package/dist/compiler/training/broker/main.d.ts +2 -0
- package/dist/compiler/training/broker/main.js +14 -0
- package/dist/compiler/training/broker/paths.d.ts +196 -0
- package/dist/compiler/training/broker/paths.js +241 -0
- package/dist/compiler/training/broker/processes.d.ts +42 -0
- package/dist/compiler/training/broker/processes.js +99 -0
- package/dist/compiler/training/broker/projection.d.ts +51 -0
- package/dist/compiler/training/broker/projection.js +76 -0
- package/dist/compiler/training/broker/provisioning.d.ts +87 -0
- package/dist/compiler/training/broker/provisioning.js +213 -0
- package/dist/compiler/training/broker/receipt.d.ts +77 -0
- package/dist/compiler/training/broker/receipt.js +110 -0
- package/dist/compiler/training/broker/registration.d.ts +41 -0
- package/dist/compiler/training/broker/registration.js +102 -0
- package/dist/compiler/training/broker/runtime.d.ts +25 -0
- package/dist/compiler/training/broker/runtime.js +173 -0
- package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
- package/dist/compiler/training/broker/seccompRoutes.js +36 -0
- package/dist/compiler/training/broker/supervisor.d.ts +109 -0
- package/dist/compiler/training/broker/supervisor.js +173 -0
- package/dist/compiler/training/container/contract.d.ts +31 -0
- package/dist/compiler/training/container/contract.js +33 -0
- package/dist/compiler/training/container/index.d.ts +4 -0
- package/dist/compiler/training/container/index.js +2 -0
- package/dist/compiler/training/container/launch.d.ts +18 -0
- package/dist/compiler/training/container/launch.js +173 -0
- package/dist/compiler/training/container/prepare.d.ts +8 -0
- package/dist/compiler/training/container/prepare.js +80 -0
- package/dist/compiler/training/container/process.d.ts +14 -0
- package/dist/compiler/training/container/process.js +70 -0
- package/dist/compiler/training/container/security.d.ts +36 -0
- package/dist/compiler/training/container/security.js +58 -0
- package/dist/compiler/training/context.d.ts +7 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +142 -0
- package/dist/compiler/training/contract.js +34 -0
- package/dist/compiler/training/index.d.ts +4 -0
- package/dist/compiler/training/index.js +3 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
- package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
- package/dist/compiler/training/preparation/broker.d.ts +21 -0
- package/dist/compiler/training/preparation/broker.js +43 -0
- package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
- package/dist/compiler/training/preparation/contextModes.js +38 -0
- package/dist/compiler/training/preparation/contract.d.ts +182 -0
- package/dist/compiler/training/preparation/contract.js +94 -0
- package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
- package/dist/compiler/training/preparation/copyAssets.js +8 -0
- package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
- package/dist/compiler/training/preparation/daimonParent.js +114 -0
- package/dist/compiler/training/preparation/files.d.ts +25 -0
- package/dist/compiler/training/preparation/files.js +85 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +102 -0
- package/dist/compiler/training/preparation/index.d.ts +3 -0
- package/dist/compiler/training/preparation/index.js +2 -0
- package/dist/compiler/training/preparation/inputs.d.ts +23 -0
- package/dist/compiler/training/preparation/inputs.js +93 -0
- package/dist/compiler/training/preparation/prepare.d.ts +33 -0
- package/dist/compiler/training/preparation/prepare.js +186 -0
- package/dist/compiler/training/preparation/scratch.d.ts +19 -0
- package/dist/compiler/training/preparation/scratch.js +48 -0
- package/dist/compiler/training/repair/compatibility.d.ts +11 -0
- package/dist/compiler/training/repair/compatibility.js +34 -0
- package/dist/compiler/training/repair/contract.d.ts +506 -0
- package/dist/compiler/training/repair/contract.js +31 -0
- package/dist/compiler/training/repair/index.d.ts +3 -0
- package/dist/compiler/training/repair/index.js +3 -0
- package/dist/compiler/training/repair/prepare.d.ts +230 -0
- package/dist/compiler/training/repair/prepare.js +74 -0
- package/dist/compiler/training/repair/witness.d.ts +203 -0
- package/dist/compiler/training/repair/witness.js +42 -0
- package/dist/compiler/types.d.ts +2 -0
- package/dist/compiler/upProject.d.ts +26 -1
- package/dist/compiler/upProject.js +117 -178
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.js +49 -4
- package/dist/compiler/updateProjectModels.js +1 -0
- package/dist/compiler/view/types.d.ts +1 -1
- package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
- package/dist/compiler/workspaceBundleArtifacts.js +106 -0
- package/dist/compiler/workspaceResources.d.ts +4 -1
- package/dist/compiler/workspaceResources.js +12 -7
- package/dist/deployment/artifactsExportPlan.js +51 -1
- package/dist/deployment/canaryCutover.d.ts +42 -0
- package/dist/deployment/canaryCutover.js +140 -0
- package/dist/deployment/candidateDiagnostics.d.ts +15 -0
- package/dist/deployment/candidateDiagnostics.js +90 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.js +9 -3
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +5 -0
- package/dist/deployment/downDeployment.js +109 -8
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/index.d.ts +4 -0
- package/dist/deployment/index.js +4 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
- package/dist/deployment/lifecycleCompletionContracts.js +34 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
- package/dist/deployment/lifecycleCompletionPaths.js +3 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionPublication.js +18 -4
- package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
- package/dist/deployment/lifecycleCompletionStore.js +7 -7
- package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
- package/dist/deployment/lifecycleUpRecords.js +127 -0
- package/dist/deployment/native/AGENTS.md +11 -0
- package/dist/deployment/native/rename-noreplace-arm64 +0 -0
- package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
- package/dist/deployment/native/rename-noreplace-x64 +0 -0
- package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
- package/dist/deployment/noReplaceActivation.d.ts +17 -0
- package/dist/deployment/noReplaceActivation.js +50 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
- package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
- package/dist/deployment/organizationReady.d.ts +2 -0
- package/dist/deployment/organizationReady.js +36 -4
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +32 -6
- package/dist/deployment/upReceiptTypes.js +29 -2
- package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
- package/dist/deployment/workspaceResourceMigration.js +315 -0
- package/dist/dev/project.d.ts +7 -0
- package/dist/dev/project.js +9 -0
- package/dist/distribution/consumeImage.d.ts +2 -0
- package/dist/distribution/consumeImage.js +98 -73
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
- package/dist/distribution/consumeImageLifecycle.js +231 -0
- package/dist/distribution/consumeImageSupport.d.ts +12 -0
- package/dist/distribution/consumeImageSupport.js +15 -0
- package/dist/distribution/distributionReportSchema.d.ts +11 -1
- package/dist/distribution/distributionReportSchema.js +15 -2
- package/dist/distribution/dockerRunner.d.ts +6 -1
- package/dist/distribution/dockerRunner.js +31 -4
- package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
- package/dist/distribution/imageRuntimeAuth.js +70 -1
- package/dist/distribution/index.d.ts +1 -1
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +14 -1
- package/dist/distribution/types.js +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
- package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
- package/dist/evidenceExportHelper/index.d.ts +4 -0
- package/dist/evidenceExportHelper/index.js +4 -0
- package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
- package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
- package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
- package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
- package/dist/evidenceExportHelper/recipe.d.ts +7 -0
- package/dist/evidenceExportHelper/recipe.js +83 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/mcpSchemas.d.ts +1 -0
- package/dist/manifest/mcpSchemas.js +3 -0
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +237 -12
- package/dist/manifest/schemas.js +5 -2
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
- package/dist/manifest/teamNetworkSchemas.js +19 -1
- package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
- package/dist/manifest/teamNetworkServerSchemas.js +18 -2
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/report/types.d.ts +34 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +49 -33
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +243 -0
- package/dist/runtime/daimon/attention.d.ts +8 -0
- package/dist/runtime/daimon/attention.js +32 -0
- package/dist/runtime/daimon/config.d.ts +25 -0
- package/dist/runtime/daimon/config.js +272 -0
- package/dist/runtime/daimon/contractManifest.d.ts +295 -0
- package/dist/runtime/daimon/contractManifest.js +319 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
- package/dist/runtime/daimon/grokWorkerContract.js +48 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/runAuth.d.ts +51 -0
- package/dist/runtime/daimon/runAuth.js +279 -0
- package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
- package/dist/runtime/daimon/runtimeIdentity.js +22 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
- package/dist/runtime/daimon/scheduleAuthority.js +17 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/install.d.ts +3 -0
- package/dist/runtime/install.js +3 -0
- package/dist/runtime/localDaimonAuthority.d.ts +11 -0
- package/dist/runtime/localDaimonAuthority.js +77 -0
- package/dist/runtime/mnemeMcp.d.ts +13 -0
- package/dist/runtime/mnemeMcp.js +26 -0
- package/dist/runtime/openclaw/adapter.js +2 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +2 -6
- package/dist/runtime/pi/appCliSource.js +1 -1
- package/dist/runtime/pi/appScheduleSource.js +6 -2
- package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
- package/dist/runtime/picoclaw/adapter.js +2 -2
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +25 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +48 -0
- package/dist/runtime/usageLedgerRead.js +102 -0
- package/dist/runtime/usageRequestLedger.d.ts +42 -0
- package/dist/runtime/usageRequestLedger.js +72 -0
- package/dist/shared/daimonCodexDocker.d.ts +32 -0
- package/dist/shared/daimonCodexDocker.js +120 -0
- package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
- package/dist/shared/daimonGrokSeccompProfile.js +11 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/volumeNames.d.ts +6 -0
- package/dist/shared/volumeNames.js +14 -0
- package/dist/target/dockerArtifactsProvider.js +34 -7
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +11 -0
- package/dist/target/dockerCommandExecutor.js +53 -2
- package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
- package/dist/target/dockerCommandExecutorCore.js +4 -2
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
- package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
- package/dist/target/dockerTarget.d.ts +1 -0
- package/dist/target/dockerTargetBinding.d.ts +1 -2
- package/dist/target/dockerTargetBinding.js +2 -3
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
- package/dist/target/dockerWorldServiceProvider.js +13 -1
- package/dist/target/evidenceExport.d.ts +3 -1
- package/dist/target/evidenceExport.js +12 -3
- package/dist/target/evidenceExportOperationsTestKit.js +3 -3
- package/dist/target/evidenceExportProvider.d.ts +2 -0
- package/dist/target/evidenceExportProvider.js +15 -5
- package/dist/target/publicArtifactSnapshot.d.ts +31 -0
- package/dist/target/publicArtifactSnapshot.js +37 -3
- package/examples/README.md +45 -0
- package/examples/agent-with-subagents/AGENTS.md +3 -0
- package/examples/agent-with-subagents/Spawnfile +30 -0
- package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
- package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
- package/examples/daimon-org/Spawnfile +68 -0
- package/examples/daimon-org/TEAM.md +4 -0
- package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
- package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
- package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
- package/examples/daimon-org/teams/review/Spawnfile +53 -0
- package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
- package/examples/daimon-public-host/AGENTS.md +3 -0
- package/examples/daimon-public-host/Spawnfile +21 -0
- package/examples/distribution-org/Spawnfile +43 -0
- package/examples/distribution-org/TEAM.md +4 -0
- package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
- package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
- package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
- package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
- package/examples/jungian-daimon-org/Spawnfile +41 -0
- package/examples/jungian-daimon-org/TEAM.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
- package/examples/mixed-runtime-org/Spawnfile +71 -0
- package/examples/mixed-runtime-org/TEAM.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
- package/examples/moltnet-team-chat/Spawnfile +43 -0
- package/examples/moltnet-team-chat/TEAM.md +5 -0
- package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
- package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
- package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
- package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
- package/examples/single-agent/AGENTS.md +3 -0
- package/examples/single-agent/HEARTBEAT.md +3 -0
- package/examples/single-agent/IDENTITY.md +3 -0
- package/examples/single-agent/MEMORY.md +3 -0
- package/examples/single-agent/SOUL.md +3 -0
- package/examples/single-agent/Spawnfile +41 -0
- package/examples/single-agent/skills/web_search/SKILL.md +6 -0
- package/moltnet-releases.json +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +5 -2
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
- package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
- package/dist/ownership/simfileRunOperatorInputs.js +0 -139
- package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
- package/dist/target/cleanupRunDocker.test-helper.js +0 -238
|
@@ -3,6 +3,8 @@ import { lstat, mkdir, open, realpath } from "node:fs/promises";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { types as nodeTypes } from "node:util";
|
|
5
5
|
import { resolveSpawnfileHome } from "../auth/index.js";
|
|
6
|
+
import { parsePreparedEvidenceHelperReceipt, } from "../evidenceExportHelper/index.js";
|
|
7
|
+
import { parseDockerBaseImageReference } from "../target/dockerBaseImage.js";
|
|
6
8
|
import { parseDockerArtifactMappings } from "../target/dockerArtifactsProvider.js";
|
|
7
9
|
export { resolveTargetDefaultJournalRoot } from "../target/journalRoot.js";
|
|
8
10
|
export const TARGET_DEFAULT_CONFIG_ERROR = "Target configuration failed";
|
|
@@ -16,7 +18,8 @@ const CHILD_ROOTS = Object.freeze([
|
|
|
16
18
|
"secret-authority",
|
|
17
19
|
"attachment-authority",
|
|
18
20
|
"world-authority",
|
|
19
|
-
"evidence-export"
|
|
21
|
+
"evidence-export",
|
|
22
|
+
"evidence-helper"
|
|
20
23
|
]);
|
|
21
24
|
const fail = () => { throw new Error(TARGET_DEFAULT_CONFIG_ERROR); };
|
|
22
25
|
const byteLength = (value) => Buffer.byteLength(value, "utf8");
|
|
@@ -25,7 +28,7 @@ const descriptorValues = (raw) => {
|
|
|
25
28
|
|| Object.getPrototypeOf(raw) !== Object.prototype)
|
|
26
29
|
return fail();
|
|
27
30
|
const expected = [
|
|
28
|
-
"artifactMappings", "containerBundleStoreRoot", "context", "dockerCommand", "evidenceDestination",
|
|
31
|
+
"artifactMappings", "containerBundleStoreRoot", "context", "dockerCommand", "evidenceDestination", "evidenceHelperBaseImage", "preparedEvidenceHelper",
|
|
29
32
|
"helperArtifactManifestDigest", "preparedArtifactMappings", "timeoutMs"
|
|
30
33
|
];
|
|
31
34
|
const required = ["context", "dockerCommand", "evidenceDestination", "timeoutMs"];
|
|
@@ -38,7 +41,7 @@ const descriptorValues = (raw) => {
|
|
|
38
41
|
return fail();
|
|
39
42
|
return Object.fromEntries(expected.filter((key) => Object.hasOwn(descriptors, key)).map((key) => [key, descriptors[key].value]));
|
|
40
43
|
};
|
|
41
|
-
const
|
|
44
|
+
export const parseTargetPreparedArtifactMappings = (raw) => {
|
|
42
45
|
if (raw === undefined)
|
|
43
46
|
return Object.freeze([]);
|
|
44
47
|
if (!Array.isArray(raw) || raw.length > 32)
|
|
@@ -211,7 +214,7 @@ const prepareRoots = async (containerBundleStoreRoot) => {
|
|
|
211
214
|
: CHILD_ROOTS;
|
|
212
215
|
const created = await Promise.all(childRoots.map((name) => ensureOwnedRoot(path.join(root, name))));
|
|
213
216
|
const containerBundles = containerBundleStoreRoot === undefined
|
|
214
|
-
? created[
|
|
217
|
+
? created[7]
|
|
215
218
|
: await prepareExplicitContainerBundleRoot(containerBundleStoreRoot, root);
|
|
216
219
|
return Object.freeze({
|
|
217
220
|
root,
|
|
@@ -221,6 +224,7 @@ const prepareRoots = async (containerBundleStoreRoot) => {
|
|
|
221
224
|
attachmentAuthority: created[3],
|
|
222
225
|
worldAuthority: created[4],
|
|
223
226
|
evidenceExport: created[5],
|
|
227
|
+
evidenceHelper: created[6],
|
|
224
228
|
containerBundles
|
|
225
229
|
});
|
|
226
230
|
};
|
|
@@ -270,6 +274,17 @@ export const loadTargetDefaultConfig = async (raw) => {
|
|
|
270
274
|
|| !DIGEST.test(value.helperArtifactManifestDigest))))
|
|
271
275
|
return fail();
|
|
272
276
|
const dockerCommand = command(value.dockerCommand);
|
|
277
|
+
const evidenceHelperBaseImage = value.evidenceHelperBaseImage === undefined ? undefined
|
|
278
|
+
: parseDockerBaseImageReference(value.evidenceHelperBaseImage) ?? fail();
|
|
279
|
+
const preparedEvidenceHelper = value.preparedEvidenceHelper === undefined ? undefined
|
|
280
|
+
: (() => { try {
|
|
281
|
+
return parsePreparedEvidenceHelperReceipt(value.preparedEvidenceHelper);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return fail();
|
|
285
|
+
} })();
|
|
286
|
+
if ((evidenceHelperBaseImage === undefined) !== (preparedEvidenceHelper === undefined))
|
|
287
|
+
return fail();
|
|
273
288
|
let artifactMappings;
|
|
274
289
|
try {
|
|
275
290
|
artifactMappings = value.artifactMappings === undefined
|
|
@@ -278,7 +293,7 @@ export const loadTargetDefaultConfig = async (raw) => {
|
|
|
278
293
|
catch {
|
|
279
294
|
return fail();
|
|
280
295
|
}
|
|
281
|
-
const preparedArtifactMappings =
|
|
296
|
+
const preparedArtifactMappings = parseTargetPreparedArtifactMappings(value.preparedArtifactMappings);
|
|
282
297
|
if (preparedArtifactMappings.some((prepared) => artifactMappings.some((artifact) => artifact.artifact_manifest_digest === prepared.artifact_manifest_digest)))
|
|
283
298
|
return fail();
|
|
284
299
|
const evidenceDestination = await validateDestination(value.evidenceDestination);
|
|
@@ -290,6 +305,8 @@ export const loadTargetDefaultConfig = async (raw) => {
|
|
|
290
305
|
artifactMappings,
|
|
291
306
|
context: value.context,
|
|
292
307
|
dockerCommand,
|
|
308
|
+
...(evidenceHelperBaseImage === undefined ? {} : { evidenceHelperBaseImage }),
|
|
309
|
+
...(preparedEvidenceHelper === undefined ? {} : { preparedEvidenceHelper }),
|
|
293
310
|
evidenceDestination,
|
|
294
311
|
...(matches.length === 1 ? { helperArtifact: matches[0] } : {}),
|
|
295
312
|
preparedArtifactMappings,
|
|
@@ -92,7 +92,7 @@ const exactDefaultConfigObject = (raw) => {
|
|
|
92
92
|
|| Object.getPrototypeOf(raw) !== Object.prototype)
|
|
93
93
|
return fail();
|
|
94
94
|
const expected = [
|
|
95
|
-
"artifactMappings", "container_bundle_store_root", "context", "dockerCommand", "evidenceDestination",
|
|
95
|
+
"artifactMappings", "container_bundle_store_root", "context", "dockerCommand", "evidenceDestination", "evidenceHelperBaseImage", "preparedEvidenceHelper",
|
|
96
96
|
"helperArtifactManifestDigest", "preparedArtifactMappings", "timeoutMs", "version"
|
|
97
97
|
];
|
|
98
98
|
const required = ["context", "dockerCommand", "evidenceDestination", "timeoutMs", "version"];
|
|
@@ -193,6 +193,12 @@ const defaultConfigInputs = (raw) => ({
|
|
|
193
193
|
context: raw.context,
|
|
194
194
|
dockerCommand: raw.dockerCommand,
|
|
195
195
|
evidenceDestination: raw.evidenceDestination,
|
|
196
|
+
...(Object.hasOwn(raw, "evidenceHelperBaseImage") ? {
|
|
197
|
+
evidenceHelperBaseImage: raw.evidenceHelperBaseImage
|
|
198
|
+
} : {}),
|
|
199
|
+
...(Object.hasOwn(raw, "preparedEvidenceHelper") ? {
|
|
200
|
+
preparedEvidenceHelper: raw.preparedEvidenceHelper
|
|
201
|
+
} : {}),
|
|
196
202
|
...(Object.hasOwn(raw, "helperArtifactManifestDigest") ? {
|
|
197
203
|
helperArtifactManifestDigest: raw.helperArtifactManifestDigest
|
|
198
204
|
} : {}),
|
|
@@ -9,7 +9,8 @@ import { createDockerSecretOperations } from "../target/dockerSecrets.js";
|
|
|
9
9
|
import { selectTarget } from "../target/dockerTarget.js";
|
|
10
10
|
import { createDockerWorldServiceOperations } from "../target/dockerWorldService.js";
|
|
11
11
|
import { createEvidenceExportOperations } from "../target/evidenceExport.js";
|
|
12
|
-
import { EVIDENCE_EXPORT_HELPER_CONTRACT } from "../target/evidenceExportProvider.js";
|
|
12
|
+
import { createEvidenceExportHelper, EVIDENCE_EXPORT_HELPER_CONTRACT } from "../target/evidenceExportProvider.js";
|
|
13
|
+
import { resolvePreparedEvidenceHelperImage } from "../evidenceExportHelper/index.js";
|
|
13
14
|
import { createDockerOrganizationAttachmentOperations } from "../target/organizationAttachment.js";
|
|
14
15
|
import { createTargetEvidenceHelperResolutionRequest } from "./targetEvidenceHelperResolution.js";
|
|
15
16
|
export const targetDefaultHandlerFactories = Object.freeze({
|
|
@@ -69,7 +70,7 @@ const requireAuthorities = (raw) => {
|
|
|
69
70
|
const names = [
|
|
70
71
|
"artifactIdentityStore", "attachmentAuthorityStore",
|
|
71
72
|
"evidenceExportAuthorityStore", "executors", "handoffResolver",
|
|
72
|
-
"helperArtifactResolver", "journals", "secretAuthorityStore",
|
|
73
|
+
"helperArtifactResolver", "helperExecutor", "journals", "secretAuthorityStore",
|
|
73
74
|
"secretResolver", "topologyAttestor", "worldAuthorityStore", "worldResolver"
|
|
74
75
|
];
|
|
75
76
|
if (!raw || typeof raw !== "object" || Array.isArray(raw) || nodeTypes.isProxy(raw)
|
|
@@ -95,6 +96,9 @@ const requireAuthorities = (raw) => {
|
|
|
95
96
|
if (executorNames.some((name) => typeof executors[name] !== "function")) {
|
|
96
97
|
throw new Error("Target handler initialization failed");
|
|
97
98
|
}
|
|
99
|
+
if (typeof values.helperExecutor !== "function") {
|
|
100
|
+
throw new Error("Target handler initialization failed");
|
|
101
|
+
}
|
|
98
102
|
for (const name of [
|
|
99
103
|
"handoffResolver", "journals", "secretResolver", "worldResolver"
|
|
100
104
|
]) {
|
|
@@ -180,6 +184,23 @@ const execute = async (expected, factories, authorities, config, raw) => {
|
|
|
180
184
|
}).execute(request);
|
|
181
185
|
case "export_evidence_volume":
|
|
182
186
|
case "recover_operation": {
|
|
187
|
+
if (config.evidenceHelperBaseImage && config.preparedEvidenceHelper) {
|
|
188
|
+
const helperInput = { baseImage: config.evidenceHelperBaseImage, context: config.context,
|
|
189
|
+
executor: authorities.helperExecutor, privateRoot: config.paths.evidenceHelper,
|
|
190
|
+
timeoutMs: config.timeoutMs };
|
|
191
|
+
const image = await resolvePreparedEvidenceHelperImage(helperInput, config.preparedEvidenceHelper);
|
|
192
|
+
const localHelper = createEvidenceExportHelper({ artifactManifestDigest: config.preparedEvidenceHelper.digest,
|
|
193
|
+
imageDigest: image.configDigest, imageReference: image.imageReference, resultHandle: config.preparedEvidenceHelper.handle });
|
|
194
|
+
const operations = factories.evidence({
|
|
195
|
+
...common, artifactIdentityStore: authorities.artifactIdentityStore,
|
|
196
|
+
authorityStore: authorities.evidenceExportAuthorityStore, executor: authorities.executors.resource,
|
|
197
|
+
exportExecutor: authorities.executors.evidenceExport, helperArtifactContract: EVIDENCE_EXPORT_HELPER_CONTRACT,
|
|
198
|
+
helperArtifactManifestDigest: config.preparedEvidenceHelper.digest, localHelper
|
|
199
|
+
});
|
|
200
|
+
return request.operation === "recover_operation"
|
|
201
|
+
? operations.recover(request, config.evidenceDestination)
|
|
202
|
+
: operations.execute(request, config.evidenceDestination);
|
|
203
|
+
}
|
|
183
204
|
if (!config.helperArtifact || !authorities.helperArtifactResolver) {
|
|
184
205
|
throw new Error("Target evidence helper is not configured");
|
|
185
206
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TargetTopologyAttestationRequest } from "../target/contracts.js";
|
|
2
2
|
import type { TargetTopologyAttestationResult } from "../target/topologyAttestation.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { TargetPublicArtifactSnapshotRequest, TargetPublicArtifactSnapshotResult } from "../target/publicArtifactSnapshot.js";
|
|
4
4
|
import type { TargetTopologyActivationResult } from "../target/topologyActivation.js";
|
|
5
5
|
import type { TargetDefaultConfig } from "./targetDefaultConfig.js";
|
|
6
6
|
import type { TargetCommandHandlers } from "./targetCommands.js";
|
|
@@ -15,7 +15,7 @@ export declare const withTargetDefaultHandlerSession: <Result>(config: TargetDef
|
|
|
15
15
|
/** The read-only attestor owns the same private authority graph as mutations. */
|
|
16
16
|
export declare const attestTargetDefaultTopology: (config: TargetDefaultConfig, request: TargetTopologyAttestationRequest) => Promise<TargetTopologyAttestationResult>;
|
|
17
17
|
/** Read one exact, bounded public projection from an attested world service. */
|
|
18
|
-
export declare const snapshotTargetDefaultPublicArtifact: (config: TargetDefaultConfig, request: TargetPublicArtifactSnapshotRequest) => Promise<
|
|
18
|
+
export declare const snapshotTargetDefaultPublicArtifact: (config: TargetDefaultConfig, request: TargetPublicArtifactSnapshotRequest) => Promise<TargetPublicArtifactSnapshotResult>;
|
|
19
19
|
export declare const activateTargetDefaultTopology: (config: TargetDefaultConfig, request: TargetTopologyAttestationRequest) => Promise<TargetTopologyActivationResult>;
|
|
20
20
|
/** Internal lifecycle primitive; not re-exported from the package surface. */
|
|
21
21
|
export declare const runTargetDefaultHandlerSession: <Result>(session: TargetDefaultHandlerSession, invoke: (handlers: TargetCommandHandlers) => Promise<Result>, signal?: AbortSignal) => Promise<Result>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { TargetDefaultConfig } from "./targetDefaultConfig.js";
|
|
3
|
+
import { type SetTargetCommandExitCode, type TargetCommandHandlerSession, type TargetCommandStreams } from "./targetCommands.js";
|
|
4
|
+
export declare const createProductionTargetCommandSession: (config: TargetDefaultConfig) => TargetCommandHandlerSession;
|
|
5
|
+
export declare const registerProductionTargetCommands: (program: Command, streams: TargetCommandStreams, stdin: AsyncIterable<unknown>, setExitCode: SetTargetCommandExitCode) => void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { registerContainerBundleCommand } from "./containerBundleCommand.js";
|
|
2
|
+
import { readTargetDefaultConfigStdin, readTargetWorldReadinessConfigStdin, } from "./targetDefaultConfigStdin.js";
|
|
3
|
+
import { createProductionTargetWorldQuerySession } from "./targetDefaultWorldQueries.js";
|
|
4
|
+
import { registerTargetConfigResolverCommand, TARGET_CONFIG_RESOLVER_COMMAND, } from "./targetConfigResolverCommand.js";
|
|
5
|
+
import { createProductionTargetLookupLoader } from "./targetLookupCommands.js";
|
|
6
|
+
import { registerTargetCommands, } from "./targetCommands.js";
|
|
7
|
+
export const createProductionTargetCommandSession = (config) => Object.freeze({
|
|
8
|
+
activateTopology: async (request) => {
|
|
9
|
+
const { activateTargetDefaultTopology } = await import("./targetDefaultHandlers.js");
|
|
10
|
+
return activateTargetDefaultTopology(config, request);
|
|
11
|
+
},
|
|
12
|
+
run: async (invokeHandlers) => {
|
|
13
|
+
const { withTargetDefaultHandlerSession } = await import("./targetDefaultHandlers.js");
|
|
14
|
+
return withTargetDefaultHandlerSession(config, invokeHandlers);
|
|
15
|
+
},
|
|
16
|
+
attestTopology: async (request) => {
|
|
17
|
+
const { attestTargetDefaultTopology } = await import("./targetDefaultHandlers.js");
|
|
18
|
+
return attestTargetDefaultTopology(config, request);
|
|
19
|
+
},
|
|
20
|
+
queryWorldReadiness: async (request) => {
|
|
21
|
+
const { queryTargetDefaultWorldReadiness } = await import("./targetDefaultWorldReadiness.js");
|
|
22
|
+
return queryTargetDefaultWorldReadiness(config, request);
|
|
23
|
+
},
|
|
24
|
+
queryWorldClock: async (request) => {
|
|
25
|
+
const { queryTargetDefaultWorldClock } = await import("./targetDefaultWorldClock.js");
|
|
26
|
+
return queryTargetDefaultWorldClock(config, request);
|
|
27
|
+
},
|
|
28
|
+
snapshotPublicArtifact: async (request) => {
|
|
29
|
+
const { snapshotTargetDefaultPublicArtifact } = await import("./targetDefaultHandlers.js");
|
|
30
|
+
return snapshotTargetDefaultPublicArtifact(config, request);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
export const registerProductionTargetCommands = (program, streams, stdin, setExitCode) => {
|
|
34
|
+
const target = registerTargetCommands(program, async (configInput) => {
|
|
35
|
+
if (configInput !== "-")
|
|
36
|
+
throw new TypeError("Invalid target configuration");
|
|
37
|
+
return createProductionTargetCommandSession(await readTargetDefaultConfigStdin(stdin));
|
|
38
|
+
}, streams, setExitCode, createProductionTargetLookupLoader(stdin), async (configInput) => {
|
|
39
|
+
if (configInput !== "-")
|
|
40
|
+
throw new TypeError("Invalid target configuration");
|
|
41
|
+
return createProductionTargetWorldQuerySession(await readTargetWorldReadinessConfigStdin(stdin));
|
|
42
|
+
}, [TARGET_CONFIG_RESOLVER_COMMAND]);
|
|
43
|
+
registerContainerBundleCommand(target, stdin, streams, setExitCode);
|
|
44
|
+
registerTargetConfigResolverCommand(target, streams, setExitCode);
|
|
45
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
3
|
+
export declare const registerTrainCommand: (program: Command, handlers: CliHandlers, streams: CliStreams, packageVersion: string, setExitCode: (code: number) => void, signal?: AbortSignal) => void;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
const forwarded = ["train", "test", "editable", "resource", "judge", "judge-citation-repairs", "validation-group", "optimizer-model",
|
|
3
|
+
"bridge-command", "out", "max-trials", "max-proposals", "seed", "timeout-ms", "view", "cost-config"];
|
|
4
|
+
const repeated = new Set(["editable", "resource", "judge", "judge-citation-repairs", "validation-group"]);
|
|
5
|
+
const key = (name) => name.replace(/-([a-z])/gu, (_, letter) => letter.toUpperCase());
|
|
6
|
+
export const registerTrainCommand = (program, handlers, streams, packageVersion, setExitCode, signal) => {
|
|
7
|
+
const command = program.command("train")
|
|
8
|
+
.description("Train one canonical agent through Paideia's isolated native integration")
|
|
9
|
+
.argument("[path]", "Canonical project directory or Spawnfile path", process.cwd())
|
|
10
|
+
.option("--agent <id>", "Exact canonical agent node id (inferred only for a single-agent project)")
|
|
11
|
+
.option("--paideia-command <executable>", "Installed Paideia executable; no shell or automatic install", "paideia")
|
|
12
|
+
.option("--training-image <immutable-image>", "Pinned image containing the complete training environment")
|
|
13
|
+
.option("--training-config <json>", "V2 image recipe and declared inputs, or advanced v1 local bindings")
|
|
14
|
+
.option("--dry-run", "Validate and estimate without compiling, authenticating or starting models")
|
|
15
|
+
.option("--repair-measurements <parent-out>", "Fork captured work into a fresh output for authorized measurement repair")
|
|
16
|
+
.option("--repair-witness <manifest>", "Explicit verified image witness for a legacy parent")
|
|
17
|
+
.option("--resume", "Resume the exact persisted training experiment in --out");
|
|
18
|
+
for (const name of forwarded) {
|
|
19
|
+
const flag = `--${name} <value>`;
|
|
20
|
+
if (repeated.has(name))
|
|
21
|
+
command.option(flag, `Paideia ${name}; repeatable`, (value, previous) => [...previous, value], []);
|
|
22
|
+
else if (name === "train")
|
|
23
|
+
command.requiredOption(flag, `Paideia ${name}`);
|
|
24
|
+
else
|
|
25
|
+
command.option(flag, `Paideia ${name}`);
|
|
26
|
+
}
|
|
27
|
+
command.action(async (inputPath, options) => {
|
|
28
|
+
if (options.dryRun !== true && typeof options.out !== "string") {
|
|
29
|
+
throw new SpawnfileError("validation_error", "Actual training requires --out; dry-run does not write an output directory");
|
|
30
|
+
}
|
|
31
|
+
if (options.dryRun !== true && typeof options.trainingConfig !== "string") {
|
|
32
|
+
throw new SpawnfileError("validation_error", "Actual training requires --training-config; v1 additionally requires --training-image; host execution is disabled");
|
|
33
|
+
}
|
|
34
|
+
const timeout = options.timeoutMs === undefined ? 3_600_000 : Number(options.timeoutMs);
|
|
35
|
+
if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 3_600_000 ||
|
|
36
|
+
(options.timeoutMs !== undefined && !/^\d+$/u.test(String(options.timeoutMs)))) {
|
|
37
|
+
throw new SpawnfileError("validation_error", "--timeout-ms must be an integer from 1 to 3600000");
|
|
38
|
+
}
|
|
39
|
+
const context = await handlers.createTrainingContext(inputPath, {
|
|
40
|
+
agent: options.agent, packageVersion
|
|
41
|
+
});
|
|
42
|
+
const args = [];
|
|
43
|
+
for (const name of forwarded) {
|
|
44
|
+
const value = options[key(name)];
|
|
45
|
+
if (typeof value === "string")
|
|
46
|
+
args.push(`--${name}`, value);
|
|
47
|
+
else if (Array.isArray(value))
|
|
48
|
+
for (const item of value)
|
|
49
|
+
args.push(`--${name}`, item);
|
|
50
|
+
}
|
|
51
|
+
if (options.dryRun === true)
|
|
52
|
+
args.push("--dry-run");
|
|
53
|
+
if (options.resume === true)
|
|
54
|
+
args.push("--resume");
|
|
55
|
+
setExitCode(await handlers.delegatePaideiaTraining({ context, args,
|
|
56
|
+
repairMeasurements: options.repairMeasurements, repairWitness: options.repairWitness,
|
|
57
|
+
trainingImage: options.trainingImage, trainingConfig: options.trainingConfig,
|
|
58
|
+
command: options.paideiaCommand, dryRun: options.dryRun === true,
|
|
59
|
+
timeoutMs: timeout + 5000, streams, signal }));
|
|
60
|
+
});
|
|
61
|
+
};
|
package/dist/cli/upCommand.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { open } from "node:fs/promises";
|
|
3
|
-
import { createDeploymentInstanceDigest, readDeploymentRecord, recordLifecycleOutcomeEvidence } from "../deployment/index.js";
|
|
3
|
+
import { createDeploymentInstanceDigest, admitLifecyclePlan, LIFECYCLE_UP_EXTRA_LABELS, recordLifecycleUpReservation, recordLifecycleUpStart, readDeploymentRecord, recordLifecycleOutcomeEvidence } from "../deployment/index.js";
|
|
4
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
5
|
import { requireMachineLifecycle, runMachineLifecycle } from "./lifecycleMachine.js";
|
|
6
6
|
import { resolveCommandInput } from "./resolveCommandInput.js";
|
|
@@ -68,9 +68,11 @@ export const registerUpCommand = (program, handlers, streams) => {
|
|
|
68
68
|
if (options.worldBindings !== undefined) {
|
|
69
69
|
throw new SpawnfileError("validation_error", "`--world-bindings` is only supported for project-mode deployments");
|
|
70
70
|
}
|
|
71
|
+
if (options.lifecycleInvocation !== undefined) {
|
|
72
|
+
throw new SpawnfileError("validation_error", "Machine lifecycle image up is not supported; use the project deployment contract");
|
|
73
|
+
}
|
|
71
74
|
if (options.json) {
|
|
72
|
-
throw new SpawnfileError("validation_error", "
|
|
73
|
-
"(there is no source Spawnfile to derive compiled_schedule from).");
|
|
75
|
+
throw new SpawnfileError("validation_error", "Machine-readable lifecycle up is supported only for project deployments; use the project deployment contract");
|
|
74
76
|
}
|
|
75
77
|
await runImageUpCommand(upInput.ref, options, handlers, streams);
|
|
76
78
|
return;
|
|
@@ -101,11 +103,36 @@ export const registerUpCommand = (program, handlers, streams) => {
|
|
|
101
103
|
forceImage: options.image,
|
|
102
104
|
lifecycleInvocation: options.lifecycleInvocation
|
|
103
105
|
});
|
|
104
|
-
const render = async (capability) => {
|
|
106
|
+
const render = async (capability, lifecycleRecovery) => {
|
|
105
107
|
const selectedTargetReceipt = options.selectedTargetReceipt === undefined
|
|
106
108
|
? undefined
|
|
107
109
|
: await readSelectedTargetReceipt(options.selectedTargetReceipt);
|
|
108
|
-
const
|
|
110
|
+
const projectOptions = createUpProjectOptions({ ...options, selectedTargetReceipt });
|
|
111
|
+
const lifecycleProjectOptions = exactInvocation && capability
|
|
112
|
+
? {
|
|
113
|
+
...projectOptions,
|
|
114
|
+
...(lifecycleRecovery === undefined ? {} : { lifecycleRecovery }),
|
|
115
|
+
onDetachedReservation: async (reserved) => recordLifecycleUpReservation(exactInvocation, {
|
|
116
|
+
container_name: reserved.containerName,
|
|
117
|
+
docker_command: reserved.dockerCommand,
|
|
118
|
+
docker_context: reserved.dockerContext,
|
|
119
|
+
label_authority: {
|
|
120
|
+
permitted_extra_labels: LIFECYCLE_UP_EXTRA_LABELS,
|
|
121
|
+
required: reserved.deploymentLabels,
|
|
122
|
+
},
|
|
123
|
+
}, capability),
|
|
124
|
+
onDetachedStarted: async (started) => recordLifecycleUpStart(exactInvocation, {
|
|
125
|
+
container_id: started.containerId,
|
|
126
|
+
container_name: started.containerName,
|
|
127
|
+
image_id: started.imageId,
|
|
128
|
+
label_authority: {
|
|
129
|
+
permitted_extra_labels: LIFECYCLE_UP_EXTRA_LABELS,
|
|
130
|
+
required: started.deploymentLabels,
|
|
131
|
+
},
|
|
132
|
+
}, capability)
|
|
133
|
+
}
|
|
134
|
+
: projectOptions;
|
|
135
|
+
const result = await handlers.upProject(inputPath, lifecycleProjectOptions);
|
|
109
136
|
const receipt = await handlers.buildUpReceipt(inputPath, result);
|
|
110
137
|
const bytes = JSON.stringify(receipt, null, 2);
|
|
111
138
|
if (exactInvocation && capability) {
|
|
@@ -115,9 +142,11 @@ export const registerUpCommand = (program, handlers, streams) => {
|
|
|
115
142
|
}
|
|
116
143
|
return bytes;
|
|
117
144
|
};
|
|
145
|
+
if (exactInvocation)
|
|
146
|
+
await admitLifecyclePlan(exactInvocation);
|
|
118
147
|
const output = options.lifecycleInvocation === undefined
|
|
119
148
|
? await render()
|
|
120
|
-
: await runMachineLifecycle(exactInvocation, render, () => reconcileUpLifecycle(inputPath, options, exactInvocation));
|
|
149
|
+
: await runMachineLifecycle(exactInvocation, render, (capability) => reconcileUpLifecycle(inputPath, options, exactInvocation, capability));
|
|
121
150
|
streams.stdout(output);
|
|
122
151
|
return;
|
|
123
152
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { findLifecycleOutcomeEvidence } from "../deployment/index.js";
|
|
1
|
+
import { findLifecycleOutcomeEvidence, type LifecycleOwnerCapability } from "../deployment/index.js";
|
|
2
2
|
import type { LifecycleReconciliation } from "./lifecycleMachine.js";
|
|
3
3
|
import type { UpLifecycleOptions } from "./upLifecycleInvocation.js";
|
|
4
|
-
export declare const reconcileUpLifecycle: (inputPath: string, options: UpLifecycleOptions, invocation: Parameters<typeof findLifecycleOutcomeEvidence>[0]) => Promise<LifecycleReconciliation>;
|
|
4
|
+
export declare const reconcileUpLifecycle: (inputPath: string, options: UpLifecycleOptions, invocation: Parameters<typeof findLifecycleOutcomeEvidence>[0], capability: LifecycleOwnerCapability) => Promise<LifecycleReconciliation>;
|
|
@@ -1,53 +1,197 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { lstat } from "node:fs/promises";
|
|
1
3
|
import path from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { createDeploymentInstanceDigest, findLifecycleOutcomeEvidence, findLifecycleUpReservation, findLifecycleUpStart, readDeploymentRecord, recordLifecycleUpStart, resolveDeploymentRecordPath, } from "../deployment/index.js";
|
|
6
|
+
import { deploymentRecordRecovery, detachedContainerRecovery, noDockerMutationRecovery, } from "../deployment/upLifecycleRecoveryState.js";
|
|
7
|
+
import { readUtf8File, resolveProjectOutputDirectory } from "../filesystem/index.js";
|
|
4
8
|
import { DEFAULT_OUTPUT_DIRECTORY, REPORT_FILENAME } from "../shared/index.js";
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
const execFile = promisify(execFileCallback);
|
|
10
|
+
const inspectFormat = "{{json .Id}}\n{{json .Name}}\n{{json .Image}}\n{{json .Config.Labels}}";
|
|
11
|
+
const imageFormat = "{{json .Id}}\n{{json .Config.Labels}}";
|
|
12
|
+
const ambiguous = (reason) => ({ reason, status: "ambiguous" });
|
|
13
|
+
const canonical = (value) => value === null || typeof value !== "object"
|
|
14
|
+
? JSON.stringify(value)
|
|
15
|
+
: Array.isArray(value) ? `[${value.map(canonical).join(",")}]`
|
|
16
|
+
: `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`;
|
|
17
|
+
const isRecord = (value) => value !== null
|
|
18
|
+
&& typeof value === "object" && !Array.isArray(value)
|
|
19
|
+
&& Object.values(value).every((entry) => typeof entry === "string");
|
|
20
|
+
const exactHandoff = (record, options) => record.organization_handoff !== undefined
|
|
21
|
+
&& record.organization_handoff_handle !== undefined
|
|
22
|
+
&& record.organization_handoff.network_attachment_handle === options.networkAttachmentHandle
|
|
23
|
+
&& record.organization_handoff.selected_target_receipt_digest === options.selectedTargetReceiptDigest;
|
|
24
|
+
const exactNoSuchContainer = (error) => /(?:No such container|No such object)/u.test(error instanceof Error ? error.message : String(error));
|
|
25
|
+
const missingDeploymentRecord = async (recordPath) => {
|
|
26
|
+
try {
|
|
27
|
+
await lstat(recordPath);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return error.code === "ENOENT";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const dockerArgs = (reservation, args) => [
|
|
35
|
+
...(reservation.docker_context ? ["--context", reservation.docker_context] : []), ...args,
|
|
36
|
+
];
|
|
37
|
+
const reservationMatchesRequest = (reservation, options) => reservation.docker_context === (options.context ?? null)
|
|
38
|
+
&& reservation.docker_command === (options.dockerCommand ?? "docker");
|
|
39
|
+
const inspectContainer = async (reservation, reference) => {
|
|
40
|
+
try {
|
|
41
|
+
const result = await execFile(reservation.docker_command, dockerArgs(reservation, [
|
|
42
|
+
"container", "inspect", "--format", inspectFormat, reference,
|
|
43
|
+
]), { timeout: 10_000 });
|
|
44
|
+
const [id, name, image, labels, ...extra] = result.stdout.trim().split("\n");
|
|
45
|
+
const containerId = id ? JSON.parse(id) : undefined;
|
|
46
|
+
const containerName = name ? JSON.parse(name) : undefined;
|
|
47
|
+
const imageId = image ? JSON.parse(image) : undefined;
|
|
48
|
+
const parsedLabels = labels ? JSON.parse(labels) : undefined;
|
|
49
|
+
if (extra.length || typeof containerId !== "string" || !/^[a-f0-9]{64}$/u.test(containerId)
|
|
50
|
+
|| typeof containerName !== "string" || !containerName.startsWith("/") || containerName.length < 2
|
|
51
|
+
|| typeof imageId !== "string"
|
|
52
|
+
|| !/^sha256:[a-f0-9]{64}$/u.test(imageId) || !isRecord(parsedLabels))
|
|
53
|
+
throw new Error("invalid inspect");
|
|
54
|
+
return { container_id: containerId, container_name: containerName.slice(1), image_id: imageId, labels: parsedLabels };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (exactNoSuchContainer(error))
|
|
58
|
+
return null;
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const verifyImageLabels = async (reservation, observed) => {
|
|
63
|
+
const result = await execFile(reservation.docker_command, dockerArgs(reservation, [
|
|
64
|
+
"image", "inspect", "--format", imageFormat, observed.image_id,
|
|
65
|
+
]), { timeout: 10_000 });
|
|
66
|
+
const [id, labels, ...extra] = result.stdout.trim().split("\n");
|
|
67
|
+
const imageId = id ? JSON.parse(id) : undefined;
|
|
68
|
+
const parsedLabels = labels ? JSON.parse(labels) : {};
|
|
69
|
+
const imageLabels = parsedLabels === null ? {} : parsedLabels;
|
|
70
|
+
if (extra.length || imageId !== observed.image_id || !isRecord(imageLabels))
|
|
71
|
+
return false;
|
|
72
|
+
const required = reservation.label_authority.required;
|
|
73
|
+
const expected = { ...imageLabels, ...required };
|
|
74
|
+
return canonical(observed.labels) === canonical(expected);
|
|
75
|
+
};
|
|
76
|
+
const verifyObserved = async (reservation, observed, expectedId, expectedImageId) => observed !== null
|
|
77
|
+
&& observed.container_name === reservation.container_name
|
|
78
|
+
&& (expectedId === undefined || observed.container_id === expectedId)
|
|
79
|
+
&& (expectedImageId === undefined || observed.image_id === expectedImageId)
|
|
80
|
+
&& await verifyImageLabels(reservation, observed);
|
|
81
|
+
const recoverRecordedDetachedContainer = async (reservation, state) => {
|
|
82
|
+
const start = state.start;
|
|
83
|
+
if (start.container_name !== reservation.container_name
|
|
84
|
+
|| canonical(start.label_authority) !== canonical(reservation.label_authority)) {
|
|
85
|
+
return ambiguous("up_started_container_authority_drifted");
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const observed = await inspectContainer(reservation, start.container_id);
|
|
89
|
+
if (observed === null)
|
|
90
|
+
return ambiguous("up_started_container_missing");
|
|
91
|
+
if (!await verifyObserved(reservation, observed, start.container_id, start.image_id)) {
|
|
92
|
+
return ambiguous("up_started_container_drifted");
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
recovery: detachedContainerRecovery({
|
|
96
|
+
containerId: observed.container_id,
|
|
97
|
+
containerName: observed.container_name,
|
|
98
|
+
deploymentLabels: reservation.label_authority.required,
|
|
99
|
+
imageId: observed.image_id,
|
|
100
|
+
}),
|
|
101
|
+
status: "resume_safe",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return ambiguous("up_started_container_reconciliation_failed");
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const reconcileUnrecordedStart = async (invocation, options, capability) => {
|
|
109
|
+
let reservation;
|
|
110
|
+
try {
|
|
111
|
+
reservation = await findLifecycleUpReservation(invocation);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return ambiguous("up_reservation_invalid");
|
|
115
|
+
}
|
|
116
|
+
// A current implementation performs no Docker effect before publishing this
|
|
117
|
+
// fsynced reservation, so its absence is restart-safe but never called not-applied.
|
|
118
|
+
if (reservation === null)
|
|
119
|
+
return { status: "resume_safe" };
|
|
120
|
+
if (!reservationMatchesRequest(reservation, options))
|
|
121
|
+
return ambiguous("up_reservation_request_drifted");
|
|
22
122
|
try {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
(options.name !== undefined &&
|
|
36
|
-
record.units[0]?.container_name !== options.name) ||
|
|
37
|
-
!exactHandoff(record, options))
|
|
38
|
-
return ambiguous("up_durable_evidence_drifted");
|
|
39
|
-
const evidence = await findLifecycleOutcomeEvidence(invocation);
|
|
40
|
-
if (!evidence)
|
|
41
|
-
return ambiguous("up_receipt_evidence_absent");
|
|
42
|
-
if (evidence.deployment_instance_digest !==
|
|
43
|
-
createDeploymentInstanceDigest(record))
|
|
44
|
-
return ambiguous("up_deployment_instance_changed");
|
|
123
|
+
const observed = await inspectContainer(reservation, reservation.container_name);
|
|
124
|
+
if (observed === null) {
|
|
125
|
+
return { recovery: noDockerMutationRecovery(), status: "provably_not_applied" };
|
|
126
|
+
}
|
|
127
|
+
if (!await verifyObserved(reservation, observed))
|
|
128
|
+
return ambiguous("up_reserved_container_drifted");
|
|
129
|
+
await recordLifecycleUpStart(invocation, {
|
|
130
|
+
container_id: observed.container_id,
|
|
131
|
+
container_name: observed.container_name,
|
|
132
|
+
image_id: observed.image_id,
|
|
133
|
+
label_authority: reservation.label_authority,
|
|
134
|
+
}, capability);
|
|
45
135
|
return {
|
|
46
|
-
|
|
47
|
-
|
|
136
|
+
recovery: detachedContainerRecovery({
|
|
137
|
+
containerId: observed.container_id,
|
|
138
|
+
containerName: observed.container_name,
|
|
139
|
+
deploymentLabels: reservation.label_authority.required,
|
|
140
|
+
imageId: observed.image_id,
|
|
141
|
+
}),
|
|
142
|
+
status: "resume_safe",
|
|
48
143
|
};
|
|
49
144
|
}
|
|
50
145
|
catch {
|
|
51
|
-
return ambiguous("
|
|
146
|
+
return ambiguous("up_reserved_container_reconciliation_failed");
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
export const reconcileUpLifecycle = async (inputPath, options, invocation, capability) => {
|
|
150
|
+
const outputDirectory = resolveProjectOutputDirectory(inputPath, options.out, DEFAULT_OUTPUT_DIRECTORY);
|
|
151
|
+
if (!options.deployment)
|
|
152
|
+
return ambiguous("up_deployment_not_bound");
|
|
153
|
+
const recordPath = resolveDeploymentRecordPath(outputDirectory, options.deployment);
|
|
154
|
+
if (!await missingDeploymentRecord(recordPath)) {
|
|
155
|
+
let record;
|
|
156
|
+
try {
|
|
157
|
+
record = await readDeploymentRecord(recordPath);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return ambiguous("up_durable_evidence_absent_or_invalid");
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const report = JSON.parse(await readUtf8File(path.join(outputDirectory, REPORT_FILENAME)));
|
|
164
|
+
if (record.name !== options.deployment || record.output_directory !== outputDirectory
|
|
165
|
+
|| record.source.kind !== "project" || path.resolve(record.source.root) !== path.resolve(inputPath)
|
|
166
|
+
|| record.compile_fingerprint !== report.compile_fingerprint
|
|
167
|
+
|| record.auth_profile !== (options.authProfile ?? null)
|
|
168
|
+
|| (options.context !== undefined && (record.target.kind !== "context" || record.target.name !== options.context))
|
|
169
|
+
|| (options.name !== undefined && record.units[0]?.container_name !== options.name)
|
|
170
|
+
|| !exactHandoff(record, options))
|
|
171
|
+
return ambiguous("up_durable_evidence_drifted");
|
|
172
|
+
const evidence = await findLifecycleOutcomeEvidence(invocation);
|
|
173
|
+
if (!evidence)
|
|
174
|
+
return { recovery: deploymentRecordRecovery(), status: "resume_safe" };
|
|
175
|
+
return evidence.deployment_instance_digest === createDeploymentInstanceDigest(record)
|
|
176
|
+
? { outcomeBytes: evidence.completion.outcome_bytes, status: "completed" }
|
|
177
|
+
: ambiguous("up_deployment_instance_changed");
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return ambiguous("up_durable_evidence_absent_or_invalid");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
let started;
|
|
184
|
+
try {
|
|
185
|
+
started = await findLifecycleUpStart(invocation);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return ambiguous("up_start_record_unreadable");
|
|
189
|
+
}
|
|
190
|
+
if (started) {
|
|
191
|
+
const reservation = await findLifecycleUpReservation(invocation).catch(() => null);
|
|
192
|
+
return reservation === null || !reservationMatchesRequest(reservation, options)
|
|
193
|
+
? ambiguous("up_start_reservation_unavailable")
|
|
194
|
+
: recoverRecordedDetachedContainer(reservation, started);
|
|
52
195
|
}
|
|
196
|
+
return reconcileUnrecordedStart(invocation, options, capability);
|
|
53
197
|
};
|