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
package/README.md
CHANGED
|
@@ -98,7 +98,7 @@ Portability is capability-specific: the compiler reports each feature as **suppo
|
|
|
98
98
|
| Plan isolated agent training | [Paideia training handoff](specs/TRAINING.md) |
|
|
99
99
|
| Find a detailed contract | [Specification index](specs/INDEX.md) |
|
|
100
100
|
|
|
101
|
-
Spawnfile is part of [Noopolis](https://github.com/noopolis). [Moltnet](https://moltnet.dev) supplies messaging; [Daimon](https://github.com/noopolis/daimon) runs individual agents; [Simfile](https://simfile.org) builds simulation worlds around organizations. You can use Spawnfile on its own.
|
|
101
|
+
Spawnfile is part of [Noopolis](https://github.com/noopolis). [Moltnet](https://moltnet.dev) supplies messaging; [Daimon](https://github.com/noopolis/daimon-harness) runs individual agents; [Simfile](https://simfile.org) builds simulation worlds around organizations. You can use Spawnfile on its own.
|
|
102
102
|
|
|
103
103
|
## License
|
|
104
104
|
|
package/dist/auth/importers.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import os from "node:os";
|
|
3
|
-
import { fileExists, readUtf8File, writePrivateUtf8File } from "../filesystem/index.js";
|
|
3
|
+
import { ensurePrivateDirectory, fileExists, readUtf8File, writeDurableFile, writePrivateUtf8File } from "../filesystem/index.js";
|
|
4
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
|
-
import { registerImportedAuth, setAuthProfileEnv } from "./profileStore.js";
|
|
5
|
+
import { ensureAuthProfile, registerImportedAuth, setAuthProfileEnv } from "./profileStore.js";
|
|
6
|
+
import { resolveImportedAuthDirectory } from "./paths.js";
|
|
7
|
+
import { acquireTrainingGrokWritebackLock } from "./trainingGrokWritebackLock.js";
|
|
6
8
|
const ENV_LINE_PATTERN = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/;
|
|
7
9
|
const CLAUDE_CODE_KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
8
10
|
const stripWrappedQuotes = (value) => {
|
|
@@ -92,9 +94,23 @@ export const importGrokAuth = async (profileName, sourceDirectory) => {
|
|
|
92
94
|
if (!(await fileExists(authFilePath))) {
|
|
93
95
|
throw new SpawnfileError("validation_error", `Grok auth file does not exist: ${authFilePath}`);
|
|
94
96
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
await ensureAuthProfile(profileName);
|
|
98
|
+
const directory = resolveImportedAuthDirectory(profileName, "grok");
|
|
99
|
+
await ensurePrivateDirectory(path.dirname(directory));
|
|
100
|
+
await ensurePrivateDirectory(directory);
|
|
101
|
+
const destination = path.join(directory, "auth.json");
|
|
102
|
+
const release = await acquireTrainingGrokWritebackLock(destination).catch(() => {
|
|
103
|
+
throw new SpawnfileError("validation_error", "Grok credential lock unavailable; retry import after the active writer finishes");
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
const content = await readUtf8File(authFilePath);
|
|
107
|
+
const { profile } = await registerImportedAuth(profileName, "grok");
|
|
108
|
+
await writeDurableFile(destination, content);
|
|
109
|
+
return profile;
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
release();
|
|
113
|
+
}
|
|
98
114
|
};
|
|
99
115
|
export const importClaudeCodeAuth = async (profileName, sourceDirectory, options = {}) => {
|
|
100
116
|
const resolvedSource = resolveClaudeSourceDirectory(sourceDirectory);
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -12,3 +12,4 @@ export * from "./targetSecretSourceLifecycle.js";
|
|
|
12
12
|
export * from "./targetSecretSourceResolver.js";
|
|
13
13
|
export { stageTrainingAuth } from "./trainingAuth.js";
|
|
14
14
|
export type { TrainingAuthStageOptions, TrainingAuthProvider } from "./trainingAuth.js";
|
|
15
|
+
export { writeBackTrainingGrokCredential } from "./trainingGrokWriteback.js";
|
package/dist/auth/index.js
CHANGED
|
@@ -11,3 +11,4 @@ export * from "./credentialWorldBindings.js";
|
|
|
11
11
|
export * from "./targetSecretSourceLifecycle.js";
|
|
12
12
|
export * from "./targetSecretSourceResolver.js";
|
|
13
13
|
export { stageTrainingAuth } from "./trainingAuth.js";
|
|
14
|
+
export { writeBackTrainingGrokCredential } from "./trainingGrokWriteback.js";
|
|
@@ -99,7 +99,10 @@ export const registerImportedAuth = async (profileName, kind) => {
|
|
|
99
99
|
const current = (await loadAuthProfile(profileName)) ?? (await ensureAuthProfile(profileName));
|
|
100
100
|
const importDirectory = resolveImportedAuthDirectory(profileName, kind);
|
|
101
101
|
await ensurePrivateDirectory(path.dirname(importDirectory));
|
|
102
|
-
|
|
102
|
+
// Grok import and writeback share a persistent lock inside this directory.
|
|
103
|
+
// Removing it would let another writer lock a different inode concurrently.
|
|
104
|
+
if (kind !== "grok")
|
|
105
|
+
await removeDirectory(importDirectory);
|
|
103
106
|
await ensurePrivateDirectory(importDirectory);
|
|
104
107
|
const nextProfile = {
|
|
105
108
|
env: { ...current.env },
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Reads only private, bounded, canonical leaves. Errors never include credential bytes. */
|
|
2
|
+
export declare const readTrainingGrokLeaf: (file: string) => Promise<Buffer>;
|
|
3
|
+
/** A settled journal proves rotation; native expiry orders credentials across independent realms. */
|
|
4
|
+
export declare const writeBackTrainingGrokCredential: (profile: string, candidate: string, journalFile: string) => Promise<boolean>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { lstat, open, realpath, rename, unlink } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { acquireTrainingGrokWritebackLock } from "./trainingGrokWritebackLock.js";
|
|
6
|
+
const failure = () => Error("Training Grok credential writeback failed");
|
|
7
|
+
const digest = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
8
|
+
/** Reads only private, bounded, canonical leaves. Errors never include credential bytes. */
|
|
9
|
+
export const readTrainingGrokLeaf = async (file) => {
|
|
10
|
+
if (await realpath(file) !== path.resolve(file))
|
|
11
|
+
throw failure();
|
|
12
|
+
const handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
13
|
+
try {
|
|
14
|
+
const before = await handle.stat({ bigint: true });
|
|
15
|
+
if (!before.isFile() || before.nlink !== 1n || (before.mode & 511n) !== 384n || before.size < 2n || before.size > 65536n)
|
|
16
|
+
throw failure();
|
|
17
|
+
const bytes = Buffer.alloc(Number(before.size) + 1);
|
|
18
|
+
let length = 0;
|
|
19
|
+
while (length < bytes.length) {
|
|
20
|
+
const result = await handle.read(bytes, length, bytes.length - length, null);
|
|
21
|
+
if (!result.bytesRead)
|
|
22
|
+
break;
|
|
23
|
+
length += result.bytesRead;
|
|
24
|
+
}
|
|
25
|
+
const after = await handle.stat({ bigint: true });
|
|
26
|
+
if (BigInt(length) !== before.size || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
|
|
27
|
+
bytes.fill(0);
|
|
28
|
+
throw failure();
|
|
29
|
+
}
|
|
30
|
+
return bytes.subarray(0, length);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
await handle.close();
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const expiry = (bytes) => {
|
|
37
|
+
try {
|
|
38
|
+
const rows = Object.entries(JSON.parse(bytes.toString("utf8")))
|
|
39
|
+
.filter(([key]) => /^https:\/\/auth\.x\.ai::/u.test(key)).map(([, value]) => value);
|
|
40
|
+
const row = rows[0];
|
|
41
|
+
if (rows.length !== 1 || typeof row?.key !== "string" || !row.key.trim() || typeof row.refresh_token !== "string" || !row.refresh_token.trim() || typeof row.expires_at !== "string")
|
|
42
|
+
throw failure();
|
|
43
|
+
const value = Date.parse(row.expires_at);
|
|
44
|
+
if (!Number.isFinite(value))
|
|
45
|
+
throw failure();
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
throw failure();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
/** A settled journal proves rotation; native expiry orders credentials across independent realms. */
|
|
53
|
+
export const writeBackTrainingGrokCredential = async (profile, candidate, journalFile) => {
|
|
54
|
+
const release = await acquireTrainingGrokWritebackLock(profile, 30_000).catch(() => { throw failure(); });
|
|
55
|
+
const temporary = path.join(path.dirname(profile), `.grok-writeback-${randomUUID()}`);
|
|
56
|
+
let current, renewed, journalBytes;
|
|
57
|
+
try {
|
|
58
|
+
current = await readTrainingGrokLeaf(profile);
|
|
59
|
+
renewed = await readTrainingGrokLeaf(candidate);
|
|
60
|
+
if (digest(current) === digest(renewed))
|
|
61
|
+
return false;
|
|
62
|
+
journalBytes = await readTrainingGrokLeaf(journalFile);
|
|
63
|
+
const journal = JSON.parse(journalBytes.toString("utf8"));
|
|
64
|
+
if (journal.version !== "noopolis.daimon.broker-credential-journal.v1" || journal.state !== "promoted" ||
|
|
65
|
+
!Number.isSafeInteger(journal.generation) || journal.generation < 1 ||
|
|
66
|
+
typeof journal.sourceDigest !== "string" || !/^[a-f0-9]{64}$/u.test(journal.sourceDigest) || journal.promotedDigest !== digest(renewed))
|
|
67
|
+
throw failure();
|
|
68
|
+
const renewedExpiry = expiry(renewed), currentExpiry = expiry(current);
|
|
69
|
+
const ancestors = journal.ancestorDigests ?? [];
|
|
70
|
+
if (!Array.isArray(ancestors) || ancestors.length > 900 || ancestors.some((entry) => typeof entry !== "string" || !/^[a-f0-9]{64}$/u.test(entry)))
|
|
71
|
+
throw failure();
|
|
72
|
+
if (renewedExpiry < currentExpiry || (renewedExpiry === currentExpiry && journal.sourceDigest !== digest(current) && !ancestors.includes(digest(current))))
|
|
73
|
+
return false;
|
|
74
|
+
const identity = await lstat(profile, { bigint: true });
|
|
75
|
+
const output = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
|
|
76
|
+
try {
|
|
77
|
+
await output.writeFile(renewed);
|
|
78
|
+
await output.sync();
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await output.close();
|
|
82
|
+
}
|
|
83
|
+
// Import and writeback hold the same lock through publication. This check
|
|
84
|
+
// also detects non-cooperating edits made before validation, not after it.
|
|
85
|
+
const check = await readTrainingGrokLeaf(profile);
|
|
86
|
+
try {
|
|
87
|
+
const now = await lstat(profile, { bigint: true });
|
|
88
|
+
if (digest(check) !== digest(current) || now.ino !== identity.ino || now.dev !== identity.dev || now.ctimeNs !== identity.ctimeNs)
|
|
89
|
+
throw failure();
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
check.fill(0);
|
|
93
|
+
}
|
|
94
|
+
await rename(temporary, profile);
|
|
95
|
+
const directory = await open(path.dirname(profile), constants.O_RDONLY);
|
|
96
|
+
try {
|
|
97
|
+
await directory.sync();
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await directory.close();
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
throw failure();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
current?.fill(0);
|
|
109
|
+
renewed?.fill(0);
|
|
110
|
+
journalBytes?.fill(0);
|
|
111
|
+
try {
|
|
112
|
+
await unlink(temporary).catch((error) => { if (error.code !== "ENOENT")
|
|
113
|
+
throw error; });
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
release();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** A persistent, non-secret SQLite file owns the OS lock, never the directory.
|
|
2
|
+
* SQLite releases it on process death. Do not unlink the file/directory: another
|
|
3
|
+
* writer may already have the same inode open. Legacy empty lock dirs are safe.
|
|
4
|
+
*/
|
|
5
|
+
export declare const acquireTrainingGrokWritebackLock: (profile: string, timeoutMs?: number) => Promise<() => void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { closeSync, constants, openSync } from "node:fs";
|
|
2
|
+
import { lstat, mkdir, realpath } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { setTimeout } from "node:timers/promises";
|
|
5
|
+
/** A persistent, non-secret SQLite file owns the OS lock, never the directory.
|
|
6
|
+
* SQLite releases it on process death. Do not unlink the file/directory: another
|
|
7
|
+
* writer may already have the same inode open. Legacy empty lock dirs are safe.
|
|
8
|
+
*/
|
|
9
|
+
export const acquireTrainingGrokWritebackLock = async (profile, timeoutMs = 0) => {
|
|
10
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 0)
|
|
11
|
+
throw Error("Invalid writeback lock timeout");
|
|
12
|
+
const root = `${profile}.training-writeback.lock`;
|
|
13
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
14
|
+
const directory = await lstat(root);
|
|
15
|
+
if (await realpath(root) !== path.resolve(root) || !directory.isDirectory() ||
|
|
16
|
+
directory.uid !== process.getuid?.() || (directory.mode & 0o777) !== 0o700)
|
|
17
|
+
throw Error("Unsafe writeback lock");
|
|
18
|
+
const file = path.join(root, "lock.sqlite");
|
|
19
|
+
// Closing an independently opened fd can drop this process's POSIX locks.
|
|
20
|
+
// Only open when creating; SQLite owns every fd for an existing lock file.
|
|
21
|
+
// Creation and close must not yield to another acquisition in this process.
|
|
22
|
+
try {
|
|
23
|
+
closeSync(openSync(file, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error.code !== "EEXIST")
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
const entry = await lstat(file);
|
|
30
|
+
if (!entry.isFile() || entry.nlink !== 1 || entry.uid !== process.getuid?.() || (entry.mode & 0o777) !== 0o600)
|
|
31
|
+
throw Error("Unsafe writeback lock");
|
|
32
|
+
const { DatabaseSync } = await import("node:sqlite");
|
|
33
|
+
const database = new DatabaseSync(file);
|
|
34
|
+
const deadline = performance.now() + timeoutMs;
|
|
35
|
+
try {
|
|
36
|
+
// SQLite's synchronous busy timeout would block a same-process holder
|
|
37
|
+
// from finishing its async publication. Yield between acquisition attempts.
|
|
38
|
+
database.exec("PRAGMA busy_timeout = 0");
|
|
39
|
+
for (;;) {
|
|
40
|
+
try {
|
|
41
|
+
database.exec("BEGIN EXCLUSIVE");
|
|
42
|
+
return () => { database.close(); };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const remaining = deadline - performance.now();
|
|
46
|
+
if (error.errcode !== 5 || remaining <= 0)
|
|
47
|
+
throw error;
|
|
48
|
+
await setTimeout(Math.min(25, remaining));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
database.close();
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
};
|
package/dist/cli/authCommands.js
CHANGED
|
@@ -5,6 +5,7 @@ import { createCanonicalTargetSecretSourceJson } from "../auth/targetSecretSourc
|
|
|
5
5
|
import { renderSimfileWorldBindings } from "../compiler/worldBindings.js";
|
|
6
6
|
import { MAX_TARGET_SECRET_SOURCE_SECRET_BYTES, TARGET_SECRET_SOURCE_ERROR } from "../auth/targetSecretSourceRecordCommon.js";
|
|
7
7
|
import { createTargetSecretSourceReceiptBytes, readBoundedTargetSecretStdin, readTargetSecretSourceGrantRequestFile, readTargetSecretSourceRequestFile } from "./targetSecretSourceInput.js";
|
|
8
|
+
import { envFileAliasOption, resolveEnvFileOption, runtimeEnvFileOption } from "./envFileOption.js";
|
|
8
9
|
const formatAuthProfileSummary = (profile) => {
|
|
9
10
|
const envKeys = Object.keys(profile.env).sort();
|
|
10
11
|
const importedKinds = Object.keys(profile.imports).sort();
|
|
@@ -112,14 +113,15 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
|
|
|
112
113
|
.description("Provision auth material a project requires into a profile")
|
|
113
114
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
114
115
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
115
|
-
.
|
|
116
|
+
.addOption(runtimeEnvFileOption("Path to an env file with model keys and runtime secrets"))
|
|
117
|
+
.addOption(envFileAliasOption())
|
|
116
118
|
.option("--claude-from <directory>", "Source Claude Code config directory")
|
|
117
119
|
.option("--codex-from <directory>", "Source Codex config directory")
|
|
118
120
|
.action(async (inputPath, options) => {
|
|
119
121
|
const profile = await handlers.syncProjectAuth(inputPath, {
|
|
120
122
|
claudeCodeDirectory: options.claudeFrom,
|
|
121
123
|
codexDirectory: options.codexFrom,
|
|
122
|
-
envFilePath: options
|
|
124
|
+
envFilePath: resolveEnvFileOption(options),
|
|
123
125
|
profileName: options.profile
|
|
124
126
|
});
|
|
125
127
|
emitLines(streams, formatAuthProfileSummary(profile));
|
|
@@ -136,10 +138,12 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
|
|
|
136
138
|
.command("provision")
|
|
137
139
|
.description("Provision a declarative batch of target credentials")
|
|
138
140
|
.argument("<request-file>", "Secret-free credential provisioning request JSON")
|
|
139
|
-
.
|
|
141
|
+
.addOption(runtimeEnvFileOption("Create a 0600 environment file", "path"))
|
|
142
|
+
.addOption(envFileAliasOption("path"))
|
|
140
143
|
.option("--world-bindings <path>", "Create a resolved world-bindings artifact")
|
|
141
144
|
.option("--resolved-grants <path>", "Resolved world grants used to derive world bindings")
|
|
142
145
|
.action((requestFile, options) => targetSecretAction(async () => {
|
|
146
|
+
const envFilePath = resolveEnvFileOption(options);
|
|
143
147
|
let materials;
|
|
144
148
|
try {
|
|
145
149
|
const request = await readCredentialProvisioningRequestFile(requestFile);
|
|
@@ -153,11 +157,11 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
|
|
|
153
157
|
await handlers.importCodexAuth(request.model_engine_auth.profile, request.model_engine_auth.from);
|
|
154
158
|
modelEngineAuth = true;
|
|
155
159
|
}
|
|
156
|
-
const envFile =
|
|
160
|
+
const envFile = envFilePath === undefined
|
|
157
161
|
? undefined
|
|
158
162
|
: await writeProvisionedEnvFile({
|
|
159
163
|
materials,
|
|
160
|
-
path:
|
|
164
|
+
path: envFilePath,
|
|
161
165
|
receipt: provisioned.receipt
|
|
162
166
|
});
|
|
163
167
|
let worldBindingsDigest;
|
|
@@ -16,8 +16,10 @@ export const registerCompileBuildCommands = (program, handlers, streams) => {
|
|
|
16
16
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
17
17
|
.option("-o, --out <directory>", "Output directory")
|
|
18
18
|
.option("--world-bindings <file>", "Path to a versioned world-bindings artifact")
|
|
19
|
+
.option("--release", "Build workspace bundles only from clean committed inputs")
|
|
19
20
|
.action(async (inputPath, options) => {
|
|
20
21
|
const result = await handlers.compileProject(inputPath, {
|
|
22
|
+
...(options.release ? { bundleIdentity: "release" } : {}),
|
|
21
23
|
outputDirectory: options.out,
|
|
22
24
|
worldBindingsPath: options.worldBindings
|
|
23
25
|
});
|
|
@@ -33,8 +35,10 @@ export const registerCompileBuildCommands = (program, handlers, streams) => {
|
|
|
33
35
|
.option("--docker-command <command>", "Docker command")
|
|
34
36
|
.option("-o, --out <directory>", "Output directory")
|
|
35
37
|
.option("-t, --tag <image>", "Docker image tag")
|
|
38
|
+
.option("--release", "Build workspace bundles only from clean committed inputs")
|
|
36
39
|
.action(async (inputPath, options) => {
|
|
37
40
|
const result = await handlers.buildProject(inputPath, {
|
|
41
|
+
...(options.release ? { bundleIdentity: "release" } : {}),
|
|
38
42
|
dockerContext: options.context,
|
|
39
43
|
dockerCommand: options.dockerCommand,
|
|
40
44
|
imageTag: options.tag,
|
package/dist/cli/devCommands.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InvalidArgumentError } from "commander";
|
|
2
|
+
import { envFileAliasOption, resolveEnvFileOption, runtimeEnvFileOption } from "./envFileOption.js";
|
|
2
3
|
const parsePositiveIntegerOption = (value) => {
|
|
3
4
|
if (!/^[1-9]\d*$/u.test(value)) {
|
|
4
5
|
throw new InvalidArgumentError("must be a positive integer");
|
|
@@ -16,7 +17,8 @@ export const registerDevCommands = (program, handlers, streams) => {
|
|
|
16
17
|
.option("--context <name>", "Docker context for the deployment target")
|
|
17
18
|
.option("--deployment <name>", "Detached deployment record name")
|
|
18
19
|
.option("--docker-command <command>", "Docker command")
|
|
19
|
-
.
|
|
20
|
+
.addOption(runtimeEnvFileOption("Path to an env file for runtime secrets"))
|
|
21
|
+
.addOption(envFileAliasOption())
|
|
20
22
|
.option("--name <container>", "Docker container name")
|
|
21
23
|
.option("-o, --out <directory>", "Dev output directory")
|
|
22
24
|
.option("-t, --tag <image>", "Docker image tag")
|
|
@@ -28,7 +30,7 @@ export const registerDevCommands = (program, handlers, streams) => {
|
|
|
28
30
|
deploymentName: options.deployment,
|
|
29
31
|
dockerCommand: options.dockerCommand,
|
|
30
32
|
dockerContext: options.context,
|
|
31
|
-
envFilePath: options
|
|
33
|
+
envFilePath: resolveEnvFileOption(options),
|
|
32
34
|
imageTag: options.tag,
|
|
33
35
|
outputDirectory: options.out
|
|
34
36
|
});
|
|
@@ -4,6 +4,7 @@ import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
|
4
4
|
export interface DownOptions {
|
|
5
5
|
compiled?: string;
|
|
6
6
|
deployment: string;
|
|
7
|
+
discardRecordedMemory?: boolean;
|
|
7
8
|
dockerCommand?: string;
|
|
8
9
|
exportTo?: string;
|
|
9
10
|
force?: boolean;
|
|
@@ -20,6 +21,7 @@ export declare const createDownLifecyclePolicy: (options: DownOptions) => {
|
|
|
20
21
|
reader_image: string | null;
|
|
21
22
|
remove_volumes: boolean;
|
|
22
23
|
timeout_ms: number | null;
|
|
24
|
+
discard_recorded_memory?: boolean | undefined;
|
|
23
25
|
};
|
|
24
26
|
export declare const createDownLifecycleInvocation: (id: string, compiledOutputDirectory: string, options: DownOptions, correlation: DeploymentLifecycleCorrelation) => LifecycleInvocation;
|
|
25
27
|
export declare const registerDownCommand: (program: Command, handlers: CliHandlers, streams: CliStreams) => void;
|
package/dist/cli/downCommand.js
CHANGED
|
@@ -5,6 +5,7 @@ import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
|
|
|
5
5
|
import { canonicalLifecycleJson } from "../deployment/lifecycleCompletionContracts.js";
|
|
6
6
|
import { createLifecycleInvocation, requireMachineLifecycle, runMachineLifecycle, } from "./lifecycleMachine.js";
|
|
7
7
|
export const createDownLifecyclePolicy = (options) => ({
|
|
8
|
+
...(options.discardRecordedMemory ? { discard_recorded_memory: true } : {}),
|
|
8
9
|
docker_command: options.dockerCommand ?? null,
|
|
9
10
|
export_to: options.exportTo ? path.resolve(options.exportTo) : null,
|
|
10
11
|
force: options.force ?? false,
|
|
@@ -52,6 +53,7 @@ export const registerDownCommand = (program, handlers, streams) => {
|
|
|
52
53
|
.option("--docker-command <command>", "Docker command")
|
|
53
54
|
.option("--export-to <directory>", "Export first, then tear down")
|
|
54
55
|
.option("--force", "Discard un-exported artifacts")
|
|
56
|
+
.option("--discard-recorded-memory", "Allow --volumes to discard memory ledgers used by recording agents")
|
|
55
57
|
.option("--reader-image <image>", "Image used to read named volumes during auto export")
|
|
56
58
|
.option("--timeout <ms>", "Bound each Docker call in milliseconds")
|
|
57
59
|
.option("--volumes", "Also remove this deployment's own named volumes (author-declared names are shared project state and are always skipped)")
|
|
@@ -67,6 +69,7 @@ export const registerDownCommand = (program, handlers, streams) => {
|
|
|
67
69
|
const receipt = await handlers.downDeployment({
|
|
68
70
|
compiledOutputDirectory: compiled,
|
|
69
71
|
deploymentName: options.deployment,
|
|
72
|
+
discardRecordedMemory: options.discardRecordedMemory,
|
|
70
73
|
dockerCommand: options.dockerCommand,
|
|
71
74
|
exportTo: options.exportTo,
|
|
72
75
|
force: options.force,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Option } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Node reads `--env-file` from the WHOLE argv, script arguments included
|
|
4
|
+
* (verified on 22.23 and 24.21): `node dist/cli/index.js up --env-file x`
|
|
5
|
+
* dies with `node: x: not found` (exit 9) before Spawnfile runs when x is
|
|
6
|
+
* missing or unreadable, and a `NODE_OPTIONS=` line in x is applied to the
|
|
7
|
+
* Spawnfile process itself. `--runtime-env-file` is the spelling Node does not
|
|
8
|
+
* claim; `--env-file` stays as a hidden alias for existing callers.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RUNTIME_ENV_FILE_FLAG = "--runtime-env-file";
|
|
11
|
+
export interface EnvFileOptions {
|
|
12
|
+
envFile?: string;
|
|
13
|
+
runtimeEnvFile?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const runtimeEnvFileOption: (description: string, valueName?: string) => Option;
|
|
16
|
+
export declare const envFileAliasOption: (valueName?: string) => Option;
|
|
17
|
+
/** One env file: either spelling, never two different files. */
|
|
18
|
+
export declare const resolveEnvFileOption: (options: EnvFileOptions) => string | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Option } from "commander";
|
|
2
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Node reads `--env-file` from the WHOLE argv, script arguments included
|
|
5
|
+
* (verified on 22.23 and 24.21): `node dist/cli/index.js up --env-file x`
|
|
6
|
+
* dies with `node: x: not found` (exit 9) before Spawnfile runs when x is
|
|
7
|
+
* missing or unreadable, and a `NODE_OPTIONS=` line in x is applied to the
|
|
8
|
+
* Spawnfile process itself. `--runtime-env-file` is the spelling Node does not
|
|
9
|
+
* claim; `--env-file` stays as a hidden alias for existing callers.
|
|
10
|
+
*/
|
|
11
|
+
export const RUNTIME_ENV_FILE_FLAG = "--runtime-env-file";
|
|
12
|
+
export const runtimeEnvFileOption = (description, valueName = "file") => new Option(`${RUNTIME_ENV_FILE_FLAG} <${valueName}>`, description);
|
|
13
|
+
export const envFileAliasOption = (valueName = "file") => new Option(`--env-file <${valueName}>`, `Alias of ${RUNTIME_ENV_FILE_FLAG}`).hideHelp();
|
|
14
|
+
/** One env file: either spelling, never two different files. */
|
|
15
|
+
export const resolveEnvFileOption = (options) => {
|
|
16
|
+
if (options.runtimeEnvFile !== undefined && options.envFile !== undefined && options.runtimeEnvFile !== options.envFile) {
|
|
17
|
+
throw new SpawnfileError("validation_error", `${RUNTIME_ENV_FILE_FLAG} and --env-file name different files; pass one`);
|
|
18
|
+
}
|
|
19
|
+
return options.runtimeEnvFile ?? options.envFile;
|
|
20
|
+
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
3
|
-
export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams, stdin: AsyncIterable<unknown
|
|
3
|
+
export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams, stdin: AsyncIterable<unknown>, setExitCode?: (code: number) => void) => void;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { registerCompileBuildCommands } from "./compileBuildCommands.js";
|
|
2
2
|
import { registerDownCommand } from "./downCommand.js";
|
|
3
3
|
import { registerLifecyclePlanningCommands } from "./lifecyclePlanningCommands.js";
|
|
4
|
+
import { registerReleaseCommand } from "./releaseCommand.js";
|
|
4
5
|
import { registerRunPublishCommands } from "./runPublishCommands.js";
|
|
5
6
|
import { registerUpCommand } from "./upCommand.js";
|
|
6
|
-
export const registerLifecycleCommands = (program, handlers, streams, stdin) => {
|
|
7
|
+
export const registerLifecycleCommands = (program, handlers, streams, stdin, setExitCode = () => undefined) => {
|
|
7
8
|
registerLifecyclePlanningCommands(program, streams, stdin);
|
|
8
9
|
registerCompileBuildCommands(program, handlers, streams);
|
|
9
10
|
registerRunPublishCommands(program, handlers, streams);
|
|
10
11
|
registerUpCommand(program, handlers, streams);
|
|
11
12
|
registerDownCommand(program, handlers, streams);
|
|
13
|
+
registerReleaseCommand(program, streams, setExitCode);
|
|
12
14
|
};
|
|
@@ -17,6 +17,7 @@ export declare const lifecyclePlanRequestSchema: z.ZodDiscriminatedUnion<[z.ZodO
|
|
|
17
17
|
version: z.ZodLiteral<"spawnfile.lifecycle-plan-request.v1">;
|
|
18
18
|
}, z.core.$strict>, z.ZodObject<{
|
|
19
19
|
deployment: z.ZodString;
|
|
20
|
+
discard_recorded_memory: z.ZodOptional<z.ZodBoolean>;
|
|
20
21
|
export_to: z.ZodNullable<z.ZodString>;
|
|
21
22
|
force: z.ZodBoolean;
|
|
22
23
|
operation: z.ZodLiteral<"down">;
|
|
@@ -35,6 +35,7 @@ export const lifecyclePlanRequestSchema = z.discriminatedUnion("operation", [
|
|
|
35
35
|
.object({
|
|
36
36
|
...common,
|
|
37
37
|
deployment: z.string().min(1).max(128),
|
|
38
|
+
discard_recorded_memory: z.boolean().optional(),
|
|
38
39
|
export_to: z.string().min(1).max(4096).nullable(),
|
|
39
40
|
force: z.boolean(),
|
|
40
41
|
operation: z.literal("down"),
|
|
@@ -225,6 +226,7 @@ export const createPlannedLifecycleInvocation = async (request) => {
|
|
|
225
226
|
const options = {
|
|
226
227
|
compiled: request.compiled ?? undefined,
|
|
227
228
|
deployment: request.deployment,
|
|
229
|
+
discardRecordedMemory: request.discard_recorded_memory,
|
|
228
230
|
dockerCommand: request.docker_command ?? undefined,
|
|
229
231
|
exportTo: request.export_to ?? undefined,
|
|
230
232
|
force: request.force,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type TrainingContext } from "../compiler/training/index.js";
|
|
1
|
+
import { type TrainingContext, type TrainingExecution } from "../compiler/training/index.js";
|
|
2
2
|
import type { CliStreams } from "./runCli.js";
|
|
3
3
|
export interface DelegatePaideiaTrainingOptions {
|
|
4
4
|
context: TrainingContext;
|
|
5
|
+
execution?: TrainingExecution;
|
|
5
6
|
command: string;
|
|
6
7
|
args: readonly string[];
|
|
7
8
|
dryRun: boolean;
|
|
@@ -171,12 +171,13 @@ export const delegatePaideiaTraining = async (options) => {
|
|
|
171
171
|
throw failure("--repair-witness requires --repair-measurements");
|
|
172
172
|
if (options.trainingConfig) {
|
|
173
173
|
const config = await readBoundedJson(options.trainingConfig);
|
|
174
|
-
//
|
|
175
|
-
if (config.version === "spawnfile.training-container.v2" || (
|
|
176
|
-
if (options.trainingImage)
|
|
174
|
+
// Image declarations go through preparation; lowered launch configurations go straight to Docker.
|
|
175
|
+
if (config.version === "spawnfile.training-container.v2" || (["spawnfile.training-container.v3", "spawnfile.training-container.v4"].includes(String(config.version)) && config.image !== undefined)) {
|
|
176
|
+
if (options.trainingImage && !options.execution)
|
|
177
177
|
throw failure("V2 owns its image declaration; --training-image is only for v1");
|
|
178
178
|
const prepared = await prepareTraining({ configPath: options.trainingConfig, context: options.context, args: options.args,
|
|
179
179
|
repairMeasurements: options.repairMeasurements, repairWitness: options.repairWitness,
|
|
180
|
+
execution: options.execution, outputOverride: options.execution?.output, imageOverride: options.execution ? options.trainingImage : undefined,
|
|
180
181
|
dryRun: options.dryRun, process: runTrainingDocker, timeoutMs: options.timeoutMs, signal: options.signal, streams: options.streams });
|
|
181
182
|
if (!("dryRun" in prepared))
|
|
182
183
|
return launchTrainingContainer({ ...prepared,
|
|
@@ -191,7 +192,7 @@ export const delegatePaideiaTraining = async (options) => {
|
|
|
191
192
|
if (!options.trainingImage || !options.trainingConfig)
|
|
192
193
|
throw failure("Actual training requires --training-image and --training-config; host execution is disabled");
|
|
193
194
|
return launchTrainingContainer({ image: options.trainingImage, configPath: options.trainingConfig,
|
|
194
|
-
context: options.context, args: options.args, timeoutMs: options.timeoutMs, streams: options.streams, signal: options.signal });
|
|
195
|
+
context: options.context, args: options.args, execution: options.execution, timeoutMs: options.timeoutMs, streams: options.streams, signal: options.signal });
|
|
195
196
|
}
|
|
196
197
|
if (process.platform === "win32")
|
|
197
198
|
throw failure("Paideia delegation requires POSIX process-group supervision");
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type RecordingDeploymentHandlers } from "../recording/index.js";
|
|
3
|
+
import type { CliStreams } from "./runCli.js";
|
|
4
|
+
import { type UsageCommandLiveHandlers } from "./usageCommandLive.js";
|
|
5
|
+
export interface RecordSyncOptions {
|
|
6
|
+
deployment?: string;
|
|
7
|
+
out?: string;
|
|
8
|
+
dockerCommand?: string;
|
|
9
|
+
timeout?: string;
|
|
10
|
+
}
|
|
11
|
+
export type RecordCommandHandlers = UsageCommandLiveHandlers & RecordingDeploymentHandlers;
|
|
12
|
+
export declare const executeRecordSyncCommand: (inputPath: string, options: RecordSyncOptions, handlers?: RecordCommandHandlers) => Promise<{
|
|
13
|
+
exitCode: 0 | 1 | 2;
|
|
14
|
+
output?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const registerRecordCommands: (program: Command, streams: CliStreams, setExitCode: (code: 0 | 1 | 2) => void, handlers?: RecordCommandHandlers) => void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { resolveProjectOutputDirectory } from "../filesystem/index.js";
|
|
2
|
+
import { syncDeploymentMoments } from "../recording/index.js";
|
|
3
|
+
import { DEFAULT_OUTPUT_DIRECTORY, errorExitCode } from "../shared/index.js";
|
|
4
|
+
import { selectUsageDeployment } from "./usageCommandLive.js";
|
|
5
|
+
import { resolveUsageDeploymentSource } from "./usageDeploymentSource.js";
|
|
6
|
+
export const executeRecordSyncCommand = async (inputPath, options, handlers = {}) => {
|
|
7
|
+
try {
|
|
8
|
+
const timeoutMs = options.timeout === undefined ? undefined : Number(options.timeout);
|
|
9
|
+
if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)) {
|
|
10
|
+
return { exitCode: 2, error: "--timeout must be a positive number of milliseconds" };
|
|
11
|
+
}
|
|
12
|
+
const outputDirectory = resolveProjectOutputDirectory(inputPath, options.out, DEFAULT_OUTPUT_DIRECTORY);
|
|
13
|
+
const source = await resolveUsageDeploymentSource(inputPath, options, handlers, outputDirectory);
|
|
14
|
+
const records = await source.loader(source.outputDirectory);
|
|
15
|
+
const record = selectUsageDeployment(records, options.deployment);
|
|
16
|
+
if ("error" in record)
|
|
17
|
+
return { exitCode: 2, error: record.error.replace("spawnfile usage", "spawnfile record sync") };
|
|
18
|
+
const recordPath = records.find((entry) => entry.record === record).path;
|
|
19
|
+
const result = await syncDeploymentMoments({ record, recordPath, timeoutMs, dockerCommand: options.dockerCommand }, handlers);
|
|
20
|
+
return {
|
|
21
|
+
exitCode: result.failures.length ? 1 : 0,
|
|
22
|
+
output: `Records: ${result.written} written / ${result.skipped} skipped / ${result.nonExact} non-exact`,
|
|
23
|
+
...((result.failures.length || result.warnings.length) ? { error: [...result.failures, ...new Set(result.warnings)].join("\n") } : {})
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return { exitCode: errorExitCode(error), error: error instanceof Error ? error.message : String(error) };
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const registerRecordCommands = (program, streams, setExitCode, handlers = {}) => {
|
|
31
|
+
program.command("record").description("Compose training moment records from deployed wake evidence")
|
|
32
|
+
.command("sync").argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
33
|
+
.option("--deployment <name>", "Deployment record name").option("--out <dir>", "Compile output directory")
|
|
34
|
+
.option("--docker-command <command>", "Docker command").option("--timeout <ms>", "Bound Docker reads in milliseconds")
|
|
35
|
+
.action(async (inputPath, options) => {
|
|
36
|
+
const result = await executeRecordSyncCommand(inputPath, options, handlers);
|
|
37
|
+
setExitCode(result.exitCode);
|
|
38
|
+
if (result.error)
|
|
39
|
+
streams.stderr(result.error);
|
|
40
|
+
if (result.output)
|
|
41
|
+
streams.stdout(result.output);
|
|
42
|
+
});
|
|
43
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type ReleaseDependencies } from "../release/index.js";
|
|
3
|
+
import type { CliStreams } from "./runCli.js";
|
|
4
|
+
/** `90s`, `30m`, `2h`, `500ms`. A bare number is refused: the unit is never guessed. */
|
|
5
|
+
export declare const parseReleaseDuration: (value: string, flag: string) => number;
|
|
6
|
+
export declare const registerReleaseCommand: (program: Command, streams: CliStreams, setExitCode: (code: number) => void, dependencies?: () => ReleaseDependencies) => void;
|