@noopolis/daimon 0.1.1 → 0.2.0
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 +307 -45
- package/dist/contracts/attentionContract.d.ts +117 -0
- package/dist/contracts/attentionContract.d.ts.map +1 -0
- package/dist/contracts/attentionContract.js +14 -0
- package/dist/contracts/canonicalJson.d.ts +3 -0
- package/dist/contracts/canonicalJson.d.ts.map +1 -0
- package/dist/contracts/canonicalJson.js +54 -0
- package/dist/contracts/grokWorkerContract.d.ts +74 -0
- package/dist/contracts/grokWorkerContract.d.ts.map +1 -0
- package/dist/contracts/grokWorkerContract.js +88 -0
- package/dist/contracts/organizationRuntimeContract.d.ts +765 -0
- package/dist/contracts/organizationRuntimeContract.d.ts.map +1 -0
- package/dist/contracts/organizationRuntimeContract.js +121 -0
- package/dist/contracts/runtimeContractManifest.d.ts +1615 -0
- package/dist/contracts/runtimeContractManifest.d.ts.map +1 -0
- package/dist/contracts/runtimeContractManifest.js +181 -0
- package/dist/core/credentialRedaction.d.ts +4 -0
- package/dist/core/credentialRedaction.d.ts.map +1 -0
- package/dist/core/credentialRedaction.js +28 -0
- package/dist/core/siblingBuildFreshness.d.ts +21 -0
- package/dist/core/siblingBuildFreshness.d.ts.map +1 -0
- package/dist/core/siblingBuildFreshness.js +25 -0
- package/dist/core/types.d.ts +10 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/examples/exampleCausalId.d.ts +3 -0
- package/dist/examples/exampleCausalId.d.ts.map +1 -0
- package/dist/examples/exampleCausalId.js +8 -0
- package/dist/examples/jungian-play-org.js +3 -2
- package/dist/examples/jungian-triad-org.js +3 -2
- package/dist/examples/jungianPlayAgent.d.ts +1 -1
- package/dist/examples/jungianPlayAgent.d.ts.map +1 -1
- package/dist/examples/jungianPlayAgent.js +1 -1
- package/dist/examples/jungianProfiles.d.ts +1 -1
- package/dist/examples/jungianProfiles.d.ts.map +1 -1
- package/dist/examples/jungianTriadProfiles.d.ts +1 -1
- package/dist/examples/jungianTriadProfiles.d.ts.map +1 -1
- package/dist/examples/pi-agent.js +3 -2
- package/dist/examples/pi-memory-org.js +6 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/mcp/toolServer.d.ts +31 -0
- package/dist/mcp/toolServer.d.ts.map +1 -0
- package/dist/mcp/toolServer.js +145 -0
- package/dist/observability/causalEvents.d.ts +118 -0
- package/dist/observability/causalEvents.d.ts.map +1 -0
- package/dist/observability/causalEvents.js +223 -0
- package/dist/observability/controlCausal.d.ts +117 -0
- package/dist/observability/controlCausal.d.ts.map +1 -0
- package/dist/observability/controlCausal.js +107 -0
- package/dist/observability/emitCausalFixture.d.ts +25 -0
- package/dist/observability/emitCausalFixture.d.ts.map +1 -0
- package/dist/observability/emitCausalFixture.js +98 -0
- package/dist/observability/index.d.ts +2 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +2 -0
- package/dist/observability/orgObserver.d.ts.map +1 -1
- package/dist/observability/orgObserver.js +3 -3
- package/dist/pi/agyHeadlessResult.d.ts +60 -0
- package/dist/pi/agyHeadlessResult.d.ts.map +1 -0
- package/dist/pi/agyHeadlessResult.js +95 -0
- package/dist/pi/cliChildOutput.d.ts +67 -0
- package/dist/pi/cliChildOutput.d.ts.map +1 -0
- package/dist/pi/cliChildOutput.js +269 -0
- package/dist/pi/cliEngineRun.d.ts +16 -0
- package/dist/pi/cliEngineRun.d.ts.map +1 -0
- package/dist/pi/cliEngineRun.js +27 -0
- package/dist/pi/cliEngineSpawn.d.ts +55 -0
- package/dist/pi/cliEngineSpawn.d.ts.map +1 -0
- package/dist/pi/cliEngineSpawn.js +164 -0
- package/dist/pi/cliEnvironment.d.ts +12 -0
- package/dist/pi/cliEnvironment.d.ts.map +1 -0
- package/dist/pi/cliEnvironment.js +32 -0
- package/dist/pi/cliMcpRegistration.d.ts +61 -0
- package/dist/pi/cliMcpRegistration.d.ts.map +1 -0
- package/dist/pi/cliMcpRegistration.js +75 -0
- package/dist/pi/cliProcess.d.ts +7 -0
- package/dist/pi/cliProcess.d.ts.map +1 -0
- package/dist/pi/cliProcess.js +132 -0
- package/dist/pi/cliSession.d.ts +106 -0
- package/dist/pi/cliSession.d.ts.map +1 -0
- package/dist/pi/cliSession.js +379 -0
- package/dist/pi/cliTurnMetering.d.ts +60 -0
- package/dist/pi/cliTurnMetering.d.ts.map +1 -0
- package/dist/pi/cliTurnMetering.js +60 -0
- package/dist/pi/codexFilesystemRules.d.ts +3 -0
- package/dist/pi/codexFilesystemRules.d.ts.map +1 -0
- package/dist/pi/codexFilesystemRules.js +28 -0
- package/dist/pi/codexHeadlessResult.d.ts +68 -0
- package/dist/pi/codexHeadlessResult.d.ts.map +1 -0
- package/dist/pi/codexHeadlessResult.js +122 -0
- package/dist/pi/codexRolloutUsage.d.ts +95 -0
- package/dist/pi/codexRolloutUsage.d.ts.map +1 -0
- package/dist/pi/codexRolloutUsage.js +221 -0
- package/dist/pi/engineWakeLimits.d.ts +39 -0
- package/dist/pi/engineWakeLimits.d.ts.map +1 -0
- package/dist/pi/engineWakeLimits.js +55 -0
- package/dist/pi/grokHeadlessResult.d.ts +36 -0
- package/dist/pi/grokHeadlessResult.d.ts.map +1 -0
- package/dist/pi/grokHeadlessResult.js +118 -0
- package/dist/pi/grokHomeMcpRegistration.d.ts +21 -0
- package/dist/pi/grokHomeMcpRegistration.d.ts.map +1 -0
- package/dist/pi/grokHomeMcpRegistration.js +57 -0
- package/dist/pi/grokSandbox.d.ts +11 -0
- package/dist/pi/grokSandbox.d.ts.map +1 -0
- package/dist/pi/grokSandbox.js +216 -0
- package/dist/pi/grokStreamUsage.d.ts +31 -0
- package/dist/pi/grokStreamUsage.d.ts.map +1 -0
- package/dist/pi/grokStreamUsage.js +51 -0
- package/dist/pi/index.d.ts +5 -0
- package/dist/pi/index.d.ts.map +1 -1
- package/dist/pi/index.js +5 -0
- package/dist/pi/memoryTools.d.ts +55 -1
- package/dist/pi/memoryTools.d.ts.map +1 -1
- package/dist/pi/memoryTools.js +144 -24
- package/dist/pi/modelRegistry.d.ts +13 -0
- package/dist/pi/modelRegistry.d.ts.map +1 -0
- package/dist/pi/modelRegistry.js +19 -0
- package/dist/pi/piAgentHandle.d.ts +46 -0
- package/dist/pi/piAgentHandle.d.ts.map +1 -0
- package/dist/pi/piAgentHandle.js +351 -0
- package/dist/pi/piAgentWakeSupport.d.ts +103 -0
- package/dist/pi/piAgentWakeSupport.d.ts.map +1 -0
- package/dist/pi/piAgentWakeSupport.js +151 -0
- package/dist/pi/piHarness.d.ts +40 -5
- package/dist/pi/piHarness.d.ts.map +1 -1
- package/dist/pi/piHarness.js +151 -256
- package/dist/pi/prompts.d.ts +10 -0
- package/dist/pi/prompts.d.ts.map +1 -0
- package/dist/pi/prompts.js +63 -0
- package/dist/pi/rawTrainingCapture.d.ts +59 -0
- package/dist/pi/rawTrainingCapture.d.ts.map +1 -0
- package/dist/pi/rawTrainingCapture.js +175 -0
- package/dist/pi/turnCausal.d.ts +73 -0
- package/dist/pi/turnCausal.d.ts.map +1 -0
- package/dist/pi/turnCausal.js +75 -0
- package/dist/pi/turnTrace.d.ts +128 -0
- package/dist/pi/turnTrace.d.ts.map +1 -0
- package/dist/pi/turnTrace.js +138 -0
- package/dist/pi/wakeAcceptance.d.ts +49 -0
- package/dist/pi/wakeAcceptance.d.ts.map +1 -0
- package/dist/pi/wakeAcceptance.js +281 -0
- package/dist/pi/wakeAcceptanceFs.d.ts +44 -0
- package/dist/pi/wakeAcceptanceFs.d.ts.map +1 -0
- package/dist/pi/wakeAcceptanceFs.js +318 -0
- package/dist/pi/wakeAcceptanceSchema.d.ts +75 -0
- package/dist/pi/wakeAcceptanceSchema.d.ts.map +1 -0
- package/dist/pi/wakeAcceptanceSchema.js +265 -0
- package/dist/pi/wakeModes.d.ts +9 -0
- package/dist/pi/wakeModes.d.ts.map +1 -0
- package/dist/pi/wakeModes.js +19 -0
- package/dist/pi/worldNudge.d.ts +22 -0
- package/dist/pi/worldNudge.d.ts.map +1 -0
- package/dist/pi/worldNudge.js +62 -0
- package/dist/pi/worldToolProtocol.d.ts +13 -0
- package/dist/pi/worldToolProtocol.d.ts.map +1 -0
- package/dist/pi/worldToolProtocol.js +49 -0
- package/dist/pi/worldTools.d.ts +32 -0
- package/dist/pi/worldTools.d.ts.map +1 -0
- package/dist/pi/worldTools.js +373 -0
- package/dist/pi/worldTrajectory.d.ts +52 -0
- package/dist/pi/worldTrajectory.d.ts.map +1 -0
- package/dist/pi/worldTrajectory.js +131 -0
- package/dist/runtime/agySubscriptionBootstrap.d.ts +16 -0
- package/dist/runtime/agySubscriptionBootstrap.d.ts.map +1 -0
- package/dist/runtime/agySubscriptionBootstrap.js +80 -0
- package/dist/runtime/agySubscriptionRealm.d.ts +38 -0
- package/dist/runtime/agySubscriptionRealm.d.ts.map +1 -0
- package/dist/runtime/agySubscriptionRealm.js +242 -0
- package/dist/runtime/attention.d.ts +21 -0
- package/dist/runtime/attention.d.ts.map +1 -0
- package/dist/runtime/attention.js +36 -0
- package/dist/runtime/attentionDispatcher.d.ts +66 -0
- package/dist/runtime/attentionDispatcher.d.ts.map +1 -0
- package/dist/runtime/attentionDispatcher.js +271 -0
- package/dist/runtime/cli.d.ts +7 -0
- package/dist/runtime/cli.d.ts.map +1 -0
- package/dist/runtime/cli.js +251 -0
- package/dist/runtime/codexSandboxProjection.d.ts +17 -0
- package/dist/runtime/codexSandboxProjection.d.ts.map +1 -0
- package/dist/runtime/codexSandboxProjection.js +40 -0
- package/dist/runtime/contract-manifest.json +1 -0
- package/dist/runtime/contract-manifest.sha256 +1 -0
- package/dist/runtime/contractManifest.d.ts +8 -0
- package/dist/runtime/contractManifest.d.ts.map +1 -0
- package/dist/runtime/contractManifest.js +4 -0
- package/dist/runtime/engineBrokerCapabilities.d.ts +30 -0
- package/dist/runtime/engineBrokerCapabilities.d.ts.map +1 -0
- package/dist/runtime/engineBrokerCapabilities.js +59 -0
- package/dist/runtime/engineBrokerControlClient.d.ts +44 -0
- package/dist/runtime/engineBrokerControlClient.d.ts.map +1 -0
- package/dist/runtime/engineBrokerControlClient.js +132 -0
- package/dist/runtime/engineBrokerCredentialJournal.d.ts +10 -0
- package/dist/runtime/engineBrokerCredentialJournal.d.ts.map +1 -0
- package/dist/runtime/engineBrokerCredentialJournal.js +17 -0
- package/dist/runtime/engineBrokerInferenceProtocol.d.ts +52 -0
- package/dist/runtime/engineBrokerInferenceProtocol.d.ts.map +1 -0
- package/dist/runtime/engineBrokerInferenceProtocol.js +65 -0
- package/dist/runtime/engineBrokerMcpCallLog.d.ts +160 -0
- package/dist/runtime/engineBrokerMcpCallLog.d.ts.map +1 -0
- package/dist/runtime/engineBrokerMcpCallLog.js +219 -0
- package/dist/runtime/engineBrokerMcpFacade.d.ts +56 -0
- package/dist/runtime/engineBrokerMcpFacade.d.ts.map +1 -0
- package/dist/runtime/engineBrokerMcpFacade.js +343 -0
- package/dist/runtime/engineBrokerNativeClient.d.ts +52 -0
- package/dist/runtime/engineBrokerNativeClient.d.ts.map +1 -0
- package/dist/runtime/engineBrokerNativeClient.js +151 -0
- package/dist/runtime/engineBrokerProtocol.d.ts +135 -0
- package/dist/runtime/engineBrokerProtocol.d.ts.map +1 -0
- package/dist/runtime/engineBrokerProtocol.js +274 -0
- package/dist/runtime/engineBrokerSealLedger.d.ts +70 -0
- package/dist/runtime/engineBrokerSealLedger.d.ts.map +1 -0
- package/dist/runtime/engineBrokerSealLedger.js +123 -0
- package/dist/runtime/engineBrokerService.d.ts +37 -0
- package/dist/runtime/engineBrokerService.d.ts.map +1 -0
- package/dist/runtime/engineBrokerService.js +138 -0
- package/dist/runtime/engineBrokerServiceCli.d.ts +5 -0
- package/dist/runtime/engineBrokerServiceCli.d.ts.map +1 -0
- package/dist/runtime/engineBrokerServiceCli.js +32 -0
- package/dist/runtime/engineBrokerServiceConfig.d.ts +50 -0
- package/dist/runtime/engineBrokerServiceConfig.d.ts.map +1 -0
- package/dist/runtime/engineBrokerServiceConfig.js +92 -0
- package/dist/runtime/engineBrokerSingleflight.d.ts +13 -0
- package/dist/runtime/engineBrokerSingleflight.d.ts.map +1 -0
- package/dist/runtime/engineBrokerSingleflight.js +24 -0
- package/dist/runtime/engineBrokerTurnAccounting.d.ts +76 -0
- package/dist/runtime/engineBrokerTurnAccounting.d.ts.map +1 -0
- package/dist/runtime/engineBrokerTurnAccounting.js +108 -0
- package/dist/runtime/engineBrokerTurnRegistry.d.ts +57 -0
- package/dist/runtime/engineBrokerTurnRegistry.d.ts.map +1 -0
- package/dist/runtime/engineBrokerTurnRegistry.js +158 -0
- package/dist/runtime/engineDispatcher.d.ts +36 -0
- package/dist/runtime/engineDispatcher.d.ts.map +1 -0
- package/dist/runtime/engineDispatcher.js +216 -0
- package/dist/runtime/engineReadiness.d.ts +23 -0
- package/dist/runtime/engineReadiness.d.ts.map +1 -0
- package/dist/runtime/engineReadiness.js +222 -0
- package/dist/runtime/grokAuthenticationError.d.ts +8 -0
- package/dist/runtime/grokAuthenticationError.d.ts.map +1 -0
- package/dist/runtime/grokAuthenticationError.js +20 -0
- package/dist/runtime/grokBrokerCredentialAuthority.d.ts +22 -0
- package/dist/runtime/grokBrokerCredentialAuthority.d.ts.map +1 -0
- package/dist/runtime/grokBrokerCredentialAuthority.js +124 -0
- package/dist/runtime/grokBrokerCredentialReader.d.ts +5 -0
- package/dist/runtime/grokBrokerCredentialReader.d.ts.map +1 -0
- package/dist/runtime/grokBrokerCredentialReader.js +37 -0
- package/dist/runtime/grokBrokerModelPolicy.d.ts +23 -0
- package/dist/runtime/grokBrokerModelPolicy.d.ts.map +1 -0
- package/dist/runtime/grokBrokerModelPolicy.js +28 -0
- package/dist/runtime/grokBrokerProjection.d.ts +106 -0
- package/dist/runtime/grokBrokerProjection.d.ts.map +1 -0
- package/dist/runtime/grokBrokerProjection.js +94 -0
- package/dist/runtime/grokBrokerProxy.d.ts +55 -0
- package/dist/runtime/grokBrokerProxy.d.ts.map +1 -0
- package/dist/runtime/grokBrokerProxy.js +262 -0
- package/dist/runtime/grokBrokerProxyRequest.d.ts +30 -0
- package/dist/runtime/grokBrokerProxyRequest.d.ts.map +1 -0
- package/dist/runtime/grokBrokerProxyRequest.js +74 -0
- package/dist/runtime/grokBrokerRealmLease.d.ts +4 -0
- package/dist/runtime/grokBrokerRealmLease.d.ts.map +1 -0
- package/dist/runtime/grokBrokerRealmLease.js +33 -0
- package/dist/runtime/grokBrokerRefresh.d.ts +2 -0
- package/dist/runtime/grokBrokerRefresh.d.ts.map +1 -0
- package/dist/runtime/grokBrokerRefresh.js +15 -0
- package/dist/runtime/grokBrokerTurnMeter.d.ts +128 -0
- package/dist/runtime/grokBrokerTurnMeter.d.ts.map +1 -0
- package/dist/runtime/grokBrokerTurnMeter.js +251 -0
- package/dist/runtime/grokBrokerWorkerConfig.d.ts +86 -0
- package/dist/runtime/grokBrokerWorkerConfig.d.ts.map +1 -0
- package/dist/runtime/grokBrokerWorkerConfig.js +135 -0
- package/dist/runtime/grokEngineBroker.d.ts +48 -0
- package/dist/runtime/grokEngineBroker.d.ts.map +1 -0
- package/dist/runtime/grokEngineBroker.js +114 -0
- package/dist/runtime/grokEngineBrokerLedger.d.ts +52 -0
- package/dist/runtime/grokEngineBrokerLedger.d.ts.map +1 -0
- package/dist/runtime/grokEngineBrokerLedger.js +114 -0
- package/dist/runtime/grokEngineBrokerMetering.d.ts +51 -0
- package/dist/runtime/grokEngineBrokerMetering.d.ts.map +1 -0
- package/dist/runtime/grokEngineBrokerMetering.js +34 -0
- package/dist/runtime/grokEngineBrokerTurn.d.ts +58 -0
- package/dist/runtime/grokEngineBrokerTurn.d.ts.map +1 -0
- package/dist/runtime/grokEngineBrokerTurn.js +165 -0
- package/dist/runtime/grokInferenceClientConfig.d.ts +41 -0
- package/dist/runtime/grokInferenceClientConfig.d.ts.map +1 -0
- package/dist/runtime/grokInferenceClientConfig.js +62 -0
- package/dist/runtime/grokInferenceGrants.d.ts +77 -0
- package/dist/runtime/grokInferenceGrants.d.ts.map +1 -0
- package/dist/runtime/grokInferenceGrants.js +116 -0
- package/dist/runtime/grokInferenceProxy.d.ts +29 -0
- package/dist/runtime/grokInferenceProxy.d.ts.map +1 -0
- package/dist/runtime/grokInferenceProxy.js +82 -0
- package/dist/runtime/grokInferenceProxyRequest.d.ts +23 -0
- package/dist/runtime/grokInferenceProxyRequest.d.ts.map +1 -0
- package/dist/runtime/grokInferenceProxyRequest.js +63 -0
- package/dist/runtime/grokSlotPreflightReceipt.d.ts +70 -0
- package/dist/runtime/grokSlotPreflightReceipt.d.ts.map +1 -0
- package/dist/runtime/grokSlotPreflightReceipt.js +101 -0
- package/dist/runtime/grokSubscriptionRealm.d.ts +4 -0
- package/dist/runtime/grokSubscriptionRealm.d.ts.map +1 -0
- package/dist/runtime/grokSubscriptionRealm.js +435 -0
- package/dist/runtime/grokSubscriptionRealmTypes.d.ts +26 -0
- package/dist/runtime/grokSubscriptionRealmTypes.d.ts.map +1 -0
- package/dist/runtime/grokSubscriptionRealmTypes.js +1 -0
- package/dist/runtime/grokWorkerAttestation.d.ts +170 -0
- package/dist/runtime/grokWorkerAttestation.d.ts.map +1 -0
- package/dist/runtime/grokWorkerAttestation.js +266 -0
- package/dist/runtime/grokWorkerDenyPlacement.d.ts +80 -0
- package/dist/runtime/grokWorkerDenyPlacement.d.ts.map +1 -0
- package/dist/runtime/grokWorkerDenyPlacement.js +128 -0
- package/dist/runtime/grokWorkerHomeAttestation.d.ts +30 -0
- package/dist/runtime/grokWorkerHomeAttestation.d.ts.map +1 -0
- package/dist/runtime/grokWorkerHomeAttestation.js +69 -0
- package/dist/runtime/grokWorkerSandboxProfile.d.ts +27 -0
- package/dist/runtime/grokWorkerSandboxProfile.d.ts.map +1 -0
- package/dist/runtime/grokWorkerSandboxProfile.js +44 -0
- package/dist/runtime/grokWorkerTmpAttestation.d.ts +55 -0
- package/dist/runtime/grokWorkerTmpAttestation.d.ts.map +1 -0
- package/dist/runtime/grokWorkerTmpAttestation.js +63 -0
- package/dist/runtime/index.d.ts +26 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +23 -0
- package/dist/runtime/inferenceUsageLedger.d.ts +38 -0
- package/dist/runtime/inferenceUsageLedger.d.ts.map +1 -0
- package/dist/runtime/inferenceUsageLedger.js +53 -0
- package/dist/runtime/mcpToolResult.d.ts +127 -0
- package/dist/runtime/mcpToolResult.d.ts.map +1 -0
- package/dist/runtime/mcpToolResult.js +214 -0
- package/dist/runtime/moltnetMachineRead.d.ts +97 -0
- package/dist/runtime/moltnetMachineRead.d.ts.map +1 -0
- package/dist/runtime/moltnetMachineRead.js +183 -0
- package/dist/runtime/native/daimon-engine-broker +0 -0
- package/dist/runtime/organizationRuntime.d.ts +165 -0
- package/dist/runtime/organizationRuntime.d.ts.map +1 -0
- package/dist/runtime/organizationRuntime.js +3 -0
- package/dist/runtime/organizationRuntimeControl.d.ts +42 -0
- package/dist/runtime/organizationRuntimeControl.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeControl.js +235 -0
- package/dist/runtime/organizationRuntimeHost.d.ts +19 -0
- package/dist/runtime/organizationRuntimeHost.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeHost.js +359 -0
- package/dist/runtime/organizationRuntimeParsing.d.ts +6 -0
- package/dist/runtime/organizationRuntimeParsing.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeParsing.js +370 -0
- package/dist/runtime/organizationRuntimeReadiness.d.ts +12 -0
- package/dist/runtime/organizationRuntimeReadiness.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeReadiness.js +59 -0
- package/dist/runtime/physicalReadiness.d.ts +47 -0
- package/dist/runtime/physicalReadiness.d.ts.map +1 -0
- package/dist/runtime/physicalReadiness.js +142 -0
- package/dist/runtime/portableCredentialAuth.d.ts +6 -0
- package/dist/runtime/portableCredentialAuth.d.ts.map +1 -0
- package/dist/runtime/portableCredentialAuth.js +70 -0
- package/dist/runtime/portableCredentialMaterial.d.ts +8 -0
- package/dist/runtime/portableCredentialMaterial.d.ts.map +1 -0
- package/dist/runtime/portableCredentialMaterial.js +169 -0
- package/dist/runtime/productionAgentTools.d.ts +5 -0
- package/dist/runtime/productionAgentTools.d.ts.map +1 -0
- package/dist/runtime/productionAgentTools.js +328 -0
- package/dist/runtime/runtimeHomeLayout.d.ts +48 -0
- package/dist/runtime/runtimeHomeLayout.d.ts.map +1 -0
- package/dist/runtime/runtimeHomeLayout.js +84 -0
- package/dist/runtime/schedule.d.ts +40 -0
- package/dist/runtime/schedule.d.ts.map +1 -0
- package/dist/runtime/schedule.js +371 -0
- package/dist/runtime/storeCoordination.d.ts +23 -0
- package/dist/runtime/storeCoordination.d.ts.map +1 -0
- package/dist/runtime/storeCoordination.js +94 -0
- package/dist/runtime/toolResultSpill.d.ts +152 -0
- package/dist/runtime/toolResultSpill.d.ts.map +1 -0
- package/dist/runtime/toolResultSpill.js +351 -0
- package/dist/runtime/turnRequestLedger.d.ts +160 -0
- package/dist/runtime/turnRequestLedger.d.ts.map +1 -0
- package/dist/runtime/turnRequestLedger.js +249 -0
- package/dist/runtime/turnUsageLedger.d.ts +143 -0
- package/dist/runtime/turnUsageLedger.d.ts.map +1 -0
- package/dist/runtime/turnUsageLedger.js +203 -0
- package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts +17 -0
- package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceProcessIdentity.js +50 -0
- package/dist/runtime/wakeAcceptanceReconciliation.d.ts +211 -0
- package/dist/runtime/wakeAcceptanceReconciliation.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceReconciliation.js +289 -0
- package/dist/runtime/wakeAcceptanceRecord.d.ts +23 -0
- package/dist/runtime/wakeAcceptanceRecord.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceRecord.js +56 -0
- package/dist/runtime/wakeAcceptanceRetention.d.ts +12 -0
- package/dist/runtime/wakeAcceptanceRetention.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceRetention.js +12 -0
- package/dist/runtime/wakeAcceptanceStore.d.ts +113 -0
- package/dist/runtime/wakeAcceptanceStore.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceStore.js +558 -0
- package/dist/runtime/wakeAcceptanceTypes.d.ts +179 -0
- package/dist/runtime/wakeAcceptanceTypes.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceTypes.js +95 -0
- package/dist/runtime/wakeFuse.d.ts +69 -0
- package/dist/runtime/wakeFuse.d.ts.map +1 -0
- package/dist/runtime/wakeFuse.js +367 -0
- package/package.json +25 -17
- package/dist/examples/mixed-engine-org.d.ts +0 -2
- package/dist/examples/mixed-engine-org.d.ts.map +0 -1
- package/dist/examples/mixed-engine-org.js +0 -351
- package/dist/examples/mixedEngineCli.d.ts +0 -15
- package/dist/examples/mixedEngineCli.d.ts.map +0 -1
- package/dist/examples/mixedEngineCli.js +0 -174
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { emitCausalEvent, resolveRunId } from "./causalEvents.js";
|
|
2
|
+
/**
|
|
3
|
+
* Control-wake causal emitters for root's two wake-acceptance surfaces
|
|
4
|
+
* (`src/runtime/pi/appControlSource.ts`, root repo, out of scope here):
|
|
5
|
+
* the operator-only control endpoint and the Moltnet loopback delivery
|
|
6
|
+
* endpoint (`/agents/:slug/wake`). Both stamp `control.wake.accepted` —
|
|
7
|
+
* enforcement point #3 in `specs/CAUSAL.md` §"Enforcement points" — but with
|
|
8
|
+
* different `principal_id` authorities, per the B62 fix (Option B): the
|
|
9
|
+
* operator endpoint stamps `operator:<name>` (`emitControlWakeAccepted`),
|
|
10
|
+
* the delivery endpoint stamps the fixed `system:moltnet` authority
|
|
11
|
+
* (`emitDeliveryWakeAccepted`), never a caller-supplied `from`/agent field.
|
|
12
|
+
* `control.wake.denied` (`emitControlWakeDenied`) stays operator-only: the
|
|
13
|
+
* delivery endpoint has no bearer-token deny path to stamp. Root's generated
|
|
14
|
+
* app calls these directly; this file has no knowledge of HTTP, tokens, or
|
|
15
|
+
* the request shape, only the causal envelope contract.
|
|
16
|
+
*/
|
|
17
|
+
export const CONTROL_WAKE_ACCEPTED_TYPE = "control.wake.accepted";
|
|
18
|
+
export const CONTROL_WAKE_DENIED_TYPE = "control.wake.denied";
|
|
19
|
+
/**
|
|
20
|
+
* Principal grammar per `specs/CAUSAL.md` §3 (`^(agent|operator|system):.+`):
|
|
21
|
+
* an authenticated operator identity, e.g. `operator:control`. Callers must
|
|
22
|
+
* pass the identity behind the verified bearer token, never a value read
|
|
23
|
+
* from the request body or model output.
|
|
24
|
+
*/
|
|
25
|
+
export const operatorPrincipalId = (operatorName) => `operator:${operatorName}`;
|
|
26
|
+
/**
|
|
27
|
+
* Fixed principal for wakes accepted through the Moltnet loopback delivery
|
|
28
|
+
* endpoint (`/agents/:slug/wake`): the delivering authority itself, never an
|
|
29
|
+
* identity derived from a caller-supplied `from`/agent field on the request.
|
|
30
|
+
*/
|
|
31
|
+
export const DELIVERY_PRINCIPAL_ID = "system:moltnet";
|
|
32
|
+
/** Deterministic, non-model-derived event id for a control wake acceptance. */
|
|
33
|
+
export const controlWakeAcceptedEventId = (requestId) => `daimon:${requestId}:control.wake.accepted`;
|
|
34
|
+
/** Deterministic, non-model-derived event id for a control wake denial. */
|
|
35
|
+
export const controlWakeDeniedEventId = (requestId) => `daimon:${requestId}:control.wake.denied`;
|
|
36
|
+
/**
|
|
37
|
+
* Deterministic, non-model-derived event id for a Moltnet-delivered wake
|
|
38
|
+
* acceptance. Distinct from `controlWakeAcceptedEventId` (own `.delivery.`
|
|
39
|
+
* segment) so the two paths never collide even if a future caller reused a
|
|
40
|
+
* `requestId` across both endpoints for the same target.
|
|
41
|
+
*/
|
|
42
|
+
export const deliveryWakeAcceptedEventId = (requestId) => `daimon:${requestId}:delivery.wake.accepted`;
|
|
43
|
+
/**
|
|
44
|
+
* Stamps `control.wake.accepted` once root's operator-control endpoint has
|
|
45
|
+
* verified the bearer token and is about to wake `targetAgentId`.
|
|
46
|
+
* `principal_id` is always `operator:<operatorName>` (the authenticated
|
|
47
|
+
* operator behind the verified token), never derived from the request body.
|
|
48
|
+
* `run_id` defaults to `resolveRunId()` like every other daimon emitter.
|
|
49
|
+
*/
|
|
50
|
+
export const emitControlWakeAccepted = (input) => emitCausalEvent({
|
|
51
|
+
agentId: input.targetAgentId,
|
|
52
|
+
causeEventIds: input.causeEventIds ?? [],
|
|
53
|
+
eventId: controlWakeAcceptedEventId(input.requestId),
|
|
54
|
+
payload: {
|
|
55
|
+
target_agent_id: input.targetAgentId,
|
|
56
|
+
wake_kind: input.wakeKind
|
|
57
|
+
},
|
|
58
|
+
principalId: operatorPrincipalId(input.operatorName),
|
|
59
|
+
runId: input.runId ?? resolveRunId(),
|
|
60
|
+
runtimeHomePath: input.runtimeHomePath,
|
|
61
|
+
type: CONTROL_WAKE_ACCEPTED_TYPE
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Stamps `control.wake.accepted` once root's Moltnet loopback delivery
|
|
65
|
+
* endpoint (`/agents/:slug/wake`) is about to wake `targetAgentId` on behalf
|
|
66
|
+
* of an inter-agent message. `principal_id` is always the fixed
|
|
67
|
+
* `DELIVERY_PRINCIPAL_ID` (`system:moltnet`) — the delivering authority —
|
|
68
|
+
* never derived from a caller-supplied `from`/agent field, and never
|
|
69
|
+
* `operator:<name>` (that principal is reserved for the operator-only
|
|
70
|
+
* control endpoint; see `emitControlWakeAccepted`). `run_id` defaults to
|
|
71
|
+
* `resolveRunId()` like every other daimon emitter.
|
|
72
|
+
*/
|
|
73
|
+
export const emitDeliveryWakeAccepted = (input) => emitCausalEvent({
|
|
74
|
+
agentId: input.targetAgentId,
|
|
75
|
+
causeEventIds: input.causeEventIds ?? [],
|
|
76
|
+
eventId: deliveryWakeAcceptedEventId(input.requestId),
|
|
77
|
+
payload: {
|
|
78
|
+
delivered_by: "moltnet",
|
|
79
|
+
target_agent_id: input.targetAgentId,
|
|
80
|
+
wake_kind: input.wakeKind
|
|
81
|
+
},
|
|
82
|
+
principalId: DELIVERY_PRINCIPAL_ID,
|
|
83
|
+
runId: input.runId ?? resolveRunId(),
|
|
84
|
+
runtimeHomePath: input.runtimeHomePath,
|
|
85
|
+
type: CONTROL_WAKE_ACCEPTED_TYPE
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* Stamps `control.wake.denied` when root's operator-control endpoint rejects
|
|
89
|
+
* a wake request over a missing or invalid bearer token. Deny paths must
|
|
90
|
+
* never drop silently (see `specs/CAUSAL.md` enforcement point #3 / T5):
|
|
91
|
+
* every 401 the endpoint returns should carry exactly one of these. As with
|
|
92
|
+
* `emitControlWakeAccepted`, `principal_id` is always the authenticated
|
|
93
|
+
* operator identity, never a value read from the request.
|
|
94
|
+
*/
|
|
95
|
+
export const emitControlWakeDenied = (input) => emitCausalEvent({
|
|
96
|
+
agentId: input.targetAgentId,
|
|
97
|
+
causeEventIds: input.causeEventIds ?? [],
|
|
98
|
+
eventId: controlWakeDeniedEventId(input.requestId),
|
|
99
|
+
payload: {
|
|
100
|
+
reason: input.reason,
|
|
101
|
+
target_agent_id: input.targetAgentId
|
|
102
|
+
},
|
|
103
|
+
principalId: operatorPrincipalId(input.operatorName),
|
|
104
|
+
runId: input.runId ?? resolveRunId(),
|
|
105
|
+
runtimeHomePath: input.runtimeHomePath,
|
|
106
|
+
type: CONTROL_WAKE_DENIED_TYPE
|
|
107
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CausalEvent } from "./causalEvents.js";
|
|
2
|
+
export interface CausalFixtureResult {
|
|
3
|
+
events: [CausalEvent, CausalEvent];
|
|
4
|
+
jsonlPath: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RunCausalFixtureOptions {
|
|
7
|
+
/** Overrides the scratch runtime home; defaults to a fixed `.runtime/` path keyed on `spoof`. */
|
|
8
|
+
runtimeHomePath?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Adversarial mode: the fixture's "wake text" (standing in for untrusted
|
|
11
|
+
* model/request input) embeds a forged identity claim, but the emitted
|
|
12
|
+
* `principal_id` on both events must remain the authenticated
|
|
13
|
+
* `agent:<agentId>` regardless — never the claimed identity. Mirrors the
|
|
14
|
+
* spoof invariant already covered live in `piHarnessCausal.test.ts`
|
|
15
|
+
* ("model output cannot set principal_id...").
|
|
16
|
+
*/
|
|
17
|
+
spoof?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Runs the fixture and returns the two stamped events plus the jsonl path,
|
|
21
|
+
* without touching `process.stdout`/`process.exitCode` — the CLI entry
|
|
22
|
+
* point below wraps this for `npm run emit-causal-fixture`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const runCausalFixture: (options?: RunCausalFixtureOptions) => Promise<CausalFixtureResult>;
|
|
25
|
+
//# sourceMappingURL=emitCausalFixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitCausalFixture.d.ts","sourceRoot":"","sources":["../../src/observability/emitCausalFixture.ts"],"names":[],"mappings":"AAIA,OAAO,EAA4E,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0B/H,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,iGAAiG;IACjG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,UAAS,uBAA4B,KAAG,OAAO,CAAC,mBAAmB,CA0DzG,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { mkdir, rm } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { emitTurnInputSubmitted, emitTurnOutputCompleted, resolveRunId, sha256Hex } from "./causalEvents.js";
|
|
5
|
+
/**
|
|
6
|
+
* Standalone fixture emitter, run via `npm run emit-causal-fixture`
|
|
7
|
+
* (or `npm run emit-causal-fixture:spoof` for the adversarial mode below).
|
|
8
|
+
*
|
|
9
|
+
* Stamps one synthetic `turn.input.submitted` -> `turn.output.completed`
|
|
10
|
+
* chain into a scratch runtime home under `.runtime/causal-fixture[-spoof]/`,
|
|
11
|
+
* using the same `causalEvents.ts` functions `turnCausal.ts` uses for real
|
|
12
|
+
* turns. This is a fixture, not a live engine run: no Pi session, no mneme
|
|
13
|
+
* recall.
|
|
14
|
+
*
|
|
15
|
+
* `principal_id` here is stamped as `agent:<agentId>` directly (rather than
|
|
16
|
+
* importing `turnCausal.ts`'s `agentPrincipalId` helper) because this file
|
|
17
|
+
* lives under `src/observability/`, which stays engine-neutral and must not
|
|
18
|
+
* import `src/pi/` implementation details (see this folder's `AGENTS.md`).
|
|
19
|
+
* The value is the same grammar (`specs/CAUSAL.md` §3) either way.
|
|
20
|
+
*
|
|
21
|
+
* Exact invocation contract for a future cross-repo conformance harness
|
|
22
|
+
* (B92/B62, out of scope here) is not defined yet, so this script picks the
|
|
23
|
+
* simplest reasonable convention: write the fixture under a fixed relative
|
|
24
|
+
* path and print its absolute location as the last line of stdout.
|
|
25
|
+
*/
|
|
26
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
const daimonRoot = path.resolve(__dirname, "../..");
|
|
28
|
+
const SPOOFED_AGENT_ID = "attacker-agent";
|
|
29
|
+
/**
|
|
30
|
+
* Runs the fixture and returns the two stamped events plus the jsonl path,
|
|
31
|
+
* without touching `process.stdout`/`process.exitCode` — the CLI entry
|
|
32
|
+
* point below wraps this for `npm run emit-causal-fixture`.
|
|
33
|
+
*/
|
|
34
|
+
export const runCausalFixture = async (options = {}) => {
|
|
35
|
+
const spoof = options.spoof ?? false;
|
|
36
|
+
const runtimeHomePath = options.runtimeHomePath ?? path.join(daimonRoot, ".runtime", spoof ? "causal-fixture-spoof" : "causal-fixture");
|
|
37
|
+
await rm(runtimeHomePath, { recursive: true, force: true });
|
|
38
|
+
await mkdir(runtimeHomePath, { recursive: true });
|
|
39
|
+
const agentId = "fixture-agent";
|
|
40
|
+
const principalId = `agent:${agentId}`;
|
|
41
|
+
const turnId = "fixture-turn-1";
|
|
42
|
+
const runId = resolveRunId();
|
|
43
|
+
const inputText = spoof
|
|
44
|
+
? `Fixture wake text for the causal conformance harness. ` +
|
|
45
|
+
`SPOOF CLAIM (must be ignored): ${JSON.stringify({ from: SPOOFED_AGENT_ID, principal_id: `agent:${SPOOFED_AGENT_ID}` })}`
|
|
46
|
+
: "Fixture wake text for the causal conformance harness.";
|
|
47
|
+
const promptText = "Fixture prompt text.";
|
|
48
|
+
const outputText = spoof
|
|
49
|
+
? `Fixture reply text. SPOOF CLAIM (must be ignored): ${JSON.stringify({ principal_id: `agent:${SPOOFED_AGENT_ID}` })}`
|
|
50
|
+
: "Fixture reply text.";
|
|
51
|
+
const inputSubmitted = await emitTurnInputSubmitted({
|
|
52
|
+
agentId,
|
|
53
|
+
causeEventIds: [turnId],
|
|
54
|
+
inputContentSha256: sha256Hex(inputText),
|
|
55
|
+
inputMessageIds: [turnId],
|
|
56
|
+
principalId,
|
|
57
|
+
promptSha256: sha256Hex(promptText),
|
|
58
|
+
runId,
|
|
59
|
+
runtimeHomePath,
|
|
60
|
+
turnId
|
|
61
|
+
});
|
|
62
|
+
const outputCompleted = await emitTurnOutputCompleted({
|
|
63
|
+
agentId,
|
|
64
|
+
causeEventIds: [inputSubmitted.event_id],
|
|
65
|
+
outputSha256: sha256Hex(outputText),
|
|
66
|
+
principalId,
|
|
67
|
+
runId,
|
|
68
|
+
runtimeHomePath,
|
|
69
|
+
turnId
|
|
70
|
+
});
|
|
71
|
+
// The whole point of spoof mode: the forged claim above must never reach
|
|
72
|
+
// the stamped envelope. Fail loudly here rather than let a future refactor
|
|
73
|
+
// silently regress this invariant.
|
|
74
|
+
for (const event of [inputSubmitted, outputCompleted]) {
|
|
75
|
+
if (event.principal_id !== principalId) {
|
|
76
|
+
throw new Error(`causal fixture invariant violated: principal_id was "${event.principal_id}", expected "${principalId}"`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
events: [inputSubmitted, outputCompleted],
|
|
81
|
+
jsonlPath: path.join(runtimeHomePath, "telemetry", "causal.jsonl")
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
const isMainModule = () => {
|
|
85
|
+
const invoked = process.argv[1] ? path.resolve(process.argv[1]) : undefined;
|
|
86
|
+
return invoked !== undefined && invoked === path.resolve(fileURLToPath(import.meta.url));
|
|
87
|
+
};
|
|
88
|
+
if (isMainModule()) {
|
|
89
|
+
const spoof = process.argv.includes("--spoof");
|
|
90
|
+
runCausalFixture({ spoof })
|
|
91
|
+
.then((result) => {
|
|
92
|
+
console.log(result.jsonlPath);
|
|
93
|
+
})
|
|
94
|
+
.catch((error) => {
|
|
95
|
+
console.error(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orgObserver.d.ts","sourceRoot":"","sources":["../../src/observability/orgObserver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"orgObserver.d.ts","sourceRoot":"","sources":["../../src/observability/orgObserver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { ensureRuntimeHomeDirectory } from "../runtime/runtimeHomeLayout.js";
|
|
3
4
|
const maxExcerptChars = 280;
|
|
4
5
|
const excerpt = (text) => text.length <= maxExcerptChars ? text : `${text.slice(0, maxExcerptChars).trim()}...`;
|
|
5
6
|
export const mentionsFrom = (text) => [...new Set([...text.matchAll(/@([a-z0-9-]+)/gi)].map((match) => match[1].toLowerCase()))];
|
|
@@ -110,8 +111,7 @@ export class OrgObserver {
|
|
|
110
111
|
};
|
|
111
112
|
}
|
|
112
113
|
async write(runtimeRoot) {
|
|
113
|
-
const telemetryDir =
|
|
114
|
-
await mkdir(telemetryDir, { recursive: true });
|
|
114
|
+
const telemetryDir = await ensureRuntimeHomeDirectory(runtimeRoot, "telemetry");
|
|
115
115
|
const summaryRecord = {
|
|
116
116
|
assertions: this.assertions,
|
|
117
117
|
behavior: this.behaviorSummary(),
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token accounting for one AGY turn, as the engine itself reported it.
|
|
3
|
+
*
|
|
4
|
+
* Same shape and the same discipline as {@link import("./grokHeadlessResult.js").GrokTurnUsage},
|
|
5
|
+
* but AGY's envelope is *not* Grok's. Field provenance is the terminal frame of
|
|
6
|
+
* `agy --print … --output-format stream-json`:
|
|
7
|
+
*
|
|
8
|
+
* {"event":"result","result":{ "status":"SUCCESS", "response":"…",
|
|
9
|
+
* "num_turns":1,
|
|
10
|
+
* "usage":{"input_tokens":…, "output_tokens":…,
|
|
11
|
+
* "thinking_tokens":…, "cache_read_tokens":…, "total_tokens":…}}}
|
|
12
|
+
*
|
|
13
|
+
* Differences from Grok that this decoder exists to get right:
|
|
14
|
+
*
|
|
15
|
+
* - the prompt-side cache bucket is `cache_read_tokens`, **not**
|
|
16
|
+
* `cache_read_input_tokens`;
|
|
17
|
+
* - there is no `cache_creation_input_tokens` bucket at all, so `cacheWrite` is
|
|
18
|
+
* structurally absent and recorded as `0` — absent, not measured-as-zero;
|
|
19
|
+
* - there is no `total_cost_usd`, so `notionalUsd` is `0` for the same reason;
|
|
20
|
+
* - `thinking_tokens` has no Grok equivalent and is a **subset** of
|
|
21
|
+
* `output_tokens`, not a disjoint bucket. The captured plain turn is
|
|
22
|
+
* `input 13,722 + output 74 = 13,796 = total_tokens` with
|
|
23
|
+
* `thinking_tokens: 73`, so adding it would double-count reasoning tokens.
|
|
24
|
+
* It is therefore read only to be ignored;
|
|
25
|
+
* - AGY supplies its own `total_tokens`, which is cross-checked rather than
|
|
26
|
+
* trusted (see {@link decodeAgyTurnUsage});
|
|
27
|
+
* - `status: "SUCCESS"` replaces Grok's `subtype`/`is_error` pair.
|
|
28
|
+
*
|
|
29
|
+
* The terminal frame's `usage` is the sum over the turn's model steps, not the
|
|
30
|
+
* last step's: the captured tool turn sums three `step_update` frames
|
|
31
|
+
* (14,579 + 15,079 + 15,279 input) into `input_tokens: 44,937`. Reading a
|
|
32
|
+
* `step_update` would under-report every tool-using wake.
|
|
33
|
+
*/
|
|
34
|
+
export type AgyTurnUsage = Readonly<{
|
|
35
|
+
input: number;
|
|
36
|
+
output: number;
|
|
37
|
+
cacheRead: number;
|
|
38
|
+
cacheWrite: number;
|
|
39
|
+
total: number;
|
|
40
|
+
calls: number;
|
|
41
|
+
notionalUsd: number;
|
|
42
|
+
complete: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
export type AgyHeadlessTurn = Readonly<{
|
|
45
|
+
text: string;
|
|
46
|
+
usage?: AgyTurnUsage;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Decode AGY's `stream-json` NDJSON without treating a progress frame as a
|
|
50
|
+
* reply, and extract the turn's own token accounting from the same frame.
|
|
51
|
+
*
|
|
52
|
+
* Frames before the terminal one are `{"event":"init"|"step_update", …}`.
|
|
53
|
+
* Unrecognized `event` values are skipped rather than rejected: AGY owns this
|
|
54
|
+
* stream and a frame kind added later must not fail a turn that published.
|
|
55
|
+
* The terminal `result` frame must be the last line, exactly as with Grok.
|
|
56
|
+
*/
|
|
57
|
+
export declare const decodeAgyHeadlessTurn: (output: string) => AgyHeadlessTurn;
|
|
58
|
+
/** Text-only view of {@link decodeAgyHeadlessTurn}, for callers that do not meter. */
|
|
59
|
+
export declare const decodeAgyHeadlessResult: (output: string) => string;
|
|
60
|
+
//# sourceMappingURL=agyHeadlessResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agyHeadlessResult.d.ts","sourceRoot":"","sources":["../../src/pi/agyHeadlessResult.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAqD/E;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,KAAG,eAkBtD,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,MAA4C,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2
|
+
const invalidResult = (detail) => new Error(`AGY CLI returned no publishable terminal response: ${detail}`);
|
|
3
|
+
/**
|
|
4
|
+
* The three token buckets AGY emits on `result.usage`. All three must be
|
|
5
|
+
* present and be non-negative safe integers; a renamed, stringified, negative,
|
|
6
|
+
* or fractional field rejects the whole block rather than silently contributing
|
|
7
|
+
* a zero, because a zero bucket is byte-indistinguishable from a real one.
|
|
8
|
+
*/
|
|
9
|
+
const USAGE_TOKEN_FIELDS = ["input_tokens", "output_tokens", "cache_read_tokens"];
|
|
10
|
+
const tokenCount = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Extract per-turn usage from the terminal `result` frame.
|
|
13
|
+
*
|
|
14
|
+
* Advisory: a malformed or absent usage block yields `undefined` rather than
|
|
15
|
+
* failing a turn that published correctly, and never throws.
|
|
16
|
+
*
|
|
17
|
+
* `complete` follows exactly the honesty rule the Grok decoder states: AGY's
|
|
18
|
+
* envelope has no marker for incomplete or absent usage either, so an all-zero
|
|
19
|
+
* block reads as "unknown", not "free". It cannot catch a *partially*
|
|
20
|
+
* zero-filled turn, so every count this decoder produces is a lower bound.
|
|
21
|
+
*
|
|
22
|
+
* AGY additionally reports its own `total_tokens`. Neither side is trusted
|
|
23
|
+
* blindly: the derived sum `input + cacheRead + output` is compared against it,
|
|
24
|
+
* `total` is the larger of the two so a reconciliation failure can never
|
|
25
|
+
* under-report, and any disagreement clears `complete` so the record is
|
|
26
|
+
* rendered as an incomplete turn rather than a verified count. A `total_tokens`
|
|
27
|
+
* that is not a non-negative safe integer rejects the block outright, because
|
|
28
|
+
* an unreadable total is a total that cannot be reconciled.
|
|
29
|
+
*/
|
|
30
|
+
const decodeAgyTurnUsage = (result) => {
|
|
31
|
+
if (!isRecord(result.usage))
|
|
32
|
+
return undefined;
|
|
33
|
+
const usage = result.usage;
|
|
34
|
+
const counts = USAGE_TOKEN_FIELDS.map((field) => tokenCount(usage[field]));
|
|
35
|
+
if (counts.some((count) => count === undefined))
|
|
36
|
+
return undefined;
|
|
37
|
+
const [input, output, cacheRead] = counts;
|
|
38
|
+
const reported = usage.total_tokens === undefined ? undefined : tokenCount(usage.total_tokens);
|
|
39
|
+
if (usage.total_tokens !== undefined && reported === undefined)
|
|
40
|
+
return undefined;
|
|
41
|
+
const derived = input + cacheRead + output;
|
|
42
|
+
return {
|
|
43
|
+
input,
|
|
44
|
+
output,
|
|
45
|
+
cacheRead,
|
|
46
|
+
cacheWrite: 0,
|
|
47
|
+
total: reported === undefined ? derived : Math.max(derived, reported),
|
|
48
|
+
calls: tokenCount(result.num_turns) ?? 0,
|
|
49
|
+
notionalUsd: 0,
|
|
50
|
+
complete: derived > 0 && (reported === undefined || reported === derived)
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Decode AGY's `stream-json` NDJSON without treating a progress frame as a
|
|
55
|
+
* reply, and extract the turn's own token accounting from the same frame.
|
|
56
|
+
*
|
|
57
|
+
* Frames before the terminal one are `{"event":"init"|"step_update", …}`.
|
|
58
|
+
* Unrecognized `event` values are skipped rather than rejected: AGY owns this
|
|
59
|
+
* stream and a frame kind added later must not fail a turn that published.
|
|
60
|
+
* The terminal `result` frame must be the last line, exactly as with Grok.
|
|
61
|
+
*/
|
|
62
|
+
export const decodeAgyHeadlessTurn = (output) => {
|
|
63
|
+
const lines = output.split(/\r?\n/).filter((line) => line.length > 0);
|
|
64
|
+
if (lines.length === 0)
|
|
65
|
+
throw invalidResult("empty stream");
|
|
66
|
+
let result;
|
|
67
|
+
for (const [index, line] of lines.entries()) {
|
|
68
|
+
let frame;
|
|
69
|
+
try {
|
|
70
|
+
frame = JSON.parse(line);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw invalidResult("invalid JSON");
|
|
74
|
+
}
|
|
75
|
+
if (!isRecord(frame) || typeof frame.event !== "string")
|
|
76
|
+
throw invalidResult("invalid event");
|
|
77
|
+
if (frame.event !== "result")
|
|
78
|
+
continue;
|
|
79
|
+
if (index !== lines.length - 1)
|
|
80
|
+
throw invalidResult("non-terminal result");
|
|
81
|
+
if (!isRecord(frame.result))
|
|
82
|
+
throw invalidResult("invalid result event");
|
|
83
|
+
result = frame.result;
|
|
84
|
+
}
|
|
85
|
+
if (result === undefined)
|
|
86
|
+
throw invalidResult("no result frame");
|
|
87
|
+
if (result.status !== "SUCCESS")
|
|
88
|
+
throw invalidResult("unsuccessful result");
|
|
89
|
+
if (typeof result.response !== "string" || result.response.trim().length === 0)
|
|
90
|
+
throw invalidResult("empty response");
|
|
91
|
+
const usage = decodeAgyTurnUsage(result);
|
|
92
|
+
return usage === undefined ? { text: result.response.trim() } : { text: result.response.trim(), usage };
|
|
93
|
+
};
|
|
94
|
+
/** Text-only view of {@link decodeAgyHeadlessTurn}, for callers that do not meter. */
|
|
95
|
+
export const decodeAgyHeadlessResult = (output) => decodeAgyHeadlessTurn(output).text;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ChildProcess } from "node:child_process";
|
|
2
|
+
import type { TurnUsageFailureReason } from "../runtime/turnUsageLedger.js";
|
|
3
|
+
import { type CodexTurnUsage } from "./codexHeadlessResult.js";
|
|
4
|
+
/** Maximum assistant reply bytes retained from stdout. */
|
|
5
|
+
export declare const CLI_ENGINE_MAX_OUTPUT_BYTES: number;
|
|
6
|
+
/** Diagnostic bytes retained from stderr for a failed child: its head and its tail together. */
|
|
7
|
+
export declare const CLI_ENGINE_MAX_DIAGNOSTIC_BYTES = 768;
|
|
8
|
+
export declare const tagCliChildFailure: <T>(error: T, reason: TurnUsageFailureReason) => T;
|
|
9
|
+
export declare const cliChildFailureReason: (error: unknown) => TurnUsageFailureReason | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* One bounded window over a failed child's own output: its head AND its tail,
|
|
12
|
+
* with an explicit marker naming the bytes elided between them.
|
|
13
|
+
*
|
|
14
|
+
* A pure tail is the wrong end for the process this exists for. A worker that
|
|
15
|
+
* dies early prints its error first and then echoes its own input, so the tail
|
|
16
|
+
* is the echo: one live brokered turn reported 512 bytes of its own prompt
|
|
17
|
+
* read back, with the actual error already off the front and discarded. Both
|
|
18
|
+
* ends cost the same window, and the marker is the one oversized tool results
|
|
19
|
+
* already use (`toolResultSpill.ts`), so a reader meets one shape everywhere.
|
|
20
|
+
*
|
|
21
|
+
* The marker is paid for out of the same budget — it is sized against the
|
|
22
|
+
* largest count it could carry — so the result never exceeds `maxBytes`, and
|
|
23
|
+
* output that fits is returned byte-identical with no marker at all.
|
|
24
|
+
*/
|
|
25
|
+
export declare const boundedDiagnosticWindow: (value: string, maxBytes: number) => string;
|
|
26
|
+
export declare const readChild: (child: ChildProcess, timeoutMs: number | undefined, secretValues: readonly string[], options?: Readonly<{
|
|
27
|
+
failureClassifier?: (diagnostic: string) => Error | undefined;
|
|
28
|
+
retainNdjson?: "codex";
|
|
29
|
+
retainStdoutTail?: boolean;
|
|
30
|
+
/** Overrides the generic wall-clock-timeout message so the caller can name which bound was hit. */
|
|
31
|
+
timeoutErrorMessage?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Per-wake token ceiling for a Codex turn (`retainNdjson: "codex"` only).
|
|
34
|
+
* Codex's `--json` stream reports usage exactly once, on `turn.completed`
|
|
35
|
+
* — there is no incremental total to watch mid-turn — so this is
|
|
36
|
+
* enforced at the earliest and only moment the crossing is observable:
|
|
37
|
+
* the instant that frame is parsed off the stream. Crossing it kills the
|
|
38
|
+
* child immediately (rather than letting an over-budget turn resolve as
|
|
39
|
+
* a normal success) and fails the wake with a bound-named error.
|
|
40
|
+
*/
|
|
41
|
+
codexTokenCeiling?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Called once per parsed `turn.completed` frame (`retainNdjson: "codex"`
|
|
44
|
+
* only), with that frame's decoded usage — or `undefined` when the usage
|
|
45
|
+
* block is absent or malformed, which is never substituted with zeros.
|
|
46
|
+
*
|
|
47
|
+
* This is the only point at which a wake that is about to be killed — by
|
|
48
|
+
* the ceiling, by the wall clock, or by a non-zero exit — can still hand
|
|
49
|
+
* over what Codex reported it spent. Every path downstream of here either
|
|
50
|
+
* rejects or discards the stream, which is how a breached wake's usage
|
|
51
|
+
* used to survive only inside an error message.
|
|
52
|
+
*/
|
|
53
|
+
onCodexTurnCompleted?: (usage: CodexTurnUsage | undefined) => void;
|
|
54
|
+
/**
|
|
55
|
+
* Called with the thread id from Codex's `thread.started` frame
|
|
56
|
+
* (`retainNdjson: "codex"` only), the first line of every `codex exec
|
|
57
|
+
* --json` stream — verified live against codex-cli 0.153.4:
|
|
58
|
+
* `{"type":"thread.started","thread_id":"01a076d3-…"}`.
|
|
59
|
+
*
|
|
60
|
+
* That id is the only key that ties this wake to the rollout Codex writes
|
|
61
|
+
* under `$CODEX_HOME/sessions/**`, where the per-model-request accounting
|
|
62
|
+
* lives. The frame stays out of the retained stream: the decoder's
|
|
63
|
+
* vocabulary and the retained-output budget are unchanged by reading it.
|
|
64
|
+
*/
|
|
65
|
+
onCodexThreadStarted?: (threadId: string) => void;
|
|
66
|
+
}>) => Promise<string>;
|
|
67
|
+
//# sourceMappingURL=cliChildOutput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliChildOutput.d.ts","sourceRoot":"","sources":["../../src/pi/cliChildOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGrF,0DAA0D;AAC1D,eAAO,MAAM,2BAA2B,QAAY,CAAC;AACrD,gGAAgG;AAChG,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAanD,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,sBAAsB,KAAG,CAOhF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,sBAAsB,GAAG,SAGjE,CAAC;AAMhB;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,MAQzE,CAAC;AAUF,eAAO,MAAM,SAAS,GACpB,OAAO,YAAY,EACnB,WAAW,MAAM,GAAG,SAAS,EAC7B,cAAc,SAAS,MAAM,EAAE,EAC/B,UAAS,QAAQ,CAAC;IAChB,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAC;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mGAAmG;IACnG,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,KAAK,IAAI,CAAC;IACnE;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAM,KACN,OAAO,CAAC,MAAM,CAmLf,CAAC"}
|