spawnfile 0.1.14 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -159
- package/dist/audit/checksShared.d.ts +1 -1
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
- package/dist/auth/targetSecretSourceFsPublish.js +3 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
- package/dist/auth/targetSecretSourceFsRead.js +5 -14
- package/dist/auth/trainingAuth.d.ts +21 -0
- package/dist/auth/trainingAuth.js +86 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +9 -0
- package/dist/cli/canaryCutoverCommand.d.ts +2 -0
- package/dist/cli/canaryCutoverCommand.js +30 -0
- package/dist/cli/capabilitiesCommand.d.ts +3 -0
- package/dist/cli/capabilitiesCommand.js +12 -0
- package/dist/cli/capabilitiesReceipt.d.ts +56 -0
- package/dist/cli/capabilitiesReceipt.js +56 -0
- package/dist/cli/compileBuildCommands.js +13 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.js +19 -8
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +12 -3
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/paideiaDelegation.d.ts +17 -0
- package/dist/cli/paideiaDelegation.js +210 -0
- package/dist/cli/paideiaSupervisor.d.ts +17 -0
- package/dist/cli/paideiaSupervisor.js +48 -0
- package/dist/cli/productStateCloneCommand.d.ts +2 -0
- package/dist/cli/productStateCloneCommand.js +34 -0
- package/dist/cli/runCli.d.ts +13 -3
- package/dist/cli/runCli.js +37 -9
- package/dist/cli/targetCommands.d.ts +4 -7
- package/dist/cli/targetCommands.js +16 -46
- package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
- package/dist/cli/targetConfigPreparedPlan.js +74 -0
- package/dist/cli/targetConfigResolver.d.ts +3 -0
- package/dist/cli/targetConfigResolver.js +111 -0
- package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
- package/dist/cli/targetConfigResolverCommand.js +43 -0
- package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
- package/dist/cli/targetConfigResolverContracts.js +30 -0
- package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
- package/dist/cli/targetConfigResolverDocker.js +47 -0
- package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
- package/dist/cli/targetConfigResolverValidation.js +94 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
- package/dist/cli/targetDefaultAuthorities.js +3 -0
- package/dist/cli/targetDefaultConfig.d.ts +7 -0
- package/dist/cli/targetDefaultConfig.js +22 -5
- package/dist/cli/targetDefaultConfigStdin.js +7 -1
- package/dist/cli/targetDefaultHandlerFactory.js +23 -2
- package/dist/cli/targetDefaultHandlers.d.ts +2 -2
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.js +35 -6
- package/dist/cli/upLifecycleRecovery.d.ts +2 -2
- package/dist/cli/upLifecycleRecovery.js +188 -44
- package/dist/cli/usageCommand.d.ts +40 -0
- package/dist/cli/usageCommand.js +284 -0
- package/dist/cli/usageCommandLive.d.ts +84 -0
- package/dist/cli/usageCommandLive.js +95 -0
- package/dist/cli/usageDeploymentSource.d.ts +9 -0
- package/dist/cli/usageDeploymentSource.js +22 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/compilePlanHelpers.js +3 -0
- package/dist/compiler/compileProject.d.ts +2 -0
- package/dist/compiler/compileProject.js +5 -1
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifacts.d.ts +3 -1
- package/dist/compiler/containerArtifacts.js +92 -40
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +24 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
- package/dist/compiler/containerDaimonBrokerRender.js +191 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
- package/dist/compiler/containerEntrypointRender.d.ts +7 -0
- package/dist/compiler/containerEntrypointRender.js +28 -22
- package/dist/compiler/containerPersistentMounts.d.ts +30 -0
- package/dist/compiler/containerPersistentMounts.js +66 -0
- package/dist/compiler/containerReadinessPaths.d.ts +1 -0
- package/dist/compiler/containerReadinessPaths.js +1 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
- package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
- package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
- package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
- package/dist/compiler/containerStateOwnershipRender.js +75 -0
- package/dist/compiler/containerTargetResources.d.ts +22 -1
- package/dist/compiler/containerTargetResources.js +94 -2
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
- package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.js +3 -0
- package/dist/compiler/initProject.d.ts +2 -0
- package/dist/compiler/initProject.js +39 -1
- package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
- package/dist/compiler/localMoltnetAuthority.js +177 -0
- package/dist/compiler/memoryArtifacts.d.ts +1 -1
- package/dist/compiler/memoryArtifacts.js +108 -32
- package/dist/compiler/modelEnv.d.ts +5 -0
- package/dist/compiler/modelEnv.js +8 -2
- package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
- package/dist/compiler/moltnetArtifactPaths.js +17 -15
- package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +52 -12
- package/dist/compiler/moltnetBinaries.d.ts +16 -4
- package/dist/compiler/moltnetBinaries.js +46 -6
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
- package/dist/compiler/moltnetConfigLowering.js +30 -6
- package/dist/compiler/moltnetNodeConfig.js +1 -1
- package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
- package/dist/compiler/moltnetReleaseAuthority.js +33 -4
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
- package/dist/compiler/moltnetResolution.js +9 -15
- package/dist/compiler/moltnetRoomMemberships.js +20 -5
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +22 -2
- package/dist/compiler/moltnetServerPlans.js +19 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +3 -9
- package/dist/compiler/organizationIdentity.js +37 -270
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
- package/dist/compiler/organizationReadyEvidence.js +23 -3
- package/dist/compiler/runProject.d.ts +4 -2
- package/dist/compiler/runProject.js +32 -6
- package/dist/compiler/runProjectAuth.d.ts +3 -1
- package/dist/compiler/runProjectAuth.js +19 -3
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +8 -4
- package/dist/compiler/runProjectDocker.js +43 -18
- package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
- package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
- package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
- package/dist/compiler/runProjectDockerReservation.js +118 -0
- package/dist/compiler/runProjectLifecycle.js +1 -1
- package/dist/compiler/training/broker/declaration.d.ts +45 -0
- package/dist/compiler/training/broker/declaration.js +55 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +111 -0
- package/dist/compiler/training/broker/index.d.ts +10 -0
- package/dist/compiler/training/broker/index.js +10 -0
- package/dist/compiler/training/broker/main.d.ts +2 -0
- package/dist/compiler/training/broker/main.js +14 -0
- package/dist/compiler/training/broker/paths.d.ts +196 -0
- package/dist/compiler/training/broker/paths.js +241 -0
- package/dist/compiler/training/broker/processes.d.ts +42 -0
- package/dist/compiler/training/broker/processes.js +99 -0
- package/dist/compiler/training/broker/projection.d.ts +51 -0
- package/dist/compiler/training/broker/projection.js +76 -0
- package/dist/compiler/training/broker/provisioning.d.ts +87 -0
- package/dist/compiler/training/broker/provisioning.js +213 -0
- package/dist/compiler/training/broker/receipt.d.ts +77 -0
- package/dist/compiler/training/broker/receipt.js +110 -0
- package/dist/compiler/training/broker/registration.d.ts +41 -0
- package/dist/compiler/training/broker/registration.js +102 -0
- package/dist/compiler/training/broker/runtime.d.ts +25 -0
- package/dist/compiler/training/broker/runtime.js +173 -0
- package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
- package/dist/compiler/training/broker/seccompRoutes.js +36 -0
- package/dist/compiler/training/broker/supervisor.d.ts +109 -0
- package/dist/compiler/training/broker/supervisor.js +173 -0
- package/dist/compiler/training/container/contract.d.ts +31 -0
- package/dist/compiler/training/container/contract.js +33 -0
- package/dist/compiler/training/container/index.d.ts +4 -0
- package/dist/compiler/training/container/index.js +2 -0
- package/dist/compiler/training/container/launch.d.ts +18 -0
- package/dist/compiler/training/container/launch.js +173 -0
- package/dist/compiler/training/container/prepare.d.ts +8 -0
- package/dist/compiler/training/container/prepare.js +80 -0
- package/dist/compiler/training/container/process.d.ts +14 -0
- package/dist/compiler/training/container/process.js +70 -0
- package/dist/compiler/training/container/security.d.ts +36 -0
- package/dist/compiler/training/container/security.js +58 -0
- package/dist/compiler/training/context.d.ts +7 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +142 -0
- package/dist/compiler/training/contract.js +34 -0
- package/dist/compiler/training/index.d.ts +4 -0
- package/dist/compiler/training/index.js +3 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
- package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
- package/dist/compiler/training/preparation/broker.d.ts +21 -0
- package/dist/compiler/training/preparation/broker.js +43 -0
- package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
- package/dist/compiler/training/preparation/contextModes.js +38 -0
- package/dist/compiler/training/preparation/contract.d.ts +182 -0
- package/dist/compiler/training/preparation/contract.js +94 -0
- package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
- package/dist/compiler/training/preparation/copyAssets.js +8 -0
- package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
- package/dist/compiler/training/preparation/daimonParent.js +114 -0
- package/dist/compiler/training/preparation/files.d.ts +25 -0
- package/dist/compiler/training/preparation/files.js +85 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +102 -0
- package/dist/compiler/training/preparation/index.d.ts +3 -0
- package/dist/compiler/training/preparation/index.js +2 -0
- package/dist/compiler/training/preparation/inputs.d.ts +23 -0
- package/dist/compiler/training/preparation/inputs.js +93 -0
- package/dist/compiler/training/preparation/prepare.d.ts +33 -0
- package/dist/compiler/training/preparation/prepare.js +186 -0
- package/dist/compiler/training/preparation/scratch.d.ts +19 -0
- package/dist/compiler/training/preparation/scratch.js +48 -0
- package/dist/compiler/training/repair/compatibility.d.ts +11 -0
- package/dist/compiler/training/repair/compatibility.js +34 -0
- package/dist/compiler/training/repair/contract.d.ts +506 -0
- package/dist/compiler/training/repair/contract.js +31 -0
- package/dist/compiler/training/repair/index.d.ts +3 -0
- package/dist/compiler/training/repair/index.js +3 -0
- package/dist/compiler/training/repair/prepare.d.ts +230 -0
- package/dist/compiler/training/repair/prepare.js +74 -0
- package/dist/compiler/training/repair/witness.d.ts +203 -0
- package/dist/compiler/training/repair/witness.js +42 -0
- package/dist/compiler/types.d.ts +2 -0
- package/dist/compiler/upProject.d.ts +26 -1
- package/dist/compiler/upProject.js +117 -178
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.js +49 -4
- package/dist/compiler/updateProjectModels.js +1 -0
- package/dist/compiler/view/types.d.ts +1 -1
- package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
- package/dist/compiler/workspaceBundleArtifacts.js +106 -0
- package/dist/compiler/workspaceResources.d.ts +4 -1
- package/dist/compiler/workspaceResources.js +12 -7
- package/dist/deployment/artifactsExportPlan.js +51 -1
- package/dist/deployment/canaryCutover.d.ts +42 -0
- package/dist/deployment/canaryCutover.js +140 -0
- package/dist/deployment/candidateDiagnostics.d.ts +15 -0
- package/dist/deployment/candidateDiagnostics.js +90 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.js +9 -3
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +5 -0
- package/dist/deployment/downDeployment.js +109 -8
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/index.d.ts +4 -0
- package/dist/deployment/index.js +4 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
- package/dist/deployment/lifecycleCompletionContracts.js +34 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
- package/dist/deployment/lifecycleCompletionPaths.js +3 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionPublication.js +18 -4
- package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
- package/dist/deployment/lifecycleCompletionStore.js +7 -7
- package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
- package/dist/deployment/lifecycleUpRecords.js +127 -0
- package/dist/deployment/native/AGENTS.md +11 -0
- package/dist/deployment/native/rename-noreplace-arm64 +0 -0
- package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
- package/dist/deployment/native/rename-noreplace-x64 +0 -0
- package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
- package/dist/deployment/noReplaceActivation.d.ts +17 -0
- package/dist/deployment/noReplaceActivation.js +50 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
- package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
- package/dist/deployment/organizationReady.d.ts +2 -0
- package/dist/deployment/organizationReady.js +36 -4
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +32 -6
- package/dist/deployment/upReceiptTypes.js +29 -2
- package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
- package/dist/deployment/workspaceResourceMigration.js +315 -0
- package/dist/dev/project.d.ts +7 -0
- package/dist/dev/project.js +9 -0
- package/dist/distribution/consumeImage.d.ts +2 -0
- package/dist/distribution/consumeImage.js +98 -73
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
- package/dist/distribution/consumeImageLifecycle.js +231 -0
- package/dist/distribution/consumeImageSupport.d.ts +12 -0
- package/dist/distribution/consumeImageSupport.js +15 -0
- package/dist/distribution/distributionReportSchema.d.ts +11 -1
- package/dist/distribution/distributionReportSchema.js +15 -2
- package/dist/distribution/dockerRunner.d.ts +6 -1
- package/dist/distribution/dockerRunner.js +31 -4
- package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
- package/dist/distribution/imageRuntimeAuth.js +70 -1
- package/dist/distribution/index.d.ts +1 -1
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +14 -1
- package/dist/distribution/types.js +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
- package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
- package/dist/evidenceExportHelper/index.d.ts +4 -0
- package/dist/evidenceExportHelper/index.js +4 -0
- package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
- package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
- package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
- package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
- package/dist/evidenceExportHelper/recipe.d.ts +7 -0
- package/dist/evidenceExportHelper/recipe.js +83 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/mcpSchemas.d.ts +1 -0
- package/dist/manifest/mcpSchemas.js +3 -0
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +237 -12
- package/dist/manifest/schemas.js +5 -2
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
- package/dist/manifest/teamNetworkSchemas.js +19 -1
- package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
- package/dist/manifest/teamNetworkServerSchemas.js +18 -2
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/report/types.d.ts +34 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +49 -33
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +243 -0
- package/dist/runtime/daimon/attention.d.ts +8 -0
- package/dist/runtime/daimon/attention.js +32 -0
- package/dist/runtime/daimon/config.d.ts +25 -0
- package/dist/runtime/daimon/config.js +272 -0
- package/dist/runtime/daimon/contractManifest.d.ts +295 -0
- package/dist/runtime/daimon/contractManifest.js +319 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
- package/dist/runtime/daimon/grokWorkerContract.js +48 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/runAuth.d.ts +51 -0
- package/dist/runtime/daimon/runAuth.js +279 -0
- package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
- package/dist/runtime/daimon/runtimeIdentity.js +22 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
- package/dist/runtime/daimon/scheduleAuthority.js +17 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/install.d.ts +3 -0
- package/dist/runtime/install.js +3 -0
- package/dist/runtime/localDaimonAuthority.d.ts +11 -0
- package/dist/runtime/localDaimonAuthority.js +77 -0
- package/dist/runtime/mnemeMcp.d.ts +13 -0
- package/dist/runtime/mnemeMcp.js +26 -0
- package/dist/runtime/openclaw/adapter.js +2 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +2 -6
- package/dist/runtime/pi/appCliSource.js +1 -1
- package/dist/runtime/pi/appScheduleSource.js +6 -2
- package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
- package/dist/runtime/picoclaw/adapter.js +2 -2
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +25 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +48 -0
- package/dist/runtime/usageLedgerRead.js +102 -0
- package/dist/runtime/usageRequestLedger.d.ts +42 -0
- package/dist/runtime/usageRequestLedger.js +72 -0
- package/dist/shared/daimonCodexDocker.d.ts +32 -0
- package/dist/shared/daimonCodexDocker.js +120 -0
- package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
- package/dist/shared/daimonGrokSeccompProfile.js +11 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/volumeNames.d.ts +6 -0
- package/dist/shared/volumeNames.js +14 -0
- package/dist/target/dockerArtifactsProvider.js +34 -7
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +11 -0
- package/dist/target/dockerCommandExecutor.js +53 -2
- package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
- package/dist/target/dockerCommandExecutorCore.js +4 -2
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
- package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
- package/dist/target/dockerTarget.d.ts +1 -0
- package/dist/target/dockerTargetBinding.d.ts +1 -2
- package/dist/target/dockerTargetBinding.js +2 -3
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
- package/dist/target/dockerWorldServiceProvider.js +13 -1
- package/dist/target/evidenceExport.d.ts +3 -1
- package/dist/target/evidenceExport.js +12 -3
- package/dist/target/evidenceExportOperationsTestKit.js +3 -3
- package/dist/target/evidenceExportProvider.d.ts +2 -0
- package/dist/target/evidenceExportProvider.js +15 -5
- package/dist/target/publicArtifactSnapshot.d.ts +31 -0
- package/dist/target/publicArtifactSnapshot.js +37 -3
- package/examples/README.md +45 -0
- package/examples/agent-with-subagents/AGENTS.md +3 -0
- package/examples/agent-with-subagents/Spawnfile +30 -0
- package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
- package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
- package/examples/daimon-org/Spawnfile +68 -0
- package/examples/daimon-org/TEAM.md +4 -0
- package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
- package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
- package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
- package/examples/daimon-org/teams/review/Spawnfile +53 -0
- package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
- package/examples/daimon-public-host/AGENTS.md +3 -0
- package/examples/daimon-public-host/Spawnfile +21 -0
- package/examples/distribution-org/Spawnfile +43 -0
- package/examples/distribution-org/TEAM.md +4 -0
- package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
- package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
- package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
- package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
- package/examples/jungian-daimon-org/Spawnfile +41 -0
- package/examples/jungian-daimon-org/TEAM.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
- package/examples/mixed-runtime-org/Spawnfile +71 -0
- package/examples/mixed-runtime-org/TEAM.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
- package/examples/moltnet-team-chat/Spawnfile +43 -0
- package/examples/moltnet-team-chat/TEAM.md +5 -0
- package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
- package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
- package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
- package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
- package/examples/single-agent/AGENTS.md +3 -0
- package/examples/single-agent/HEARTBEAT.md +3 -0
- package/examples/single-agent/IDENTITY.md +3 -0
- package/examples/single-agent/MEMORY.md +3 -0
- package/examples/single-agent/SOUL.md +3 -0
- package/examples/single-agent/Spawnfile +41 -0
- package/examples/single-agent/skills/web_search/SKILL.md +6 -0
- package/moltnet-releases.json +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +5 -2
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
- package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
- package/dist/ownership/simfileRunOperatorInputs.js +0 -139
- package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
- package/dist/target/cleanupRunDocker.test-helper.js +0 -238
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { SpawnfileError } from "../../shared/index.js";
|
|
2
|
+
import { CLI_ENGINE_SKILL_BASE_DIRECTORIES, createAgentCapabilities, createDiagnostic, createDocumentFiles, createSkillFiles } from "../common.js";
|
|
3
|
+
import { parseEveryScheduleMs } from "../scheduleUtils.js";
|
|
4
|
+
import { createDaimonContainerTargets, daimonMemoryCapabilityFor, daimonMemorySelectionWarning, daimonMemoryVectorRecallWarning, DAIMON_CONFIG_FILE, DAIMON_CONTROL_PORT, DAIMON_ENGINES, resolveDaimonEngine } from "./config.js";
|
|
5
|
+
import { resolveDaimonGrokModel } from "./grokModel.js";
|
|
6
|
+
import { prepareDaimonRuntimeAuth } from "./runAuth.js";
|
|
7
|
+
import { hasDaimonScheduleAuthority } from "./scheduleAuthority.js";
|
|
8
|
+
import { resolveDaimonAttention } from "./attention.js";
|
|
9
|
+
const assertDaimonSurfaces = (surfaces) => {
|
|
10
|
+
if (!surfaces)
|
|
11
|
+
return;
|
|
12
|
+
const enabled = Object.entries(surfaces)
|
|
13
|
+
.filter(([name]) => name !== "moltnet")
|
|
14
|
+
.filter(([, value]) => Array.isArray(value) ? value.length > 0 : value !== undefined)
|
|
15
|
+
.map(([name]) => name);
|
|
16
|
+
if (enabled.length > 0) {
|
|
17
|
+
throw new SpawnfileError("validation_error", `Daimon organization runtime v1 only lowers Moltnet agent surfaces; remove: ${enabled.sort().join(", ")}`);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const assertDaimonModel = (target) => {
|
|
21
|
+
if (target.provider === "openai" && target.auth.method === "codex" && !target.endpoint && !target.reasoningEffort)
|
|
22
|
+
return;
|
|
23
|
+
if (target.provider === "xai" && target.auth.method === "grok" && !target.endpoint)
|
|
24
|
+
return;
|
|
25
|
+
throw new SpawnfileError("validation_error", "Daimon organization runtime v1 accepts only the optional OpenAI Codex subscription intent or a brokered xAI Grok declaration; AGY engine auth stays Daimon-owned");
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* The compile-time warning for an agent that asked to be confined to its
|
|
29
|
+
* workspace on a runtime that does not confine anything.
|
|
30
|
+
*
|
|
31
|
+
* `restrict_to_workspace` is accepted by `validateRuntimeOptions` below (it is
|
|
32
|
+
* on the allowlist beside `engine`) and is then read by nothing under
|
|
33
|
+
* `src/runtime/daimon/`: the `noopolis.daimon.organization-runtime.v1` contract
|
|
34
|
+
* this adapter lowers into carries no workspace-confinement field, so the
|
|
35
|
+
* declaration reaches no runtime behavior at all. PicoClaw consumes an
|
|
36
|
+
* identically named option and really does lower it
|
|
37
|
+
* (`../picoclaw/adapter.ts`), which is exactly what makes the option look
|
|
38
|
+
* wired here.
|
|
39
|
+
*
|
|
40
|
+
* This warns rather than implementing confinement, because real workspace
|
|
41
|
+
* restriction for Daimon is a sandbox-profile change in daimon itself plus a
|
|
42
|
+
* widening of the digest-pinned organization runtime contract. It warns rather
|
|
43
|
+
* than rejecting, because an existing project that already declares the option
|
|
44
|
+
* must keep compiling. And it does not stay silent, because a security option
|
|
45
|
+
* that is accepted and ignored is a worse failure than one that is refused.
|
|
46
|
+
*
|
|
47
|
+
* Declaring `restrict_to_workspace: false` asks for nothing, so it says
|
|
48
|
+
* nothing.
|
|
49
|
+
*/
|
|
50
|
+
const daimonWorkspaceRestrictionWarning = (node) => {
|
|
51
|
+
const declared = node.runtime.options.restrict_to_workspace;
|
|
52
|
+
if (declared === undefined || declared === false)
|
|
53
|
+
return undefined;
|
|
54
|
+
return `Daimon organization runtime v1 does not enforce restrict_to_workspace: agent ${node.name} declares `
|
|
55
|
+
+ "it, but no Daimon lowering reads the option and the organization runtime contract carries no workspace "
|
|
56
|
+
+ "confinement field, so this agent's engine can reach the whole container filesystem. Move the agent to the "
|
|
57
|
+
+ "picoclaw runtime, which lowers restrict_to_workspace into its agent defaults, or drop the option and treat "
|
|
58
|
+
+ "the container boundary as this agent's only isolation.";
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Workspace skill roots per Daimon engine.
|
|
62
|
+
*
|
|
63
|
+
* Codex and AGY keep both CLI-engine roots. A brokered Grok worker loads no
|
|
64
|
+
* workspace skill at all: Grok 1.0.34 discovers `.agents/skills` (never
|
|
65
|
+
* `.codex/skills`) only in a trusted folder, and Daimon keeps the workspace
|
|
66
|
+
* untrusted (root-owned empty `trusted_folders.toml`) and replaces the system
|
|
67
|
+
* prompt, whose fixed text references no skill. Emitting either root would ship
|
|
68
|
+
* files nothing reads, so none are emitted and the declaration is reported.
|
|
69
|
+
*/
|
|
70
|
+
export const daimonSkillBaseDirectories = (node) => resolveDaimonEngine(node) === "grok" ? [] : CLI_ENGINE_SKILL_BASE_DIRECTORIES;
|
|
71
|
+
const daimonGrokSkillWarning = (node) => {
|
|
72
|
+
if (resolveDaimonEngine(node) !== "grok" || node.skills.length === 0)
|
|
73
|
+
return undefined;
|
|
74
|
+
return `Daimon Grok agent ${node.name} declares workspace skills (${node.skills.map((skill) => skill.name).sort().join(", ")}) `
|
|
75
|
+
+ "that its brokered worker never loads: Grok discovers project skills only in a trusted workspace, and Daimon keeps the "
|
|
76
|
+
+ "workspace untrusted and supplies instructions through the prompt. No skill files are emitted; move the guidance into the agent's docs.";
|
|
77
|
+
};
|
|
78
|
+
const daimonCodexPolicyError = (node) => {
|
|
79
|
+
if (node.runtime.options.codex_policy === undefined)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (node.runtime.options.codex_policy !== "workspace-no-network") {
|
|
82
|
+
return "Daimon runtime option codex_policy must be workspace-no-network";
|
|
83
|
+
}
|
|
84
|
+
if (resolveDaimonEngine(node) !== "codex") {
|
|
85
|
+
return "Daimon runtime option codex_policy=workspace-no-network is only supported for Codex agents";
|
|
86
|
+
}
|
|
87
|
+
if (node.execution?.sandbox?.mode !== "workspace") {
|
|
88
|
+
return "Daimon runtime option codex_policy=workspace-no-network requires execution.sandbox.mode: workspace";
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* AGY is no longer excluded here.
|
|
94
|
+
*
|
|
95
|
+
* It used to be: an AGY agent that declared an MCP server or a Moltnet surface
|
|
96
|
+
* was rejected outright, because Daimon pinned AGY to `toolAccess: "none"`.
|
|
97
|
+
* Daimon now mounts AGY on the same per-wake MCP endpoint Codex and Grok get
|
|
98
|
+
* (`daimon/src/pi/cliMcpRegistration.ts`), so an AGY agent can take part in an
|
|
99
|
+
* organization, and the declaration this compiler lowers is one the runtime
|
|
100
|
+
* actually honours. The remaining validations are engine-independent and stay.
|
|
101
|
+
*/
|
|
102
|
+
const unsupportedAgentFeatures = (node) => {
|
|
103
|
+
for (const server of node.mcpServers) {
|
|
104
|
+
if (!server.tools?.length)
|
|
105
|
+
throw new SpawnfileError("validation_error", `Daimon MCP server ${server.name} requires an explicit tools allowlist`);
|
|
106
|
+
if (server.transport === "stdio" && !server.command?.startsWith("/"))
|
|
107
|
+
throw new SpawnfileError("validation_error", `Daimon stdio MCP server ${server.name} requires an absolute command`);
|
|
108
|
+
}
|
|
109
|
+
const engine = resolveDaimonEngine(node);
|
|
110
|
+
if (engine === "agy" && node.execution?.model) {
|
|
111
|
+
throw new SpawnfileError("validation_error", "Daimon AGY agents must omit Spawnfile execution.model; their subscription auth and model selection are Daimon-owned");
|
|
112
|
+
}
|
|
113
|
+
if (engine === "codex" && node.execution?.model?.primary.auth?.method === "grok") {
|
|
114
|
+
throw new SpawnfileError("validation_error", `Daimon Codex agent ${node.name} cannot declare Grok model auth`);
|
|
115
|
+
}
|
|
116
|
+
if (engine === "grok")
|
|
117
|
+
resolveDaimonGrokModel(node);
|
|
118
|
+
};
|
|
119
|
+
const scheduleCapabilityFor = async (node) => {
|
|
120
|
+
if (!node.schedule)
|
|
121
|
+
return {};
|
|
122
|
+
let authoritative = false;
|
|
123
|
+
try {
|
|
124
|
+
authoritative = await hasDaimonScheduleAuthority();
|
|
125
|
+
}
|
|
126
|
+
catch { /* The lowering gate reports invalid receipt details. */ }
|
|
127
|
+
if (!authoritative) {
|
|
128
|
+
return {
|
|
129
|
+
message: "Daimon v2 schedule state: degraded; the selected image receipt does not attest v2, so no schedule lowering is emitted",
|
|
130
|
+
outcome: "degraded"
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (node.schedule.kind === "disabled") {
|
|
134
|
+
return {
|
|
135
|
+
message: "Daimon v2 schedule state: disabled; normalized=disabled; persistence=none; timer=stopped",
|
|
136
|
+
outcome: "supported"
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const normalized = node.schedule.kind === "every"
|
|
140
|
+
? `every/${parseEveryScheduleMs(node.schedule.every)}ms`
|
|
141
|
+
: `cron/${node.schedule.cron.trim().replace(/\s+/gu, " ")}; zone=${node.schedule.timezone ?? "UTC"}`;
|
|
142
|
+
return {
|
|
143
|
+
message: `Daimon v2 schedule state: supported; normalized=${normalized}; persistence=sha256(agent+schedule) in durable acceptance root; timer=runtime-managed`,
|
|
144
|
+
outcome: "supported"
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
export const daimonAdapter = {
|
|
148
|
+
assertSupportedModelTarget: assertDaimonModel,
|
|
149
|
+
assertSupportedSurfaces: assertDaimonSurfaces,
|
|
150
|
+
container: {
|
|
151
|
+
configFileName: DAIMON_CONFIG_FILE,
|
|
152
|
+
configPathEnv: "SPAWNFILE_DAIMON_CONFIG",
|
|
153
|
+
env: [{
|
|
154
|
+
description: "Bearer token for the Daimon organization control API",
|
|
155
|
+
generated: true,
|
|
156
|
+
name: "SPAWNFILE_DAIMON_CONTROL_TOKEN",
|
|
157
|
+
required: true
|
|
158
|
+
}],
|
|
159
|
+
instancePaths: {
|
|
160
|
+
configPathTemplate: "<instance-root>/daimon/<config-file>",
|
|
161
|
+
sourceWorkspacePathTemplate: "<instance-root>/workspace/agents/<source-slug>",
|
|
162
|
+
workspacePathTemplate: "<instance-root>/workspace"
|
|
163
|
+
},
|
|
164
|
+
port: DAIMON_CONTROL_PORT,
|
|
165
|
+
portEnv: "SPAWNFILE_DAIMON_CONTROL_PORT",
|
|
166
|
+
standaloneBaseImage: "node:24-bookworm-slim",
|
|
167
|
+
startCommand: ["bash", "<runtime-root>/daimon-start.sh"],
|
|
168
|
+
systemDeps: [
|
|
169
|
+
"bash",
|
|
170
|
+
"bubblewrap",
|
|
171
|
+
"ca-certificates",
|
|
172
|
+
"curl",
|
|
173
|
+
"dbus-daemon",
|
|
174
|
+
"gnome-keyring",
|
|
175
|
+
"util-linux"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
async compileAgent(node) {
|
|
179
|
+
unsupportedAgentFeatures(node);
|
|
180
|
+
const scheduleCapability = await scheduleCapabilityFor(node);
|
|
181
|
+
const memorySelectionWarning = daimonMemorySelectionWarning(node);
|
|
182
|
+
const memoryVectorWarning = daimonMemoryVectorRecallWarning(node);
|
|
183
|
+
const workspaceRestrictionWarning = daimonWorkspaceRestrictionWarning(node);
|
|
184
|
+
const codexPolicyError = daimonCodexPolicyError(node);
|
|
185
|
+
const grokSkillWarning = daimonGrokSkillWarning(node);
|
|
186
|
+
return {
|
|
187
|
+
capabilities: createAgentCapabilities(node, {
|
|
188
|
+
mcpOutcome: "supported",
|
|
189
|
+
moltnetMessage: "Daimon exposes one scoped authenticated send tool during real cognition turns",
|
|
190
|
+
moltnetOutcome: "supported",
|
|
191
|
+
...daimonMemoryCapabilityFor(node),
|
|
192
|
+
scheduleMessage: scheduleCapability.message,
|
|
193
|
+
scheduleOutcome: scheduleCapability.outcome
|
|
194
|
+
}),
|
|
195
|
+
diagnostics: [
|
|
196
|
+
...(node.execution?.sandbox
|
|
197
|
+
? [createDiagnostic("warn", "Daimon runtime isolation is enforced by the selected runtime image")]
|
|
198
|
+
: []),
|
|
199
|
+
...(memorySelectionWarning ? [createDiagnostic("warn", memorySelectionWarning)] : []),
|
|
200
|
+
...(memoryVectorWarning ? [createDiagnostic("warn", memoryVectorWarning)] : []),
|
|
201
|
+
...(workspaceRestrictionWarning ? [createDiagnostic("warn", workspaceRestrictionWarning)] : []),
|
|
202
|
+
...(grokSkillWarning ? [createDiagnostic("warn", grokSkillWarning)] : []),
|
|
203
|
+
...(codexPolicyError ? [createDiagnostic("error", codexPolicyError)] : [])
|
|
204
|
+
],
|
|
205
|
+
files: [
|
|
206
|
+
...createDocumentFiles("workspace", node.docs),
|
|
207
|
+
...createSkillFiles(daimonSkillBaseDirectories(node), node.skills)
|
|
208
|
+
]
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
createContainerTargets: createDaimonContainerTargets,
|
|
212
|
+
name: "daimon",
|
|
213
|
+
prepareRuntimeAuth: prepareDaimonRuntimeAuth,
|
|
214
|
+
systemInstructionSurface: {
|
|
215
|
+
placement: "append_pointer",
|
|
216
|
+
resolvePath() {
|
|
217
|
+
return "workspace/AGENTS.md";
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
validateRuntimeOptions(options) {
|
|
221
|
+
const diagnostics = [];
|
|
222
|
+
if (options.engine !== undefined &&
|
|
223
|
+
(typeof options.engine !== "string" || !DAIMON_ENGINES.includes(options.engine))) {
|
|
224
|
+
diagnostics.push(createDiagnostic("error", `Daimon runtime option engine must be one of ${DAIMON_ENGINES.join(", ")}`));
|
|
225
|
+
}
|
|
226
|
+
for (const key of Object.keys(options).filter((key) => !["engine", "restrict_to_workspace", "codex_policy", "attention"].includes(key))) {
|
|
227
|
+
diagnostics.push(createDiagnostic("error", `Daimon runtime option ${key} is not part of organization runtime v1`));
|
|
228
|
+
}
|
|
229
|
+
if (options.codex_policy !== undefined && options.codex_policy !== "workspace-no-network") {
|
|
230
|
+
diagnostics.push(createDiagnostic("error", "Daimon runtime option codex_policy must be workspace-no-network"));
|
|
231
|
+
}
|
|
232
|
+
if (options.codex_policy === "workspace-no-network" && options.engine !== undefined && options.engine !== "codex") {
|
|
233
|
+
diagnostics.push(createDiagnostic("error", "Daimon runtime option codex_policy=workspace-no-network is only supported for Codex agents"));
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
resolveDaimonAttention(options.attention);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
diagnostics.push(createDiagnostic("error", error instanceof Error ? error.message : "Daimon attention is invalid"));
|
|
240
|
+
}
|
|
241
|
+
return diagnostics;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type DaimonAttention = Readonly<{
|
|
2
|
+
maxBatchMessages: number;
|
|
3
|
+
maxBatchBytes: number;
|
|
4
|
+
maxExecutions?: number;
|
|
5
|
+
maxTokens?: number;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const resolveDaimonAttention: (value: unknown) => DaimonAttention | undefined;
|
|
8
|
+
export declare const assertDaimonAttentionAuthority: () => Promise<void>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SpawnfileError } from "../../shared/index.js";
|
|
2
|
+
import { hasDaimonScheduleAuthority } from "./scheduleAuthority.js";
|
|
3
|
+
const fields = {
|
|
4
|
+
max_batch_messages: { target: "maxBatchMessages", minimum: 1, maximum: 32 },
|
|
5
|
+
max_batch_bytes: { target: "maxBatchBytes", minimum: 1024, maximum: 12000 },
|
|
6
|
+
max_executions: { target: "maxExecutions", minimum: 1, maximum: Number.MAX_SAFE_INTEGER },
|
|
7
|
+
max_tokens: { target: "maxTokens", minimum: 1, maximum: Number.MAX_SAFE_INTEGER }
|
|
8
|
+
};
|
|
9
|
+
export const resolveDaimonAttention = (value) => {
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
13
|
+
throw new SpawnfileError("validation_error", "Daimon runtime option attention must be an object");
|
|
14
|
+
}
|
|
15
|
+
const result = { maxBatchMessages: 8, maxBatchBytes: 12000 };
|
|
16
|
+
for (const [key, limit] of Object.entries(value)) {
|
|
17
|
+
if (!Object.hasOwn(fields, key)) {
|
|
18
|
+
throw new SpawnfileError("validation_error", `Daimon runtime option attention.${key} is unsupported`);
|
|
19
|
+
}
|
|
20
|
+
const field = fields[key];
|
|
21
|
+
if (typeof limit !== "number" || !Number.isSafeInteger(limit) || limit < field.minimum || limit > field.maximum) {
|
|
22
|
+
throw new SpawnfileError("validation_error", `Daimon runtime option attention.${key} must be an integer from ${field.minimum} to ${field.maximum}`);
|
|
23
|
+
}
|
|
24
|
+
result[field.target] = limit;
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
export const assertDaimonAttentionAuthority = async () => {
|
|
29
|
+
if (!await hasDaimonScheduleAuthority()) {
|
|
30
|
+
throw new SpawnfileError("runtime_error", "Daimon attention is disabled: the selected image capability receipt does not attest its runtime contract");
|
|
31
|
+
}
|
|
32
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ResolvedAgentNode } from "../../compiler/types.js";
|
|
2
|
+
import type { ContainerTarget, ContainerTargetInput } from "../types.js";
|
|
3
|
+
import { DAIMON_INSTANCE_STATE_ROOT, daimonMemoryCapabilityFor, daimonMemorySelectionWarning, daimonMemoryVectorRecallWarning, resolveDaimonAgentMemory } from "./memory.js";
|
|
4
|
+
export declare const DAIMON_CODEX_WORKSPACE_NO_NETWORK_POLICY: {
|
|
5
|
+
readonly mode: "workspace-write";
|
|
6
|
+
readonly networkAccess: false;
|
|
7
|
+
readonly webSearch: "disabled";
|
|
8
|
+
};
|
|
9
|
+
export { DAIMON_INSTANCE_STATE_ROOT, daimonMemoryCapabilityFor, daimonMemorySelectionWarning, daimonMemoryVectorRecallWarning, resolveDaimonAgentMemory };
|
|
10
|
+
export declare const DAIMON_CONFIG_FILE = "daimon-organization-runtime.json";
|
|
11
|
+
export declare const DAIMON_CONTROL_PORT = 19700;
|
|
12
|
+
export declare const DAIMON_MAX_AGENTS = 32;
|
|
13
|
+
export declare const DAIMON_ORGANIZATION_TARGET_ID = "daimon-organization";
|
|
14
|
+
export declare const DAIMON_RUNTIME_ACCEPTANCE_STORE_DIRECTORY = "state/wake-acceptance";
|
|
15
|
+
export declare const DAIMON_RUNTIME_ACCEPTANCE_STORE_ENV = "DAIMON_RUNTIME_ACCEPTANCE_STORE";
|
|
16
|
+
export declare const DAIMON_RUNTIME_ACCEPTANCE_STORE_MOUNT_ID = "daimon-organization-acceptance-store";
|
|
17
|
+
export declare const DAIMON_RUNTIME_READINESS_RECEIPT_ENV = "DAIMON_RUNTIME_READINESS_RECEIPT";
|
|
18
|
+
export declare const DAIMON_WAKE_FUSE_DIRECTORY = "/var/lib/spawnfile/daimon/wake-fuse";
|
|
19
|
+
export declare const DAIMON_WAKE_FUSE_DIRECTORY_ENV = "DAIMON_WAKE_FUSE_DIRECTORY";
|
|
20
|
+
export declare const DAIMON_WAKE_FUSE_MOUNT_ID = "daimon-wake-fuse";
|
|
21
|
+
export declare const DAIMON_RUNTIME_HOMES_DIRECTORY = "runtime-homes";
|
|
22
|
+
export declare const DAIMON_ENGINES: readonly ["agy", "codex", "grok"];
|
|
23
|
+
type DaimonEngine = typeof DAIMON_ENGINES[number];
|
|
24
|
+
export declare const resolveDaimonEngine: (node: ResolvedAgentNode) => DaimonEngine;
|
|
25
|
+
export declare const createDaimonContainerTargets: (inputs: ContainerTargetInput[]) => Promise<ContainerTarget[]>;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { parseEveryScheduleMs } from "../scheduleUtils.js";
|
|
3
|
+
import { SpawnfileError } from "../../shared/index.js";
|
|
4
|
+
import { DAIMON_AGY_SUBSCRIPTION_REALM, DAIMON_ENGINE_CREDENTIALS, DAIMON_GROK_SUBSCRIPTION_REALM, DAIMON_GROK_TURN_USAGE_LEDGER } from "./contractManifest.js";
|
|
5
|
+
import { DAIMON_INSTANCE_STATE_ROOT, daimonMemoryCapabilityFor, daimonMemorySelectionWarning, daimonMemoryVectorRecallWarning, resolveDaimonAgentMemory } from "./memory.js";
|
|
6
|
+
import { assertDaimonScheduleAuthority } from "./scheduleAuthority.js";
|
|
7
|
+
import { assertDaimonAttentionAuthority, resolveDaimonAttention } from "./attention.js";
|
|
8
|
+
import { resolveDaimonGrokModel } from "./grokModel.js";
|
|
9
|
+
export const DAIMON_CODEX_WORKSPACE_NO_NETWORK_POLICY = { mode: "workspace-write", networkAccess: false, webSearch: "disabled" };
|
|
10
|
+
// Re-exported so every existing importer of these names keeps working; the
|
|
11
|
+
// definitions themselves now live in `./memory.js`.
|
|
12
|
+
export { DAIMON_INSTANCE_STATE_ROOT, daimonMemoryCapabilityFor, daimonMemorySelectionWarning, daimonMemoryVectorRecallWarning, resolveDaimonAgentMemory };
|
|
13
|
+
export const DAIMON_CONFIG_FILE = "daimon-organization-runtime.json";
|
|
14
|
+
export const DAIMON_CONTROL_PORT = 19700;
|
|
15
|
+
export const DAIMON_MAX_AGENTS = 32;
|
|
16
|
+
export const DAIMON_ORGANIZATION_TARGET_ID = "daimon-organization";
|
|
17
|
+
export const DAIMON_RUNTIME_ACCEPTANCE_STORE_DIRECTORY = "state/wake-acceptance";
|
|
18
|
+
export const DAIMON_RUNTIME_ACCEPTANCE_STORE_ENV = "DAIMON_RUNTIME_ACCEPTANCE_STORE";
|
|
19
|
+
export const DAIMON_RUNTIME_ACCEPTANCE_STORE_MOUNT_ID = "daimon-organization-acceptance-store";
|
|
20
|
+
export const DAIMON_RUNTIME_READINESS_RECEIPT_ENV = "DAIMON_RUNTIME_READINESS_RECEIPT";
|
|
21
|
+
export const DAIMON_WAKE_FUSE_DIRECTORY = "/var/lib/spawnfile/daimon/wake-fuse";
|
|
22
|
+
export const DAIMON_WAKE_FUSE_DIRECTORY_ENV = "DAIMON_WAKE_FUSE_DIRECTORY";
|
|
23
|
+
export const DAIMON_WAKE_FUSE_MOUNT_ID = "daimon-wake-fuse";
|
|
24
|
+
export const DAIMON_RUNTIME_HOMES_DIRECTORY = "runtime-homes";
|
|
25
|
+
const DAIMON_MAX_CONFIG_BYTES = 1_048_576;
|
|
26
|
+
const DAIMON_MAX_INSTRUCTION_BYTES = 16_384;
|
|
27
|
+
const DAIMON_MAX_INSTRUCTION_CODEPOINTS = 16_384;
|
|
28
|
+
export const DAIMON_ENGINES = ["agy", "codex", "grok"];
|
|
29
|
+
const normalizeSchedule = (node) => {
|
|
30
|
+
const schedule = node.schedule;
|
|
31
|
+
if (!schedule || schedule.kind === "disabled")
|
|
32
|
+
return schedule ? { kind: "disabled" } : undefined;
|
|
33
|
+
if (schedule.kind === "every") {
|
|
34
|
+
const interval_ms = parseEveryScheduleMs(schedule.every);
|
|
35
|
+
if (interval_ms === null)
|
|
36
|
+
throw new SpawnfileError("validation_error", `invalid every schedule for ${node.name}`);
|
|
37
|
+
return {
|
|
38
|
+
kind: "every", interval_ms, prompt: schedule.prompt ?? "Scheduled work",
|
|
39
|
+
...(schedule.jitter_seconds === undefined ? {} : { jitter_seconds: schedule.jitter_seconds })
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
cron: schedule.cron.trim().replace(/\s+/gu, " "),
|
|
44
|
+
kind: "cron",
|
|
45
|
+
prompt: schedule.prompt ?? "Scheduled work",
|
|
46
|
+
timezone: schedule.timezone ?? "UTC",
|
|
47
|
+
...(schedule.jitter_seconds === undefined ? {} : { jitter_seconds: schedule.jitter_seconds })
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const formatInstructions = (node) => node.docs.map((document) => `# ${document.role}\n\n${document.content}`).join("\n\n").trim() ||
|
|
51
|
+
`You are ${node.name}. Follow the workspace instructions.`;
|
|
52
|
+
const assertPublicInstructionBounds = (agentId, instructions) => {
|
|
53
|
+
if (Buffer.byteLength(instructions, "utf8") > DAIMON_MAX_INSTRUCTION_BYTES ||
|
|
54
|
+
[...instructions].length > DAIMON_MAX_INSTRUCTION_CODEPOINTS) {
|
|
55
|
+
throw new SpawnfileError("validation_error", `Daimon organization runtime v1 instructions for ${agentId} exceed Daimon's public config limit`);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export const resolveDaimonEngine = (node) => {
|
|
59
|
+
const engine = node.runtime.options.engine ?? "codex";
|
|
60
|
+
if (typeof engine === "string" && DAIMON_ENGINES.includes(engine)) {
|
|
61
|
+
return engine;
|
|
62
|
+
}
|
|
63
|
+
throw new SpawnfileError("validation_error", `Daimon runtime option engine must be one of ${DAIMON_ENGINES.join(", ")}`);
|
|
64
|
+
};
|
|
65
|
+
const resolveDaimonEngineConfig = (node) => {
|
|
66
|
+
const kind = resolveDaimonEngine(node);
|
|
67
|
+
if (kind === "grok") {
|
|
68
|
+
const declared = resolveDaimonGrokModel(node);
|
|
69
|
+
return { kind, model: declared.model, reasoningEffort: declared.reasoningEffort };
|
|
70
|
+
}
|
|
71
|
+
const model = kind === "codex" ? node.execution?.model?.primary?.name : undefined;
|
|
72
|
+
const codexSandbox = kind === "codex" && node.runtime.options.codex_policy === "workspace-no-network"
|
|
73
|
+
? DAIMON_CODEX_WORKSPACE_NO_NETWORK_POLICY
|
|
74
|
+
: undefined;
|
|
75
|
+
return {
|
|
76
|
+
kind,
|
|
77
|
+
...(model === undefined ? {} : { model }),
|
|
78
|
+
...(codexSandbox === undefined ? {} : { codexSandbox })
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
const moveWorkspaceFile = (file, slug) => file.path.startsWith("workspace/")
|
|
82
|
+
? { ...file, path: path.posix.join("workspace", "agents", slug, file.path.slice("workspace/".length)) }
|
|
83
|
+
: file;
|
|
84
|
+
const renderStartScript = (agents) => {
|
|
85
|
+
const acceptanceStorePath = `<instance-root>/${DAIMON_RUNTIME_ACCEPTANCE_STORE_DIRECTORY}`;
|
|
86
|
+
const readinessReceiptPath = `${acceptanceStorePath}/runtime-readiness.json`;
|
|
87
|
+
const setup = agents.flatMap((agent) => {
|
|
88
|
+
const credential = agent.engine.kind === "codex"
|
|
89
|
+
? DAIMON_ENGINE_CREDENTIALS.codex
|
|
90
|
+
: undefined;
|
|
91
|
+
const inbound = path.posix.join(agent.runtimeHomePath, ".daimon-inbound");
|
|
92
|
+
return [
|
|
93
|
+
// The workspace mode is owned by the uid entrypoint, which grants a grok worker
|
|
94
|
+
// group access. Forcing 0700 here would lock that worker out of its own workspace,
|
|
95
|
+
// so create it only when absent and never restate the mode of an existing directory.
|
|
96
|
+
`[ -d ${JSON.stringify(agent.workspacePath)} ] || install -d -m 700 ${JSON.stringify(agent.workspacePath)}`,
|
|
97
|
+
// A Grok agent's runtime home is traversable by its worker's group (the
|
|
98
|
+
// broker provisioning grants `0710` so the worker can read its setgid
|
|
99
|
+
// `tool-output/` spills); restating 0700 here would revoke that.
|
|
100
|
+
agent.engine.kind === "grok"
|
|
101
|
+
? `[ -d ${JSON.stringify(agent.runtimeHomePath)} ] || install -d -m 700 ${JSON.stringify(agent.runtimeHomePath)}`
|
|
102
|
+
: `install -d -m 700 ${[
|
|
103
|
+
agent.runtimeHomePath,
|
|
104
|
+
...(credential === undefined ? [] : [inbound])
|
|
105
|
+
].map((entry) => JSON.stringify(entry)).join(" ")}`,
|
|
106
|
+
...(credential === undefined ? [] : [
|
|
107
|
+
`if [ -e ${JSON.stringify(path.posix.join(agent.runtimeHomePath, credential.sourceRelativePath))} ]; then test "$(stat -c %a ${JSON.stringify(path.posix.join(agent.runtimeHomePath, credential.sourceRelativePath))})" = 600; fi`
|
|
108
|
+
])
|
|
109
|
+
];
|
|
110
|
+
});
|
|
111
|
+
return [
|
|
112
|
+
"#!/usr/bin/env bash",
|
|
113
|
+
"set -euo pipefail",
|
|
114
|
+
`install -d -m 700 ${JSON.stringify(acceptanceStorePath)}`,
|
|
115
|
+
`export ${DAIMON_RUNTIME_ACCEPTANCE_STORE_ENV}=${JSON.stringify(acceptanceStorePath)}`,
|
|
116
|
+
`rm -f ${JSON.stringify(readinessReceiptPath)}`,
|
|
117
|
+
`export ${DAIMON_RUNTIME_READINESS_RECEIPT_ENV}=${JSON.stringify(readinessReceiptPath)}`,
|
|
118
|
+
...setup,
|
|
119
|
+
'if [ "$#" -gt 0 ]; then exec daimon-runtime "$@"; fi',
|
|
120
|
+
"exec daimon-runtime run --config <config-path>"
|
|
121
|
+
].join("\n") + "\n";
|
|
122
|
+
};
|
|
123
|
+
export const createDaimonContainerTargets = async (inputs) => {
|
|
124
|
+
const agents = inputs.filter((input) => input.kind === "agent" && input.value.kind === "agent");
|
|
125
|
+
if (agents.length === 0)
|
|
126
|
+
return [];
|
|
127
|
+
if (agents.length > DAIMON_MAX_AGENTS) {
|
|
128
|
+
throw new SpawnfileError("validation_error", `Daimon organization runtime v1 supports at most 32 agents; found ${agents.length}. Split the organization across explicit runtime boundaries.`);
|
|
129
|
+
}
|
|
130
|
+
const hasSchedules = agents.some((input) => input.value.schedule !== undefined);
|
|
131
|
+
const attentionById = new Map(agents.map((input) => [input.id, resolveDaimonAttention(input.value.runtime.options.attention)]));
|
|
132
|
+
const hasAttention = [...attentionById.values()].some((attention) => attention !== undefined);
|
|
133
|
+
if (hasAttention)
|
|
134
|
+
await assertDaimonAttentionAuthority();
|
|
135
|
+
if (hasSchedules)
|
|
136
|
+
await assertDaimonScheduleAuthority();
|
|
137
|
+
const configAgents = agents
|
|
138
|
+
.map((input) => {
|
|
139
|
+
const memory = resolveDaimonAgentMemory(input.value);
|
|
140
|
+
return {
|
|
141
|
+
engine: resolveDaimonEngineConfig(input.value),
|
|
142
|
+
id: input.id,
|
|
143
|
+
instructions: formatInstructions(input.value),
|
|
144
|
+
name: input.value.name,
|
|
145
|
+
...(input.value.mcpServers.length === 0 ? {} : { mcp: input.value.mcpServers.map((server) => ({
|
|
146
|
+
name: server.name, transport: server.transport, args: server.args ?? [], env: server.env ?? {}, tools: server.tools,
|
|
147
|
+
...(server.command ? { command: server.command } : {}), ...(server.url ? { url: server.url } : {}),
|
|
148
|
+
...(server.auth?.mode === "bearer" ? { authSecretEnv: server.auth.secret } : {})
|
|
149
|
+
})) }),
|
|
150
|
+
...(memory ? { memory } : {}),
|
|
151
|
+
...(attentionById.get(input.id) === undefined ? {} : { attention: attentionById.get(input.id) }),
|
|
152
|
+
...(input.value.surfaces?.moltnet?.length ? { moltnet: {
|
|
153
|
+
cliPath: "/usr/local/bin/moltnet",
|
|
154
|
+
configPath: `<workspace-path>/agents/${input.slug}/.moltnet/config.json`,
|
|
155
|
+
networks: input.value.surfaces.moltnet.map((attachment) => ({ id: attachment.network, rooms: Object.keys(attachment.rooms ?? {}).sort(), dms: attachment.dms?.enabled === true }))
|
|
156
|
+
} } : {}),
|
|
157
|
+
runtimeHomePath: `<instance-root>/${DAIMON_RUNTIME_HOMES_DIRECTORY}/${input.slug}`,
|
|
158
|
+
workspacePath: `<workspace-path>/agents/${input.slug}`,
|
|
159
|
+
...(hasSchedules || hasAttention ? { schedule: normalizeSchedule(input.value) ?? { kind: "disabled" } } : {})
|
|
160
|
+
};
|
|
161
|
+
})
|
|
162
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
163
|
+
const engineByNodeId = Object.fromEntries(configAgents.map((agent) => [agent.id, agent.engine.kind]));
|
|
164
|
+
const grokModelByNodeId = Object.fromEntries(configAgents
|
|
165
|
+
.filter((agent) => agent.engine.kind === "grok" && agent.engine.model !== undefined && agent.engine.reasoningEffort !== undefined)
|
|
166
|
+
.map((agent) => [agent.id, { model: agent.engine.model, reasoningEffort: agent.engine.reasoningEffort }]));
|
|
167
|
+
const hasAgy = configAgents.some((agent) => agent.engine.kind === "agy");
|
|
168
|
+
const hasGrok = configAgents.some((agent) => agent.engine.kind === "grok");
|
|
169
|
+
const agyRuntimeHomeMounts = configAgents
|
|
170
|
+
.filter((agent) => agent.engine.kind === "agy")
|
|
171
|
+
.map((agent) => ({
|
|
172
|
+
id: `daimon-agy-runtime-home-${path.posix.basename(agent.runtimeHomePath)}`,
|
|
173
|
+
mountPath: agent.runtimeHomePath,
|
|
174
|
+
reason: `Daimon AGY subscription runtime home for ${agent.id}`
|
|
175
|
+
}));
|
|
176
|
+
const portableEngineHomeMounts = configAgents
|
|
177
|
+
.filter((agent) => agent.engine.kind !== "agy")
|
|
178
|
+
.map((agent) => {
|
|
179
|
+
const destinationRelativePath = agent.engine.kind === "grok"
|
|
180
|
+
? DAIMON_GROK_SUBSCRIPTION_REALM.agentCredentialRelativePath
|
|
181
|
+
: DAIMON_ENGINE_CREDENTIALS.codex.destinationRelativePath;
|
|
182
|
+
return {
|
|
183
|
+
id: `daimon-engine-home-${agent.engine.kind}-${path.posix.basename(agent.runtimeHomePath)}`,
|
|
184
|
+
mountPath: path.posix.join(agent.runtimeHomePath, path.posix.dirname(destinationRelativePath)),
|
|
185
|
+
reason: `Daimon ${agent.engine.kind} subscription credential home for ${agent.id}`
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
const toolStateMounts = configAgents.map((agent) => ({ id: `daimon-tool-state-${path.posix.basename(agent.runtimeHomePath)}`, mountPath: path.posix.join(agent.runtimeHomePath, "tool-state"), reason: `Daimon durable cognition tool receipts for ${agent.id}` }));
|
|
189
|
+
for (const agent of configAgents)
|
|
190
|
+
assertPublicInstructionBounds(agent.id, agent.instructions);
|
|
191
|
+
const config = {
|
|
192
|
+
agents: configAgents,
|
|
193
|
+
host: {
|
|
194
|
+
bindHost: "127.0.0.1",
|
|
195
|
+
controlTokenEnv: "SPAWNFILE_DAIMON_CONTROL_TOKEN",
|
|
196
|
+
port: DAIMON_CONTROL_PORT
|
|
197
|
+
},
|
|
198
|
+
version: hasSchedules || hasAttention
|
|
199
|
+
? "noopolis.daimon.organization-runtime.v2"
|
|
200
|
+
: "noopolis.daimon.organization-runtime.v1"
|
|
201
|
+
};
|
|
202
|
+
const serializedConfig = `${JSON.stringify(config, null, 2)}\n`;
|
|
203
|
+
if (Buffer.byteLength(serializedConfig, "utf8") > DAIMON_MAX_CONFIG_BYTES) {
|
|
204
|
+
throw new SpawnfileError("validation_error", "Daimon organization runtime v1 config exceeds Daimon's public config limit");
|
|
205
|
+
}
|
|
206
|
+
return [{
|
|
207
|
+
engineByNodeId,
|
|
208
|
+
...(hasGrok ? { grokModelByNodeId } : {}),
|
|
209
|
+
files: [
|
|
210
|
+
...agents.flatMap((input) => input.emittedFiles.map((file) => moveWorkspaceFile(file, input.slug))),
|
|
211
|
+
{ content: serializedConfig, path: DAIMON_CONFIG_FILE },
|
|
212
|
+
{
|
|
213
|
+
content: renderStartScript(configAgents),
|
|
214
|
+
mode: 0o755,
|
|
215
|
+
path: "runtime/daimon-start.sh"
|
|
216
|
+
}
|
|
217
|
+
],
|
|
218
|
+
id: DAIMON_ORGANIZATION_TARGET_ID,
|
|
219
|
+
...(hasAgy || hasGrok ? {
|
|
220
|
+
opaqueMountTargets: [
|
|
221
|
+
...(hasAgy ? [DAIMON_AGY_SUBSCRIPTION_REALM.unlockMountPath] : []),
|
|
222
|
+
...(hasGrok ? [DAIMON_GROK_SUBSCRIPTION_REALM.bootstrapMountPath] : [])
|
|
223
|
+
],
|
|
224
|
+
} : {}),
|
|
225
|
+
persistentMounts: [...portableEngineHomeMounts, ...toolStateMounts, {
|
|
226
|
+
id: DAIMON_RUNTIME_ACCEPTANCE_STORE_MOUNT_ID,
|
|
227
|
+
mountPath: `<instance-root>/${DAIMON_RUNTIME_ACCEPTANCE_STORE_DIRECTORY}`,
|
|
228
|
+
reason: "Daimon organization durable wake acceptance store"
|
|
229
|
+
}, {
|
|
230
|
+
id: DAIMON_WAKE_FUSE_MOUNT_ID,
|
|
231
|
+
lifecycle: "exclusive-reattach",
|
|
232
|
+
mountPath: DAIMON_WAKE_FUSE_DIRECTORY,
|
|
233
|
+
reason: "Daimon durable wake-fuse admission ledger"
|
|
234
|
+
}, ...(hasGrok ? [{
|
|
235
|
+
id: "daimon-grok-subscription-realm",
|
|
236
|
+
lifecycle: "exclusive-reattach",
|
|
237
|
+
mountPath: DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath,
|
|
238
|
+
reason: "Daimon host Grok subscription credential realm"
|
|
239
|
+
}] : []), {
|
|
240
|
+
// Non-run-scoped for the same reason as the durable memory mounts (see
|
|
241
|
+
// durableMemoryVolumeName in src/compiler/memoryArtifacts.ts): a
|
|
242
|
+
// run-scoped volume means every `spawnfile up` starts a new empty
|
|
243
|
+
// ledger and cross-deployment usage accounting is impossible. The
|
|
244
|
+
// exclusive reservation this lifecycle carries is a requirement, not a
|
|
245
|
+
// cost.
|
|
246
|
+
// The mount id is deliberately unchanged now that AGY and Codex write
|
|
247
|
+
// here too, not just the broker: it is the volume's identity, and
|
|
248
|
+
// renaming it would orphan every existing deployment's accumulated
|
|
249
|
+
// ledger. Unconditional (not gated on hasGrok/hasAgy) because Daimon's
|
|
250
|
+
// wake fuse now refuses to arm at all if this directory or the ledger
|
|
251
|
+
// file inside it is missing or unreadable (`wakeFuse.ts`,
|
|
252
|
+
// `ensureUsageLedgerReadable`), and Codex also writes here
|
|
253
|
+
// (`engineDispatcher.ts`'s `onTurnUsage`) even in a codex-only
|
|
254
|
+
// organization with no Grok or AGY agent at all.
|
|
255
|
+
id: "daimon-grok-usage-ledger",
|
|
256
|
+
lifecycle: "exclusive-reattach",
|
|
257
|
+
mountPath: DAIMON_GROK_TURN_USAGE_LEDGER.directoryPath,
|
|
258
|
+
reason: "Daimon per-turn engine usage ledger"
|
|
259
|
+
}, ...(hasAgy ? [{
|
|
260
|
+
id: "daimon-agy-subscription-realm",
|
|
261
|
+
// The AGY subscription credential is an OS-keyring entry created by an
|
|
262
|
+
// interactive browser OAuth that has no headless equivalent; it lives
|
|
263
|
+
// in this volume. Without this lifecycle the volume name folds in the
|
|
264
|
+
// run id, so every `spawnfile up` would hand the container an empty
|
|
265
|
+
// keyring and the operator would have to re-enrol by hand.
|
|
266
|
+
lifecycle: "exclusive-reattach",
|
|
267
|
+
mountPath: DAIMON_AGY_SUBSCRIPTION_REALM.durableMountPath,
|
|
268
|
+
reason: "Daimon host AGY subscription realm"
|
|
269
|
+
}, ...agyRuntimeHomeMounts] : [])],
|
|
270
|
+
sourceIds: agents.map((agent) => agent.id).sort()
|
|
271
|
+
}];
|
|
272
|
+
};
|