@agimon-ai/po-core 0.0.0-alpha.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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/agentModel.cjs +4 -0
- package/dist/agentModel.d.mts +2 -0
- package/dist/agentModel.mjs +2 -0
- package/dist/apiContracts.cjs +2094 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +1086 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +2074 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/askUser.cjs +8 -0
- package/dist/askUser.d.mts +2 -0
- package/dist/askUser.mjs +2 -0
- package/dist/authorTools.cjs +5 -0
- package/dist/authorTools.d.mts +2 -0
- package/dist/authorTools.mjs +2 -0
- package/dist/backgroundWork.cjs +9 -0
- package/dist/backgroundWork.d.mts +2 -0
- package/dist/backgroundWork.mjs +2 -0
- package/dist/bundleAssetPolicy.cjs +5 -0
- package/dist/bundleAssetPolicy.d.mts +2 -0
- package/dist/bundleAssetPolicy.mjs +2 -0
- package/dist/childProcess.cjs +15 -0
- package/dist/childProcess.d.mts +2 -0
- package/dist/childProcess.mjs +2 -0
- package/dist/childSession.cjs +9 -0
- package/dist/childSession.d.mts +3 -0
- package/dist/childSession.mjs +3 -0
- package/dist/cockpitContainer.cjs +4 -0
- package/dist/cockpitContainer.d.mts +2 -0
- package/dist/cockpitContainer.mjs +2 -0
- package/dist/config.cjs +13 -0
- package/dist/config.d.mts +3 -0
- package/dist/config.mjs +2 -0
- package/dist/contextApi.cjs +12 -0
- package/dist/contextApi.d.mts +4 -0
- package/dist/contextApi.mjs +3 -0
- package/dist/contextContributions.cjs +7 -0
- package/dist/contextContributions.d.mts +3 -0
- package/dist/contextContributions.mjs +3 -0
- package/dist/contextDetail.cjs +65 -0
- package/dist/contextDetail.cjs.map +1 -0
- package/dist/contextDetail.d.mts +19 -0
- package/dist/contextDetail.d.mts.map +1 -0
- package/dist/contextDetail.mjs +64 -0
- package/dist/contextDetail.mjs.map +1 -0
- package/dist/contextDetailStore.cjs +96 -0
- package/dist/contextDetailStore.cjs.map +1 -0
- package/dist/contextDetailStore.d.mts +21 -0
- package/dist/contextDetailStore.d.mts.map +1 -0
- package/dist/contextDetailStore.mjs +87 -0
- package/dist/contextDetailStore.mjs.map +1 -0
- package/dist/contextProjection.cjs +121 -0
- package/dist/contextProjection.cjs.map +1 -0
- package/dist/contextProjection.d.mts +130 -0
- package/dist/contextProjection.d.mts.map +1 -0
- package/dist/contextProjection.mjs +117 -0
- package/dist/contextProjection.mjs.map +1 -0
- package/dist/cordisHost.cjs +13 -0
- package/dist/cordisHost.d.mts +2 -0
- package/dist/cordisHost.mjs +2 -0
- package/dist/delegation.cjs +18 -0
- package/dist/delegation.d.mts +2 -0
- package/dist/delegation.mjs +2 -0
- package/dist/doomPackage.cjs +61 -0
- package/dist/doomPackage.cjs.map +1 -0
- package/dist/doomPackage.d.mts +17 -0
- package/dist/doomPackage.d.mts.map +1 -0
- package/dist/doomPackage.mjs +54 -0
- package/dist/doomPackage.mjs.map +1 -0
- package/dist/executionBudget.cjs +232 -0
- package/dist/executionBudget.cjs.map +1 -0
- package/dist/executionBudget.d.mts +11 -0
- package/dist/executionBudget.d.mts.map +1 -0
- package/dist/executionBudget.mjs +226 -0
- package/dist/executionBudget.mjs.map +1 -0
- package/dist/extensionFile.cjs +19 -0
- package/dist/extensionFile.d.mts +3 -0
- package/dist/extensionFile.mjs +2 -0
- package/dist/footer.cjs +6 -0
- package/dist/footer.d.mts +2 -0
- package/dist/footer.mjs +2 -0
- package/dist/headless.cjs +16 -0
- package/dist/headless.d.mts +2 -0
- package/dist/headless.mjs +2 -0
- package/dist/headlessHub.cjs +1008 -0
- package/dist/headlessHub.cjs.map +1 -0
- package/dist/headlessHub.d.mts +176 -0
- package/dist/headlessHub.d.mts.map +1 -0
- package/dist/headlessHub.mjs +1005 -0
- package/dist/headlessHub.mjs.map +1 -0
- package/dist/headlessServer.cjs +956 -0
- package/dist/headlessServer.cjs.map +1 -0
- package/dist/headlessServer.d.mts +66 -0
- package/dist/headlessServer.d.mts.map +1 -0
- package/dist/headlessServer.mjs +949 -0
- package/dist/headlessServer.mjs.map +1 -0
- package/dist/headlessSessionHost.cjs +0 -0
- package/dist/headlessSessionHost.d.mts +89 -0
- package/dist/headlessSessionHost.d.mts.map +1 -0
- package/dist/headlessSessionHost.mjs +1 -0
- package/dist/headlessSessionManager.cjs +51 -0
- package/dist/headlessSessionManager.cjs.map +1 -0
- package/dist/headlessSessionManager.d.mts +6 -0
- package/dist/headlessSessionManager.d.mts.map +1 -0
- package/dist/headlessSessionManager.mjs +50 -0
- package/dist/headlessSessionManager.mjs.map +1 -0
- package/dist/help.cjs +24 -0
- package/dist/help.d.mts +3 -0
- package/dist/help.mjs +3 -0
- package/dist/history.cjs +25 -0
- package/dist/history.d.mts +10 -0
- package/dist/history.mjs +10 -0
- package/dist/historyOwnership.cjs +253 -0
- package/dist/historyOwnership.cjs.map +1 -0
- package/dist/historyOwnership.d.mts +23 -0
- package/dist/historyOwnership.d.mts.map +1 -0
- package/dist/historyOwnership.mjs +247 -0
- package/dist/historyOwnership.mjs.map +1 -0
- package/dist/hubChannel.cjs +4 -0
- package/dist/hubChannel.d.mts +2 -0
- package/dist/hubChannel.mjs +2 -0
- package/dist/index.cjs +44 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.mjs +6 -0
- package/dist/json.cjs +6 -0
- package/dist/json.d.mts +2 -0
- package/dist/json.mjs +2 -0
- package/dist/jsonlSessionRepo.cjs +44 -0
- package/dist/jsonlSessionRepo.cjs.map +1 -0
- package/dist/jsonlSessionRepo.d.mts +7 -0
- package/dist/jsonlSessionRepo.d.mts.map +1 -0
- package/dist/jsonlSessionRepo.mjs +42 -0
- package/dist/jsonlSessionRepo.mjs.map +1 -0
- package/dist/kernel.cjs +3 -0
- package/dist/kernel.d.mts +3 -0
- package/dist/kernel.mjs +2 -0
- package/dist/leader.cjs +9 -0
- package/dist/leader.d.mts +2 -0
- package/dist/leader.mjs +2 -0
- package/dist/logSinkTelemetry.cjs +5 -0
- package/dist/logSinkTelemetry.d.mts +2 -0
- package/dist/logSinkTelemetry.mjs +2 -0
- package/dist/machineApi.cjs +92 -0
- package/dist/machineApi.cjs.map +1 -0
- package/dist/machineApi.d.mts +7 -0
- package/dist/machineApi.d.mts.map +1 -0
- package/dist/machineApi.mjs +88 -0
- package/dist/machineApi.mjs.map +1 -0
- package/dist/main.cjs +11 -0
- package/dist/main.d.mts +5 -0
- package/dist/main.mjs +4 -0
- package/dist/mcpFacet.cjs +9 -0
- package/dist/mcpFacet.d.mts +4 -0
- package/dist/mcpFacet.mjs +3 -0
- package/dist/mcpProjection.cjs +16 -0
- package/dist/mcpProjection.d.mts +2 -0
- package/dist/mcpProjection.mjs +2 -0
- package/dist/mcpSchemaCost.cjs +195 -0
- package/dist/mcpSchemaCost.cjs.map +1 -0
- package/dist/mcpSchemaCost.d.mts +35 -0
- package/dist/mcpSchemaCost.d.mts.map +1 -0
- package/dist/mcpSchemaCost.mjs +190 -0
- package/dist/mcpSchemaCost.mjs.map +1 -0
- package/dist/mcpSession.cjs +9 -0
- package/dist/mcpSession.d.mts +2 -0
- package/dist/mcpSession.mjs +2 -0
- package/dist/mcpStatus.cjs +7 -0
- package/dist/mcpStatus.d.mts +2 -0
- package/dist/mcpStatus.mjs +2 -0
- package/dist/mcpToolResolver.cjs +5 -0
- package/dist/mcpToolResolver.d.mts +2 -0
- package/dist/mcpToolResolver.mjs +2 -0
- package/dist/mcpWidget.cjs +0 -0
- package/dist/mcpWidget.d.mts +2 -0
- package/dist/mcpWidget.mjs +1 -0
- package/dist/moduleResolution.cjs +412 -0
- package/dist/moduleResolution.cjs.map +1 -0
- package/dist/moduleResolution.d.mts +72 -0
- package/dist/moduleResolution.d.mts.map +1 -0
- package/dist/moduleResolution.mjs +396 -0
- package/dist/moduleResolution.mjs.map +1 -0
- package/dist/narration.cjs +10 -0
- package/dist/narration.d.mts +2 -0
- package/dist/narration.mjs +2 -0
- package/dist/native.cjs +29 -0
- package/dist/native.d.mts +12 -0
- package/dist/native.mjs +8 -0
- package/dist/notification.cjs +17 -0
- package/dist/notification.d.mts +2 -0
- package/dist/notification.mjs +2 -0
- package/dist/packageApi.cjs +17 -0
- package/dist/packageApi.d.mts +3 -0
- package/dist/packageApi.mjs +3 -0
- package/dist/packageApiServer.cjs +196 -0
- package/dist/packageApiServer.cjs.map +1 -0
- package/dist/packageApiServer.d.mts +62 -0
- package/dist/packageApiServer.d.mts.map +1 -0
- package/dist/packageApiServer.mjs +194 -0
- package/dist/packageApiServer.mjs.map +1 -0
- package/dist/piSettings.cjs +20 -0
- package/dist/piSettings.d.mts +2 -0
- package/dist/piSettings.mjs +2 -0
- package/dist/pluginProtocol.cjs +10 -0
- package/dist/pluginProtocol.d.mts +2 -0
- package/dist/pluginProtocol.mjs +2 -0
- package/dist/profileIdentity.cjs +6 -0
- package/dist/profileIdentity.d.mts +2 -0
- package/dist/profileIdentity.mjs +2 -0
- package/dist/protocol.cjs +10 -0
- package/dist/protocol.d.mts +2 -0
- package/dist/protocol.mjs +2 -0
- package/dist/readiness.cjs +8 -0
- package/dist/readiness.d.mts +2 -0
- package/dist/readiness.mjs +2 -0
- package/dist/remoteApi.cjs +45 -0
- package/dist/remoteApi.cjs.map +1 -0
- package/dist/remoteApi.d.mts +7 -0
- package/dist/remoteApi.d.mts.map +1 -0
- package/dist/remoteApi.mjs +44 -0
- package/dist/remoteApi.mjs.map +1 -0
- package/dist/remoteRuntime.cjs +498 -0
- package/dist/remoteRuntime.cjs.map +1 -0
- package/dist/remoteRuntime.d.mts +36 -0
- package/dist/remoteRuntime.d.mts.map +1 -0
- package/dist/remoteRuntime.mjs +494 -0
- package/dist/remoteRuntime.mjs.map +1 -0
- package/dist/runtimeConfig.cjs +232 -0
- package/dist/runtimeConfig.cjs.map +1 -0
- package/dist/runtimeConfig.d.mts +313 -0
- package/dist/runtimeConfig.d.mts.map +1 -0
- package/dist/runtimeConfig.mjs +221 -0
- package/dist/runtimeConfig.mjs.map +1 -0
- package/dist/runtimeContextApi.cjs +64 -0
- package/dist/runtimeContextApi.cjs.map +1 -0
- package/dist/runtimeContextApi.d.mts +16 -0
- package/dist/runtimeContextApi.d.mts.map +1 -0
- package/dist/runtimeContextApi.mjs +62 -0
- package/dist/runtimeContextApi.mjs.map +1 -0
- package/dist/runtimeCordisHost.cjs +223 -0
- package/dist/runtimeCordisHost.cjs.map +1 -0
- package/dist/runtimeCordisHost.d.mts +78 -0
- package/dist/runtimeCordisHost.d.mts.map +1 -0
- package/dist/runtimeCordisHost.mjs +212 -0
- package/dist/runtimeCordisHost.mjs.map +1 -0
- package/dist/runtimeHeadlessSessionManager.cjs +0 -0
- package/dist/runtimeHeadlessSessionManager.d.mts +18 -0
- package/dist/runtimeHeadlessSessionManager.d.mts.map +1 -0
- package/dist/runtimeHeadlessSessionManager.mjs +1 -0
- package/dist/runtimeIdentity.cjs +26 -0
- package/dist/runtimeIdentity.cjs.map +1 -0
- package/dist/runtimeIdentity.d.mts +7 -0
- package/dist/runtimeIdentity.d.mts.map +1 -0
- package/dist/runtimeIdentity.mjs +21 -0
- package/dist/runtimeIdentity.mjs.map +1 -0
- package/dist/runtimeJson.cjs +46 -0
- package/dist/runtimeJson.cjs.map +1 -0
- package/dist/runtimeJson.d.mts +22 -0
- package/dist/runtimeJson.d.mts.map +1 -0
- package/dist/runtimeJson.mjs +39 -0
- package/dist/runtimeJson.mjs.map +1 -0
- package/dist/runtimeLogSinkTelemetry.cjs +102 -0
- package/dist/runtimeLogSinkTelemetry.cjs.map +1 -0
- package/dist/runtimeLogSinkTelemetry.d.mts +49 -0
- package/dist/runtimeLogSinkTelemetry.d.mts.map +1 -0
- package/dist/runtimeLogSinkTelemetry.mjs +99 -0
- package/dist/runtimeLogSinkTelemetry.mjs.map +1 -0
- package/dist/runtimePackages.cjs +120 -0
- package/dist/runtimePackages.cjs.map +1 -0
- package/dist/runtimePackages.d.mts +57 -0
- package/dist/runtimePackages.d.mts.map +1 -0
- package/dist/runtimePackages.mjs +110 -0
- package/dist/runtimePackages.mjs.map +1 -0
- package/dist/runtimePiSettings.cjs +257 -0
- package/dist/runtimePiSettings.cjs.map +1 -0
- package/dist/runtimePiSettings.d.mts +70 -0
- package/dist/runtimePiSettings.d.mts.map +1 -0
- package/dist/runtimePiSettings.mjs +235 -0
- package/dist/runtimePiSettings.mjs.map +1 -0
- package/dist/runtimeProtocol.cjs +228 -0
- package/dist/runtimeProtocol.cjs.map +1 -0
- package/dist/runtimeProtocol.d.mts +86 -0
- package/dist/runtimeProtocol.d.mts.map +1 -0
- package/dist/runtimeProtocol.mjs +219 -0
- package/dist/runtimeProtocol.mjs.map +1 -0
- package/dist/runtimeToolNames.cjs +51 -0
- package/dist/runtimeToolNames.cjs.map +1 -0
- package/dist/runtimeToolNames.d.mts +24 -0
- package/dist/runtimeToolNames.d.mts.map +1 -0
- package/dist/runtimeToolNames.mjs +49 -0
- package/dist/runtimeToolNames.mjs.map +1 -0
- package/dist/runtimeTransition.cjs +27 -0
- package/dist/runtimeTransition.cjs.map +1 -0
- package/dist/runtimeTransition.d.mts +114 -0
- package/dist/runtimeTransition.d.mts.map +1 -0
- package/dist/runtimeTransition.mjs +24 -0
- package/dist/runtimeTransition.mjs.map +1 -0
- package/dist/sandboxHarness.cjs +6 -0
- package/dist/sandboxHarness.d.mts +2 -0
- package/dist/sandboxHarness.mjs +2 -0
- package/dist/server.cjs +17 -0
- package/dist/server.d.mts +10 -0
- package/dist/server.mjs +7 -0
- package/dist/serverFacet.cjs +34 -0
- package/dist/serverFacet.d.mts +10 -0
- package/dist/serverFacet.mjs +9 -0
- package/dist/serverTelemetry.cjs +25 -0
- package/dist/serverTelemetry.cjs.map +1 -0
- package/dist/serverTelemetry.d.mts +12 -0
- package/dist/serverTelemetry.d.mts.map +1 -0
- package/dist/serverTelemetry.mjs +23 -0
- package/dist/serverTelemetry.mjs.map +1 -0
- package/dist/sessionFilesApi.cjs +96 -0
- package/dist/sessionFilesApi.cjs.map +1 -0
- package/dist/sessionFilesApi.d.mts +7 -0
- package/dist/sessionFilesApi.d.mts.map +1 -0
- package/dist/sessionFilesApi.mjs +91 -0
- package/dist/sessionFilesApi.mjs.map +1 -0
- package/dist/sessionMcp.cjs +6 -0
- package/dist/sessionMcp.d.mts +5 -0
- package/dist/sessionMcp.mjs +3 -0
- package/dist/sessionProtocol.cjs +8 -0
- package/dist/sessionProtocol.d.mts +3 -0
- package/dist/sessionProtocol.mjs +2 -0
- package/dist/skills.cjs +9 -0
- package/dist/skills.d.mts +2 -0
- package/dist/skills.mjs +2 -0
- package/dist/sqliteSessionStorage.cjs +168 -0
- package/dist/sqliteSessionStorage.cjs.map +1 -0
- package/dist/sqliteSessionStorage.d.mts +35 -0
- package/dist/sqliteSessionStorage.d.mts.map +1 -0
- package/dist/sqliteSessionStorage.mjs +158 -0
- package/dist/sqliteSessionStorage.mjs.map +1 -0
- package/dist/src/constants/authorTools.cjs +10 -0
- package/dist/src/constants/authorTools.cjs.map +1 -0
- package/dist/src/constants/authorTools.d.mts +6 -0
- package/dist/src/constants/authorTools.d.mts.map +1 -0
- package/dist/src/constants/authorTools.mjs +8 -0
- package/dist/src/constants/authorTools.mjs.map +1 -0
- package/dist/src/constants/contextApi.cjs +31 -0
- package/dist/src/constants/contextApi.cjs.map +1 -0
- package/dist/src/constants/contextApi.d.mts +23 -0
- package/dist/src/constants/contextApi.d.mts.map +1 -0
- package/dist/src/constants/contextApi.mjs +25 -0
- package/dist/src/constants/contextApi.mjs.map +1 -0
- package/dist/src/constants/nativeHost.cjs +56 -0
- package/dist/src/constants/nativeHost.cjs.map +1 -0
- package/dist/src/constants/nativeHost.d.mts +21 -0
- package/dist/src/constants/nativeHost.d.mts.map +1 -0
- package/dist/src/constants/nativeHost.mjs +53 -0
- package/dist/src/constants/nativeHost.mjs.map +1 -0
- package/dist/src/constants/remote.cjs +132 -0
- package/dist/src/constants/remote.cjs.map +1 -0
- package/dist/src/constants/remote.mjs +99 -0
- package/dist/src/constants/remote.mjs.map +1 -0
- package/dist/src/constants/sessionFiles.cjs +27 -0
- package/dist/src/constants/sessionFiles.cjs.map +1 -0
- package/dist/src/constants/sessionFiles.mjs +25 -0
- package/dist/src/constants/sessionFiles.mjs.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.cjs +12 -0
- package/dist/src/constants/voiceReloadHandoff.cjs.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.d.mts +7 -0
- package/dist/src/constants/voiceReloadHandoff.d.mts.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.mjs +9 -0
- package/dist/src/constants/voiceReloadHandoff.mjs.map +1 -0
- package/dist/src/constants/voiceTools.cjs +96 -0
- package/dist/src/constants/voiceTools.cjs.map +1 -0
- package/dist/src/constants/voiceTools.d.mts +58 -0
- package/dist/src/constants/voiceTools.d.mts.map +1 -0
- package/dist/src/constants/voiceTools.mjs +60 -0
- package/dist/src/constants/voiceTools.mjs.map +1 -0
- package/dist/src/extensions/extensionFile.cjs +140 -0
- package/dist/src/extensions/extensionFile.cjs.map +1 -0
- package/dist/src/extensions/extensionFile.d.mts +69 -0
- package/dist/src/extensions/extensionFile.d.mts.map +1 -0
- package/dist/src/extensions/extensionFile.mjs +124 -0
- package/dist/src/extensions/extensionFile.mjs.map +1 -0
- package/dist/src/extensions/serverPlugin.cjs +107 -0
- package/dist/src/extensions/serverPlugin.cjs.map +1 -0
- package/dist/src/extensions/serverPlugin.d.mts +5 -0
- package/dist/src/extensions/serverPlugin.d.mts.map +1 -0
- package/dist/src/extensions/serverPlugin.mjs +107 -0
- package/dist/src/extensions/serverPlugin.mjs.map +1 -0
- package/dist/src/extensions/webPlugin.cjs +136 -0
- package/dist/src/extensions/webPlugin.cjs.map +1 -0
- package/dist/src/extensions/webPlugin.d.mts +68 -0
- package/dist/src/extensions/webPlugin.d.mts.map +1 -0
- package/dist/src/extensions/webPlugin.mjs +114 -0
- package/dist/src/extensions/webPlugin.mjs.map +1 -0
- package/dist/src/pi/piSessionRuntime.cjs +625 -0
- package/dist/src/pi/piSessionRuntime.cjs.map +1 -0
- package/dist/src/pi/piSessionRuntime.d.mts +43 -0
- package/dist/src/pi/piSessionRuntime.d.mts.map +1 -0
- package/dist/src/pi/piSessionRuntime.mjs +624 -0
- package/dist/src/pi/piSessionRuntime.mjs.map +1 -0
- package/dist/src/pi/piWebSocketListener.cjs +115 -0
- package/dist/src/pi/piWebSocketListener.cjs.map +1 -0
- package/dist/src/pi/piWebSocketListener.mjs +115 -0
- package/dist/src/pi/piWebSocketListener.mjs.map +1 -0
- package/dist/src/schemas/agentModel.cjs +33 -0
- package/dist/src/schemas/agentModel.cjs.map +1 -0
- package/dist/src/schemas/agentModel.d.mts +26 -0
- package/dist/src/schemas/agentModel.d.mts.map +1 -0
- package/dist/src/schemas/agentModel.mjs +32 -0
- package/dist/src/schemas/agentModel.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.d.mts +58 -0
- package/dist/src/schemas/apiContracts.d.mts.map +1 -0
- package/dist/src/schemas/askUser.cjs +42 -0
- package/dist/src/schemas/askUser.cjs.map +1 -0
- package/dist/src/schemas/askUser.d.mts +47 -0
- package/dist/src/schemas/askUser.d.mts.map +1 -0
- package/dist/src/schemas/askUser.mjs +37 -0
- package/dist/src/schemas/askUser.mjs.map +1 -0
- package/dist/src/schemas/backgroundWork.cjs +44 -0
- package/dist/src/schemas/backgroundWork.cjs.map +1 -0
- package/dist/src/schemas/backgroundWork.d.mts +76 -0
- package/dist/src/schemas/backgroundWork.d.mts.map +1 -0
- package/dist/src/schemas/backgroundWork.mjs +38 -0
- package/dist/src/schemas/backgroundWork.mjs.map +1 -0
- package/dist/src/schemas/childProcess.cjs +67 -0
- package/dist/src/schemas/childProcess.cjs.map +1 -0
- package/dist/src/schemas/childProcess.d.mts +30 -0
- package/dist/src/schemas/childProcess.d.mts.map +1 -0
- package/dist/src/schemas/childProcess.mjs +55 -0
- package/dist/src/schemas/childProcess.mjs.map +1 -0
- package/dist/src/schemas/cockpitContainer.cjs +31 -0
- package/dist/src/schemas/cockpitContainer.cjs.map +1 -0
- package/dist/src/schemas/cockpitContainer.d.mts +80 -0
- package/dist/src/schemas/cockpitContainer.d.mts.map +1 -0
- package/dist/src/schemas/cockpitContainer.mjs +30 -0
- package/dist/src/schemas/cockpitContainer.mjs.map +1 -0
- package/dist/src/schemas/contextContributions.cjs +17 -0
- package/dist/src/schemas/contextContributions.cjs.map +1 -0
- package/dist/src/schemas/contextContributions.d.mts +49 -0
- package/dist/src/schemas/contextContributions.d.mts.map +1 -0
- package/dist/src/schemas/contextContributions.mjs +15 -0
- package/dist/src/schemas/contextContributions.mjs.map +1 -0
- package/dist/src/schemas/delegation.cjs +91 -0
- package/dist/src/schemas/delegation.cjs.map +1 -0
- package/dist/src/schemas/delegation.d.mts +95 -0
- package/dist/src/schemas/delegation.d.mts.map +1 -0
- package/dist/src/schemas/delegation.mjs +76 -0
- package/dist/src/schemas/delegation.mjs.map +1 -0
- package/dist/src/schemas/extensionFile.d.mts +116 -0
- package/dist/src/schemas/extensionFile.d.mts.map +1 -0
- package/dist/src/schemas/footer.cjs +48 -0
- package/dist/src/schemas/footer.cjs.map +1 -0
- package/dist/src/schemas/footer.d.mts +48 -0
- package/dist/src/schemas/footer.d.mts.map +1 -0
- package/dist/src/schemas/footer.mjs +45 -0
- package/dist/src/schemas/footer.mjs.map +1 -0
- package/dist/src/schemas/headless.cjs +97 -0
- package/dist/src/schemas/headless.cjs.map +1 -0
- package/dist/src/schemas/headless.d.mts +472 -0
- package/dist/src/schemas/headless.d.mts.map +1 -0
- package/dist/src/schemas/headless.mjs +84 -0
- package/dist/src/schemas/headless.mjs.map +1 -0
- package/dist/src/schemas/help.cjs +281 -0
- package/dist/src/schemas/help.cjs.map +1 -0
- package/dist/src/schemas/help.d.mts +119 -0
- package/dist/src/schemas/help.d.mts.map +1 -0
- package/dist/src/schemas/help.mjs +262 -0
- package/dist/src/schemas/help.mjs.map +1 -0
- package/dist/src/schemas/hubChannel.cjs +20 -0
- package/dist/src/schemas/hubChannel.cjs.map +1 -0
- package/dist/src/schemas/hubChannel.d.mts +271 -0
- package/dist/src/schemas/hubChannel.d.mts.map +1 -0
- package/dist/src/schemas/hubChannel.mjs +19 -0
- package/dist/src/schemas/hubChannel.mjs.map +1 -0
- package/dist/src/schemas/leader.cjs +57 -0
- package/dist/src/schemas/leader.cjs.map +1 -0
- package/dist/src/schemas/leader.d.mts +107 -0
- package/dist/src/schemas/leader.d.mts.map +1 -0
- package/dist/src/schemas/leader.mjs +51 -0
- package/dist/src/schemas/leader.mjs.map +1 -0
- package/dist/src/schemas/mcpBundle.d.mts +13 -0
- package/dist/src/schemas/mcpBundle.d.mts.map +1 -0
- package/dist/src/schemas/mcpFacet.cjs +24 -0
- package/dist/src/schemas/mcpFacet.cjs.map +1 -0
- package/dist/src/schemas/mcpFacet.d.mts +91 -0
- package/dist/src/schemas/mcpFacet.d.mts.map +1 -0
- package/dist/src/schemas/mcpFacet.mjs +21 -0
- package/dist/src/schemas/mcpFacet.mjs.map +1 -0
- package/dist/src/schemas/mcpProjection.cjs +117 -0
- package/dist/src/schemas/mcpProjection.cjs.map +1 -0
- package/dist/src/schemas/mcpProjection.d.mts +124 -0
- package/dist/src/schemas/mcpProjection.d.mts.map +1 -0
- package/dist/src/schemas/mcpProjection.mjs +104 -0
- package/dist/src/schemas/mcpProjection.mjs.map +1 -0
- package/dist/src/schemas/mcpSession.cjs +57 -0
- package/dist/src/schemas/mcpSession.cjs.map +1 -0
- package/dist/src/schemas/mcpSession.d.mts +57 -0
- package/dist/src/schemas/mcpSession.d.mts.map +1 -0
- package/dist/src/schemas/mcpSession.mjs +51 -0
- package/dist/src/schemas/mcpSession.mjs.map +1 -0
- package/dist/src/schemas/mcpStatus.cjs +52 -0
- package/dist/src/schemas/mcpStatus.cjs.map +1 -0
- package/dist/src/schemas/mcpStatus.d.mts +73 -0
- package/dist/src/schemas/mcpStatus.d.mts.map +1 -0
- package/dist/src/schemas/mcpStatus.mjs +48 -0
- package/dist/src/schemas/mcpStatus.mjs.map +1 -0
- package/dist/src/schemas/mcpToolResolver.cjs +17 -0
- package/dist/src/schemas/mcpToolResolver.cjs.map +1 -0
- package/dist/src/schemas/mcpToolResolver.d.mts +24 -0
- package/dist/src/schemas/mcpToolResolver.d.mts.map +1 -0
- package/dist/src/schemas/mcpToolResolver.mjs +15 -0
- package/dist/src/schemas/mcpToolResolver.mjs.map +1 -0
- package/dist/src/schemas/narration.cjs +54 -0
- package/dist/src/schemas/narration.cjs.map +1 -0
- package/dist/src/schemas/narration.d.mts +29 -0
- package/dist/src/schemas/narration.d.mts.map +1 -0
- package/dist/src/schemas/narration.mjs +47 -0
- package/dist/src/schemas/narration.mjs.map +1 -0
- package/dist/src/schemas/notification.cjs +122 -0
- package/dist/src/schemas/notification.cjs.map +1 -0
- package/dist/src/schemas/notification.d.mts +48 -0
- package/dist/src/schemas/notification.d.mts.map +1 -0
- package/dist/src/schemas/notification.mjs +108 -0
- package/dist/src/schemas/notification.mjs.map +1 -0
- package/dist/src/schemas/packageApi.cjs +76 -0
- package/dist/src/schemas/packageApi.cjs.map +1 -0
- package/dist/src/schemas/packageApi.d.mts +302 -0
- package/dist/src/schemas/packageApi.d.mts.map +1 -0
- package/dist/src/schemas/packageApi.mjs +66 -0
- package/dist/src/schemas/packageApi.mjs.map +1 -0
- package/dist/src/schemas/pluginContributions.cjs +19 -0
- package/dist/src/schemas/pluginContributions.cjs.map +1 -0
- package/dist/src/schemas/pluginContributions.d.mts +56 -0
- package/dist/src/schemas/pluginContributions.d.mts.map +1 -0
- package/dist/src/schemas/pluginContributions.mjs +18 -0
- package/dist/src/schemas/pluginContributions.mjs.map +1 -0
- package/dist/src/schemas/pluginProtocol.cjs +103 -0
- package/dist/src/schemas/pluginProtocol.cjs.map +1 -0
- package/dist/src/schemas/pluginProtocol.d.mts +70 -0
- package/dist/src/schemas/pluginProtocol.d.mts.map +1 -0
- package/dist/src/schemas/pluginProtocol.mjs +96 -0
- package/dist/src/schemas/pluginProtocol.mjs.map +1 -0
- package/dist/src/schemas/profileIdentity.cjs +67 -0
- package/dist/src/schemas/profileIdentity.cjs.map +1 -0
- package/dist/src/schemas/profileIdentity.d.mts +50 -0
- package/dist/src/schemas/profileIdentity.d.mts.map +1 -0
- package/dist/src/schemas/profileIdentity.mjs +64 -0
- package/dist/src/schemas/profileIdentity.mjs.map +1 -0
- package/dist/src/schemas/readiness.cjs +251 -0
- package/dist/src/schemas/readiness.cjs.map +1 -0
- package/dist/src/schemas/readiness.d.mts +84 -0
- package/dist/src/schemas/readiness.d.mts.map +1 -0
- package/dist/src/schemas/readiness.mjs +246 -0
- package/dist/src/schemas/readiness.mjs.map +1 -0
- package/dist/src/schemas/sandboxHarness.cjs +29 -0
- package/dist/src/schemas/sandboxHarness.cjs.map +1 -0
- package/dist/src/schemas/sandboxHarness.d.mts +39 -0
- package/dist/src/schemas/sandboxHarness.d.mts.map +1 -0
- package/dist/src/schemas/sandboxHarness.mjs +26 -0
- package/dist/src/schemas/sandboxHarness.mjs.map +1 -0
- package/dist/src/schemas/serverBundle.d.mts +19 -0
- package/dist/src/schemas/serverBundle.d.mts.map +1 -0
- package/dist/src/schemas/serverFacet.cjs +111 -0
- package/dist/src/schemas/serverFacet.cjs.map +1 -0
- package/dist/src/schemas/serverFacet.d.mts +152 -0
- package/dist/src/schemas/serverFacet.d.mts.map +1 -0
- package/dist/src/schemas/serverFacet.mjs +101 -0
- package/dist/src/schemas/serverFacet.mjs.map +1 -0
- package/dist/src/schemas/sessionMcpActivity.d.mts +47 -0
- package/dist/src/schemas/sessionMcpActivity.d.mts.map +1 -0
- package/dist/src/schemas/sessionProtocol.cjs +17 -0
- package/dist/src/schemas/sessionProtocol.cjs.map +1 -0
- package/dist/src/schemas/sessionProtocol.d.mts +313 -0
- package/dist/src/schemas/sessionProtocol.d.mts.map +1 -0
- package/dist/src/schemas/sessionProtocol.mjs +12 -0
- package/dist/src/schemas/sessionProtocol.mjs.map +1 -0
- package/dist/src/schemas/sessionUpdates.d.mts +34 -0
- package/dist/src/schemas/sessionUpdates.d.mts.map +1 -0
- package/dist/src/schemas/skills.cjs +115 -0
- package/dist/src/schemas/skills.cjs.map +1 -0
- package/dist/src/schemas/skills.d.mts +65 -0
- package/dist/src/schemas/skills.d.mts.map +1 -0
- package/dist/src/schemas/skills.mjs +109 -0
- package/dist/src/schemas/skills.mjs.map +1 -0
- package/dist/src/schemas/toolOverrides.cjs +17 -0
- package/dist/src/schemas/toolOverrides.cjs.map +1 -0
- package/dist/src/schemas/toolOverrides.d.mts +29 -0
- package/dist/src/schemas/toolOverrides.d.mts.map +1 -0
- package/dist/src/schemas/toolOverrides.mjs +15 -0
- package/dist/src/schemas/toolOverrides.mjs.map +1 -0
- package/dist/src/schemas/toolSurface.cjs +17 -0
- package/dist/src/schemas/toolSurface.cjs.map +1 -0
- package/dist/src/schemas/toolSurface.d.mts +70 -0
- package/dist/src/schemas/toolSurface.d.mts.map +1 -0
- package/dist/src/schemas/toolSurface.mjs +15 -0
- package/dist/src/schemas/toolSurface.mjs.map +1 -0
- package/dist/src/schemas/uiHub.cjs +17 -0
- package/dist/src/schemas/uiHub.cjs.map +1 -0
- package/dist/src/schemas/uiHub.d.mts +23 -0
- package/dist/src/schemas/uiHub.d.mts.map +1 -0
- package/dist/src/schemas/uiHub.mjs +15 -0
- package/dist/src/schemas/uiHub.mjs.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.cjs +78 -0
- package/dist/src/schemas/voiceReloadHandoff.cjs.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.d.mts +31 -0
- package/dist/src/schemas/voiceReloadHandoff.d.mts.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.mjs +75 -0
- package/dist/src/schemas/voiceReloadHandoff.mjs.map +1 -0
- package/dist/src/schemas/voiceTools.cjs +205 -0
- package/dist/src/schemas/voiceTools.cjs.map +1 -0
- package/dist/src/schemas/voiceTools.d.mts +120 -0
- package/dist/src/schemas/voiceTools.d.mts.map +1 -0
- package/dist/src/schemas/voiceTools.mjs +194 -0
- package/dist/src/schemas/voiceTools.mjs.map +1 -0
- package/dist/src/server/devProxyForward.cjs +141 -0
- package/dist/src/server/devProxyForward.cjs.map +1 -0
- package/dist/src/server/devProxyForward.mjs +139 -0
- package/dist/src/server/devProxyForward.mjs.map +1 -0
- package/dist/src/server/devProxyRoutes.cjs +97 -0
- package/dist/src/server/devProxyRoutes.cjs.map +1 -0
- package/dist/src/server/devProxyRoutes.mjs +97 -0
- package/dist/src/server/devProxyRoutes.mjs.map +1 -0
- package/dist/src/server/devProxySocket.cjs +93 -0
- package/dist/src/server/devProxySocket.cjs.map +1 -0
- package/dist/src/server/devProxySocket.d.mts +25 -0
- package/dist/src/server/devProxySocket.d.mts.map +1 -0
- package/dist/src/server/devProxySocket.mjs +93 -0
- package/dist/src/server/devProxySocket.mjs.map +1 -0
- package/dist/src/server/directHarnessRuntime.cjs +2387 -0
- package/dist/src/server/directHarnessRuntime.cjs.map +1 -0
- package/dist/src/server/directHarnessRuntime.d.mts +4 -0
- package/dist/src/server/directHarnessRuntime.mjs +2384 -0
- package/dist/src/server/directHarnessRuntime.mjs.map +1 -0
- package/dist/src/server/harnessErrorMessage.cjs +13 -0
- package/dist/src/server/harnessErrorMessage.cjs.map +1 -0
- package/dist/src/server/harnessErrorMessage.mjs +13 -0
- package/dist/src/server/harnessErrorMessage.mjs.map +1 -0
- package/dist/src/server/headlessProtocol.cjs +382 -0
- package/dist/src/server/headlessProtocol.cjs.map +1 -0
- package/dist/src/server/headlessProtocol.mjs +382 -0
- package/dist/src/server/headlessProtocol.mjs.map +1 -0
- package/dist/src/server/liveImport.cjs +37 -0
- package/dist/src/server/liveImport.cjs.map +1 -0
- package/dist/src/server/liveImport.d.mts +27 -0
- package/dist/src/server/liveImport.d.mts.map +1 -0
- package/dist/src/server/liveImport.mjs +34 -0
- package/dist/src/server/liveImport.mjs.map +1 -0
- package/dist/src/server/mcpBundleLoader.cjs +108 -0
- package/dist/src/server/mcpBundleLoader.cjs.map +1 -0
- package/dist/src/server/mcpBundleLoader.d.mts +46 -0
- package/dist/src/server/mcpBundleLoader.d.mts.map +1 -0
- package/dist/src/server/mcpBundleLoader.mjs +107 -0
- package/dist/src/server/mcpBundleLoader.mjs.map +1 -0
- package/dist/src/server/nativeChildTranscriptReader.cjs +20 -0
- package/dist/src/server/nativeChildTranscriptReader.cjs.map +1 -0
- package/dist/src/server/nativeChildTranscriptReader.mjs +18 -0
- package/dist/src/server/nativeChildTranscriptReader.mjs.map +1 -0
- package/dist/src/server/remoteRoutes.cjs +463 -0
- package/dist/src/server/remoteRoutes.cjs.map +1 -0
- package/dist/src/server/remoteRoutes.mjs +463 -0
- package/dist/src/server/remoteRoutes.mjs.map +1 -0
- package/dist/src/server/serverFacetLoader.cjs +214 -0
- package/dist/src/server/serverFacetLoader.cjs.map +1 -0
- package/dist/src/server/serverFacetLoader.d.mts +72 -0
- package/dist/src/server/serverFacetLoader.d.mts.map +1 -0
- package/dist/src/server/serverFacetLoader.mjs +212 -0
- package/dist/src/server/serverFacetLoader.mjs.map +1 -0
- package/dist/src/server/sessionMcpHandler.cjs +585 -0
- package/dist/src/server/sessionMcpHandler.cjs.map +1 -0
- package/dist/src/server/sessionMcpHandler.d.mts +50 -0
- package/dist/src/server/sessionMcpHandler.d.mts.map +1 -0
- package/dist/src/server/sessionMcpHandler.mjs +582 -0
- package/dist/src/server/sessionMcpHandler.mjs.map +1 -0
- package/dist/src/server/sessionMcpRoutes.cjs +809 -0
- package/dist/src/server/sessionMcpRoutes.cjs.map +1 -0
- package/dist/src/server/sessionMcpRoutes.mjs +804 -0
- package/dist/src/server/sessionMcpRoutes.mjs.map +1 -0
- package/dist/src/server/threadJournals.cjs +172 -0
- package/dist/src/server/threadJournals.cjs.map +1 -0
- package/dist/src/server/threadJournals.mjs +169 -0
- package/dist/src/server/threadJournals.mjs.map +1 -0
- package/dist/src/services/acpSessionUpdates/index.cjs +129 -0
- package/dist/src/services/acpSessionUpdates/index.cjs.map +1 -0
- package/dist/src/services/acpSessionUpdates/index.mjs +129 -0
- package/dist/src/services/acpSessionUpdates/index.mjs.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.cjs +60 -0
- package/dist/src/services/apiSurfaceAssert/index.cjs.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.d.mts +24 -0
- package/dist/src/services/apiSurfaceAssert/index.d.mts.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.mjs +60 -0
- package/dist/src/services/apiSurfaceAssert/index.mjs.map +1 -0
- package/dist/src/services/bundlePublication/index.cjs +89 -0
- package/dist/src/services/bundlePublication/index.cjs.map +1 -0
- package/dist/src/services/bundlePublication/index.mjs +86 -0
- package/dist/src/services/bundlePublication/index.mjs.map +1 -0
- package/dist/src/services/contextApiUrls/index.cjs +53 -0
- package/dist/src/services/contextApiUrls/index.cjs.map +1 -0
- package/dist/src/services/contextApiUrls/index.d.mts +8 -0
- package/dist/src/services/contextApiUrls/index.d.mts.map +1 -0
- package/dist/src/services/contextApiUrls/index.mjs +52 -0
- package/dist/src/services/contextApiUrls/index.mjs.map +1 -0
- package/dist/src/services/contextContributions/index.cjs +79 -0
- package/dist/src/services/contextContributions/index.cjs.map +1 -0
- package/dist/src/services/contextContributions/index.d.mts +6 -0
- package/dist/src/services/contextContributions/index.d.mts.map +1 -0
- package/dist/src/services/contextContributions/index.mjs +79 -0
- package/dist/src/services/contextContributions/index.mjs.map +1 -0
- package/dist/src/services/contextUsage/index.cjs +27 -0
- package/dist/src/services/contextUsage/index.cjs.map +1 -0
- package/dist/src/services/contextUsage/index.mjs +25 -0
- package/dist/src/services/contextUsage/index.mjs.map +1 -0
- package/dist/src/services/devProxyPolicy/index.cjs +168 -0
- package/dist/src/services/devProxyPolicy/index.cjs.map +1 -0
- package/dist/src/services/devProxyPolicy/index.mjs +165 -0
- package/dist/src/services/devProxyPolicy/index.mjs.map +1 -0
- package/dist/src/services/devProxyStore/index.cjs +107 -0
- package/dist/src/services/devProxyStore/index.cjs.map +1 -0
- package/dist/src/services/devProxyStore/index.mjs +104 -0
- package/dist/src/services/devProxyStore/index.mjs.map +1 -0
- package/dist/src/services/deviceAuth/index.cjs +146 -0
- package/dist/src/services/deviceAuth/index.cjs.map +1 -0
- package/dist/src/services/deviceAuth/index.d.mts +9 -0
- package/dist/src/services/deviceAuth/index.d.mts.map +1 -0
- package/dist/src/services/deviceAuth/index.mjs +146 -0
- package/dist/src/services/deviceAuth/index.mjs.map +1 -0
- package/dist/src/services/deviceSessions/index.cjs +147 -0
- package/dist/src/services/deviceSessions/index.cjs.map +1 -0
- package/dist/src/services/deviceSessions/index.d.mts +18 -0
- package/dist/src/services/deviceSessions/index.d.mts.map +1 -0
- package/dist/src/services/deviceSessions/index.mjs +141 -0
- package/dist/src/services/deviceSessions/index.mjs.map +1 -0
- package/dist/src/services/deviceTrust/index.cjs +294 -0
- package/dist/src/services/deviceTrust/index.cjs.map +1 -0
- package/dist/src/services/deviceTrust/index.mjs +282 -0
- package/dist/src/services/deviceTrust/index.mjs.map +1 -0
- package/dist/src/services/durableNavigation/index.cjs +46 -0
- package/dist/src/services/durableNavigation/index.cjs.map +1 -0
- package/dist/src/services/durableNavigation/index.mjs +45 -0
- package/dist/src/services/durableNavigation/index.mjs.map +1 -0
- package/dist/src/services/headlessClient/index.cjs +126 -0
- package/dist/src/services/headlessClient/index.cjs.map +1 -0
- package/dist/src/services/headlessClient/index.mjs +126 -0
- package/dist/src/services/headlessClient/index.mjs.map +1 -0
- package/dist/src/services/historyImport/index.cjs +8 -0
- package/dist/src/services/historyImport/index.cjs.map +1 -0
- package/dist/src/services/historyImport/index.d.mts +68 -0
- package/dist/src/services/historyImport/index.d.mts.map +1 -0
- package/dist/src/services/historyImport/index.mjs +8 -0
- package/dist/src/services/historyImport/index.mjs.map +1 -0
- package/dist/src/services/hubChannelHarness/index.cjs +50 -0
- package/dist/src/services/hubChannelHarness/index.cjs.map +1 -0
- package/dist/src/services/hubChannelHarness/index.d.mts +17 -0
- package/dist/src/services/hubChannelHarness/index.d.mts.map +1 -0
- package/dist/src/services/hubChannelHarness/index.mjs +50 -0
- package/dist/src/services/hubChannelHarness/index.mjs.map +1 -0
- package/dist/src/services/kernel/index.cjs +147 -0
- package/dist/src/services/kernel/index.cjs.map +1 -0
- package/dist/src/services/kernel/index.d.mts +9 -0
- package/dist/src/services/kernel/index.d.mts.map +1 -0
- package/dist/src/services/kernel/index.mjs +147 -0
- package/dist/src/services/kernel/index.mjs.map +1 -0
- package/dist/src/services/loginFlow/index.cjs +131 -0
- package/dist/src/services/loginFlow/index.cjs.map +1 -0
- package/dist/src/services/loginFlow/index.mjs +131 -0
- package/dist/src/services/loginFlow/index.mjs.map +1 -0
- package/dist/src/services/loopbackAddress/index.cjs +58 -0
- package/dist/src/services/loopbackAddress/index.cjs.map +1 -0
- package/dist/src/services/loopbackAddress/index.mjs +56 -0
- package/dist/src/services/loopbackAddress/index.mjs.map +1 -0
- package/dist/src/services/openSessionRegistry/index.cjs +134 -0
- package/dist/src/services/openSessionRegistry/index.cjs.map +1 -0
- package/dist/src/services/openSessionRegistry/index.d.mts +36 -0
- package/dist/src/services/openSessionRegistry/index.d.mts.map +1 -0
- package/dist/src/services/openSessionRegistry/index.mjs +131 -0
- package/dist/src/services/openSessionRegistry/index.mjs.map +1 -0
- package/dist/src/services/packageApiHarness/index.cjs +36 -0
- package/dist/src/services/packageApiHarness/index.cjs.map +1 -0
- package/dist/src/services/packageApiHarness/index.d.mts +40 -0
- package/dist/src/services/packageApiHarness/index.d.mts.map +1 -0
- package/dist/src/services/packageApiHarness/index.mjs +36 -0
- package/dist/src/services/packageApiHarness/index.mjs.map +1 -0
- package/dist/src/services/packageResource/index.cjs +54 -0
- package/dist/src/services/packageResource/index.cjs.map +1 -0
- package/dist/src/services/packageResource/index.d.mts +26 -0
- package/dist/src/services/packageResource/index.d.mts.map +1 -0
- package/dist/src/services/packageResource/index.mjs +51 -0
- package/dist/src/services/packageResource/index.mjs.map +1 -0
- package/dist/src/services/pairingFlow/index.cjs +145 -0
- package/dist/src/services/pairingFlow/index.cjs.map +1 -0
- package/dist/src/services/pairingFlow/index.d.mts +44 -0
- package/dist/src/services/pairingFlow/index.d.mts.map +1 -0
- package/dist/src/services/pairingFlow/index.mjs +145 -0
- package/dist/src/services/pairingFlow/index.mjs.map +1 -0
- package/dist/src/services/pairingPage/index.cjs +450 -0
- package/dist/src/services/pairingPage/index.cjs.map +1 -0
- package/dist/src/services/pairingPage/index.mjs +447 -0
- package/dist/src/services/pairingPage/index.mjs.map +1 -0
- package/dist/src/services/piExtensionHost/index.cjs +889 -0
- package/dist/src/services/piExtensionHost/index.cjs.map +1 -0
- package/dist/src/services/piExtensionHost/index.mjs +885 -0
- package/dist/src/services/piExtensionHost/index.mjs.map +1 -0
- package/dist/src/services/piHelpTools/index.cjs +68 -0
- package/dist/src/services/piHelpTools/index.cjs.map +1 -0
- package/dist/src/services/piHelpTools/index.d.mts +10 -0
- package/dist/src/services/piHelpTools/index.d.mts.map +1 -0
- package/dist/src/services/piHelpTools/index.mjs +68 -0
- package/dist/src/services/piHelpTools/index.mjs.map +1 -0
- package/dist/src/services/piSessionEntries/index.cjs +121 -0
- package/dist/src/services/piSessionEntries/index.cjs.map +1 -0
- package/dist/src/services/piSessionEntries/index.mjs +117 -0
- package/dist/src/services/piSessionEntries/index.mjs.map +1 -0
- package/dist/src/services/pluginLifecycle/index.cjs +71 -0
- package/dist/src/services/pluginLifecycle/index.cjs.map +1 -0
- package/dist/src/services/pluginLifecycle/index.d.mts +8 -0
- package/dist/src/services/pluginLifecycle/index.d.mts.map +1 -0
- package/dist/src/services/pluginLifecycle/index.mjs +71 -0
- package/dist/src/services/pluginLifecycle/index.mjs.map +1 -0
- package/dist/src/services/providerAuth/index.cjs +156 -0
- package/dist/src/services/providerAuth/index.cjs.map +1 -0
- package/dist/src/services/providerAuth/index.mjs +154 -0
- package/dist/src/services/providerAuth/index.mjs.map +1 -0
- package/dist/src/services/publicFileShares/index.cjs +192 -0
- package/dist/src/services/publicFileShares/index.cjs.map +1 -0
- package/dist/src/services/publicFileShares/index.d.mts +16 -0
- package/dist/src/services/publicFileShares/index.d.mts.map +1 -0
- package/dist/src/services/publicFileShares/index.mjs +188 -0
- package/dist/src/services/publicFileShares/index.mjs.map +1 -0
- package/dist/src/services/remoteAccess/index.cjs +567 -0
- package/dist/src/services/remoteAccess/index.cjs.map +1 -0
- package/dist/src/services/remoteAccess/index.d.mts +121 -0
- package/dist/src/services/remoteAccess/index.d.mts.map +1 -0
- package/dist/src/services/remoteAccess/index.mjs +567 -0
- package/dist/src/services/remoteAccess/index.mjs.map +1 -0
- package/dist/src/services/remoteAccessSettings/index.cjs +151 -0
- package/dist/src/services/remoteAccessSettings/index.cjs.map +1 -0
- package/dist/src/services/remoteAccessSettings/index.mjs +149 -0
- package/dist/src/services/remoteAccessSettings/index.mjs.map +1 -0
- package/dist/src/services/remoteAccessStore/index.cjs +197 -0
- package/dist/src/services/remoteAccessStore/index.cjs.map +1 -0
- package/dist/src/services/remoteAccessStore/index.mjs +192 -0
- package/dist/src/services/remoteAccessStore/index.mjs.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.cjs +200 -0
- package/dist/src/services/remoteGuardPolicy/index.cjs.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.d.mts +7 -0
- package/dist/src/services/remoteGuardPolicy/index.d.mts.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.mjs +196 -0
- package/dist/src/services/remoteGuardPolicy/index.mjs.map +1 -0
- package/dist/src/services/requestReceipts/index.cjs +167 -0
- package/dist/src/services/requestReceipts/index.cjs.map +1 -0
- package/dist/src/services/requestReceipts/index.d.mts +11 -0
- package/dist/src/services/requestReceipts/index.d.mts.map +1 -0
- package/dist/src/services/requestReceipts/index.mjs +167 -0
- package/dist/src/services/requestReceipts/index.mjs.map +1 -0
- package/dist/src/services/rpcTranscript/index.cjs +633 -0
- package/dist/src/services/rpcTranscript/index.cjs.map +1 -0
- package/dist/src/services/rpcTranscript/index.d.mts +50 -0
- package/dist/src/services/rpcTranscript/index.d.mts.map +1 -0
- package/dist/src/services/rpcTranscript/index.mjs +632 -0
- package/dist/src/services/rpcTranscript/index.mjs.map +1 -0
- package/dist/src/services/serverFacet/index.cjs +197 -0
- package/dist/src/services/serverFacet/index.cjs.map +1 -0
- package/dist/src/services/serverFacet/index.d.mts +31 -0
- package/dist/src/services/serverFacet/index.d.mts.map +1 -0
- package/dist/src/services/serverFacet/index.mjs +197 -0
- package/dist/src/services/serverFacet/index.mjs.map +1 -0
- package/dist/src/services/sessionAttachments/index.cjs +111 -0
- package/dist/src/services/sessionAttachments/index.cjs.map +1 -0
- package/dist/src/services/sessionAttachments/index.d.mts +11 -0
- package/dist/src/services/sessionAttachments/index.d.mts.map +1 -0
- package/dist/src/services/sessionAttachments/index.mjs +107 -0
- package/dist/src/services/sessionAttachments/index.mjs.map +1 -0
- package/dist/src/services/sessionGitStatus/index.cjs +46 -0
- package/dist/src/services/sessionGitStatus/index.cjs.map +1 -0
- package/dist/src/services/sessionGitStatus/index.mjs +46 -0
- package/dist/src/services/sessionGitStatus/index.mjs.map +1 -0
- package/dist/src/services/sessionGitStatus/type.d.mts +8 -0
- package/dist/src/services/sessionGitStatus/type.d.mts.map +1 -0
- package/dist/src/services/sessionMcpActivity/index.cjs +115 -0
- package/dist/src/services/sessionMcpActivity/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpActivity/index.mjs +111 -0
- package/dist/src/services/sessionMcpActivity/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.cjs +473 -0
- package/dist/src/services/sessionMcpAuthorization/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.d.mts +125 -0
- package/dist/src/services/sessionMcpAuthorization/index.d.mts.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.mjs +469 -0
- package/dist/src/services/sessionMcpAuthorization/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpConversations/index.cjs +217 -0
- package/dist/src/services/sessionMcpConversations/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpConversations/index.mjs +212 -0
- package/dist/src/services/sessionMcpConversations/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.cjs +86 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.mjs +83 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.mjs.map +1 -0
- package/dist/src/services/sessionPresentation/index.cjs +120 -0
- package/dist/src/services/sessionPresentation/index.cjs.map +1 -0
- package/dist/src/services/sessionPresentation/index.mjs +120 -0
- package/dist/src/services/sessionPresentation/index.mjs.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.cjs +97 -0
- package/dist/src/services/sqliteSessionHistory/index.cjs.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.d.mts +28 -0
- package/dist/src/services/sqliteSessionHistory/index.d.mts.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.mjs +92 -0
- package/dist/src/services/sqliteSessionHistory/index.mjs.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.cjs +67 -0
- package/dist/src/services/sqliteTranscriptReader/index.cjs.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.d.mts +14 -0
- package/dist/src/services/sqliteTranscriptReader/index.d.mts.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.mjs +65 -0
- package/dist/src/services/sqliteTranscriptReader/index.mjs.map +1 -0
- package/dist/src/services/toolCost/index.cjs +47 -0
- package/dist/src/services/toolCost/index.cjs.map +1 -0
- package/dist/src/services/toolCost/index.d.mts +38 -0
- package/dist/src/services/toolCost/index.d.mts.map +1 -0
- package/dist/src/services/toolCost/index.mjs +46 -0
- package/dist/src/services/toolCost/index.mjs.map +1 -0
- package/dist/src/services/toolOverrides/index.cjs +45 -0
- package/dist/src/services/toolOverrides/index.cjs.map +1 -0
- package/dist/src/services/toolOverrides/index.d.mts +6 -0
- package/dist/src/services/toolOverrides/index.d.mts.map +1 -0
- package/dist/src/services/toolOverrides/index.mjs +45 -0
- package/dist/src/services/toolOverrides/index.mjs.map +1 -0
- package/dist/src/services/toolPrompt/index.cjs +13 -0
- package/dist/src/services/toolPrompt/index.cjs.map +1 -0
- package/dist/src/services/toolPrompt/index.mjs +13 -0
- package/dist/src/services/toolPrompt/index.mjs.map +1 -0
- package/dist/src/services/toolSurface/index.cjs +134 -0
- package/dist/src/services/toolSurface/index.cjs.map +1 -0
- package/dist/src/services/toolSurface/index.d.mts +19 -0
- package/dist/src/services/toolSurface/index.d.mts.map +1 -0
- package/dist/src/services/toolSurface/index.mjs +134 -0
- package/dist/src/services/toolSurface/index.mjs.map +1 -0
- package/dist/src/services/traceContext/index.cjs +13 -0
- package/dist/src/services/traceContext/index.cjs.map +1 -0
- package/dist/src/services/traceContext/index.mjs +13 -0
- package/dist/src/services/traceContext/index.mjs.map +1 -0
- package/dist/src/services/transcriptPages/index.cjs +117 -0
- package/dist/src/services/transcriptPages/index.cjs.map +1 -0
- package/dist/src/services/transcriptPages/index.mjs +115 -0
- package/dist/src/services/transcriptPages/index.mjs.map +1 -0
- package/dist/src/services/tunnelOutput/index.cjs +58 -0
- package/dist/src/services/tunnelOutput/index.cjs.map +1 -0
- package/dist/src/services/tunnelOutput/index.mjs +54 -0
- package/dist/src/services/tunnelOutput/index.mjs.map +1 -0
- package/dist/src/services/tunnelProcess/index.cjs +487 -0
- package/dist/src/services/tunnelProcess/index.cjs.map +1 -0
- package/dist/src/services/tunnelProcess/index.mjs +481 -0
- package/dist/src/services/tunnelProcess/index.mjs.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.cjs +136 -0
- package/dist/src/services/voiceReloadHandoff/index.cjs.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.d.mts +34 -0
- package/dist/src/services/voiceReloadHandoff/index.d.mts.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.mjs +135 -0
- package/dist/src/services/voiceReloadHandoff/index.mjs.map +1 -0
- package/dist/src/services/voiceToolsContract/index.cjs +26 -0
- package/dist/src/services/voiceToolsContract/index.cjs.map +1 -0
- package/dist/src/services/voiceToolsContract/index.d.mts +76 -0
- package/dist/src/services/voiceToolsContract/index.d.mts.map +1 -0
- package/dist/src/services/voiceToolsContract/index.mjs +24 -0
- package/dist/src/services/voiceToolsContract/index.mjs.map +1 -0
- package/dist/src/services/webauthn/index.cjs +262 -0
- package/dist/src/services/webauthn/index.cjs.map +1 -0
- package/dist/src/services/webauthn/index.d.mts +39 -0
- package/dist/src/services/webauthn/index.d.mts.map +1 -0
- package/dist/src/services/webauthn/index.mjs +262 -0
- package/dist/src/services/webauthn/index.mjs.map +1 -0
- package/dist/src/services/webauthnPolicy/index.cjs +174 -0
- package/dist/src/services/webauthnPolicy/index.cjs.map +1 -0
- package/dist/src/services/webauthnPolicy/index.d.mts +41 -0
- package/dist/src/services/webauthnPolicy/index.d.mts.map +1 -0
- package/dist/src/services/webauthnPolicy/index.mjs +167 -0
- package/dist/src/services/webauthnPolicy/index.mjs.map +1 -0
- package/dist/src/services/workspaceRegistry/index.cjs +187 -0
- package/dist/src/services/workspaceRegistry/index.cjs.map +1 -0
- package/dist/src/services/workspaceRegistry/index.d.mts +47 -0
- package/dist/src/services/workspaceRegistry/index.d.mts.map +1 -0
- package/dist/src/services/workspaceRegistry/index.mjs +179 -0
- package/dist/src/services/workspaceRegistry/index.mjs.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs +466 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts +36 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs +457 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs.map +1 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs +28 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs.map +1 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs +25 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs.map +1 -0
- package/dist/src/systems/child/services/childSession/index.cjs +219 -0
- package/dist/src/systems/child/services/childSession/index.cjs.map +1 -0
- package/dist/src/systems/child/services/childSession/index.d.mts +14 -0
- package/dist/src/systems/child/services/childSession/index.d.mts.map +1 -0
- package/dist/src/systems/child/services/childSession/index.mjs +219 -0
- package/dist/src/systems/child/services/childSession/index.mjs.map +1 -0
- package/dist/src/systems/child/types/childSession.cjs +21 -0
- package/dist/src/systems/child/types/childSession.cjs.map +1 -0
- package/dist/src/systems/child/types/childSession.d.mts +182 -0
- package/dist/src/systems/child/types/childSession.d.mts.map +1 -0
- package/dist/src/systems/child/types/childSession.mjs +17 -0
- package/dist/src/systems/child/types/childSession.mjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.cjs +597 -0
- package/dist/src/systems/main/adapters/headlessHost.cjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.d.mts +116 -0
- package/dist/src/systems/main/adapters/headlessHost.d.mts.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.mjs +595 -0
- package/dist/src/systems/main/adapters/headlessHost.mjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs +1668 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts +20 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs +1663 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -0
- package/dist/src/systems/main/types/headlessHost.d.mts +37 -0
- package/dist/src/systems/main/types/headlessHost.d.mts.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.cjs +73 -0
- package/dist/src/testing/pi/extensionScenarios.cjs.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.d.mts +41 -0
- package/dist/src/testing/pi/extensionScenarios.d.mts.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.mjs +73 -0
- package/dist/src/testing/pi/extensionScenarios.mjs.map +1 -0
- package/dist/src/testing/pi/testHost.cjs +399 -0
- package/dist/src/testing/pi/testHost.cjs.map +1 -0
- package/dist/src/testing/pi/testHost.d.mts +160 -0
- package/dist/src/testing/pi/testHost.d.mts.map +1 -0
- package/dist/src/testing/pi/testHost.mjs +399 -0
- package/dist/src/testing/pi/testHost.mjs.map +1 -0
- package/dist/src/types/config.d.mts +20 -0
- package/dist/src/types/config.d.mts.map +1 -0
- package/dist/src/types/kernel.d.mts +69 -0
- package/dist/src/types/kernel.d.mts.map +1 -0
- package/dist/src/types/remote.d.mts +152 -0
- package/dist/src/types/remote.d.mts.map +1 -0
- package/dist/src/types/server/directHarnessRuntime.d.mts +526 -0
- package/dist/src/types/server/directHarnessRuntime.d.mts.map +1 -0
- package/dist/src/types/server/session.d.mts +5 -0
- package/dist/src/types/server/session.d.mts.map +1 -0
- package/dist/src/types/server/sessionToolSurface.d.mts +44 -0
- package/dist/src/types/server/sessionToolSurface.d.mts.map +1 -0
- package/dist/src/web/models/globalStore.cjs +23 -0
- package/dist/src/web/models/globalStore.cjs.map +1 -0
- package/dist/src/web/models/globalStore.d.mts +6 -0
- package/dist/src/web/models/globalStore.d.mts.map +1 -0
- package/dist/src/web/models/globalStore.mjs +23 -0
- package/dist/src/web/models/globalStore.mjs.map +1 -0
- package/dist/src/web/models/sessionStore.cjs +56 -0
- package/dist/src/web/models/sessionStore.cjs.map +1 -0
- package/dist/src/web/models/sessionStore.d.mts +14 -0
- package/dist/src/web/models/sessionStore.d.mts.map +1 -0
- package/dist/src/web/models/sessionStore.mjs +56 -0
- package/dist/src/web/models/sessionStore.mjs.map +1 -0
- package/dist/src/web/models/workspaceStore.cjs +50 -0
- package/dist/src/web/models/workspaceStore.cjs.map +1 -0
- package/dist/src/web/models/workspaceStore.d.mts +18 -0
- package/dist/src/web/models/workspaceStore.d.mts.map +1 -0
- package/dist/src/web/models/workspaceStore.mjs +50 -0
- package/dist/src/web/models/workspaceStore.mjs.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.cjs +20 -0
- package/dist/src/web/schemas/bundleAssetPolicy.cjs.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.d.mts +10 -0
- package/dist/src/web/schemas/bundleAssetPolicy.d.mts.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.mjs +18 -0
- package/dist/src/web/schemas/bundleAssetPolicy.mjs.map +1 -0
- package/dist/src/web/schemas/template.cjs +35 -0
- package/dist/src/web/schemas/template.cjs.map +1 -0
- package/dist/src/web/schemas/template.d.mts +9 -0
- package/dist/src/web/schemas/template.d.mts.map +1 -0
- package/dist/src/web/schemas/template.mjs +34 -0
- package/dist/src/web/schemas/template.mjs.map +1 -0
- package/dist/src/web/services/apiClient/index.cjs +156 -0
- package/dist/src/web/services/apiClient/index.cjs.map +1 -0
- package/dist/src/web/services/apiClient/index.d.mts +152 -0
- package/dist/src/web/services/apiClient/index.d.mts.map +1 -0
- package/dist/src/web/services/apiClient/index.mjs +154 -0
- package/dist/src/web/services/apiClient/index.mjs.map +1 -0
- package/dist/src/web/services/apiPaths/index.cjs +83 -0
- package/dist/src/web/services/apiPaths/index.cjs.map +1 -0
- package/dist/src/web/services/apiPaths/index.d.mts +81 -0
- package/dist/src/web/services/apiPaths/index.d.mts.map +1 -0
- package/dist/src/web/services/apiPaths/index.mjs +78 -0
- package/dist/src/web/services/apiPaths/index.mjs.map +1 -0
- package/dist/src/web/services/apiRoutes/index.cjs +47 -0
- package/dist/src/web/services/apiRoutes/index.cjs.map +1 -0
- package/dist/src/web/services/apiRoutes/index.d.mts +21 -0
- package/dist/src/web/services/apiRoutes/index.d.mts.map +1 -0
- package/dist/src/web/services/apiRoutes/index.mjs +43 -0
- package/dist/src/web/services/apiRoutes/index.mjs.map +1 -0
- package/dist/src/web/services/mcpWidget.cjs +9 -0
- package/dist/src/web/services/mcpWidget.cjs.map +1 -0
- package/dist/src/web/services/mcpWidget.d.mts +6 -0
- package/dist/src/web/services/mcpWidget.d.mts.map +1 -0
- package/dist/src/web/services/mcpWidget.mjs +9 -0
- package/dist/src/web/services/mcpWidget.mjs.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.cjs +70 -0
- package/dist/src/web/services/sessionRegistry/index.cjs.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.d.mts +29 -0
- package/dist/src/web/services/sessionRegistry/index.d.mts.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.mjs +66 -0
- package/dist/src/web/services/sessionRegistry/index.mjs.map +1 -0
- package/dist/src/web/services/testing/channels.cjs +11 -0
- package/dist/src/web/services/testing/channels.cjs.map +1 -0
- package/dist/src/web/services/testing/channels.d.mts +8 -0
- package/dist/src/web/services/testing/channels.d.mts.map +1 -0
- package/dist/src/web/services/testing/channels.mjs +11 -0
- package/dist/src/web/services/testing/channels.mjs.map +1 -0
- package/dist/src/web/services/testing/index.cjs +27 -0
- package/dist/src/web/services/testing/index.cjs.map +1 -0
- package/dist/src/web/services/testing/index.d.mts +31 -0
- package/dist/src/web/services/testing/index.d.mts.map +1 -0
- package/dist/src/web/services/testing/index.mjs +27 -0
- package/dist/src/web/services/testing/index.mjs.map +1 -0
- package/dist/src/web/services/testing/rpcStub.cjs +58 -0
- package/dist/src/web/services/testing/rpcStub.cjs.map +1 -0
- package/dist/src/web/services/testing/rpcStub.d.mts +37 -0
- package/dist/src/web/services/testing/rpcStub.d.mts.map +1 -0
- package/dist/src/web/services/testing/rpcStub.mjs +58 -0
- package/dist/src/web/services/testing/rpcStub.mjs.map +1 -0
- package/dist/src/web/services/testing/slotProps.cjs +97 -0
- package/dist/src/web/services/testing/slotProps.cjs.map +1 -0
- package/dist/src/web/services/testing/slotProps.d.mts +69 -0
- package/dist/src/web/services/testing/slotProps.d.mts.map +1 -0
- package/dist/src/web/services/testing/slotProps.mjs +96 -0
- package/dist/src/web/services/testing/slotProps.mjs.map +1 -0
- package/dist/src/web/services/testing/templateRail.cjs +156 -0
- package/dist/src/web/services/testing/templateRail.cjs.map +1 -0
- package/dist/src/web/services/testing/templateRail.d.mts +32 -0
- package/dist/src/web/services/testing/templateRail.d.mts.map +1 -0
- package/dist/src/web/services/testing/templateRail.mjs +154 -0
- package/dist/src/web/services/testing/templateRail.mjs.map +1 -0
- package/dist/src/web/services/toolResult/index.cjs +30 -0
- package/dist/src/web/services/toolResult/index.cjs.map +1 -0
- package/dist/src/web/services/toolResult/index.d.mts +14 -0
- package/dist/src/web/services/toolResult/index.d.mts.map +1 -0
- package/dist/src/web/services/toolResult/index.mjs +29 -0
- package/dist/src/web/services/toolResult/index.mjs.map +1 -0
- package/dist/src/web/types/extensionFile.d.mts +62 -0
- package/dist/src/web/types/extensionFile.d.mts.map +1 -0
- package/dist/src/web/types/mcpWidget.d.mts +14 -0
- package/dist/src/web/types/mcpWidget.d.mts.map +1 -0
- package/dist/src/web/types/modelContext.d.mts +43 -0
- package/dist/src/web/types/modelContext.d.mts.map +1 -0
- package/dist/src/web/types/nativeTemplate.d.mts +29 -0
- package/dist/src/web/types/nativeTemplate.d.mts.map +1 -0
- package/dist/src/web/types/sessionRegistry.d.mts +46 -0
- package/dist/src/web/types/sessionRegistry.d.mts.map +1 -0
- package/dist/src/web/types/template.d.mts +135 -0
- package/dist/src/web/types/template.d.mts.map +1 -0
- package/dist/src/web/types/webPlugin.d.mts +915 -0
- package/dist/src/web/types/webPlugin.d.mts.map +1 -0
- package/dist/terminalPiChildSessionService.cjs +324 -0
- package/dist/terminalPiChildSessionService.cjs.map +1 -0
- package/dist/terminalPiChildSessionService.d.mts +46 -0
- package/dist/terminalPiChildSessionService.d.mts.map +1 -0
- package/dist/terminalPiChildSessionService.mjs +318 -0
- package/dist/terminalPiChildSessionService.mjs.map +1 -0
- package/dist/testing.cjs +11 -0
- package/dist/testing.d.mts +6 -0
- package/dist/testing.mjs +6 -0
- package/dist/toolInventory.cjs +136 -0
- package/dist/toolInventory.cjs.map +1 -0
- package/dist/toolInventory.d.mts +66 -0
- package/dist/toolInventory.d.mts.map +1 -0
- package/dist/toolInventory.mjs +133 -0
- package/dist/toolInventory.mjs.map +1 -0
- package/dist/toolNames.cjs +4 -0
- package/dist/toolNames.d.mts +2 -0
- package/dist/toolNames.mjs +2 -0
- package/dist/toolOverrides.cjs +7 -0
- package/dist/toolOverrides.d.mts +3 -0
- package/dist/toolOverrides.mjs +3 -0
- package/dist/toolSurface.cjs +7 -0
- package/dist/toolSurface.d.mts +3 -0
- package/dist/toolSurface.mjs +3 -0
- package/dist/transition.cjs +5 -0
- package/dist/transition.d.cjs +5 -0
- package/dist/transition.d.mts +2 -0
- package/dist/transition.mjs +2 -0
- package/dist/transitionClassifier.cjs +112 -0
- package/dist/transitionClassifier.cjs.map +1 -0
- package/dist/transitionClassifier.d.mts +18 -0
- package/dist/transitionClassifier.d.mts.map +1 -0
- package/dist/transitionClassifier.mjs +111 -0
- package/dist/transitionClassifier.mjs.map +1 -0
- package/dist/transitionCoordinator.cjs +131 -0
- package/dist/transitionCoordinator.cjs.map +1 -0
- package/dist/transitionCoordinator.d.mts +16 -0
- package/dist/transitionCoordinator.d.mts.map +1 -0
- package/dist/transitionCoordinator.mjs +130 -0
- package/dist/transitionCoordinator.mjs.map +1 -0
- package/dist/typesContextApi.cjs +0 -0
- package/dist/typesContextApi.d.mts +79 -0
- package/dist/typesContextApi.d.mts.map +1 -0
- package/dist/typesContextApi.mjs +1 -0
- package/dist/uiHub.cjs +5 -0
- package/dist/uiHub.d.mts +2 -0
- package/dist/uiHub.mjs +2 -0
- package/dist/v3Export.cjs +10 -0
- package/dist/v3Export.cjs.map +1 -0
- package/dist/v3Export.d.mts +35 -0
- package/dist/v3Export.d.mts.map +1 -0
- package/dist/v3Export.mjs +9 -0
- package/dist/v3Export.mjs.map +1 -0
- package/dist/voiceReloadHandoff.cjs +14 -0
- package/dist/voiceReloadHandoff.d.mts +4 -0
- package/dist/voiceReloadHandoff.mjs +4 -0
- package/dist/voiceTools.cjs +56 -0
- package/dist/voiceTools.d.mts +4 -0
- package/dist/voiceTools.mjs +4 -0
- package/dist/web.cjs +65 -0
- package/dist/web.d.mts +20 -0
- package/dist/web.mjs +13 -0
- package/dist/webCompositions.cjs +181 -0
- package/dist/webCompositions.cjs.map +1 -0
- package/dist/webCompositions.d.mts +79 -0
- package/dist/webCompositions.d.mts.map +1 -0
- package/dist/webCompositions.mjs +174 -0
- package/dist/webCompositions.mjs.map +1 -0
- package/dist/webTesting.cjs +14 -0
- package/dist/webTesting.d.mts +6 -0
- package/dist/webTesting.mjs +6 -0
- package/package.json +586 -0
|
@@ -0,0 +1,2384 @@
|
|
|
1
|
+
import { DoomHeadlessToolBusyError } from "../schemas/headless.mjs";
|
|
2
|
+
import { SessionIdentityDoc, SessionMetadataDoc, openSqliteSessionStorage } from "../../sqliteSessionStorage.mjs";
|
|
3
|
+
import { initializeDurableNavigation, navigateDurableConversation } from "../services/durableNavigation/index.mjs";
|
|
4
|
+
import { projectDurableEntries } from "../services/transcriptPages/index.mjs";
|
|
5
|
+
import { contextTokensOf, contextUsageOf, latestAssistantUsage } from "../services/contextUsage/index.mjs";
|
|
6
|
+
import { formatSkillsForSystemPrompt } from "../services/piExtensionHost/index.mjs";
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
import { AgentDoc, CompactionTask, GenerationTask, Harness, InboxDoc, LiveDoc, ToolTask, UsageDoc, UserEntry, createRegistry, defineDoc, hook, watchEvents } from "@earendil-works/pi-durable";
|
|
9
|
+
import { BACKGROUND_CONTEXT, awaitWithContext, withAbortSignal } from "@earendil-works/chord/context";
|
|
10
|
+
import { isDeepStrictEqual } from "node:util";
|
|
11
|
+
import { convertToLlm } from "@earendil-works/pi-coding-agent";
|
|
12
|
+
import { createAssistantMessageEventStream, createModels, getSupportedThinkingLevels } from "@earendil-works/pi-ai";
|
|
13
|
+
import { getCurrentSystemPrompt, getCurrentTools } from "@earendil-works/pi-ai/utils/transcript";
|
|
14
|
+
import { NodeExecutionEnv } from "@earendil-works/pi-durable/env/node";
|
|
15
|
+
//#region src/server/directHarnessRuntime.ts
|
|
16
|
+
const AGENT_SETTLED_ENTRY_TYPE = "po.agent-settled";
|
|
17
|
+
const LifecycleDoc = defineDoc({
|
|
18
|
+
kind: "po.server.lifecycle",
|
|
19
|
+
version: 1,
|
|
20
|
+
scope: "session",
|
|
21
|
+
initial: () => ({ json: "{\"revision\":0,\"paused\":false,\"queue\":[]}" })
|
|
22
|
+
});
|
|
23
|
+
const FastModeDoc = defineDoc({
|
|
24
|
+
kind: "po.fast-mode",
|
|
25
|
+
version: 1,
|
|
26
|
+
scope: "session",
|
|
27
|
+
initial: () => ({ enabled: false })
|
|
28
|
+
});
|
|
29
|
+
const AgentLockDoc = defineDoc({
|
|
30
|
+
kind: "po.agent-lock",
|
|
31
|
+
version: 1,
|
|
32
|
+
scope: "session",
|
|
33
|
+
initial: () => ({ locked: false })
|
|
34
|
+
});
|
|
35
|
+
const AGENT_LOCKED_ERROR = "The local agent is locked. Unlock it to start a turn.";
|
|
36
|
+
const CODEX_API = "openai-codex-responses";
|
|
37
|
+
const CODEX_PROVIDER = "openai-codex";
|
|
38
|
+
const LabelsDoc = defineDoc({
|
|
39
|
+
kind: "po.labels",
|
|
40
|
+
version: 1,
|
|
41
|
+
scope: "session",
|
|
42
|
+
initial: () => ({ labels: {} })
|
|
43
|
+
});
|
|
44
|
+
function nativeId(id) {
|
|
45
|
+
const value = Number(id);
|
|
46
|
+
if (!Number.isSafeInteger(value) || value < 0 || String(value) !== id) throw new Error(`Invalid durable identifier: ${id}`);
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function json(value) {
|
|
50
|
+
return JSON.parse(JSON.stringify(value));
|
|
51
|
+
}
|
|
52
|
+
function text(message) {
|
|
53
|
+
if (typeof message === "string") return message;
|
|
54
|
+
if (!("content" in message)) return "summary" in message ? message.summary : "output" in message ? message.output : "";
|
|
55
|
+
return typeof message.content === "string" ? message.content : message.content.map((p) => p.type === "text" ? p.text : "").join("");
|
|
56
|
+
}
|
|
57
|
+
/** Compatibility projection keeps protocol identities strings and retains fork ancestry. */
|
|
58
|
+
async function projectDurableConversationEntries(conversation, context) {
|
|
59
|
+
const records = [];
|
|
60
|
+
let cursor;
|
|
61
|
+
do {
|
|
62
|
+
const page = await conversation.entries({}, 256, cursor, context);
|
|
63
|
+
records.push(...page.items);
|
|
64
|
+
cursor = page.next;
|
|
65
|
+
} while (cursor);
|
|
66
|
+
records.reverse();
|
|
67
|
+
return projectDurableEntries(records);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Runs one prompt and returns the newest assistant text it produced. `hold` keeps the run open
|
|
71
|
+
* across later turns started by intercom delivery: while it resolves true, wait for the lane to
|
|
72
|
+
* go idle and ask again. The returned text is the newest one across all of those turns.
|
|
73
|
+
*/
|
|
74
|
+
async function promptForAssistantText(runtime, prompt, hold) {
|
|
75
|
+
const previous = new Set((await runtime.readEntries()).entries.map((e) => e.id));
|
|
76
|
+
await (await runtime.submitInternalMessage(prompt)).settled;
|
|
77
|
+
while (hold && await hold()) await runtime.lane.waitForIdle(BACKGROUND_CONTEXT);
|
|
78
|
+
return (await runtime.readEntries()).entries.toReversed().filter((e) => !previous.has(e.id)).flatMap((e) => e.type === "message" && e.message.role === "assistant" ? [text(e.message).trim()] : [])[0] || void 0;
|
|
79
|
+
}
|
|
80
|
+
async function createDirectHarnessRuntime(options) {
|
|
81
|
+
if (options.initialFastMode !== void 0 && typeof options.initialFastMode !== "boolean") throw new Error("Initial Fast mode must be a boolean.");
|
|
82
|
+
if (options.initialAgentLocked !== void 0 && typeof options.initialAgentLocked !== "boolean") throw new Error("Initial agent lock must be a boolean.");
|
|
83
|
+
const context = options.context ?? BACKGROUND_CONTEXT;
|
|
84
|
+
if (options.storage === "jsonl" || options.legacySessionPath !== void 0) throw new Error("Legacy JSONL direct storage is unsupported; use durable-v1 SQLite");
|
|
85
|
+
if (options.session && !options.durableStorage) throw new Error("A durable Session injection requires its raw durableStorage");
|
|
86
|
+
const storage = options.durableStorage ? {
|
|
87
|
+
storage: options.durableStorage,
|
|
88
|
+
sessionFile: options.sessionPath,
|
|
89
|
+
historyLease: void 0,
|
|
90
|
+
repository: void 0
|
|
91
|
+
} : await openSqliteSessionStorage(options, context);
|
|
92
|
+
let startupHarness;
|
|
93
|
+
try {
|
|
94
|
+
const registry = createRegistry();
|
|
95
|
+
const environment = new NodeExecutionEnv({ cwd: options.cwd });
|
|
96
|
+
let disposed = false;
|
|
97
|
+
let quarantined = false;
|
|
98
|
+
let failure;
|
|
99
|
+
let preparationFailure;
|
|
100
|
+
const terminatingCalls = /* @__PURE__ */ new Set();
|
|
101
|
+
let fastMode = false;
|
|
102
|
+
let agentLocked = false;
|
|
103
|
+
const assertUnlocked = () => {
|
|
104
|
+
if (agentLocked) throw new Error(AGENT_LOCKED_ERROR);
|
|
105
|
+
};
|
|
106
|
+
let resources = options.resources ?? {};
|
|
107
|
+
let tools = options.tools ?? [];
|
|
108
|
+
let activeNames = new Set(options.activeToolNames ?? tools.map((t) => t.name));
|
|
109
|
+
let settings = {
|
|
110
|
+
stream: options.streamOptions,
|
|
111
|
+
retry: options.retry,
|
|
112
|
+
compaction: options.compaction,
|
|
113
|
+
toolExecution: options.toolExecution,
|
|
114
|
+
steeringMode: options.steeringMode,
|
|
115
|
+
followUpMode: options.followUpMode
|
|
116
|
+
};
|
|
117
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
118
|
+
const eventListeners = /* @__PURE__ */ new Set();
|
|
119
|
+
const checkpointBoundaries = /* @__PURE__ */ new Set();
|
|
120
|
+
const emit = (frame) => {
|
|
121
|
+
for (const listener of listeners) try {
|
|
122
|
+
listener(frame);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
for (const other of listeners) if (other !== listener) other({
|
|
125
|
+
type: "handler_error",
|
|
126
|
+
error: String(error)
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
const writable = async (work) => {
|
|
131
|
+
if (disposed || quarantined) throw new Error("Direct harness writes are unavailable", { cause: failure });
|
|
132
|
+
try {
|
|
133
|
+
await storage.historyLease?.assertQuiescent();
|
|
134
|
+
return await work();
|
|
135
|
+
} catch (error) {
|
|
136
|
+
const code = typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
|
|
137
|
+
if (typeof code === "string" && [
|
|
138
|
+
"EACCES",
|
|
139
|
+
"EBUSY",
|
|
140
|
+
"EIO",
|
|
141
|
+
"EMFILE",
|
|
142
|
+
"ENFILE",
|
|
143
|
+
"ENOSPC",
|
|
144
|
+
"EPERM",
|
|
145
|
+
"EROFS"
|
|
146
|
+
].includes(code)) {
|
|
147
|
+
quarantined = true;
|
|
148
|
+
failure = error;
|
|
149
|
+
emit({
|
|
150
|
+
type: "error",
|
|
151
|
+
code: "storage_quarantined",
|
|
152
|
+
error: String(error)
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
let sourceModels;
|
|
159
|
+
if (options.models) sourceModels = options.models;
|
|
160
|
+
else {
|
|
161
|
+
if (!options.providers?.length) throw new Error("Direct harness requires Models or a Provider");
|
|
162
|
+
sourceModels = createModels(options.credentials ? { credentials: options.credentials } : void 0);
|
|
163
|
+
}
|
|
164
|
+
for (const provider of options.providers ?? []) {
|
|
165
|
+
const mutable = sourceModels;
|
|
166
|
+
const register = mutable.setProvider?.bind(sourceModels) ?? mutable.registerNativeProvider?.bind(sourceModels);
|
|
167
|
+
if (!register) throw new Error("Models registry cannot register providers");
|
|
168
|
+
register(provider);
|
|
169
|
+
}
|
|
170
|
+
const models = new Proxy(sourceModels, { get(target, key) {
|
|
171
|
+
const value = Reflect.get(target, key, target);
|
|
172
|
+
if (typeof value !== "function") return value;
|
|
173
|
+
if (![
|
|
174
|
+
"stream",
|
|
175
|
+
"complete",
|
|
176
|
+
"streamSimple",
|
|
177
|
+
"completeSimple",
|
|
178
|
+
"streamDeferred",
|
|
179
|
+
"fetchDeferred"
|
|
180
|
+
].includes(String(key))) return value.bind(target);
|
|
181
|
+
return (...args) => {
|
|
182
|
+
if (disposed || quarantined || preparationFailure) throw new Error("Model dispatch unavailable", { cause: preparationFailure });
|
|
183
|
+
options.guardModelRequest?.();
|
|
184
|
+
const request = args[1];
|
|
185
|
+
if (!["complete", "completeSimple"].includes(String(key)) && request?.tools?.some((t) => !activeNames.has(t.name))) throw new Error("Model request contains disabled tools");
|
|
186
|
+
const requestOptions = args[2];
|
|
187
|
+
const usePriority = fastMode && args[0].api === CODEX_API && args[0].provider === CODEX_PROVIDER;
|
|
188
|
+
const originalOnPayload = requestOptions?.onPayload;
|
|
189
|
+
args[2] = {
|
|
190
|
+
...requestOptions,
|
|
191
|
+
sessionId: key === "complete" ? requestOptions?.sessionId ?? sessionId : sessionId,
|
|
192
|
+
...usePriority ? { serviceTier: "priority" } : {},
|
|
193
|
+
onPayload: async (payload, model) => {
|
|
194
|
+
options.guardModelRequest?.();
|
|
195
|
+
const original = typeof originalOnPayload === "function" ? await originalOnPayload(payload, model) : void 0;
|
|
196
|
+
const transformed = original === void 0 ? payload : original;
|
|
197
|
+
const patch = await options.beforePayload?.({
|
|
198
|
+
payload: transformed,
|
|
199
|
+
model
|
|
200
|
+
}, context);
|
|
201
|
+
const finalPayload = patch === void 0 ? transformed : patch.payload;
|
|
202
|
+
if (!usePriority) return finalPayload;
|
|
203
|
+
if (typeof finalPayload !== "object" || finalPayload === null || Array.isArray(finalPayload)) throw new Error("Invalid Codex request payload");
|
|
204
|
+
return {
|
|
205
|
+
...finalPayload,
|
|
206
|
+
service_tier: "priority"
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
const dispatched = Reflect.apply(value, target, args);
|
|
211
|
+
if (![
|
|
212
|
+
"stream",
|
|
213
|
+
"streamSimple",
|
|
214
|
+
"fetchDeferred"
|
|
215
|
+
].includes(String(key))) return dispatched;
|
|
216
|
+
const source = dispatched;
|
|
217
|
+
const output = createAssistantMessageEventStream();
|
|
218
|
+
const requestedModel = args[0];
|
|
219
|
+
const signal = args[2].signal;
|
|
220
|
+
let ended = false;
|
|
221
|
+
let current = {
|
|
222
|
+
role: "assistant",
|
|
223
|
+
content: [],
|
|
224
|
+
api: requestedModel.api,
|
|
225
|
+
provider: requestedModel.provider,
|
|
226
|
+
model: requestedModel.id,
|
|
227
|
+
timestamp: Date.now(),
|
|
228
|
+
stopReason: "pending",
|
|
229
|
+
usage: {
|
|
230
|
+
input: 0,
|
|
231
|
+
output: 0,
|
|
232
|
+
cacheRead: 0,
|
|
233
|
+
cacheWrite: 0,
|
|
234
|
+
totalTokens: 0,
|
|
235
|
+
cost: {
|
|
236
|
+
input: 0,
|
|
237
|
+
output: 0,
|
|
238
|
+
cacheRead: 0,
|
|
239
|
+
cacheWrite: 0,
|
|
240
|
+
total: 0
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const cancel = () => {
|
|
245
|
+
if (ended) return;
|
|
246
|
+
ended = true;
|
|
247
|
+
const cancelled = {
|
|
248
|
+
...current,
|
|
249
|
+
stopReason: "aborted",
|
|
250
|
+
errorMessage: "Agent request aborted"
|
|
251
|
+
};
|
|
252
|
+
output.push({
|
|
253
|
+
type: "error",
|
|
254
|
+
reason: "aborted",
|
|
255
|
+
error: cancelled
|
|
256
|
+
});
|
|
257
|
+
output.end();
|
|
258
|
+
};
|
|
259
|
+
signal?.addEventListener("abort", cancel, { once: true });
|
|
260
|
+
if (signal?.aborted) cancel();
|
|
261
|
+
(async () => {
|
|
262
|
+
try {
|
|
263
|
+
for await (const event of source) {
|
|
264
|
+
if (ended) break;
|
|
265
|
+
if ("partial" in event) current = event.partial;
|
|
266
|
+
output.push(event);
|
|
267
|
+
}
|
|
268
|
+
if (!ended) {
|
|
269
|
+
ended = true;
|
|
270
|
+
output.end(await source.result());
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
if (!ended) {
|
|
274
|
+
ended = true;
|
|
275
|
+
const failed = {
|
|
276
|
+
...current,
|
|
277
|
+
stopReason: "error",
|
|
278
|
+
errorMessage: String(error)
|
|
279
|
+
};
|
|
280
|
+
output.push({
|
|
281
|
+
type: "error",
|
|
282
|
+
reason: "error",
|
|
283
|
+
error: failed
|
|
284
|
+
});
|
|
285
|
+
output.end();
|
|
286
|
+
}
|
|
287
|
+
} finally {
|
|
288
|
+
signal?.removeEventListener("abort", cancel);
|
|
289
|
+
}
|
|
290
|
+
})();
|
|
291
|
+
return output;
|
|
292
|
+
};
|
|
293
|
+
} });
|
|
294
|
+
const resolveToolContext = async (ctx) => typeof options.toolContext === "function" ? options.toolContext(ctx) : options.toolContext;
|
|
295
|
+
const nativeTool = (tool) => ({
|
|
296
|
+
name: tool.name,
|
|
297
|
+
description: tool.description,
|
|
298
|
+
parameters: tool.parameters,
|
|
299
|
+
constrainedSampling: tool.constrainedSampling,
|
|
300
|
+
prepareArguments: tool.prepareArguments ? (args) => tool.prepareArguments(args) : void 0,
|
|
301
|
+
replay: tool.replay ?? "unsafe",
|
|
302
|
+
executionMode: tool.executionMode,
|
|
303
|
+
async execute(args, api, ctx) {
|
|
304
|
+
if (!activeNames.has(tool.name)) throw new Error(`Tool '${tool.name}' is no longer active`);
|
|
305
|
+
const pending = tool.execute(api.callId, args, (partial) => {
|
|
306
|
+
for (const part of partial.content) if (part.type === "text") api.output(part.text);
|
|
307
|
+
if (partial.details !== void 0) api.details(json(partial.details), ctx).catch((error) => emit({
|
|
308
|
+
type: "error",
|
|
309
|
+
error: String(error)
|
|
310
|
+
}));
|
|
311
|
+
}, await resolveToolContext(ctx), {
|
|
312
|
+
invocationId: String(api.taskId),
|
|
313
|
+
operationId: String(api.taskId),
|
|
314
|
+
turnId: String(api.taskId),
|
|
315
|
+
getMemo: (name) => api.memo(name, ctx),
|
|
316
|
+
setMemo: async (name, value) => {
|
|
317
|
+
if (value === void 0) throw new Error("Durable invocation memos cannot be deleted");
|
|
318
|
+
await api.memo(name, value, ctx);
|
|
319
|
+
}
|
|
320
|
+
}, ctx);
|
|
321
|
+
const result = await awaitWithContext(pending, ctx);
|
|
322
|
+
return {
|
|
323
|
+
content: result.content,
|
|
324
|
+
isError: result.isError,
|
|
325
|
+
...result.details === void 0 ? {} : { details: json(result.details) }
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
const install = () => registry.install({
|
|
330
|
+
name: "po.host",
|
|
331
|
+
tools: tools.map(nativeTool),
|
|
332
|
+
sections: [{
|
|
333
|
+
key: "po",
|
|
334
|
+
tag: false,
|
|
335
|
+
async render(_input, ctx) {
|
|
336
|
+
preparationFailure = void 0;
|
|
337
|
+
try {
|
|
338
|
+
return [typeof options.systemPrompt === "function" ? await options.systemPrompt(await resolveToolContext(ctx), ctx) : options.systemPrompt ?? "", options.systemPrompt === void 0 ? formatSkillsForSystemPrompt(resources.skills ?? []) : ""].filter(Boolean).join("\n\n");
|
|
339
|
+
} catch (error) {
|
|
340
|
+
preparationFailure = error;
|
|
341
|
+
throw error;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}],
|
|
345
|
+
hooks: [
|
|
346
|
+
hook(GenerationTask, {
|
|
347
|
+
async afterTools(_assistant, _results, api, ctx) {
|
|
348
|
+
const lane = conversation;
|
|
349
|
+
if (lane.id !== api.conversationId) return;
|
|
350
|
+
for (const registration of checkpointBoundaries) {
|
|
351
|
+
if (!registration.active || disposed || ctx.abortSignal?.aborted || external) continue;
|
|
352
|
+
let open = true;
|
|
353
|
+
try {
|
|
354
|
+
await registration.callback({
|
|
355
|
+
signal: ctx.abortSignal,
|
|
356
|
+
appendMessage: (message) => commitCheckpointMessage(registration, lane, message, ctx, () => open, api.taskId)
|
|
357
|
+
});
|
|
358
|
+
} finally {
|
|
359
|
+
open = false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
async beforeRequest(request, api, ctx) {
|
|
364
|
+
assertUnlocked();
|
|
365
|
+
try {
|
|
366
|
+
const live = await api.snapshot(LiveDoc, api.conversationId, ctx);
|
|
367
|
+
const retained = await api.snapshot(LifecycleDoc, ctx);
|
|
368
|
+
const queue = JSON.parse(retained?.json ?? "{\"queue\":[]}");
|
|
369
|
+
if (live?.run && queue.queue.some((item) => item.operationId !== void 0 && item.submissionId !== void 0 && live.run.inputs.includes(item.submissionId) && item.operationId !== String(live.run.inputs[0]))) throw new Error("Steering target changed before model admission");
|
|
370
|
+
const agent = await conversation.agent(ctx);
|
|
371
|
+
const model = agent.model ? models.getModel(agent.model.provider, agent.model.modelId) : void 0;
|
|
372
|
+
await options.beforeModelRequest?.({
|
|
373
|
+
phase: "turn",
|
|
374
|
+
model,
|
|
375
|
+
prompt: [...request.messages],
|
|
376
|
+
resources
|
|
377
|
+
}, ctx);
|
|
378
|
+
const systemPrompt = getCurrentSystemPrompt(request.messages);
|
|
379
|
+
const contextMessages = options.transformContext ? await restoreCustomContextMessages(request.messages, ctx, await conversation.context(ctx)) : request.messages.filter((message) => message.role !== "system");
|
|
380
|
+
const originalContext = structuredClone(contextMessages);
|
|
381
|
+
const patch = await options.transformContext?.({
|
|
382
|
+
messages: contextMessages,
|
|
383
|
+
systemPrompt
|
|
384
|
+
}, ctx);
|
|
385
|
+
let messages = patch && (patch.systemPrompt !== void 0 && patch.systemPrompt !== systemPrompt || patch.messages !== void 0 && !isDeepStrictEqual(patch.messages, originalContext)) ? [{
|
|
386
|
+
role: "system",
|
|
387
|
+
content: patch.systemPrompt ?? systemPrompt,
|
|
388
|
+
timestamp: Date.now(),
|
|
389
|
+
toolsAdded: getCurrentTools(request.messages)
|
|
390
|
+
}, ...convertToLlm(patch.messages ?? request.messages.filter((m) => m.role !== "system"))] : [...request.messages];
|
|
391
|
+
if (options.toProviderMessages) messages = await options.toProviderMessages(messages, ctx);
|
|
392
|
+
await options.beforeModelRequest?.({
|
|
393
|
+
phase: "request",
|
|
394
|
+
model,
|
|
395
|
+
resources
|
|
396
|
+
}, ctx);
|
|
397
|
+
return { messages };
|
|
398
|
+
} catch (error) {
|
|
399
|
+
preparationFailure = error;
|
|
400
|
+
throw error;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}),
|
|
404
|
+
hook(ToolTask, {
|
|
405
|
+
async beforeTool(call, _api, ctx) {
|
|
406
|
+
const patch = await options.beforeTool?.({
|
|
407
|
+
toolCallId: call.id,
|
|
408
|
+
toolName: call.name,
|
|
409
|
+
args: call.arguments
|
|
410
|
+
}, ctx);
|
|
411
|
+
if (patch?.block?.terminate) terminatingCalls.add(call.id);
|
|
412
|
+
return patch ? {
|
|
413
|
+
arguments: patch.args,
|
|
414
|
+
block: patch.block?.reason
|
|
415
|
+
} : void 0;
|
|
416
|
+
},
|
|
417
|
+
async afterTool(call, result, _api, ctx) {
|
|
418
|
+
const patch = await options.afterTool?.({
|
|
419
|
+
toolCallId: call.id,
|
|
420
|
+
toolName: call.name,
|
|
421
|
+
args: call.arguments,
|
|
422
|
+
content: result.content ?? [],
|
|
423
|
+
details: result.details,
|
|
424
|
+
isError: result.isError ?? false,
|
|
425
|
+
usage: result.usage
|
|
426
|
+
}, ctx);
|
|
427
|
+
return patch ? {
|
|
428
|
+
...result,
|
|
429
|
+
...patch,
|
|
430
|
+
control: patch.terminate || terminatingCalls.delete(call.id) ? {
|
|
431
|
+
...result.control,
|
|
432
|
+
terminate: true
|
|
433
|
+
} : result.control
|
|
434
|
+
} : terminatingCalls.delete(call.id) ? {
|
|
435
|
+
...result,
|
|
436
|
+
control: {
|
|
437
|
+
...result.control,
|
|
438
|
+
terminate: true
|
|
439
|
+
}
|
|
440
|
+
} : void 0;
|
|
441
|
+
}
|
|
442
|
+
}),
|
|
443
|
+
hook(CompactionTask, { async beforeCompact(input, _api, ctx) {
|
|
444
|
+
if (!options.beforeCompaction) return;
|
|
445
|
+
const entries = projectDurableEntries(input.entries);
|
|
446
|
+
const patch = await options.beforeCompaction({
|
|
447
|
+
reason: input.reason,
|
|
448
|
+
customInstructions: input.instructions,
|
|
449
|
+
preparation: {
|
|
450
|
+
entries,
|
|
451
|
+
messages: [...input.messages],
|
|
452
|
+
tokensBefore: 0,
|
|
453
|
+
retainedTail: [],
|
|
454
|
+
firstKeptEntryId: String(input.firstKept),
|
|
455
|
+
messagesToSummarize: [...input.messages],
|
|
456
|
+
turnPrefixMessages: [],
|
|
457
|
+
isSplitTurn: false,
|
|
458
|
+
fileOps: {
|
|
459
|
+
read: /* @__PURE__ */ new Set(),
|
|
460
|
+
written: /* @__PURE__ */ new Set(),
|
|
461
|
+
edited: /* @__PURE__ */ new Set()
|
|
462
|
+
},
|
|
463
|
+
settings: {
|
|
464
|
+
enabled: options.compaction?.enabled ?? true,
|
|
465
|
+
reserveTokens: options.compaction?.reserveTokens ?? 16384,
|
|
466
|
+
keepRecentTokens: options.compaction?.keepRecentTokens ?? 2e4
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}, ctx);
|
|
470
|
+
if (patch?.decline) return { decline: true };
|
|
471
|
+
if (patch?.compaction) return { summary: patch.compaction.summary };
|
|
472
|
+
} })
|
|
473
|
+
]
|
|
474
|
+
});
|
|
475
|
+
install();
|
|
476
|
+
const harness = await Harness.open(storage.storage, {
|
|
477
|
+
models,
|
|
478
|
+
registry,
|
|
479
|
+
get settings() {
|
|
480
|
+
return settings;
|
|
481
|
+
},
|
|
482
|
+
env: () => environment,
|
|
483
|
+
onReport: (error) => emit({
|
|
484
|
+
type: "handler_error",
|
|
485
|
+
error: String(error)
|
|
486
|
+
})
|
|
487
|
+
}, context);
|
|
488
|
+
startupHarness = harness;
|
|
489
|
+
const root = await harness.root(context, { agent: {
|
|
490
|
+
cwd: options.cwd,
|
|
491
|
+
...options.model ?? models.getModels()[0] ? { model: {
|
|
492
|
+
provider: (options.model ?? models.getModels()[0]).provider,
|
|
493
|
+
modelId: (options.model ?? models.getModels()[0]).id
|
|
494
|
+
} } : {},
|
|
495
|
+
...options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}
|
|
496
|
+
} });
|
|
497
|
+
const activeId = await initializeDurableNavigation(harness, root.id, context);
|
|
498
|
+
let conversation = await harness.conversation(activeId, context);
|
|
499
|
+
const storedAgent = await harness.snapshot(AgentDoc, conversation.id, context);
|
|
500
|
+
const initialModel = options.model ?? models.getModels()[0];
|
|
501
|
+
await conversation.configure({
|
|
502
|
+
...!storedAgent?.model && initialModel ? { model: {
|
|
503
|
+
provider: initialModel.provider,
|
|
504
|
+
modelId: initialModel.id
|
|
505
|
+
} } : {},
|
|
506
|
+
...!storedAgent?.thinkingLevel && options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {},
|
|
507
|
+
tools: tools.filter((t) => activeNames.has(t.name)).map(nativeTool)
|
|
508
|
+
}, context);
|
|
509
|
+
const storedFastMode = await harness.snapshot(FastModeDoc, context);
|
|
510
|
+
fastMode = storedFastMode?.enabled ?? options.initialFastMode ?? false;
|
|
511
|
+
const storedAgentLock = await harness.snapshot(AgentLockDoc, context);
|
|
512
|
+
agentLocked = storedAgentLock?.locked ?? options.initialAgentLocked ?? false;
|
|
513
|
+
const storedIdentity = await harness.snapshot(SessionIdentityDoc, context);
|
|
514
|
+
const sessionId = storedIdentity?.id || options.sessionId || randomUUID();
|
|
515
|
+
await writable(() => harness.commit(async (tx) => {
|
|
516
|
+
const identity = await tx.doc(SessionIdentityDoc);
|
|
517
|
+
if (!identity.id) {
|
|
518
|
+
identity.id = sessionId;
|
|
519
|
+
identity.createdAt = Date.now();
|
|
520
|
+
identity.parentSessionId = options.parentSessionId ?? "";
|
|
521
|
+
}
|
|
522
|
+
if (!storedAgentLock && options.initialAgentLocked !== void 0) (await tx.doc(AgentLockDoc)).locked = agentLocked;
|
|
523
|
+
if (!storedFastMode) {
|
|
524
|
+
(await tx.doc(FastModeDoc)).enabled = fastMode;
|
|
525
|
+
if (options.initialFastMode !== void 0) await tx.appendEntry(conversation.id, {
|
|
526
|
+
kind: "po.fast-mode",
|
|
527
|
+
data: {
|
|
528
|
+
version: 1,
|
|
529
|
+
enabled: fastMode,
|
|
530
|
+
sessionId
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
const metadata = await tx.doc(SessionMetadataDoc);
|
|
535
|
+
metadata.workspaceRoot ||= options.cwd;
|
|
536
|
+
if (options.lane !== void 0) metadata.laneName = options.lane;
|
|
537
|
+
if (!storedIdentity?.id && options.sessionName !== void 0) metadata.name = options.sessionName;
|
|
538
|
+
}, context));
|
|
539
|
+
const laneName = options.lane ?? "main";
|
|
540
|
+
let resolveExited;
|
|
541
|
+
const exited = new Promise((resolve) => {
|
|
542
|
+
resolveExited = resolve;
|
|
543
|
+
});
|
|
544
|
+
const readRecord = async () => JSON.parse((await harness.snapshot(LifecycleDoc, context))?.json ?? "{\"revision\":0,\"paused\":false,\"queue\":[]}");
|
|
545
|
+
const changeRecord = async (change) => writable(() => harness.commit(async (tx) => {
|
|
546
|
+
const doc = await tx.doc(LifecycleDoc);
|
|
547
|
+
const record = JSON.parse(doc.json);
|
|
548
|
+
const result = change(record);
|
|
549
|
+
record.revision++;
|
|
550
|
+
doc.json = JSON.stringify(record);
|
|
551
|
+
return result;
|
|
552
|
+
}, context));
|
|
553
|
+
let userAdmission = false;
|
|
554
|
+
let promptAdmissions = 0;
|
|
555
|
+
let userAdmissionSettled = Promise.resolve();
|
|
556
|
+
let releaseUserAdmission;
|
|
557
|
+
const guardUserAdmission = () => {
|
|
558
|
+
if (userAdmission) throw new Error("A user interruption is already being admitted");
|
|
559
|
+
};
|
|
560
|
+
let external;
|
|
561
|
+
let externalAbort;
|
|
562
|
+
let compactionAdmission = false;
|
|
563
|
+
const nativeExecution = async () => {
|
|
564
|
+
const live = await harness.snapshot(LiveDoc, conversation.id, context);
|
|
565
|
+
const task = (await harness.inspect(context)).tasks.find((t) => t.record.conversationId === conversation.id && !t.record.background);
|
|
566
|
+
return live?.run ? {
|
|
567
|
+
id: String(live.run.inputs[0]),
|
|
568
|
+
kind: "run",
|
|
569
|
+
status: (await readRecord()).abortOperationId === String(live.run.inputs[0]) ? "aborting" : "open"
|
|
570
|
+
} : task ? {
|
|
571
|
+
id: String(task.record.id),
|
|
572
|
+
kind: "compaction",
|
|
573
|
+
status: task.record.abortRequested ? "aborting" : "open"
|
|
574
|
+
} : null;
|
|
575
|
+
};
|
|
576
|
+
const execution = async () => await nativeExecution() ?? (external ? {
|
|
577
|
+
id: external,
|
|
578
|
+
kind: "navigation",
|
|
579
|
+
status: "open"
|
|
580
|
+
} : settling ? {
|
|
581
|
+
id: "settling",
|
|
582
|
+
kind: "run",
|
|
583
|
+
status: "open"
|
|
584
|
+
} : null);
|
|
585
|
+
const readLifecycle = async () => {
|
|
586
|
+
const record = await readRecord();
|
|
587
|
+
return {
|
|
588
|
+
revision: record.revision,
|
|
589
|
+
paused: record.paused,
|
|
590
|
+
queue: record.queue.filter((item) => item.explicitQueue === true && item.disposition !== "consumed" && item.disposition !== "removed").map(({ explicitQueue: _q, submissionId: _s, conversationId: _c, message: _m, operationId: _o, attempt: _a, ...item }) => item),
|
|
591
|
+
operation: await execution()
|
|
592
|
+
};
|
|
593
|
+
};
|
|
594
|
+
const publish = async () => emit({
|
|
595
|
+
type: "lifecycle_update",
|
|
596
|
+
lifecycle: await readLifecycle()
|
|
597
|
+
});
|
|
598
|
+
let watcher;
|
|
599
|
+
let eventsSettled = Promise.resolve();
|
|
600
|
+
let settling = 0;
|
|
601
|
+
const admittingInternal = /* @__PURE__ */ new Set();
|
|
602
|
+
const reconcilingInternal = /* @__PURE__ */ new Map();
|
|
603
|
+
const internalDelivery = /* @__PURE__ */ new Map();
|
|
604
|
+
const deliveredInputs = /* @__PURE__ */ new Set();
|
|
605
|
+
const nextTurnMessages = [];
|
|
606
|
+
let deferredInternalCount = 0;
|
|
607
|
+
const flushNextTurn = async () => {
|
|
608
|
+
const staged = nextTurnMessages.splice(0);
|
|
609
|
+
for (let index = 0; index < staged.length; index++) {
|
|
610
|
+
const message = staged[index];
|
|
611
|
+
try {
|
|
612
|
+
await writable(() => conversation.submit({
|
|
613
|
+
type: "write",
|
|
614
|
+
requestId: randomUUID(),
|
|
615
|
+
entry: {
|
|
616
|
+
kind: "po.entry",
|
|
617
|
+
data: json({
|
|
618
|
+
type: "message",
|
|
619
|
+
message
|
|
620
|
+
}),
|
|
621
|
+
model: convertToLlm([message])
|
|
622
|
+
}
|
|
623
|
+
}, context));
|
|
624
|
+
} catch (error) {
|
|
625
|
+
nextTurnMessages.unshift(...staged.slice(index));
|
|
626
|
+
throw error;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
};
|
|
630
|
+
let logicalLoopActive = false;
|
|
631
|
+
let lastAssistant;
|
|
632
|
+
let partial;
|
|
633
|
+
let toolResults = [];
|
|
634
|
+
const deliver = async (event, eventContext) => {
|
|
635
|
+
for (const listener of eventListeners) try {
|
|
636
|
+
await listener(event, eventContext);
|
|
637
|
+
} catch (error) {
|
|
638
|
+
emit({
|
|
639
|
+
type: "handler_error",
|
|
640
|
+
error: String(error)
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
const attach = async () => {
|
|
645
|
+
if (watcher) await watcher.stop();
|
|
646
|
+
watcher = await watchEvents(harness, conversation.id, context);
|
|
647
|
+
let predecessor = watcher.snapshot.entries.at(-1)?.id;
|
|
648
|
+
const customSources = /* @__PURE__ */ new Map();
|
|
649
|
+
const generatedSources = /* @__PURE__ */ new Map();
|
|
650
|
+
const rememberCustom = (raw) => {
|
|
651
|
+
const projected = projectDurableEntries([raw])[0];
|
|
652
|
+
const data = raw.data && typeof raw.data === "object" && !Array.isArray(raw.data) ? raw.data : void 0;
|
|
653
|
+
if (projected?.type === "message" && projected.message.role === "custom" && typeof data?.inputRequestId === "string") customSources.set(data.inputRequestId, projected.message);
|
|
654
|
+
};
|
|
655
|
+
for (const raw of watcher.snapshot.entries) rememberCustom(raw);
|
|
656
|
+
for (const requestId of customSources.keys()) {
|
|
657
|
+
const receipt = await storage.storage.submissionByRequest(conversation.id, requestId, context);
|
|
658
|
+
if (receipt && receipt.status !== "queued") customSources.delete(requestId);
|
|
659
|
+
}
|
|
660
|
+
const generatedEntrySource = async (raw, ctx) => {
|
|
661
|
+
if (generatedSources.has(raw.id)) return generatedSources.get(raw.id);
|
|
662
|
+
let source;
|
|
663
|
+
if (raw.model?.[0]?.role === "user") for (const [requestId, custom] of customSources) {
|
|
664
|
+
const receipt = await storage.storage.submissionByRequest(conversation.id, requestId, ctx);
|
|
665
|
+
if (receipt && "entry" in receipt && receipt.entry === raw.id) {
|
|
666
|
+
source = custom;
|
|
667
|
+
customSources.delete(requestId);
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
generatedSources.set(raw.id, source);
|
|
672
|
+
while (generatedSources.size > 128) generatedSources.delete(generatedSources.keys().next().value);
|
|
673
|
+
return source;
|
|
674
|
+
};
|
|
675
|
+
lastAssistant = void 0;
|
|
676
|
+
partial = void 0;
|
|
677
|
+
toolResults = [];
|
|
678
|
+
watcher.start(async (events, eventContext) => {
|
|
679
|
+
for (const event of events) {
|
|
680
|
+
let mapped;
|
|
681
|
+
if (event.type === "turn_start" || event.type === "run_start") {
|
|
682
|
+
lastAssistant = void 0;
|
|
683
|
+
partial = void 0;
|
|
684
|
+
toolResults = [];
|
|
685
|
+
}
|
|
686
|
+
if (event.type === "message_end" || event.type === "entry_appended") {
|
|
687
|
+
rememberCustom(event.entry);
|
|
688
|
+
const entry = projectDurableEntries([event.entry])[0];
|
|
689
|
+
await generatedEntrySource(event.entry, eventContext);
|
|
690
|
+
if (entry) {
|
|
691
|
+
entry.parentId = predecessor === void 0 ? null : String(predecessor);
|
|
692
|
+
const added = {
|
|
693
|
+
type: "entry_added",
|
|
694
|
+
entry
|
|
695
|
+
};
|
|
696
|
+
emit({
|
|
697
|
+
type: "entry_appended",
|
|
698
|
+
entry
|
|
699
|
+
});
|
|
700
|
+
eventsSettled = eventsSettled.then(() => deliver(added, eventContext));
|
|
701
|
+
}
|
|
702
|
+
predecessor = event.entry.id;
|
|
703
|
+
}
|
|
704
|
+
if ([
|
|
705
|
+
"run_start",
|
|
706
|
+
"run_end",
|
|
707
|
+
"turn_start",
|
|
708
|
+
"compaction_start"
|
|
709
|
+
].includes(event.type)) mapped = { type: event.type };
|
|
710
|
+
if (event.type === "message_start") {
|
|
711
|
+
if (event.message.role === "assistant") partial = structuredClone(event.message);
|
|
712
|
+
mapped = {
|
|
713
|
+
type: "message_start",
|
|
714
|
+
message: event.message
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
if (event.type === "message_end" && event.entry.model?.[0]) {
|
|
718
|
+
const projected = projectDurableEntries([event.entry])[0];
|
|
719
|
+
if (projected?.type === "custom" && projected.customType === "po.internal-context") continue;
|
|
720
|
+
const message = await generatedEntrySource(event.entry, eventContext) ?? (projected?.type === "message" && projected.message.role === "custom" ? projected.message : event.entry.model[0]);
|
|
721
|
+
if (message.role === "assistant") lastAssistant = message;
|
|
722
|
+
if (message.role === "toolResult") toolResults.push(message);
|
|
723
|
+
mapped = {
|
|
724
|
+
type: "message_end",
|
|
725
|
+
message,
|
|
726
|
+
entryId: String(event.entry.id),
|
|
727
|
+
runId: String(conversation.id)
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
if (event.type === "tool_execution_start") mapped = {
|
|
731
|
+
...event,
|
|
732
|
+
type: "tool_start"
|
|
733
|
+
};
|
|
734
|
+
if (event.type === "tool_execution_end") {
|
|
735
|
+
const result = event.entry?.model?.find((m) => m.role === "toolResult");
|
|
736
|
+
mapped = {
|
|
737
|
+
type: "tool_end",
|
|
738
|
+
toolCallId: event.toolCallId,
|
|
739
|
+
toolName: event.toolName,
|
|
740
|
+
result: {
|
|
741
|
+
content: result?.content ?? [],
|
|
742
|
+
details: result?.details === void 0 ? void 0 : json(result.details)
|
|
743
|
+
},
|
|
744
|
+
isError: result?.isError ?? true
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
if (event.type === "turn_end" && lastAssistant) {
|
|
748
|
+
mapped = {
|
|
749
|
+
type: "turn_end",
|
|
750
|
+
message: lastAssistant,
|
|
751
|
+
toolResults
|
|
752
|
+
};
|
|
753
|
+
toolResults = [];
|
|
754
|
+
lastAssistant = void 0;
|
|
755
|
+
partial = void 0;
|
|
756
|
+
}
|
|
757
|
+
if (event.type === "message_update" && partial) for (const change of event.changes) {
|
|
758
|
+
if (change.type === "message") partial = structuredClone(change.message);
|
|
759
|
+
else if ("block" in change) partial.content[change.contentIndex] = structuredClone(change.block);
|
|
760
|
+
const block = "contentIndex" in change ? partial.content[change.contentIndex] : void 0;
|
|
761
|
+
if (change.type === "text_delta" && block?.type === "text") block.text += change.delta;
|
|
762
|
+
if (change.type === "thinking_delta" && block?.type === "thinking") block.thinking += change.delta;
|
|
763
|
+
{
|
|
764
|
+
const update = {
|
|
765
|
+
type: "message_update",
|
|
766
|
+
message: structuredClone(partial),
|
|
767
|
+
event: "delta" in change ? {
|
|
768
|
+
type: change.type,
|
|
769
|
+
contentIndex: change.contentIndex,
|
|
770
|
+
delta: change.delta,
|
|
771
|
+
partial: structuredClone(partial)
|
|
772
|
+
} : {
|
|
773
|
+
type: "start",
|
|
774
|
+
partial: structuredClone(partial)
|
|
775
|
+
}
|
|
776
|
+
};
|
|
777
|
+
emit({
|
|
778
|
+
...update,
|
|
779
|
+
assistantMessageEvent: update.event
|
|
780
|
+
});
|
|
781
|
+
eventsSettled = eventsSettled.then(() => deliver(update, eventContext));
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
if (event.type === "tool_execution_update") mapped = {
|
|
785
|
+
type: "tool_update",
|
|
786
|
+
toolCallId: event.toolCallId,
|
|
787
|
+
toolName: event.toolName,
|
|
788
|
+
partialResult: {
|
|
789
|
+
content: [{
|
|
790
|
+
type: "text",
|
|
791
|
+
text: event.output ? "set" in event.output ? event.output.set : event.output.append ?? "" : ""
|
|
792
|
+
}],
|
|
793
|
+
details: event.details
|
|
794
|
+
}
|
|
795
|
+
};
|
|
796
|
+
if (event.type === "compaction_end") {
|
|
797
|
+
const outcome = (await harness.waitForTask(event.taskId, eventContext)).state.outcome;
|
|
798
|
+
const result = outcome.status === "completed" ? outcome.result : void 0;
|
|
799
|
+
const status = await (result?.submissionId ? await harness.submission(result.submissionId, eventContext) : void 0)?.status(eventContext);
|
|
800
|
+
const entryId = result?.entryId ?? (status && "entry" in status ? status.entry : void 0);
|
|
801
|
+
mapped = {
|
|
802
|
+
type: "compaction_end",
|
|
803
|
+
status: outcome.status === "completed" ? result?.entryId !== void 0 || result?.submissionId !== void 0 ? "completed" : "aborted" : outcome.status === "aborted" ? "aborted" : "failed",
|
|
804
|
+
reason: event.reason,
|
|
805
|
+
entryId: entryId === void 0 ? void 0 : String(entryId),
|
|
806
|
+
error: outcome.status !== "completed" && outcome.status !== "aborted" ? new Error("error" in outcome ? outcome.error?.message ?? "Compaction failed" : "Compaction failed") : void 0
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
if (event.type === "inbox_update") mapped = {
|
|
810
|
+
type: "queue_update",
|
|
811
|
+
queues: event.items.map((item) => ({ kind: item.mode }))
|
|
812
|
+
};
|
|
813
|
+
if (event.type === "message_end") {
|
|
814
|
+
for (const message of event.entry.model ?? []) if (message.role === "assistant") eventsSettled = eventsSettled.then(() => deliver({
|
|
815
|
+
type: "usage",
|
|
816
|
+
row: {
|
|
817
|
+
id: String(event.entry.id),
|
|
818
|
+
usage: message.usage
|
|
819
|
+
}
|
|
820
|
+
}, eventContext));
|
|
821
|
+
}
|
|
822
|
+
if (!mapped) continue;
|
|
823
|
+
const publishMapped = (event) => emit({
|
|
824
|
+
...event,
|
|
825
|
+
type: event.type === "tool_start" ? "tool_execution_start" : event.type === "tool_update" ? "tool_execution_update" : event.type === "tool_end" ? "tool_execution_end" : event.type === "entry_added" ? "entry_appended" : event.type
|
|
826
|
+
});
|
|
827
|
+
if (mapped.type === "run_end") {
|
|
828
|
+
const settledEvent = {
|
|
829
|
+
runId: String(event.type === "run_end" ? event.inputs[0] : conversation.id),
|
|
830
|
+
timestamp: Date.now()
|
|
831
|
+
};
|
|
832
|
+
settling++;
|
|
833
|
+
let released = false;
|
|
834
|
+
const release = () => {
|
|
835
|
+
if (!released) {
|
|
836
|
+
settling--;
|
|
837
|
+
released = true;
|
|
838
|
+
}
|
|
839
|
+
};
|
|
840
|
+
eventsSettled = eventsSettled.then(async () => {
|
|
841
|
+
await reconcile();
|
|
842
|
+
try {
|
|
843
|
+
await writable(() => harness.commit((tx) => tx.appendEntry(conversation.id, {
|
|
844
|
+
kind: AGENT_SETTLED_ENTRY_TYPE,
|
|
845
|
+
data: settledEvent
|
|
846
|
+
}), eventContext));
|
|
847
|
+
} catch (error) {
|
|
848
|
+
emit({
|
|
849
|
+
type: "error",
|
|
850
|
+
code: "agent_settled",
|
|
851
|
+
error: String(error)
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
const live = await harness.snapshot(LiveDoc, conversation.id, eventContext);
|
|
855
|
+
const successorActive = !!live?.run && String(live.run.inputs[0]) !== settledEvent.runId;
|
|
856
|
+
mapped = {
|
|
857
|
+
type: "run_end",
|
|
858
|
+
runId: settledEvent.runId,
|
|
859
|
+
successorActive
|
|
860
|
+
};
|
|
861
|
+
publishMapped(mapped);
|
|
862
|
+
await deliver(mapped, eventContext);
|
|
863
|
+
release();
|
|
864
|
+
const lifecycle = await readLifecycle();
|
|
865
|
+
emit({
|
|
866
|
+
type: "lifecycle_update",
|
|
867
|
+
lifecycle
|
|
868
|
+
});
|
|
869
|
+
if (!lifecycle.operation) {
|
|
870
|
+
logicalLoopActive = false;
|
|
871
|
+
emit({
|
|
872
|
+
type: "agent_end",
|
|
873
|
+
runId: settledEvent.runId
|
|
874
|
+
});
|
|
875
|
+
emit({
|
|
876
|
+
type: "agent_settled",
|
|
877
|
+
...settledEvent
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
}).catch((error) => emit({
|
|
881
|
+
type: "error",
|
|
882
|
+
code: "settled_event",
|
|
883
|
+
error: String(error)
|
|
884
|
+
})).finally(async () => {
|
|
885
|
+
release();
|
|
886
|
+
if (event.type === "run_end") for (const id of event.inputs) {
|
|
887
|
+
deliveredInputs.add(id);
|
|
888
|
+
internalDelivery.get(id)?.resolve();
|
|
889
|
+
}
|
|
890
|
+
while (deliveredInputs.size > 128) deliveredInputs.delete(deliveredInputs.values().next().value);
|
|
891
|
+
try {
|
|
892
|
+
await publish();
|
|
893
|
+
} catch (error) {
|
|
894
|
+
emit({
|
|
895
|
+
type: "error",
|
|
896
|
+
code: "lifecycle_update",
|
|
897
|
+
error: String(error)
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
drain().catch((error) => emit({
|
|
901
|
+
type: "error",
|
|
902
|
+
code: "drain",
|
|
903
|
+
error: String(error)
|
|
904
|
+
}));
|
|
905
|
+
});
|
|
906
|
+
} else {
|
|
907
|
+
publishMapped(mapped);
|
|
908
|
+
if (mapped.type === "run_start") {
|
|
909
|
+
if (!logicalLoopActive) emit({ type: "agent_start" });
|
|
910
|
+
logicalLoopActive = true;
|
|
911
|
+
publish().catch((error) => emit({
|
|
912
|
+
type: "error",
|
|
913
|
+
code: "lifecycle_update",
|
|
914
|
+
error: String(error)
|
|
915
|
+
}));
|
|
916
|
+
}
|
|
917
|
+
const delivered = mapped;
|
|
918
|
+
eventsSettled = eventsSettled.then(() => deliver(delivered, eventContext));
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
});
|
|
922
|
+
};
|
|
923
|
+
await attach();
|
|
924
|
+
const reconcileInternal = (requestId, item) => {
|
|
925
|
+
const existing = reconcilingInternal.get(requestId);
|
|
926
|
+
if (existing) return existing;
|
|
927
|
+
const work = (async () => {
|
|
928
|
+
if (admittingInternal.has(requestId)) return;
|
|
929
|
+
const target = item.conversationId === conversation.id ? conversation : await harness.conversation(item.conversationId, context);
|
|
930
|
+
if (!target) throw new Error("Internal delivery conversation is unavailable");
|
|
931
|
+
let receipt = await storage.storage.submissionByRequest(target.id, requestId, context);
|
|
932
|
+
if (receipt?.status === "queued" && !(await harness.snapshot(LiveDoc, target.id, context))?.run) {
|
|
933
|
+
await harness.abortSubmission(receipt.id, context);
|
|
934
|
+
receipt = await storage.storage.submissionByRequest(target.id, requestId, context);
|
|
935
|
+
}
|
|
936
|
+
if (receipt?.status === "queued") return;
|
|
937
|
+
if (!receipt || receipt.status === "unanswered" && receipt.entry === void 0) {
|
|
938
|
+
if ((await harness.snapshot(LiveDoc, target.id, context))?.run) return;
|
|
939
|
+
let envelope = item.message.role === "custom" ? await storage.storage.submissionByRequest(target.id, `${requestId}:message`, context) : void 0;
|
|
940
|
+
if (item.message.role === "custom" && !envelope) {
|
|
941
|
+
await (await writable(() => target.submit({
|
|
942
|
+
type: "write",
|
|
943
|
+
requestId: `${requestId}:message`,
|
|
944
|
+
entry: {
|
|
945
|
+
kind: "po.entry",
|
|
946
|
+
data: json({
|
|
947
|
+
type: "message",
|
|
948
|
+
message: item.message,
|
|
949
|
+
timestamp: item.message.timestamp,
|
|
950
|
+
inputRequestId: requestId
|
|
951
|
+
})
|
|
952
|
+
}
|
|
953
|
+
}, context))).wait(context);
|
|
954
|
+
envelope = await storage.storage.submissionByRequest(target.id, `${requestId}:message`, context);
|
|
955
|
+
}
|
|
956
|
+
if (envelope?.status === "queued") {
|
|
957
|
+
await (await writable(() => target.submit({
|
|
958
|
+
type: "write",
|
|
959
|
+
requestId: `${requestId}:message-placement`,
|
|
960
|
+
entry: { kind: "po.internal-delivery" }
|
|
961
|
+
}, context))).wait(context);
|
|
962
|
+
envelope = await storage.storage.submissionByRequest(target.id, `${requestId}:message`, context);
|
|
963
|
+
}
|
|
964
|
+
const envelopeId = envelope && "entry" in envelope ? envelope.entry : void 0;
|
|
965
|
+
const draft = {
|
|
966
|
+
type: "write",
|
|
967
|
+
requestId: `${requestId}:context`,
|
|
968
|
+
entry: {
|
|
969
|
+
kind: "po.entry",
|
|
970
|
+
data: json(item.message.role === "custom" ? {
|
|
971
|
+
type: "custom",
|
|
972
|
+
customType: "po.internal-context",
|
|
973
|
+
data: { inputRequestId: requestId }
|
|
974
|
+
} : {
|
|
975
|
+
type: "message",
|
|
976
|
+
message: item.message
|
|
977
|
+
}),
|
|
978
|
+
...envelopeId === void 0 ? { model: convertToLlm([item.message]) } : { edits: [{
|
|
979
|
+
target: envelopeId,
|
|
980
|
+
action: "replace",
|
|
981
|
+
messages: convertToLlm([item.message])
|
|
982
|
+
}] }
|
|
983
|
+
}
|
|
984
|
+
};
|
|
985
|
+
let fallback;
|
|
986
|
+
try {
|
|
987
|
+
fallback = await writable(() => target.submit(draft, context));
|
|
988
|
+
} catch (error) {
|
|
989
|
+
const accepted = await storage.storage.submissionByRequest(target.id, `${requestId}:context`, context);
|
|
990
|
+
fallback = accepted && await harness.submission(accepted.id, context);
|
|
991
|
+
if (!fallback) throw error;
|
|
992
|
+
}
|
|
993
|
+
if ((await fallback.wait(context)).status !== "done") throw new Error("Internal context write failed");
|
|
994
|
+
}
|
|
995
|
+
await changeRecord((r) => {
|
|
996
|
+
delete r.internalDeliveries?.[requestId];
|
|
997
|
+
});
|
|
998
|
+
})().finally(() => {
|
|
999
|
+
reconcilingInternal.delete(requestId);
|
|
1000
|
+
});
|
|
1001
|
+
reconcilingInternal.set(requestId, work);
|
|
1002
|
+
return work;
|
|
1003
|
+
};
|
|
1004
|
+
const reconcile = async () => {
|
|
1005
|
+
const record = await readRecord();
|
|
1006
|
+
for (const [requestId, item] of Object.entries(record.internalDeliveries ?? {})) {
|
|
1007
|
+
if (admittingInternal.has(requestId)) continue;
|
|
1008
|
+
if ((await harness.snapshot(LiveDoc, item.conversationId, context))?.run) continue;
|
|
1009
|
+
const receipt = await storage.storage.submissionByRequest(item.conversationId, requestId, context);
|
|
1010
|
+
if (receipt?.status === "queued") await harness.abortSubmission(receipt.id, context);
|
|
1011
|
+
}
|
|
1012
|
+
for (const [requestId, item] of Object.entries(record.internalDeliveries ?? {})) await reconcileInternal(requestId, item);
|
|
1013
|
+
for (const item of record.queue) {
|
|
1014
|
+
if (item.disposition !== "handoff" && item.disposition !== "uncertain") continue;
|
|
1015
|
+
const status = await (item.submissionId ? await harness.submission(item.submissionId, context) : void 0)?.status(context);
|
|
1016
|
+
if (status?.status === "done" || status?.status === "placed" || status?.status === "unanswered") await changeRecord((r) => {
|
|
1017
|
+
const q = r.queue.find((q) => q.id === item.id);
|
|
1018
|
+
if (!q) return;
|
|
1019
|
+
if (status.status === "unanswered" && status.entry === void 0 && r.paused) {
|
|
1020
|
+
q.disposition = "pending";
|
|
1021
|
+
q.attempt = (q.attempt ?? 0) + 1;
|
|
1022
|
+
delete q.submissionId;
|
|
1023
|
+
} else {
|
|
1024
|
+
q.disposition = "consumed";
|
|
1025
|
+
q.text = "";
|
|
1026
|
+
delete q.message;
|
|
1027
|
+
delete q.images;
|
|
1028
|
+
}
|
|
1029
|
+
const receipts = r.queue.filter((q) => q.disposition === "consumed" || q.disposition === "removed");
|
|
1030
|
+
if (receipts.length > 128) {
|
|
1031
|
+
const expired = new Set(receipts.slice(0, receipts.length - 128).map((q) => q.id));
|
|
1032
|
+
r.queue = r.queue.filter((q) => !expired.has(q.id));
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
1035
|
+
else if (!status && !handingOff.has(item.id) && !userClaims.has(item.id)) await changeRecord((r) => {
|
|
1036
|
+
const q = r.queue.find((q) => q.id === item.id);
|
|
1037
|
+
if (q) q.disposition = "uncertain";
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
};
|
|
1041
|
+
const handingOff = /* @__PURE__ */ new Set();
|
|
1042
|
+
const userClaims = /* @__PURE__ */ new Set();
|
|
1043
|
+
let drainPromise;
|
|
1044
|
+
let drainRequested = false;
|
|
1045
|
+
const drain = () => {
|
|
1046
|
+
if (drainPromise) {
|
|
1047
|
+
drainRequested = true;
|
|
1048
|
+
return drainPromise;
|
|
1049
|
+
}
|
|
1050
|
+
return drainPromise ??= (async () => {
|
|
1051
|
+
await reconcile();
|
|
1052
|
+
while (!disposed) {
|
|
1053
|
+
const record = await readRecord();
|
|
1054
|
+
if (agentLocked || userAdmission || record.paused || await execution()) break;
|
|
1055
|
+
const item = record.queue.find((q) => q.disposition === "pending");
|
|
1056
|
+
if (!item) break;
|
|
1057
|
+
const submission = await handoff(item, "reject");
|
|
1058
|
+
if (!submission) continue;
|
|
1059
|
+
await submission.wait(context);
|
|
1060
|
+
await eventsSettled;
|
|
1061
|
+
await reconcile();
|
|
1062
|
+
await publish();
|
|
1063
|
+
}
|
|
1064
|
+
})().finally(() => {
|
|
1065
|
+
drainPromise = void 0;
|
|
1066
|
+
if (drainRequested) {
|
|
1067
|
+
drainRequested = false;
|
|
1068
|
+
drain().catch((error) => emit({
|
|
1069
|
+
type: "error",
|
|
1070
|
+
code: "drain",
|
|
1071
|
+
error: String(error)
|
|
1072
|
+
}));
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
1075
|
+
};
|
|
1076
|
+
const handoff = async (item, mode, recovering = false, allowPaused = false) => {
|
|
1077
|
+
if (external || handingOff.has(item.id)) return void 0;
|
|
1078
|
+
handingOff.add(item.id);
|
|
1079
|
+
try {
|
|
1080
|
+
const claimed = await changeRecord((r) => {
|
|
1081
|
+
const q = r.queue.find((q) => q.id === item.id);
|
|
1082
|
+
if (!q || r.paused && !recovering && !allowPaused) return void 0;
|
|
1083
|
+
if (recovering ? q.disposition !== "handoff" || q.submissionId !== void 0 : q.disposition !== "pending") return void 0;
|
|
1084
|
+
q.disposition = "handoff";
|
|
1085
|
+
q.conversationId = conversation.id;
|
|
1086
|
+
q.submissionMode = mode;
|
|
1087
|
+
if (item.operationId !== void 0) {
|
|
1088
|
+
q.delivery = item.delivery;
|
|
1089
|
+
q.operationId = item.operationId;
|
|
1090
|
+
}
|
|
1091
|
+
return q;
|
|
1092
|
+
});
|
|
1093
|
+
if (!claimed) return void 0;
|
|
1094
|
+
const content = input(claimed.message ?? claimed.text, claimed.images);
|
|
1095
|
+
const requestId = `${claimed.id}:${claimed.attempt ?? 0}`;
|
|
1096
|
+
const submit = () => writable(() => conversation.submit(mode === "write" ? {
|
|
1097
|
+
type: "write",
|
|
1098
|
+
requestId,
|
|
1099
|
+
entry: {
|
|
1100
|
+
kind: "po.message",
|
|
1101
|
+
model: [{
|
|
1102
|
+
role: "user",
|
|
1103
|
+
content,
|
|
1104
|
+
timestamp: Date.now()
|
|
1105
|
+
}]
|
|
1106
|
+
}
|
|
1107
|
+
} : {
|
|
1108
|
+
type: "input",
|
|
1109
|
+
content,
|
|
1110
|
+
whenBusy: mode,
|
|
1111
|
+
requestId
|
|
1112
|
+
}, context));
|
|
1113
|
+
let submission;
|
|
1114
|
+
try {
|
|
1115
|
+
submission = await submit();
|
|
1116
|
+
} catch (error) {
|
|
1117
|
+
const accepted = await storage.storage.submissionByRequest(conversation.id, requestId, context);
|
|
1118
|
+
if (!accepted) throw error;
|
|
1119
|
+
submission = await harness.submission(accepted.id, context);
|
|
1120
|
+
if (!submission) throw error;
|
|
1121
|
+
}
|
|
1122
|
+
await changeRecord((r) => {
|
|
1123
|
+
const q = r.queue.find((q) => q.id === item.id);
|
|
1124
|
+
if (q) q.submissionId = submission.id;
|
|
1125
|
+
});
|
|
1126
|
+
await reconcile();
|
|
1127
|
+
await publish();
|
|
1128
|
+
return submission;
|
|
1129
|
+
} finally {
|
|
1130
|
+
handingOff.delete(item.id);
|
|
1131
|
+
}
|
|
1132
|
+
};
|
|
1133
|
+
const input = (message, images) => {
|
|
1134
|
+
if (typeof message !== "string") {
|
|
1135
|
+
if (message.role !== "user") throw new Error("Only user messages can admit an agent run");
|
|
1136
|
+
return message.content;
|
|
1137
|
+
}
|
|
1138
|
+
return images?.length ? [{
|
|
1139
|
+
type: "text",
|
|
1140
|
+
text: message
|
|
1141
|
+
}, ...images] : message;
|
|
1142
|
+
};
|
|
1143
|
+
const enqueue = async (message, images, delivery, scheduling, explicitQueue = false) => {
|
|
1144
|
+
const id = randomUUID();
|
|
1145
|
+
await changeRecord((r) => {
|
|
1146
|
+
r.queue.push({
|
|
1147
|
+
id,
|
|
1148
|
+
text: text(message),
|
|
1149
|
+
...images ? { images } : {},
|
|
1150
|
+
...typeof message === "string" ? {} : { message },
|
|
1151
|
+
delivery,
|
|
1152
|
+
scheduling,
|
|
1153
|
+
explicitQueue,
|
|
1154
|
+
disposition: "pending"
|
|
1155
|
+
});
|
|
1156
|
+
});
|
|
1157
|
+
await publish();
|
|
1158
|
+
return { id };
|
|
1159
|
+
};
|
|
1160
|
+
const queued = async (message, images, delivery) => {
|
|
1161
|
+
guardUserAdmission();
|
|
1162
|
+
assertUnlocked();
|
|
1163
|
+
await enqueue(message, images, delivery, "automatic");
|
|
1164
|
+
drain().catch((error) => emit({
|
|
1165
|
+
type: "error",
|
|
1166
|
+
error: String(error)
|
|
1167
|
+
}));
|
|
1168
|
+
};
|
|
1169
|
+
const dispatchCommand = async (value) => options.dispatchCommand?.(value) ?? false;
|
|
1170
|
+
const admit = async (message, images, mode) => {
|
|
1171
|
+
guardUserAdmission();
|
|
1172
|
+
if (external) throw new Error("An operation is already running");
|
|
1173
|
+
if (typeof message === "string" && await dispatchCommand(message)) return {
|
|
1174
|
+
settled: Promise.resolve(),
|
|
1175
|
+
handledCommand: true
|
|
1176
|
+
};
|
|
1177
|
+
guardUserAdmission();
|
|
1178
|
+
if (external) throw new Error("An operation is already running");
|
|
1179
|
+
promptAdmissions++;
|
|
1180
|
+
try {
|
|
1181
|
+
assertUnlocked();
|
|
1182
|
+
const record = await readRecord();
|
|
1183
|
+
await flushNextTurn();
|
|
1184
|
+
const { id } = await enqueue(message, images, mode ?? "nextRun", "automatic");
|
|
1185
|
+
const submission = await handoff((await readRecord()).queue.find((q) => q.id === id), mode ?? "reject", false, record.paused);
|
|
1186
|
+
if (!submission) return { settled: Promise.resolve() };
|
|
1187
|
+
let resolveDelivery;
|
|
1188
|
+
const delivered = new Promise((resolve) => {
|
|
1189
|
+
resolveDelivery = resolve;
|
|
1190
|
+
});
|
|
1191
|
+
internalDelivery.set(submission.id, {
|
|
1192
|
+
done: delivered,
|
|
1193
|
+
resolve: resolveDelivery
|
|
1194
|
+
});
|
|
1195
|
+
if (deliveredInputs.has(submission.id)) resolveDelivery();
|
|
1196
|
+
const settled = (async () => {
|
|
1197
|
+
try {
|
|
1198
|
+
const status = await submission.wait(context);
|
|
1199
|
+
if (status.status === "done" || status.entry !== void 0) await delivered;
|
|
1200
|
+
await eventsSettled;
|
|
1201
|
+
await reconcile();
|
|
1202
|
+
await publish();
|
|
1203
|
+
if (status.status === "unanswered" && status.reason !== "aborted") throw new Error(`Agent submission failed: ${status.reason}${typeof status.detail === "string" && status.detail ? `: ${status.detail}` : ""}`);
|
|
1204
|
+
await drain();
|
|
1205
|
+
} finally {
|
|
1206
|
+
internalDelivery.delete(submission.id);
|
|
1207
|
+
}
|
|
1208
|
+
})();
|
|
1209
|
+
settled.catch((error) => emit({
|
|
1210
|
+
type: "error",
|
|
1211
|
+
error: String(error)
|
|
1212
|
+
}));
|
|
1213
|
+
return { settled };
|
|
1214
|
+
} finally {
|
|
1215
|
+
promptAdmissions--;
|
|
1216
|
+
}
|
|
1217
|
+
};
|
|
1218
|
+
const abort = async (operationId) => {
|
|
1219
|
+
const current = await execution();
|
|
1220
|
+
if (!current || current.id === "settling" || operationId && current.id !== operationId) return;
|
|
1221
|
+
if (current.id === external) {
|
|
1222
|
+
externalAbort?.abort();
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
const taskId = (await harness.snapshot(LiveDoc, conversation.id, context))?.run?.taskId ?? nativeId(current.id);
|
|
1226
|
+
await changeRecord((r) => {
|
|
1227
|
+
r.paused = true;
|
|
1228
|
+
r.abortOperationId = current.id;
|
|
1229
|
+
r.abortTaskId = taskId;
|
|
1230
|
+
});
|
|
1231
|
+
await publish();
|
|
1232
|
+
await writable(async () => {
|
|
1233
|
+
if (current.kind === "run") await conversation.abort(context);
|
|
1234
|
+
else await harness.abortTask(taskId, context);
|
|
1235
|
+
});
|
|
1236
|
+
await reconcile();
|
|
1237
|
+
};
|
|
1238
|
+
const interrupt = async () => {
|
|
1239
|
+
await abort();
|
|
1240
|
+
await writable(() => conversation.abort(context));
|
|
1241
|
+
await eventsSettled;
|
|
1242
|
+
};
|
|
1243
|
+
const admitSelected = async (selection, replay = false) => writable(() => harness.commit(async (tx) => {
|
|
1244
|
+
const doc = await tx.doc(LifecycleDoc);
|
|
1245
|
+
const record = JSON.parse(doc.json);
|
|
1246
|
+
const q = record.queue.find((q) => q.id === selection.id);
|
|
1247
|
+
if (!q || q.explicitQueue !== true) return "not_found";
|
|
1248
|
+
const requestId = `${q.id}:${q.attempt ?? 0}`;
|
|
1249
|
+
const accepted = await tx.submissionByRequest(conversation.id, requestId);
|
|
1250
|
+
if (accepted && accepted.type !== "input") throw new Error(`Request ${requestId} already identifies a submission of type ${accepted.type}`);
|
|
1251
|
+
if (accepted && replay) return accepted.id;
|
|
1252
|
+
if (q.disposition === "removed" || q.disposition === "consumed") return "not_found";
|
|
1253
|
+
if (accepted || q.disposition !== "pending") return "in_flight";
|
|
1254
|
+
const live = await tx.doc(LiveDoc, conversation.id);
|
|
1255
|
+
const task = live.run ? await tx.task(live.run.taskId) : void 0;
|
|
1256
|
+
if ((live.run ? String(live.run.inputs[0]) : void 0) !== selection.operationId || task?.abortRequested || live.run && record.abortOperationId === selection.operationId) return "target_changed";
|
|
1257
|
+
if (!live.run) {
|
|
1258
|
+
let page = await tx.scanTasks({
|
|
1259
|
+
conversationId: conversation.id,
|
|
1260
|
+
kind: CompactionTask.definition.name,
|
|
1261
|
+
background: false
|
|
1262
|
+
}, 128);
|
|
1263
|
+
while (true) {
|
|
1264
|
+
if (page.items.some((task) => task.state.status !== "terminal")) return "target_changed";
|
|
1265
|
+
if (!page.next) break;
|
|
1266
|
+
page = await tx.scanTasks({
|
|
1267
|
+
conversationId: conversation.id,
|
|
1268
|
+
kind: CompactionTask.definition.name,
|
|
1269
|
+
background: false
|
|
1270
|
+
}, 128, page.next);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
const content = input(q.message ?? q.text, q.images);
|
|
1274
|
+
const inbox = await tx.doc(InboxDoc, conversation.id);
|
|
1275
|
+
let head = live.run ? void 0 : (await tx.latestHeadMarker(conversation.id))?.head;
|
|
1276
|
+
const now = Date.now();
|
|
1277
|
+
let id;
|
|
1278
|
+
if (!live.run && inbox.items.length === 0) {
|
|
1279
|
+
const entry = await tx.appendEntry(UserEntry, conversation.id, { model: [{
|
|
1280
|
+
role: "user",
|
|
1281
|
+
content,
|
|
1282
|
+
timestamp: now
|
|
1283
|
+
}] });
|
|
1284
|
+
id = (await tx.createSubmission({
|
|
1285
|
+
conversationId: conversation.id,
|
|
1286
|
+
requestId,
|
|
1287
|
+
type: "input",
|
|
1288
|
+
status: "placed",
|
|
1289
|
+
entry: entry.id
|
|
1290
|
+
})).id;
|
|
1291
|
+
live.run = {
|
|
1292
|
+
taskId: await tx.createTask(GenerationTask, {}, {
|
|
1293
|
+
ownership: { kind: "conversation" },
|
|
1294
|
+
conversationId: conversation.id
|
|
1295
|
+
}),
|
|
1296
|
+
inputs: [id]
|
|
1297
|
+
};
|
|
1298
|
+
} else {
|
|
1299
|
+
id = (await tx.createSubmission({
|
|
1300
|
+
conversationId: conversation.id,
|
|
1301
|
+
requestId,
|
|
1302
|
+
type: "input",
|
|
1303
|
+
status: "queued"
|
|
1304
|
+
})).id;
|
|
1305
|
+
inbox.items.push({
|
|
1306
|
+
id,
|
|
1307
|
+
mode: "steer",
|
|
1308
|
+
content: json(content)
|
|
1309
|
+
});
|
|
1310
|
+
if (!live.run) {
|
|
1311
|
+
const writes = inbox.items.flatMap((item, index) => item.mode === "write" ? [index] : []);
|
|
1312
|
+
const pick = (mode) => {
|
|
1313
|
+
const indexes = inbox.items.flatMap((item, index) => item.mode === mode ? [index] : []);
|
|
1314
|
+
return (mode === "steer" ? settings.steeringMode : settings.followUpMode) === "all" ? indexes : indexes.slice(0, 1);
|
|
1315
|
+
};
|
|
1316
|
+
const users = [...pick("steer"), ...pick("followUp")].sort((a, b) => a - b);
|
|
1317
|
+
for (const index of writes) {
|
|
1318
|
+
const item = inbox.items[index];
|
|
1319
|
+
if (item.mode !== "write") continue;
|
|
1320
|
+
const draft = item.entry;
|
|
1321
|
+
if (typeof draft.head === "number" && head !== void 0 && draft.head < head) {
|
|
1322
|
+
tx.settleSubmission(item.id, {
|
|
1323
|
+
status: "unanswered",
|
|
1324
|
+
reason: "stale"
|
|
1325
|
+
});
|
|
1326
|
+
continue;
|
|
1327
|
+
}
|
|
1328
|
+
const entry = await tx.appendEntry(conversation.id, draft);
|
|
1329
|
+
if (draft.head !== void 0) head = draft.head === "self" ? entry.id : draft.head;
|
|
1330
|
+
tx.placeSubmission(item.id, entry.id);
|
|
1331
|
+
}
|
|
1332
|
+
const inputs = [];
|
|
1333
|
+
for (const index of users) {
|
|
1334
|
+
const item = inbox.items[index];
|
|
1335
|
+
if (item.mode === "write") continue;
|
|
1336
|
+
const entry = await tx.appendEntry(UserEntry, conversation.id, { model: [{
|
|
1337
|
+
role: "user",
|
|
1338
|
+
content: item.content,
|
|
1339
|
+
timestamp: now
|
|
1340
|
+
}] });
|
|
1341
|
+
tx.placeSubmission(item.id, entry.id);
|
|
1342
|
+
inputs.push(item.id);
|
|
1343
|
+
}
|
|
1344
|
+
for (const index of [...writes, ...users].sort((a, b) => b - a)) inbox.items.splice(index, 1);
|
|
1345
|
+
if (inputs.length) live.run = {
|
|
1346
|
+
taskId: await tx.createTask(GenerationTask, {}, {
|
|
1347
|
+
ownership: { kind: "conversation" },
|
|
1348
|
+
conversationId: conversation.id
|
|
1349
|
+
}),
|
|
1350
|
+
inputs
|
|
1351
|
+
};
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
q.disposition = "handoff";
|
|
1355
|
+
q.conversationId = conversation.id;
|
|
1356
|
+
q.submissionMode = "steer";
|
|
1357
|
+
q.submissionId = id;
|
|
1358
|
+
record.revision++;
|
|
1359
|
+
doc.json = JSON.stringify(record);
|
|
1360
|
+
return id;
|
|
1361
|
+
}, context));
|
|
1362
|
+
const submitUserPrompt = async (message, images, selection, submissionMode = "reject") => {
|
|
1363
|
+
guardUserAdmission();
|
|
1364
|
+
if (external) throw new Error("An operation is already running");
|
|
1365
|
+
if (!selection && (typeof message === "string" ? !message && !images?.length : !message.content.length)) throw new Error("User input must contain text or an image");
|
|
1366
|
+
if (!selection && typeof message === "string" && await dispatchCommand(message)) return {
|
|
1367
|
+
settled: Promise.resolve(),
|
|
1368
|
+
handledCommand: true
|
|
1369
|
+
};
|
|
1370
|
+
assertUnlocked();
|
|
1371
|
+
guardUserAdmission();
|
|
1372
|
+
if (external) throw new Error("An operation is already running");
|
|
1373
|
+
userAdmission = true;
|
|
1374
|
+
userAdmissionSettled = new Promise((resolve) => {
|
|
1375
|
+
releaseUserAdmission = resolve;
|
|
1376
|
+
});
|
|
1377
|
+
let claimed;
|
|
1378
|
+
try {
|
|
1379
|
+
if (selection && submissionMode === "steer") {
|
|
1380
|
+
let admitted;
|
|
1381
|
+
try {
|
|
1382
|
+
admitted = await admitSelected(selection);
|
|
1383
|
+
} catch (error) {
|
|
1384
|
+
if (!await storage.storage.submissionByRequest(conversation.id, `${selection.id}:${(await readRecord()).queue.find((q) => q.id === selection.id)?.attempt ?? 0}`, context)) throw error;
|
|
1385
|
+
admitted = await admitSelected(selection, true);
|
|
1386
|
+
}
|
|
1387
|
+
if (typeof admitted === "string") return {
|
|
1388
|
+
settled: Promise.resolve(),
|
|
1389
|
+
queueOutcome: admitted
|
|
1390
|
+
};
|
|
1391
|
+
const submission = await harness.submission(admitted, context);
|
|
1392
|
+
if (!submission) throw new Error("Accepted promotion submission is missing");
|
|
1393
|
+
const settled = (async () => {
|
|
1394
|
+
const status = await submission.wait(context);
|
|
1395
|
+
await eventsSettled;
|
|
1396
|
+
await reconcile();
|
|
1397
|
+
await publish();
|
|
1398
|
+
if (status.status === "unanswered" && status.reason !== "aborted") throw new Error(`Agent submission failed: ${status.reason}`);
|
|
1399
|
+
await drain();
|
|
1400
|
+
})();
|
|
1401
|
+
settled.catch((error) => emit({
|
|
1402
|
+
type: "error",
|
|
1403
|
+
code: "user_prompt",
|
|
1404
|
+
error: String(error)
|
|
1405
|
+
}));
|
|
1406
|
+
await reconcile();
|
|
1407
|
+
await publish();
|
|
1408
|
+
return { settled };
|
|
1409
|
+
}
|
|
1410
|
+
const current = await execution();
|
|
1411
|
+
if (selection) {
|
|
1412
|
+
const outcome = await changeRecord((r) => {
|
|
1413
|
+
const q = r.queue.find((q) => q.id === selection.id);
|
|
1414
|
+
if (!q || q.explicitQueue !== true || q.disposition === "removed" || q.disposition === "consumed") return "not_found";
|
|
1415
|
+
if (q.disposition !== "pending") return "in_flight";
|
|
1416
|
+
if (current?.id !== selection.operationId || current?.status === "aborting") return "target_changed";
|
|
1417
|
+
if (q.message && q.message.role !== "user") throw new Error("Only user input can interrupt and respond");
|
|
1418
|
+
userClaims.add(q.id);
|
|
1419
|
+
if (submissionMode === "reject") r.paused = true;
|
|
1420
|
+
q.disposition = "handoff";
|
|
1421
|
+
q.conversationId = conversation.id;
|
|
1422
|
+
q.submissionMode = submissionMode;
|
|
1423
|
+
return { ...q };
|
|
1424
|
+
});
|
|
1425
|
+
if (typeof outcome === "string") return {
|
|
1426
|
+
settled: Promise.resolve(),
|
|
1427
|
+
queueOutcome: outcome
|
|
1428
|
+
};
|
|
1429
|
+
claimed = outcome;
|
|
1430
|
+
}
|
|
1431
|
+
if (submissionMode === "reject") {
|
|
1432
|
+
if (current) await abort(current.id);
|
|
1433
|
+
await conversation.waitForIdle(context);
|
|
1434
|
+
await eventsSettled;
|
|
1435
|
+
}
|
|
1436
|
+
if (!selection) await flushNextTurn();
|
|
1437
|
+
if (!claimed) {
|
|
1438
|
+
const { id } = await enqueue(message, images, submissionMode === "steer" ? "steer" : "nextRun", submissionMode === "steer" ? "automatic" : "held");
|
|
1439
|
+
claimed = await changeRecord((r) => {
|
|
1440
|
+
const q = r.queue.find((q) => q.id === id);
|
|
1441
|
+
if (!q || q.disposition !== "pending") throw new Error("User input was removed before admission");
|
|
1442
|
+
q.disposition = "handoff";
|
|
1443
|
+
q.conversationId = conversation.id;
|
|
1444
|
+
q.submissionMode = submissionMode;
|
|
1445
|
+
return { ...q };
|
|
1446
|
+
});
|
|
1447
|
+
}
|
|
1448
|
+
const submission = await handoff(claimed, submissionMode, true);
|
|
1449
|
+
if (!submission) throw new Error("User admission ownership changed");
|
|
1450
|
+
const settled = (async () => {
|
|
1451
|
+
const status = await submission.wait(context);
|
|
1452
|
+
await eventsSettled;
|
|
1453
|
+
await reconcile();
|
|
1454
|
+
await publish();
|
|
1455
|
+
if (status.status === "unanswered" && status.reason !== "aborted") throw new Error(`Agent submission failed: ${status.reason}`);
|
|
1456
|
+
await drain();
|
|
1457
|
+
})();
|
|
1458
|
+
settled.catch((error) => emit({
|
|
1459
|
+
type: "error",
|
|
1460
|
+
code: "user_prompt",
|
|
1461
|
+
error: String(error)
|
|
1462
|
+
}));
|
|
1463
|
+
await publish();
|
|
1464
|
+
return { settled };
|
|
1465
|
+
} finally {
|
|
1466
|
+
if (claimed) userClaims.delete(claimed.id);
|
|
1467
|
+
if (selection) userClaims.delete(selection.id);
|
|
1468
|
+
userAdmission = false;
|
|
1469
|
+
releaseUserAdmission?.();
|
|
1470
|
+
releaseUserAdmission = void 0;
|
|
1471
|
+
}
|
|
1472
|
+
};
|
|
1473
|
+
const recover = async () => {
|
|
1474
|
+
const r = await readRecord();
|
|
1475
|
+
if (r.abortOperationId) {
|
|
1476
|
+
const task = r.abortTaskId === void 0 ? void 0 : await harness.getTask(r.abortTaskId, context);
|
|
1477
|
+
if (task && task.state.status !== "terminal") await conversation.abort(context);
|
|
1478
|
+
}
|
|
1479
|
+
for (const item of r.queue.filter((q) => q.disposition === "handoff" && !q.submissionId)) {
|
|
1480
|
+
if (item.conversationId !== conversation.id) {
|
|
1481
|
+
await changeRecord((record) => {
|
|
1482
|
+
const q = record.queue.find((q) => q.id === item.id);
|
|
1483
|
+
if (q) q.disposition = "uncertain";
|
|
1484
|
+
});
|
|
1485
|
+
continue;
|
|
1486
|
+
}
|
|
1487
|
+
await handoff(item, item.submissionMode ?? (item.delivery === "steer" ? "steer" : "followUp"), true);
|
|
1488
|
+
}
|
|
1489
|
+
await reconcile();
|
|
1490
|
+
await changeRecord(() => void 0);
|
|
1491
|
+
};
|
|
1492
|
+
const admissionBusy = () => userAdmission || promptAdmissions > 0 || settling > 0 || handingOff.size > 0 || admittingInternal.size > 0 || compactionAdmission;
|
|
1493
|
+
const runExternalOperation = async (work, { signal, waitMs = 0 } = {}) => {
|
|
1494
|
+
if (!Number.isFinite(waitMs) || waitMs < 0) throw new RangeError("waitMs must be finite and non-negative");
|
|
1495
|
+
const deadline = Date.now() + waitMs;
|
|
1496
|
+
const pendingFollowUp = async () => {
|
|
1497
|
+
if (waitMs === 0 || agentLocked) return false;
|
|
1498
|
+
const record = await readRecord();
|
|
1499
|
+
return !record.paused && record.queue.some((item) => item.disposition === "pending" || item.disposition === "handoff");
|
|
1500
|
+
};
|
|
1501
|
+
for (;;) {
|
|
1502
|
+
if (waitMs === 0) guardUserAdmission();
|
|
1503
|
+
signal?.throwIfAborted();
|
|
1504
|
+
if (disposed || disposePromise) throw new Error("Direct harness is disposed");
|
|
1505
|
+
const busy = await nativeExecution() || await pendingFollowUp();
|
|
1506
|
+
signal?.throwIfAborted();
|
|
1507
|
+
if (disposed || disposePromise) throw new Error("Direct harness is disposed");
|
|
1508
|
+
if (!busy && !external && !admissionBusy()) {
|
|
1509
|
+
external = randomUUID();
|
|
1510
|
+
let admitted = false;
|
|
1511
|
+
try {
|
|
1512
|
+
const changed = await nativeExecution() || await pendingFollowUp();
|
|
1513
|
+
signal?.throwIfAborted();
|
|
1514
|
+
if (disposed || disposePromise) throw new Error("Direct harness is disposed");
|
|
1515
|
+
if (waitMs > 0 && Date.now() >= deadline) throw new DoomHeadlessToolBusyError();
|
|
1516
|
+
admitted = !changed && !admissionBusy();
|
|
1517
|
+
} finally {
|
|
1518
|
+
if (!admitted) {
|
|
1519
|
+
external = void 0;
|
|
1520
|
+
drain().catch((error) => emit({
|
|
1521
|
+
type: "error",
|
|
1522
|
+
error: String(error)
|
|
1523
|
+
}));
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
if (admitted) break;
|
|
1527
|
+
}
|
|
1528
|
+
const remaining = deadline - Date.now();
|
|
1529
|
+
if (remaining <= 0) throw new DoomHeadlessToolBusyError();
|
|
1530
|
+
let timer;
|
|
1531
|
+
try {
|
|
1532
|
+
await awaitWithContext(new Promise((resolve) => {
|
|
1533
|
+
timer = setTimeout(resolve, Math.min(100, remaining));
|
|
1534
|
+
}), signal ? withAbortSignal(signal, context) : context);
|
|
1535
|
+
} finally {
|
|
1536
|
+
clearTimeout(timer);
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
externalAbort = new AbortController();
|
|
1540
|
+
try {
|
|
1541
|
+
await publish();
|
|
1542
|
+
return await writable(work);
|
|
1543
|
+
} finally {
|
|
1544
|
+
external = void 0;
|
|
1545
|
+
externalAbort = void 0;
|
|
1546
|
+
await publish();
|
|
1547
|
+
drain().catch((error) => emit({
|
|
1548
|
+
type: "error",
|
|
1549
|
+
error: String(error)
|
|
1550
|
+
}));
|
|
1551
|
+
}
|
|
1552
|
+
};
|
|
1553
|
+
const appendEntry = async (entry) => {
|
|
1554
|
+
const lane = conversation;
|
|
1555
|
+
const receipt = await (await writable(() => lane.submit(entry, context))).wait(context);
|
|
1556
|
+
if (receipt.status !== "done") throw new Error(`Entry write failed: ${receipt.reason}`);
|
|
1557
|
+
return String(receipt.entry);
|
|
1558
|
+
};
|
|
1559
|
+
const restoreCustomContextMessages = async (messages, ctx, view, conversationId = conversation.id) => {
|
|
1560
|
+
const contextContributions = /* @__PURE__ */ new Map();
|
|
1561
|
+
const customByEntry = /* @__PURE__ */ new Map();
|
|
1562
|
+
for (const raw of view.entries) {
|
|
1563
|
+
const entry = projectDurableEntries([raw])[0];
|
|
1564
|
+
if (entry?.type !== "message" || entry.message.role !== "custom") continue;
|
|
1565
|
+
const data = raw.data && typeof raw.data === "object" && !Array.isArray(raw.data) ? raw.data : void 0;
|
|
1566
|
+
const receipt = typeof data?.inputRequestId === "string" ? await storage.storage.submissionByRequest(conversationId, data.inputRequestId, ctx) : void 0;
|
|
1567
|
+
const placed = (receipt?.status === "unanswered" && !("entry" in receipt && receipt.entry !== void 0) && typeof data?.inputRequestId === "string" ? await storage.storage.submissionByRequest(conversationId, `${data.inputRequestId}:context`, ctx) : void 0) ?? receipt;
|
|
1568
|
+
const placedEntry = placed && "entry" in placed && placed.entry !== void 0 ? view.entries.find((candidate) => candidate.id === placed.entry) : void 0;
|
|
1569
|
+
const target = placedEntry?.edits?.some((edit) => edit.target === raw.id) ? raw.id : placedEntry?.id ?? raw.id;
|
|
1570
|
+
const contributions = view.contributions[view.entries.findIndex((candidate) => candidate.id === target)];
|
|
1571
|
+
const model = (placedEntry?.edits?.find((edit) => edit.target === raw.id && edit.action === "replace"))?.messages ?? view.entries.find((candidate) => candidate.id === target)?.model;
|
|
1572
|
+
if (model?.length === 1 && contributions?.length === 1 && JSON.stringify(model[0]) === JSON.stringify(contributions[0])) customByEntry.set(target, entry.message);
|
|
1573
|
+
}
|
|
1574
|
+
for (const [index, raw] of view.entries.entries()) {
|
|
1575
|
+
const custom = customByEntry.get(raw.id);
|
|
1576
|
+
for (const native of view.contributions[index] ?? []) {
|
|
1577
|
+
const key = JSON.stringify(native);
|
|
1578
|
+
const message = custom && view.contributions[index]?.length === 1 ? custom : native;
|
|
1579
|
+
const contributions = contextContributions.get(key) ?? [];
|
|
1580
|
+
contributions.push(message);
|
|
1581
|
+
contextContributions.set(key, contributions);
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
return messages.filter((message) => message.role !== "system").map((message) => contextContributions.get(JSON.stringify(message))?.shift() ?? message);
|
|
1585
|
+
};
|
|
1586
|
+
const readEntries = async () => {
|
|
1587
|
+
const entries = await projectDurableConversationEntries(conversation, context);
|
|
1588
|
+
return {
|
|
1589
|
+
entries,
|
|
1590
|
+
leafId: entries.at(-1)?.id ?? null
|
|
1591
|
+
};
|
|
1592
|
+
};
|
|
1593
|
+
const getSessionStats = async () => {
|
|
1594
|
+
const { entries } = await readEntries();
|
|
1595
|
+
const messages = entries.flatMap((e) => e.type === "message" ? [e.message] : []);
|
|
1596
|
+
const agent = await conversation.agent(context);
|
|
1597
|
+
const selected = agent.model ? models.getModel(agent.model.provider, agent.model.modelId) : void 0;
|
|
1598
|
+
const contextUsage = contextUsageOf(contextTokensOf(latestAssistantUsage(entries)), selected?.contextWindow);
|
|
1599
|
+
const usage = await harness.usage(context);
|
|
1600
|
+
const all = [...Object.values(usage.models), ...Object.values(usage.tools)];
|
|
1601
|
+
const tokens = {
|
|
1602
|
+
input: 0,
|
|
1603
|
+
output: 0,
|
|
1604
|
+
cacheRead: 0,
|
|
1605
|
+
cacheWrite: 0,
|
|
1606
|
+
total: 0
|
|
1607
|
+
};
|
|
1608
|
+
let cost = 0;
|
|
1609
|
+
for (const u of all) {
|
|
1610
|
+
tokens.input += u.input;
|
|
1611
|
+
tokens.output += u.output;
|
|
1612
|
+
tokens.cacheRead += u.cacheRead;
|
|
1613
|
+
tokens.cacheWrite += u.cacheWrite;
|
|
1614
|
+
tokens.total += u.totalTokens;
|
|
1615
|
+
cost += u.cost.total;
|
|
1616
|
+
}
|
|
1617
|
+
return {
|
|
1618
|
+
sessionId,
|
|
1619
|
+
sessionFile: storage.sessionFile,
|
|
1620
|
+
...contextUsage === void 0 ? {} : { contextUsage },
|
|
1621
|
+
messageCount: messages.length,
|
|
1622
|
+
totalMessages: messages.length,
|
|
1623
|
+
userMessages: messages.filter((m) => m.role === "user").length,
|
|
1624
|
+
assistantMessages: messages.filter((m) => m.role === "assistant").length,
|
|
1625
|
+
toolCalls: messages.flatMap((m) => m.role === "assistant" ? m.content.filter((c) => c.type === "toolCall") : []).length,
|
|
1626
|
+
toolResults: messages.filter((m) => m.role === "toolResult").length,
|
|
1627
|
+
tokens,
|
|
1628
|
+
cost,
|
|
1629
|
+
totalCost: cost,
|
|
1630
|
+
usage: {
|
|
1631
|
+
input: tokens.input,
|
|
1632
|
+
output: tokens.output,
|
|
1633
|
+
cacheRead: tokens.cacheRead,
|
|
1634
|
+
cacheWrite: tokens.cacheWrite,
|
|
1635
|
+
totalTokens: tokens.total,
|
|
1636
|
+
cost: {
|
|
1637
|
+
input: 0,
|
|
1638
|
+
output: 0,
|
|
1639
|
+
cacheRead: 0,
|
|
1640
|
+
cacheWrite: 0,
|
|
1641
|
+
total: cost
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
};
|
|
1645
|
+
};
|
|
1646
|
+
let disposePromise;
|
|
1647
|
+
const dispose = () => disposePromise ??= (async () => {
|
|
1648
|
+
const failures = [];
|
|
1649
|
+
const attempt = async (cleanup) => {
|
|
1650
|
+
try {
|
|
1651
|
+
await cleanup();
|
|
1652
|
+
return true;
|
|
1653
|
+
} catch (error) {
|
|
1654
|
+
failures.push(error);
|
|
1655
|
+
return false;
|
|
1656
|
+
}
|
|
1657
|
+
};
|
|
1658
|
+
await attempt(interrupt);
|
|
1659
|
+
disposed = true;
|
|
1660
|
+
await attempt(() => watcher.stop());
|
|
1661
|
+
await attempt(() => eventsSettled);
|
|
1662
|
+
const harnessClosed = await attempt(() => harness.close(context));
|
|
1663
|
+
const repositoryClosed = harnessClosed && await attempt(async () => storage.repository?.close(context));
|
|
1664
|
+
await attempt(() => environment.cleanup(context));
|
|
1665
|
+
if (harnessClosed && repositoryClosed) await attempt(async () => storage.historyLease?.release());
|
|
1666
|
+
resolveExited(failures.length ? 1 : 0);
|
|
1667
|
+
if (failures.length) throw new AggregateError(failures, "Direct harness cleanup failed");
|
|
1668
|
+
})();
|
|
1669
|
+
const recordUsage = async (usage, usageOptions) => {
|
|
1670
|
+
const entryId = await appendEntry({
|
|
1671
|
+
type: "write",
|
|
1672
|
+
entry: {
|
|
1673
|
+
kind: "po.usage",
|
|
1674
|
+
data: json({
|
|
1675
|
+
usage,
|
|
1676
|
+
...usageOptions
|
|
1677
|
+
})
|
|
1678
|
+
}
|
|
1679
|
+
});
|
|
1680
|
+
await writable(() => harness.commit(async (tx) => {
|
|
1681
|
+
const ledger = await tx.doc(UsageDoc, conversation.id);
|
|
1682
|
+
const key = "po/auxiliary";
|
|
1683
|
+
const previous = ledger.models[key];
|
|
1684
|
+
ledger.models[key] = previous ? {
|
|
1685
|
+
...usage,
|
|
1686
|
+
input: previous.input + usage.input,
|
|
1687
|
+
output: previous.output + usage.output,
|
|
1688
|
+
cacheRead: previous.cacheRead + usage.cacheRead,
|
|
1689
|
+
cacheWrite: previous.cacheWrite + usage.cacheWrite,
|
|
1690
|
+
totalTokens: previous.totalTokens + usage.totalTokens,
|
|
1691
|
+
cost: {
|
|
1692
|
+
input: previous.cost.input + usage.cost.input,
|
|
1693
|
+
output: previous.cost.output + usage.cost.output,
|
|
1694
|
+
cacheRead: previous.cost.cacheRead + usage.cost.cacheRead,
|
|
1695
|
+
cacheWrite: previous.cost.cacheWrite + usage.cost.cacheWrite,
|
|
1696
|
+
total: previous.cost.total + usage.cost.total
|
|
1697
|
+
}
|
|
1698
|
+
} : usage;
|
|
1699
|
+
}, context));
|
|
1700
|
+
return entryId;
|
|
1701
|
+
};
|
|
1702
|
+
const removeQueued = async (id) => {
|
|
1703
|
+
const item = (await readRecord()).queue.find((q) => q.id === id);
|
|
1704
|
+
if (!item || item.explicitQueue !== true) return "not_found";
|
|
1705
|
+
if (item.disposition === "consumed") return "already_consumed";
|
|
1706
|
+
if (item.disposition === "removed") return "removed";
|
|
1707
|
+
if (item.submissionId) {
|
|
1708
|
+
const result = await harness.abortSubmission(item.submissionId, context, conversation.id);
|
|
1709
|
+
if (result === "already_placed") return "in_flight";
|
|
1710
|
+
if (result === "settled") return "already_consumed";
|
|
1711
|
+
} else if (item.disposition !== "pending") return "in_flight";
|
|
1712
|
+
const result = await changeRecord((r) => {
|
|
1713
|
+
const q = r.queue.find((q) => q.id === id);
|
|
1714
|
+
if (!q || q.explicitQueue !== true) return "not_found";
|
|
1715
|
+
if (q.disposition === "consumed") return "already_consumed";
|
|
1716
|
+
if (q.disposition === "removed") return "removed";
|
|
1717
|
+
if (q.submissionId !== item.submissionId || item.submissionId === void 0 && q.disposition !== "pending") return "in_flight";
|
|
1718
|
+
q.disposition = "removed";
|
|
1719
|
+
q.text = "";
|
|
1720
|
+
delete q.message;
|
|
1721
|
+
delete q.images;
|
|
1722
|
+
return "removed";
|
|
1723
|
+
});
|
|
1724
|
+
await publish();
|
|
1725
|
+
return result;
|
|
1726
|
+
};
|
|
1727
|
+
const commitCheckpointMessage = async (registration, lane, message, ctx, scopeIsOpen = () => true, taskId) => {
|
|
1728
|
+
const usable = () => registration.active && scopeIsOpen() && !disposed && !quarantined && !external && conversation.id === lane.id && !ctx.abortSignal?.aborted;
|
|
1729
|
+
if (!usable()) return;
|
|
1730
|
+
return writable(async () => {
|
|
1731
|
+
if (!usable()) return;
|
|
1732
|
+
return harness.commit(async (tx) => {
|
|
1733
|
+
if (!usable()) return;
|
|
1734
|
+
const live = await tx.doc(LiveDoc, lane.id);
|
|
1735
|
+
const inbox = await tx.doc(InboxDoc, lane.id);
|
|
1736
|
+
if (!usable() || live.compactions?.length || inbox.items.some((item) => item.mode !== "write") || (taskId === void 0 ? live.run !== void 0 : live.run?.taskId !== taskId)) return;
|
|
1737
|
+
const entry = await tx.appendEntry(lane.id, {
|
|
1738
|
+
kind: "po.entry",
|
|
1739
|
+
data: json({
|
|
1740
|
+
type: "message",
|
|
1741
|
+
message,
|
|
1742
|
+
timestamp: message.timestamp
|
|
1743
|
+
}),
|
|
1744
|
+
model: convertToLlm([message])
|
|
1745
|
+
});
|
|
1746
|
+
return String(entry.id);
|
|
1747
|
+
}, ctx);
|
|
1748
|
+
});
|
|
1749
|
+
};
|
|
1750
|
+
const appendMessage = (message) => appendEntry({
|
|
1751
|
+
type: "write",
|
|
1752
|
+
entry: {
|
|
1753
|
+
kind: "po.entry",
|
|
1754
|
+
data: json({
|
|
1755
|
+
type: "message",
|
|
1756
|
+
message,
|
|
1757
|
+
timestamp: message.timestamp
|
|
1758
|
+
}),
|
|
1759
|
+
model: convertToLlm([message])
|
|
1760
|
+
}
|
|
1761
|
+
});
|
|
1762
|
+
return {
|
|
1763
|
+
sessionId,
|
|
1764
|
+
sessionFile: storage.sessionFile,
|
|
1765
|
+
laneName,
|
|
1766
|
+
harnessId: options.harnessId ?? `${sessionId}:${laneName}`,
|
|
1767
|
+
session: harness,
|
|
1768
|
+
harness,
|
|
1769
|
+
get lane() {
|
|
1770
|
+
return conversation;
|
|
1771
|
+
},
|
|
1772
|
+
exited,
|
|
1773
|
+
get storageQuarantined() {
|
|
1774
|
+
return quarantined;
|
|
1775
|
+
},
|
|
1776
|
+
completeModel: models.complete?.bind(models),
|
|
1777
|
+
onPresentationFrame(listener) {
|
|
1778
|
+
listeners.add(listener);
|
|
1779
|
+
return () => listeners.delete(listener);
|
|
1780
|
+
},
|
|
1781
|
+
onEvent(listener) {
|
|
1782
|
+
eventListeners.add(listener);
|
|
1783
|
+
return () => eventListeners.delete(listener);
|
|
1784
|
+
},
|
|
1785
|
+
stop() {
|
|
1786
|
+
dispose().catch((error) => emit({
|
|
1787
|
+
type: "error",
|
|
1788
|
+
error: String(error)
|
|
1789
|
+
}));
|
|
1790
|
+
},
|
|
1791
|
+
readEntries,
|
|
1792
|
+
async getContextMessages() {
|
|
1793
|
+
const assertReadable = () => {
|
|
1794
|
+
if (disposed || quarantined) throw new Error("Direct harness context is unavailable", { cause: failure });
|
|
1795
|
+
};
|
|
1796
|
+
assertReadable();
|
|
1797
|
+
const lane = conversation;
|
|
1798
|
+
const view = await lane.context(context);
|
|
1799
|
+
assertReadable();
|
|
1800
|
+
const messages = await restoreCustomContextMessages(view.messages, context, view, lane.id);
|
|
1801
|
+
assertReadable();
|
|
1802
|
+
return structuredClone(messages);
|
|
1803
|
+
},
|
|
1804
|
+
readLifecycle,
|
|
1805
|
+
dispatchCommand,
|
|
1806
|
+
listCommands: () => [...options.listCommands?.() ?? []],
|
|
1807
|
+
async readState() {
|
|
1808
|
+
const lifecycle = await readLifecycle();
|
|
1809
|
+
const agent = await conversation.agent(context);
|
|
1810
|
+
const metadata = await harness.snapshot(SessionMetadataDoc, context);
|
|
1811
|
+
const stats = await getSessionStats();
|
|
1812
|
+
const inbox = await harness.snapshot(InboxDoc, conversation.id, context);
|
|
1813
|
+
const retained = (await readRecord()).queue;
|
|
1814
|
+
const retainedSubmissions = new Set(retained.map((item) => item.submissionId));
|
|
1815
|
+
const nativePending = inbox?.items.filter((item) => item.mode !== "write" && !retainedSubmissions.has(item.id)).length ?? 0;
|
|
1816
|
+
return json({
|
|
1817
|
+
sessionId,
|
|
1818
|
+
sessionFile: storage.sessionFile,
|
|
1819
|
+
sessionName: metadata?.name,
|
|
1820
|
+
model: agent.model ? {
|
|
1821
|
+
provider: agent.model.provider,
|
|
1822
|
+
id: agent.model.modelId
|
|
1823
|
+
} : void 0,
|
|
1824
|
+
thinkingLevel: agent.thinkingLevel,
|
|
1825
|
+
isIdle: !await execution() && !admissionBusy(),
|
|
1826
|
+
isStreaming: lifecycle.operation?.kind === "run",
|
|
1827
|
+
isCompacting: lifecycle.operation?.kind === "compaction",
|
|
1828
|
+
operationId: lifecycle.operation?.id,
|
|
1829
|
+
executionStatus: lifecycle.operation?.status,
|
|
1830
|
+
fastMode,
|
|
1831
|
+
agentLocked,
|
|
1832
|
+
queuePaused: lifecycle.paused,
|
|
1833
|
+
queueRevision: lifecycle.revision,
|
|
1834
|
+
steeringMode: settings.steeringMode ?? "one-at-a-time",
|
|
1835
|
+
followUpMode: settings.followUpMode ?? "one-at-a-time",
|
|
1836
|
+
autoCompactionEnabled: settings.compaction?.enabled ?? true,
|
|
1837
|
+
messageCount: stats.messageCount,
|
|
1838
|
+
pendingMessageCount: retained.filter((item) => item.disposition !== "consumed" && item.disposition !== "removed").length + nativePending + nextTurnMessages.length + deferredInternalCount
|
|
1839
|
+
});
|
|
1840
|
+
},
|
|
1841
|
+
enqueueAutomatic: async (value, images) => {
|
|
1842
|
+
assertUnlocked();
|
|
1843
|
+
const result = await enqueue(value, images, "nextRun", "automatic", true);
|
|
1844
|
+
drain().catch((error) => emit({
|
|
1845
|
+
type: "error",
|
|
1846
|
+
error: String(error)
|
|
1847
|
+
}));
|
|
1848
|
+
return result;
|
|
1849
|
+
},
|
|
1850
|
+
removeQueued,
|
|
1851
|
+
async promoteQueued(id, operationId) {
|
|
1852
|
+
return (await submitUserPrompt("", void 0, {
|
|
1853
|
+
id,
|
|
1854
|
+
operationId
|
|
1855
|
+
}, "steer")).queueOutcome ?? "promoted";
|
|
1856
|
+
},
|
|
1857
|
+
async resumeQueue() {
|
|
1858
|
+
guardUserAdmission();
|
|
1859
|
+
await changeRecord((r) => {
|
|
1860
|
+
r.paused = false;
|
|
1861
|
+
delete r.abortOperationId;
|
|
1862
|
+
delete r.abortTaskId;
|
|
1863
|
+
});
|
|
1864
|
+
await publish();
|
|
1865
|
+
drain().catch((error) => emit({
|
|
1866
|
+
type: "error",
|
|
1867
|
+
error: String(error)
|
|
1868
|
+
}));
|
|
1869
|
+
},
|
|
1870
|
+
recover,
|
|
1871
|
+
async setFastMode(enabled) {
|
|
1872
|
+
if (enabled) {
|
|
1873
|
+
const selected = (await conversation.agent(context)).model;
|
|
1874
|
+
const model = selected ? models.getModel(selected.provider, selected.modelId) : void 0;
|
|
1875
|
+
if (model?.api !== CODEX_API || model.provider !== CODEX_PROVIDER) throw new Error("Fast mode requires an OpenAI Codex model");
|
|
1876
|
+
}
|
|
1877
|
+
await writable(() => harness.commit(async (tx) => {
|
|
1878
|
+
(await tx.doc(FastModeDoc)).enabled = enabled;
|
|
1879
|
+
await tx.appendEntry(conversation.id, {
|
|
1880
|
+
kind: "po.fast-mode",
|
|
1881
|
+
data: {
|
|
1882
|
+
version: 1,
|
|
1883
|
+
enabled,
|
|
1884
|
+
sessionId
|
|
1885
|
+
}
|
|
1886
|
+
});
|
|
1887
|
+
}, context));
|
|
1888
|
+
fastMode = enabled;
|
|
1889
|
+
emit({
|
|
1890
|
+
type: "fast_mode_changed",
|
|
1891
|
+
enabled
|
|
1892
|
+
});
|
|
1893
|
+
},
|
|
1894
|
+
agentLocked: () => agentLocked,
|
|
1895
|
+
async setAgentLock(locked) {
|
|
1896
|
+
if (typeof locked !== "boolean") throw new Error("Agent lock must be a boolean.");
|
|
1897
|
+
await writable(() => harness.commit(async (tx) => {
|
|
1898
|
+
(await tx.doc(AgentLockDoc)).locked = locked;
|
|
1899
|
+
}, context));
|
|
1900
|
+
agentLocked = locked;
|
|
1901
|
+
emit({
|
|
1902
|
+
type: "agent_lock_changed",
|
|
1903
|
+
locked
|
|
1904
|
+
});
|
|
1905
|
+
if (!locked) return;
|
|
1906
|
+
const current = await execution();
|
|
1907
|
+
if (current?.kind === "run") await abort(current.id);
|
|
1908
|
+
},
|
|
1909
|
+
async setModel(model) {
|
|
1910
|
+
const previous = (await conversation.agent(context)).model;
|
|
1911
|
+
if (!models.getModel(model.provider, model.id)) throw new Error(`Model not found: ${model.provider}/${model.id}`);
|
|
1912
|
+
await writable(() => conversation.configure({ model: {
|
|
1913
|
+
provider: model.provider,
|
|
1914
|
+
modelId: model.id
|
|
1915
|
+
} }, context));
|
|
1916
|
+
await deliver({
|
|
1917
|
+
type: "config_update",
|
|
1918
|
+
property: "model",
|
|
1919
|
+
value: {
|
|
1920
|
+
provider: model.provider,
|
|
1921
|
+
modelId: model.id
|
|
1922
|
+
},
|
|
1923
|
+
previous
|
|
1924
|
+
}, context);
|
|
1925
|
+
emit({
|
|
1926
|
+
type: "model_select",
|
|
1927
|
+
model
|
|
1928
|
+
});
|
|
1929
|
+
},
|
|
1930
|
+
availableModels: () => models.getAvailable(),
|
|
1931
|
+
async availableThinkingLevels() {
|
|
1932
|
+
const agent = await conversation.agent(context);
|
|
1933
|
+
const model = agent.model ? models.getModel(agent.model.provider, agent.model.modelId) : void 0;
|
|
1934
|
+
if (!model) throw new Error("No model is selected");
|
|
1935
|
+
return getSupportedThinkingLevels(model);
|
|
1936
|
+
},
|
|
1937
|
+
setThinkingLevel: (level) => writable(() => conversation.configure({ thinkingLevel: level }, context)),
|
|
1938
|
+
async setSteeringMode(mode) {
|
|
1939
|
+
settings = {
|
|
1940
|
+
...settings,
|
|
1941
|
+
steeringMode: mode
|
|
1942
|
+
};
|
|
1943
|
+
},
|
|
1944
|
+
async setFollowUpMode(mode) {
|
|
1945
|
+
settings = {
|
|
1946
|
+
...settings,
|
|
1947
|
+
followUpMode: mode
|
|
1948
|
+
};
|
|
1949
|
+
},
|
|
1950
|
+
navigateTree: (targetId, navigationOptions) => runExternalOperation(async () => {
|
|
1951
|
+
try {
|
|
1952
|
+
const expected = conversation.id;
|
|
1953
|
+
if (targetId !== null && !await storage.storage.entry(conversation.id, nativeId(targetId), context)) throw new Error("Navigation target is not in the selected conversation");
|
|
1954
|
+
const oldTip = (await readEntries()).leafId;
|
|
1955
|
+
await deliver({ type: "navigation_start" }, context);
|
|
1956
|
+
emit({
|
|
1957
|
+
type: "navigation_start",
|
|
1958
|
+
targetId
|
|
1959
|
+
});
|
|
1960
|
+
let summary = navigationOptions?.summary;
|
|
1961
|
+
if (navigationOptions?.summarize === true && summary === void 0) {
|
|
1962
|
+
const selected = (await conversation.agent(context)).model;
|
|
1963
|
+
const model = selected ? models.getModel(selected.provider, selected.modelId) : void 0;
|
|
1964
|
+
if (!model) throw new Error("No model is selected for navigation summary");
|
|
1965
|
+
const instructions = navigationOptions.customInstructions;
|
|
1966
|
+
if (instructions !== void 0 && typeof instructions !== "string") throw new Error("Navigation instructions must be a string");
|
|
1967
|
+
const base = "Summarize this conversation for continuing work on another branch. Include decisions, progress, remaining work, and essential context. Return only the summary.";
|
|
1968
|
+
const messages = [{
|
|
1969
|
+
role: "system",
|
|
1970
|
+
content: navigationOptions.replaceInstructions === true ? instructions ?? base : [base, instructions].filter(Boolean).join("\n\n"),
|
|
1971
|
+
timestamp: Date.now()
|
|
1972
|
+
}, {
|
|
1973
|
+
role: "user",
|
|
1974
|
+
content: JSON.stringify((await conversation.context(context)).messages),
|
|
1975
|
+
timestamp: Date.now()
|
|
1976
|
+
}];
|
|
1977
|
+
await options.beforeModelRequest?.({
|
|
1978
|
+
phase: "request",
|
|
1979
|
+
model,
|
|
1980
|
+
prompt: messages,
|
|
1981
|
+
resources
|
|
1982
|
+
}, context);
|
|
1983
|
+
const summaryContext = withAbortSignal(externalAbort.signal, context);
|
|
1984
|
+
let answer;
|
|
1985
|
+
try {
|
|
1986
|
+
answer = await awaitWithContext(models.complete(model, { messages }, { signal: externalAbort.signal }), summaryContext);
|
|
1987
|
+
} catch (error) {
|
|
1988
|
+
if (externalAbort?.signal.aborted) {
|
|
1989
|
+
await deliver({
|
|
1990
|
+
type: "navigation_end",
|
|
1991
|
+
status: "aborted",
|
|
1992
|
+
tipId: oldTip,
|
|
1993
|
+
fromTipId: oldTip
|
|
1994
|
+
}, context);
|
|
1995
|
+
emit({
|
|
1996
|
+
type: "navigation_end",
|
|
1997
|
+
status: "aborted"
|
|
1998
|
+
});
|
|
1999
|
+
return {
|
|
2000
|
+
cancelled: true,
|
|
2001
|
+
entries: (await readEntries()).entries
|
|
2002
|
+
};
|
|
2003
|
+
}
|
|
2004
|
+
throw error;
|
|
2005
|
+
}
|
|
2006
|
+
if (answer.stopReason === "error" || answer.stopReason === "aborted") throw new Error(answer.errorMessage ?? "Navigation summary failed");
|
|
2007
|
+
summary = text(answer).trim();
|
|
2008
|
+
await recordUsage(answer.usage, { details: { purpose: "branch_summary" } });
|
|
2009
|
+
}
|
|
2010
|
+
if (externalAbort?.signal.aborted) {
|
|
2011
|
+
await deliver({
|
|
2012
|
+
type: "navigation_end",
|
|
2013
|
+
status: "aborted",
|
|
2014
|
+
tipId: oldTip,
|
|
2015
|
+
fromTipId: oldTip
|
|
2016
|
+
}, context);
|
|
2017
|
+
emit({
|
|
2018
|
+
type: "navigation_end",
|
|
2019
|
+
status: "aborted"
|
|
2020
|
+
});
|
|
2021
|
+
return {
|
|
2022
|
+
cancelled: true,
|
|
2023
|
+
entries: (await readEntries()).entries
|
|
2024
|
+
};
|
|
2025
|
+
}
|
|
2026
|
+
if (summary !== void 0 && typeof summary !== "string") throw new Error("Navigation summary must be a string");
|
|
2027
|
+
const id = await navigateDurableConversation(harness, expected, targetId === null ? null : nativeId(targetId), context, typeof summary === "string" ? { summary: {
|
|
2028
|
+
kind: "po.entry",
|
|
2029
|
+
data: {
|
|
2030
|
+
type: "branch_summary",
|
|
2031
|
+
summary,
|
|
2032
|
+
fromId: targetId,
|
|
2033
|
+
fromHook: navigationOptions?.summarize !== true
|
|
2034
|
+
},
|
|
2035
|
+
model: [{
|
|
2036
|
+
role: "user",
|
|
2037
|
+
content: `<branch_summary>\n${summary}\n</branch_summary>`,
|
|
2038
|
+
timestamp: Date.now()
|
|
2039
|
+
}]
|
|
2040
|
+
} } : void 0);
|
|
2041
|
+
const agent = await conversation.agent(context);
|
|
2042
|
+
conversation = await harness.conversation(id, context);
|
|
2043
|
+
if (targetId === null) await conversation.configure({
|
|
2044
|
+
model: agent.model,
|
|
2045
|
+
thinkingLevel: agent.thinkingLevel,
|
|
2046
|
+
cwd: agent.cwd,
|
|
2047
|
+
tools: tools.filter((t) => activeNames.has(t.name)).map(nativeTool),
|
|
2048
|
+
instructions: agent.instructions
|
|
2049
|
+
}, context);
|
|
2050
|
+
await attach();
|
|
2051
|
+
const result = await readEntries();
|
|
2052
|
+
if (typeof navigationOptions?.label === "string" && targetId !== null) await harness.commit(async (tx) => {
|
|
2053
|
+
(await tx.doc(LabelsDoc)).labels[targetId] = navigationOptions.label;
|
|
2054
|
+
}, context);
|
|
2055
|
+
for (const entry of result.entries) if (entry.type === "branch_summary") await deliver({
|
|
2056
|
+
type: "entry_added",
|
|
2057
|
+
entry
|
|
2058
|
+
}, context);
|
|
2059
|
+
const event = {
|
|
2060
|
+
type: "navigation_end",
|
|
2061
|
+
status: "completed",
|
|
2062
|
+
tipId: result.leafId,
|
|
2063
|
+
fromTipId: oldTip
|
|
2064
|
+
};
|
|
2065
|
+
await deliver(event, context);
|
|
2066
|
+
emit({ ...event });
|
|
2067
|
+
return {
|
|
2068
|
+
cancelled: false,
|
|
2069
|
+
entries: result.entries
|
|
2070
|
+
};
|
|
2071
|
+
} catch (error) {
|
|
2072
|
+
await deliver({
|
|
2073
|
+
type: "navigation_end",
|
|
2074
|
+
status: "failed",
|
|
2075
|
+
tipId: null,
|
|
2076
|
+
fromTipId: null,
|
|
2077
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
2078
|
+
}, context);
|
|
2079
|
+
emit({
|
|
2080
|
+
type: "navigation_end",
|
|
2081
|
+
status: "failed",
|
|
2082
|
+
error: String(error)
|
|
2083
|
+
});
|
|
2084
|
+
throw error;
|
|
2085
|
+
}
|
|
2086
|
+
}),
|
|
2087
|
+
async clearQueue() {
|
|
2088
|
+
const selected = (await readRecord()).queue.filter((item) => item.explicitQueue === true && item.disposition !== "consumed" && item.disposition !== "removed");
|
|
2089
|
+
for (const item of selected) await removeQueued(item.id);
|
|
2090
|
+
await publish();
|
|
2091
|
+
return {
|
|
2092
|
+
steering: [],
|
|
2093
|
+
followUp: []
|
|
2094
|
+
};
|
|
2095
|
+
},
|
|
2096
|
+
async setName(name) {
|
|
2097
|
+
await writable(() => harness.commit(async (tx) => {
|
|
2098
|
+
(await tx.doc(SessionMetadataDoc)).name = name;
|
|
2099
|
+
}, context));
|
|
2100
|
+
emit({
|
|
2101
|
+
type: "session_info_changed",
|
|
2102
|
+
name
|
|
2103
|
+
});
|
|
2104
|
+
},
|
|
2105
|
+
getSessionStats,
|
|
2106
|
+
async replaceTools(replacement) {
|
|
2107
|
+
tools = replacement;
|
|
2108
|
+
activeNames = new Set(tools.map((t) => t.name));
|
|
2109
|
+
install();
|
|
2110
|
+
await writable(() => conversation.configure({ tools: tools.map(nativeTool) }, context));
|
|
2111
|
+
},
|
|
2112
|
+
async replaceResources(replacement) {
|
|
2113
|
+
resources = replacement;
|
|
2114
|
+
install();
|
|
2115
|
+
},
|
|
2116
|
+
async readResources() {
|
|
2117
|
+
return resources;
|
|
2118
|
+
},
|
|
2119
|
+
runExternalOperation,
|
|
2120
|
+
appendCustomEntry: async (customType, data) => {
|
|
2121
|
+
const lane = conversation;
|
|
2122
|
+
return String((await writable(() => lane.commit((tx) => tx.appendEntry(lane.id, {
|
|
2123
|
+
kind: customType,
|
|
2124
|
+
...data === void 0 ? {} : { data: json(data) },
|
|
2125
|
+
...options.entryProjectors?.[customType] ? { model: convertToLlm(options.entryProjectors[customType]({
|
|
2126
|
+
type: "custom",
|
|
2127
|
+
id: "",
|
|
2128
|
+
parentId: null,
|
|
2129
|
+
timestamp: Date.now(),
|
|
2130
|
+
seq: 0,
|
|
2131
|
+
customType,
|
|
2132
|
+
...data === void 0 ? {} : { data: json(data) }
|
|
2133
|
+
})) } : {}
|
|
2134
|
+
}), context))).id);
|
|
2135
|
+
},
|
|
2136
|
+
appendMessage,
|
|
2137
|
+
registerCheckpointBoundary(callback) {
|
|
2138
|
+
const registration = {
|
|
2139
|
+
active: true,
|
|
2140
|
+
callback
|
|
2141
|
+
};
|
|
2142
|
+
checkpointBoundaries.add(registration);
|
|
2143
|
+
return {
|
|
2144
|
+
appendMessage: (message) => commitCheckpointMessage(registration, conversation, message, context),
|
|
2145
|
+
dispose() {
|
|
2146
|
+
registration.active = false;
|
|
2147
|
+
checkpointBoundaries.delete(registration);
|
|
2148
|
+
}
|
|
2149
|
+
};
|
|
2150
|
+
},
|
|
2151
|
+
setLabel: (targetId, label) => writable(() => harness.commit(async (tx) => {
|
|
2152
|
+
const labels = (await tx.doc(LabelsDoc)).labels;
|
|
2153
|
+
if (label === void 0) delete labels[targetId];
|
|
2154
|
+
else labels[targetId] = label;
|
|
2155
|
+
}, context)),
|
|
2156
|
+
recordUsage,
|
|
2157
|
+
submitPrompt: admit,
|
|
2158
|
+
submitUserPrompt,
|
|
2159
|
+
prompt: async (value, images) => {
|
|
2160
|
+
await (await admit(value, images)).settled;
|
|
2161
|
+
},
|
|
2162
|
+
admitMessage: (message) => admit(message),
|
|
2163
|
+
submitInternalMessage: async function submitInternalMessage(message, delivery = "steer", requestId = randomUUID()) {
|
|
2164
|
+
if (typeof message !== "string" && message.role !== "user" && message.role !== "custom") throw new Error("Internal input must be user or custom message content");
|
|
2165
|
+
if (delivery === "nextTurn") {
|
|
2166
|
+
nextTurnMessages.push(typeof message === "string" ? {
|
|
2167
|
+
role: "user",
|
|
2168
|
+
content: message,
|
|
2169
|
+
timestamp: Date.now()
|
|
2170
|
+
} : message);
|
|
2171
|
+
return { settled: Promise.resolve() };
|
|
2172
|
+
}
|
|
2173
|
+
const preserved = typeof message === "string" ? {
|
|
2174
|
+
role: "user",
|
|
2175
|
+
content: message,
|
|
2176
|
+
timestamp: Date.now()
|
|
2177
|
+
} : message;
|
|
2178
|
+
if (agentLocked) {
|
|
2179
|
+
await appendMessage(preserved);
|
|
2180
|
+
return { settled: Promise.resolve() };
|
|
2181
|
+
}
|
|
2182
|
+
const deliveryRecord = {
|
|
2183
|
+
message: preserved,
|
|
2184
|
+
conversationId: conversation.id
|
|
2185
|
+
};
|
|
2186
|
+
if (userAdmission) {
|
|
2187
|
+
deferredInternalCount++;
|
|
2188
|
+
admittingInternal.add(requestId);
|
|
2189
|
+
try {
|
|
2190
|
+
await changeRecord((r) => {
|
|
2191
|
+
(r.internalDeliveries ??= {})[requestId] = deliveryRecord;
|
|
2192
|
+
});
|
|
2193
|
+
} catch (error) {
|
|
2194
|
+
deferredInternalCount--;
|
|
2195
|
+
admittingInternal.delete(requestId);
|
|
2196
|
+
throw error;
|
|
2197
|
+
}
|
|
2198
|
+
const settled = userAdmissionSettled.then(async () => {
|
|
2199
|
+
deferredInternalCount--;
|
|
2200
|
+
admittingInternal.delete(requestId);
|
|
2201
|
+
await (await submitInternalMessage(preserved, delivery, requestId)).settled;
|
|
2202
|
+
});
|
|
2203
|
+
settled.catch((error) => emit({
|
|
2204
|
+
type: "error",
|
|
2205
|
+
code: "internal_message",
|
|
2206
|
+
error: String(error)
|
|
2207
|
+
}));
|
|
2208
|
+
return { settled };
|
|
2209
|
+
}
|
|
2210
|
+
if (external) throw new Error("An operation is already running");
|
|
2211
|
+
const content = typeof message === "string" ? message : message.content;
|
|
2212
|
+
const submit = async (draft) => {
|
|
2213
|
+
try {
|
|
2214
|
+
return await writable(() => conversation.submit(draft, context));
|
|
2215
|
+
} catch (error) {
|
|
2216
|
+
const accepted = await storage.storage.submissionByRequest(conversation.id, draft.requestId, context);
|
|
2217
|
+
const submission = accepted && await harness.submission(accepted.id, context);
|
|
2218
|
+
if (!submission) throw error;
|
|
2219
|
+
return submission;
|
|
2220
|
+
}
|
|
2221
|
+
};
|
|
2222
|
+
admittingInternal.add(requestId);
|
|
2223
|
+
let envelope;
|
|
2224
|
+
let submission;
|
|
2225
|
+
try {
|
|
2226
|
+
await changeRecord((r) => {
|
|
2227
|
+
(r.internalDeliveries ??= {})[requestId] = deliveryRecord;
|
|
2228
|
+
});
|
|
2229
|
+
envelope = typeof message !== "string" && message.role === "custom" ? await submit({
|
|
2230
|
+
type: "write",
|
|
2231
|
+
requestId: `${requestId}:message`,
|
|
2232
|
+
entry: {
|
|
2233
|
+
kind: "po.entry",
|
|
2234
|
+
data: json({
|
|
2235
|
+
type: "message",
|
|
2236
|
+
message,
|
|
2237
|
+
timestamp: message.timestamp,
|
|
2238
|
+
inputRequestId: requestId
|
|
2239
|
+
})
|
|
2240
|
+
}
|
|
2241
|
+
}) : void 0;
|
|
2242
|
+
submission = await submit({
|
|
2243
|
+
type: "input",
|
|
2244
|
+
content,
|
|
2245
|
+
whenBusy: delivery,
|
|
2246
|
+
requestId
|
|
2247
|
+
});
|
|
2248
|
+
await changeRecord((r) => {
|
|
2249
|
+
const item = r.internalDeliveries?.[requestId];
|
|
2250
|
+
if (item) item.submissionId = submission.id;
|
|
2251
|
+
});
|
|
2252
|
+
} finally {
|
|
2253
|
+
admittingInternal.delete(requestId);
|
|
2254
|
+
}
|
|
2255
|
+
let pendingDelivery = internalDelivery.get(submission.id);
|
|
2256
|
+
if (!pendingDelivery) {
|
|
2257
|
+
let resolveDelivery;
|
|
2258
|
+
pendingDelivery = {
|
|
2259
|
+
done: new Promise((resolve) => {
|
|
2260
|
+
resolveDelivery = resolve;
|
|
2261
|
+
}),
|
|
2262
|
+
resolve: resolveDelivery
|
|
2263
|
+
};
|
|
2264
|
+
internalDelivery.set(submission.id, pendingDelivery);
|
|
2265
|
+
}
|
|
2266
|
+
if (deliveredInputs.has(submission.id)) pendingDelivery.resolve();
|
|
2267
|
+
const delivered = pendingDelivery.done;
|
|
2268
|
+
const settled = (async () => {
|
|
2269
|
+
try {
|
|
2270
|
+
const status = await submission.wait(context);
|
|
2271
|
+
if (status.status === "unanswered" && status.entry === void 0) {
|
|
2272
|
+
await conversation.waitForIdle(context);
|
|
2273
|
+
await reconcileInternal(requestId, deliveryRecord);
|
|
2274
|
+
}
|
|
2275
|
+
if (envelope && (await envelope.wait(context)).status !== "done") throw new Error("Internal message journal write failed");
|
|
2276
|
+
if (status.status === "done" || status.entry !== void 0) {
|
|
2277
|
+
if (!(await harness.snapshot(LiveDoc, deliveryRecord.conversationId, context))?.run?.inputs.some((id) => String(id) === String(submission.id))) pendingDelivery.resolve();
|
|
2278
|
+
await delivered;
|
|
2279
|
+
}
|
|
2280
|
+
await eventsSettled;
|
|
2281
|
+
await reconcileInternal(requestId, deliveryRecord);
|
|
2282
|
+
} finally {
|
|
2283
|
+
internalDelivery.delete(submission.id);
|
|
2284
|
+
}
|
|
2285
|
+
})();
|
|
2286
|
+
settled.catch((error) => emit({
|
|
2287
|
+
type: "error",
|
|
2288
|
+
code: "internal_message",
|
|
2289
|
+
error: String(error)
|
|
2290
|
+
}));
|
|
2291
|
+
return { settled };
|
|
2292
|
+
},
|
|
2293
|
+
steer: async (message, images) => {
|
|
2294
|
+
if (typeof message !== "string" && message.role !== "user") throw new Error("Only user messages can steer an agent run");
|
|
2295
|
+
await submitUserPrompt(message, images, void 0, "steer");
|
|
2296
|
+
},
|
|
2297
|
+
followUp: (message, images) => queued(message, images, "followUp"),
|
|
2298
|
+
nextRun: (message, images) => queued(message, images, "nextRun"),
|
|
2299
|
+
abort,
|
|
2300
|
+
interrupt,
|
|
2301
|
+
async compact(instructions) {
|
|
2302
|
+
guardUserAdmission();
|
|
2303
|
+
if (external || compactionAdmission) throw new Error("An operation is already running");
|
|
2304
|
+
compactionAdmission = true;
|
|
2305
|
+
const previous = settings;
|
|
2306
|
+
try {
|
|
2307
|
+
if (await execution()) throw new Error("An operation is already running");
|
|
2308
|
+
settings = {
|
|
2309
|
+
...settings,
|
|
2310
|
+
compaction: {
|
|
2311
|
+
...settings.compaction,
|
|
2312
|
+
keepRecentTokens: 0
|
|
2313
|
+
}
|
|
2314
|
+
};
|
|
2315
|
+
const task = await writable(() => conversation.compact(instructions, context));
|
|
2316
|
+
const receipt = await harness.waitForTask(task, context);
|
|
2317
|
+
await eventsSettled;
|
|
2318
|
+
if ([
|
|
2319
|
+
"failed",
|
|
2320
|
+
"faulted",
|
|
2321
|
+
"orphaned"
|
|
2322
|
+
].includes(receipt.state.outcome.status)) throw new Error("Compaction failed");
|
|
2323
|
+
} finally {
|
|
2324
|
+
settings = previous;
|
|
2325
|
+
compactionAdmission = false;
|
|
2326
|
+
}
|
|
2327
|
+
},
|
|
2328
|
+
async admitResume() {
|
|
2329
|
+
await recover();
|
|
2330
|
+
const resumed = !!await execution();
|
|
2331
|
+
harness.resume();
|
|
2332
|
+
const settled = (async () => {
|
|
2333
|
+
await conversation.waitForIdle(context);
|
|
2334
|
+
await eventsSettled;
|
|
2335
|
+
await drain();
|
|
2336
|
+
})();
|
|
2337
|
+
settled.catch((error) => emit({
|
|
2338
|
+
type: "error",
|
|
2339
|
+
code: "resume",
|
|
2340
|
+
error: String(error)
|
|
2341
|
+
}));
|
|
2342
|
+
return {
|
|
2343
|
+
resumed,
|
|
2344
|
+
settled
|
|
2345
|
+
};
|
|
2346
|
+
},
|
|
2347
|
+
async resume() {
|
|
2348
|
+
await recover();
|
|
2349
|
+
const resumed = !!await execution();
|
|
2350
|
+
harness.resume();
|
|
2351
|
+
if (resumed) {
|
|
2352
|
+
await conversation.waitForIdle(context);
|
|
2353
|
+
await eventsSettled;
|
|
2354
|
+
}
|
|
2355
|
+
drain().catch((error) => emit({
|
|
2356
|
+
type: "error",
|
|
2357
|
+
error: String(error)
|
|
2358
|
+
}));
|
|
2359
|
+
return resumed;
|
|
2360
|
+
},
|
|
2361
|
+
dispose
|
|
2362
|
+
};
|
|
2363
|
+
} catch (error) {
|
|
2364
|
+
const failures = [error];
|
|
2365
|
+
try {
|
|
2366
|
+
if (startupHarness) await startupHarness.close(context);
|
|
2367
|
+
else await storage.storage.close(context);
|
|
2368
|
+
} catch (closeError) {
|
|
2369
|
+
failures.push(closeError);
|
|
2370
|
+
}
|
|
2371
|
+
if (failures.length === 1) try {
|
|
2372
|
+
await storage.repository?.close(context);
|
|
2373
|
+
await storage.historyLease?.release();
|
|
2374
|
+
} catch (closeError) {
|
|
2375
|
+
failures.push(closeError);
|
|
2376
|
+
}
|
|
2377
|
+
if (failures.length > 1) throw new AggregateError(failures, "Direct harness startup and cleanup failed");
|
|
2378
|
+
throw error;
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
//#endregion
|
|
2382
|
+
export { AGENT_SETTLED_ENTRY_TYPE, createDirectHarnessRuntime, projectDurableConversationEntries, promptForAssistantText };
|
|
2383
|
+
|
|
2384
|
+
//# sourceMappingURL=directHarnessRuntime.mjs.map
|