spawnfile 0.1.17 → 0.1.19
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 +1 -1
- package/dist/auth/importers.js +21 -5
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/profileStore.js +4 -1
- 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/cli/authCommands.js +9 -5
- package/dist/cli/compileBuildCommands.js +4 -0
- package/dist/cli/devCommands.js +4 -2
- package/dist/cli/downCommand.d.ts +2 -0
- package/dist/cli/downCommand.js +3 -0
- package/dist/cli/envFileOption.d.ts +18 -0
- package/dist/cli/envFileOption.js +20 -0
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +3 -1
- package/dist/cli/lifecyclePlan.d.ts +1 -0
- package/dist/cli/lifecyclePlan.js +2 -0
- package/dist/cli/paideiaDelegation.d.ts +2 -1
- package/dist/cli/paideiaDelegation.js +5 -4
- 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 +7 -1
- package/dist/cli/runCli.js +11 -6
- package/dist/cli/runPublishCommands.js +5 -3
- package/dist/cli/trainCommand.js +73 -20
- package/dist/cli/upCommand.js +5 -1
- package/dist/cli/volumeCommands.d.ts +8 -0
- package/dist/cli/volumeCommands.js +53 -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/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 +2 -0
- package/dist/compiler/compileProject.d.ts +10 -0
- package/dist/compiler/compileProject.js +29 -3
- package/dist/compiler/containerArtifactSummaries.js +1 -0
- package/dist/compiler/containerArtifacts.d.ts +4 -4
- package/dist/compiler/containerArtifacts.js +18 -34
- package/dist/compiler/containerArtifactsPlans.js +7 -0
- package/dist/compiler/containerArtifactsTypes.d.ts +7 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +3 -1
- package/dist/compiler/containerDaimonBrokerRender.js +6 -3
- package/dist/compiler/containerDaimonGrokTaskClock.d.ts +5 -0
- package/dist/compiler/containerDaimonGrokTaskClock.js +29 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +1 -1
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +38 -16
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +33 -8
- package/dist/compiler/containerDaimonGrokWorkerRender.js +18 -5
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +14 -1
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +15 -2
- package/dist/compiler/containerDaimonUidEntrypointRender.js +6 -12
- package/dist/compiler/containerTargetResources.d.ts +10 -0
- package/dist/compiler/containerTargetResources.js +21 -13
- package/dist/compiler/containerWorkspaceResourceRender.js +4 -1
- package/dist/compiler/index.d.ts +2 -0
- package/dist/compiler/index.js +2 -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/moltnetArtifactTypes.d.ts +1 -0
- package/dist/compiler/moltnetArtifacts.js +1 -0
- 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 +2 -1
- package/dist/compiler/runProject.js +2 -0
- 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 +4 -2
- package/dist/compiler/training/broker/declaration.js +4 -2
- package/dist/compiler/training/broker/entrypoint.js +33 -18
- 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 +3 -2
- package/dist/compiler/training/broker/index.js +3 -2
- package/dist/compiler/training/broker/main.js +1 -1
- package/dist/compiler/training/broker/paths.d.ts +96 -56
- package/dist/compiler/training/broker/paths.js +97 -89
- package/dist/compiler/training/broker/processes.d.ts +9 -0
- package/dist/compiler/training/broker/processes.js +4 -1
- package/dist/compiler/training/broker/projection.d.ts +3 -2
- package/dist/compiler/training/broker/projection.js +21 -9
- package/dist/compiler/training/broker/provisioning.d.ts +6 -15
- package/dist/compiler/training/broker/provisioning.js +71 -53
- package/dist/compiler/training/broker/registration.d.ts +3 -1
- package/dist/compiler/training/broker/registration.js +29 -21
- 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 +10 -13
- package/dist/compiler/training/broker/runtime.js +69 -115
- package/dist/compiler/training/broker/supervisor.d.ts +10 -11
- package/dist/compiler/training/broker/supervisor.js +22 -23
- 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 +23 -0
- package/dist/compiler/training/container/contract.js +23 -5
- 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 +2 -1
- package/dist/compiler/training/container/index.js +2 -1
- package/dist/compiler/training/container/launch.d.ts +3 -0
- package/dist/compiler/training/container/launch.js +119 -28
- 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 +3 -1
- package/dist/compiler/training/container/prepare.js +57 -12
- package/dist/compiler/training/container/security.d.ts +5 -3
- package/dist/compiler/training/container/security.js +15 -5
- 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 +8 -0
- package/dist/compiler/training/context.js +12 -12
- package/dist/compiler/training/contract.d.ts +2 -0
- package/dist/compiler/training/contract.js +2 -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 +8 -0
- package/dist/compiler/training/index.js +7 -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 +13 -2
- package/dist/compiler/training/preparation/assets/package-lock.json +2 -2
- package/dist/compiler/training/preparation/broker.d.ts +3 -3
- package/dist/compiler/training/preparation/broker.js +6 -4
- package/dist/compiler/training/preparation/contract.d.ts +27 -2
- package/dist/compiler/training/preparation/contract.js +23 -4
- package/dist/compiler/training/preparation/files.d.ts +5 -1
- package/dist/compiler/training/preparation/files.js +76 -15
- package/dist/compiler/training/preparation/image.js +9 -4
- package/dist/compiler/training/preparation/inputs.d.ts +1 -0
- package/dist/compiler/training/preparation/inputs.js +18 -10
- package/dist/compiler/training/preparation/prepare.d.ts +5 -0
- package/dist/compiler/training/preparation/prepare.js +66 -29
- package/dist/compiler/training/preparation/scratch.d.ts +6 -17
- package/dist/compiler/training/preparation/scratch.js +89 -23
- package/dist/compiler/training/repair/contract.d.ts +338 -4
- package/dist/compiler/training/repair/contract.js +2 -0
- package/dist/compiler/training/repair/index.d.ts +1 -1
- package/dist/compiler/training/repair/index.js +1 -1
- package/dist/compiler/training/repair/prepare.d.ts +155 -3
- package/dist/compiler/training/repair/prepare.js +6 -2
- package/dist/compiler/training/repair/witness.d.ts +152 -3
- package/dist/compiler/training/repair/witness.js +8 -2
- 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 +6 -3
- package/dist/compiler/upProject.d.ts +1 -0
- package/dist/compiler/upProject.js +21 -5
- package/dist/compiler/workspaceBundleArtifacts.d.ts +16 -1
- package/dist/compiler/workspaceBundleArtifacts.js +69 -20
- 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 +5 -1
- package/dist/compiler/workspaceResources.js +32 -5
- package/dist/deployment/activation.d.ts +3 -0
- package/dist/deployment/activation.js +12 -0
- package/dist/deployment/canaryCutover.d.ts +1 -1
- package/dist/deployment/candidateRecording.d.ts +8 -0
- package/dist/deployment/candidateRecording.js +22 -0
- package/dist/deployment/dockerManager.d.ts +5 -3
- package/dist/deployment/dockerManager.js +12 -2
- package/dist/deployment/downDeployment.d.ts +2 -0
- package/dist/deployment/downDeployment.js +6 -2
- package/dist/deployment/homeStore.d.ts +9 -1
- package/dist/deployment/homeStore.js +16 -53
- package/dist/deployment/index.d.ts +6 -0
- package/dist/deployment/index.js +6 -0
- package/dist/deployment/pidLock.d.ts +25 -0
- package/dist/deployment/pidLock.js +81 -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/distribution/buildDistributionReport.d.ts +3 -0
- package/dist/distribution/buildDistributionReport.js +5 -0
- package/dist/distribution/consumeImage.d.ts +3 -0
- package/dist/distribution/consumeImage.js +23 -31
- package/dist/distribution/consumeImageLifecycle.d.ts +4 -1
- package/dist/distribution/consumeImageLifecycle.js +14 -3
- package/dist/distribution/consumeImageSupport.d.ts +7 -0
- package/dist/distribution/consumeImageSupport.js +25 -0
- package/dist/distribution/distributionReportSchema.d.ts +47 -0
- package/dist/distribution/distributionReportSchema.js +20 -0
- package/dist/distribution/renderImageInterface.js +1 -1
- package/dist/distribution/types.d.ts +15 -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/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 +20 -0
- package/dist/manifest/executionSchemas.js +13 -3
- 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 +61 -0
- package/dist/manifest/mcpSchemas.js +57 -11
- 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/renderSpawnfileWorkspace.js +6 -2
- package/dist/manifest/schemas.d.ts +1206 -132
- package/dist/manifest/schemas.js +14 -4
- package/dist/manifest/teamNetworkSchemas.d.ts +1 -1
- 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 +182 -5
- package/dist/manifest/workspaceSchemas.js +111 -7
- 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 +58 -0
- package/dist/runtime/container.js +8 -13
- package/dist/runtime/daimon/adapter.js +15 -4
- package/dist/runtime/daimon/config.d.ts +4 -0
- package/dist/runtime/daimon/config.js +53 -4
- 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 +59 -8
- package/dist/runtime/daimon/contractManifest.js +26 -10
- package/dist/runtime/daimon/grokTurnLimits.d.ts +25 -0
- package/dist/runtime/daimon/grokTurnLimits.js +51 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +17 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +17 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +5 -0
- package/dist/runtime/daimon/grokWorkerContract.js +13 -1
- package/dist/runtime/daimon/recording.d.ts +19 -0
- package/dist/runtime/daimon/recording.js +50 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +8 -0
- package/dist/runtime/daimon/scheduleAuthority.js +19 -5
- 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 +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/install.d.ts +2 -0
- package/dist/runtime/install.js +1 -0
- package/dist/runtime/openclaw/adapter.js +3 -0
- package/dist/runtime/pi/adapter.js +3 -0
- package/dist/runtime/pi/containerTargets.js +6 -0
- package/dist/runtime/picoclaw/adapter.js +3 -0
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +13 -1
- package/dist/runtime/types.d.ts +15 -0
- package/dist/runtime/usageLedgerRead.d.ts +6 -0
- package/dist/runtime/usageLedgerRead.js +3 -3
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/recording.d.ts +8 -0
- package/dist/shared/recording.js +25 -0
- package/dist/target/dockerCommandExecutorCore.js +1 -1
- package/dist/target/dockerTargetBinding.js +2 -1
- 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/moltnet-releases.json +4 -4
- package/package.json +3 -3
- package/runtimes.yaml +8 -6
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type RecordingReport } from "../report/index.js";
|
|
3
|
+
export declare const DEPLOY_RESOURCES_VERSION = "spawnfile.deploy-resources.v1";
|
|
4
|
+
export declare const DEPLOY_RESOURCE_LOG_FILE = "resource-log.jsonl";
|
|
5
|
+
export declare const deployResourcesSchema: z.ZodObject<{
|
|
6
|
+
version: z.ZodLiteral<"spawnfile.deploy-resources.v1">;
|
|
7
|
+
deployment: z.ZodString;
|
|
8
|
+
deployment_id: z.ZodString;
|
|
9
|
+
activated_at: z.ZodISODateTime;
|
|
10
|
+
activation_exact: z.ZodBoolean;
|
|
11
|
+
activation_note: z.ZodOptional<z.ZodString>;
|
|
12
|
+
rolled_back_at: z.ZodOptional<z.ZodISODateTime>;
|
|
13
|
+
exact: z.ZodOptional<z.ZodLiteral<false>>;
|
|
14
|
+
deployed_at: z.ZodISODateTime;
|
|
15
|
+
report_sha256: z.ZodString;
|
|
16
|
+
resources: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
17
|
+
id: z.ZodString;
|
|
18
|
+
kind: z.ZodLiteral<"git">;
|
|
19
|
+
commit: z.ZodString;
|
|
20
|
+
sha256: z.ZodString;
|
|
21
|
+
url: z.ZodOptional<z.ZodString>;
|
|
22
|
+
agent_node_ids: z.ZodArray<z.ZodString>;
|
|
23
|
+
declared_by: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
25
|
+
id: z.ZodString;
|
|
26
|
+
kind: z.ZodLiteral<"bundle">;
|
|
27
|
+
sha256: z.ZodString;
|
|
28
|
+
origin: z.ZodOptional<z.ZodString>;
|
|
29
|
+
agent_node_ids: z.ZodArray<z.ZodString>;
|
|
30
|
+
declared_by: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, z.core.$strict>], "kind">>;
|
|
32
|
+
recording_agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
33
|
+
node_id: z.ZodString;
|
|
34
|
+
slug: z.ZodString;
|
|
35
|
+
directory: z.ZodString;
|
|
36
|
+
keep_ms: z.ZodNumber;
|
|
37
|
+
networks: z.ZodArray<z.ZodString>;
|
|
38
|
+
memory: z.ZodArray<z.ZodObject<{
|
|
39
|
+
id: z.ZodString;
|
|
40
|
+
declared_by: z.ZodString;
|
|
41
|
+
ledger_path: z.ZodNullable<z.ZodString>;
|
|
42
|
+
}, z.core.$strict>>;
|
|
43
|
+
feeds: z.ZodArray<z.ZodObject<{
|
|
44
|
+
id: z.ZodString;
|
|
45
|
+
volume_name: z.ZodString;
|
|
46
|
+
}, z.core.$strict>>;
|
|
47
|
+
resources: z.ZodArray<z.ZodObject<{
|
|
48
|
+
id: z.ZodString;
|
|
49
|
+
kind: z.ZodEnum<{
|
|
50
|
+
git: "git";
|
|
51
|
+
bundle: "bundle";
|
|
52
|
+
}>;
|
|
53
|
+
}, z.core.$strict>>;
|
|
54
|
+
snapshots: z.ZodArray<z.ZodString>;
|
|
55
|
+
}, z.core.$strict>>>;
|
|
56
|
+
}, z.core.$strict>;
|
|
57
|
+
export type DeployResources = z.infer<typeof deployResourcesSchema>;
|
|
58
|
+
export interface ResourceOwnership {
|
|
59
|
+
agent_node_ids: string[];
|
|
60
|
+
declared_by?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Both reports carry the already-resolved pins; distribution omits private URLs. */
|
|
63
|
+
export interface DeployResourceReport {
|
|
64
|
+
recording?: RecordingReport;
|
|
65
|
+
workspace_git_resources?: Array<Partial<ResourceOwnership> & {
|
|
66
|
+
id: string;
|
|
67
|
+
commit: string;
|
|
68
|
+
sha256: string;
|
|
69
|
+
url?: string;
|
|
70
|
+
}>;
|
|
71
|
+
workspace_bundles?: Array<Partial<ResourceOwnership> & {
|
|
72
|
+
id: string;
|
|
73
|
+
sha256: string;
|
|
74
|
+
origin?: string;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
export interface DeploymentActivation {
|
|
78
|
+
activated_at?: string;
|
|
79
|
+
activation_exact?: boolean;
|
|
80
|
+
activation_note?: string;
|
|
81
|
+
}
|
|
82
|
+
/** Record path is the deployment identity: project output scoped, or home scoped. */
|
|
83
|
+
export declare const deployResourceLogPath: (recordPath: string) => string;
|
|
84
|
+
export declare const createDeployResources: (recordPath: string, record: DeploymentActivation & {
|
|
85
|
+
name: string;
|
|
86
|
+
created_at: string;
|
|
87
|
+
}, report: DeployResourceReport, reportBytes: string) => DeployResources;
|
|
88
|
+
/** Invalid/legacy unowned lines are reported; never guess an agent's pin. */
|
|
89
|
+
export declare const readDeployResources: (recordPath: string) => import("../filesystem/retainedJsonl.js").JsonlReadResult<{
|
|
90
|
+
version: "spawnfile.deploy-resources.v1";
|
|
91
|
+
deployment: string;
|
|
92
|
+
deployment_id: string;
|
|
93
|
+
activated_at: string;
|
|
94
|
+
activation_exact: boolean;
|
|
95
|
+
deployed_at: string;
|
|
96
|
+
report_sha256: string;
|
|
97
|
+
resources: ({
|
|
98
|
+
id: string;
|
|
99
|
+
kind: "git";
|
|
100
|
+
commit: string;
|
|
101
|
+
sha256: string;
|
|
102
|
+
agent_node_ids: string[];
|
|
103
|
+
url?: string | undefined;
|
|
104
|
+
declared_by?: string | undefined;
|
|
105
|
+
} | {
|
|
106
|
+
id: string;
|
|
107
|
+
kind: "bundle";
|
|
108
|
+
sha256: string;
|
|
109
|
+
agent_node_ids: string[];
|
|
110
|
+
origin?: string | undefined;
|
|
111
|
+
declared_by?: string | undefined;
|
|
112
|
+
})[];
|
|
113
|
+
activation_note?: string | undefined;
|
|
114
|
+
rolled_back_at?: string | undefined;
|
|
115
|
+
exact?: false | undefined;
|
|
116
|
+
recording_agents?: {
|
|
117
|
+
node_id: string;
|
|
118
|
+
slug: string;
|
|
119
|
+
directory: string;
|
|
120
|
+
keep_ms: number;
|
|
121
|
+
networks: string[];
|
|
122
|
+
memory: {
|
|
123
|
+
id: string;
|
|
124
|
+
declared_by: string;
|
|
125
|
+
ledger_path: string | null;
|
|
126
|
+
}[];
|
|
127
|
+
feeds: {
|
|
128
|
+
id: string;
|
|
129
|
+
volume_name: string;
|
|
130
|
+
}[];
|
|
131
|
+
resources: {
|
|
132
|
+
id: string;
|
|
133
|
+
kind: "git" | "bundle";
|
|
134
|
+
}[];
|
|
135
|
+
snapshots: string[];
|
|
136
|
+
}[] | undefined;
|
|
137
|
+
}>;
|
|
138
|
+
export declare const deployResourcesAt: (entries: readonly DeployResources[], recordPath: string, instant: string | Date, agentNodeId?: string) => DeployResources | null;
|
|
139
|
+
/** Caller holds the publication lock. Reconcile only against the LAST entry. */
|
|
140
|
+
export declare const ensureDeployResources: (recordPath: string, entry: DeployResources, keepMs: number) => void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { appendRetainedJsonl, entryAt, readRetainedJsonl, syncFileSync } from "../filesystem/index.js";
|
|
5
|
+
import { recordingAgentSchema } from "../report/index.js";
|
|
6
|
+
export const DEPLOY_RESOURCES_VERSION = "spawnfile.deploy-resources.v1";
|
|
7
|
+
export const DEPLOY_RESOURCE_LOG_FILE = "resource-log.jsonl";
|
|
8
|
+
const text = z.string().min(1);
|
|
9
|
+
const digest = text.regex(/^sha256:[a-f0-9]{64}$/u);
|
|
10
|
+
const ownership = { agent_node_ids: z.array(text).min(1), declared_by: text.optional() };
|
|
11
|
+
const resourceSchema = z.discriminatedUnion("kind", [
|
|
12
|
+
z.object({ ...ownership, id: text, kind: z.literal("git"), commit: text.regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u), sha256: digest, url: text.optional() }).strict(),
|
|
13
|
+
z.object({ ...ownership, id: text, kind: z.literal("bundle"), sha256: digest, origin: text.optional() }).strict()
|
|
14
|
+
]);
|
|
15
|
+
export const deployResourcesSchema = z.object({
|
|
16
|
+
version: z.literal(DEPLOY_RESOURCES_VERSION), deployment: text,
|
|
17
|
+
deployment_id: text,
|
|
18
|
+
activated_at: z.iso.datetime({ offset: true }), activation_exact: z.boolean(), activation_note: text.optional(),
|
|
19
|
+
rolled_back_at: z.iso.datetime({ offset: true }).optional(), exact: z.literal(false).optional(),
|
|
20
|
+
deployed_at: z.iso.datetime({ offset: true }), report_sha256: digest,
|
|
21
|
+
resources: z.array(resourceSchema),
|
|
22
|
+
recording_agents: z.array(recordingAgentSchema).optional()
|
|
23
|
+
}).strict().refine((value) => !value.rolled_back_at || (value.exact === false && !value.activation_exact
|
|
24
|
+
&& Date.parse(value.rolled_back_at) >= Date.parse(value.activated_at)), "Invalid candidate interval");
|
|
25
|
+
const isDeployResources = (value) => deployResourcesSchema.safeParse(value).success;
|
|
26
|
+
/** Record path is the deployment identity: project output scoped, or home scoped. */
|
|
27
|
+
export const deployResourceLogPath = (recordPath) => path.join(path.dirname(recordPath), path.basename(recordPath) === "record.json" ? DEPLOY_RESOURCE_LOG_FILE : `${path.basename(recordPath, ".json")}.${DEPLOY_RESOURCE_LOG_FILE}`);
|
|
28
|
+
export const createDeployResources = (recordPath, record, report, reportBytes) => deployResourcesSchema.parse({
|
|
29
|
+
version: DEPLOY_RESOURCES_VERSION, deployment: record.name, deployment_id: path.resolve(recordPath),
|
|
30
|
+
deployed_at: record.created_at, activated_at: record.activated_at ?? record.created_at,
|
|
31
|
+
activation_exact: record.activation_exact ?? false,
|
|
32
|
+
...((record.activation_note || !record.activated_at) ? { activation_note: record.activation_note ?? "Activation boundary was not recorded" } : {}),
|
|
33
|
+
report_sha256: `sha256:${createHash("sha256").update(reportBytes).digest("hex")}`,
|
|
34
|
+
...(report.recording?.agents ? { recording_agents: report.recording.agents } : {}),
|
|
35
|
+
resources: [
|
|
36
|
+
...(report.workspace_git_resources ?? []).map(({ id, commit, sha256, url, agent_node_ids, declared_by }) => ({ id, kind: "git", commit, sha256, agent_node_ids, ...(declared_by ? { declared_by } : {}), ...(url === undefined ? {} : { url }) })),
|
|
37
|
+
...(report.workspace_bundles ?? []).map(({ id, sha256, origin, agent_node_ids, declared_by }) => ({ id, kind: "bundle", sha256, agent_node_ids, ...(declared_by ? { declared_by } : {}), ...(origin === undefined ? {} : { origin }) }))
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
/** Invalid/legacy unowned lines are reported; never guess an agent's pin. */
|
|
41
|
+
export const readDeployResources = (recordPath) => readRetainedJsonl(deployResourceLogPath(recordPath), isDeployResources);
|
|
42
|
+
export const deployResourcesAt = (entries, recordPath, instant, agentNodeId) => {
|
|
43
|
+
const scoped = entries.filter((value) => value.deployment_id === path.resolve(recordPath));
|
|
44
|
+
const at = instant instanceof Date ? instant.getTime() : Date.parse(instant);
|
|
45
|
+
const candidate = entryAt(scoped.filter((value) => value.rolled_back_at && at <= Date.parse(value.rolled_back_at)), instant, (value) => value.activated_at);
|
|
46
|
+
const entry = candidate ?? entryAt(activeDeployments(scoped), instant, (value) => value.activated_at);
|
|
47
|
+
return entry && agentNodeId !== undefined
|
|
48
|
+
? { ...entry, resources: entry.resources.filter((resource) => resource.agent_node_ids.includes(agentNodeId)) }
|
|
49
|
+
: entry;
|
|
50
|
+
};
|
|
51
|
+
/** A published project candidate can subsequently fail readiness. Its successful-looking
|
|
52
|
+
* snapshot must not outlive its rollback interval, nor replace the restored predecessor. */
|
|
53
|
+
const activeDeployments = (entries) => {
|
|
54
|
+
const rolledBack = new Set(entries.filter((entry) => entry.rolled_back_at)
|
|
55
|
+
.map((entry) => `${entry.activated_at}:${entry.report_sha256}`));
|
|
56
|
+
return entries.filter((entry) => !entry.rolled_back_at && !rolledBack.has(`${entry.activated_at}:${entry.report_sha256}`));
|
|
57
|
+
};
|
|
58
|
+
const retainDeployResources = (entries, cutoff) => {
|
|
59
|
+
const predecessor = entryAt(activeDeployments(entries), new Date(cutoff), (entry) => entry.activated_at);
|
|
60
|
+
return entries.filter((entry) => entry === predecessor || Date.parse(entry.activated_at) > cutoff
|
|
61
|
+
|| (entry.rolled_back_at !== undefined && Date.parse(entry.rolled_back_at) >= cutoff));
|
|
62
|
+
};
|
|
63
|
+
/** Caller holds the publication lock. Reconcile only against the LAST entry. */
|
|
64
|
+
export const ensureDeployResources = (recordPath, entry, keepMs) => {
|
|
65
|
+
if (entry.deployment_id !== path.resolve(recordPath))
|
|
66
|
+
throw new Error("Deployment history identity does not match its record path");
|
|
67
|
+
const history = readDeployResources(recordPath);
|
|
68
|
+
if (history.errors.length)
|
|
69
|
+
throw new Error(`Cannot reconcile deployment history: ${history.errors.join("; ")}`);
|
|
70
|
+
if (JSON.stringify(history.entries.at(-1)) === JSON.stringify(entry)) {
|
|
71
|
+
syncFileSync(deployResourceLogPath(recordPath));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
appendRetainedJsonl(deployResourceLogPath(recordPath), entry, {
|
|
75
|
+
keepMs, now: new Date(), timeOf: (value) => value.activated_at, isEntry: isDeployResources,
|
|
76
|
+
retain: retainDeployResources
|
|
77
|
+
});
|
|
78
|
+
};
|
|
@@ -15,9 +15,12 @@ export interface BuildDistributionReportInput {
|
|
|
15
15
|
persistentMounts: DistributionPersistentMount[];
|
|
16
16
|
portMappings: DistributionPortMapping[];
|
|
17
17
|
publishedPorts: number[];
|
|
18
|
+
recording?: DistributionReport["recording"];
|
|
18
19
|
resources: DistributionWorkspaceResource[];
|
|
19
20
|
runtimeInstances: DistributionRuntimeInstance[];
|
|
20
21
|
worldBindings?: DistributionWorldBindingsEvidence;
|
|
22
|
+
workspaceGitResources?: DistributionReport["workspace_git_resources"];
|
|
23
|
+
workspaceBundles?: DistributionReport["workspace_bundles"];
|
|
21
24
|
}
|
|
22
25
|
export declare const buildDistributionReport: (input: BuildDistributionReportInput) => DistributionReport;
|
|
23
26
|
export declare const createDistributionImageLabels: (projectSlug: string, compileFingerprint: string) => DistributionImageLabels;
|
|
@@ -36,6 +36,11 @@ export const buildDistributionReport = (input) => {
|
|
|
36
36
|
runtime_instances: [...input.runtimeInstances].sort((left, right) => left.id.localeCompare(right.id)),
|
|
37
37
|
secrets: createSecretCategoryMap(input.envVariables),
|
|
38
38
|
version: DISTRIBUTION_REPORT_VERSION,
|
|
39
|
+
...(input.recording ? {
|
|
40
|
+
recording: input.recording,
|
|
41
|
+
workspace_git_resources: input.workspaceGitResources ?? [],
|
|
42
|
+
workspace_bundles: input.workspaceBundles ?? []
|
|
43
|
+
} : {}),
|
|
39
44
|
...(input.worldBindings ? { world_bindings: input.worldBindings } : {})
|
|
40
45
|
};
|
|
41
46
|
return {
|
|
@@ -8,6 +8,8 @@ export interface ConsumeImageUpOptions {
|
|
|
8
8
|
daimonContainerCredentialUid?: number;
|
|
9
9
|
authProfileName?: string | null;
|
|
10
10
|
deploymentName?: string;
|
|
11
|
+
/** Caller owns the home lock across drain and swap; never set this without holding it. */
|
|
12
|
+
deploymentLockHeld?: boolean;
|
|
11
13
|
dockerCommand?: string;
|
|
12
14
|
dockerContext?: string;
|
|
13
15
|
dockerHost?: string;
|
|
@@ -15,6 +17,7 @@ export interface ConsumeImageUpOptions {
|
|
|
15
17
|
envFilePath?: string | null;
|
|
16
18
|
pull?: boolean;
|
|
17
19
|
runDocker?: DockerCommandRunner;
|
|
20
|
+
now?: () => Date;
|
|
18
21
|
}
|
|
19
22
|
export interface ConsumeImageUpResult {
|
|
20
23
|
containerName: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import os from "node:os";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
4
|
-
import { acquireHomeDeploymentLock, captureCandidateDiagnostics, createDockerDeploymentLabels,
|
|
4
|
+
import { acquireHomeDeploymentLock, activationBeforeStart, captureCandidateDiagnostics, createDockerDeploymentLabels, listHomeDeploymentRecords, HomeDeploymentRecordingError, normalizeDeploymentName, sanitizeCandidateDiagnostic, recordDeploymentRollback, resolveHomeRecordPath, writeHomeDeployment } from "../deployment/index.js";
|
|
5
5
|
import { SpawnfileError } from "../shared/index.js";
|
|
6
|
-
import { deriveDeploymentName, derivePersistentMountVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
|
|
6
|
+
import { readPreviousSource, resolveExistingOrNewTarget, deriveDeploymentName, derivePersistentMountVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
|
|
7
7
|
import { acquireExclusiveVolumeReservations, assertCandidateContainerReady, assertContainerStopped, inspectContainerSnapshot, restorePreviousContainer, rollbackCandidateContainer } from "./consumeImageLifecycle.js";
|
|
8
8
|
import { createConsumerDockerRunner } from "./dockerRunner.js";
|
|
9
9
|
import { resolveDaimonDockerSecurityArgsForImage } from "./consumeImageDaimonDocker.js";
|
|
@@ -67,7 +67,9 @@ export const consumeImageUp = async (imageRef, options = {}) => {
|
|
|
67
67
|
const isExplicitName = Boolean(options.deploymentName);
|
|
68
68
|
// Hold an exclusive lock for the whole operation so a concurrent `up` for the
|
|
69
69
|
// same deployment cannot race on the record or orphan a container.
|
|
70
|
-
const releaseLock =
|
|
70
|
+
const releaseLock = options.deploymentLockHeld
|
|
71
|
+
? async () => undefined
|
|
72
|
+
: await acquireHomeDeploymentLock(deploymentName);
|
|
71
73
|
try {
|
|
72
74
|
return await consumeImageUpLocked(imageRef, parsedRef, deploymentName, isExplicitName, options);
|
|
73
75
|
}
|
|
@@ -77,7 +79,8 @@ export const consumeImageUp = async (imageRef, options = {}) => {
|
|
|
77
79
|
};
|
|
78
80
|
const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExplicitName, options) => {
|
|
79
81
|
void parsedRef;
|
|
80
|
-
const
|
|
82
|
+
const previousRecord = (await listHomeDeploymentRecords()).find((entry) => entry.record.name === deploymentName)?.record;
|
|
83
|
+
const alreadyExists = previousRecord !== undefined;
|
|
81
84
|
if (alreadyExists && !isExplicitName) {
|
|
82
85
|
throw new SpawnfileError("validation_error", `Deployment "${deploymentName}" already exists (derived from image ${imageRef}). ` +
|
|
83
86
|
`To redeploy it, re-run with --deployment ${deploymentName}; ` +
|
|
@@ -143,11 +146,15 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
143
146
|
const daimonDockerSecurityArgs = await resolveDaimonDockerSecurityArgsForImage(imageRef, report, runDocker, workDir);
|
|
144
147
|
volumeReservation = await acquireExclusiveVolumeReservations(report, deploymentName, containerName, imageRef, runDocker);
|
|
145
148
|
const previousContainer = await inspectContainerSnapshot(runDocker, containerName);
|
|
149
|
+
const now = options.now ?? (() => new Date());
|
|
150
|
+
let stoppedAt;
|
|
146
151
|
if (previousContainer !== null) {
|
|
147
152
|
await runDocker(["rename", containerName, backupName]);
|
|
148
153
|
try {
|
|
149
154
|
await runDocker(["stop", backupName]);
|
|
150
155
|
await assertContainerStopped(runDocker, backupName, previousContainer.id);
|
|
156
|
+
if (report.recording)
|
|
157
|
+
stoppedAt = now().getTime();
|
|
151
158
|
}
|
|
152
159
|
catch (error) {
|
|
153
160
|
try {
|
|
@@ -181,7 +188,9 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
181
188
|
}
|
|
182
189
|
runArgs.push(imageRef);
|
|
183
190
|
let candidateId;
|
|
191
|
+
let activation = {};
|
|
184
192
|
try {
|
|
193
|
+
activation = report.recording ? await activationBeforeStart(stoppedAt, now) : {};
|
|
185
194
|
const runOutput = (await runDocker(runArgs)).toString("utf8").trim();
|
|
186
195
|
const observedId = runOutput.split("\n").pop()?.trim();
|
|
187
196
|
if (!observedId || !/^[a-f0-9]{64}$/u.test(observedId)) {
|
|
@@ -194,7 +203,9 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
194
203
|
const record = {
|
|
195
204
|
auth_profile: options.authProfileName ?? null,
|
|
196
205
|
compile_fingerprint: inspection.compileFingerprint,
|
|
197
|
-
created_at:
|
|
206
|
+
created_at: now().toISOString(),
|
|
207
|
+
...activation,
|
|
208
|
+
...(report.recording ? { recording: report.recording } : {}),
|
|
198
209
|
...(options.envFilePath ? { env_file: path.resolve(options.envFilePath) } : {}),
|
|
199
210
|
manager: "docker",
|
|
200
211
|
name: deploymentName,
|
|
@@ -215,7 +226,7 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
215
226
|
],
|
|
216
227
|
version: "spawnfile.deployment.v2"
|
|
217
228
|
};
|
|
218
|
-
const written = await writeHomeDeployment(record, report);
|
|
229
|
+
const written = await writeHomeDeployment(record, report, previousRecord);
|
|
219
230
|
if (previousContainer !== null) {
|
|
220
231
|
await runDocker(["rm", "-f", previousContainer.id]).catch(() => undefined);
|
|
221
232
|
}
|
|
@@ -229,6 +240,11 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
229
240
|
};
|
|
230
241
|
}
|
|
231
242
|
catch (error) {
|
|
243
|
+
if (error instanceof HomeDeploymentRecordingError) {
|
|
244
|
+
if (previousContainer !== null)
|
|
245
|
+
await runDocker(["rm", "-f", previousContainer.id]).catch(() => undefined);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
232
248
|
const diagnostics = candidateId ? await captureCandidateDiagnostics({
|
|
233
249
|
candidateId, deploymentName, runDocker, secretValues: Object.values(env)
|
|
234
250
|
}) : null;
|
|
@@ -236,7 +252,7 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
236
252
|
? `private diagnostics: ${diagnostics.path}` : "private diagnostics unavailable"}` : "";
|
|
237
253
|
const failure = (cause) => new SpawnfileError("runtime_error", sanitizeCandidateDiagnostic(cause instanceof Error ? cause.message : String(cause), Object.values(env)) + detail);
|
|
238
254
|
try {
|
|
239
|
-
await rollbackCandidateContainer(runDocker, candidateId, containerName, previousContainer, backupName);
|
|
255
|
+
await rollbackCandidateContainer(runDocker, candidateId, containerName, previousContainer, backupName, report.recording && activation.activated_at ? () => recordDeploymentRollback(resolveHomeRecordPath(deploymentName), { name: deploymentName, created_at: activation.activated_at, ...activation }, report, `${JSON.stringify(report, null, 2)}\n`, now().toISOString()) : undefined);
|
|
240
256
|
}
|
|
241
257
|
catch (rollbackError) {
|
|
242
258
|
throw failure(rollbackError);
|
|
@@ -253,27 +269,3 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
|
|
|
253
269
|
}
|
|
254
270
|
}
|
|
255
271
|
};
|
|
256
|
-
const readPreviousSource = async (deploymentName) => {
|
|
257
|
-
try {
|
|
258
|
-
const existing = await readHomeDeploymentRecord(deploymentName);
|
|
259
|
-
if (existing.source.kind !== "image") {
|
|
260
|
-
return null;
|
|
261
|
-
}
|
|
262
|
-
return { digest: existing.source.digest, ref: existing.source.ref };
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
const resolveExistingOrNewTarget = async (deploymentName, alreadyExists, options) => {
|
|
269
|
-
if (alreadyExists && !options.dockerContext && !options.dockerHost) {
|
|
270
|
-
const existing = await readHomeDeploymentRecord(deploymentName);
|
|
271
|
-
await verifyDockerDeploymentTarget(existing.target, { dockerCommand: options.dockerCommand });
|
|
272
|
-
return existing.target;
|
|
273
|
-
}
|
|
274
|
-
return resolveDockerDeploymentTarget({
|
|
275
|
-
context: options.dockerContext ?? null,
|
|
276
|
-
dockerCommand: options.dockerCommand,
|
|
277
|
-
dockerHost: options.dockerHost ?? null
|
|
278
|
-
});
|
|
279
|
-
};
|
|
@@ -11,7 +11,10 @@ export interface ExclusiveVolumeReservation {
|
|
|
11
11
|
export declare const inspectContainerSnapshot: (runDocker: DockerCommandRunner, reference: string) => Promise<ContainerSnapshot | null>;
|
|
12
12
|
export declare const assertExclusiveVolumesAvailable: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, runDocker: DockerCommandRunner) => Promise<void>;
|
|
13
13
|
export declare const acquireExclusiveVolumeReservations: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, imageReference: string, runDocker: DockerCommandRunner) => Promise<ExclusiveVolumeReservation>;
|
|
14
|
+
export declare const defaultCandidateReadinessTimeoutMs = 600000;
|
|
15
|
+
export declare const candidateReadinessTimeoutEnv = "SPAWNFILE_CANDIDATE_READINESS_TIMEOUT_MS";
|
|
16
|
+
export declare const resolveCandidateReadinessTimeoutMs: (env?: NodeJS.ProcessEnv) => number;
|
|
14
17
|
export declare const assertCandidateContainerReady: (runDocker: DockerCommandRunner, candidateId: string, expectedName: string) => Promise<void>;
|
|
15
18
|
export declare const assertContainerStopped: (runDocker: DockerCommandRunner, reference: string, expectedId: string) => Promise<void>;
|
|
16
19
|
export declare const restorePreviousContainer: (runDocker: DockerCommandRunner, previous: ContainerSnapshot, backupName: string, deploymentName: string) => Promise<void>;
|
|
17
|
-
export declare const rollbackCandidateContainer: (runDocker: DockerCommandRunner, candidateId: string | undefined, candidateName: string, previous: ContainerSnapshot | null, backupName: string) => Promise<void>;
|
|
20
|
+
export declare const rollbackCandidateContainer: (runDocker: DockerCommandRunner, candidateId: string | undefined, candidateName: string, previous: ContainerSnapshot | null, backupName: string, onCandidateRemoved?: () => Promise<void>) => Promise<void>;
|
|
@@ -154,12 +154,22 @@ const parseCandidateState = (raw) => {
|
|
|
154
154
|
throw new SpawnfileError("runtime_error", "Candidate container returned invalid readiness state");
|
|
155
155
|
}
|
|
156
156
|
};
|
|
157
|
-
const
|
|
157
|
+
export const defaultCandidateReadinessTimeoutMs = 600_000;
|
|
158
|
+
export const candidateReadinessTimeoutEnv = "SPAWNFILE_CANDIDATE_READINESS_TIMEOUT_MS";
|
|
159
|
+
// Large orgs can take minutes to boot; the budget is overridable per host.
|
|
160
|
+
// Anything other than a positive integer falls back to the default.
|
|
161
|
+
export const resolveCandidateReadinessTimeoutMs = (env = process.env) => {
|
|
162
|
+
const raw = env[candidateReadinessTimeoutEnv]?.trim();
|
|
163
|
+
if (!raw || !/^[0-9]+$/u.test(raw))
|
|
164
|
+
return defaultCandidateReadinessTimeoutMs;
|
|
165
|
+
const value = Number(raw);
|
|
166
|
+
return Number.isSafeInteger(value) && value > 0 ? value : defaultCandidateReadinessTimeoutMs;
|
|
167
|
+
};
|
|
158
168
|
const candidateReadinessPollMs = 1_000;
|
|
159
169
|
export const assertCandidateContainerReady = async (runDocker, candidateId, expectedName) => {
|
|
160
170
|
if (!dockerId.test(candidateId))
|
|
161
171
|
throw new SpawnfileError("runtime_error", "Candidate container returned invalid identity");
|
|
162
|
-
const deadline = Date.now() +
|
|
172
|
+
const deadline = Date.now() + resolveCandidateReadinessTimeoutMs();
|
|
163
173
|
for (;;) {
|
|
164
174
|
const { snapshot, state } = parseCandidateState(await runDocker([
|
|
165
175
|
"container", "inspect", "--format", "{{json .Id}}\n{{json .Name}}\n{{json .State}}", candidateId
|
|
@@ -202,7 +212,7 @@ export const restorePreviousContainer = async (runDocker, previous, backupName,
|
|
|
202
212
|
throw new SpawnfileError("runtime_error", "Prior container rollback state could not be verified");
|
|
203
213
|
}
|
|
204
214
|
};
|
|
205
|
-
export const rollbackCandidateContainer = async (runDocker, candidateId, candidateName, previous, backupName) => {
|
|
215
|
+
export const rollbackCandidateContainer = async (runDocker, candidateId, candidateName, previous, backupName, onCandidateRemoved) => {
|
|
206
216
|
const failed = [];
|
|
207
217
|
if (candidateId !== undefined) {
|
|
208
218
|
try {
|
|
@@ -212,6 +222,7 @@ export const rollbackCandidateContainer = async (runDocker, candidateId, candida
|
|
|
212
222
|
throw new Error("identity");
|
|
213
223
|
await runDocker(["rm", "-f", candidateId]);
|
|
214
224
|
}
|
|
225
|
+
await onCandidateRemoved?.();
|
|
215
226
|
}
|
|
216
227
|
catch {
|
|
217
228
|
failed.push("candidate cleanup");
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type DockerDeploymentTarget } from "../deployment/index.js";
|
|
2
|
+
import type { ConsumeImageUpOptions } from "./consumeImage.js";
|
|
1
3
|
import type { ParsedImageReference } from "./imageRef.js";
|
|
2
4
|
import type { DistributionReport } from "./types.js";
|
|
3
5
|
import type { DistributionPersistentMount } from "./types.js";
|
|
@@ -28,3 +30,8 @@ export interface ResolveImageEnvironmentInput {
|
|
|
28
30
|
*/
|
|
29
31
|
export declare const resolveImageEnvironment: (input: ResolveImageEnvironmentInput) => Record<string, string>;
|
|
30
32
|
export declare const renderEnvFileContent: (env: Record<string, string>) => string;
|
|
33
|
+
export declare const readPreviousSource: (deploymentName: string) => Promise<{
|
|
34
|
+
digest: string | null;
|
|
35
|
+
ref: string;
|
|
36
|
+
} | null>;
|
|
37
|
+
export declare const resolveExistingOrNewTarget: (deploymentName: string, alreadyExists: boolean, options: ConsumeImageUpOptions) => Promise<DockerDeploymentTarget>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readHomeDeploymentRecord, resolveDockerDeploymentTarget, verifyDockerDeploymentTarget } from "../deployment/index.js";
|
|
1
2
|
import { randomBytes } from "node:crypto";
|
|
2
3
|
import { createExclusiveReattachVolumeName } from "../shared/index.js";
|
|
3
4
|
const GENERATED_RUNTIME_SECRET_NAMES = new Set([
|
|
@@ -76,3 +77,27 @@ export const renderEnvFileContent = (env) => Object.entries(env)
|
|
|
76
77
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
77
78
|
.map(([name, value]) => `${name}=${value}`)
|
|
78
79
|
.join("\n") + "\n";
|
|
80
|
+
export const readPreviousSource = async (deploymentName) => {
|
|
81
|
+
try {
|
|
82
|
+
const existing = await readHomeDeploymentRecord(deploymentName);
|
|
83
|
+
if (existing.source.kind !== "image") {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return { digest: existing.source.digest, ref: existing.source.ref };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
export const resolveExistingOrNewTarget = async (deploymentName, alreadyExists, options) => {
|
|
93
|
+
if (alreadyExists && !options.dockerContext && !options.dockerHost) {
|
|
94
|
+
const existing = await readHomeDeploymentRecord(deploymentName);
|
|
95
|
+
await verifyDockerDeploymentTarget(existing.target, { dockerCommand: options.dockerCommand });
|
|
96
|
+
return existing.target;
|
|
97
|
+
}
|
|
98
|
+
return resolveDockerDeploymentTarget({
|
|
99
|
+
context: options.dockerContext ?? null,
|
|
100
|
+
dockerCommand: options.dockerCommand,
|
|
101
|
+
dockerHost: options.dockerHost ?? null
|
|
102
|
+
});
|
|
103
|
+
};
|
|
@@ -39,6 +39,35 @@ export declare const distributionReportSchema: z.ZodObject<{
|
|
|
39
39
|
published_port: z.ZodNumber;
|
|
40
40
|
}, z.core.$strict>>;
|
|
41
41
|
ports: z.ZodArray<z.ZodNumber>;
|
|
42
|
+
recording: z.ZodOptional<z.ZodObject<{
|
|
43
|
+
keep_ms: z.ZodNumber;
|
|
44
|
+
memory_mount_ids: z.ZodArray<z.ZodString>;
|
|
45
|
+
recording_mount_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
46
|
+
agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
47
|
+
node_id: z.ZodString;
|
|
48
|
+
slug: z.ZodString;
|
|
49
|
+
directory: z.ZodString;
|
|
50
|
+
keep_ms: z.ZodNumber;
|
|
51
|
+
networks: z.ZodArray<z.ZodString>;
|
|
52
|
+
memory: z.ZodArray<z.ZodObject<{
|
|
53
|
+
id: z.ZodString;
|
|
54
|
+
declared_by: z.ZodString;
|
|
55
|
+
ledger_path: z.ZodNullable<z.ZodString>;
|
|
56
|
+
}, z.core.$strict>>;
|
|
57
|
+
feeds: z.ZodArray<z.ZodObject<{
|
|
58
|
+
id: z.ZodString;
|
|
59
|
+
volume_name: z.ZodString;
|
|
60
|
+
}, z.core.$strict>>;
|
|
61
|
+
resources: z.ZodArray<z.ZodObject<{
|
|
62
|
+
id: z.ZodString;
|
|
63
|
+
kind: z.ZodEnum<{
|
|
64
|
+
git: "git";
|
|
65
|
+
bundle: "bundle";
|
|
66
|
+
}>;
|
|
67
|
+
}, z.core.$strict>>;
|
|
68
|
+
snapshots: z.ZodArray<z.ZodString>;
|
|
69
|
+
}, z.core.$strict>>>;
|
|
70
|
+
}, z.core.$strict>>;
|
|
42
71
|
resources: z.ZodArray<z.ZodObject<{
|
|
43
72
|
id: z.ZodString;
|
|
44
73
|
kind: z.ZodUnion<readonly [z.ZodLiteral<"bundle">, z.ZodLiteral<"git">, z.ZodLiteral<"volume">]>;
|
|
@@ -65,6 +94,7 @@ export declare const distributionReportSchema: z.ZodObject<{
|
|
|
65
94
|
node_ids: z.ZodArray<z.ZodString>;
|
|
66
95
|
published_port: z.ZodNullable<z.ZodNumber>;
|
|
67
96
|
runtime: z.ZodString;
|
|
97
|
+
telemetry_mount_ids: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
68
98
|
workspace_path: z.ZodString;
|
|
69
99
|
}, z.core.$strict>>;
|
|
70
100
|
secrets: z.ZodObject<{
|
|
@@ -90,6 +120,23 @@ export declare const distributionReportSchema: z.ZodObject<{
|
|
|
90
120
|
}, z.core.$strict>>;
|
|
91
121
|
}, z.core.$strict>;
|
|
92
122
|
version: z.ZodLiteral<"spawnfile.distribution-report.v1">;
|
|
123
|
+
workspace_git_resources: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
124
|
+
agent_node_ids: z.ZodArray<z.ZodString>;
|
|
125
|
+
declared_by: z.ZodOptional<z.ZodString>;
|
|
126
|
+
id: z.ZodString;
|
|
127
|
+
commit: z.ZodString;
|
|
128
|
+
sha256: z.ZodString;
|
|
129
|
+
}, z.core.$strict>>>;
|
|
130
|
+
workspace_bundles: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
131
|
+
agent_node_ids: z.ZodArray<z.ZodString>;
|
|
132
|
+
declared_by: z.ZodOptional<z.ZodString>;
|
|
133
|
+
id: z.ZodString;
|
|
134
|
+
sha256: z.ZodString;
|
|
135
|
+
origin: z.ZodOptional<z.ZodEnum<{
|
|
136
|
+
built: "built";
|
|
137
|
+
prebuilt: "prebuilt";
|
|
138
|
+
}>>;
|
|
139
|
+
}, z.core.$strict>>>;
|
|
93
140
|
world_bindings: z.ZodOptional<z.ZodObject<{
|
|
94
141
|
artifact_path: z.ZodLiteral<"/spawnfile/world-bindings.json">;
|
|
95
142
|
digest: z.ZodString;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { SpawnfileError } from "../shared/index.js";
|
|
3
|
+
import { recordingReportSchema } from "../report/index.js";
|
|
3
4
|
import { DISTRIBUTION_ENGINE_KINDS, DISTRIBUTION_REPORT_VERSION, WORLD_BINDINGS_IMAGE_PATH } from "./types.js";
|
|
4
5
|
const secretEntrySchema = z.object({
|
|
5
6
|
generated: z.boolean(),
|
|
@@ -41,6 +42,10 @@ const runtimeInstanceSchema = z.object({
|
|
|
41
42
|
node_ids: z.array(z.string()),
|
|
42
43
|
published_port: portSchema.nullable(),
|
|
43
44
|
runtime: z.string().min(1),
|
|
45
|
+
// node id -> persistent mount id for per-agent telemetry; every pi/Daimon
|
|
46
|
+
// image this compiler builds carries it, so a strict schema without it
|
|
47
|
+
// refused image-mode `up` of the compiler's own output.
|
|
48
|
+
telemetry_mount_ids: z.record(z.string().min(1), instanceIdSchema).optional(),
|
|
44
49
|
workspace_path: containerPathSchema
|
|
45
50
|
}).strict();
|
|
46
51
|
export const distributionReportSchema = z.object({
|
|
@@ -94,6 +99,7 @@ export const distributionReportSchema = z.object({
|
|
|
94
99
|
published_port: portSchema
|
|
95
100
|
}).strict()),
|
|
96
101
|
ports: z.array(portSchema),
|
|
102
|
+
recording: recordingReportSchema.optional(),
|
|
97
103
|
resources: z.array(z.object({
|
|
98
104
|
id: z.string().min(1),
|
|
99
105
|
kind: z.union([z.literal("bundle"), z.literal("git"), z.literal("volume")]),
|
|
@@ -110,6 +116,20 @@ export const distributionReportSchema = z.object({
|
|
|
110
116
|
surface: z.array(secretEntrySchema)
|
|
111
117
|
}).strict(),
|
|
112
118
|
version: z.literal(DISTRIBUTION_REPORT_VERSION),
|
|
119
|
+
workspace_git_resources: z.array(z.object({
|
|
120
|
+
agent_node_ids: z.array(z.string().min(1)).min(1),
|
|
121
|
+
declared_by: z.string().min(1).optional(),
|
|
122
|
+
id: z.string().min(1),
|
|
123
|
+
commit: z.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u),
|
|
124
|
+
sha256: z.string().regex(/^sha256:[a-f0-9]{64}$/u)
|
|
125
|
+
}).strict()).optional(),
|
|
126
|
+
workspace_bundles: z.array(z.object({
|
|
127
|
+
agent_node_ids: z.array(z.string().min(1)).min(1),
|
|
128
|
+
declared_by: z.string().min(1).optional(),
|
|
129
|
+
id: z.string().min(1),
|
|
130
|
+
sha256: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
|
|
131
|
+
origin: z.enum(["built", "prebuilt"]).optional()
|
|
132
|
+
}).strict()).optional(),
|
|
113
133
|
world_bindings: z.object({
|
|
114
134
|
artifact_path: z.literal(WORLD_BINDINGS_IMAGE_PATH),
|
|
115
135
|
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
|
|
@@ -80,7 +80,7 @@ export const renderImageInterface = (report, options) => {
|
|
|
80
80
|
lines.push("");
|
|
81
81
|
lines.push(`next: spawnfile up ${summary.imageRef} --auth-profile <profile>`);
|
|
82
82
|
if (summary.requiredSecrets.length > 0) {
|
|
83
|
-
lines.push(" supply the required secrets above via that profile or --env-file");
|
|
83
|
+
lines.push(" supply the required secrets above via that profile or --runtime-env-file");
|
|
84
84
|
}
|
|
85
85
|
return lines.join("\n");
|
|
86
86
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ModelAuthMethod } from "../shared/index.js";
|
|
2
|
+
import type { RecordingReport, WorkspaceResourceOwnership } from "../report/index.js";
|
|
2
3
|
export type DistributionSecretCategory = "model" | "project" | "runtime" | "surface";
|
|
3
4
|
export interface DistributionSecretEntry {
|
|
4
5
|
generated: boolean;
|
|
@@ -56,6 +57,7 @@ export interface DistributionRuntimeInstance {
|
|
|
56
57
|
node_ids: string[];
|
|
57
58
|
published_port: number | null;
|
|
58
59
|
runtime: string;
|
|
60
|
+
telemetry_mount_ids?: Record<string, string>;
|
|
59
61
|
workspace_path: string;
|
|
60
62
|
}
|
|
61
63
|
export declare const DISTRIBUTION_ENGINE_KINDS: readonly ["agy", "claude", "codex", "grok", "pi", "scripted"];
|
|
@@ -86,10 +88,23 @@ export interface DistributionReport {
|
|
|
86
88
|
persistent_mounts: DistributionPersistentMount[];
|
|
87
89
|
port_mappings: DistributionPortMapping[];
|
|
88
90
|
ports: number[];
|
|
91
|
+
recording?: RecordingReport;
|
|
89
92
|
resources: DistributionWorkspaceResource[];
|
|
90
93
|
runtime_instances: DistributionRuntimeInstance[];
|
|
91
94
|
secrets: Record<DistributionSecretCategory, DistributionSecretEntry[]>;
|
|
92
95
|
version: "spawnfile.distribution-report.v1";
|
|
96
|
+
/** Recording-only pins; ids are workspace resource ids, never scoped report keys. */
|
|
97
|
+
workspace_git_resources?: Array<WorkspaceResourceOwnership & {
|
|
98
|
+
id: string;
|
|
99
|
+
commit: string;
|
|
100
|
+
sha256: string;
|
|
101
|
+
}>;
|
|
102
|
+
/** Recording-only bundle identity; no creator-host paths or URLs are published. */
|
|
103
|
+
workspace_bundles?: Array<WorkspaceResourceOwnership & {
|
|
104
|
+
id: string;
|
|
105
|
+
sha256: string;
|
|
106
|
+
origin?: string;
|
|
107
|
+
}>;
|
|
93
108
|
world_bindings?: DistributionWorldBindingsEvidence;
|
|
94
109
|
}
|
|
95
110
|
export declare const DISTRIBUTION_REPORT_VERSION = "spawnfile.distribution-report.v1";
|