spawnfile 0.1.33 → 0.1.34
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/trainingAuth.d.ts +2 -5
- package/dist/cli/devCommands.d.ts +1 -1
- package/dist/cli/devCommands.js +0 -66
- package/dist/cli/runCli.d.ts +1 -4
- package/dist/cli/runCli.js +2 -2
- package/dist/cli/trainCommand.js +9 -15
- package/dist/cli/trainingBooted.d.ts +7 -0
- package/dist/cli/trainingBooted.js +41 -0
- package/dist/cli/trainingExecution.d.ts +4 -7
- package/dist/cli/trainingExecution.js +4 -32
- package/dist/compiler/containerArtifacts.js +0 -5
- package/dist/compiler/containerBackedMountRender.js +5 -1
- package/dist/compiler/containerDaimonBrokerRender.d.ts +5 -50
- package/dist/compiler/containerDaimonBrokerRender.js +7 -88
- package/dist/compiler/containerDaimonGatewayRender.d.ts +50 -0
- package/dist/compiler/containerDaimonGatewayRender.js +157 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +2 -10
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +13 -25
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +11 -49
- package/dist/compiler/containerDaimonGrokWorkerRender.js +15 -39
- package/dist/compiler/containerDaimonStartupSupervision.d.ts +8 -0
- package/dist/compiler/containerDaimonStartupSupervision.js +39 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +1 -2
- package/dist/compiler/containerDaimonUidEntrypointRender.js +26 -46
- package/dist/compiler/containerRuntimeReadinessRender.js +1 -1
- package/dist/compiler/memoryArtifacts.js +0 -1
- package/dist/compiler/moltnetArtifacts.js +1 -17
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +0 -10
- package/dist/compiler/runProject.d.ts +1 -0
- package/dist/compiler/runProject.js +9 -3
- package/dist/compiler/runProjectAuth.js +2 -17
- package/dist/compiler/training/contract.d.ts +0 -2
- package/dist/compiler/training/contract.js +0 -2
- package/dist/compiler/training/execution.d.ts +1 -128
- package/dist/compiler/training/execution.js +7 -68
- package/dist/compiler/training/index.d.ts +0 -8
- package/dist/compiler/training/index.js +0 -7
- package/dist/compiler/training/output.d.ts +1 -0
- package/dist/compiler/training/output.js +1 -1
- package/dist/compiler/training/trial/boot.d.ts +53 -0
- package/dist/compiler/training/trial/boot.js +147 -0
- package/dist/compiler/training/trial/docker.d.ts +8 -0
- package/dist/compiler/training/trial/docker.js +22 -0
- package/dist/compiler/training/trial/gateway.d.ts +42 -0
- package/dist/compiler/training/trial/gateway.js +98 -0
- package/dist/compiler/training/trial/index.d.ts +4 -0
- package/dist/compiler/training/trial/index.js +4 -0
- package/dist/compiler/training/trial/launcher.d.ts +32 -0
- package/dist/compiler/training/trial/launcher.js +49 -0
- package/dist/compiler/training/trial/project.d.ts +11 -0
- package/dist/compiler/training/trial/project.js +31 -0
- package/dist/compiler/upReceipt.d.ts +2 -17
- package/dist/compiler/upReceipt.js +2 -17
- package/dist/deployment/artifactsExportPlan.js +2 -18
- package/dist/deployment/privateArtifactsExport.js +1 -1
- package/dist/dev/docker.d.ts +0 -5
- package/dist/dev/docker.js +0 -46
- package/dist/dev/index.d.ts +0 -1
- package/dist/dev/index.js +0 -1
- package/dist/dev/project.d.ts +0 -16
- package/dist/dev/project.js +1 -128
- package/dist/distribution/distributionReportSchema.js +1 -1
- package/dist/distribution/imageRuntimeAuth.js +3 -2
- package/dist/release/drainControl.d.ts +5 -19
- package/dist/release/drainControl.js +12 -67
- package/dist/report/types.d.ts +3 -6
- package/dist/runtime/common.d.ts +1 -1
- package/dist/runtime/common.js +1 -1
- package/dist/runtime/container.d.ts +2 -2
- package/dist/runtime/container.js +1 -39
- package/dist/runtime/daimon/config.js +6 -12
- package/dist/runtime/daimon/contractManifest.js +0 -1
- package/dist/runtime/daimon/contractManifestSchema.js +0 -1
- package/dist/runtime/daimon/control.d.ts +31 -0
- package/dist/runtime/daimon/control.js +83 -0
- package/dist/runtime/daimon/engineDescriptorSchema.js +0 -1
- package/dist/runtime/daimon/engineDescriptors.generated.d.ts +1 -1
- package/dist/runtime/daimon/engineDescriptors.generated.js +1 -2
- package/dist/runtime/daimon/engines.js +0 -1
- package/dist/runtime/daimon/gateway.d.ts +62 -0
- package/dist/runtime/daimon/gateway.js +77 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +0 -5
- package/dist/runtime/daimon/grokWorkerContract.js +1 -13
- package/dist/runtime/daimon/index.d.ts +2 -0
- package/dist/runtime/daimon/index.js +2 -1
- package/dist/runtime/daimon/memory.js +1 -1
- package/dist/runtime/daimon/packageName.js +0 -1
- package/dist/runtime/daimon/runAuth.js +7 -4
- package/dist/runtime/daimon/runtimeIdentity.d.ts +2 -0
- package/dist/runtime/daimon/runtimeIdentity.js +2 -0
- package/dist/runtime/daimon/subscriptionRealms.d.ts +9 -3
- package/dist/runtime/daimon/subscriptionRealms.js +22 -13
- package/dist/runtime/daimon/testHelpers.d.ts +2 -0
- package/dist/runtime/{pi → daimon}/testHelpers.js +3 -3
- package/dist/runtime/daimon/training/booted/adapter.d.ts +46 -0
- package/dist/runtime/daimon/training/booted/adapter.js +59 -0
- package/dist/runtime/daimon/training/booted/adapter.js.map +1 -0
- package/dist/runtime/daimon/training/booted/index.d.ts +2 -0
- package/dist/runtime/daimon/training/booted/index.js +2 -0
- package/dist/runtime/daimon/training/booted/index.js.map +1 -0
- package/dist/runtime/daimon/training/index.d.ts +5 -0
- package/dist/runtime/daimon/training/index.js +8 -4
- package/dist/runtime/daimon/training/index.js.map +1 -1
- package/dist/runtime/daimon/training/providers/codex-subscription/index.js.map +1 -0
- package/dist/runtime/daimon/training/providers/codex-subscription/protocol.js.map +1 -0
- package/dist/runtime/daimon/training/providers/codex-subscription/provider.js.map +1 -0
- package/dist/runtime/daimon/training/providers/codex-subscription/strict-schema.js.map +1 -0
- package/dist/runtime/daimon/training/providers/grok-subscription/cli.d.ts +1 -3
- package/dist/runtime/daimon/training/providers/grok-subscription/cli.js +5 -5
- package/dist/runtime/daimon/training/providers/grok-subscription/cli.js.map +1 -1
- package/dist/runtime/daimon/training/providers/grok-subscription/index.d.ts +1 -2
- package/dist/runtime/daimon/training/providers/grok-subscription/index.js +0 -1
- package/dist/runtime/daimon/training/providers/grok-subscription/index.js.map +1 -1
- package/dist/runtime/daimon/training/providers/grok-subscription/protocol.d.ts +5 -17
- package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js +18 -31
- package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js.map +1 -1
- package/dist/runtime/daimon/training/providers/grok-subscription/provider.js +1 -2
- package/dist/runtime/daimon/training/providers/grok-subscription/provider.js.map +1 -1
- package/dist/runtime/daimon/wakeMoments.js +0 -1
- package/dist/runtime/install.js +0 -21
- package/dist/runtime/registry.js +0 -2
- package/dist/runtime/trainingGraderProviders.js +1 -1
- package/dist/runtime/trainingProviders.d.ts +1 -2
- package/dist/runtime/trainingProviders.js +9 -19
- package/dist/runtime/trainingSubjects.d.ts +0 -121
- package/dist/runtime/trainingSubjects.js +2 -13
- package/dist/runtime/types.d.ts +1 -8
- package/dist/shared/errors.js +0 -1
- package/dist/status/lifecycleProbes.js +3 -6
- package/dist/status/moltnetWiringProbes.js +1 -17
- package/dist/training/subjects/index.d.ts +0 -1
- package/dist/training/subjects/index.js +0 -1
- package/dist/training/subjects/index.js.map +1 -1
- package/examples/README.md +0 -1
- package/examples/daimon-org/agents/mapper/Spawnfile +4 -1
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +4 -1
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +5 -8
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +1 -1
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +5 -8
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +5 -8
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +5 -8
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +1 -1
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +7 -7
- package/package.json +4 -13
- package/runtimes.yaml +5 -15
- package/dist/compiler/containerDaimonGrokTaskClock.d.ts +0 -5
- package/dist/compiler/containerDaimonGrokTaskClock.js +0 -29
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +0 -22
- package/dist/compiler/daimonTelemetryArtifacts.js +0 -56
- package/dist/compiler/training/broker/clockProbe.d.ts +0 -6
- package/dist/compiler/training/broker/clockProbe.js +0 -27
- package/dist/compiler/training/broker/declaration.d.ts +0 -54
- package/dist/compiler/training/broker/declaration.js +0 -70
- package/dist/compiler/training/broker/entrypoint.d.ts +0 -39
- package/dist/compiler/training/broker/entrypoint.js +0 -124
- package/dist/compiler/training/broker/evaluatorSecrets.d.ts +0 -2
- package/dist/compiler/training/broker/evaluatorSecrets.js +0 -62
- package/dist/compiler/training/broker/index.d.ts +0 -12
- package/dist/compiler/training/broker/index.js +0 -12
- package/dist/compiler/training/broker/main.d.ts +0 -2
- package/dist/compiler/training/broker/main.js +0 -14
- package/dist/compiler/training/broker/paths.d.ts +0 -236
- package/dist/compiler/training/broker/paths.js +0 -249
- package/dist/compiler/training/broker/processes.d.ts +0 -51
- package/dist/compiler/training/broker/processes.js +0 -102
- package/dist/compiler/training/broker/projection.d.ts +0 -61
- package/dist/compiler/training/broker/projection.js +0 -109
- package/dist/compiler/training/broker/provisioning.d.ts +0 -78
- package/dist/compiler/training/broker/provisioning.js +0 -231
- package/dist/compiler/training/broker/receipt.d.ts +0 -77
- package/dist/compiler/training/broker/receipt.js +0 -110
- package/dist/compiler/training/broker/recycleClient.d.ts +0 -33
- package/dist/compiler/training/broker/recycleClient.js +0 -112
- package/dist/compiler/training/broker/registration.d.ts +0 -46
- package/dist/compiler/training/broker/registration.js +0 -113
- package/dist/compiler/training/broker/reset.d.ts +0 -9
- package/dist/compiler/training/broker/reset.js +0 -71
- package/dist/compiler/training/broker/rootScript.d.ts +0 -32
- package/dist/compiler/training/broker/rootScript.js +0 -33
- package/dist/compiler/training/broker/runtime.d.ts +0 -22
- package/dist/compiler/training/broker/runtime.js +0 -128
- package/dist/compiler/training/broker/seccompRoutes.d.ts +0 -31
- package/dist/compiler/training/broker/seccompRoutes.js +0 -36
- package/dist/compiler/training/broker/supervisor.d.ts +0 -108
- package/dist/compiler/training/broker/supervisor.js +0 -172
- package/dist/compiler/training/broker/taskClock.d.ts +0 -5
- package/dist/compiler/training/broker/taskClock.js +0 -41
- package/dist/compiler/training/container/contract.d.ts +0 -54
- package/dist/compiler/training/container/contract.js +0 -52
- package/dist/compiler/training/container/evaluators.d.ts +0 -48
- package/dist/compiler/training/container/evaluators.js +0 -50
- package/dist/compiler/training/container/grokWriteback.d.ts +0 -8
- package/dist/compiler/training/container/grokWriteback.js +0 -26
- package/dist/compiler/training/container/index.d.ts +0 -5
- package/dist/compiler/training/container/index.js +0 -3
- package/dist/compiler/training/container/launch.d.ts +0 -21
- package/dist/compiler/training/container/launch.js +0 -280
- package/dist/compiler/training/container/nativeSlots.d.ts +0 -14
- package/dist/compiler/training/container/nativeSlots.js +0 -13
- package/dist/compiler/training/container/outputCopy.d.ts +0 -2
- package/dist/compiler/training/container/outputCopy.js +0 -72
- package/dist/compiler/training/container/outputVolume.d.ts +0 -28
- package/dist/compiler/training/container/outputVolume.js +0 -185
- package/dist/compiler/training/container/prepare.d.ts +0 -10
- package/dist/compiler/training/container/prepare.js +0 -125
- package/dist/compiler/training/container/process.d.ts +0 -14
- package/dist/compiler/training/container/process.js +0 -70
- package/dist/compiler/training/container/security.d.ts +0 -38
- package/dist/compiler/training/container/security.js +0 -68
- package/dist/compiler/training/container/subjectIsolation.d.ts +0 -5
- package/dist/compiler/training/container/subjectIsolation.js +0 -16
- package/dist/compiler/training/preparation/assets/Dockerfile +0 -100
- package/dist/compiler/training/preparation/assets/package-lock.json +0 -5483
- package/dist/compiler/training/preparation/broker.d.ts +0 -30
- package/dist/compiler/training/preparation/broker.js +0 -68
- package/dist/compiler/training/preparation/contextModes.d.ts +0 -12
- package/dist/compiler/training/preparation/contextModes.js +0 -38
- package/dist/compiler/training/preparation/contract.d.ts +0 -203
- package/dist/compiler/training/preparation/contract.js +0 -114
- package/dist/compiler/training/preparation/copyAssets.d.ts +0 -1
- package/dist/compiler/training/preparation/copyAssets.js +0 -8
- package/dist/compiler/training/preparation/daimonParent.d.ts +0 -42
- package/dist/compiler/training/preparation/daimonParent.js +0 -114
- package/dist/compiler/training/preparation/files.d.ts +0 -29
- package/dist/compiler/training/preparation/files.js +0 -146
- package/dist/compiler/training/preparation/image.d.ts +0 -28
- package/dist/compiler/training/preparation/image.js +0 -105
- package/dist/compiler/training/preparation/index.d.ts +0 -3
- package/dist/compiler/training/preparation/index.js +0 -2
- package/dist/compiler/training/preparation/inputs.d.ts +0 -24
- package/dist/compiler/training/preparation/inputs.js +0 -101
- package/dist/compiler/training/preparation/prepare.d.ts +0 -38
- package/dist/compiler/training/preparation/prepare.js +0 -224
- package/dist/compiler/training/preparation/scratch.d.ts +0 -8
- package/dist/compiler/training/preparation/scratch.js +0 -114
- package/dist/compiler/training/repair/compatibility.d.ts +0 -11
- package/dist/compiler/training/repair/compatibility.js +0 -45
- package/dist/compiler/training/repair/contract.d.ts +0 -832
- package/dist/compiler/training/repair/contract.js +0 -34
- package/dist/compiler/training/repair/index.d.ts +0 -3
- package/dist/compiler/training/repair/index.js +0 -3
- package/dist/compiler/training/repair/prepare.d.ts +0 -378
- package/dist/compiler/training/repair/prepare.js +0 -84
- package/dist/compiler/training/repair/witness.d.ts +0 -348
- package/dist/compiler/training/repair/witness.js +0 -62
- package/dist/compiler/training/subjectDeclaration.d.ts +0 -26
- package/dist/compiler/training/subjectDeclaration.js +0 -54
- package/dist/compiler/training/subjectLease.d.ts +0 -115
- package/dist/compiler/training/subjectLease.js +0 -179
- package/dist/dev/activity.d.ts +0 -14
- package/dist/dev/activity.js +0 -48
- package/dist/runtime/codex-exec/training/adapter.d.ts +0 -13
- package/dist/runtime/codex-exec/training/adapter.js +0 -101
- package/dist/runtime/codex-exec/training/adapter.js.map +0 -1
- package/dist/runtime/codex-exec/training/environment.d.ts +0 -3
- package/dist/runtime/codex-exec/training/environment.js +0 -26
- package/dist/runtime/codex-exec/training/environment.js.map +0 -1
- package/dist/runtime/codex-exec/training/index.d.ts +0 -2
- package/dist/runtime/codex-exec/training/index.js +0 -3
- package/dist/runtime/codex-exec/training/index.js.map +0 -1
- package/dist/runtime/codex-exec/training/protocol.d.ts +0 -15
- package/dist/runtime/codex-exec/training/protocol.js +0 -102
- package/dist/runtime/codex-exec/training/protocol.js.map +0 -1
- package/dist/runtime/codex-exec/training/providers/codex-subscription/index.js.map +0 -1
- package/dist/runtime/codex-exec/training/providers/codex-subscription/protocol.js.map +0 -1
- package/dist/runtime/codex-exec/training/providers/codex-subscription/provider.js.map +0 -1
- package/dist/runtime/codex-exec/training/providers/codex-subscription/strict-schema.js.map +0 -1
- package/dist/runtime/daimon/contractManifest.js.map +0 -1
- package/dist/runtime/daimon/contractManifestSchema.js.map +0 -1
- package/dist/runtime/daimon/engineDescriptorSchema.js.map +0 -1
- package/dist/runtime/daimon/engineDescriptors.generated.js.map +0 -1
- package/dist/runtime/daimon/engines.js.map +0 -1
- package/dist/runtime/daimon/index.js.map +0 -1
- package/dist/runtime/daimon/packageName.js.map +0 -1
- package/dist/runtime/daimon/training/legacy/adapter.d.ts +0 -11
- package/dist/runtime/daimon/training/legacy/adapter.js +0 -175
- package/dist/runtime/daimon/training/legacy/adapter.js.map +0 -1
- package/dist/runtime/daimon/training/legacy/index.d.ts +0 -2
- package/dist/runtime/daimon/training/legacy/index.js +0 -3
- package/dist/runtime/daimon/training/legacy/index.js.map +0 -1
- package/dist/runtime/daimon/training/legacy/public.d.ts +0 -49
- package/dist/runtime/daimon/training/legacy/public.js +0 -16
- package/dist/runtime/daimon/training/legacy/public.js.map +0 -1
- package/dist/runtime/daimon/training/native/adapter.d.ts +0 -18
- package/dist/runtime/daimon/training/native/adapter.js +0 -252
- package/dist/runtime/daimon/training/native/adapter.js.map +0 -1
- package/dist/runtime/daimon/training/native/admission.d.ts +0 -7
- package/dist/runtime/daimon/training/native/admission.js +0 -52
- package/dist/runtime/daimon/training/native/admission.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/arguments.d.ts +0 -16
- package/dist/runtime/daimon/training/native/child/arguments.js +0 -70
- package/dist/runtime/daimon/training/native/child/arguments.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/deferred-trial.d.ts +0 -24
- package/dist/runtime/daimon/training/native/child/deferred-trial.js +0 -63
- package/dist/runtime/daimon/training/native/child/deferred-trial.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/diagnostics.d.ts +0 -58
- package/dist/runtime/daimon/training/native/child/diagnostics.js +0 -215
- package/dist/runtime/daimon/training/native/child/diagnostics.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/fixture.d.ts +0 -16
- package/dist/runtime/daimon/training/native/child/fixture.js +0 -159
- package/dist/runtime/daimon/training/native/child/fixture.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/grok.d.ts +0 -14
- package/dist/runtime/daimon/training/native/child/grok.js +0 -47
- package/dist/runtime/daimon/training/native/child/grok.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/index.d.ts +0 -7
- package/dist/runtime/daimon/training/native/child/index.js +0 -5
- package/dist/runtime/daimon/training/native/child/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/lifecycle.d.ts +0 -40
- package/dist/runtime/daimon/training/native/child/lifecycle.js +0 -400
- package/dist/runtime/daimon/training/native/child/lifecycle.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/probe.d.ts +0 -2
- package/dist/runtime/daimon/training/native/child/probe.js +0 -11
- package/dist/runtime/daimon/training/native/child/probe.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/sandbox.d.ts +0 -4
- package/dist/runtime/daimon/training/native/child/sandbox.js +0 -76
- package/dist/runtime/daimon/training/native/child/sandbox.js.map +0 -1
- package/dist/runtime/daimon/training/native/child/types.d.ts +0 -15
- package/dist/runtime/daimon/training/native/child/types.js +0 -2
- package/dist/runtime/daimon/training/native/child/types.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/docker.d.ts +0 -29
- package/dist/runtime/daimon/training/native/container/docker.js +0 -105
- package/dist/runtime/daimon/training/native/container/docker.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/grok-slot.d.ts +0 -22
- package/dist/runtime/daimon/training/native/container/grok-slot.js +0 -38
- package/dist/runtime/daimon/training/native/container/grok-slot.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/index.d.ts +0 -6
- package/dist/runtime/daimon/training/native/container/index.js +0 -6
- package/dist/runtime/daimon/training/native/container/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/lifecycle.d.ts +0 -8
- package/dist/runtime/daimon/training/native/container/lifecycle.js +0 -111
- package/dist/runtime/daimon/training/native/container/lifecycle.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/manifest.d.ts +0 -17
- package/dist/runtime/daimon/training/native/container/manifest.js +0 -164
- package/dist/runtime/daimon/training/native/container/manifest.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/native-preflight.d.ts +0 -8
- package/dist/runtime/daimon/training/native/container/native-preflight.js +0 -40
- package/dist/runtime/daimon/training/native/container/native-preflight.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/preflight.d.ts +0 -15
- package/dist/runtime/daimon/training/native/container/preflight.js +0 -79
- package/dist/runtime/daimon/training/native/container/preflight.js.map +0 -1
- package/dist/runtime/daimon/training/native/container/slot.d.ts +0 -4
- package/dist/runtime/daimon/training/native/container/slot.js +0 -58
- package/dist/runtime/daimon/training/native/container/slot.js.map +0 -1
- package/dist/runtime/daimon/training/native/external.d.ts +0 -37
- package/dist/runtime/daimon/training/native/external.js +0 -75
- package/dist/runtime/daimon/training/native/external.js.map +0 -1
- package/dist/runtime/daimon/training/native/grants/authority.d.ts +0 -36
- package/dist/runtime/daimon/training/native/grants/authority.js +0 -49
- package/dist/runtime/daimon/training/native/grants/authority.js.map +0 -1
- package/dist/runtime/daimon/training/native/grants/index.d.ts +0 -2
- package/dist/runtime/daimon/training/native/grants/index.js +0 -3
- package/dist/runtime/daimon/training/native/grants/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/grants/pins.d.ts +0 -30
- package/dist/runtime/daimon/training/native/grants/pins.js +0 -20
- package/dist/runtime/daimon/training/native/grants/pins.js.map +0 -1
- package/dist/runtime/daimon/training/native/grants/test-socket.d.ts +0 -6
- package/dist/runtime/daimon/training/native/grants/test-socket.js +0 -35
- package/dist/runtime/daimon/training/native/grants/test-socket.js.map +0 -1
- package/dist/runtime/daimon/training/native/grok-fixtures.d.ts +0 -34
- package/dist/runtime/daimon/training/native/grok-fixtures.js +0 -179
- package/dist/runtime/daimon/training/native/grok-fixtures.js.map +0 -1
- package/dist/runtime/daimon/training/native/index.d.ts +0 -38
- package/dist/runtime/daimon/training/native/index.js +0 -27
- package/dist/runtime/daimon/training/native/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/live-checkout.d.ts +0 -2
- package/dist/runtime/daimon/training/native/live-checkout.js +0 -15
- package/dist/runtime/daimon/training/native/live-checkout.js.map +0 -1
- package/dist/runtime/daimon/training/native/observations.d.ts +0 -51
- package/dist/runtime/daimon/training/native/observations.js +0 -217
- package/dist/runtime/daimon/training/native/observations.js.map +0 -1
- package/dist/runtime/daimon/training/native/outcome.d.ts +0 -13
- package/dist/runtime/daimon/training/native/outcome.js +0 -37
- package/dist/runtime/daimon/training/native/outcome.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/engine-config.d.ts +0 -21
- package/dist/runtime/daimon/training/native/preparation/engine-config.js +0 -30
- package/dist/runtime/daimon/training/native/preparation/engine-config.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/fixtures.d.ts +0 -17
- package/dist/runtime/daimon/training/native/preparation/fixtures.js +0 -52
- package/dist/runtime/daimon/training/native/preparation/fixtures.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/index.d.ts +0 -7
- package/dist/runtime/daimon/training/native/preparation/index.js +0 -5
- package/dist/runtime/daimon/training/native/preparation/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/layout.d.ts +0 -66
- package/dist/runtime/daimon/training/native/preparation/layout.js +0 -87
- package/dist/runtime/daimon/training/native/preparation/layout.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/subject.d.ts +0 -14
- package/dist/runtime/daimon/training/native/preparation/subject.js +0 -67
- package/dist/runtime/daimon/training/native/preparation/subject.js.map +0 -1
- package/dist/runtime/daimon/training/native/preparation/types.d.ts +0 -69
- package/dist/runtime/daimon/training/native/preparation/types.js +0 -2
- package/dist/runtime/daimon/training/native/preparation/types.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/artifacts.d.ts +0 -25
- package/dist/runtime/daimon/training/native/receipt/artifacts.js +0 -32
- package/dist/runtime/daimon/training/native/receipt/artifacts.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.d.ts +0 -129
- package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js +0 -45
- package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/grok.d.ts +0 -246
- package/dist/runtime/daimon/training/native/receipt/grok.js +0 -195
- package/dist/runtime/daimon/training/native/receipt/grok.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/index.d.ts +0 -11
- package/dist/runtime/daimon/training/native/receipt/index.js +0 -8
- package/dist/runtime/daimon/training/native/receipt/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/paths.d.ts +0 -3
- package/dist/runtime/daimon/training/native/receipt/paths.js +0 -18
- package/dist/runtime/daimon/training/native/receipt/paths.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/sandbox.d.ts +0 -42
- package/dist/runtime/daimon/training/native/receipt/sandbox.js +0 -35
- package/dist/runtime/daimon/training/native/receipt/sandbox.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/schema.d.ts +0 -490
- package/dist/runtime/daimon/training/native/receipt/schema.js +0 -138
- package/dist/runtime/daimon/training/native/receipt/schema.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/subscription.d.ts +0 -13
- package/dist/runtime/daimon/training/native/receipt/subscription.js +0 -13
- package/dist/runtime/daimon/training/native/receipt/subscription.js.map +0 -1
- package/dist/runtime/daimon/training/native/receipt/task-clock.d.ts +0 -19
- package/dist/runtime/daimon/training/native/receipt/task-clock.js +0 -49
- package/dist/runtime/daimon/training/native/receipt/task-clock.js.map +0 -1
- package/dist/runtime/daimon/training/native/sealed-usage.d.ts +0 -218
- package/dist/runtime/daimon/training/native/sealed-usage.js +0 -261
- package/dist/runtime/daimon/training/native/sealed-usage.js.map +0 -1
- package/dist/runtime/daimon/training/native/test-fixtures.d.ts +0 -27
- package/dist/runtime/daimon/training/native/test-fixtures.js +0 -162
- package/dist/runtime/daimon/training/native/test-fixtures.js.map +0 -1
- package/dist/runtime/daimon/training/native/transcript.d.ts +0 -96
- package/dist/runtime/daimon/training/native/transcript.js +0 -239
- package/dist/runtime/daimon/training/native/transcript.js.map +0 -1
- package/dist/runtime/daimon/training/native/transport/delivery.d.ts +0 -27
- package/dist/runtime/daimon/training/native/transport/delivery.js +0 -98
- package/dist/runtime/daimon/training/native/transport/delivery.js.map +0 -1
- package/dist/runtime/daimon/training/native/transport/http.d.ts +0 -3
- package/dist/runtime/daimon/training/native/transport/http.js +0 -81
- package/dist/runtime/daimon/training/native/transport/http.js.map +0 -1
- package/dist/runtime/daimon/training/native/transport/index.d.ts +0 -4
- package/dist/runtime/daimon/training/native/transport/index.js +0 -3
- package/dist/runtime/daimon/training/native/transport/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/transport/types.d.ts +0 -15
- package/dist/runtime/daimon/training/native/transport/types.js +0 -2
- package/dist/runtime/daimon/training/native/transport/types.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/cli.d.ts +0 -1
- package/dist/runtime/daimon/training/native/worker/cli.js +0 -17
- package/dist/runtime/daimon/training/native/worker/cli.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/control.d.ts +0 -20
- package/dist/runtime/daimon/training/native/worker/control.js +0 -266
- package/dist/runtime/daimon/training/native/worker/control.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/deliveries.d.ts +0 -38
- package/dist/runtime/daimon/training/native/worker/deliveries.js +0 -91
- package/dist/runtime/daimon/training/native/worker/deliveries.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/evidence/collect.d.ts +0 -54
- package/dist/runtime/daimon/training/native/worker/evidence/collect.js +0 -278
- package/dist/runtime/daimon/training/native/worker/evidence/collect.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/evidence/execution.d.ts +0 -102
- package/dist/runtime/daimon/training/native/worker/evidence/execution.js +0 -191
- package/dist/runtime/daimon/training/native/worker/evidence/execution.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/evidence/index.d.ts +0 -3
- package/dist/runtime/daimon/training/native/worker/evidence/index.js +0 -4
- package/dist/runtime/daimon/training/native/worker/evidence/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/evidence/io.d.ts +0 -20
- package/dist/runtime/daimon/training/native/worker/evidence/io.js +0 -130
- package/dist/runtime/daimon/training/native/worker/evidence/io.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/evidence/seal.d.ts +0 -3
- package/dist/runtime/daimon/training/native/worker/evidence/seal.js +0 -67
- package/dist/runtime/daimon/training/native/worker/evidence/seal.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/index.d.ts +0 -11
- package/dist/runtime/daimon/training/native/worker/index.js +0 -8
- package/dist/runtime/daimon/training/native/worker/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/profile.d.ts +0 -23
- package/dist/runtime/daimon/training/native/worker/profile.js +0 -149
- package/dist/runtime/daimon/training/native/worker/profile.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/public.d.ts +0 -53
- package/dist/runtime/daimon/training/native/worker/public.js +0 -22
- package/dist/runtime/daimon/training/native/worker/public.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/sandbox.d.ts +0 -4
- package/dist/runtime/daimon/training/native/worker/sandbox.js +0 -54
- package/dist/runtime/daimon/training/native/worker/sandbox.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/server.d.ts +0 -4
- package/dist/runtime/daimon/training/native/worker/server.js +0 -102
- package/dist/runtime/daimon/training/native/worker/server.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/types.d.ts +0 -318
- package/dist/runtime/daimon/training/native/worker/types.js +0 -2
- package/dist/runtime/daimon/training/native/worker/types.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/wake-delivery/index.d.ts +0 -4
- package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js +0 -4
- package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/wake-delivery/source.d.ts +0 -3
- package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js +0 -16
- package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.d.ts +0 -4
- package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js +0 -52
- package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.d.ts +0 -21
- package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js +0 -198
- package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/wake-delivery/types.d.ts +0 -91
- package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js +0 -2
- package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js.map +0 -1
- package/dist/runtime/daimon/training/native/worker/worker.d.ts +0 -1
- package/dist/runtime/daimon/training/native/worker/worker.js +0 -105
- package/dist/runtime/daimon/training/native/worker/worker.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/broker.d.ts +0 -20
- package/dist/runtime/daimon/training/providers/grok-broker/broker.js +0 -55
- package/dist/runtime/daimon/training/providers/grok-broker/broker.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.d.ts +0 -15
- package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js +0 -29
- package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/grant-home.d.ts +0 -16
- package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js +0 -60
- package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.d.ts +0 -81
- package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js +0 -221
- package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.d.ts +0 -31
- package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js +0 -78
- package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/grants.d.ts +0 -63
- package/dist/runtime/daimon/training/providers/grok-broker/grants.js +0 -20
- package/dist/runtime/daimon/training/providers/grok-broker/grants.js.map +0 -1
- package/dist/runtime/daimon/training/providers/grok-broker/index.d.ts +0 -3
- package/dist/runtime/daimon/training/providers/grok-broker/index.js +0 -4
- package/dist/runtime/daimon/training/providers/grok-broker/index.js.map +0 -1
- package/dist/runtime/daimon/training/public.d.ts +0 -6
- package/dist/runtime/daimon/training/public.js +0 -5
- package/dist/runtime/daimon/training/public.js.map +0 -1
- package/dist/runtime/daimon/training/services/account-lease.d.ts +0 -7
- package/dist/runtime/daimon/training/services/account-lease.js +0 -76
- package/dist/runtime/daimon/training/services/account-lease.js.map +0 -1
- package/dist/runtime/daimon/training/services/freshness.d.ts +0 -15
- package/dist/runtime/daimon/training/services/freshness.js +0 -19
- package/dist/runtime/daimon/training/services/freshness.js.map +0 -1
- package/dist/runtime/daimon/training/services/index.d.ts +0 -4
- package/dist/runtime/daimon/training/services/index.js +0 -4
- package/dist/runtime/daimon/training/services/index.js.map +0 -1
- package/dist/runtime/daimon/training/services/slot-freshness.d.ts +0 -34
- package/dist/runtime/daimon/training/services/slot-freshness.js +0 -178
- package/dist/runtime/daimon/training/services/slot-freshness.js.map +0 -1
- package/dist/runtime/daimon/wakeMoments.js.map +0 -1
- package/dist/runtime/pi/adapter.d.ts +0 -3
- package/dist/runtime/pi/adapter.js +0 -230
- package/dist/runtime/pi/appActivitySource.d.ts +0 -1
- package/dist/runtime/pi/appActivitySource.js +0 -199
- package/dist/runtime/pi/appAgentConfig.d.ts +0 -11
- package/dist/runtime/pi/appAgentConfig.js +0 -264
- package/dist/runtime/pi/appCliEnginesSource.d.ts +0 -1
- package/dist/runtime/pi/appCliEnginesSource.js +0 -183
- package/dist/runtime/pi/appCliSource.d.ts +0 -1
- package/dist/runtime/pi/appCliSource.js +0 -353
- package/dist/runtime/pi/appControlSource.d.ts +0 -1
- package/dist/runtime/pi/appControlSource.js +0 -390
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +0 -1
- package/dist/runtime/pi/appControlWakeIdentitySource.js +0 -19
- package/dist/runtime/pi/appCoreSource.d.ts +0 -4
- package/dist/runtime/pi/appCoreSource.js +0 -244
- package/dist/runtime/pi/appPreludeSource.d.ts +0 -1
- package/dist/runtime/pi/appPreludeSource.js +0 -192
- package/dist/runtime/pi/appScheduleSource.d.ts +0 -1
- package/dist/runtime/pi/appScheduleSource.js +0 -84
- package/dist/runtime/pi/appScriptedEngine.d.ts +0 -31
- package/dist/runtime/pi/appScriptedEngine.js +0 -42
- package/dist/runtime/pi/appSource.d.ts +0 -4
- package/dist/runtime/pi/appSource.js +0 -12
- package/dist/runtime/pi/appTemplate.d.ts +0 -14
- package/dist/runtime/pi/appTemplate.js +0 -28
- package/dist/runtime/pi/appTemplateTypes.d.ts +0 -64
- package/dist/runtime/pi/appTemplateTypes.js +0 -18
- package/dist/runtime/pi/appWakeContextSource.d.ts +0 -1
- package/dist/runtime/pi/appWakeContextSource.js +0 -398
- package/dist/runtime/pi/containerTargets.d.ts +0 -4
- package/dist/runtime/pi/containerTargets.js +0 -63
- package/dist/runtime/pi/runAuth.d.ts +0 -2
- package/dist/runtime/pi/runAuth.js +0 -185
- package/dist/runtime/pi/testHelpers.d.ts +0 -2
- package/dist/shared/errors.js.map +0 -1
- package/dist/training/subjects/environment.d.ts +0 -2
- package/dist/training/subjects/environment.js +0 -14
- package/dist/training/subjects/environment.js.map +0 -1
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/index.d.ts +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/index.js +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/protocol.d.ts +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/protocol.js +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/provider.d.ts +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/provider.js +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/strict-schema.d.ts +0 -0
- /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/strict-schema.js +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
|
|
2
|
+
import { type DaimonGatewayedDescriptor } from "../runtime/daimon/gateway.js";
|
|
3
|
+
import { DAIMON_GATEWAY_UID } from "../runtime/daimon/runtimeIdentity.js";
|
|
4
|
+
export { DAIMON_GATEWAY_UID };
|
|
5
|
+
export declare const DAIMON_GATEWAY_STARTUP_TIMEOUT_SECONDS = 60;
|
|
6
|
+
/** Gatewayed engines this container's Daimon organization runs; empty means no gateway. */
|
|
7
|
+
export declare const resolveDaimonGatewayEngines: (plans: readonly RuntimeTargetPlan[]) => DaimonGatewayedDescriptor[];
|
|
8
|
+
/** Persistent realm volumes the gateway, not the organization uid, owns. */
|
|
9
|
+
export declare const resolveDaimonGatewayRealmPaths: (plans: readonly RuntimeTargetPlan[]) => string[];
|
|
10
|
+
/**
|
|
11
|
+
* Root provisioning of the gateway's private state, before any engine process
|
|
12
|
+
* starts: the digest-only key table and config under `root:<gateway> 0440`,
|
|
13
|
+
* each realm re-owned to the gateway uid at `0700`, and a gateway-owned copy of
|
|
14
|
+
* each bootstrap leaf, whose bind mount sits under a root-only directory the
|
|
15
|
+
* organization uid cannot reach. Reads the key from `$daimon_gateway_key`.
|
|
16
|
+
* Root holds `CAP_CHOWN` and `CAP_DAC_READ_SEARCH` but not `CAP_FOWNER`, so
|
|
17
|
+
* every chmod happens while root owns the path. Shared by the in-container
|
|
18
|
+
* placement and the training sidecar (`host` is the only difference).
|
|
19
|
+
*/
|
|
20
|
+
export declare const renderDaimonGatewayStateProvisioning: (descriptors: readonly DaimonGatewayedDescriptor[], host?: string) => string[];
|
|
21
|
+
/**
|
|
22
|
+
* The organization's gateway placement, decided at boot. With
|
|
23
|
+
* `DAIMON_GATEWAY_URL` (and its key) in the container environment, an external
|
|
24
|
+
* gateway (the training sidecar) serves this organization: nothing is
|
|
25
|
+
* provisioned, no gateway starts and no realm is mounted. Otherwise root
|
|
26
|
+
* generates a fresh 32-byte key per start (so no key exists in the image or the
|
|
27
|
+
* compile output) and provisions the in-container gateway. Either way the
|
|
28
|
+
* runtime gets the same two variables: one agent contract.
|
|
29
|
+
*/
|
|
30
|
+
export declare const renderDaimonGatewayProvisioning: (plans: readonly RuntimeTargetPlan[]) => string[];
|
|
31
|
+
/**
|
|
32
|
+
* Starts the gateway as its own uid with no capabilities, after proving the
|
|
33
|
+
* organization uid (and a broker uid) cannot read any gateway-held path, then waits for its uid,
|
|
34
|
+
* bounding set and loopback port. Uses the shared startup supervision helpers.
|
|
35
|
+
*/
|
|
36
|
+
export declare const renderDaimonGatewayLaunch: (plans: readonly RuntimeTargetPlan[], runtimeRoot: string) => string[];
|
|
37
|
+
/** Env assignments prefixed onto the organization runtime launch; empty without a gateway. */
|
|
38
|
+
export declare const renderDaimonGatewayRuntimeEnv: (plans: readonly RuntimeTargetPlan[]) => string;
|
|
39
|
+
/** The training sidecar answers on its run's private network under this alias. */
|
|
40
|
+
export declare const DAIMON_GATEWAY_SIDECAR_ALIAS = "daimon-gateway";
|
|
41
|
+
export declare const DAIMON_GATEWAY_SIDECAR_URL = "http://daimon-gateway:43200";
|
|
42
|
+
/** Env name carrying the run's 64-hex gateway key into the sidecar's root shell; unset before anything else starts. */
|
|
43
|
+
export declare const DAIMON_GATEWAY_SIDECAR_KEY_ENV = "SPAWNFILE_DAIMON_GATEWAY_KEY";
|
|
44
|
+
/**
|
|
45
|
+
* Root script for the sidecar placement: the same binary, state provisioning
|
|
46
|
+
* and uid as the in-container gateway, bound to the run's private network
|
|
47
|
+
* instead of loopback, with the run's key supplied rather than generated.
|
|
48
|
+
* Trials reach it at {@link DAIMON_GATEWAY_SIDECAR_URL} with that key.
|
|
49
|
+
*/
|
|
50
|
+
export declare const renderDaimonGatewaySidecarScript: (engines: readonly string[], runtimeRoot: string) => string;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_CONFIG, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_KEY_ENV, DAIMON_GATEWAY_KEY_TABLE, DAIMON_GATEWAY_KEY_TABLE_VERSION, DAIMON_GATEWAY_PORT, DAIMON_GATEWAY_PRINCIPAL, DAIMON_GATEWAY_RUN, DAIMON_GATEWAY_URL, DAIMON_GATEWAY_URL_ENV, DAIMON_GATEWAY_HOST, daimonGatewayBootstrapCopyPath, daimonGatewayBootstrapMountPath, daimonGatewayedEngines, daimonGatewayRealmPath, daimonGatewayRefreshScratchPath, renderDaimonGatewayConfig } from "../runtime/daimon/gateway.js";
|
|
3
|
+
import { DAIMON_BROKER_UID, DAIMON_GATEWAY_UID, DAIMON_ORGANIZATION_UID } from "../runtime/daimon/runtimeIdentity.js";
|
|
4
|
+
export { DAIMON_GATEWAY_UID };
|
|
5
|
+
export const DAIMON_GATEWAY_STARTUP_TIMEOUT_SECONDS = 60;
|
|
6
|
+
/** Root-shell variable holding this start's key; never exported, passed only to the runtime launch. */
|
|
7
|
+
const KEY_VARIABLE = "daimon_gateway_key";
|
|
8
|
+
/** Root-shell variable holding the gateway URL this start hands the runtime. */
|
|
9
|
+
const URL_VARIABLE = "daimon_gateway_url";
|
|
10
|
+
/** `1` when an external gateway was supplied at boot. */
|
|
11
|
+
const EXTERNAL_VARIABLE = "daimon_gateway_external";
|
|
12
|
+
const drop = (uid) => `setpriv --clear-groups --reuid ${uid} --regid ${uid} --inh-caps=-all --ambient-caps=-all --bounding-set=-all --`;
|
|
13
|
+
/** Gatewayed engines this container's Daimon organization runs; empty means no gateway. */
|
|
14
|
+
export const resolveDaimonGatewayEngines = (plans) => daimonGatewayedEngines(plans.filter((plan) => plan.runtimeName === "daimon")
|
|
15
|
+
.flatMap((plan) => Object.values(plan.engineByNodeId ?? {})));
|
|
16
|
+
/** Persistent realm volumes the gateway, not the organization uid, owns. */
|
|
17
|
+
export const resolveDaimonGatewayRealmPaths = (plans) => resolveDaimonGatewayEngines(plans).map(daimonGatewayRealmPath);
|
|
18
|
+
/**
|
|
19
|
+
* Root provisioning of the gateway's private state, before any engine process
|
|
20
|
+
* starts: the digest-only key table and config under `root:<gateway> 0440`,
|
|
21
|
+
* each realm re-owned to the gateway uid at `0700`, and a gateway-owned copy of
|
|
22
|
+
* each bootstrap leaf, whose bind mount sits under a root-only directory the
|
|
23
|
+
* organization uid cannot reach. Reads the key from `$daimon_gateway_key`.
|
|
24
|
+
* Root holds `CAP_CHOWN` and `CAP_DAC_READ_SEARCH` but not `CAP_FOWNER`, so
|
|
25
|
+
* every chmod happens while root owns the path. Shared by the in-container
|
|
26
|
+
* placement and the training sidecar (`host` is the only difference).
|
|
27
|
+
*/
|
|
28
|
+
export const renderDaimonGatewayStateProvisioning = (descriptors, host = DAIMON_GATEWAY_HOST) => {
|
|
29
|
+
const realms = descriptors.map((descriptor) => ({
|
|
30
|
+
bootstrap: daimonGatewayBootstrapMountPath(descriptor.auth.realm),
|
|
31
|
+
copy: daimonGatewayBootstrapCopyPath(descriptor.auth.realm),
|
|
32
|
+
durable: daimonGatewayRealmPath(descriptor),
|
|
33
|
+
maxBytes: descriptor.auth.realm.maxCredentialBytes,
|
|
34
|
+
scratch: daimonGatewayRefreshScratchPath(descriptor) ?? null
|
|
35
|
+
}));
|
|
36
|
+
const program = [
|
|
37
|
+
"const crypto = require('node:crypto'); const fs = require('node:fs'); const { constants } = fs;",
|
|
38
|
+
`const gateway = ${DAIMON_GATEWAY_UID}; const realms = ${JSON.stringify(realms)};`,
|
|
39
|
+
`const key = process.env.SPAWNFILE_DAIMON_GATEWAY_KEY ?? ''; if (!/^[0-9a-f]{64}$/.test(key)) throw new Error('gateway key generation failed');`,
|
|
40
|
+
"const privateWrite = (target, bytes, mode, uid, gid) => { const fd = fs.openSync(target, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600); try { let written = 0; while (written < bytes.length) written += fs.writeSync(fd, bytes, written, bytes.length - written, written); fs.fchmodSync(fd, mode); fs.fchownSync(fd, uid, gid); fs.fsyncSync(fd); } finally { fs.closeSync(fd); } };",
|
|
41
|
+
`const table = { version: '${DAIMON_GATEWAY_KEY_TABLE_VERSION}', keys: { [crypto.createHash('sha256').update(key, 'utf8').digest('hex')]: { agent_id: '${DAIMON_GATEWAY_PRINCIPAL}', engines: ${JSON.stringify(descriptors.map(({ id }) => id))} } } };`,
|
|
42
|
+
`privateWrite('${DAIMON_GATEWAY_KEY_TABLE}', Buffer.from(JSON.stringify(table) + '\\n'), 0o440, 0, gateway);`,
|
|
43
|
+
`privateWrite('${DAIMON_GATEWAY_CONFIG}', Buffer.from(${JSON.stringify(renderDaimonGatewayConfig(descriptors, host))}), 0o440, 0, gateway);`,
|
|
44
|
+
"for (const realm of realms) {",
|
|
45
|
+
" const info = fs.lstatSync(realm.durable); if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('gateway realm is not a directory');",
|
|
46
|
+
" fs.chownSync(realm.durable, 0, 0); fs.chmodSync(realm.durable, 0o700);",
|
|
47
|
+
// Re-own the whole tree: a migrated broker realm also holds its legacy journal and turn directories.
|
|
48
|
+
" const reown = (target) => { for (const name of fs.readdirSync(target)) { const entry = `${target}/${name}`, stat = fs.lstatSync(entry); if (stat.isDirectory()) { fs.chownSync(entry, 0, 0); fs.chmodSync(entry, stat.mode & 0o700); reown(entry); } else if (!stat.isFile() || stat.nlink !== 1) throw new Error('gateway realm holds an unsafe entry'); else { fs.chownSync(entry, 0, 0); fs.chmodSync(entry, stat.mode & 0o700); } fs.chownSync(entry, gateway, gateway); } };",
|
|
49
|
+
" reown(realm.durable); fs.chownSync(realm.durable, gateway, gateway);",
|
|
50
|
+
" if (realm.scratch !== null) { fs.mkdirSync(realm.scratch, { mode: 0o700 }); fs.chownSync(realm.scratch, gateway, gateway); }",
|
|
51
|
+
" let source; try { source = fs.lstatSync(realm.bootstrap); } catch (error) { if (error.code !== 'ENOENT') throw error; }",
|
|
52
|
+
" if (source === undefined) continue;",
|
|
53
|
+
" if (!source.isFile() || source.size < 2 || source.size > realm.maxBytes) throw new Error('gateway bootstrap leaf is unsafe');",
|
|
54
|
+
" const fd = fs.openSync(realm.bootstrap, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK); let bytes; try { const opened = fs.fstatSync(fd); if (opened.dev !== source.dev || opened.ino !== source.ino) throw new Error('gateway bootstrap leaf changed'); bytes = fs.readFileSync(fd); } finally { fs.closeSync(fd); }",
|
|
55
|
+
" try { privateWrite(realm.copy, bytes, 0o600, gateway, gateway); } finally { bytes.fill(0); }",
|
|
56
|
+
"}"
|
|
57
|
+
].join("\n");
|
|
58
|
+
return [
|
|
59
|
+
`if [ -d ${DAIMON_GATEWAY_ETC} ]; then chmod u+rwx ${DAIMON_GATEWAY_ETC}; fi`,
|
|
60
|
+
`if [ -d ${DAIMON_GATEWAY_RUN} ]; then chmod u+rwx ${DAIMON_GATEWAY_RUN}; fi`,
|
|
61
|
+
`rm -rf ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`,
|
|
62
|
+
`install -d -o root -g root -m 0700 ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`,
|
|
63
|
+
`if [ ! -d ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} ]; then install -d -o root -g root -m 0700 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}; fi`,
|
|
64
|
+
`test -d ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} && test ! -L ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}`,
|
|
65
|
+
`chown 0:0 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} && chmod 0700 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}`,
|
|
66
|
+
`SPAWNFILE_DAIMON_GATEWAY_KEY="$${KEY_VARIABLE}" node <<'SPAWNFILE_DAIMON_GATEWAY_PROVISION'`,
|
|
67
|
+
program,
|
|
68
|
+
"SPAWNFILE_DAIMON_GATEWAY_PROVISION",
|
|
69
|
+
`chmod 0750 ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN} && chown 0:${DAIMON_GATEWAY_UID} ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`
|
|
70
|
+
];
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The organization's gateway placement, decided at boot. With
|
|
74
|
+
* `DAIMON_GATEWAY_URL` (and its key) in the container environment, an external
|
|
75
|
+
* gateway (the training sidecar) serves this organization: nothing is
|
|
76
|
+
* provisioned, no gateway starts and no realm is mounted. Otherwise root
|
|
77
|
+
* generates a fresh 32-byte key per start (so no key exists in the image or the
|
|
78
|
+
* compile output) and provisions the in-container gateway. Either way the
|
|
79
|
+
* runtime gets the same two variables: one agent contract.
|
|
80
|
+
*/
|
|
81
|
+
export const renderDaimonGatewayProvisioning = (plans) => {
|
|
82
|
+
const descriptors = resolveDaimonGatewayEngines(plans);
|
|
83
|
+
if (descriptors.length === 0)
|
|
84
|
+
return [];
|
|
85
|
+
return [
|
|
86
|
+
`if [ -n "\${${DAIMON_GATEWAY_URL_ENV}:-}" ]; then`,
|
|
87
|
+
` ${EXTERNAL_VARIABLE}=1 ${URL_VARIABLE}=$${DAIMON_GATEWAY_URL_ENV}`,
|
|
88
|
+
` ${KEY_VARIABLE}=\${${DAIMON_GATEWAY_KEY_ENV}:?${DAIMON_GATEWAY_KEY_ENV} must accompany ${DAIMON_GATEWAY_URL_ENV}}`,
|
|
89
|
+
// Only the runtime and broker launches below get them, as with the in-container gateway.
|
|
90
|
+
` export -n ${DAIMON_GATEWAY_URL_ENV} ${DAIMON_GATEWAY_KEY_ENV}`,
|
|
91
|
+
"else",
|
|
92
|
+
` ${EXTERNAL_VARIABLE}=0 ${URL_VARIABLE}=${DAIMON_GATEWAY_URL}`,
|
|
93
|
+
// Rotated every start: 32 random bytes as lowercase hex, held only in this root shell.
|
|
94
|
+
` ${KEY_VARIABLE}=$(od -An -vtx1 -N32 /dev/urandom | tr -d ' \\n')`,
|
|
95
|
+
...renderDaimonGatewayStateProvisioning(descriptors),
|
|
96
|
+
"fi"
|
|
97
|
+
];
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Starts the gateway as its own uid with no capabilities, after proving the
|
|
101
|
+
* organization uid (and a broker uid) cannot read any gateway-held path, then waits for its uid,
|
|
102
|
+
* bounding set and loopback port. Uses the shared startup supervision helpers.
|
|
103
|
+
*/
|
|
104
|
+
export const renderDaimonGatewayLaunch = (plans, runtimeRoot) => {
|
|
105
|
+
const descriptors = resolveDaimonGatewayEngines(plans);
|
|
106
|
+
if (descriptors.length === 0)
|
|
107
|
+
return [];
|
|
108
|
+
const realmPaths = descriptors.map(daimonGatewayRealmPath);
|
|
109
|
+
const hidden = [...realmPaths, DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN];
|
|
110
|
+
// Neither the organization uid nor a broker (which reaches the gateway only by key) may read the login.
|
|
111
|
+
const outsiders = [DAIMON_ORGANIZATION_UID, ...(descriptors.some((descriptor) => descriptor.broker !== null) ? [DAIMON_BROKER_UID] : [])];
|
|
112
|
+
return [
|
|
113
|
+
`if [ "$${EXTERNAL_VARIABLE}" = 0 ]; then`,
|
|
114
|
+
...outsiders.flatMap((uid) => hidden.map((target) => `${drop(uid)} bash -ceu '! test -r ${target} && ! test -x ${target}'`)),
|
|
115
|
+
...realmPaths.map((target) => `${drop(DAIMON_GATEWAY_UID)} bash -ceu 'probe=${target}/.daimon-gateway-probe; umask 077; : > "$probe"; rm "$probe"'`),
|
|
116
|
+
`${drop(DAIMON_GATEWAY_UID)} env -i PATH="$PATH" HOME=/nonexistent LANG=C.UTF-8 ${path.posix.join(runtimeRoot, "bin/daimon-runtime")} gateway --config ${DAIMON_GATEWAY_CONFIG} &`,
|
|
117
|
+
"gateway_pid=$!",
|
|
118
|
+
"startup_children+=(\"$gateway_pid\")",
|
|
119
|
+
`wait_for_broker_identity "$gateway_pid" ${DAIMON_GATEWAY_UID} 0000000000000000 "auth gateway"`,
|
|
120
|
+
"until (exec 3<>/dev/tcp/127.0.0.1/" + DAIMON_GATEWAY_PORT + ") 2>/dev/null; do",
|
|
121
|
+
" if ! kill -0 \"$gateway_pid\" 2>/dev/null; then echo \"auth gateway exited before readiness\" >&2; exit 1; fi",
|
|
122
|
+
" if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"auth gateway readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; exit 1; fi",
|
|
123
|
+
" sleep \"$broker_startup_poll_seconds\"",
|
|
124
|
+
"done",
|
|
125
|
+
"fi"
|
|
126
|
+
];
|
|
127
|
+
};
|
|
128
|
+
/** Env assignments prefixed onto the organization runtime launch; empty without a gateway. */
|
|
129
|
+
export const renderDaimonGatewayRuntimeEnv = (plans) => resolveDaimonGatewayEngines(plans).length === 0
|
|
130
|
+
? ""
|
|
131
|
+
: `${DAIMON_GATEWAY_URL_ENV}="$${URL_VARIABLE}" ${DAIMON_GATEWAY_KEY_ENV}="$${KEY_VARIABLE}" `;
|
|
132
|
+
/** The training sidecar answers on its run's private network under this alias. */
|
|
133
|
+
export const DAIMON_GATEWAY_SIDECAR_ALIAS = "daimon-gateway";
|
|
134
|
+
export const DAIMON_GATEWAY_SIDECAR_URL = `http://${DAIMON_GATEWAY_SIDECAR_ALIAS}:${DAIMON_GATEWAY_PORT}`;
|
|
135
|
+
/** Env name carrying the run's 64-hex gateway key into the sidecar's root shell; unset before anything else starts. */
|
|
136
|
+
export const DAIMON_GATEWAY_SIDECAR_KEY_ENV = "SPAWNFILE_DAIMON_GATEWAY_KEY";
|
|
137
|
+
/**
|
|
138
|
+
* Root script for the sidecar placement: the same binary, state provisioning
|
|
139
|
+
* and uid as the in-container gateway, bound to the run's private network
|
|
140
|
+
* instead of loopback, with the run's key supplied rather than generated.
|
|
141
|
+
* Trials reach it at {@link DAIMON_GATEWAY_SIDECAR_URL} with that key.
|
|
142
|
+
*/
|
|
143
|
+
export const renderDaimonGatewaySidecarScript = (engines, runtimeRoot) => {
|
|
144
|
+
const descriptors = daimonGatewayedEngines(engines);
|
|
145
|
+
if (descriptors.length === 0)
|
|
146
|
+
throw new Error("the auth gateway sidecar needs at least one gatewayed engine");
|
|
147
|
+
return [
|
|
148
|
+
"set -euo pipefail",
|
|
149
|
+
`if ! getent group ${DAIMON_GATEWAY_UID} >/dev/null; then groupadd -K GID_MIN=1 --gid ${DAIMON_GATEWAY_UID} daimon-${DAIMON_GATEWAY_UID}; fi`,
|
|
150
|
+
`if ! getent passwd ${DAIMON_GATEWAY_UID} >/dev/null; then useradd -K UID_MIN=1 --no-create-home --no-log-init --uid ${DAIMON_GATEWAY_UID} --gid ${DAIMON_GATEWAY_UID} --home-dir /nonexistent --shell /usr/sbin/nologin daimon-${DAIMON_GATEWAY_UID}; fi`,
|
|
151
|
+
`${KEY_VARIABLE}=\${${DAIMON_GATEWAY_SIDECAR_KEY_ENV}:?the gateway sidecar needs its run key}`,
|
|
152
|
+
`unset ${DAIMON_GATEWAY_SIDECAR_KEY_ENV}`,
|
|
153
|
+
...renderDaimonGatewayStateProvisioning(descriptors, "0.0.0.0"),
|
|
154
|
+
`unset ${KEY_VARIABLE}`,
|
|
155
|
+
`exec ${drop(DAIMON_GATEWAY_UID)} env -i PATH="$PATH" HOME=/nonexistent LANG=C.UTF-8 ${path.posix.join(runtimeRoot, "bin/daimon-runtime")} gateway --config ${DAIMON_GATEWAY_CONFIG}`
|
|
156
|
+
].join("\n") + "\n";
|
|
157
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DaimonGrokRegistration
|
|
1
|
+
import { type DaimonGrokRegistration } from "./containerDaimonGrokWorkerRender.js";
|
|
2
2
|
/**
|
|
3
3
|
* Root provisioning for every brokered Grok worker, as lines of the broker's
|
|
4
4
|
* node provisioning program (which already defines `crypto`, `fs`, and
|
|
@@ -18,15 +18,7 @@ import { type DaimonGrokRegistration, type DaimonGrokServiceConfigOptions } from
|
|
|
18
18
|
* the wrong inode. Root chmods only paths it owns at that moment (no
|
|
19
19
|
* `CAP_FOWNER`): reclaim, mode, then hand over.
|
|
20
20
|
*/
|
|
21
|
-
export declare const renderDaimonGrokWorkerProvisioning: (registrations: readonly DaimonGrokRegistration[]
|
|
22
|
-
/**
|
|
23
|
-
* Deny targets this program creates root-owned `0700` when they are absent,
|
|
24
|
-
* so every mask always has an inode. The default is the production
|
|
25
|
-
* container's set; the training container passes its own, because its roots
|
|
26
|
-
* are tmpfs mounts and `/run/secrets` and the shared state roots do not
|
|
27
|
-
* exist there at all.
|
|
28
|
-
*/
|
|
29
|
-
optionalDenyPaths?: readonly string[], scope?: "container" | "slot") => string[];
|
|
21
|
+
export declare const renderDaimonGrokWorkerProvisioning: (registrations: readonly DaimonGrokRegistration[]) => string[];
|
|
30
22
|
/**
|
|
31
23
|
* Grok 1.0.34 runs every sandbox profile inside bubblewrap, which needs
|
|
32
24
|
* unprivileged user namespaces. Ubuntu 24.04+ hosts (and Colima's default VM)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { renderDaimonGrokTaskClockProvisioning } from "./containerDaimonGrokTaskClock.js";
|
|
2
1
|
import { DAIMON_GROK_ENGINE_BROKER } from "../runtime/daimon/contractManifest.js";
|
|
3
|
-
import {
|
|
2
|
+
import { resolveDaimonGrokWorkerConfig } from "../runtime/daimon/grokWorkerContract.js";
|
|
4
3
|
import { DAIMON_BROKER_UID, DAIMON_ORGANIZATION_UID } from "../runtime/daimon/runtimeIdentity.js";
|
|
5
4
|
import { DAIMON_GROK_DENIED_STATE_ROOTS, DAIMON_GROK_OPTIONAL_DENY_PATHS, DAIMON_GROK_WORKER_READ_ONLY_FILES, DAIMON_WORKER_ROOT, renderDaimonGrokServiceConfig } from "./containerDaimonGrokWorkerRender.js";
|
|
6
5
|
/** Only the bytes the program writes; everything else it needs is recomputed or checked in place. */
|
|
@@ -64,22 +63,12 @@ const renderDaimonGrokWorkerSkillsProvisioning = (registrations) => registration
|
|
|
64
63
|
* the wrong inode. Root chmods only paths it owns at that moment (no
|
|
65
64
|
* `CAP_FOWNER`): reclaim, mode, then hand over.
|
|
66
65
|
*/
|
|
67
|
-
export const renderDaimonGrokWorkerProvisioning = (registrations
|
|
68
|
-
/**
|
|
69
|
-
* Deny targets this program creates root-owned `0700` when they are absent,
|
|
70
|
-
* so every mask always has an inode. The default is the production
|
|
71
|
-
* container's set; the training container passes its own, because its roots
|
|
72
|
-
* are tmpfs mounts and `/run/secrets` and the shared state roots do not
|
|
73
|
-
* exist there at all.
|
|
74
|
-
*/
|
|
75
|
-
optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_STATE_ROOTS], scope = "container") => [
|
|
66
|
+
export const renderDaimonGrokWorkerProvisioning = (registrations) => [
|
|
76
67
|
`const grokWorkers = ${JSON.stringify(registrations.map(programRegistration))};`,
|
|
77
|
-
`
|
|
68
|
+
// Deny targets created root-owned `0700` when absent, so every mask always has an inode.
|
|
69
|
+
`const optionalDenyPaths = new Set(${JSON.stringify([...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_STATE_ROOTS])});`,
|
|
78
70
|
// Derive each expected hash from manifest-validated bytes, never from the registration's digest.
|
|
79
|
-
|
|
80
|
-
`const pinnedConfigSha256 = ${JSON.stringify(registrations.map(entry => (entry.configVariant === "clocked"
|
|
81
|
-
? resolveDaimonGrokClockedWorkerConfig(entry.model, entry.reasoningEffort, entry.slot)
|
|
82
|
-
: resolveDaimonGrokWorkerConfig(entry.model, entry.reasoningEffort)).sha256))};`,
|
|
71
|
+
`const pinnedConfigSha256 = ${JSON.stringify(registrations.map(entry => resolveDaimonGrokWorkerConfig(entry.model, entry.reasoningEffort).sha256))};`,
|
|
83
72
|
"const sha256Hex = (value) => crypto.createHash('sha256').update(value).digest('hex');",
|
|
84
73
|
"for (const [index, entry] of grokWorkers.entries()) { if (sha256Hex(entry.config) !== entry.configSha256 || pinnedConfigSha256[index] !== entry.configSha256 || sha256Hex(entry.profile) !== entry.profileSha256 || entry.denyPaths.length === 0) throw new Error(`Grok worker contract bytes for ${entry.agentId} do not match their pins`); }",
|
|
85
74
|
// Root holds no CAP_FOWNER: every mode change reclaims the inode, sets the mode, then restores or hands over ownership.
|
|
@@ -92,19 +81,18 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
|
|
|
92
81
|
"const ensureDirectory = (target, uid, gid, mode) => { fs.mkdirSync(target, { recursive: true, mode: 0o700 }); const info = fs.lstatSync(target); if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('unsafe worker runtime directory'); fs.chownSync(target, 0, 0); fs.chmodSync(target, mode); fs.chownSync(target, uid, gid); };",
|
|
93
82
|
"const ensureExactFile = (target, content, mode) => { let info; try { info = fs.lstatSync(target); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.writeFileSync(target, content, { mode, flag: 'wx' }); info = fs.lstatSync(target); } if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1) throw new Error('unsafe worker runtime file'); if (fs.readFileSync(target, 'utf8') !== content) throw new Error(`worker runtime file identity mismatch: ${target}`); fs.chownSync(target, 0, 0); fs.chmodSync(target, mode); };",
|
|
94
83
|
`const ensureEventsFile = (target, uid) => { let info; try { info = fs.lstatSync(target); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.writeFileSync(target, '', { mode: 0o640, flag: 'wx' }); info = fs.lstatSync(target); } if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1 || (info.uid !== uid && info.uid !== 0) || ![0, uid, ${DAIMON_BROKER_UID}].includes(info.gid) || ![0o600, 0o640, 0o644].includes(info.mode & 0o777)) throw new Error('unsafe worker attestation events'); fs.chownSync(target, 0, 0); fs.chmodSync(target, 0o640); fs.chownSync(target, uid, ${DAIMON_BROKER_UID}); };`,
|
|
95
|
-
|
|
96
|
-
...(scope === "slot" ? [] : [`fs.mkdirSync('${DAIMON_WORKER_ROOT}', { recursive: true, mode: 0o711 }); fs.chownSync('${DAIMON_WORKER_ROOT}', 0, 0); fs.chmodSync('${DAIMON_WORKER_ROOT}', 0o711); assertCanonical('${DAIMON_WORKER_ROOT}', 'worker root');`]),
|
|
84
|
+
`fs.mkdirSync('${DAIMON_WORKER_ROOT}', { recursive: true, mode: 0o711 }); fs.chownSync('${DAIMON_WORKER_ROOT}', 0, 0); fs.chmodSync('${DAIMON_WORKER_ROOT}', 0o711); assertCanonical('${DAIMON_WORKER_ROOT}', 'worker root');`,
|
|
97
85
|
// Pass 1: every workspace and home exists, root-held, before any deny list is checked.
|
|
98
|
-
`for (const entry of grokWorkers) { traversable(entry.workspace); secureWorkspace(entry.workspace, entry.uid); assertCanonical(entry.workspace, 'workspace');
|
|
86
|
+
`for (const entry of grokWorkers) { traversable(entry.workspace); secureWorkspace(entry.workspace, entry.uid); assertCanonical(entry.workspace, 'workspace'); ensureDirectory(entry.home, 0, 0, 0o700); ensureDirectory(entry.grokHome, 0, 0, 0o700); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, 0, 0o700); for (const target of [entry.home, entry.grokHome]) assertCanonical(target, 'home'); }`,
|
|
99
87
|
"for (const denied of optionalDenyPaths) { try { fs.lstatSync(denied); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.mkdirSync(denied, { mode: 0o700 }); fs.chownSync(denied, 0, 0); fs.chmodSync(denied, 0o700); } }",
|
|
100
88
|
"for (const entry of grokWorkers) for (const denied of entry.denyPaths) { try { assertCanonical(denied, 'deny path'); } catch (error) { if (error.code === 'ENOENT' && entry.deferredDenyPaths.includes(denied)) continue; if (error.code === 'ENOENT') throw new Error(`Grok worker deny path is missing: ${denied}`); throw error; } }",
|
|
101
89
|
...renderDaimonGrokWorkerSkillsProvisioning(registrations),
|
|
102
90
|
// Pass 2: exact root-owned read-only files, the events file, then the final sticky modes.
|
|
103
|
-
`for (const entry of grokWorkers) { ensureExactFile(\`\${entry.grokHome}/config.toml\`, entry.config, 0o444); ensureExactFile(entry.profilePath, entry.profile, 0o444); for (const name of ${JSON.stringify(DAIMON_GROK_WORKER_READ_ONLY_FILES.filter((name) => name !== "config.toml" && name !== "sandbox.toml"))}) ensureExactFile(\`\${entry.grokHome}/\${name}\`, '', 0o444); ensureEventsFile(entry.eventsPath, entry.uid); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, entry.uid, 0o1771); ensureDirectory(entry.grokHome, 0, entry.uid, 0o1771);
|
|
91
|
+
`for (const entry of grokWorkers) { ensureExactFile(\`\${entry.grokHome}/config.toml\`, entry.config, 0o444); ensureExactFile(entry.profilePath, entry.profile, 0o444); for (const name of ${JSON.stringify(DAIMON_GROK_WORKER_READ_ONLY_FILES.filter((name) => name !== "config.toml" && name !== "sandbox.toml"))}) ensureExactFile(\`\${entry.grokHome}/\${name}\`, '', 0o444); ensureEventsFile(entry.eventsPath, entry.uid); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, entry.uid, 0o1771); ensureDirectory(entry.grokHome, 0, entry.uid, 0o1771); ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700); ensureDirectory(entry.home, entry.uid, ${DAIMON_BROKER_UID}, 0o710); for (const target of [entry.profilePath, entry.eventsPath, \`\${entry.grokHome}/config.toml\`]) assertCanonical(target, 'home file'); }`,
|
|
104
92
|
// Worker-private temp: the launcher compiles TMPDIR=<home>/tmp, the only temp the worker may write. It is
|
|
105
93
|
// created in the pass above, while the home is still root-owned: root here holds no CAP_DAC_OVERRIDE, so
|
|
106
94
|
// once the home is `<worker>:<broker> 0710` root can no longer create anything inside it.
|
|
107
|
-
`for (const entry of grokWorkers) {
|
|
95
|
+
`for (const entry of grokWorkers) { ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700); assertCanonical(entry.privateTmp, 'private temp'); }`,
|
|
108
96
|
// Spills: <runtimeHome>/tool-output 2000:<worker> 2750 (setgid) under a runtime home the worker's group can
|
|
109
97
|
// traverse. Root reclaims the runtime home before creating the spill directory: the compiler lists every
|
|
110
98
|
// organization runtime home as a private directory, so the container's ownership pass has already handed
|
|
@@ -113,7 +101,7 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
|
|
|
113
101
|
// `withMode` still narrows the home to its final `2000:<worker> 0710`, so the end state is unchanged.
|
|
114
102
|
`for (const entry of grokWorkers) { traversable(entry.runtimeHome); fs.mkdirSync(entry.runtimeHome, { recursive: true, mode: 0o700 }); assertCanonical(entry.runtimeHome, 'runtime home'); reclaimForRoot(entry.runtimeHome); try { fs.mkdirSync(entry.spillDirectory, { mode: 0o700 }); } catch (error) { if (error.code !== 'EEXIST') throw error; } assertCanonical(entry.spillDirectory, 'spill directory'); withMode(entry.spillDirectory, 0o2750, ${DAIMON_ORGANIZATION_UID}, entry.uid); for (const mounted of entry.runtimeHomeMounts) { assertCanonical(mounted, 'runtime home mount'); withMode(mounted, 0o700, ${DAIMON_ORGANIZATION_UID}, ${DAIMON_ORGANIZATION_UID}); } withMode(entry.runtimeHome, 0o710, ${DAIMON_ORGANIZATION_UID}, entry.uid); }`,
|
|
115
103
|
// Shared temp: Grok refuses a profile denying /tmp or /var/tmp, so modes close them: root:<org group> 1774 lets workers list names only.
|
|
116
|
-
|
|
104
|
+
`for (const shared of ${JSON.stringify(DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.paths)}) { fs.mkdirSync(shared, { recursive: true, mode: 0o1777 }); assertCanonical(shared, 'shared temp'); withMode(shared, 0o${DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.mode.toString(8)}, 0, ${DAIMON_ORGANIZATION_UID}); }`,
|
|
117
105
|
// Deny-path placement, asserted once every mode above is final. A resource backing the organization
|
|
118
106
|
// entrypoint only materializes later is created here, empty and root-owned, rather than skipped: the
|
|
119
107
|
// engine broker starts before that entrypoint runs and its own placement preflight refuses a deny target
|
|
@@ -131,9 +119,9 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
|
|
|
131
119
|
"const searches = (info, uid, gid) => info.uid === uid ? (info.mode & 0o100) !== 0 : info.gid === gid ? (info.mode & 0o010) !== 0 : (info.mode & 0o001) !== 0;",
|
|
132
120
|
"const assertPlaceable = (denied, uid, gid) => { const parts = denied.split('/').slice(1); let at = ''; for (const part of parts.slice(0, -1)) { at += `/${part}`; let info; try { info = fs.lstatSync(at); } catch (error) { throw new Error(`Grok worker deny path ${denied} is not placeable: ${at} could not be read (${error.code})`); } if (!info.isDirectory() || info.isSymbolicLink()) throw new Error(`Grok worker deny path ${denied} is not placeable: ${at} is not a directory`); if (!searches(info, uid, gid)) throw new Error(`Grok worker deny path ${denied} is not placeable: worker uid ${uid} cannot search ${at} (${(info.mode & 0o7777).toString(8)} ${info.uid}:${info.gid}); deny that directory itself instead`); } };",
|
|
133
121
|
"for (const entry of grokWorkers) for (const denied of entry.denyPaths) { if (entry.deferredDenyPaths.includes(denied)) { try { fs.lstatSync(denied); } catch (error) { if (error.code !== 'ENOENT') throw error; createDeferredDenyTarget(denied); } } assertPlaceable(denied, entry.uid, entry.uid); }",
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
122
|
+
`const service = ${JSON.stringify(renderDaimonGrokServiceConfig(registrations))};`,
|
|
123
|
+
"for (const registration of service.registrations) { const entry = grokWorkers.find((worker) => worker.slot === registration.slot); if (!entry || registration.profileSha256 !== sha256Hex(fs.readFileSync(entry.profilePath, 'utf8'))) throw new Error('Grok broker service registration does not match its provisioned profile'); }",
|
|
124
|
+
`fs.writeFileSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', \`\${JSON.stringify(service)}\\n\`, { mode: 0o440, flag: 'wx' }); fs.chownSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0, ${DAIMON_BROKER_UID}); fs.chmodSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0o440);`
|
|
137
125
|
];
|
|
138
126
|
const shellQuote = (value) => `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
139
127
|
/**
|
|
@@ -49,8 +49,6 @@ export interface DaimonGrokRegistration {
|
|
|
49
49
|
agentId: string;
|
|
50
50
|
config: string;
|
|
51
51
|
configSha256: string;
|
|
52
|
-
/** Selects trusted config bytes; production retains the unclocked default. */
|
|
53
|
-
configVariant?: "unclocked" | "clocked";
|
|
54
52
|
denyPaths: string[];
|
|
55
53
|
/** Deny entries the main entrypoint materializes after root provisioning (workspace resource backings); absent is allowed there, a symlink never. */
|
|
56
54
|
deferredDenyPaths: string[];
|
|
@@ -138,26 +136,20 @@ export declare const DAIMON_GROK_DENIED_STATE_ROOTS: readonly ["/var/lib/spawnfi
|
|
|
138
136
|
*/
|
|
139
137
|
export declare const resolveDaimonGrokWorkerDenyPaths: (plans: readonly RuntimeTargetPlan[], plan: RuntimeTargetPlan, agentId: string, workerHomes: readonly string[], ownHome: string) => string[];
|
|
140
138
|
export declare const resolveDaimonGrokRegistrations: (plans: RuntimeTargetPlan[]) => DaimonGrokRegistration[];
|
|
141
|
-
export interface DaimonGrokServiceConfigOptions {
|
|
142
|
-
/** Repeated agent IDs use v3 slot policies; production retains v2 by default. */
|
|
143
|
-
version?: "v3";
|
|
144
|
-
maxRunRequests?: number;
|
|
145
|
-
runRequestStore?: string;
|
|
146
|
-
/**
|
|
147
|
-
* Where the broker keeps its durable turn registry. Production keeps it on
|
|
148
|
-
* the realm volume beside the credential; training overrides it to per-slot
|
|
149
|
-
* tmpfs so a recycled slot can never replay trial N's sealed turn in trial
|
|
150
|
-
* N+1 (R2), and refuses any path on the realm volume for that reason.
|
|
151
|
-
*/
|
|
152
|
-
turnStore?: string;
|
|
153
|
-
/** `service.json` v2's optional evaluator inference ledger. Without it the broker refuses every grant. */
|
|
154
|
-
inferenceLedgerPath?: string;
|
|
155
|
-
}
|
|
156
139
|
/** `service.json` v2, exactly the shape Daimon's strict `parseEngineBrokerServiceConfig` accepts. */
|
|
157
|
-
export declare const renderDaimonGrokServiceConfig: (registrations: readonly DaimonGrokRegistration[]
|
|
158
|
-
|
|
140
|
+
export declare const renderDaimonGrokServiceConfig: (registrations: readonly DaimonGrokRegistration[]) => {
|
|
141
|
+
version: "noopolis.daimon.engine-broker-service.v2";
|
|
142
|
+
credentialHome: "/var/lib/spawnfile/daimon/grok-subscription-realm";
|
|
143
|
+
turnStore: "/var/lib/spawnfile/daimon/grok-subscription-realm/turns";
|
|
144
|
+
registrations: {
|
|
159
145
|
skillsSha256?: string | undefined;
|
|
146
|
+
agentId: string;
|
|
160
147
|
slot: number;
|
|
148
|
+
workerUid: number;
|
|
149
|
+
workspace: string;
|
|
150
|
+
profilePath: string;
|
|
151
|
+
eventsPath: string;
|
|
152
|
+
profileSha256: string;
|
|
161
153
|
usageLedgerPath: string;
|
|
162
154
|
limits: {
|
|
163
155
|
maxRequests: 32;
|
|
@@ -172,35 +164,5 @@ export declare const renderDaimonGrokServiceConfig: (registrations: readonly Dai
|
|
|
172
164
|
id: "grok-4.6" | "grok-4.5" | "grok-build";
|
|
173
165
|
reasoningEffort: "low" | "medium" | "high";
|
|
174
166
|
};
|
|
175
|
-
}[] | undefined;
|
|
176
|
-
registrations: {
|
|
177
|
-
skillsSha256?: string | undefined;
|
|
178
|
-
usageLedgerPath?: string | undefined;
|
|
179
|
-
limits?: {
|
|
180
|
-
maxRequests: 32;
|
|
181
|
-
maxTokens: 300000;
|
|
182
|
-
timeoutMs: 240000;
|
|
183
|
-
} | {
|
|
184
|
-
maxRequests: number;
|
|
185
|
-
maxTokens: number;
|
|
186
|
-
timeoutMs: number;
|
|
187
|
-
} | undefined;
|
|
188
|
-
model?: {
|
|
189
|
-
id: "grok-4.6" | "grok-4.5" | "grok-build";
|
|
190
|
-
reasoningEffort: "low" | "medium" | "high";
|
|
191
|
-
} | undefined;
|
|
192
|
-
agentId: string;
|
|
193
|
-
slot: number;
|
|
194
|
-
workerUid: number;
|
|
195
|
-
workspace: string;
|
|
196
|
-
profilePath: string;
|
|
197
|
-
eventsPath: string;
|
|
198
|
-
profileSha256: string;
|
|
199
167
|
}[];
|
|
200
|
-
inferenceLedgerPath?: string | undefined;
|
|
201
|
-
runRequestStore?: string | undefined;
|
|
202
|
-
maxRunRequests?: number | undefined;
|
|
203
|
-
version: "noopolis.daimon.engine-broker-service.v2" | "noopolis.daimon.engine-broker-service.v3";
|
|
204
|
-
credentialHome: "/var/lib/spawnfile/daimon/grok-subscription-realm";
|
|
205
|
-
turnStore: string;
|
|
206
168
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN, daimonGatewayRealmPath, isDaimonGatewayedEngine } from "../runtime/daimon/gateway.js";
|
|
1
2
|
import { daimonEngineHasBroker, getDaimonEngineDescriptor } from "../runtime/daimon/index.js";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
@@ -125,10 +126,13 @@ export const resolveDaimonGrokWorkerDenyPaths = (plans, plan, agentId, workerHom
|
|
|
125
126
|
const peers = agents.filter(([id]) => id !== agentId).map(([id]) => nodeSlug(id));
|
|
126
127
|
const daimonOwn = [
|
|
127
128
|
...[...new Set(agents.map(([, engine]) => engine))].flatMap((engine) => {
|
|
128
|
-
const
|
|
129
|
-
|
|
129
|
+
const descriptor = getDaimonEngineDescriptor(engine);
|
|
130
|
+
// A gatewayed bootstrap leaf sits under the root-only gateway root; mask that root, the realm and the gateway's state.
|
|
131
|
+
return isDaimonGatewayedEngine(descriptor)
|
|
132
|
+
? [DAIMON_GATEWAY_BOOTSTRAP_ROOT, daimonGatewayRealmPath(descriptor), DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN]
|
|
133
|
+
: [];
|
|
130
134
|
}),
|
|
131
|
-
|
|
135
|
+
// The broker's local turn-state home (it holds no credential in gateway mode).
|
|
132
136
|
DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath,
|
|
133
137
|
...(agents.some(([, engine]) => getDaimonEngineDescriptor(engine)?.auth.staging === "secret-service") ? [DAIMON_AGY_SUBSCRIPTION_REALM.unlockMountPath, DAIMON_AGY_SUBSCRIPTION_REALM.durableMountPath] : []),
|
|
134
138
|
daimonGrokAcceptanceStoreDenyPath(instanceRoot),
|
|
@@ -242,33 +246,11 @@ export const resolveDaimonGrokRegistrations = (plans) => {
|
|
|
242
246
|
};
|
|
243
247
|
});
|
|
244
248
|
};
|
|
245
|
-
const resolveDaimonGrokTurnStore = (turnStore) => {
|
|
246
|
-
if (turnStore === undefined)
|
|
247
|
-
return DAIMON_GROK_ENGINE_BROKER.turnStorePath;
|
|
248
|
-
assertCanonicalRegisteredPath("turn store", turnStore);
|
|
249
|
-
if (turnStore === DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath || turnStore.startsWith(`${DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath}/`)) {
|
|
250
|
-
fail(`Grok broker turn store ${turnStore} is on the durable credential realm; a recycled slot would replay the previous trial's sealed turns`);
|
|
251
|
-
}
|
|
252
|
-
return turnStore;
|
|
253
|
-
};
|
|
254
|
-
const resolveDaimonGrokInferenceLedger = (inferenceLedgerPath, registrations) => {
|
|
255
|
-
assertCanonicalRegisteredPath("inference ledger", inferenceLedgerPath);
|
|
256
|
-
if (!inferenceLedgerPath.endsWith(".jsonl"))
|
|
257
|
-
fail(`Grok inference ledger must be a .jsonl path: ${inferenceLedgerPath}`);
|
|
258
|
-
const subject = new Set([DAIMON_GROK_TURN_USAGE_LEDGER.filePath, path.posix.join(DAIMON_GROK_TURN_USAGE_LEDGER.directoryPath, "requests.jsonl"),
|
|
259
|
-
...registrations.flatMap((entry) => [entry.usageLedgerPath, path.posix.join(path.posix.dirname(entry.usageLedgerPath), "requests.jsonl")])]);
|
|
260
|
-
if (subject.has(inferenceLedgerPath))
|
|
261
|
-
fail(`Grok inference ledger ${inferenceLedgerPath} is a subject usage ledger; judge spend must never reach the wake fuse`);
|
|
262
|
-
return inferenceLedgerPath;
|
|
263
|
-
};
|
|
264
249
|
/** `service.json` v2, exactly the shape Daimon's strict `parseEngineBrokerServiceConfig` accepts. */
|
|
265
|
-
export const renderDaimonGrokServiceConfig = (registrations
|
|
266
|
-
version: DAIMON_GROK_ENGINE_BROKER.serviceConfigVersions[
|
|
250
|
+
export const renderDaimonGrokServiceConfig = (registrations) => ({
|
|
251
|
+
version: DAIMON_GROK_ENGINE_BROKER.serviceConfigVersions[1],
|
|
267
252
|
credentialHome: DAIMON_GROK_ENGINE_BROKER.credentialHomePath,
|
|
268
|
-
turnStore:
|
|
269
|
-
...(options.maxRunRequests === undefined ? {} : { maxRunRequests: options.maxRunRequests }),
|
|
270
|
-
...(options.runRequestStore === undefined ? {} : { runRequestStore: assertCanonicalRegisteredPath("run request store", options.runRequestStore) }),
|
|
271
|
-
...(options.inferenceLedgerPath === undefined ? {} : { inferenceLedgerPath: resolveDaimonGrokInferenceLedger(options.inferenceLedgerPath, registrations) }),
|
|
253
|
+
turnStore: DAIMON_GROK_ENGINE_BROKER.turnStorePath,
|
|
272
254
|
registrations: registrations.map((entry) => ({
|
|
273
255
|
agentId: entry.agentId,
|
|
274
256
|
slot: entry.slot,
|
|
@@ -277,15 +259,9 @@ export const renderDaimonGrokServiceConfig = (registrations, options = {}) => ({
|
|
|
277
259
|
profilePath: entry.profilePath,
|
|
278
260
|
eventsPath: entry.eventsPath,
|
|
279
261
|
profileSha256: entry.profileSha256,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
}))
|
|
285
|
-
...(options.version === "v3" ? { slotPolicies: registrations.map(entry => ({
|
|
286
|
-
slot: entry.slot, usageLedgerPath: entry.usageLedgerPath,
|
|
287
|
-
limits: { ...(entry.limits ?? DAIMON_GROK_ENGINE_BROKER.turnLimits.v1Defaults) },
|
|
288
|
-
model: { id: entry.model, reasoningEffort: entry.reasoningEffort },
|
|
289
|
-
...(entry.skills ? { skillsSha256: entry.skills.sha256 } : {})
|
|
290
|
-
})) } : {})
|
|
262
|
+
usageLedgerPath: entry.usageLedgerPath,
|
|
263
|
+
limits: { ...(entry.limits ?? DAIMON_GROK_ENGINE_BROKER.turnLimits.v1Defaults) },
|
|
264
|
+
model: { id: entry.model, reasoningEffort: entry.reasoningEffort },
|
|
265
|
+
...(entry.skills ? { skillsSha256: entry.skills.sha256 } : {})
|
|
266
|
+
}))
|
|
291
267
|
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root-side supervision for the privileged startup children (engine broker,
|
|
3
|
+
* relay, launcher and auth gateway): bounded readiness waits plus one EXIT
|
|
4
|
+
* trap that terminates every started child if startup fails.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
|
|
7
|
+
export declare const renderDaimonBrokerSocketWait: (timeoutSeconds?: number, pollSeconds?: number) => string[];
|
|
8
|
+
export declare const renderDaimonStartupSupervision: () => string[];
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root-side supervision for the privileged startup children (engine broker,
|
|
3
|
+
* relay, launcher and auth gateway): bounded readiness waits plus one EXIT
|
|
4
|
+
* trap that terminates every started child if startup fails.
|
|
5
|
+
*/
|
|
6
|
+
export const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
|
|
7
|
+
export const renderDaimonBrokerSocketWait = (timeoutSeconds = DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS, pollSeconds = 0.1) => [
|
|
8
|
+
`broker_startup_timeout_seconds=${timeoutSeconds}`,
|
|
9
|
+
`broker_startup_poll_seconds=${pollSeconds}`,
|
|
10
|
+
"broker_startup_started=$SECONDS",
|
|
11
|
+
"broker_process_status_root=/proc",
|
|
12
|
+
"wait_for_broker_socket() {",
|
|
13
|
+
" socket=$1; child=$2; label=$3",
|
|
14
|
+
" while [ ! -S \"$socket\" ]; do",
|
|
15
|
+
" if ! kill -0 \"$child\" 2>/dev/null; then set +e; wait \"$child\"; child_status=$?; set -e; echo \"$label exited before readiness (status $child_status)\" >&2; return 1; fi",
|
|
16
|
+
" if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"$label readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; return 1; fi",
|
|
17
|
+
" sleep \"$broker_startup_poll_seconds\"",
|
|
18
|
+
" done",
|
|
19
|
+
"}",
|
|
20
|
+
"wait_for_broker_identity() {",
|
|
21
|
+
" child=$1; expected_uid=$2; expected_caps=$3; label=$4",
|
|
22
|
+
" while kill -0 \"$child\" 2>/dev/null; do",
|
|
23
|
+
" status_path=$broker_process_status_root/$child/status",
|
|
24
|
+
" observed_uid=$(awk '/^Uid:/{print $2}' \"$status_path\" 2>/dev/null || true)",
|
|
25
|
+
" observed_caps=$(awk '/^CapBnd:/{print $2}' \"$status_path\" 2>/dev/null || true)",
|
|
26
|
+
" if [ \"$observed_uid\" = \"$expected_uid\" ] && [ \"$observed_caps\" = \"$expected_caps\" ]; then return 0; fi",
|
|
27
|
+
" if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"$label identity readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; return 1; fi",
|
|
28
|
+
" sleep \"$broker_startup_poll_seconds\"",
|
|
29
|
+
" done",
|
|
30
|
+
" set +e; wait \"$child\"; child_status=$?; set -e; echo \"$label exited before identity readiness (status $child_status)\" >&2; return 1",
|
|
31
|
+
"}"
|
|
32
|
+
];
|
|
33
|
+
export const renderDaimonStartupSupervision = () => [
|
|
34
|
+
...renderDaimonBrokerSocketWait(),
|
|
35
|
+
"startup_children=()",
|
|
36
|
+
"cleanup_broker_startup() { status=$?; trap - EXIT; for child in \"${startup_children[@]}\"; do kill -TERM \"$child\" 2>/dev/null || true; wait \"$child\" 2>/dev/null || true; done; return \"$status\"; }",
|
|
37
|
+
"trap cleanup_broker_startup EXIT",
|
|
38
|
+
"trap 'exit 143' TERM INT HUP"
|
|
39
|
+
];
|
|
@@ -2,12 +2,11 @@ import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
|
|
|
2
2
|
import type { EntrypointOptions } from "./containerEntrypointRender.js";
|
|
3
3
|
import { type BackedMountRequirement } from "./containerBackedMountRender.js";
|
|
4
4
|
export { resolveDaimonVolumeIdentityFiles } from "./containerDaimonOwnershipGuardRender.js";
|
|
5
|
+
export { DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS, renderDaimonBrokerSocketWait } from "./containerDaimonStartupSupervision.js";
|
|
5
6
|
export declare const DAIMON_AUTHORIZED_UID_ENV = "SPAWNFILE_DAIMON_AUTHORIZED_UID";
|
|
6
7
|
export declare const DAIMON_RUNTIME_UID = 2000;
|
|
7
8
|
export declare const DAIMON_UID_ENTRYPOINT_PATH = "/opt/spawnfile/daimon-uid-entrypoint.sh";
|
|
8
9
|
export declare const DAIMON_RUNTIME_HOMES_DIRECTORY = "runtime-homes";
|
|
9
|
-
export declare const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
|
|
10
|
-
export declare const renderDaimonBrokerSocketWait: (timeoutSeconds?: number, pollSeconds?: number) => string[];
|
|
11
10
|
export declare const resolveDaimonUidEntrypointStateRoots: (runtimePlans: RuntimeTargetPlan[]) => string[];
|
|
12
11
|
export interface DaimonUidEntrypointOwnershipPlan {
|
|
13
12
|
creatablePrivateDirectories: Array<{
|