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
|
@@ -2,6 +2,9 @@ import type { DiagnosticReport } from "../report/index.js";
|
|
|
2
2
|
import type { RuntimeLifecycleStatus } from "../shared/index.js";
|
|
3
3
|
import type { RuntimeAdapter } from "./types.js";
|
|
4
4
|
export type RuntimeRegistryInstall = {
|
|
5
|
+
capabilityReceipt?: string;
|
|
6
|
+
contractManifestSha256?: string;
|
|
7
|
+
digest?: string;
|
|
5
8
|
image: string;
|
|
6
9
|
kind: "container_image";
|
|
7
10
|
tag: string;
|
package/dist/runtime/registry.js
CHANGED
|
@@ -3,7 +3,8 @@ import { parse as parseYaml } from "yaml";
|
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
5
|
import { openClawAdapter } from "./openclaw/adapter.js";
|
|
6
|
-
import { daimonAdapter
|
|
6
|
+
import { daimonAdapter } from "./daimon/adapter.js";
|
|
7
|
+
import { piAdapter } from "./pi/adapter.js";
|
|
7
8
|
import { picoClawAdapter } from "./picoclaw/adapter.js";
|
|
8
9
|
const runtimeAdapters = new Map([
|
|
9
10
|
[daimonAdapter.name, daimonAdapter],
|
|
@@ -14,6 +15,9 @@ const runtimeAdapters = new Map([
|
|
|
14
15
|
const runtimeInstallSchema = z.discriminatedUnion("kind", [
|
|
15
16
|
z
|
|
16
17
|
.object({
|
|
18
|
+
capability_receipt: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
19
|
+
contract_manifest_sha256: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
20
|
+
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
17
21
|
image: z.string().min(1),
|
|
18
22
|
kind: z.literal("container_image"),
|
|
19
23
|
tag: z.string().min(1)
|
|
@@ -62,7 +66,20 @@ export const parseRuntimeRegistry = (source) => {
|
|
|
62
66
|
return Object.entries(parsed.runtimes)
|
|
63
67
|
.map(([name, entry]) => ({
|
|
64
68
|
defaultBranch: entry.default_branch,
|
|
65
|
-
install: entry.install
|
|
69
|
+
install: entry.install?.kind === "container_image"
|
|
70
|
+
? {
|
|
71
|
+
...(entry.install.capability_receipt
|
|
72
|
+
? { capabilityReceipt: entry.install.capability_receipt }
|
|
73
|
+
: {}),
|
|
74
|
+
...(entry.install.contract_manifest_sha256
|
|
75
|
+
? { contractManifestSha256: entry.install.contract_manifest_sha256 }
|
|
76
|
+
: {}),
|
|
77
|
+
...(entry.install.digest ? { digest: entry.install.digest } : {}),
|
|
78
|
+
image: entry.install.image,
|
|
79
|
+
kind: entry.install.kind,
|
|
80
|
+
tag: entry.install.tag
|
|
81
|
+
}
|
|
82
|
+
: entry.install,
|
|
66
83
|
name,
|
|
67
84
|
ref: entry.ref,
|
|
68
85
|
remote: entry.remote,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export const isEveryScheduleValue = (value) => /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/u.test(value.trim());
|
|
2
|
+
export const MAX_SCHEDULE_INTERVAL_MS = 31_536_000_000;
|
|
2
3
|
export const parseEveryScheduleMs = (value) => {
|
|
3
4
|
const match = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/u.exec(value.trim());
|
|
4
5
|
if (!match) {
|
|
@@ -11,5 +12,8 @@ export const parseEveryScheduleMs = (value) => {
|
|
|
11
12
|
ms: 1,
|
|
12
13
|
s: 1000
|
|
13
14
|
};
|
|
14
|
-
|
|
15
|
+
const milliseconds = Math.round(Number(match[1]) * multipliers[match[2] ?? "ms"]);
|
|
16
|
+
return Number.isSafeInteger(milliseconds) && milliseconds >= 1 && milliseconds <= MAX_SCHEDULE_INTERVAL_MS
|
|
17
|
+
? milliseconds
|
|
18
|
+
: null;
|
|
15
19
|
};
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -27,6 +27,12 @@ export interface ContainerTargetEnvFile {
|
|
|
27
27
|
envName: string;
|
|
28
28
|
relativePath: string;
|
|
29
29
|
}
|
|
30
|
+
export interface ContainerTargetPersistentMount {
|
|
31
|
+
id: string;
|
|
32
|
+
lifecycle?: "exclusive-reattach";
|
|
33
|
+
mountPath: string;
|
|
34
|
+
reason: string;
|
|
35
|
+
}
|
|
30
36
|
export type RuntimeContainerConfigValueTransform = "bearer";
|
|
31
37
|
export interface ContainerTarget {
|
|
32
38
|
configEnvBindings?: RuntimeContainerConfigEnvBinding[];
|
|
@@ -40,8 +46,15 @@ export interface ContainerTarget {
|
|
|
40
46
|
*/
|
|
41
47
|
engineByNodeId?: Record<string, string>;
|
|
42
48
|
envFiles?: ContainerTargetEnvFile[];
|
|
49
|
+
/** Daimon only: each brokered Grok agent's declared model and reasoning effort, which select its pinned worker config. */
|
|
50
|
+
grokModelByNodeId?: Record<string, {
|
|
51
|
+
model: string;
|
|
52
|
+
reasoningEffort: string;
|
|
53
|
+
}>;
|
|
43
54
|
files: EmittedFile[];
|
|
44
55
|
id: string;
|
|
56
|
+
opaqueMountTargets?: string[];
|
|
57
|
+
persistentMounts?: ContainerTargetPersistentMount[];
|
|
45
58
|
sourceIds?: string[];
|
|
46
59
|
/** World token env names actually lowered into this target's native config. */
|
|
47
60
|
worldTokenEnvNames?: string[];
|
|
@@ -104,6 +117,14 @@ export interface RuntimeAuthPreparationInput {
|
|
|
104
117
|
* `null` — only the profile-derived `imports` lookups are unavailable.
|
|
105
118
|
*/
|
|
106
119
|
authProfile: ResolvedAuthProfile | null;
|
|
120
|
+
/**
|
|
121
|
+
* The uid the deployed container reads bind-mounted credential files as.
|
|
122
|
+
* Credential mounts carry their host owner through unchanged, so an adapter
|
|
123
|
+
* whose runtime validates a credential's owner in-container must refuse a
|
|
124
|
+
* mismatch here rather than at readiness. Omitted means "the uid the runtime
|
|
125
|
+
* is compiled to run as", which is what every real deployment uses.
|
|
126
|
+
*/
|
|
127
|
+
containerCredentialUid?: number;
|
|
107
128
|
env: Record<string, string>;
|
|
108
129
|
instance: RuntimeAuthInstance;
|
|
109
130
|
outputDirectory: string;
|
|
@@ -111,6 +132,10 @@ export interface RuntimeAuthPreparationInput {
|
|
|
111
132
|
}
|
|
112
133
|
export interface RuntimeAuthPreparationResult {
|
|
113
134
|
coveredModelSecrets: string[];
|
|
135
|
+
launchIdentity?: {
|
|
136
|
+
kind: "daimon";
|
|
137
|
+
uid: number;
|
|
138
|
+
};
|
|
114
139
|
mountArgs: string[];
|
|
115
140
|
}
|
|
116
141
|
export interface RuntimeProbeExecResult {
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure reader/aggregator for Daimon's per-turn usage ledger
|
|
3
|
+
* (`noopolis.daimon.turn-usage.v1`, see `specs/USAGE_ACCOUNTING_DESIGN.md`). This
|
|
4
|
+
* module never touches Docker, the filesystem, or a deployment record — it
|
|
5
|
+
* only knows how to parse ledger text and window/group already-parsed
|
|
6
|
+
* records. The transport (deciding whether to `docker exec` or fall back to
|
|
7
|
+
* volume egress, and where the ledger actually lives) is a CLI-layer concern
|
|
8
|
+
* in `src/cli/usageCommandLive.ts`, which composes this module with
|
|
9
|
+
* `src/deployment`'s docker probe gateway and volume-egress helpers. Keeping
|
|
10
|
+
* that composition out of this folder avoids a value-level import cycle:
|
|
11
|
+
* `src/deployment` already imports real (non-type) exports from this folder
|
|
12
|
+
* (`dockerManager.ts`'s `resolveNoopolisRunId`), so this folder must not
|
|
13
|
+
* import real exports back from `src/deployment`.
|
|
14
|
+
*
|
|
15
|
+
* The read transport itself (`readUsageLedgerViaExec`, and the rule for when
|
|
16
|
+
* a failed `cat` means "empty" versus "unknown") lives beside this file in
|
|
17
|
+
* `usageLedgerRead.ts`, so this module performs no I/O at all.
|
|
18
|
+
*/
|
|
19
|
+
export declare const USAGE_TURN_RECORD_VERSION: "noopolis.daimon.turn-usage.v1";
|
|
20
|
+
/** One parsed, validated line from the usage ledger. */
|
|
21
|
+
export interface UsageRecord {
|
|
22
|
+
agent: string;
|
|
23
|
+
at: string;
|
|
24
|
+
cache_read: number;
|
|
25
|
+
cache_write: number;
|
|
26
|
+
calls: number;
|
|
27
|
+
complete: boolean;
|
|
28
|
+
engine: string;
|
|
29
|
+
input: number;
|
|
30
|
+
notional_usd: number;
|
|
31
|
+
output: number;
|
|
32
|
+
total: number;
|
|
33
|
+
v: typeof USAGE_TURN_RECORD_VERSION;
|
|
34
|
+
wake: string;
|
|
35
|
+
/** Broker rows: the sha256 turn id every reader dedupes on (a replay may re-append a sealed row). */
|
|
36
|
+
turn?: string;
|
|
37
|
+
/** Broker rows: which per-turn limit ended the turn (`none` when none did). */
|
|
38
|
+
limit_reason?: UsageLimitReason;
|
|
39
|
+
/** Broker rows: the declared model the broker verified the turn ran. */
|
|
40
|
+
model?: string;
|
|
41
|
+
/** Broker rows: requests charged a conservative estimate because the provider response carried no valid usage. */
|
|
42
|
+
estimated_requests?: number;
|
|
43
|
+
outcome?: "completed" | "failed";
|
|
44
|
+
}
|
|
45
|
+
export declare const USAGE_LIMIT_REASONS: readonly ["tokens", "requests", "timeout", "none"];
|
|
46
|
+
export type UsageLimitReason = typeof USAGE_LIMIT_REASONS[number];
|
|
47
|
+
/**
|
|
48
|
+
* Keeps the first row of every `turn` and every row without one.
|
|
49
|
+
*
|
|
50
|
+
* Daimon's broker seals a turn's ledger bytes into the turn record and appends
|
|
51
|
+
* them again on replay when it cannot see the row, so two replays of one sealed
|
|
52
|
+
* turn can both append identical bytes. The key exists precisely so such a turn
|
|
53
|
+
* is never counted twice; every aggregate here must see deduplicated rows.
|
|
54
|
+
* Readers keep every parsed row so {@link findConflictingUsageTurns} can see
|
|
55
|
+
* rows that share a key but differ.
|
|
56
|
+
*/
|
|
57
|
+
export declare const dedupeUsageRecordsByTurn: (records: UsageRecord[]) => UsageRecord[];
|
|
58
|
+
/**
|
|
59
|
+
* `turn` keys whose rows are not byte-for-byte the same record. A replay
|
|
60
|
+
* re-appends identical sealed bytes, so differing rows under one key mean the
|
|
61
|
+
* ledger is not what the broker sealed; the first row is still the one counted,
|
|
62
|
+
* but the window is reported PARTIAL and the keys are named.
|
|
63
|
+
*/
|
|
64
|
+
export declare const findConflictingUsageTurns: (records: UsageRecord[]) => string[];
|
|
65
|
+
/**
|
|
66
|
+
* Parses one ledger line. Returns `null` (never throws) for: blank lines,
|
|
67
|
+
* JSON that fails to parse (this is also how a torn trailing line left by a
|
|
68
|
+
* crash mid-append is skipped — a truncated JSON object fails to parse the
|
|
69
|
+
* same way a garbled line would), a schema version other than
|
|
70
|
+
* `noopolis.daimon.turn-usage.v1`, a missing/empty string field, an `at` that
|
|
71
|
+
* doesn't parse as a date, a non-boolean `complete`, or any numeric field
|
|
72
|
+
* that isn't a finite, non-negative number.
|
|
73
|
+
*/
|
|
74
|
+
export declare const parseUsageLedgerLine: (line: string) => UsageRecord | null;
|
|
75
|
+
/**
|
|
76
|
+
* Parses a newline-delimited ledger file. Never throws: an unparseable line —
|
|
77
|
+
* including an unterminated trailing line left by a crash mid-append — is
|
|
78
|
+
* skipped, and the rest of the file still parses.
|
|
79
|
+
*/
|
|
80
|
+
export declare const parseUsageLedger: (text: string) => UsageRecord[];
|
|
81
|
+
/** The default window `spawnfile usage` uses when `--since` is omitted. */
|
|
82
|
+
export declare const DEFAULT_USAGE_SINCE = "24h";
|
|
83
|
+
/** Parses a duration like `"24h"`, `"7d"`, or `"30m"` into milliseconds.
|
|
84
|
+
* Returns `null` for anything else — the caller is responsible for turning
|
|
85
|
+
* that into a user-facing input error. */
|
|
86
|
+
export declare const parseUsageSinceDuration: (input: string) => number | null;
|
|
87
|
+
/** Keeps only records at or after `now - sinceMs`. `now` defaults to the real
|
|
88
|
+
* clock; tests pass a fixed value. */
|
|
89
|
+
export declare const filterUsageRecordsSince: (records: UsageRecord[], sinceMs: number, now?: number) => UsageRecord[];
|
|
90
|
+
/** A roster entry: one agent the org compiled, and the engine it was
|
|
91
|
+
* assigned — independent of whether it ever produced a usage record (a
|
|
92
|
+
* Codex-engine agent is uninstrumented and will never appear in the ledger,
|
|
93
|
+
* but still belongs in the roster so coverage/grouping can show it with
|
|
94
|
+
* zeroes rather than silently omitting it). */
|
|
95
|
+
export interface UsageRosterEntry {
|
|
96
|
+
agent: string;
|
|
97
|
+
/** `null` when the roster source cannot name the agent's engine — a
|
|
98
|
+
* deployment record lists agents but not engine assignment, so the engine is
|
|
99
|
+
* learned from the agent's own ledger records and stays `null` for an agent
|
|
100
|
+
* that never reports. */
|
|
101
|
+
engine: string | null;
|
|
102
|
+
}
|
|
103
|
+
export interface UsageAgentGroup {
|
|
104
|
+
agent: string;
|
|
105
|
+
engine: string | null;
|
|
106
|
+
/** Requests charged an estimate (no provider-reported usage); their tokens are a conservative charge, not a measurement. */
|
|
107
|
+
estimatedRequests: number;
|
|
108
|
+
estimatedTurns: number;
|
|
109
|
+
incompleteTurns: number;
|
|
110
|
+
notionalUsd: number;
|
|
111
|
+
tokens: number;
|
|
112
|
+
turns: number;
|
|
113
|
+
}
|
|
114
|
+
/** Groups records by agent. `roster`, when supplied, seeds a zero-usage row
|
|
115
|
+
* for every known agent (so an uninstrumented engine's agents still show up
|
|
116
|
+
* with dashes instead of vanishing from the table). */
|
|
117
|
+
export declare const groupUsageByAgent: (records: UsageRecord[], roster?: UsageRosterEntry[]) => UsageAgentGroup[];
|
|
118
|
+
export interface UsageEngineGroup {
|
|
119
|
+
engine: string;
|
|
120
|
+
estimatedRequests: number;
|
|
121
|
+
estimatedTurns: number;
|
|
122
|
+
incompleteTurns: number;
|
|
123
|
+
notionalUsd: number;
|
|
124
|
+
tokens: number;
|
|
125
|
+
turns: number;
|
|
126
|
+
}
|
|
127
|
+
/** Groups records by engine. `engines`, when supplied, seeds a zero-usage row
|
|
128
|
+
* for every known engine (so Codex — uninstrumented — shows up as a dashed
|
|
129
|
+
* row rather than being absent from the rollup). */
|
|
130
|
+
export declare const groupUsageByEngine: (records: UsageRecord[], engines?: string[]) => UsageEngineGroup[];
|
|
131
|
+
export interface UsageCoverage {
|
|
132
|
+
agentsReporting: number;
|
|
133
|
+
agentsTotal: number;
|
|
134
|
+
/** `turn` keys carrying differing rows (first row counted); nonzero forces `partial`. */
|
|
135
|
+
conflictingTurnCount: number;
|
|
136
|
+
/** Turns whose total includes an estimated charge for at least one request. */
|
|
137
|
+
estimatedTurnCount: number;
|
|
138
|
+
/** Count of `complete:false` records in the window — every count here is a
|
|
139
|
+
* lower bound regardless of this number (see module doc / design
|
|
140
|
+
* "Verification" — grok's `streaming-messages-json` carries no
|
|
141
|
+
* completeness marker for a partially zero-filled turn), but a nonzero
|
|
142
|
+
* count is at least a partial, observable signal of it. */
|
|
143
|
+
incompleteRecordCount: number;
|
|
144
|
+
/** True when at least one roster agent produced zero records in the
|
|
145
|
+
* window, or when at least one ledger could not be read — the resulting
|
|
146
|
+
* total must be labelled PARTIAL and never presented as the org's full
|
|
147
|
+
* cost. */
|
|
148
|
+
partial: boolean;
|
|
149
|
+
/** Ledgers (units or rotated generations) whose read failed outright. Zero
|
|
150
|
+
* records from an unreadable ledger is UNKNOWN usage, not free usage, so a
|
|
151
|
+
* nonzero count here forces `partial` regardless of the roster. */
|
|
152
|
+
unreadableUnitCount: number;
|
|
153
|
+
}
|
|
154
|
+
/** Coverage is computed against `totalAgents` (the full org roster size), not
|
|
155
|
+
* against however many distinct agents happen to appear in `records` — an
|
|
156
|
+
* uninstrumented engine's agents must count toward the shortfall, not
|
|
157
|
+
* disappear from the denominator. */
|
|
158
|
+
export declare const computeUsageCoverage: (records: UsageRecord[], totalAgents: number, unreadableUnitCount?: number) => UsageCoverage;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure reader/aggregator for Daimon's per-turn usage ledger
|
|
3
|
+
* (`noopolis.daimon.turn-usage.v1`, see `specs/USAGE_ACCOUNTING_DESIGN.md`). This
|
|
4
|
+
* module never touches Docker, the filesystem, or a deployment record — it
|
|
5
|
+
* only knows how to parse ledger text and window/group already-parsed
|
|
6
|
+
* records. The transport (deciding whether to `docker exec` or fall back to
|
|
7
|
+
* volume egress, and where the ledger actually lives) is a CLI-layer concern
|
|
8
|
+
* in `src/cli/usageCommandLive.ts`, which composes this module with
|
|
9
|
+
* `src/deployment`'s docker probe gateway and volume-egress helpers. Keeping
|
|
10
|
+
* that composition out of this folder avoids a value-level import cycle:
|
|
11
|
+
* `src/deployment` already imports real (non-type) exports from this folder
|
|
12
|
+
* (`dockerManager.ts`'s `resolveNoopolisRunId`), so this folder must not
|
|
13
|
+
* import real exports back from `src/deployment`.
|
|
14
|
+
*
|
|
15
|
+
* The read transport itself (`readUsageLedgerViaExec`, and the rule for when
|
|
16
|
+
* a failed `cat` means "empty" versus "unknown") lives beside this file in
|
|
17
|
+
* `usageLedgerRead.ts`, so this module performs no I/O at all.
|
|
18
|
+
*/
|
|
19
|
+
export const USAGE_TURN_RECORD_VERSION = "noopolis.daimon.turn-usage.v1";
|
|
20
|
+
export const USAGE_LIMIT_REASONS = ["tokens", "requests", "timeout", "none"];
|
|
21
|
+
const USAGE_MODELS = ["grok-4.6", "grok-4.5", "grok-build"];
|
|
22
|
+
/**
|
|
23
|
+
* The additive broker fields of a `turn-usage.v1` row. Each is copied only when
|
|
24
|
+
* it is a member of Daimon's closed vocabulary; a malformed optional field is
|
|
25
|
+
* dropped rather than discarding the row's spend.
|
|
26
|
+
*/
|
|
27
|
+
const brokerFields = (record) => ({
|
|
28
|
+
...(typeof record.turn === "string" && /^[a-f0-9]{64}$/u.test(record.turn) ? { turn: record.turn } : {}),
|
|
29
|
+
...(USAGE_LIMIT_REASONS.includes(record.limit_reason) ? { limit_reason: record.limit_reason } : {}),
|
|
30
|
+
...(USAGE_MODELS.includes(record.model) ? { model: record.model } : {}),
|
|
31
|
+
...(Number.isSafeInteger(record.estimated_requests) && record.estimated_requests > 0 ? { estimated_requests: record.estimated_requests } : {}),
|
|
32
|
+
...(record.outcome === "completed" || record.outcome === "failed" ? { outcome: record.outcome } : {})
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Keeps the first row of every `turn` and every row without one.
|
|
36
|
+
*
|
|
37
|
+
* Daimon's broker seals a turn's ledger bytes into the turn record and appends
|
|
38
|
+
* them again on replay when it cannot see the row, so two replays of one sealed
|
|
39
|
+
* turn can both append identical bytes. The key exists precisely so such a turn
|
|
40
|
+
* is never counted twice; every aggregate here must see deduplicated rows.
|
|
41
|
+
* Readers keep every parsed row so {@link findConflictingUsageTurns} can see
|
|
42
|
+
* rows that share a key but differ.
|
|
43
|
+
*/
|
|
44
|
+
export const dedupeUsageRecordsByTurn = (records) => {
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
return records.filter((record) => {
|
|
47
|
+
if (record.turn === undefined)
|
|
48
|
+
return true;
|
|
49
|
+
if (seen.has(record.turn))
|
|
50
|
+
return false;
|
|
51
|
+
seen.add(record.turn);
|
|
52
|
+
return true;
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const canonicalRecord = (record) => JSON.stringify(Object.keys(record).sort().map((key) => [key, record[key]]));
|
|
56
|
+
/**
|
|
57
|
+
* `turn` keys whose rows are not byte-for-byte the same record. A replay
|
|
58
|
+
* re-appends identical sealed bytes, so differing rows under one key mean the
|
|
59
|
+
* ledger is not what the broker sealed; the first row is still the one counted,
|
|
60
|
+
* but the window is reported PARTIAL and the keys are named.
|
|
61
|
+
*/
|
|
62
|
+
export const findConflictingUsageTurns = (records) => {
|
|
63
|
+
const first = new Map();
|
|
64
|
+
const conflicts = new Set();
|
|
65
|
+
for (const record of records) {
|
|
66
|
+
if (record.turn === undefined)
|
|
67
|
+
continue;
|
|
68
|
+
const canonical = canonicalRecord(record);
|
|
69
|
+
const seen = first.get(record.turn);
|
|
70
|
+
if (seen === undefined)
|
|
71
|
+
first.set(record.turn, canonical);
|
|
72
|
+
else if (seen !== canonical)
|
|
73
|
+
conflicts.add(record.turn);
|
|
74
|
+
}
|
|
75
|
+
return [...conflicts].sort();
|
|
76
|
+
};
|
|
77
|
+
const NUMERIC_FIELDS = [
|
|
78
|
+
"input",
|
|
79
|
+
"output",
|
|
80
|
+
"cache_read",
|
|
81
|
+
"cache_write",
|
|
82
|
+
"total",
|
|
83
|
+
"calls",
|
|
84
|
+
"notional_usd"
|
|
85
|
+
];
|
|
86
|
+
const isFiniteNonNegative = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
87
|
+
const isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
|
|
88
|
+
/**
|
|
89
|
+
* Parses one ledger line. Returns `null` (never throws) for: blank lines,
|
|
90
|
+
* JSON that fails to parse (this is also how a torn trailing line left by a
|
|
91
|
+
* crash mid-append is skipped — a truncated JSON object fails to parse the
|
|
92
|
+
* same way a garbled line would), a schema version other than
|
|
93
|
+
* `noopolis.daimon.turn-usage.v1`, a missing/empty string field, an `at` that
|
|
94
|
+
* doesn't parse as a date, a non-boolean `complete`, or any numeric field
|
|
95
|
+
* that isn't a finite, non-negative number.
|
|
96
|
+
*/
|
|
97
|
+
export const parseUsageLedgerLine = (line) => {
|
|
98
|
+
const trimmed = line.trim();
|
|
99
|
+
if (trimmed.length === 0) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
let parsed;
|
|
103
|
+
try {
|
|
104
|
+
parsed = JSON.parse(trimmed);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const record = parsed;
|
|
113
|
+
if (record.v !== USAGE_TURN_RECORD_VERSION) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
if (!isNonEmptyString(record.agent)
|
|
117
|
+
|| !isNonEmptyString(record.wake)
|
|
118
|
+
|| !isNonEmptyString(record.engine)
|
|
119
|
+
|| !isNonEmptyString(record.at)) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (Number.isNaN(Date.parse(record.at))) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (typeof record.complete !== "boolean") {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
for (const field of NUMERIC_FIELDS) {
|
|
129
|
+
if (!isFiniteNonNegative(record[field])) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
agent: record.agent,
|
|
135
|
+
at: record.at,
|
|
136
|
+
cache_read: record.cache_read,
|
|
137
|
+
cache_write: record.cache_write,
|
|
138
|
+
calls: record.calls,
|
|
139
|
+
complete: record.complete,
|
|
140
|
+
engine: record.engine,
|
|
141
|
+
input: record.input,
|
|
142
|
+
notional_usd: record.notional_usd,
|
|
143
|
+
output: record.output,
|
|
144
|
+
total: record.total,
|
|
145
|
+
v: USAGE_TURN_RECORD_VERSION,
|
|
146
|
+
wake: record.wake,
|
|
147
|
+
...brokerFields(record)
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Parses a newline-delimited ledger file. Never throws: an unparseable line —
|
|
152
|
+
* including an unterminated trailing line left by a crash mid-append — is
|
|
153
|
+
* skipped, and the rest of the file still parses.
|
|
154
|
+
*/
|
|
155
|
+
export const parseUsageLedger = (text) => text
|
|
156
|
+
.split("\n")
|
|
157
|
+
.map(parseUsageLedgerLine)
|
|
158
|
+
.filter((record) => record !== null);
|
|
159
|
+
const DURATION_UNIT_MS = {
|
|
160
|
+
d: 24 * 60 * 60 * 1000,
|
|
161
|
+
h: 60 * 60 * 1000,
|
|
162
|
+
m: 60 * 1000
|
|
163
|
+
};
|
|
164
|
+
/** The default window `spawnfile usage` uses when `--since` is omitted. */
|
|
165
|
+
export const DEFAULT_USAGE_SINCE = "24h";
|
|
166
|
+
/** Parses a duration like `"24h"`, `"7d"`, or `"30m"` into milliseconds.
|
|
167
|
+
* Returns `null` for anything else — the caller is responsible for turning
|
|
168
|
+
* that into a user-facing input error. */
|
|
169
|
+
export const parseUsageSinceDuration = (input) => {
|
|
170
|
+
const match = /^(\d+)(h|d|m)$/u.exec(input.trim());
|
|
171
|
+
if (!match) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const amount = Number(match[1]);
|
|
175
|
+
const unit = match[2];
|
|
176
|
+
return amount * DURATION_UNIT_MS[unit];
|
|
177
|
+
};
|
|
178
|
+
/** Keeps only records at or after `now - sinceMs`. `now` defaults to the real
|
|
179
|
+
* clock; tests pass a fixed value. */
|
|
180
|
+
export const filterUsageRecordsSince = (records, sinceMs, now = Date.now()) => {
|
|
181
|
+
const cutoff = now - sinceMs;
|
|
182
|
+
return records.filter((record) => Date.parse(record.at) >= cutoff);
|
|
183
|
+
};
|
|
184
|
+
const emptyAgentGroup = (agent, engine) => ({
|
|
185
|
+
agent,
|
|
186
|
+
engine,
|
|
187
|
+
estimatedRequests: 0,
|
|
188
|
+
estimatedTurns: 0,
|
|
189
|
+
incompleteTurns: 0,
|
|
190
|
+
notionalUsd: 0,
|
|
191
|
+
tokens: 0,
|
|
192
|
+
turns: 0
|
|
193
|
+
});
|
|
194
|
+
/** Groups records by agent. `roster`, when supplied, seeds a zero-usage row
|
|
195
|
+
* for every known agent (so an uninstrumented engine's agents still show up
|
|
196
|
+
* with dashes instead of vanishing from the table). */
|
|
197
|
+
export const groupUsageByAgent = (records, roster = []) => {
|
|
198
|
+
const byAgent = new Map();
|
|
199
|
+
for (const entry of roster) {
|
|
200
|
+
byAgent.set(entry.agent, emptyAgentGroup(entry.agent, entry.engine));
|
|
201
|
+
}
|
|
202
|
+
for (const record of dedupeUsageRecordsByTurn(records)) {
|
|
203
|
+
const existing = byAgent.get(record.agent) ?? emptyAgentGroup(record.agent, record.engine);
|
|
204
|
+
existing.turns += 1;
|
|
205
|
+
existing.estimatedRequests += record.estimated_requests ?? 0;
|
|
206
|
+
if (record.estimated_requests !== undefined)
|
|
207
|
+
existing.estimatedTurns += 1;
|
|
208
|
+
existing.tokens += record.total;
|
|
209
|
+
existing.notionalUsd += record.notional_usd;
|
|
210
|
+
if (!record.complete) {
|
|
211
|
+
existing.incompleteTurns += 1;
|
|
212
|
+
}
|
|
213
|
+
if (existing.engine === null) {
|
|
214
|
+
existing.engine = record.engine;
|
|
215
|
+
}
|
|
216
|
+
byAgent.set(record.agent, existing);
|
|
217
|
+
}
|
|
218
|
+
return [...byAgent.values()];
|
|
219
|
+
};
|
|
220
|
+
const emptyEngineGroup = (engine) => ({
|
|
221
|
+
engine,
|
|
222
|
+
estimatedRequests: 0,
|
|
223
|
+
estimatedTurns: 0,
|
|
224
|
+
incompleteTurns: 0,
|
|
225
|
+
notionalUsd: 0,
|
|
226
|
+
tokens: 0,
|
|
227
|
+
turns: 0
|
|
228
|
+
});
|
|
229
|
+
/** Groups records by engine. `engines`, when supplied, seeds a zero-usage row
|
|
230
|
+
* for every known engine (so Codex — uninstrumented — shows up as a dashed
|
|
231
|
+
* row rather than being absent from the rollup). */
|
|
232
|
+
export const groupUsageByEngine = (records, engines = []) => {
|
|
233
|
+
const byEngine = new Map();
|
|
234
|
+
for (const engine of engines) {
|
|
235
|
+
byEngine.set(engine, emptyEngineGroup(engine));
|
|
236
|
+
}
|
|
237
|
+
for (const record of dedupeUsageRecordsByTurn(records)) {
|
|
238
|
+
const existing = byEngine.get(record.engine) ?? emptyEngineGroup(record.engine);
|
|
239
|
+
existing.turns += 1;
|
|
240
|
+
existing.estimatedRequests += record.estimated_requests ?? 0;
|
|
241
|
+
if (record.estimated_requests !== undefined)
|
|
242
|
+
existing.estimatedTurns += 1;
|
|
243
|
+
existing.tokens += record.total;
|
|
244
|
+
existing.notionalUsd += record.notional_usd;
|
|
245
|
+
if (!record.complete) {
|
|
246
|
+
existing.incompleteTurns += 1;
|
|
247
|
+
}
|
|
248
|
+
byEngine.set(record.engine, existing);
|
|
249
|
+
}
|
|
250
|
+
return [...byEngine.values()];
|
|
251
|
+
};
|
|
252
|
+
/** Coverage is computed against `totalAgents` (the full org roster size), not
|
|
253
|
+
* against however many distinct agents happen to appear in `records` — an
|
|
254
|
+
* uninstrumented engine's agents must count toward the shortfall, not
|
|
255
|
+
* disappear from the denominator. */
|
|
256
|
+
export const computeUsageCoverage = (records, totalAgents, unreadableUnitCount = 0) => {
|
|
257
|
+
const unique = dedupeUsageRecordsByTurn(records);
|
|
258
|
+
const reporting = new Set(unique.map((record) => record.agent)).size;
|
|
259
|
+
const conflictingTurnCount = findConflictingUsageTurns(records).length;
|
|
260
|
+
return {
|
|
261
|
+
agentsReporting: reporting,
|
|
262
|
+
agentsTotal: totalAgents,
|
|
263
|
+
conflictingTurnCount,
|
|
264
|
+
estimatedTurnCount: unique.filter((record) => record.estimated_requests !== undefined).length,
|
|
265
|
+
incompleteRecordCount: unique.filter((record) => !record.complete).length,
|
|
266
|
+
partial: reporting < totalAgents || unreadableUnitCount > 0 || conflictingTurnCount > 0,
|
|
267
|
+
unreadableUnitCount
|
|
268
|
+
};
|
|
269
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport half of Daimon's per-turn usage ledger reader
|
|
3
|
+
* (`noopolis.daimon.turn-usage.v1`, see `specs/USAGE_ACCOUNTING_DESIGN.md`). Split
|
|
4
|
+
* out of `usageLedger.ts` so that file stays a pure parser/aggregator and this
|
|
5
|
+
* one owns the single I/O-shaped concern: `cat` two ledger generations through
|
|
6
|
+
* a caller-supplied `exec` and decide, per generation, whether a failed read
|
|
7
|
+
* means "empty" or "unknown".
|
|
8
|
+
*
|
|
9
|
+
* `exec` is duck-typed (structurally the same shape as
|
|
10
|
+
* `RuntimeProbeGateway.exec` in `./types.ts`) rather than a concrete gateway,
|
|
11
|
+
* so this module never depends on `src/deployment` — which already imports
|
|
12
|
+
* real exports from this folder, and so must not be imported back.
|
|
13
|
+
*/
|
|
14
|
+
import { type UsageRecord } from "./usageLedger.js";
|
|
15
|
+
/** The exec shape this module needs to read a ledger — structurally the same
|
|
16
|
+
* as `RuntimeProbeGateway.exec` (`./types.ts`), duck-typed here rather than
|
|
17
|
+
* imported so this module never depends on a concrete gateway construction
|
|
18
|
+
* path. */
|
|
19
|
+
export type UsageLedgerExec = (command: string[]) => Promise<{
|
|
20
|
+
stderr: string;
|
|
21
|
+
stdout: string;
|
|
22
|
+
}>;
|
|
23
|
+
export interface UsageLedgerPaths {
|
|
24
|
+
filePath: string;
|
|
25
|
+
rotatedFilePath: string;
|
|
26
|
+
}
|
|
27
|
+
/** One ledger generation that exists but could not be read. Never merged into
|
|
28
|
+
* the record stream and never rendered as zero usage: the caller must surface
|
|
29
|
+
* it so an unknown window is not mistaken for a cheap one. */
|
|
30
|
+
export interface UsageLedgerReadFailure {
|
|
31
|
+
filePath: string;
|
|
32
|
+
reason: string;
|
|
33
|
+
}
|
|
34
|
+
export interface UsageLedgerRead {
|
|
35
|
+
records: UsageRecord[];
|
|
36
|
+
unreadable: UsageLedgerReadFailure[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reads both ledger generations (`usage.jsonl` and `usage.jsonl.1`) through
|
|
40
|
+
* `exec` and parses them. Rotated (older) records are returned before
|
|
41
|
+
* current ones so a `--since` window spanning a rotation reads in
|
|
42
|
+
* chronological order.
|
|
43
|
+
*
|
|
44
|
+
* Generations that could not be read come back in `unreadable` rather than as
|
|
45
|
+
* missing records, so the caller can render an UNREADABLE row and mark the
|
|
46
|
+
* window partial instead of reporting an unknown amount of usage as zero.
|
|
47
|
+
*/
|
|
48
|
+
export declare const readUsageLedgerViaExec: (exec: UsageLedgerExec, paths: UsageLedgerPaths) => Promise<UsageLedgerRead>;
|