@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/sessionMcpAuthorization/index.ts"],"sourcesContent":["import { createHash, createHmac, randomBytes, randomInt, timingSafeEqual } from 'node:crypto';\n\nconst ACCESS_TOKEN_TTL_MS = 15 * 60_000;\nconst AUTHORIZATION_CODE_TTL_MS = 5 * 60_000;\nconst CLIENT_ID_BYTES = 18;\nconst CLIENT_SECRET_BYTES = 32;\nconst DEFAULT_MAX_RECORDS = 10_000;\nconst GRANT_ID_BYTES = 18;\nconst REFRESH_TOKEN_TTL_MS = 30 * 24 * 60 * 60_000;\nconst TOKEN_BYTES = 32;\nconst URL_TOKEN_HEADER = Buffer.from('{\"alg\":\"HS256\",\"typ\":\"JWT\"}').toString('base64url');\nconst URL_TOKEN_ISSUER = 'po-session-mcp';\nconst URL_TOKEN_MAX_LENGTH = 4096;\n\nexport type SessionMcpOAuthErrorCode =\n | 'invalid_client'\n | 'invalid_grant'\n | 'invalid_request'\n | 'unsupported_grant_type';\n\nexport class SessionMcpOAuthError extends Error {\n readonly code: SessionMcpOAuthErrorCode;\n\n constructor(code: SessionMcpOAuthErrorCode, message: string) {\n super(message);\n this.name = 'SessionMcpOAuthError';\n this.code = code;\n }\n}\n\nexport type SessionMcpScope = 'restricted' | 'session';\nexport type SessionMcpRouting = 'conversation';\n\n/**\n * Conversation routing is mandatory. Legacy registrations are migrated at read time\n * so they cannot continue to share their parent runtime.\n */\nexport function sessionMcpRouting(value: unknown): SessionMcpRouting {\n if (value === undefined || value === 'session' || value === 'conversation') return 'conversation';\n throw new SessionMcpOAuthError('invalid_request', 'Session MCP routing is not supported.');\n}\n\nconst SESSION_MCP_TOOL_PREFIX_MAX_LENGTH = 24;\nconst SESSION_MCP_TOOL_PREFIX = /^[a-z0-9]+(?:_[a-z0-9]+)*$/u;\nconst FALLBACK_TOOL_PREFIXES = Object.freeze([\n 'alba',\n 'bruno',\n 'cora',\n 'dex',\n 'elio',\n 'fern',\n 'gus',\n 'hana',\n 'ivo',\n 'juno',\n 'kai',\n 'lena',\n 'milo',\n 'nora',\n 'otto',\n 'pia',\n]);\n\n/**\n * Remote tool names are `${prefix}_${name}`. The prefix keeps them distinct from\n * the remote agent's native tools and stays inside OpenAI and MCP name rules.\n */\nexport function sessionMcpToolPrefix(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n if (\n typeof value !== 'string' ||\n value.length > SESSION_MCP_TOOL_PREFIX_MAX_LENGTH ||\n !SESSION_MCP_TOOL_PREFIX.test(value)\n ) {\n throw new SessionMcpOAuthError(\n 'invalid_request',\n `Tool prefix must be 1 to ${SESSION_MCP_TOOL_PREFIX_MAX_LENGTH} lowercase letters or digits, joined by single underscores.`,\n );\n }\n return value;\n}\n\n/** Normalized session name, or a random readable word when the name is empty or the CLI default. */\nexport function defaultSessionMcpToolPrefix(sessionName: string): string {\n const prefix = sessionName\n .normalize('NFKD')\n .replace(/\\p{M}/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, '_')\n .replace(/^_+|_+$/gu, '')\n .slice(0, SESSION_MCP_TOOL_PREFIX_MAX_LENGTH)\n .replace(/_+$/u, '');\n if (prefix !== '' && prefix !== 'untitled') return prefix;\n return FALLBACK_TOOL_PREFIXES[randomInt(FALLBACK_TOOL_PREFIXES.length)]!;\n}\n\nexport interface SessionMcpClient {\n readonly clientId: string;\n readonly name: string;\n readonly redirectUri: string;\n readonly tokenEndpointAuthMethod: 'client_secret_post' | 'api_key' | 'url_token';\n readonly createdAt: number;\n}\n\nexport interface CreatedSessionMcpClient extends SessionMcpClient {\n /** Returned once. Only a SHA-256 digest is retained by the service. */\n readonly clientSecret: string;\n}\n\nexport interface SessionMcpAuthorizationBinding {\n readonly clientId: string;\n readonly sessionId: string;\n readonly sessionGeneration: number;\n readonly audience: string;\n readonly scope: SessionMcpScope;\n /** Always conversation. Legacy persisted values are normalized at read time. */\n readonly routing?: SessionMcpRouting;\n readonly tools: readonly string[];\n readonly skills: readonly string[];\n /** Fixed at creation. Absent on legacy registrations, which keep bare tool names. */\n readonly toolPrefix?: string;\n}\n\nexport type CreateSessionMcpAuthorizationBindingInput = Omit<\n SessionMcpAuthorizationBinding,\n 'scope' | 'tools' | 'skills'\n> &\n (\n | { readonly scope: 'session'; readonly tools?: never; readonly skills?: never }\n | { readonly scope?: 'restricted'; readonly tools: readonly string[]; readonly skills: readonly string[] }\n );\n\nexport interface SessionMcpGrant extends SessionMcpAuthorizationBinding {\n readonly id: string;\n readonly createdAt: number;\n}\n\nexport interface SessionMcpAccessGrant extends SessionMcpGrant {\n readonly expiresAt: number;\n}\n\nexport interface SessionMcpTokenResponse {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly tokenType: 'Bearer';\n readonly expiresIn: number;\n readonly grant: SessionMcpGrant;\n}\n\nexport interface SessionMcpAuthorizationServiceOptions {\n readonly now?: () => number;\n readonly authorizationCodeTtlMs?: number;\n readonly accessTokenTtlMs?: number;\n readonly refreshTokenTtlMs?: number;\n /** Maximum combined authorization codes, grants, tokens, and refresh-token tombstones. */\n readonly maxRecords?: number;\n}\n\nexport type CreateSessionMcpClientInput =\n | { readonly name: string; readonly redirectUri: string; readonly authMethod?: 'oauth' }\n | { readonly name: string; readonly authMethod: 'api_key' | 'url_token'; readonly redirectUri?: never };\n\nexport interface IssueSessionMcpAuthorizationCodeInput {\n readonly clientId: string;\n readonly redirectUri: string;\n readonly codeChallenge: string;\n readonly codeChallengeMethod: 'S256';\n}\n\nexport type SessionMcpTokenRequest =\n | {\n readonly grantType: 'authorization_code';\n readonly clientId: string;\n readonly clientSecret: string;\n readonly code: string;\n readonly redirectUri: string;\n readonly codeVerifier: string;\n }\n | {\n readonly grantType: 'refresh_token';\n readonly clientId: string;\n readonly clientSecret: string;\n readonly refreshToken: string;\n };\n\nexport interface SessionMcpAuthorizationCode {\n readonly code: string;\n readonly grant: SessionMcpGrant;\n readonly expiresAt: number;\n}\n\nexport interface SessionMcpPersistentRegistration {\n readonly client: SessionMcpClient;\n readonly secretHash: string;\n readonly workspaceId: string;\n readonly binding: Omit<SessionMcpAuthorizationBinding, 'sessionGeneration'>;\n readonly verifiedAt: number;\n}\n\nexport interface SessionMcpAuthorizationService {\n createClient(input: CreateSessionMcpClientInput): CreatedSessionMcpClient;\n readClient(clientId: string): SessionMcpClient | undefined;\n listClients(): readonly SessionMcpClient[];\n revokeClient(clientId: string): boolean;\n createAuthorizationBinding(input: CreateSessionMcpAuthorizationBindingInput): SessionMcpAuthorizationBinding;\n readAuthorizationBinding(clientId: string): SessionMcpAuthorizationBinding | undefined;\n persistentRegistration(\n clientId: string,\n workspaceId: string,\n verifiedAt: number,\n ): SessionMcpPersistentRegistration | undefined;\n restorePersistentRegistration(registration: SessionMcpPersistentRegistration, sessionGeneration: number): boolean;\n issueAuthorizationCode(input: IssueSessionMcpAuthorizationCodeInput): SessionMcpAuthorizationCode;\n exchangeToken(request: SessionMcpTokenRequest): SessionMcpTokenResponse;\n issueUrlToken(clientId: string): string;\n authenticateUrlToken(token: string, audience: string): SessionMcpAccessGrant | undefined;\n authenticateAccessToken(token: string, audience: string): SessionMcpAccessGrant | undefined;\n revokeGrant(grantId: string): boolean;\n revokeSessionGeneration(sessionId: string, sessionGeneration: number): number;\n revokeSession(sessionId: string): number;\n}\n\ninterface StoredClient extends SessionMcpClient {\n readonly secretHash: Buffer;\n}\n\ninterface StoredCode {\n readonly clientId: string;\n readonly redirectUri: string;\n readonly challenge: string;\n readonly grant: SessionMcpGrant;\n readonly expiresAt: number;\n}\n\ninterface StoredAccessToken {\n readonly grant: SessionMcpGrant;\n readonly familyId: string;\n readonly expiresAt: number;\n}\n\ninterface StoredRefreshToken extends StoredAccessToken {\n readonly familyExpiresAt: number;\n}\n\ninterface ConsumedRefreshToken {\n readonly clientId: string;\n readonly grantId: string;\n readonly familyId: string;\n readonly expiresAt: number;\n}\n\nfunction digest(value: string): Buffer {\n return createHash('sha256').update(value).digest();\n}\n\nfunction tokenKey(value: string): string {\n return digest(value).toString('hex');\n}\n\nfunction opaque(bytes = TOKEN_BYTES): string {\n return randomBytes(bytes).toString('base64url');\n}\n\nfunction exactSecret(actual: string, expectedHash: Buffer): boolean {\n return timingSafeEqual(digest(actual), expectedHash);\n}\n\ninterface SessionMcpUrlTokenClaims {\n readonly aud: string;\n readonly iat: number;\n readonly iss: typeof URL_TOKEN_ISSUER;\n readonly sid: string;\n readonly sub: string;\n}\n\nfunction urlTokenSignature(input: string, key: Buffer): Buffer {\n return createHmac('sha256', key).update(input).digest();\n}\n\nfunction parseUrlToken(\n token: string,\n): { readonly claims: SessionMcpUrlTokenClaims; readonly input: string; readonly signature: Buffer } | undefined {\n if (token.length > URL_TOKEN_MAX_LENGTH) return undefined;\n const parts = token.split('.');\n if (parts.length !== 3) return undefined;\n const [header, payload, encodedSignature] = parts;\n if (\n header !== URL_TOKEN_HEADER ||\n !/^[A-Za-z0-9_-]{1,2048}$/u.test(payload!) ||\n !/^[A-Za-z0-9_-]{43}$/u.test(encodedSignature!)\n )\n return undefined;\n try {\n const payloadBytes = Buffer.from(payload!, 'base64url');\n const signature = Buffer.from(encodedSignature!, 'base64url');\n if (\n payloadBytes.toString('base64url') !== payload ||\n signature.length !== 32 ||\n signature.toString('base64url') !== encodedSignature\n )\n return undefined;\n const value: unknown = JSON.parse(payloadBytes.toString('utf8'));\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n const claims = value as Partial<SessionMcpUrlTokenClaims>;\n if (\n Object.keys(value).sort().join(',') !== 'aud,iat,iss,sid,sub' ||\n claims.iss !== URL_TOKEN_ISSUER ||\n typeof claims.sub !== 'string' ||\n claims.sub === '' ||\n typeof claims.sid !== 'string' ||\n claims.sid === '' ||\n typeof claims.aud !== 'string' ||\n claims.aud === '' ||\n typeof claims.iat !== 'number' ||\n !Number.isSafeInteger(claims.iat)\n )\n return undefined;\n return { claims: claims as SessionMcpUrlTokenClaims, input: `${header}.${payload}`, signature };\n } catch {\n return undefined;\n }\n}\n\nfunction requireHttpsUrl(value: string, label: string, allowQuery: boolean): string {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n throw new SessionMcpOAuthError('invalid_request', `${label} must be an absolute HTTPS URL.`);\n }\n if (\n parsed.protocol !== 'https:' ||\n parsed.username !== '' ||\n parsed.password !== '' ||\n parsed.hash !== '' ||\n (!allowQuery && parsed.search !== '')\n ) {\n throw new SessionMcpOAuthError(\n 'invalid_request',\n `${label} must be an absolute HTTPS URL without credentials, a query, or a fragment.`,\n );\n }\n return parsed.href;\n}\n\nfunction requireName(value: string, label: string): string {\n const normalized = value.trim();\n if (normalized === '') throw new SessionMcpOAuthError('invalid_request', `${label} must not be empty.`);\n return normalized;\n}\n\nfunction exactUniqueGrants(values: readonly string[], label: string): readonly string[] {\n if (values.some((value) => value === '' || value !== value.trim())) {\n throw new SessionMcpOAuthError('invalid_request', `${label} grants must contain exact non-empty names.`);\n }\n return Object.freeze([...new Set(values)]);\n}\n\n/** In-memory restricted OAuth authority. It intentionally has no discovery or client registration surface. */\nexport function createSessionMcpAuthorizationService(\n options: SessionMcpAuthorizationServiceOptions = {},\n): SessionMcpAuthorizationService {\n const now = options.now ?? Date.now;\n const codeTtl = options.authorizationCodeTtlMs ?? AUTHORIZATION_CODE_TTL_MS;\n const accessTtl = options.accessTokenTtlMs ?? ACCESS_TOKEN_TTL_MS;\n const refreshTtl = options.refreshTokenTtlMs ?? REFRESH_TOKEN_TTL_MS;\n const maxRecords = options.maxRecords ?? DEFAULT_MAX_RECORDS;\n if (!Number.isSafeInteger(maxRecords) || maxRecords < 3) {\n throw new Error('Session MCP authorization maxRecords must be a safe integer of at least 3.');\n }\n\n const clients = new Map<string, StoredClient>();\n const bindings = new Map<string, SessionMcpAuthorizationBinding>();\n const grants = new Map<string, SessionMcpGrant>();\n const codes = new Map<string, StoredCode>();\n const accessTokens = new Map<string, StoredAccessToken>();\n const refreshTokens = new Map<string, StoredRefreshToken>();\n const consumedRefreshTokens = new Map<string, ConsumedRefreshToken>();\n\n const publicClient = ({ secretHash: _secretHash, ...client }: StoredClient): SessionMcpClient => client;\n\n const recordCount = (): number =>\n grants.size + codes.size + accessTokens.size + refreshTokens.size + consumedRefreshTokens.size;\n\n const sweep = (): void => {\n const currentTime = now();\n for (const [key, value] of codes) if (value.expiresAt <= currentTime) codes.delete(key);\n for (const [key, value] of accessTokens) if (value.expiresAt <= currentTime) accessTokens.delete(key);\n for (const [key, value] of refreshTokens) if (value.expiresAt <= currentTime) refreshTokens.delete(key);\n for (const [key, value] of consumedRefreshTokens) {\n if (value.expiresAt <= currentTime) consumedRefreshTokens.delete(key);\n }\n\n const referencedGrants = new Set<string>();\n for (const value of codes.values()) referencedGrants.add(value.grant.id);\n for (const value of accessTokens.values()) referencedGrants.add(value.grant.id);\n for (const value of refreshTokens.values()) referencedGrants.add(value.grant.id);\n for (const value of consumedRefreshTokens.values()) referencedGrants.add(value.grantId);\n for (const grantId of grants.keys()) if (!referencedGrants.has(grantId)) grants.delete(grantId);\n };\n\n const requireCapacity = (additionalRecords: number): void => {\n sweep();\n if (recordCount() + additionalRecords > maxRecords) {\n throw new SessionMcpOAuthError('invalid_request', 'The authorization service is at capacity.');\n }\n };\n\n const authenticateClient = (clientId: string, clientSecret: string): StoredClient => {\n const client = clients.get(clientId);\n if (client === undefined || !exactSecret(clientSecret, client.secretHash)) {\n throw new SessionMcpOAuthError('invalid_client', 'Client authentication failed.');\n }\n return client;\n };\n\n const revokeGrant = (grantId: string): boolean => {\n if (!grants.delete(grantId)) return false;\n for (const [key, value] of codes) if (value.grant.id === grantId) codes.delete(key);\n for (const [key, value] of accessTokens) if (value.grant.id === grantId) accessTokens.delete(key);\n for (const [key, value] of refreshTokens) if (value.grant.id === grantId) refreshTokens.delete(key);\n return true;\n };\n\n const revokeFamily = (familyId: string, grantId: string): void => {\n revokeGrant(grantId);\n for (const [key, value] of accessTokens) if (value.familyId === familyId) accessTokens.delete(key);\n for (const [key, value] of refreshTokens) if (value.familyId === familyId) refreshTokens.delete(key);\n };\n\n const mintTokens = (\n grant: SessionMcpGrant,\n familyId = opaque(GRANT_ID_BYTES),\n familyExpiresAt = now() + refreshTtl,\n ): SessionMcpTokenResponse => {\n const issuedAt = now();\n const accessExpiresAt = Math.min(issuedAt + accessTtl, familyExpiresAt);\n const accessToken = opaque();\n const refreshToken = opaque();\n accessTokens.set(tokenKey(accessToken), { grant, familyId, expiresAt: accessExpiresAt });\n refreshTokens.set(tokenKey(refreshToken), {\n grant,\n familyId,\n expiresAt: familyExpiresAt,\n familyExpiresAt,\n });\n return {\n accessToken,\n refreshToken,\n tokenType: 'Bearer',\n expiresIn: Math.max(0, Math.floor((accessExpiresAt - issuedAt) / 1000)),\n grant,\n };\n };\n\n return {\n createClient(input) {\n const createdAt = now();\n const clientId = opaque(CLIENT_ID_BYTES);\n const clientSecret = opaque(CLIENT_SECRET_BYTES);\n const urlCredential = input.authMethod === 'url_token';\n const headerCredential = input.authMethod === 'api_key';\n let redirectUri = '';\n if (!urlCredential && !headerCredential) {\n if (typeof input.redirectUri !== 'string') {\n throw new SessionMcpOAuthError('invalid_request', 'Redirect URI must be an absolute HTTPS URL.');\n }\n redirectUri = requireHttpsUrl(input.redirectUri, 'Redirect URI', true);\n }\n const client: StoredClient = {\n clientId,\n name: requireName(input.name, 'Client name'),\n redirectUri,\n tokenEndpointAuthMethod: urlCredential ? 'url_token' : headerCredential ? 'api_key' : 'client_secret_post',\n createdAt,\n secretHash: digest(clientSecret),\n };\n clients.set(clientId, client);\n return { ...publicClient(client), clientSecret };\n },\n readClient(clientId) {\n const client = clients.get(clientId);\n return client === undefined ? undefined : publicClient(client);\n },\n listClients() {\n return [...clients.values()].map(publicClient);\n },\n revokeClient(clientId) {\n if (!clients.delete(clientId)) return false;\n bindings.delete(clientId);\n for (const grant of grants.values()) if (grant.clientId === clientId) revokeGrant(grant.id);\n return true;\n },\n createAuthorizationBinding(input) {\n if (!clients.has(input.clientId)) throw new SessionMcpOAuthError('invalid_client', 'Unknown local client.');\n if (bindings.has(input.clientId)) {\n throw new SessionMcpOAuthError('invalid_request', 'Client authorization is already bound.');\n }\n if (!Number.isSafeInteger(input.sessionGeneration) || input.sessionGeneration < 0) {\n throw new SessionMcpOAuthError('invalid_request', 'Session generation must be a non-negative safe integer.');\n }\n const routing = sessionMcpRouting(input.routing);\n const scope = input.scope ?? 'restricted';\n if (scope !== 'session' && scope !== 'restricted') {\n throw new SessionMcpOAuthError('invalid_request', 'Authorization scope is not supported.');\n }\n let tools: readonly string[];\n let skills: readonly string[];\n if (scope === 'session') {\n if (input.tools !== undefined || input.skills !== undefined) {\n throw new SessionMcpOAuthError('invalid_request', 'Session scope cannot include capability grants.');\n }\n tools = Object.freeze([] as string[]);\n skills = Object.freeze([] as string[]);\n } else {\n if (!Array.isArray(input.tools) || !Array.isArray(input.skills)) {\n throw new SessionMcpOAuthError('invalid_request', 'Restricted scope requires tool and skill grants.');\n }\n tools = exactUniqueGrants(input.tools, 'Tool');\n skills = exactUniqueGrants(input.skills, 'Skill');\n }\n const toolPrefix = sessionMcpToolPrefix(input.toolPrefix);\n const binding: SessionMcpAuthorizationBinding = Object.freeze({\n clientId: input.clientId,\n sessionId: requireName(input.sessionId, 'Session ID'),\n sessionGeneration: input.sessionGeneration,\n audience: requireHttpsUrl(input.audience, 'Audience', false),\n scope,\n routing,\n tools,\n skills,\n ...(toolPrefix === undefined ? {} : { toolPrefix }),\n });\n bindings.set(input.clientId, binding);\n return binding;\n },\n readAuthorizationBinding(clientId) {\n return bindings.get(clientId);\n },\n persistentRegistration(clientId, workspaceId, verifiedAt) {\n const client = clients.get(clientId);\n const binding = bindings.get(clientId);\n if (client === undefined || binding === undefined || !Number.isSafeInteger(verifiedAt)) return undefined;\n const { sessionGeneration: _sessionGeneration, ...persistentBinding } = binding;\n return {\n client: publicClient(client),\n secretHash: client.secretHash.toString('hex'),\n workspaceId: requireName(workspaceId, 'Workspace ID'),\n binding: persistentBinding,\n verifiedAt,\n };\n },\n restorePersistentRegistration(registration, sessionGeneration) {\n if (\n bindings.has(registration.client.clientId) ||\n !/^[a-f0-9]{64}$/u.test(registration.secretHash) ||\n !Number.isSafeInteger(sessionGeneration) ||\n sessionGeneration < 0 ||\n registration.client.clientId !== registration.binding.clientId\n )\n return false;\n try {\n // Restarting a runtime revokes its binding, not its durable client registration.\n const held = clients.get(registration.client.clientId);\n if (\n held &&\n (held.redirectUri !== registration.client.redirectUri ||\n held.tokenEndpointAuthMethod !== registration.client.tokenEndpointAuthMethod ||\n !timingSafeEqual(held.secretHash, Buffer.from(registration.secretHash, 'hex')))\n )\n return false;\n if (\n (registration.client.tokenEndpointAuthMethod !== 'client_secret_post' &&\n registration.client.tokenEndpointAuthMethod !== 'api_key' &&\n registration.client.tokenEndpointAuthMethod !== 'url_token') ||\n (registration.client.tokenEndpointAuthMethod !== 'client_secret_post' &&\n (registration.client.redirectUri !== '' || registration.binding.scope !== 'session'))\n )\n return false;\n const client: StoredClient = {\n clientId: requireName(registration.client.clientId, 'Client ID'),\n name: requireName(registration.client.name, 'Client name'),\n redirectUri:\n registration.client.tokenEndpointAuthMethod === 'client_secret_post'\n ? requireHttpsUrl(registration.client.redirectUri, 'Redirect URI', true)\n : registration.client.redirectUri,\n tokenEndpointAuthMethod: registration.client.tokenEndpointAuthMethod,\n createdAt: registration.client.createdAt,\n secretHash: Buffer.from(registration.secretHash, 'hex'),\n };\n const routing = sessionMcpRouting(registration.binding.routing);\n const toolPrefix = sessionMcpToolPrefix(registration.binding.toolPrefix);\n const scope = registration.binding.scope;\n const tools =\n scope === 'session' ? Object.freeze([] as string[]) : exactUniqueGrants(registration.binding.tools, 'Tool');\n const skills =\n scope === 'session' ? Object.freeze([] as string[]) : exactUniqueGrants(registration.binding.skills, 'Skill');\n if (\n (scope !== 'session' && scope !== 'restricted') ||\n (scope === 'session' && (registration.binding.tools.length !== 0 || registration.binding.skills.length !== 0))\n ) {\n throw new SessionMcpOAuthError('invalid_request', 'Stored Session MCP authorization is invalid.');\n }\n clients.set(client.clientId, client);\n bindings.set(\n client.clientId,\n Object.freeze({\n clientId: client.clientId,\n sessionId: requireName(registration.binding.sessionId, 'Session ID'),\n sessionGeneration,\n audience: requireHttpsUrl(registration.binding.audience, 'Audience', false),\n scope,\n routing,\n tools,\n skills,\n ...(toolPrefix === undefined ? {} : { toolPrefix }),\n }),\n );\n return true;\n } catch {\n clients.delete(registration.client.clientId);\n return false;\n }\n },\n issueAuthorizationCode(input) {\n const client = clients.get(input.clientId);\n if (client === undefined) throw new SessionMcpOAuthError('invalid_client', 'Unknown local client.');\n const binding = bindings.get(input.clientId);\n if (binding === undefined) {\n throw new SessionMcpOAuthError('invalid_request', 'Client authorization has not been preauthorized.');\n }\n if (client.tokenEndpointAuthMethod !== 'client_secret_post') {\n throw new SessionMcpOAuthError('invalid_client', 'This client does not support OAuth authorization.');\n }\n if (input.redirectUri !== client.redirectUri) {\n throw new SessionMcpOAuthError(\n 'invalid_request',\n 'Redirect URI does not exactly match the registered callback.',\n );\n }\n if (input.codeChallengeMethod !== 'S256' || !/^[A-Za-z0-9_-]{43}$/u.test(input.codeChallenge)) {\n throw new SessionMcpOAuthError('invalid_request', 'A valid S256 PKCE challenge is required.');\n }\n requireCapacity(2);\n const issuedAt = now();\n const grant: SessionMcpGrant = Object.freeze({\n id: opaque(GRANT_ID_BYTES),\n ...binding,\n createdAt: issuedAt,\n });\n const code = opaque();\n const expiresAt = issuedAt + codeTtl;\n grants.set(grant.id, grant);\n codes.set(tokenKey(code), {\n clientId: client.clientId,\n redirectUri: client.redirectUri,\n challenge: input.codeChallenge,\n grant,\n expiresAt,\n });\n return { code, grant, expiresAt };\n },\n exchangeToken(request) {\n const client = authenticateClient(request.clientId, request.clientSecret);\n if (client.tokenEndpointAuthMethod !== 'client_secret_post') {\n throw new SessionMcpOAuthError('invalid_client', 'This client does not support OAuth tokens.');\n }\n sweep();\n if (request.grantType === 'authorization_code') {\n const codeKey = tokenKey(request.code);\n const stored = codes.get(codeKey);\n if (\n stored === undefined ||\n stored.expiresAt <= now() ||\n stored.clientId !== request.clientId ||\n stored.redirectUri !== request.redirectUri ||\n !/^[A-Za-z0-9\\-._~]{43,128}$/u.test(request.codeVerifier) ||\n createHash('sha256').update(request.codeVerifier).digest('base64url') !== stored.challenge ||\n !grants.has(stored.grant.id)\n ) {\n codes.delete(codeKey);\n if (stored !== undefined) revokeGrant(stored.grant.id);\n throw new SessionMcpOAuthError('invalid_grant', 'Authorization code is invalid or expired.');\n }\n requireCapacity(1);\n codes.delete(codeKey);\n return mintTokens(stored.grant);\n }\n if (request.grantType === 'refresh_token') {\n const refreshKey = tokenKey(request.refreshToken);\n const replayed = consumedRefreshTokens.get(refreshKey);\n if (replayed !== undefined) {\n if (replayed.clientId === request.clientId && replayed.expiresAt > now()) {\n revokeFamily(replayed.familyId, replayed.grantId);\n }\n throw new SessionMcpOAuthError('invalid_grant', 'Refresh token is invalid or expired.');\n }\n const stored = refreshTokens.get(refreshKey);\n if (\n stored === undefined ||\n stored.expiresAt <= now() ||\n stored.grant.clientId !== request.clientId ||\n !grants.has(stored.grant.id)\n ) {\n refreshTokens.delete(refreshKey);\n throw new SessionMcpOAuthError('invalid_grant', 'Refresh token is invalid or expired.');\n }\n requireCapacity(2);\n refreshTokens.delete(refreshKey);\n consumedRefreshTokens.set(refreshKey, {\n clientId: stored.grant.clientId,\n grantId: stored.grant.id,\n familyId: stored.familyId,\n expiresAt: stored.familyExpiresAt,\n });\n return mintTokens(stored.grant, stored.familyId, stored.familyExpiresAt);\n }\n throw new SessionMcpOAuthError(\n 'unsupported_grant_type',\n 'Only authorization_code and refresh_token are supported.',\n );\n },\n issueUrlToken(clientId) {\n const client = clients.get(clientId);\n if (client === undefined || client.tokenEndpointAuthMethod !== 'url_token') {\n throw new SessionMcpOAuthError('invalid_client', 'This client does not support signed MCP URLs.');\n }\n const binding = bindings.get(clientId);\n if (binding === undefined) {\n throw new SessionMcpOAuthError('invalid_request', 'Client authorization has not been preauthorized.');\n }\n const payload = Buffer.from(\n JSON.stringify({\n aud: binding.audience,\n iat: Math.floor(client.createdAt / 1000),\n iss: URL_TOKEN_ISSUER,\n sid: binding.sessionId,\n sub: client.clientId,\n } satisfies SessionMcpUrlTokenClaims),\n ).toString('base64url');\n const input = `${URL_TOKEN_HEADER}.${payload}`;\n return `${input}.${urlTokenSignature(input, client.secretHash).toString('base64url')}`;\n },\n authenticateUrlToken(token, audience) {\n const parsed = parseUrlToken(token);\n if (parsed === undefined) return undefined;\n const client = clients.get(parsed.claims.sub);\n if (client === undefined || client.tokenEndpointAuthMethod !== 'url_token') return undefined;\n const binding = bindings.get(client.clientId);\n if (\n binding === undefined ||\n binding.audience !== audience ||\n parsed.claims.aud !== audience ||\n parsed.claims.sid !== binding.sessionId ||\n parsed.claims.iat !== Math.floor(client.createdAt / 1000)\n )\n return undefined;\n const expected = urlTokenSignature(parsed.input, client.secretHash);\n if (!timingSafeEqual(expected, parsed.signature)) return undefined;\n return { id: client.clientId, ...binding, createdAt: client.createdAt, expiresAt: Number.MAX_SAFE_INTEGER };\n },\n authenticateAccessToken(token, audience) {\n sweep();\n const key = tokenKey(token);\n // API keys are long-lived credentials, but remain tied to the current binding and audience.\n const presentedHash = digest(token);\n for (const client of clients.values()) {\n if (client.tokenEndpointAuthMethod !== 'api_key' || !timingSafeEqual(presentedHash, client.secretHash))\n continue;\n const binding = bindings.get(client.clientId);\n if (binding === undefined || binding.audience !== audience) return undefined;\n return { id: client.clientId, ...binding, createdAt: client.createdAt, expiresAt: Number.MAX_SAFE_INTEGER };\n }\n const stored = accessTokens.get(key);\n if (stored === undefined) return undefined;\n if (stored.expiresAt <= now() || !grants.has(stored.grant.id)) {\n accessTokens.delete(key);\n return undefined;\n }\n if (stored.grant.audience !== audience) return undefined;\n return { ...stored.grant, expiresAt: stored.expiresAt };\n },\n revokeGrant,\n revokeSessionGeneration(sessionId, sessionGeneration) {\n let revoked = 0;\n for (const grant of grants.values()) {\n if (grant.sessionId === sessionId && grant.sessionGeneration === sessionGeneration && revokeGrant(grant.id)) {\n revoked += 1;\n }\n }\n for (const [clientId, binding] of bindings) {\n if (binding.sessionId === sessionId && binding.sessionGeneration === sessionGeneration)\n bindings.delete(clientId);\n }\n return revoked;\n },\n revokeSession(sessionId) {\n let revoked = 0;\n for (const grant of grants.values()) {\n if (grant.sessionId === sessionId && revokeGrant(grant.id)) revoked += 1;\n }\n for (const [clientId, binding] of bindings) if (binding.sessionId === sessionId) bindings.delete(clientId);\n return revoked;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
5
|
+
let node_path = require("node:path");
|
|
6
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
7
|
+
//#region src/services/sessionMcpConversations/index.ts
|
|
8
|
+
const STORE_FILE = "session-mcp-conversations.json";
|
|
9
|
+
const STORE_VERSION = 1;
|
|
10
|
+
const MAX_BINDINGS = 1e3;
|
|
11
|
+
const MAX_CONVERSATION_BYTES = 1024;
|
|
12
|
+
const CONVERSATION_META_KEY = "openai/session";
|
|
13
|
+
const ID_PATTERN = /^[A-Za-z0-9_-]+$/u;
|
|
14
|
+
const DIGEST_PATTERN = /^[a-f0-9]{64}$/u;
|
|
15
|
+
/** Client metadata is a routing hint within an authenticated registration, never authority. */
|
|
16
|
+
function sessionMcpConversationDigest(meta) {
|
|
17
|
+
if (typeof meta !== "object" || meta === null || Array.isArray(meta)) return void 0;
|
|
18
|
+
const value = meta[CONVERSATION_META_KEY];
|
|
19
|
+
if (typeof value !== "string" || value.trim() !== value || value.length === 0 || Array.from(value).some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) || Buffer.byteLength(value, "utf8") > MAX_CONVERSATION_BYTES) return void 0;
|
|
20
|
+
return (0, node_crypto.createHash)("sha256").update(JSON.stringify(["chatgpt", value])).digest("hex");
|
|
21
|
+
}
|
|
22
|
+
var SessionMcpConversationError = class extends Error {
|
|
23
|
+
code;
|
|
24
|
+
bindingId;
|
|
25
|
+
constructor(code, message, bindingId) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.bindingId = bindingId;
|
|
29
|
+
this.name = "SessionMcpConversationError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/** How many id characters name a conversation's managed worktree branch and directory. */
|
|
33
|
+
const MANAGED_WORKTREE_ID_LENGTH = 12;
|
|
34
|
+
function validRecord(value) {
|
|
35
|
+
if (typeof value !== "object" || value === null) return false;
|
|
36
|
+
const record = value;
|
|
37
|
+
return typeof record.id === "string" && ID_PATTERN.test(record.id) && typeof record.clientId === "string" && ID_PATTERN.test(record.clientId) && typeof record.parentSessionId === "string" && ID_PATTERN.test(record.parentSessionId) && typeof record.parentWorkspaceId === "string" && record.parentWorkspaceId.length > 0 && typeof record.conversationDigest === "string" && DIGEST_PATTERN.test(record.conversationDigest) && typeof record.createdAt === "string" && Number.isFinite(Date.parse(record.createdAt)) && (record.state === "pending" || record.state === "bound" || record.state === "closed") && (record.setupKind === void 0 || record.setupKind === "managed-worktree" || record.setupKind === "existing-directory") && (record.failureCode === void 0 || record.failureCode === "SESSION_WORKTREE_PROVISION_FAILED" || record.failureCode === "SESSION_UNAVAILABLE") && (record.cwd === void 0 || typeof record.cwd === "string" && node_path.default.isAbsolute(record.cwd) && !record.cwd.includes("\0")) && (record.workspaceId === void 0 || typeof record.workspaceId === "string" && record.workspaceId.length > 0) && (record.state !== "bound" || record.cwd !== void 0 && record.workspaceId !== void 0);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Records written before setups carried a provider have none, and recovery refuses a setup it
|
|
41
|
+
* cannot attribute, which left every such conversation stuck. A managed conversation worktree is
|
|
42
|
+
* the only setup named `po-conversation-<first 12 id characters>--`, so a record reserving
|
|
43
|
+
* that directory can be attributed to it. Anything else stays unattributed and refused.
|
|
44
|
+
*/
|
|
45
|
+
function withLegacySetupKind(record) {
|
|
46
|
+
if (record.setupKind !== void 0 || record.cwd === void 0) return record;
|
|
47
|
+
const managedName = `po-conversation-${record.id.slice(0, MANAGED_WORKTREE_ID_LENGTH)}--`;
|
|
48
|
+
return node_path.default.basename(record.cwd).startsWith(managedName) ? {
|
|
49
|
+
...record,
|
|
50
|
+
setupKind: "managed-worktree"
|
|
51
|
+
} : record;
|
|
52
|
+
}
|
|
53
|
+
function routingKey(record) {
|
|
54
|
+
return JSON.stringify([
|
|
55
|
+
record.clientId,
|
|
56
|
+
record.parentSessionId,
|
|
57
|
+
record.conversationDigest
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
/** One owning headless host persists these bindings. Corruption never becomes an empty, reusable store. */
|
|
61
|
+
function createSessionMcpConversationStore(stateDir) {
|
|
62
|
+
const file = node_path.default.join(stateDir, STORE_FILE);
|
|
63
|
+
let failure;
|
|
64
|
+
let current = load();
|
|
65
|
+
function load() {
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(node_fs.default.readFileSync(file, "utf8"));
|
|
68
|
+
if (typeof parsed !== "object" || parsed === null) throw new Error("Invalid store");
|
|
69
|
+
const stored = parsed;
|
|
70
|
+
if (stored.version !== STORE_VERSION || !Array.isArray(stored.bindings) || !stored.bindings.every(validRecord)) throw new Error("Invalid bindings");
|
|
71
|
+
const records = stored.bindings;
|
|
72
|
+
if (records.length > MAX_BINDINGS || new Set(records.map((record) => record.id)).size !== records.length || new Set(records.map(routingKey)).size !== records.length) throw new Error("Duplicate or excessive bindings");
|
|
73
|
+
return Object.freeze(records.map((record) => Object.freeze(withLegacySetupKind(record))));
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if (error.code === "ENOENT") return [];
|
|
76
|
+
failure = new SessionMcpConversationError("CONVERSATION_STORE_UNAVAILABLE", "Conversation bindings could not be loaded. Restore the binding store before using conversation routing.");
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function list() {
|
|
81
|
+
if (failure) throw failure;
|
|
82
|
+
return current;
|
|
83
|
+
}
|
|
84
|
+
function persist(next) {
|
|
85
|
+
list();
|
|
86
|
+
const temporary = `${file}.${(0, node_crypto.randomUUID)()}.tmp`;
|
|
87
|
+
try {
|
|
88
|
+
node_fs.default.mkdirSync(stateDir, {
|
|
89
|
+
recursive: true,
|
|
90
|
+
mode: 448
|
|
91
|
+
});
|
|
92
|
+
const descriptor = node_fs.default.openSync(temporary, "wx", 384);
|
|
93
|
+
try {
|
|
94
|
+
node_fs.default.writeFileSync(descriptor, `${JSON.stringify({
|
|
95
|
+
version: STORE_VERSION,
|
|
96
|
+
bindings: next
|
|
97
|
+
}, null, 2)}\n`);
|
|
98
|
+
node_fs.default.fsyncSync(descriptor);
|
|
99
|
+
} finally {
|
|
100
|
+
node_fs.default.closeSync(descriptor);
|
|
101
|
+
}
|
|
102
|
+
node_fs.default.renameSync(temporary, file);
|
|
103
|
+
current = Object.freeze(next.map((record) => Object.freeze(record)));
|
|
104
|
+
} catch {
|
|
105
|
+
throw new SessionMcpConversationError("CONVERSATION_STORE_UNAVAILABLE", "Conversation bindings could not be saved. No new execution target was admitted.");
|
|
106
|
+
} finally {
|
|
107
|
+
try {
|
|
108
|
+
node_fs.default.rmSync(temporary, { force: true });
|
|
109
|
+
} catch {}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function get(id, parentSessionId) {
|
|
113
|
+
const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);
|
|
114
|
+
if (!record || record.state === "closed") throw new SessionMcpConversationError("SESSION_UNAVAILABLE", "This conversation binding is unavailable. It will not be recreated automatically.");
|
|
115
|
+
return record;
|
|
116
|
+
}
|
|
117
|
+
function replace(record) {
|
|
118
|
+
persist(list().map((entry) => entry.id === record.id ? record : entry));
|
|
119
|
+
return get(record.id, record.parentSessionId);
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
list,
|
|
123
|
+
get,
|
|
124
|
+
find: (clientId, parentSessionId, digest) => list().find((record) => record.clientId === clientId && record.parentSessionId === parentSessionId && record.conversationDigest === digest),
|
|
125
|
+
reserve(clientId, parentSessionId, parentWorkspaceId, digest) {
|
|
126
|
+
const existing = list().find((record) => record.clientId === clientId && record.parentSessionId === parentSessionId && record.conversationDigest === digest);
|
|
127
|
+
if (existing) return existing;
|
|
128
|
+
if (list().length >= MAX_BINDINGS) throw new SessionMcpConversationError("CONVERSATION_LIMIT_REACHED", "The conversation binding limit has been reached. Use a dedicated session connection.");
|
|
129
|
+
const record = {
|
|
130
|
+
id: (0, node_crypto.randomUUID)(),
|
|
131
|
+
clientId,
|
|
132
|
+
parentSessionId,
|
|
133
|
+
parentWorkspaceId,
|
|
134
|
+
conversationDigest: digest,
|
|
135
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
136
|
+
state: "pending"
|
|
137
|
+
};
|
|
138
|
+
if (!validRecord(record)) throw new SessionMcpConversationError("INVALID_CONVERSATION", "Invalid conversation identity.");
|
|
139
|
+
persist([...list(), record]);
|
|
140
|
+
return get(record.id, parentSessionId);
|
|
141
|
+
},
|
|
142
|
+
selectSetup(id, parentSessionId, kind) {
|
|
143
|
+
const record = get(id, parentSessionId);
|
|
144
|
+
if (record.setupKind === kind) return record.failureCode === void 0 ? record : replace({
|
|
145
|
+
...record,
|
|
146
|
+
failureCode: void 0
|
|
147
|
+
});
|
|
148
|
+
if (record.setupKind !== void 0 && (record.cwd !== void 0 || record.state === "bound")) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "An initialized setup cannot change its provider.", id);
|
|
149
|
+
if (record.setupKind === void 0 && record.cwd !== void 0) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "This existing setup has no verified provider. Recover it without changing its ownership.", id);
|
|
150
|
+
return replace({
|
|
151
|
+
...record,
|
|
152
|
+
setupKind: kind,
|
|
153
|
+
failureCode: void 0
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
prepare(id, parentSessionId, cwd) {
|
|
157
|
+
const record = get(id, parentSessionId);
|
|
158
|
+
if (!node_path.default.isAbsolute(cwd) || cwd.includes("\0")) throw new Error("A canonical absolute execution directory is required.");
|
|
159
|
+
if (record.cwd !== void 0 && record.cwd !== cwd) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "This conversation already reserved a different execution directory. Recover that setup instead.", id);
|
|
160
|
+
if (record.cwd === cwd) return record;
|
|
161
|
+
return replace({
|
|
162
|
+
...record,
|
|
163
|
+
cwd
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
fail(id, parentSessionId, code) {
|
|
167
|
+
const record = get(id, parentSessionId);
|
|
168
|
+
if (record.state !== "pending" || record.failureCode === code) return record;
|
|
169
|
+
return replace({
|
|
170
|
+
...record,
|
|
171
|
+
failureCode: code
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
bind(id, parentSessionId, workspaceId) {
|
|
175
|
+
const record = get(id, parentSessionId);
|
|
176
|
+
if (!record.cwd || !workspaceId) throw new Error("A prepared directory and admitted workspace are required.");
|
|
177
|
+
if (record.state === "bound") {
|
|
178
|
+
if (record.workspaceId !== workspaceId) throw new Error("The bound workspace cannot change.");
|
|
179
|
+
return record;
|
|
180
|
+
}
|
|
181
|
+
return replace({
|
|
182
|
+
...record,
|
|
183
|
+
state: "bound",
|
|
184
|
+
workspaceId,
|
|
185
|
+
failureCode: void 0
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
recover(id, parentSessionId) {
|
|
189
|
+
const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);
|
|
190
|
+
if (!record) throw new SessionMcpConversationError("SESSION_UNAVAILABLE", "This conversation binding is unavailable.");
|
|
191
|
+
return replace({
|
|
192
|
+
...record,
|
|
193
|
+
state: "pending"
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
closeSession(sessionId) {
|
|
197
|
+
const next = list().map((record) => record.id === sessionId || record.parentSessionId === sessionId ? {
|
|
198
|
+
...record,
|
|
199
|
+
state: "closed"
|
|
200
|
+
} : record);
|
|
201
|
+
if (next.some((record, index) => record !== current[index])) persist(next);
|
|
202
|
+
},
|
|
203
|
+
closeClient(clientId) {
|
|
204
|
+
const next = list().map((record) => record.clientId === clientId ? {
|
|
205
|
+
...record,
|
|
206
|
+
state: "closed"
|
|
207
|
+
} : record);
|
|
208
|
+
if (next.some((record, index) => record !== current[index])) persist(next);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//#endregion
|
|
213
|
+
exports.SessionMcpConversationError = SessionMcpConversationError;
|
|
214
|
+
exports.createSessionMcpConversationStore = createSessionMcpConversationStore;
|
|
215
|
+
exports.sessionMcpConversationDigest = sessionMcpConversationDigest;
|
|
216
|
+
|
|
217
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createHash","path","fs","randomUUID"],"sources":["../../../../src/services/sessionMcpConversations/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst STORE_FILE = 'session-mcp-conversations.json';\nconst STORE_VERSION = 1;\nconst MAX_BINDINGS = 1000;\nconst MAX_CONVERSATION_BYTES = 1024;\nconst CONVERSATION_META_KEY = 'openai/session';\nconst ID_PATTERN = /^[A-Za-z0-9_-]+$/u;\nconst DIGEST_PATTERN = /^[a-f0-9]{64}$/u;\n\nexport type SessionMcpSetupKind = 'managed-worktree' | 'existing-directory';\nexport type SessionMcpSetupFailureCode = 'SESSION_WORKTREE_PROVISION_FAILED' | 'SESSION_UNAVAILABLE';\n\n/** Client metadata is a routing hint within an authenticated registration, never authority. */\nexport function sessionMcpConversationDigest(meta: unknown): string | undefined {\n if (typeof meta !== 'object' || meta === null || Array.isArray(meta)) return undefined;\n const value = (meta as Record<string, unknown>)[CONVERSATION_META_KEY];\n if (\n typeof value !== 'string' ||\n value.trim() !== value ||\n value.length === 0 ||\n Array.from(value).some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) ||\n Buffer.byteLength(value, 'utf8') > MAX_CONVERSATION_BYTES\n )\n return undefined;\n return createHash('sha256')\n .update(JSON.stringify(['chatgpt', value]))\n .digest('hex');\n}\n\nexport interface SessionMcpConversation {\n /** Also the server-reserved target session identity. Never supplied by the model. */\n readonly id: string;\n readonly clientId: string;\n readonly parentSessionId: string;\n readonly parentWorkspaceId: string;\n readonly conversationDigest: string;\n readonly createdAt: string;\n readonly state: 'pending' | 'bound' | 'closed';\n /** Host-selected execution provider. Old records without this field are not assumed to be worktrees. */\n readonly setupKind?: SessionMcpSetupKind;\n /** Public, bounded failure code. Never persist Git stderr or exception text here. */\n readonly failureCode?: SessionMcpSetupFailureCode;\n /** Persisted before checkout or session creation starts. */\n readonly cwd?: string;\n readonly workspaceId?: string;\n}\n\nexport class SessionMcpConversationError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly bindingId?: string,\n ) {\n super(message);\n this.name = 'SessionMcpConversationError';\n }\n}\n\nexport interface SessionMcpConversationStore {\n list(): readonly SessionMcpConversation[];\n find(clientId: string, parentSessionId: string, digest: string): SessionMcpConversation | undefined;\n reserve(clientId: string, parentSessionId: string, parentWorkspaceId: string, digest: string): SessionMcpConversation;\n get(id: string, parentSessionId: string): SessionMcpConversation;\n selectSetup(id: string, parentSessionId: string, kind: SessionMcpSetupKind): SessionMcpConversation;\n prepare(id: string, parentSessionId: string, cwd: string): SessionMcpConversation;\n fail(id: string, parentSessionId: string, code: SessionMcpSetupFailureCode): SessionMcpConversation;\n bind(id: string, parentSessionId: string, workspaceId: string): SessionMcpConversation;\n recover(id: string, parentSessionId: string): SessionMcpConversation;\n closeSession(sessionId: string): void;\n closeClient(clientId: string): void;\n}\n\n/** How many id characters name a conversation's managed worktree branch and directory. */\nconst MANAGED_WORKTREE_ID_LENGTH = 12;\n\nfunction validRecord(value: unknown): value is SessionMcpConversation {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Partial<SessionMcpConversation>;\n return (\n typeof record.id === 'string' &&\n ID_PATTERN.test(record.id) &&\n typeof record.clientId === 'string' &&\n ID_PATTERN.test(record.clientId) &&\n typeof record.parentSessionId === 'string' &&\n ID_PATTERN.test(record.parentSessionId) &&\n typeof record.parentWorkspaceId === 'string' &&\n record.parentWorkspaceId.length > 0 &&\n typeof record.conversationDigest === 'string' &&\n DIGEST_PATTERN.test(record.conversationDigest) &&\n typeof record.createdAt === 'string' &&\n Number.isFinite(Date.parse(record.createdAt)) &&\n (record.state === 'pending' || record.state === 'bound' || record.state === 'closed') &&\n (record.setupKind === undefined ||\n record.setupKind === 'managed-worktree' ||\n record.setupKind === 'existing-directory') &&\n (record.failureCode === undefined ||\n record.failureCode === 'SESSION_WORKTREE_PROVISION_FAILED' ||\n record.failureCode === 'SESSION_UNAVAILABLE') &&\n (record.cwd === undefined ||\n (typeof record.cwd === 'string' && path.isAbsolute(record.cwd) && !record.cwd.includes('\\0'))) &&\n (record.workspaceId === undefined || (typeof record.workspaceId === 'string' && record.workspaceId.length > 0)) &&\n (record.state !== 'bound' || (record.cwd !== undefined && record.workspaceId !== undefined))\n );\n}\n\n/**\n * Records written before setups carried a provider have none, and recovery refuses a setup it\n * cannot attribute, which left every such conversation stuck. A managed conversation worktree is\n * the only setup named `po-conversation-<first 12 id characters>--`, so a record reserving\n * that directory can be attributed to it. Anything else stays unattributed and refused.\n */\nfunction withLegacySetupKind(record: SessionMcpConversation): SessionMcpConversation {\n if (record.setupKind !== undefined || record.cwd === undefined) return record;\n const managedName = `po-conversation-${record.id.slice(0, MANAGED_WORKTREE_ID_LENGTH)}--`;\n return path.basename(record.cwd).startsWith(managedName) ? { ...record, setupKind: 'managed-worktree' } : record;\n}\n\nfunction routingKey(\n record: Pick<SessionMcpConversation, 'clientId' | 'parentSessionId' | 'conversationDigest'>,\n): string {\n return JSON.stringify([record.clientId, record.parentSessionId, record.conversationDigest]);\n}\n\n/** One owning headless host persists these bindings. Corruption never becomes an empty, reusable store. */\nexport function createSessionMcpConversationStore(stateDir: string): SessionMcpConversationStore {\n const file = path.join(stateDir, STORE_FILE);\n let failure: Error | undefined;\n let current: readonly SessionMcpConversation[] = load();\n\n function load(): readonly SessionMcpConversation[] {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (typeof parsed !== 'object' || parsed === null) throw new Error('Invalid store');\n const stored = parsed as { version?: unknown; bindings?: unknown };\n if (stored.version !== STORE_VERSION || !Array.isArray(stored.bindings) || !stored.bindings.every(validRecord))\n throw new Error('Invalid bindings');\n const records: SessionMcpConversation[] = stored.bindings;\n if (\n records.length > MAX_BINDINGS ||\n new Set(records.map((record) => record.id)).size !== records.length ||\n new Set(records.map(routingKey)).size !== records.length\n )\n throw new Error('Duplicate or excessive bindings');\n return Object.freeze(records.map((record) => Object.freeze(withLegacySetupKind(record))));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n failure = new SessionMcpConversationError(\n 'CONVERSATION_STORE_UNAVAILABLE',\n 'Conversation bindings could not be loaded. Restore the binding store before using conversation routing.',\n );\n return [];\n }\n }\n\n function list(): readonly SessionMcpConversation[] {\n if (failure) throw failure;\n return current;\n }\n\n function persist(next: readonly SessionMcpConversation[]): void {\n list();\n const temporary = `${file}.${randomUUID()}.tmp`;\n try {\n fs.mkdirSync(stateDir, { recursive: true, mode: 0o700 });\n const descriptor = fs.openSync(temporary, 'wx', 0o600);\n try {\n fs.writeFileSync(descriptor, `${JSON.stringify({ version: STORE_VERSION, bindings: next }, null, 2)}\\n`);\n fs.fsyncSync(descriptor);\n } finally {\n fs.closeSync(descriptor);\n }\n fs.renameSync(temporary, file);\n current = Object.freeze(next.map((record) => Object.freeze(record)));\n } catch {\n throw new SessionMcpConversationError(\n 'CONVERSATION_STORE_UNAVAILABLE',\n 'Conversation bindings could not be saved. No new execution target was admitted.',\n );\n } finally {\n // This temporary file never grants access and can safely be left for local recovery.\n try {\n fs.rmSync(temporary, { force: true });\n } catch {\n /* An inaccessible temporary file is not loaded. */\n }\n }\n }\n\n function get(id: string, parentSessionId: string): SessionMcpConversation {\n const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);\n if (!record || record.state === 'closed')\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'This conversation binding is unavailable. It will not be recreated automatically.',\n );\n return record;\n }\n\n function replace(record: SessionMcpConversation): SessionMcpConversation {\n persist(list().map((entry) => (entry.id === record.id ? record : entry)));\n return get(record.id, record.parentSessionId);\n }\n\n return {\n list,\n get,\n find: (clientId, parentSessionId, digest) =>\n list().find(\n (record) =>\n record.clientId === clientId &&\n record.parentSessionId === parentSessionId &&\n record.conversationDigest === digest,\n ),\n reserve(clientId, parentSessionId, parentWorkspaceId, digest) {\n const existing = list().find(\n (record) =>\n record.clientId === clientId &&\n record.parentSessionId === parentSessionId &&\n record.conversationDigest === digest,\n );\n if (existing) return existing;\n if (list().length >= MAX_BINDINGS)\n throw new SessionMcpConversationError(\n 'CONVERSATION_LIMIT_REACHED',\n 'The conversation binding limit has been reached. Use a dedicated session connection.',\n );\n const record: SessionMcpConversation = {\n id: randomUUID(),\n clientId,\n parentSessionId,\n parentWorkspaceId,\n conversationDigest: digest,\n createdAt: new Date().toISOString(),\n state: 'pending',\n };\n if (!validRecord(record))\n throw new SessionMcpConversationError('INVALID_CONVERSATION', 'Invalid conversation identity.');\n persist([...list(), record]);\n return get(record.id, parentSessionId);\n },\n selectSetup(id, parentSessionId, kind) {\n const record = get(id, parentSessionId);\n if (record.setupKind === kind)\n return record.failureCode === undefined ? record : replace({ ...record, failureCode: undefined });\n if (record.setupKind !== undefined && (record.cwd !== undefined || record.state === 'bound'))\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'An initialized setup cannot change its provider.',\n id,\n );\n if (record.setupKind === undefined && record.cwd !== undefined)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This existing setup has no verified provider. Recover it without changing its ownership.',\n id,\n );\n return replace({ ...record, setupKind: kind, failureCode: undefined });\n },\n prepare(id, parentSessionId, cwd) {\n const record = get(id, parentSessionId);\n if (!path.isAbsolute(cwd) || cwd.includes('\\0'))\n throw new Error('A canonical absolute execution directory is required.');\n if (record.cwd !== undefined && record.cwd !== cwd)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This conversation already reserved a different execution directory. Recover that setup instead.',\n id,\n );\n if (record.cwd === cwd) return record;\n return replace({ ...record, cwd });\n },\n fail(id, parentSessionId, code) {\n const record = get(id, parentSessionId);\n if (record.state !== 'pending' || record.failureCode === code) return record;\n return replace({ ...record, failureCode: code });\n },\n bind(id, parentSessionId, workspaceId) {\n const record = get(id, parentSessionId);\n if (!record.cwd || !workspaceId) throw new Error('A prepared directory and admitted workspace are required.');\n if (record.state === 'bound') {\n if (record.workspaceId !== workspaceId) throw new Error('The bound workspace cannot change.');\n return record;\n }\n return replace({ ...record, state: 'bound', workspaceId, failureCode: undefined });\n },\n recover(id, parentSessionId) {\n const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);\n if (!record)\n throw new SessionMcpConversationError('SESSION_UNAVAILABLE', 'This conversation binding is unavailable.');\n return replace({ ...record, state: 'pending' });\n },\n closeSession(sessionId) {\n const next = list().map((record): SessionMcpConversation =>\n record.id === sessionId || record.parentSessionId === sessionId ? { ...record, state: 'closed' } : record,\n );\n if (next.some((record, index) => record !== current[index])) persist(next);\n },\n closeClient(clientId) {\n const next = list().map((record): SessionMcpConversation =>\n record.clientId === clientId ? { ...record, state: 'closed' } : record,\n );\n if (next.some((record, index) => record !== current[index])) persist(next);\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
//#region src/services/sessionMcpConversations/index.ts
|
|
5
|
+
const STORE_FILE = "session-mcp-conversations.json";
|
|
6
|
+
const STORE_VERSION = 1;
|
|
7
|
+
const MAX_BINDINGS = 1e3;
|
|
8
|
+
const MAX_CONVERSATION_BYTES = 1024;
|
|
9
|
+
const CONVERSATION_META_KEY = "openai/session";
|
|
10
|
+
const ID_PATTERN = /^[A-Za-z0-9_-]+$/u;
|
|
11
|
+
const DIGEST_PATTERN = /^[a-f0-9]{64}$/u;
|
|
12
|
+
/** Client metadata is a routing hint within an authenticated registration, never authority. */
|
|
13
|
+
function sessionMcpConversationDigest(meta) {
|
|
14
|
+
if (typeof meta !== "object" || meta === null || Array.isArray(meta)) return void 0;
|
|
15
|
+
const value = meta[CONVERSATION_META_KEY];
|
|
16
|
+
if (typeof value !== "string" || value.trim() !== value || value.length === 0 || Array.from(value).some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) || Buffer.byteLength(value, "utf8") > MAX_CONVERSATION_BYTES) return void 0;
|
|
17
|
+
return createHash("sha256").update(JSON.stringify(["chatgpt", value])).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
var SessionMcpConversationError = class extends Error {
|
|
20
|
+
code;
|
|
21
|
+
bindingId;
|
|
22
|
+
constructor(code, message, bindingId) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.bindingId = bindingId;
|
|
26
|
+
this.name = "SessionMcpConversationError";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
/** How many id characters name a conversation's managed worktree branch and directory. */
|
|
30
|
+
const MANAGED_WORKTREE_ID_LENGTH = 12;
|
|
31
|
+
function validRecord(value) {
|
|
32
|
+
if (typeof value !== "object" || value === null) return false;
|
|
33
|
+
const record = value;
|
|
34
|
+
return typeof record.id === "string" && ID_PATTERN.test(record.id) && typeof record.clientId === "string" && ID_PATTERN.test(record.clientId) && typeof record.parentSessionId === "string" && ID_PATTERN.test(record.parentSessionId) && typeof record.parentWorkspaceId === "string" && record.parentWorkspaceId.length > 0 && typeof record.conversationDigest === "string" && DIGEST_PATTERN.test(record.conversationDigest) && typeof record.createdAt === "string" && Number.isFinite(Date.parse(record.createdAt)) && (record.state === "pending" || record.state === "bound" || record.state === "closed") && (record.setupKind === void 0 || record.setupKind === "managed-worktree" || record.setupKind === "existing-directory") && (record.failureCode === void 0 || record.failureCode === "SESSION_WORKTREE_PROVISION_FAILED" || record.failureCode === "SESSION_UNAVAILABLE") && (record.cwd === void 0 || typeof record.cwd === "string" && path.isAbsolute(record.cwd) && !record.cwd.includes("\0")) && (record.workspaceId === void 0 || typeof record.workspaceId === "string" && record.workspaceId.length > 0) && (record.state !== "bound" || record.cwd !== void 0 && record.workspaceId !== void 0);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Records written before setups carried a provider have none, and recovery refuses a setup it
|
|
38
|
+
* cannot attribute, which left every such conversation stuck. A managed conversation worktree is
|
|
39
|
+
* the only setup named `po-conversation-<first 12 id characters>--`, so a record reserving
|
|
40
|
+
* that directory can be attributed to it. Anything else stays unattributed and refused.
|
|
41
|
+
*/
|
|
42
|
+
function withLegacySetupKind(record) {
|
|
43
|
+
if (record.setupKind !== void 0 || record.cwd === void 0) return record;
|
|
44
|
+
const managedName = `po-conversation-${record.id.slice(0, MANAGED_WORKTREE_ID_LENGTH)}--`;
|
|
45
|
+
return path.basename(record.cwd).startsWith(managedName) ? {
|
|
46
|
+
...record,
|
|
47
|
+
setupKind: "managed-worktree"
|
|
48
|
+
} : record;
|
|
49
|
+
}
|
|
50
|
+
function routingKey(record) {
|
|
51
|
+
return JSON.stringify([
|
|
52
|
+
record.clientId,
|
|
53
|
+
record.parentSessionId,
|
|
54
|
+
record.conversationDigest
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
/** One owning headless host persists these bindings. Corruption never becomes an empty, reusable store. */
|
|
58
|
+
function createSessionMcpConversationStore(stateDir) {
|
|
59
|
+
const file = path.join(stateDir, STORE_FILE);
|
|
60
|
+
let failure;
|
|
61
|
+
let current = load();
|
|
62
|
+
function load() {
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
65
|
+
if (typeof parsed !== "object" || parsed === null) throw new Error("Invalid store");
|
|
66
|
+
const stored = parsed;
|
|
67
|
+
if (stored.version !== STORE_VERSION || !Array.isArray(stored.bindings) || !stored.bindings.every(validRecord)) throw new Error("Invalid bindings");
|
|
68
|
+
const records = stored.bindings;
|
|
69
|
+
if (records.length > MAX_BINDINGS || new Set(records.map((record) => record.id)).size !== records.length || new Set(records.map(routingKey)).size !== records.length) throw new Error("Duplicate or excessive bindings");
|
|
70
|
+
return Object.freeze(records.map((record) => Object.freeze(withLegacySetupKind(record))));
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (error.code === "ENOENT") return [];
|
|
73
|
+
failure = new SessionMcpConversationError("CONVERSATION_STORE_UNAVAILABLE", "Conversation bindings could not be loaded. Restore the binding store before using conversation routing.");
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function list() {
|
|
78
|
+
if (failure) throw failure;
|
|
79
|
+
return current;
|
|
80
|
+
}
|
|
81
|
+
function persist(next) {
|
|
82
|
+
list();
|
|
83
|
+
const temporary = `${file}.${randomUUID()}.tmp`;
|
|
84
|
+
try {
|
|
85
|
+
fs.mkdirSync(stateDir, {
|
|
86
|
+
recursive: true,
|
|
87
|
+
mode: 448
|
|
88
|
+
});
|
|
89
|
+
const descriptor = fs.openSync(temporary, "wx", 384);
|
|
90
|
+
try {
|
|
91
|
+
fs.writeFileSync(descriptor, `${JSON.stringify({
|
|
92
|
+
version: STORE_VERSION,
|
|
93
|
+
bindings: next
|
|
94
|
+
}, null, 2)}\n`);
|
|
95
|
+
fs.fsyncSync(descriptor);
|
|
96
|
+
} finally {
|
|
97
|
+
fs.closeSync(descriptor);
|
|
98
|
+
}
|
|
99
|
+
fs.renameSync(temporary, file);
|
|
100
|
+
current = Object.freeze(next.map((record) => Object.freeze(record)));
|
|
101
|
+
} catch {
|
|
102
|
+
throw new SessionMcpConversationError("CONVERSATION_STORE_UNAVAILABLE", "Conversation bindings could not be saved. No new execution target was admitted.");
|
|
103
|
+
} finally {
|
|
104
|
+
try {
|
|
105
|
+
fs.rmSync(temporary, { force: true });
|
|
106
|
+
} catch {}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function get(id, parentSessionId) {
|
|
110
|
+
const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);
|
|
111
|
+
if (!record || record.state === "closed") throw new SessionMcpConversationError("SESSION_UNAVAILABLE", "This conversation binding is unavailable. It will not be recreated automatically.");
|
|
112
|
+
return record;
|
|
113
|
+
}
|
|
114
|
+
function replace(record) {
|
|
115
|
+
persist(list().map((entry) => entry.id === record.id ? record : entry));
|
|
116
|
+
return get(record.id, record.parentSessionId);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
list,
|
|
120
|
+
get,
|
|
121
|
+
find: (clientId, parentSessionId, digest) => list().find((record) => record.clientId === clientId && record.parentSessionId === parentSessionId && record.conversationDigest === digest),
|
|
122
|
+
reserve(clientId, parentSessionId, parentWorkspaceId, digest) {
|
|
123
|
+
const existing = list().find((record) => record.clientId === clientId && record.parentSessionId === parentSessionId && record.conversationDigest === digest);
|
|
124
|
+
if (existing) return existing;
|
|
125
|
+
if (list().length >= MAX_BINDINGS) throw new SessionMcpConversationError("CONVERSATION_LIMIT_REACHED", "The conversation binding limit has been reached. Use a dedicated session connection.");
|
|
126
|
+
const record = {
|
|
127
|
+
id: randomUUID(),
|
|
128
|
+
clientId,
|
|
129
|
+
parentSessionId,
|
|
130
|
+
parentWorkspaceId,
|
|
131
|
+
conversationDigest: digest,
|
|
132
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
133
|
+
state: "pending"
|
|
134
|
+
};
|
|
135
|
+
if (!validRecord(record)) throw new SessionMcpConversationError("INVALID_CONVERSATION", "Invalid conversation identity.");
|
|
136
|
+
persist([...list(), record]);
|
|
137
|
+
return get(record.id, parentSessionId);
|
|
138
|
+
},
|
|
139
|
+
selectSetup(id, parentSessionId, kind) {
|
|
140
|
+
const record = get(id, parentSessionId);
|
|
141
|
+
if (record.setupKind === kind) return record.failureCode === void 0 ? record : replace({
|
|
142
|
+
...record,
|
|
143
|
+
failureCode: void 0
|
|
144
|
+
});
|
|
145
|
+
if (record.setupKind !== void 0 && (record.cwd !== void 0 || record.state === "bound")) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "An initialized setup cannot change its provider.", id);
|
|
146
|
+
if (record.setupKind === void 0 && record.cwd !== void 0) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "This existing setup has no verified provider. Recover it without changing its ownership.", id);
|
|
147
|
+
return replace({
|
|
148
|
+
...record,
|
|
149
|
+
setupKind: kind,
|
|
150
|
+
failureCode: void 0
|
|
151
|
+
});
|
|
152
|
+
},
|
|
153
|
+
prepare(id, parentSessionId, cwd) {
|
|
154
|
+
const record = get(id, parentSessionId);
|
|
155
|
+
if (!path.isAbsolute(cwd) || cwd.includes("\0")) throw new Error("A canonical absolute execution directory is required.");
|
|
156
|
+
if (record.cwd !== void 0 && record.cwd !== cwd) throw new SessionMcpConversationError("SESSION_TARGET_FIXED", "This conversation already reserved a different execution directory. Recover that setup instead.", id);
|
|
157
|
+
if (record.cwd === cwd) return record;
|
|
158
|
+
return replace({
|
|
159
|
+
...record,
|
|
160
|
+
cwd
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
fail(id, parentSessionId, code) {
|
|
164
|
+
const record = get(id, parentSessionId);
|
|
165
|
+
if (record.state !== "pending" || record.failureCode === code) return record;
|
|
166
|
+
return replace({
|
|
167
|
+
...record,
|
|
168
|
+
failureCode: code
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
bind(id, parentSessionId, workspaceId) {
|
|
172
|
+
const record = get(id, parentSessionId);
|
|
173
|
+
if (!record.cwd || !workspaceId) throw new Error("A prepared directory and admitted workspace are required.");
|
|
174
|
+
if (record.state === "bound") {
|
|
175
|
+
if (record.workspaceId !== workspaceId) throw new Error("The bound workspace cannot change.");
|
|
176
|
+
return record;
|
|
177
|
+
}
|
|
178
|
+
return replace({
|
|
179
|
+
...record,
|
|
180
|
+
state: "bound",
|
|
181
|
+
workspaceId,
|
|
182
|
+
failureCode: void 0
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
recover(id, parentSessionId) {
|
|
186
|
+
const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);
|
|
187
|
+
if (!record) throw new SessionMcpConversationError("SESSION_UNAVAILABLE", "This conversation binding is unavailable.");
|
|
188
|
+
return replace({
|
|
189
|
+
...record,
|
|
190
|
+
state: "pending"
|
|
191
|
+
});
|
|
192
|
+
},
|
|
193
|
+
closeSession(sessionId) {
|
|
194
|
+
const next = list().map((record) => record.id === sessionId || record.parentSessionId === sessionId ? {
|
|
195
|
+
...record,
|
|
196
|
+
state: "closed"
|
|
197
|
+
} : record);
|
|
198
|
+
if (next.some((record, index) => record !== current[index])) persist(next);
|
|
199
|
+
},
|
|
200
|
+
closeClient(clientId) {
|
|
201
|
+
const next = list().map((record) => record.clientId === clientId ? {
|
|
202
|
+
...record,
|
|
203
|
+
state: "closed"
|
|
204
|
+
} : record);
|
|
205
|
+
if (next.some((record, index) => record !== current[index])) persist(next);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//#endregion
|
|
210
|
+
export { SessionMcpConversationError, createSessionMcpConversationStore, sessionMcpConversationDigest };
|
|
211
|
+
|
|
212
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/sessionMcpConversations/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst STORE_FILE = 'session-mcp-conversations.json';\nconst STORE_VERSION = 1;\nconst MAX_BINDINGS = 1000;\nconst MAX_CONVERSATION_BYTES = 1024;\nconst CONVERSATION_META_KEY = 'openai/session';\nconst ID_PATTERN = /^[A-Za-z0-9_-]+$/u;\nconst DIGEST_PATTERN = /^[a-f0-9]{64}$/u;\n\nexport type SessionMcpSetupKind = 'managed-worktree' | 'existing-directory';\nexport type SessionMcpSetupFailureCode = 'SESSION_WORKTREE_PROVISION_FAILED' | 'SESSION_UNAVAILABLE';\n\n/** Client metadata is a routing hint within an authenticated registration, never authority. */\nexport function sessionMcpConversationDigest(meta: unknown): string | undefined {\n if (typeof meta !== 'object' || meta === null || Array.isArray(meta)) return undefined;\n const value = (meta as Record<string, unknown>)[CONVERSATION_META_KEY];\n if (\n typeof value !== 'string' ||\n value.trim() !== value ||\n value.length === 0 ||\n Array.from(value).some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) ||\n Buffer.byteLength(value, 'utf8') > MAX_CONVERSATION_BYTES\n )\n return undefined;\n return createHash('sha256')\n .update(JSON.stringify(['chatgpt', value]))\n .digest('hex');\n}\n\nexport interface SessionMcpConversation {\n /** Also the server-reserved target session identity. Never supplied by the model. */\n readonly id: string;\n readonly clientId: string;\n readonly parentSessionId: string;\n readonly parentWorkspaceId: string;\n readonly conversationDigest: string;\n readonly createdAt: string;\n readonly state: 'pending' | 'bound' | 'closed';\n /** Host-selected execution provider. Old records without this field are not assumed to be worktrees. */\n readonly setupKind?: SessionMcpSetupKind;\n /** Public, bounded failure code. Never persist Git stderr or exception text here. */\n readonly failureCode?: SessionMcpSetupFailureCode;\n /** Persisted before checkout or session creation starts. */\n readonly cwd?: string;\n readonly workspaceId?: string;\n}\n\nexport class SessionMcpConversationError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly bindingId?: string,\n ) {\n super(message);\n this.name = 'SessionMcpConversationError';\n }\n}\n\nexport interface SessionMcpConversationStore {\n list(): readonly SessionMcpConversation[];\n find(clientId: string, parentSessionId: string, digest: string): SessionMcpConversation | undefined;\n reserve(clientId: string, parentSessionId: string, parentWorkspaceId: string, digest: string): SessionMcpConversation;\n get(id: string, parentSessionId: string): SessionMcpConversation;\n selectSetup(id: string, parentSessionId: string, kind: SessionMcpSetupKind): SessionMcpConversation;\n prepare(id: string, parentSessionId: string, cwd: string): SessionMcpConversation;\n fail(id: string, parentSessionId: string, code: SessionMcpSetupFailureCode): SessionMcpConversation;\n bind(id: string, parentSessionId: string, workspaceId: string): SessionMcpConversation;\n recover(id: string, parentSessionId: string): SessionMcpConversation;\n closeSession(sessionId: string): void;\n closeClient(clientId: string): void;\n}\n\n/** How many id characters name a conversation's managed worktree branch and directory. */\nconst MANAGED_WORKTREE_ID_LENGTH = 12;\n\nfunction validRecord(value: unknown): value is SessionMcpConversation {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Partial<SessionMcpConversation>;\n return (\n typeof record.id === 'string' &&\n ID_PATTERN.test(record.id) &&\n typeof record.clientId === 'string' &&\n ID_PATTERN.test(record.clientId) &&\n typeof record.parentSessionId === 'string' &&\n ID_PATTERN.test(record.parentSessionId) &&\n typeof record.parentWorkspaceId === 'string' &&\n record.parentWorkspaceId.length > 0 &&\n typeof record.conversationDigest === 'string' &&\n DIGEST_PATTERN.test(record.conversationDigest) &&\n typeof record.createdAt === 'string' &&\n Number.isFinite(Date.parse(record.createdAt)) &&\n (record.state === 'pending' || record.state === 'bound' || record.state === 'closed') &&\n (record.setupKind === undefined ||\n record.setupKind === 'managed-worktree' ||\n record.setupKind === 'existing-directory') &&\n (record.failureCode === undefined ||\n record.failureCode === 'SESSION_WORKTREE_PROVISION_FAILED' ||\n record.failureCode === 'SESSION_UNAVAILABLE') &&\n (record.cwd === undefined ||\n (typeof record.cwd === 'string' && path.isAbsolute(record.cwd) && !record.cwd.includes('\\0'))) &&\n (record.workspaceId === undefined || (typeof record.workspaceId === 'string' && record.workspaceId.length > 0)) &&\n (record.state !== 'bound' || (record.cwd !== undefined && record.workspaceId !== undefined))\n );\n}\n\n/**\n * Records written before setups carried a provider have none, and recovery refuses a setup it\n * cannot attribute, which left every such conversation stuck. A managed conversation worktree is\n * the only setup named `po-conversation-<first 12 id characters>--`, so a record reserving\n * that directory can be attributed to it. Anything else stays unattributed and refused.\n */\nfunction withLegacySetupKind(record: SessionMcpConversation): SessionMcpConversation {\n if (record.setupKind !== undefined || record.cwd === undefined) return record;\n const managedName = `po-conversation-${record.id.slice(0, MANAGED_WORKTREE_ID_LENGTH)}--`;\n return path.basename(record.cwd).startsWith(managedName) ? { ...record, setupKind: 'managed-worktree' } : record;\n}\n\nfunction routingKey(\n record: Pick<SessionMcpConversation, 'clientId' | 'parentSessionId' | 'conversationDigest'>,\n): string {\n return JSON.stringify([record.clientId, record.parentSessionId, record.conversationDigest]);\n}\n\n/** One owning headless host persists these bindings. Corruption never becomes an empty, reusable store. */\nexport function createSessionMcpConversationStore(stateDir: string): SessionMcpConversationStore {\n const file = path.join(stateDir, STORE_FILE);\n let failure: Error | undefined;\n let current: readonly SessionMcpConversation[] = load();\n\n function load(): readonly SessionMcpConversation[] {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (typeof parsed !== 'object' || parsed === null) throw new Error('Invalid store');\n const stored = parsed as { version?: unknown; bindings?: unknown };\n if (stored.version !== STORE_VERSION || !Array.isArray(stored.bindings) || !stored.bindings.every(validRecord))\n throw new Error('Invalid bindings');\n const records: SessionMcpConversation[] = stored.bindings;\n if (\n records.length > MAX_BINDINGS ||\n new Set(records.map((record) => record.id)).size !== records.length ||\n new Set(records.map(routingKey)).size !== records.length\n )\n throw new Error('Duplicate or excessive bindings');\n return Object.freeze(records.map((record) => Object.freeze(withLegacySetupKind(record))));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n failure = new SessionMcpConversationError(\n 'CONVERSATION_STORE_UNAVAILABLE',\n 'Conversation bindings could not be loaded. Restore the binding store before using conversation routing.',\n );\n return [];\n }\n }\n\n function list(): readonly SessionMcpConversation[] {\n if (failure) throw failure;\n return current;\n }\n\n function persist(next: readonly SessionMcpConversation[]): void {\n list();\n const temporary = `${file}.${randomUUID()}.tmp`;\n try {\n fs.mkdirSync(stateDir, { recursive: true, mode: 0o700 });\n const descriptor = fs.openSync(temporary, 'wx', 0o600);\n try {\n fs.writeFileSync(descriptor, `${JSON.stringify({ version: STORE_VERSION, bindings: next }, null, 2)}\\n`);\n fs.fsyncSync(descriptor);\n } finally {\n fs.closeSync(descriptor);\n }\n fs.renameSync(temporary, file);\n current = Object.freeze(next.map((record) => Object.freeze(record)));\n } catch {\n throw new SessionMcpConversationError(\n 'CONVERSATION_STORE_UNAVAILABLE',\n 'Conversation bindings could not be saved. No new execution target was admitted.',\n );\n } finally {\n // This temporary file never grants access and can safely be left for local recovery.\n try {\n fs.rmSync(temporary, { force: true });\n } catch {\n /* An inaccessible temporary file is not loaded. */\n }\n }\n }\n\n function get(id: string, parentSessionId: string): SessionMcpConversation {\n const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);\n if (!record || record.state === 'closed')\n throw new SessionMcpConversationError(\n 'SESSION_UNAVAILABLE',\n 'This conversation binding is unavailable. It will not be recreated automatically.',\n );\n return record;\n }\n\n function replace(record: SessionMcpConversation): SessionMcpConversation {\n persist(list().map((entry) => (entry.id === record.id ? record : entry)));\n return get(record.id, record.parentSessionId);\n }\n\n return {\n list,\n get,\n find: (clientId, parentSessionId, digest) =>\n list().find(\n (record) =>\n record.clientId === clientId &&\n record.parentSessionId === parentSessionId &&\n record.conversationDigest === digest,\n ),\n reserve(clientId, parentSessionId, parentWorkspaceId, digest) {\n const existing = list().find(\n (record) =>\n record.clientId === clientId &&\n record.parentSessionId === parentSessionId &&\n record.conversationDigest === digest,\n );\n if (existing) return existing;\n if (list().length >= MAX_BINDINGS)\n throw new SessionMcpConversationError(\n 'CONVERSATION_LIMIT_REACHED',\n 'The conversation binding limit has been reached. Use a dedicated session connection.',\n );\n const record: SessionMcpConversation = {\n id: randomUUID(),\n clientId,\n parentSessionId,\n parentWorkspaceId,\n conversationDigest: digest,\n createdAt: new Date().toISOString(),\n state: 'pending',\n };\n if (!validRecord(record))\n throw new SessionMcpConversationError('INVALID_CONVERSATION', 'Invalid conversation identity.');\n persist([...list(), record]);\n return get(record.id, parentSessionId);\n },\n selectSetup(id, parentSessionId, kind) {\n const record = get(id, parentSessionId);\n if (record.setupKind === kind)\n return record.failureCode === undefined ? record : replace({ ...record, failureCode: undefined });\n if (record.setupKind !== undefined && (record.cwd !== undefined || record.state === 'bound'))\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'An initialized setup cannot change its provider.',\n id,\n );\n if (record.setupKind === undefined && record.cwd !== undefined)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This existing setup has no verified provider. Recover it without changing its ownership.',\n id,\n );\n return replace({ ...record, setupKind: kind, failureCode: undefined });\n },\n prepare(id, parentSessionId, cwd) {\n const record = get(id, parentSessionId);\n if (!path.isAbsolute(cwd) || cwd.includes('\\0'))\n throw new Error('A canonical absolute execution directory is required.');\n if (record.cwd !== undefined && record.cwd !== cwd)\n throw new SessionMcpConversationError(\n 'SESSION_TARGET_FIXED',\n 'This conversation already reserved a different execution directory. Recover that setup instead.',\n id,\n );\n if (record.cwd === cwd) return record;\n return replace({ ...record, cwd });\n },\n fail(id, parentSessionId, code) {\n const record = get(id, parentSessionId);\n if (record.state !== 'pending' || record.failureCode === code) return record;\n return replace({ ...record, failureCode: code });\n },\n bind(id, parentSessionId, workspaceId) {\n const record = get(id, parentSessionId);\n if (!record.cwd || !workspaceId) throw new Error('A prepared directory and admitted workspace are required.');\n if (record.state === 'bound') {\n if (record.workspaceId !== workspaceId) throw new Error('The bound workspace cannot change.');\n return record;\n }\n return replace({ ...record, state: 'bound', workspaceId, failureCode: undefined });\n },\n recover(id, parentSessionId) {\n const record = list().find((entry) => entry.id === id && entry.parentSessionId === parentSessionId);\n if (!record)\n throw new SessionMcpConversationError('SESSION_UNAVAILABLE', 'This conversation binding is unavailable.');\n return replace({ ...record, state: 'pending' });\n },\n closeSession(sessionId) {\n const next = list().map((record): SessionMcpConversation =>\n record.id === sessionId || record.parentSessionId === sessionId ? { ...record, state: 'closed' } : record,\n );\n if (next.some((record, index) => record !== current[index])) persist(next);\n },\n closeClient(clientId) {\n const next = list().map((record): SessionMcpConversation =>\n record.clientId === clientId ? { ...record, state: 'closed' } : record,\n );\n if (next.some((record, index) => record !== current[index])) persist(next);\n },\n };\n}\n"],"mappings":"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"}
|