spawnfile 0.1.17 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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/package.json +3 -3
- package/runtimes.yaml +8 -6
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { compareInstants, normalizeInstant } from "./instant.js";
|
|
2
|
+
import { hasRecordPin, recordActivationErrors, recordForInput, recordPins } from "./recordInput.js";
|
|
3
|
+
/** Shared targets referencing the same role/dataset/example are one trial. */
|
|
4
|
+
export const selectTrainingExample = (plan, selector) => {
|
|
5
|
+
const match = /^(train|validation|test):(.*)$/u.exec(selector);
|
|
6
|
+
const role = match?.[1], id = match?.[2] ?? selector;
|
|
7
|
+
const candidates = new Map();
|
|
8
|
+
for (const target of plan.targets)
|
|
9
|
+
for (const candidateRole of ["train", "validation", "test"]) {
|
|
10
|
+
const dataset = target.datasets[candidateRole];
|
|
11
|
+
if (!dataset || (role && candidateRole !== role))
|
|
12
|
+
continue;
|
|
13
|
+
for (const example of dataset.examples) {
|
|
14
|
+
if (example.id !== id)
|
|
15
|
+
continue;
|
|
16
|
+
const candidate = { id, role: candidateRole, dataset: dataset.path, sourcePath: dataset.sourcePath, example };
|
|
17
|
+
candidates.set(JSON.stringify([candidateRole, dataset.sourcePath, id]), candidate);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const found = [...candidates.values()];
|
|
21
|
+
if (found.length !== 1)
|
|
22
|
+
throw new Error(found.length === 0
|
|
23
|
+
? `No training example matches ${selector}`
|
|
24
|
+
: `Ambiguous training example ${selector}; candidates: ${found.map((item) => `${item.role}:${id} (${item.dataset})`).sort().join(", ")}`);
|
|
25
|
+
return found[0];
|
|
26
|
+
};
|
|
27
|
+
const canonical = (value) => JSON.stringify(value, (_key, item) => item && typeof item === "object" && !Array.isArray(item)
|
|
28
|
+
? Object.fromEntries(Object.entries(item).sort(([a], [b]) => a.localeCompare(b))) : item);
|
|
29
|
+
export const matchingMomentRecords = (records, agent, at) => records.filter((record) => record.agent === agent && compareInstants(record.wake.at, at) === 0);
|
|
30
|
+
/** Replays can share executionId AND startedAt. Keep every earliest tie for per-input agreement. */
|
|
31
|
+
export const originalMomentRecords = (records) => {
|
|
32
|
+
const first = records.reduce((earliest, entry) => !earliest || compareInstants(entry.wake.startedAt, earliest.wake.startedAt) < 0 ? entry : earliest, null);
|
|
33
|
+
return first ? records.filter((entry) => compareInstants(entry.wake.startedAt, first.wake.startedAt) === 0) : [];
|
|
34
|
+
};
|
|
35
|
+
/** Capture time and wake payload are not used to materialize data. Normalize actual used instants. */
|
|
36
|
+
export const selectMomentRecord = (records, agent, at, inputs) => {
|
|
37
|
+
const matches = originalMomentRecords(matchingMomentRecords(records, agent, at));
|
|
38
|
+
if (!matches.length)
|
|
39
|
+
return null;
|
|
40
|
+
const identities = inputs ?? matches.flatMap((record) => [
|
|
41
|
+
...[...record.resources, ...record.feeds, ...record.volumes].map(({ id }) => ({ section: "resources", id, declaredBy: agent })),
|
|
42
|
+
...record.memory.map(({ id, declaredBy }) => ({ section: "memory", id, declaredBy })),
|
|
43
|
+
...record.moltnet.map(({ network }) => ({ section: "networks", id: network, declaredBy: agent }))
|
|
44
|
+
]);
|
|
45
|
+
for (const input of identities) {
|
|
46
|
+
if ("overridden" in input && input.overridden)
|
|
47
|
+
continue;
|
|
48
|
+
const declaredPin = "declaration" in input && input.section === "resources" && input.declaration.kind === "git"
|
|
49
|
+
&& /^(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})$/u.test(input.declaration.ref ?? "");
|
|
50
|
+
const decision = (record) => {
|
|
51
|
+
const usable = recordForInput(record, input);
|
|
52
|
+
const pins = recordPins(usable, input).map((pin) => "landedAt" in pin ? { ...pin, landedAt: normalizeInstant(pin.landedAt) }
|
|
53
|
+
: "cursor" in pin ? { ...pin, cursor: normalizeInstant(pin.cursor) } : pin);
|
|
54
|
+
return canonical({ pin: declaredPin ? "declared-pin" : pins.sort((a, b) => canonical(a).localeCompare(canonical(b))),
|
|
55
|
+
approximateActivation: !declaredPin && pins.some((pin) => "kind" in pin && ["git", "bundle"].includes(pin.kind))
|
|
56
|
+
&& recordActivationErrors(usable).length > 0,
|
|
57
|
+
approximateFallback: !record.exact && !hasRecordPin(usable, input) });
|
|
58
|
+
};
|
|
59
|
+
if (matches.some((record) => decision(record) !== decision(matches[0]))) {
|
|
60
|
+
throw new Error(`Conflicting moment records for ${agent} at ${normalizeInstant(at)}: ${input.section} ${input.declaredBy}/${input.id} has different effective pin/fallback decisions`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return matches[0];
|
|
64
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type History } from "./history.js";
|
|
3
|
+
/** Daimon's manifest records source identity, not the identity of retained/copied inodes. */
|
|
4
|
+
export declare const snapshotManifestSchema: z.ZodObject<{
|
|
5
|
+
version: z.ZodLiteral<"noopolis.daimon.wake-moment.v1">;
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
snapshot: z.ZodString;
|
|
8
|
+
started_at: z.ZodISODateTime;
|
|
9
|
+
sourcePath: z.ZodString;
|
|
10
|
+
entries: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
11
|
+
type: z.ZodEnum<{
|
|
12
|
+
file: "file";
|
|
13
|
+
directory: "directory";
|
|
14
|
+
symlink: "symlink";
|
|
15
|
+
}>;
|
|
16
|
+
mode: z.ZodNumber;
|
|
17
|
+
size: z.ZodString;
|
|
18
|
+
source: z.ZodObject<{
|
|
19
|
+
dev: z.ZodString;
|
|
20
|
+
ino: z.ZodString;
|
|
21
|
+
size: z.ZodString;
|
|
22
|
+
mtimeNs: z.ZodString;
|
|
23
|
+
ctimeNs: z.ZodString;
|
|
24
|
+
mode: z.ZodNumber;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
target: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strict>>;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
export type SnapshotManifest = z.infer<typeof snapshotManifestSchema>;
|
|
30
|
+
export declare const snapshotHistoryPath: (agentSlug: string, id: string, snapshot: string) => string;
|
|
31
|
+
export declare const readSnapshotManifest: (history: History, relative: string, id: string, snapshot: string) => Promise<SnapshotManifest | null>;
|
|
32
|
+
interface TreeInspection {
|
|
33
|
+
retained?: boolean;
|
|
34
|
+
readBytes?: (relative: string) => Promise<Buffer>;
|
|
35
|
+
expectedBytes?: (relative: string) => Promise<Buffer>;
|
|
36
|
+
}
|
|
37
|
+
/** No symlink traversal. A separate call inspects the copied tree, independently of the producer. */
|
|
38
|
+
export declare const snapshotTreeFindings: (root: string, manifest: SnapshotManifest, options?: TreeInspection) => Promise<string[]>;
|
|
39
|
+
export declare const snapshotBytes: (history: History, relative: string, name: string) => Promise<Buffer>;
|
|
40
|
+
/** Retained files may be hard-linked to each other; bundle files are always new copies. */
|
|
41
|
+
export declare const copySnapshotTree: (history: History, relative: string, destination: string, manifest: SnapshotManifest) => Promise<void>;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, mkdir, readFile, readdir, readlink, symlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { trainingInstantSchema } from "../../../manifest/index.js";
|
|
6
|
+
import { inside, safeSegment } from "./history.js";
|
|
7
|
+
const unsigned = z.string().regex(/^(?:0|[1-9][0-9]*)$/u);
|
|
8
|
+
const nanos = z.string().regex(/^-?(?:0|[1-9][0-9]*)$/u);
|
|
9
|
+
const mode = z.number().int().min(0).max(0xffff);
|
|
10
|
+
const relativePath = z.string().min(1).refine((value) => !value.includes("\\") && !value.includes("\0")
|
|
11
|
+
&& !path.posix.isAbsolute(value) && !value.split("/").some((part) => !part || part === "." || part === ".."), "Snapshot paths must be normalized relative POSIX paths");
|
|
12
|
+
const sourceIdentity = z.object({ dev: unsigned, ino: unsigned, size: unsigned, mtimeNs: nanos, ctimeNs: nanos, mode }).strict();
|
|
13
|
+
const entrySchema = z.object({ type: z.enum(["file", "directory", "symlink"]), mode, size: unsigned,
|
|
14
|
+
source: sourceIdentity, target: z.string().refine((value) => !value.includes("\0")).optional() }).strict().superRefine((entry, ctx) => {
|
|
15
|
+
if ((entry.type === "symlink") !== (entry.target !== undefined))
|
|
16
|
+
ctx.addIssue({ code: "custom", message: "Only snapshot symlinks require a target" });
|
|
17
|
+
if (entry.mode !== entry.source.mode || entry.size !== entry.source.size)
|
|
18
|
+
ctx.addIssue({ code: "custom", message: "Snapshot source identity disagrees with entry metadata" });
|
|
19
|
+
const typeMode = { file: 0o100000, directory: 0o040000, symlink: 0o120000 }[entry.type];
|
|
20
|
+
if ((entry.mode & 0o170000) !== typeMode)
|
|
21
|
+
ctx.addIssue({ code: "custom", message: "Snapshot mode disagrees with entry type" });
|
|
22
|
+
});
|
|
23
|
+
/** Daimon's manifest records source identity, not the identity of retained/copied inodes. */
|
|
24
|
+
export const snapshotManifestSchema = z.object({ version: z.literal("noopolis.daimon.wake-moment.v1"), id: z.string().min(1),
|
|
25
|
+
snapshot: z.string().min(1), started_at: trainingInstantSchema,
|
|
26
|
+
sourcePath: z.string().refine((value) => path.posix.isAbsolute(value) && !value.includes("\0"), "Expected an absolute snapshot sourcePath"),
|
|
27
|
+
entries: z.record(relativePath, entrySchema) }).strict().superRefine((manifest, ctx) => {
|
|
28
|
+
for (const name of Object.keys(manifest.entries)) {
|
|
29
|
+
for (let parent = path.posix.dirname(name); parent !== "."; parent = path.posix.dirname(parent)) {
|
|
30
|
+
if (manifest.entries[parent]?.type !== "directory")
|
|
31
|
+
ctx.addIssue({ code: "custom", message: `Snapshot parent ${parent} must be a recorded directory` });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
export const snapshotHistoryPath = (agentSlug, id, snapshot) => `recording/${safeSegment(agentSlug)}/snapshots/${safeSegment(id === "." || id === ".." ? id.replaceAll(".", "%2E") : id)}/${safeSegment(snapshot)}`;
|
|
36
|
+
export const readSnapshotManifest = async (history, relative, id, snapshot) => {
|
|
37
|
+
// Daimon publishes this marker only after the tree and manifest are durable.
|
|
38
|
+
if (await history.bytes(`${relative}.complete`) === null)
|
|
39
|
+
return null;
|
|
40
|
+
const bytes = await history.text(`${relative}.manifest.json`);
|
|
41
|
+
if (bytes === null)
|
|
42
|
+
return null;
|
|
43
|
+
let manifest;
|
|
44
|
+
try {
|
|
45
|
+
manifest = snapshotManifestSchema.parse(JSON.parse(bytes));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new Error(`Invalid snapshot manifest ${relative}.manifest.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
49
|
+
}
|
|
50
|
+
if (manifest.id !== id || manifest.snapshot !== snapshot)
|
|
51
|
+
throw new Error(`Snapshot manifest identity mismatch at ${relative}.manifest.json`);
|
|
52
|
+
return manifest;
|
|
53
|
+
};
|
|
54
|
+
/** No symlink traversal. A separate call inspects the copied tree, independently of the producer. */
|
|
55
|
+
export const snapshotTreeFindings = async (root, manifest, options = {}) => {
|
|
56
|
+
if (!(await lstat(root)).isDirectory())
|
|
57
|
+
throw new Error("Snapshot tree must be a real directory");
|
|
58
|
+
const findings = [], found = new Set();
|
|
59
|
+
const visit = async (relative) => {
|
|
60
|
+
for (const leaf of (await readdir(path.join(root, relative))).sort()) {
|
|
61
|
+
const name = relative ? `${relative}/${leaf}` : leaf, file = path.join(root, name);
|
|
62
|
+
const stat = await lstat(file, { bigint: true }), expected = manifest.entries[name];
|
|
63
|
+
found.add(name);
|
|
64
|
+
const type = stat.isFile() ? "file" : stat.isDirectory() ? "directory" : stat.isSymbolicLink() ? "symlink" : "special";
|
|
65
|
+
if (!expected)
|
|
66
|
+
findings.push(`Unexpected snapshot entry ${name}`);
|
|
67
|
+
else if (type !== expected.type)
|
|
68
|
+
findings.push(`Snapshot type mismatch for ${name}`);
|
|
69
|
+
else {
|
|
70
|
+
// Recorder directories are deliberately 0700. Restore source modes while copying.
|
|
71
|
+
const wantedMode = options.retained && type === "file" ? expected.mode & 0o777 : expected.mode & 0o7777;
|
|
72
|
+
if (!(options.retained && type === "directory") && (Number(stat.mode) & 0o7777) !== wantedMode)
|
|
73
|
+
findings.push(`Snapshot mode mismatch for ${name}`);
|
|
74
|
+
// Directory inode sizes describe source filesystem bookkeeping, not tree content.
|
|
75
|
+
if (type !== "directory" && stat.size.toString() !== expected.size)
|
|
76
|
+
findings.push(`Snapshot size mismatch for ${name}`);
|
|
77
|
+
if (type === "symlink" && await readlink(file) !== expected.target)
|
|
78
|
+
findings.push(`Snapshot symlink target mismatch for ${name}`);
|
|
79
|
+
if (type === "file" && options.expectedBytes) {
|
|
80
|
+
const actual = options.readBytes ? await options.readBytes(name) : await readFile(file);
|
|
81
|
+
const original = await options.expectedBytes(name);
|
|
82
|
+
const digest = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
83
|
+
if (digest(actual) !== digest(original))
|
|
84
|
+
findings.push(`Snapshot digest mismatch for ${name}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (type === "directory")
|
|
88
|
+
await visit(name);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
await visit("");
|
|
92
|
+
for (const name of Object.keys(manifest.entries))
|
|
93
|
+
if (!found.has(name))
|
|
94
|
+
findings.push(`Missing snapshot entry ${name}`);
|
|
95
|
+
return findings;
|
|
96
|
+
};
|
|
97
|
+
export const snapshotBytes = async (history, relative, name) => {
|
|
98
|
+
const bytes = await history.bytes(`${relative}/${name}`);
|
|
99
|
+
if (bytes === null)
|
|
100
|
+
throw new Error(`Missing snapshot entry ${name}`);
|
|
101
|
+
return bytes;
|
|
102
|
+
};
|
|
103
|
+
/** Retained files may be hard-linked to each other; bundle files are always new copies. */
|
|
104
|
+
export const copySnapshotTree = async (history, relative, destination, manifest) => {
|
|
105
|
+
const source = await history.path(relative);
|
|
106
|
+
if (!source)
|
|
107
|
+
throw new Error(`Missing snapshot tree ${relative}`);
|
|
108
|
+
const findings = await snapshotTreeFindings(source, manifest, { retained: true });
|
|
109
|
+
if (findings.length)
|
|
110
|
+
throw new Error(findings.join("; "));
|
|
111
|
+
await mkdir(destination, { recursive: true, mode: 0o700 });
|
|
112
|
+
const entries = Object.entries(manifest.entries).sort(([a], [b]) => a.split("/").length - b.split("/").length || a.localeCompare(b));
|
|
113
|
+
for (const [name, entry] of entries) {
|
|
114
|
+
const target = path.join(destination, name);
|
|
115
|
+
if (entry.type === "directory")
|
|
116
|
+
await mkdir(target, { mode: 0o700 });
|
|
117
|
+
else if (entry.type === "symlink") {
|
|
118
|
+
if (path.isAbsolute(entry.target) || !inside(destination, path.resolve(path.dirname(target), entry.target))) {
|
|
119
|
+
throw new Error(`Snapshot symlink escapes root: ${name}`);
|
|
120
|
+
}
|
|
121
|
+
await symlink(entry.target, target);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
await writeFile(target, await snapshotBytes(history, relative, name), { flag: "wx" });
|
|
125
|
+
await chmod(target, entry.mode & 0o7777);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const [name, entry] of entries.reverse())
|
|
129
|
+
if (entry.type === "directory")
|
|
130
|
+
await chmod(path.join(destination, name), entry.mode & 0o7777);
|
|
131
|
+
const copied = await snapshotTreeFindings(destination, manifest, { expectedBytes: (name) => snapshotBytes(history, relative, name) });
|
|
132
|
+
if (copied.length)
|
|
133
|
+
throw new Error(copied.join("; "));
|
|
134
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Shared ecosystem range applies to trial instants, not historical source timestamps. */
|
|
2
|
+
export declare const assertTaskClockInstant: (instant: string) => void;
|
|
3
|
+
export declare const createTaskClock: (origin: string) => {
|
|
4
|
+
version: "spawnfile.task-clock.v1";
|
|
5
|
+
origin: string;
|
|
6
|
+
};
|
|
7
|
+
/** Top-level Daimon only: its clock stays real and it derives each child's clock environment. */
|
|
8
|
+
export declare const harnessTaskClockEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
|
|
9
|
+
/** Child/tool wall clock. Trial preparation supplies libfaketime LD_PRELOAD and a dot-decimal locale. */
|
|
10
|
+
export declare const processClockEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
|
|
11
|
+
/** Clock-aware child (e.g. Mneme) without libfaketime: apply the offset inside the process exactly once. */
|
|
12
|
+
export declare const clockAwareEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { instantNanos, normalizeInstant } from "./instant.js";
|
|
2
|
+
import { taskClockSchema } from "./contract.js";
|
|
3
|
+
/** Shared ecosystem range applies to trial instants, not historical source timestamps. */
|
|
4
|
+
export const assertTaskClockInstant = (instant) => {
|
|
5
|
+
const nanos = instantNanos(instant);
|
|
6
|
+
if (nanos < 0n || nanos > 253402300799999000000n) {
|
|
7
|
+
throw new Error(`Trial instant ${instant} must be within 1970-01-01T00:00:00Z .. 9999-12-31T23:59:59.999Z`);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const taskOrigin = (origin) => {
|
|
11
|
+
assertTaskClockInstant(origin);
|
|
12
|
+
return normalizeInstant(origin);
|
|
13
|
+
};
|
|
14
|
+
export const createTaskClock = (origin) => taskClockSchema.parse({
|
|
15
|
+
version: "spawnfile.task-clock.v1", origin: taskOrigin(origin)
|
|
16
|
+
});
|
|
17
|
+
const clockOrigin = (origin, anchorEpochMs) => {
|
|
18
|
+
if (!Number.isSafeInteger(anchorEpochMs))
|
|
19
|
+
throw new Error("Task clock anchorEpochMs must be a safe integer");
|
|
20
|
+
return taskOrigin(origin);
|
|
21
|
+
};
|
|
22
|
+
/** Top-level Daimon only: its clock stays real and it derives each child's clock environment. */
|
|
23
|
+
export const harnessTaskClockEnvironment = (origin, anchorEpochMs) => ({
|
|
24
|
+
NOOPOLIS_TASK_CLOCK: JSON.stringify({ version: "noopolis.task-clock.v1", origin: clockOrigin(origin, anchorEpochMs), anchorEpochMs })
|
|
25
|
+
});
|
|
26
|
+
/** Child/tool wall clock. Trial preparation supplies libfaketime LD_PRELOAD and a dot-decimal locale. */
|
|
27
|
+
export const processClockEnvironment = (origin, anchorEpochMs) => {
|
|
28
|
+
const normalized = clockOrigin(origin, anchorEpochMs);
|
|
29
|
+
const offsetMs = BigInt(Date.parse(normalized)) - BigInt(anchorEpochMs);
|
|
30
|
+
const magnitude = offsetMs < 0n ? -offsetMs : offsetMs;
|
|
31
|
+
const fraction = magnitude % 1000n;
|
|
32
|
+
return {
|
|
33
|
+
FAKETIME: `${offsetMs < 0n ? "-" : "+"}${magnitude / 1000n}${fraction ? `.${String(fraction).padStart(3, "0")}` : ""}`,
|
|
34
|
+
FAKETIME_DONT_FAKE_MONOTONIC: "1"
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/** Clock-aware child (e.g. Mneme) without libfaketime: apply the offset inside the process exactly once. */
|
|
38
|
+
export const clockAwareEnvironment = (origin, anchorEpochMs) => ({
|
|
39
|
+
MNEME_CLOCK_ORIGIN: clockOrigin(origin, anchorEpochMs), MNEME_CLOCK_ANCHOR_MS: String(anchorEpochMs)
|
|
40
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Round down to milliseconds so filesystem precision cannot put a stamp after the instant. */
|
|
2
|
+
export declare const stampTree: (root: string, instant: string, at: string) => Promise<void>;
|
|
3
|
+
/** Disk verification reads may update atime. Restore access time without changing verified mtimes. */
|
|
4
|
+
export declare const restoreAccessTimes: (root: string, at: string) => Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { lstat, lutimes, readdir, utimes } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { compareInstants } from "./instant.js";
|
|
4
|
+
/** Round down to milliseconds so filesystem precision cannot put a stamp after the instant. */
|
|
5
|
+
export const stampTree = async (root, instant, at) => {
|
|
6
|
+
const stamp = new Date(compareInstants(instant, at) > 0 ? at : instant);
|
|
7
|
+
const visit = async (file) => {
|
|
8
|
+
const stats = await lstat(file);
|
|
9
|
+
if (stats.isDirectory())
|
|
10
|
+
for (const name of await readdir(file))
|
|
11
|
+
await visit(path.join(file, name));
|
|
12
|
+
await (stats.isSymbolicLink() ? lutimes : utimes)(file, stamp, stamp);
|
|
13
|
+
};
|
|
14
|
+
await visit(root);
|
|
15
|
+
};
|
|
16
|
+
/** Disk verification reads may update atime. Restore access time without changing verified mtimes. */
|
|
17
|
+
export const restoreAccessTimes = async (root, at) => {
|
|
18
|
+
const visit = async (file) => {
|
|
19
|
+
const stats = await lstat(file);
|
|
20
|
+
if (stats.isDirectory())
|
|
21
|
+
for (const name of await readdir(file))
|
|
22
|
+
await visit(path.join(file, name));
|
|
23
|
+
await (stats.isSymbolicLink() ? lutimes : utimes)(file, new Date(Math.min(stats.mtimeMs, Date.parse(at))), new Date(stats.mtimeMs));
|
|
24
|
+
};
|
|
25
|
+
await visit(root);
|
|
26
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { MemoryBank, TeamNetwork, TeamWorkspaceResource } from "../../../manifest/index.js";
|
|
2
|
+
import type { ResolvedMemoryBank } from "../../types.js";
|
|
3
|
+
import type { MaterializedInput } from "./contract.js";
|
|
4
|
+
import type { MomentRecord } from "../../../recording/index.js";
|
|
5
|
+
import type { History } from "./history.js";
|
|
6
|
+
export interface InputIdentity {
|
|
7
|
+
section: "resources" | "memory" | "networks";
|
|
8
|
+
id: string;
|
|
9
|
+
declaredBy: string;
|
|
10
|
+
}
|
|
11
|
+
interface InputBase extends InputIdentity {
|
|
12
|
+
overridden: boolean;
|
|
13
|
+
declarationBase: string;
|
|
14
|
+
}
|
|
15
|
+
export type RewindInput = InputBase & ({
|
|
16
|
+
section: "resources";
|
|
17
|
+
declaration: TeamWorkspaceResource;
|
|
18
|
+
} | {
|
|
19
|
+
section: "memory";
|
|
20
|
+
declaration: MemoryBank | ResolvedMemoryBank;
|
|
21
|
+
} | {
|
|
22
|
+
section: "networks";
|
|
23
|
+
declaration: TeamNetwork;
|
|
24
|
+
});
|
|
25
|
+
export interface InputContext {
|
|
26
|
+
input: RewindInput;
|
|
27
|
+
at: string;
|
|
28
|
+
agentSlug?: string;
|
|
29
|
+
agentId?: string;
|
|
30
|
+
record: MomentRecord | null;
|
|
31
|
+
candidateRecords?: readonly MomentRecord[];
|
|
32
|
+
history: History | undefined;
|
|
33
|
+
destination: string;
|
|
34
|
+
}
|
|
35
|
+
export interface InputResult {
|
|
36
|
+
fidelity: "exact" | "approximate" | "overridden";
|
|
37
|
+
basis: string;
|
|
38
|
+
source: MaterializedInput["source"];
|
|
39
|
+
notes: string[];
|
|
40
|
+
instant: string;
|
|
41
|
+
build?: "deferred";
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type History } from "./history.js";
|
|
2
|
+
import { type SnapshotManifest } from "./snapshotManifest.js";
|
|
3
|
+
import type { InputContext, InputResult } from "./types.js";
|
|
4
|
+
export interface SelectedVolumeSnapshot {
|
|
5
|
+
snapshot: string;
|
|
6
|
+
startedAt: string;
|
|
7
|
+
manifest: SnapshotManifest;
|
|
8
|
+
relative: string;
|
|
9
|
+
}
|
|
10
|
+
/** A published row plus retained directory and manifest is complete; never infer time from its name. */
|
|
11
|
+
export declare const selectVolumeSnapshot: (history: History, agentSlug: string, agentId: string, id: string, at: string, recordId?: string) => Promise<SelectedVolumeSnapshot>;
|
|
12
|
+
export declare const materializeVolume: (context: InputContext) => Promise<InputResult>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { lstat, mkdir } from "node:fs/promises";
|
|
2
|
+
import { safeSegment } from "./history.js";
|
|
3
|
+
import { compareInstants } from "./instant.js";
|
|
4
|
+
import { copySnapshotTree, readSnapshotManifest, snapshotHistoryPath } from "./snapshotManifest.js";
|
|
5
|
+
/** A published row plus retained directory and manifest is complete; never infer time from its name. */
|
|
6
|
+
export const selectVolumeSnapshot = async (history, agentSlug, agentId, id, at, recordId) => {
|
|
7
|
+
const rowsPath = `recording/${safeSegment(agentSlug)}/wake-moments.jsonl`;
|
|
8
|
+
const rows = await history.wakeMoments(rowsPath);
|
|
9
|
+
if (!rows)
|
|
10
|
+
throw new Error(`Missing volume snapshot history ${rowsPath}`);
|
|
11
|
+
const candidates = rows.flatMap((row, index) => row.agent_id !== agentId ? [] : row.snapshots.filter((entry) => entry.id === id)
|
|
12
|
+
.map((entry) => ({ row, entry, index })))
|
|
13
|
+
.filter(({ row, entry }) => recordId === undefined ? compareInstants(row.started_at, at) <= 0 : entry.snapshot === recordId)
|
|
14
|
+
.sort((a, b) => compareInstants(b.row.started_at, a.row.started_at) || b.index - a.index);
|
|
15
|
+
for (const { row, entry } of candidates) {
|
|
16
|
+
if (entry.snapshot.endsWith(".partial")) {
|
|
17
|
+
if (recordId !== undefined)
|
|
18
|
+
throw new Error(`Recorded volume snapshot ${recordId} is partial`);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (compareInstants(row.started_at, at) > 0)
|
|
22
|
+
throw new Error(`Recorded volume snapshot ${entry.snapshot} is later than the moment`);
|
|
23
|
+
const relative = snapshotHistoryPath(agentSlug, id, entry.snapshot), tree = await history.path(relative);
|
|
24
|
+
const manifest = await readSnapshotManifest(history, relative, id, entry.snapshot);
|
|
25
|
+
if (!tree || !manifest) {
|
|
26
|
+
if (recordId !== undefined)
|
|
27
|
+
throw new Error(`Recorded volume snapshot ${recordId} is incomplete`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (!(await lstat(tree)).isDirectory())
|
|
31
|
+
throw new Error(`Snapshot tree must be a real directory: ${relative}`);
|
|
32
|
+
if (compareInstants(manifest.started_at, row.started_at) !== 0)
|
|
33
|
+
throw new Error(`Snapshot manifest started_at disagrees with its wake row: ${relative}`);
|
|
34
|
+
return { snapshot: entry.snapshot, startedAt: row.started_at, manifest, relative };
|
|
35
|
+
}
|
|
36
|
+
if (recordId !== undefined)
|
|
37
|
+
throw new Error(`Recorded volume snapshot ${recordId} is absent from ${rowsPath}`);
|
|
38
|
+
throw new Error("No complete volume snapshot was taken at or before the moment");
|
|
39
|
+
};
|
|
40
|
+
export const materializeVolume = async (context) => {
|
|
41
|
+
const { input, at, record, history, destination } = context;
|
|
42
|
+
if (input.section !== "resources" || input.declaration.kind !== "volume" || input.declaration.feed) {
|
|
43
|
+
throw new Error("Volume materialization requires an unfed volume input");
|
|
44
|
+
}
|
|
45
|
+
if (input.overridden) {
|
|
46
|
+
await mkdir(destination, { recursive: true });
|
|
47
|
+
return { fidelity: "overridden", basis: "override", source: {}, notes: [], instant: at };
|
|
48
|
+
}
|
|
49
|
+
if (!history)
|
|
50
|
+
throw new Error(`Volume ${input.id} requires --history or an override`);
|
|
51
|
+
if (!context.agentSlug || !context.agentId)
|
|
52
|
+
throw new Error("Volume snapshots require the compiled agent slug and identity");
|
|
53
|
+
const pin = record?.volumes.find((entry) => entry.id === input.id);
|
|
54
|
+
const selected = await selectVolumeSnapshot(history, context.agentSlug, context.agentId, input.id, at, pin?.snapshot);
|
|
55
|
+
await copySnapshotTree(history, selected.relative, destination, selected.manifest);
|
|
56
|
+
return { fidelity: pin ? "exact" : "approximate", basis: pin ? "record" : "snapshot-at",
|
|
57
|
+
source: { snapshot: selected.snapshot, agentSlug: context.agentSlug }, notes: [], instant: selected.startedAt };
|
|
58
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SpawnfileError } from "../../shared/index.js";
|
|
2
|
+
/** Exact IDs win; a short authored name must identify exactly one graph node. */
|
|
3
|
+
export const selectTrainingAgent = (agents, selector) => {
|
|
4
|
+
const exact = agents.find(agent => agent.id === selector);
|
|
5
|
+
if (exact)
|
|
6
|
+
return exact;
|
|
7
|
+
const matches = selector === undefined ? agents : selector.includes(":") ? []
|
|
8
|
+
: agents.filter(agent => agent.value.name === selector || agent.id.slice("agent:".length) === selector);
|
|
9
|
+
if (matches.length === 1)
|
|
10
|
+
return matches[0];
|
|
11
|
+
throw new SpawnfileError("validation_error", selector === undefined
|
|
12
|
+
? "Training requires --agent when the project does not contain exactly one agent"
|
|
13
|
+
: matches.length > 1 ? `Ambiguous training agent ${selector}; use an exact node id: ${matches.map(agent => agent.id).sort().join(", ")}`
|
|
14
|
+
: `No canonical agent matches ${selector}`);
|
|
15
|
+
};
|
package/dist/compiler/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { AgentSchedule, ExecutionBlock, McpServer, MemoryConsolidation, MemoryRetention, ModelEndpoint, Secret, TeamNetworkServer, type ExternalParticipantService } from "../manifest/index.js";
|
|
1
|
+
import { AgentSchedule, ExecutionBlock, McpServer, SharedMcpServer, MemoryConsolidation, MemoryRetention, ModelEndpoint, ModelTarget, Secret, TeamNetworkServer, type ExternalParticipantService } from "../manifest/index.js";
|
|
2
2
|
import { ModelAuthMethod, StringMap } from "../shared/index.js";
|
|
3
3
|
import type { ResolvedWorkspaceResource } from "./workspaceResources.js";
|
|
4
|
+
import type { ResolvedTraining } from "./training/resolution.js";
|
|
4
5
|
import type { ResolvedExternalParticipant, ResolvedOrganizationIdentity } from "./organizationIdentity.js";
|
|
5
6
|
export interface ResolvedDocument {
|
|
6
7
|
content: string;
|
|
@@ -198,7 +199,7 @@ export interface EffectiveModelTarget {
|
|
|
198
199
|
endpoint?: ModelEndpoint;
|
|
199
200
|
name: string;
|
|
200
201
|
provider: string;
|
|
201
|
-
reasoningEffort?: "
|
|
202
|
+
reasoningEffort?: ModelTarget["reasoning_effort"];
|
|
202
203
|
}
|
|
203
204
|
export interface ResolvedSubagentRef {
|
|
204
205
|
id: string;
|
|
@@ -232,6 +233,7 @@ export interface ResolvedAgentNode {
|
|
|
232
233
|
subagents: ResolvedSubagentRef[];
|
|
233
234
|
memory?: ResolvedMemoryBank[];
|
|
234
235
|
memoryAccess?: ResolvedMemoryAccess[];
|
|
236
|
+
training?: ResolvedTraining;
|
|
235
237
|
workspaceResources?: ResolvedWorkspaceResource[];
|
|
236
238
|
}
|
|
237
239
|
export interface ResolvedTeamNode {
|
|
@@ -251,12 +253,13 @@ export interface ResolvedTeamNode {
|
|
|
251
253
|
workspaceResources?: ResolvedWorkspaceResource[];
|
|
252
254
|
shared: {
|
|
253
255
|
env: StringMap;
|
|
254
|
-
mcpServers:
|
|
256
|
+
mcpServers: SharedMcpServer[];
|
|
255
257
|
secrets: Secret[];
|
|
256
258
|
skills: ResolvedSkill[];
|
|
257
259
|
packages?: ResolvedPackage[];
|
|
258
260
|
};
|
|
259
261
|
memory?: ResolvedMemoryBank[];
|
|
262
|
+
training?: ResolvedTraining;
|
|
260
263
|
source: string;
|
|
261
264
|
}
|
|
262
265
|
export interface CompilePlanEdge {
|
|
@@ -27,6 +27,7 @@ export interface UpProjectOptions extends CompileProjectOptions {
|
|
|
27
27
|
imageTag?: string;
|
|
28
28
|
lifecycleRecovery?: UpLifecycleRecovery;
|
|
29
29
|
runRunner?: DockerRunRunner;
|
|
30
|
+
now?: () => Date;
|
|
30
31
|
onDetachedReservation?: (authority: {
|
|
31
32
|
containerName: string;
|
|
32
33
|
deploymentLabels: Readonly<Record<string, string>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { rm } from "node:fs/promises";
|
|
3
|
-
import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
|
|
2
|
+
import { readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, recordDeploymentRollback, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
|
|
4
4
|
import { buildProject } from "./buildProject.js";
|
|
5
5
|
import { createDockerRunInvocation, resolveDetachedDeploymentOptions, runDockerContainer } from "./runProject.js";
|
|
6
6
|
import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
|
|
@@ -13,7 +13,7 @@ import { resolveHostCliCredential } from "./runProjectAuth.js";
|
|
|
13
13
|
import { defaultDockerTargetExecFile } from "../target/dockerTargetExecFile.js";
|
|
14
14
|
import { compileOrganizationHandoff, executeOrganizationHandoff, organizationHandoffInputError, resolveRequestedOrganizationHandoff, verifyRequestedOrganizationHandoffTarget, } from "./upProjectHandoff.js";
|
|
15
15
|
const stableRecord = (record) => {
|
|
16
|
-
const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, ...stable } = record;
|
|
16
|
+
const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, activated_at: _activatedAt, activation_exact: _activationExact, activation_note: _activationNote, resource_snapshot: _snapshot, recording: _recording, ...stable } = record;
|
|
17
17
|
return stable;
|
|
18
18
|
};
|
|
19
19
|
const canonicalJson = (value) => {
|
|
@@ -102,6 +102,15 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
102
102
|
await started({ ...result, containerId: result.containerId, containerName: result.containerName, imageId: result.imageId, deploymentLabels: result.deploymentLabels });
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
+
let activation = {};
|
|
106
|
+
const recordingRunner = async (runInvocation) => {
|
|
107
|
+
if (buildResult.report.recording && invocation.detach && invocation.deploymentName) {
|
|
108
|
+
const hasPredecessor = await fileExists(resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName));
|
|
109
|
+
activation = { activated_at: (options.now ?? (() => new Date()))().toISOString(), activation_exact: !hasPredecessor,
|
|
110
|
+
...(hasPredecessor ? { activation_note: "Project up does not stop or drain the previous container; turns may overlap" } : {}) };
|
|
111
|
+
}
|
|
112
|
+
return (options.runRunner ?? runDockerContainer)(runInvocation);
|
|
113
|
+
};
|
|
105
114
|
let deploymentRecordPath;
|
|
106
115
|
if (handoff) {
|
|
107
116
|
const executed = await executeOrganizationHandoff({
|
|
@@ -110,7 +119,7 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
110
119
|
invocation,
|
|
111
120
|
lifecycleRecovery: options.lifecycleRecovery,
|
|
112
121
|
onDetachedReservation: options.onDetachedReservation,
|
|
113
|
-
runRunner:
|
|
122
|
+
runRunner: recordingRunner,
|
|
114
123
|
targetExecFile: options.targetExecFile,
|
|
115
124
|
});
|
|
116
125
|
const { organizationHandoffHandle, runMetadata } = executed;
|
|
@@ -152,6 +161,8 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
152
161
|
else {
|
|
153
162
|
deploymentRecordPath = invocation.detach && invocation.deploymentName
|
|
154
163
|
? await writeDockerDeploymentRecordForRun({
|
|
164
|
+
previousRecord: resolvedOptions.previousRecord,
|
|
165
|
+
...activation,
|
|
155
166
|
authProfileName: authProfile?.name ?? null,
|
|
156
167
|
envFilePath: resolvedOptions.envFilePath,
|
|
157
168
|
imageTag,
|
|
@@ -181,9 +192,11 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
181
192
|
});
|
|
182
193
|
}
|
|
183
194
|
dockerLifecycleInvoked = true;
|
|
184
|
-
const runMetadata = await executeDockerRunWithSupportCleanup(invocation,
|
|
195
|
+
const runMetadata = await executeDockerRunWithSupportCleanup(invocation, recordingRunner);
|
|
185
196
|
deploymentRecordPath = invocation.detach && invocation.deploymentName
|
|
186
197
|
? await writeDockerDeploymentRecordForRun({
|
|
198
|
+
previousRecord: resolvedOptions.previousRecord,
|
|
199
|
+
...activation,
|
|
187
200
|
authProfileName: authProfile?.name ?? null,
|
|
188
201
|
envFilePath: resolvedOptions.envFilePath,
|
|
189
202
|
imageTag,
|
|
@@ -227,6 +240,9 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
227
240
|
: invocation.dockerHost ? ["--host", invocation.dockerHost] : [];
|
|
228
241
|
await (options.targetExecFile ?? defaultDockerTargetExecFile)(invocation.command, [...prefix, "container", "rm", "--force", reference], { timeout: 30_000 });
|
|
229
242
|
}
|
|
243
|
+
if (buildResult.report.recording) {
|
|
244
|
+
await recordDeploymentRollback(deploymentRecordPath, record, buildResult.report, record.resource_snapshot ? "" : await readFile(buildResult.reportPath, "utf8"), (options.now ?? (() => new Date()))().toISOString());
|
|
245
|
+
}
|
|
230
246
|
await rm(invocation.supportDirectory, { recursive: true, force: true });
|
|
231
247
|
await rm(deploymentRecordPath, { force: true });
|
|
232
248
|
throw new SpawnfileError("runtime_error", "Detached deployment failed organization readiness and was rolled back");
|
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
import type { CompilePlan } from "./types.js";
|
|
2
2
|
export declare const validateWorkspaceBundleTar: (bytes: Buffer) => void;
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const workspaceBundleContextPath: (outputDirectory: string, identity: string) => string;
|
|
4
|
+
/**
|
|
5
|
+
* Hard-links a read-only cached archive into the Docker context (cloning or
|
|
6
|
+
* copying across filesystems). Never writes through an existing name: with
|
|
7
|
+
* `clean: false` it may already be a link into the cache. Returns the staged
|
|
8
|
+
* path, or undefined when the cached archive no longer exists.
|
|
9
|
+
*/
|
|
10
|
+
export declare const linkBuiltBundle: (archive: string, outputDirectory: string, identity: string) => Promise<string | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Completes the bundle archives in the Docker context. Built bundles were
|
|
13
|
+
* already linked by `resolveWorkspaceBundles` (`built` maps their digests to
|
|
14
|
+
* the staged path). Every `source` tar is hashed, validated and staged from
|
|
15
|
+
* the exact bytes that were verified, even when a built bundle shares its
|
|
16
|
+
* digest; distinct source paths with identical bytes stage once.
|
|
17
|
+
*/
|
|
18
|
+
export declare const stageWorkspaceBundles: (outputDirectory: string, plan: CompilePlan, built?: ReadonlyMap<string, string>) => Promise<boolean>;
|