@agimon-ai/po-core 0.0.0-alpha.2 → 0.0.0-alpha.21
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 +149 -21
- package/NOTICE +41 -0
- package/dist/agentModel.cjs +1 -1
- package/dist/agentModel.d.mts +2 -2
- package/dist/agentModel.mjs +1 -2
- package/dist/apiContracts.cjs +623 -802
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts +277 -615
- package/dist/apiContracts.d.mts.map +1 -1
- package/dist/apiContracts.mjs +617 -794
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/askUser.cjs +2 -2
- package/dist/askUser.d.mts +2 -2
- package/dist/askUser.mjs +1 -2
- package/dist/authorTools.mjs +1 -2
- package/dist/backgroundWork.cjs +3 -3
- package/dist/backgroundWork.d.mts +2 -2
- package/dist/backgroundWork.mjs +1 -2
- package/dist/bundleAssetPolicy.mjs +1 -2
- package/dist/chatgptAuth.cjs +3 -2
- package/dist/chatgptAuth.d.mts +3 -2
- package/dist/chatgptAuth.mjs +2 -1
- package/dist/childProcess.cjs +1 -1
- package/dist/childProcess.d.mts +2 -2
- package/dist/childProcess.mjs +1 -2
- package/dist/childSession.cjs +11 -6
- package/dist/childSession.d.mts +3 -3
- package/dist/childSession.mjs +3 -3
- package/dist/cockpitContainer.mjs +1 -2
- package/dist/config.cjs +1 -1
- package/dist/config.d.mts +3 -3
- package/dist/config.mjs +1 -2
- package/dist/contextApi.cjs +1 -0
- package/dist/contextApi.d.mts +2 -2
- package/dist/contextApi.mjs +2 -2
- package/dist/contextContributions.cjs +4 -4
- package/dist/contextContributions.d.mts +3 -3
- package/dist/contextContributions.mjs +3 -3
- package/dist/contextDetailStore.cjs +7 -5
- package/dist/contextDetailStore.cjs.map +1 -1
- package/dist/contextDetailStore.d.mts +2 -1
- package/dist/contextDetailStore.d.mts.map +1 -1
- package/dist/contextDetailStore.mjs +6 -4
- package/dist/contextDetailStore.mjs.map +1 -1
- package/dist/contextProjection.cjs +7 -2
- package/dist/contextProjection.cjs.map +1 -1
- package/dist/contextProjection.d.mts +4 -1
- package/dist/contextProjection.d.mts.map +1 -1
- package/dist/contextProjection.mjs +5 -2
- package/dist/contextProjection.mjs.map +1 -1
- package/dist/cordisHost.cjs +11 -11
- package/dist/cordisHost.d.mts +2 -2
- package/dist/cordisHost.mjs +1 -2
- package/dist/delegation.cjs +8 -8
- package/dist/delegation.d.mts +2 -2
- package/dist/delegation.mjs +1 -2
- package/dist/executionBudget.cjs +4 -3
- package/dist/executionBudget.cjs.map +1 -1
- package/dist/executionBudget.d.mts +2 -2
- package/dist/executionBudget.d.mts.map +1 -1
- package/dist/executionBudget.mjs +4 -3
- package/dist/executionBudget.mjs.map +1 -1
- package/dist/extensionFile.cjs +5 -0
- package/dist/extensionFile.d.mts +4 -2
- package/dist/extensionFile.mjs +4 -2
- package/dist/footer.d.mts +2 -2
- package/dist/footer.mjs +1 -2
- package/dist/headless.cjs +14 -14
- package/dist/headless.d.mts +2 -2
- package/dist/headless.mjs +1 -2
- package/dist/headlessHub.cjs +308 -109
- package/dist/headlessHub.cjs.map +1 -1
- package/dist/headlessHub.d.mts +71 -36
- package/dist/headlessHub.d.mts.map +1 -1
- package/dist/headlessHub.mjs +309 -110
- package/dist/headlessHub.mjs.map +1 -1
- package/dist/headlessProtocol.cjs +327 -0
- package/dist/headlessProtocol.cjs.map +1 -0
- package/dist/headlessProtocol.d.mts +30 -0
- package/dist/headlessProtocol.d.mts.map +1 -0
- package/dist/headlessProtocol.mjs +326 -0
- package/dist/headlessProtocol.mjs.map +1 -0
- package/dist/headlessServer.cjs +166 -151
- package/dist/headlessServer.cjs.map +1 -1
- package/dist/headlessServer.d.mts +13 -5
- package/dist/headlessServer.d.mts.map +1 -1
- package/dist/headlessServer.mjs +166 -151
- package/dist/headlessServer.mjs.map +1 -1
- package/dist/headlessSessionHost.d.mts +58 -21
- package/dist/headlessSessionHost.d.mts.map +1 -1
- package/dist/help.cjs +20 -20
- package/dist/help.d.mts +2 -2
- package/dist/help.mjs +2 -2
- package/dist/history.cjs +16 -20
- package/dist/history.d.mts +9 -7
- package/dist/history.mjs +6 -7
- package/dist/historyOwnership.cjs.map +1 -1
- package/dist/historyOwnership.d.mts +1 -1
- package/dist/historyOwnership.mjs.map +1 -1
- package/dist/hubChannel.cjs +9 -0
- package/dist/hubChannel.d.mts +3 -2
- package/dist/hubChannel.mjs +3 -2
- package/dist/index.cjs +26 -28
- package/dist/index.d.mts +6 -6
- package/dist/index.mjs +6 -6
- package/dist/interop/chord.mjs +1 -0
- package/dist/interop/chordContext.mjs +1 -0
- package/dist/json.cjs +11 -5
- package/dist/json.d.mts +4 -2
- package/dist/json.mjs +4 -2
- package/dist/kernel.cjs +1 -1
- package/dist/kernel.d.mts +3 -3
- package/dist/kernel.mjs +1 -2
- package/dist/leader.d.mts +2 -2
- package/dist/leader.mjs +1 -2
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/machineApi.cjs +80 -74
- package/dist/machineApi.cjs.map +1 -1
- package/dist/machineApi.d.mts +5 -2
- package/dist/machineApi.d.mts.map +1 -1
- package/dist/machineApi.mjs +78 -71
- package/dist/machineApi.mjs.map +1 -1
- package/dist/main.cjs +2 -1
- package/dist/main.d.mts +2 -1
- package/dist/main.mjs +2 -1
- package/dist/mcpFacet.d.mts +3 -3
- package/dist/mcpProjection.cjs +13 -13
- package/dist/mcpProjection.d.mts +2 -2
- package/dist/mcpProjection.mjs +1 -2
- package/dist/mcpSchemaCost.cjs +4 -4
- package/dist/mcpSchemaCost.cjs.map +1 -1
- package/dist/mcpSchemaCost.d.mts +2 -2
- package/dist/mcpSchemaCost.mjs +4 -4
- package/dist/mcpSchemaCost.mjs.map +1 -1
- package/dist/mcpSession.cjs +7 -7
- package/dist/mcpSession.d.mts +2 -2
- package/dist/mcpSession.mjs +1 -2
- package/dist/mcpStatus.cjs +2 -2
- package/dist/mcpStatus.d.mts +2 -2
- package/dist/mcpStatus.mjs +1 -2
- package/dist/mcpToolResolver.cjs +3 -3
- package/dist/mcpToolResolver.d.mts +2 -2
- package/dist/mcpToolResolver.mjs +1 -2
- package/dist/mcpWidget.d.mts +2 -2
- package/dist/moduleResolution.cjs +43 -8
- package/dist/moduleResolution.cjs.map +1 -1
- package/dist/moduleResolution.d.mts +10 -1
- package/dist/moduleResolution.d.mts.map +1 -1
- package/dist/moduleResolution.mjs +40 -7
- package/dist/moduleResolution.mjs.map +1 -1
- package/dist/narration.cjs +3 -3
- package/dist/narration.d.mts +2 -2
- package/dist/narration.mjs +1 -2
- package/dist/native.cjs +9 -0
- package/dist/native.d.mts +4 -3
- package/dist/native.mjs +3 -2
- package/dist/nodePlatform.cjs +77 -0
- package/dist/nodePlatform.cjs.map +1 -0
- package/dist/nodePlatform.d.mts +17 -0
- package/dist/nodePlatform.d.mts.map +1 -0
- package/dist/nodePlatform.mjs +72 -0
- package/dist/nodePlatform.mjs.map +1 -0
- package/dist/notification.cjs +15 -15
- package/dist/notification.d.mts +2 -2
- package/dist/notification.mjs +1 -2
- package/dist/packageApi.cjs +11 -11
- package/dist/packageApi.d.mts +2 -2
- package/dist/packageApi.mjs +2 -2
- package/dist/packageApiServer.cjs +45 -27
- package/dist/packageApiServer.cjs.map +1 -1
- package/dist/packageApiServer.d.mts +36 -26
- package/dist/packageApiServer.d.mts.map +1 -1
- package/dist/packageApiServer.mjs +44 -26
- package/dist/packageApiServer.mjs.map +1 -1
- package/dist/piSettings.cjs +41 -20
- package/dist/piSettings.d.mts +4 -2
- package/dist/piSettings.mjs +4 -2
- package/dist/platform.cjs +62 -0
- package/dist/platform.d.mts +10 -0
- package/dist/platform.mjs +10 -0
- package/dist/pluginProtocol.cjs +7 -8
- package/dist/pluginProtocol.d.mts +2 -2
- package/dist/pluginProtocol.mjs +1 -2
- package/dist/poPackage.cjs +12 -0
- package/dist/poPackage.d.mts +3 -0
- package/dist/poPackage.mjs +3 -0
- package/dist/profileIdentity.cjs +1 -1
- package/dist/profileIdentity.d.mts +2 -2
- package/dist/profileIdentity.mjs +1 -2
- package/dist/protocol.cjs +3 -3
- package/dist/protocol.d.mts +2 -2
- package/dist/protocol.mjs +1 -2
- package/dist/readiness.cjs +6 -6
- package/dist/readiness.d.mts +2 -2
- package/dist/readiness.mjs +1 -2
- package/dist/remoteApi.cjs.map +1 -1
- package/dist/remoteApi.d.mts +2 -2
- package/dist/remoteApi.mjs.map +1 -1
- package/dist/remoteRuntime.cjs +42 -65
- package/dist/remoteRuntime.cjs.map +1 -1
- package/dist/remoteRuntime.d.mts +3 -2
- package/dist/remoteRuntime.d.mts.map +1 -1
- package/dist/remoteRuntime.mjs +41 -62
- package/dist/remoteRuntime.mjs.map +1 -1
- package/dist/runtimeConfig.cjs +4 -4
- package/dist/runtimeConfig.cjs.map +1 -1
- package/dist/runtimeConfig.d.mts +10 -9
- package/dist/runtimeConfig.d.mts.map +1 -1
- package/dist/runtimeConfig.mjs +4 -4
- package/dist/runtimeConfig.mjs.map +1 -1
- package/dist/runtimeContextApi.cjs +10 -3
- package/dist/runtimeContextApi.cjs.map +1 -1
- package/dist/runtimeContextApi.d.mts +3 -3
- package/dist/runtimeContextApi.d.mts.map +1 -1
- package/dist/runtimeContextApi.mjs +10 -3
- package/dist/runtimeContextApi.mjs.map +1 -1
- package/dist/runtimeCordisHost.cjs +46 -46
- package/dist/runtimeCordisHost.cjs.map +1 -1
- package/dist/runtimeCordisHost.d.mts +29 -28
- package/dist/runtimeCordisHost.d.mts.map +1 -1
- package/dist/runtimeCordisHost.mjs +42 -42
- package/dist/runtimeCordisHost.mjs.map +1 -1
- package/dist/runtimeIdentity.cjs +6 -9
- package/dist/runtimeIdentity.cjs.map +1 -1
- package/dist/runtimeIdentity.d.mts +5 -1
- package/dist/runtimeIdentity.d.mts.map +1 -1
- package/dist/runtimeIdentity.mjs +5 -8
- package/dist/runtimeIdentity.mjs.map +1 -1
- package/dist/runtimeJson.cjs +10 -45
- package/dist/runtimeJson.d.mts +3 -22
- package/dist/runtimeJson.mjs +3 -39
- package/dist/runtimeLogSinkTelemetry.cjs +19 -19
- package/dist/runtimeLogSinkTelemetry.cjs.map +1 -1
- package/dist/runtimeLogSinkTelemetry.d.mts +19 -19
- package/dist/runtimeLogSinkTelemetry.mjs +19 -19
- package/dist/runtimeLogSinkTelemetry.mjs.map +1 -1
- package/dist/runtimePackages.cjs +7 -2
- package/dist/runtimePackages.cjs.map +1 -1
- package/dist/runtimePackages.d.mts +4 -1
- package/dist/runtimePackages.d.mts.map +1 -1
- package/dist/runtimePackages.mjs +7 -2
- package/dist/runtimePackages.mjs.map +1 -1
- package/dist/runtimePiSettings.cjs +40 -263
- package/dist/runtimePiSettings.d.mts +3 -72
- package/dist/runtimePiSettings.mjs +3 -241
- package/dist/runtimeProtocol.cjs +19 -19
- package/dist/runtimeProtocol.cjs.map +1 -1
- package/dist/runtimeProtocol.d.mts +7 -7
- package/dist/runtimeProtocol.d.mts.map +1 -1
- package/dist/runtimeProtocol.mjs +17 -17
- package/dist/runtimeProtocol.mjs.map +1 -1
- package/dist/runtimeTransition.cjs +9 -9
- package/dist/runtimeTransition.cjs.map +1 -1
- package/dist/runtimeTransition.d.mts +10 -10
- package/dist/runtimeTransition.d.mts.map +1 -1
- package/dist/runtimeTransition.mjs +7 -7
- package/dist/runtimeTransition.mjs.map +1 -1
- package/dist/sandboxHarness.mjs +1 -2
- package/dist/server.cjs +3 -7
- package/dist/server.d.mts +6 -6
- package/dist/server.mjs +3 -4
- package/dist/serverPlugin.cjs +39 -0
- package/dist/serverPlugin.d.mts +12 -0
- package/dist/serverPlugin.mjs +11 -0
- package/dist/serverTelemetry.cjs +1 -1
- package/dist/serverTelemetry.cjs.map +1 -1
- package/dist/serverTelemetry.d.mts +2 -2
- package/dist/serverTelemetry.mjs +2 -2
- package/dist/serverTelemetry.mjs.map +1 -1
- package/dist/sessionFilesApi.cjs +41 -37
- package/dist/sessionFilesApi.cjs.map +1 -1
- package/dist/sessionFilesApi.d.mts +6 -3
- package/dist/sessionFilesApi.d.mts.map +1 -1
- package/dist/sessionFilesApi.mjs +41 -36
- package/dist/sessionFilesApi.mjs.map +1 -1
- package/dist/sessionProtocol.cjs +31 -6
- package/dist/sessionProtocol.d.mts +8 -3
- package/dist/sessionProtocol.mjs +8 -2
- package/dist/skills.cjs +5 -5
- package/dist/skills.d.mts +2 -2
- package/dist/skills.mjs +1 -2
- package/dist/sqliteSessionStorage.cjs +28 -50
- package/dist/sqliteSessionStorage.cjs.map +1 -1
- package/dist/sqliteSessionStorage.d.mts +13 -20
- package/dist/sqliteSessionStorage.d.mts.map +1 -1
- package/dist/sqliteSessionStorage.mjs +25 -48
- package/dist/sqliteSessionStorage.mjs.map +1 -1
- package/dist/src/constants/agentSettled.cjs +7 -0
- package/dist/src/constants/agentSettled.cjs.map +1 -0
- package/dist/src/constants/agentSettled.mjs +7 -0
- package/dist/src/constants/agentSettled.mjs.map +1 -0
- package/dist/src/constants/contextApi.cjs +3 -1
- package/dist/src/constants/contextApi.cjs.map +1 -1
- package/dist/src/constants/contextApi.d.mts +2 -1
- package/dist/src/constants/contextApi.d.mts.map +1 -1
- package/dist/src/constants/contextApi.mjs +3 -2
- package/dist/src/constants/contextApi.mjs.map +1 -1
- package/dist/src/constants/voiceTools.cjs +6 -6
- package/dist/src/constants/voiceTools.cjs.map +1 -1
- package/dist/src/constants/voiceTools.d.mts +3 -3
- package/dist/src/constants/voiceTools.mjs +4 -4
- package/dist/src/constants/voiceTools.mjs.map +1 -1
- package/dist/src/extensions/extensionFile.cjs +22 -5
- package/dist/src/extensions/extensionFile.cjs.map +1 -1
- package/dist/src/extensions/extensionFile.d.mts +17 -4
- package/dist/src/extensions/extensionFile.d.mts.map +1 -1
- package/dist/src/extensions/extensionFile.mjs +22 -6
- package/dist/src/extensions/extensionFile.mjs.map +1 -1
- package/dist/src/extensions/serverPlugin.cjs +231 -92
- package/dist/src/extensions/serverPlugin.cjs.map +1 -1
- package/dist/src/extensions/serverPlugin.d.mts +2 -2
- package/dist/src/extensions/serverPlugin.d.mts.map +1 -1
- package/dist/src/extensions/serverPlugin.mjs +232 -93
- package/dist/src/extensions/serverPlugin.mjs.map +1 -1
- package/dist/src/pi/piSessionRuntime.cjs +349 -142
- package/dist/src/pi/piSessionRuntime.cjs.map +1 -1
- package/dist/src/pi/piSessionRuntime.d.mts +18 -17
- package/dist/src/pi/piSessionRuntime.d.mts.map +1 -1
- package/dist/src/pi/piSessionRuntime.mjs +342 -135
- package/dist/src/pi/piSessionRuntime.mjs.map +1 -1
- package/dist/src/schemas/agentModel.cjs +2 -2
- package/dist/src/schemas/agentModel.cjs.map +1 -1
- package/dist/src/schemas/agentModel.d.mts +1 -1
- package/dist/src/schemas/agentModel.mjs +2 -2
- package/dist/src/schemas/agentModel.mjs.map +1 -1
- package/dist/src/schemas/apiContracts.d.mts +2 -2
- package/dist/src/schemas/apiContracts.d.mts.map +1 -1
- package/dist/src/schemas/askUser.cjs +4 -4
- package/dist/src/schemas/askUser.cjs.map +1 -1
- package/dist/src/schemas/askUser.d.mts +4 -4
- package/dist/src/schemas/askUser.d.mts.map +1 -1
- package/dist/src/schemas/askUser.mjs +3 -3
- package/dist/src/schemas/askUser.mjs.map +1 -1
- package/dist/src/schemas/backgroundWork.cjs +10 -10
- package/dist/src/schemas/backgroundWork.cjs.map +1 -1
- package/dist/src/schemas/backgroundWork.d.mts +9 -9
- package/dist/src/schemas/backgroundWork.d.mts.map +1 -1
- package/dist/src/schemas/backgroundWork.mjs +8 -8
- package/dist/src/schemas/backgroundWork.mjs.map +1 -1
- package/dist/src/schemas/childProcess.cjs +5 -5
- package/dist/src/schemas/childProcess.cjs.map +1 -1
- package/dist/src/schemas/childProcess.d.mts +2 -2
- package/dist/src/schemas/childProcess.mjs +5 -5
- package/dist/src/schemas/childProcess.mjs.map +1 -1
- package/dist/src/schemas/contextContributions.cjs +10 -10
- package/dist/src/schemas/contextContributions.cjs.map +1 -1
- package/dist/src/schemas/contextContributions.d.mts +16 -16
- package/dist/src/schemas/contextContributions.d.mts.map +1 -1
- package/dist/src/schemas/contextContributions.mjs +8 -8
- package/dist/src/schemas/contextContributions.mjs.map +1 -1
- package/dist/src/schemas/delegation.cjs +17 -17
- package/dist/src/schemas/delegation.cjs.map +1 -1
- package/dist/src/schemas/delegation.d.mts +16 -16
- package/dist/src/schemas/delegation.d.mts.map +1 -1
- package/dist/src/schemas/delegation.mjs +10 -10
- package/dist/src/schemas/delegation.mjs.map +1 -1
- package/dist/src/schemas/extensionFile.d.mts +23 -19
- package/dist/src/schemas/extensionFile.d.mts.map +1 -1
- package/dist/src/schemas/footer.cjs.map +1 -1
- package/dist/src/schemas/footer.d.mts +5 -5
- package/dist/src/schemas/footer.d.mts.map +1 -1
- package/dist/src/schemas/footer.mjs.map +1 -1
- package/dist/src/schemas/headless.cjs +37 -37
- package/dist/src/schemas/headless.cjs.map +1 -1
- package/dist/src/schemas/headless.d.mts +100 -101
- package/dist/src/schemas/headless.d.mts.map +1 -1
- package/dist/src/schemas/headless.mjs +24 -24
- package/dist/src/schemas/headless.mjs.map +1 -1
- package/dist/src/schemas/help.cjs +60 -60
- package/dist/src/schemas/help.cjs.map +1 -1
- package/dist/src/schemas/help.d.mts +43 -43
- package/dist/src/schemas/help.d.mts.map +1 -1
- package/dist/src/schemas/help.mjs +41 -41
- package/dist/src/schemas/help.mjs.map +1 -1
- package/dist/src/schemas/home.cjs +127 -0
- package/dist/src/schemas/home.cjs.map +1 -0
- package/dist/src/schemas/home.d.mts +63 -0
- package/dist/src/schemas/home.d.mts.map +1 -0
- package/dist/src/schemas/home.mjs +121 -0
- package/dist/src/schemas/home.mjs.map +1 -0
- package/dist/src/schemas/httpApiContracts.cjs +441 -0
- package/dist/src/schemas/httpApiContracts.cjs.map +1 -0
- package/dist/src/schemas/httpApiContracts.d.mts +78 -0
- package/dist/src/schemas/httpApiContracts.d.mts.map +1 -0
- package/dist/src/schemas/httpApiContracts.mjs +434 -0
- package/dist/src/schemas/httpApiContracts.mjs.map +1 -0
- package/dist/src/schemas/hubChannel.cjs +3 -0
- package/dist/src/schemas/hubChannel.cjs.map +1 -1
- package/dist/src/schemas/hubChannel.d.mts +84 -60
- package/dist/src/schemas/hubChannel.d.mts.map +1 -1
- package/dist/src/schemas/hubChannel.mjs +3 -1
- package/dist/src/schemas/hubChannel.mjs.map +1 -1
- package/dist/src/schemas/leader.cjs.map +1 -1
- package/dist/src/schemas/leader.d.mts +3 -3
- package/dist/src/schemas/leader.d.mts.map +1 -1
- package/dist/src/schemas/leader.mjs.map +1 -1
- package/dist/src/schemas/mcpBundle.d.mts +3 -3
- package/dist/src/schemas/mcpFacet.cjs.map +1 -1
- package/dist/src/schemas/mcpFacet.d.mts +22 -22
- package/dist/src/schemas/mcpFacet.d.mts.map +1 -1
- package/dist/src/schemas/mcpFacet.mjs.map +1 -1
- package/dist/src/schemas/mcpProjection.cjs +41 -41
- package/dist/src/schemas/mcpProjection.cjs.map +1 -1
- package/dist/src/schemas/mcpProjection.d.mts +31 -30
- package/dist/src/schemas/mcpProjection.d.mts.map +1 -1
- package/dist/src/schemas/mcpProjection.mjs +29 -29
- package/dist/src/schemas/mcpProjection.mjs.map +1 -1
- package/dist/src/schemas/mcpSession.cjs +23 -23
- package/dist/src/schemas/mcpSession.cjs.map +1 -1
- package/dist/src/schemas/mcpSession.d.mts +12 -12
- package/dist/src/schemas/mcpSession.d.mts.map +1 -1
- package/dist/src/schemas/mcpSession.mjs +18 -18
- package/dist/src/schemas/mcpSession.mjs.map +1 -1
- package/dist/src/schemas/mcpStatus.cjs +5 -5
- package/dist/src/schemas/mcpStatus.cjs.map +1 -1
- package/dist/src/schemas/mcpStatus.d.mts +4 -4
- package/dist/src/schemas/mcpStatus.d.mts.map +1 -1
- package/dist/src/schemas/mcpStatus.mjs +4 -4
- package/dist/src/schemas/mcpStatus.mjs.map +1 -1
- package/dist/src/schemas/mcpToolResolver.cjs +9 -9
- package/dist/src/schemas/mcpToolResolver.cjs.map +1 -1
- package/dist/src/schemas/mcpToolResolver.d.mts +7 -7
- package/dist/src/schemas/mcpToolResolver.d.mts.map +1 -1
- package/dist/src/schemas/mcpToolResolver.mjs +7 -7
- package/dist/src/schemas/mcpToolResolver.mjs.map +1 -1
- package/dist/src/schemas/narration.cjs +9 -9
- package/dist/src/schemas/narration.cjs.map +1 -1
- package/dist/src/schemas/narration.d.mts +5 -5
- package/dist/src/schemas/narration.d.mts.map +1 -1
- package/dist/src/schemas/narration.mjs +7 -7
- package/dist/src/schemas/narration.mjs.map +1 -1
- package/dist/src/schemas/notification.cjs +45 -45
- package/dist/src/schemas/notification.cjs.map +1 -1
- package/dist/src/schemas/notification.d.mts +22 -22
- package/dist/src/schemas/notification.d.mts.map +1 -1
- package/dist/src/schemas/notification.mjs +31 -31
- package/dist/src/schemas/notification.mjs.map +1 -1
- package/dist/src/schemas/packageApi.cjs +28 -28
- package/dist/src/schemas/packageApi.cjs.map +1 -1
- package/dist/src/schemas/packageApi.d.mts +91 -65
- package/dist/src/schemas/packageApi.d.mts.map +1 -1
- package/dist/src/schemas/packageApi.mjs +18 -18
- package/dist/src/schemas/packageApi.mjs.map +1 -1
- package/dist/src/schemas/platform.cjs +34 -0
- package/dist/src/schemas/platform.cjs.map +1 -0
- package/dist/src/schemas/platform.d.mts +75 -0
- package/dist/src/schemas/platform.d.mts.map +1 -0
- package/dist/src/schemas/platform.mjs +27 -0
- package/dist/src/schemas/platform.mjs.map +1 -0
- package/dist/src/schemas/pluginContributions.cjs.map +1 -1
- package/dist/src/schemas/pluginContributions.d.mts +12 -12
- package/dist/src/schemas/pluginContributions.d.mts.map +1 -1
- package/dist/src/schemas/pluginContributions.mjs.map +1 -1
- package/dist/src/schemas/pluginProtocol.cjs +24 -27
- package/dist/src/schemas/pluginProtocol.cjs.map +1 -1
- package/dist/src/schemas/pluginProtocol.d.mts +21 -21
- package/dist/src/schemas/pluginProtocol.d.mts.map +1 -1
- package/dist/src/schemas/pluginProtocol.mjs +18 -20
- package/dist/src/schemas/pluginProtocol.mjs.map +1 -1
- package/dist/src/schemas/profileIdentity.cjs +2 -2
- package/dist/src/schemas/profileIdentity.cjs.map +1 -1
- package/dist/src/schemas/profileIdentity.d.mts +1 -1
- package/dist/src/schemas/profileIdentity.mjs +2 -2
- package/dist/src/schemas/profileIdentity.mjs.map +1 -1
- package/dist/src/schemas/protocolChannelsContract.cjs +27 -0
- package/dist/src/schemas/protocolChannelsContract.cjs.map +1 -0
- package/dist/src/schemas/protocolChannelsContract.d.mts +37 -0
- package/dist/src/schemas/protocolChannelsContract.d.mts.map +1 -0
- package/dist/src/schemas/protocolChannelsContract.mjs +25 -0
- package/dist/src/schemas/protocolChannelsContract.mjs.map +1 -0
- package/dist/src/schemas/protocolContracts.cjs +168 -0
- package/dist/src/schemas/protocolContracts.cjs.map +1 -0
- package/dist/src/schemas/protocolContracts.d.mts +69 -0
- package/dist/src/schemas/protocolContracts.d.mts.map +1 -0
- package/dist/src/schemas/protocolContracts.mjs +164 -0
- package/dist/src/schemas/protocolContracts.mjs.map +1 -0
- package/dist/src/schemas/protocolHubContract.cjs +51 -0
- package/dist/src/schemas/protocolHubContract.cjs.map +1 -0
- package/dist/src/schemas/protocolHubContract.d.mts +218 -0
- package/dist/src/schemas/protocolHubContract.d.mts.map +1 -0
- package/dist/src/schemas/protocolHubContract.mjs +49 -0
- package/dist/src/schemas/protocolHubContract.mjs.map +1 -0
- package/dist/src/schemas/protocolSessionContract.cjs +22 -0
- package/dist/src/schemas/protocolSessionContract.cjs.map +1 -0
- package/dist/src/schemas/protocolSessionContract.d.mts +324 -0
- package/dist/src/schemas/protocolSessionContract.d.mts.map +1 -0
- package/dist/src/schemas/protocolSessionContract.mjs +22 -0
- package/dist/src/schemas/protocolSessionContract.mjs.map +1 -0
- package/dist/src/schemas/protocolThreadContract.cjs +21 -0
- package/dist/src/schemas/protocolThreadContract.cjs.map +1 -0
- package/dist/src/schemas/protocolThreadContract.d.mts +29 -0
- package/dist/src/schemas/protocolThreadContract.d.mts.map +1 -0
- package/dist/src/schemas/protocolThreadContract.mjs +20 -0
- package/dist/src/schemas/protocolThreadContract.mjs.map +1 -0
- package/dist/src/schemas/readiness.cjs +36 -36
- package/dist/src/schemas/readiness.cjs.map +1 -1
- package/dist/src/schemas/readiness.d.mts +37 -37
- package/dist/src/schemas/readiness.d.mts.map +1 -1
- package/dist/src/schemas/readiness.mjs +31 -31
- package/dist/src/schemas/readiness.mjs.map +1 -1
- package/dist/src/schemas/serverBundle.d.mts +5 -5
- package/dist/src/schemas/serverPlugin.cjs +103 -0
- package/dist/src/schemas/serverPlugin.cjs.map +1 -0
- package/dist/src/schemas/serverPlugin.d.mts +176 -0
- package/dist/src/schemas/serverPlugin.d.mts.map +1 -0
- package/dist/src/schemas/serverPlugin.mjs +95 -0
- package/dist/src/schemas/serverPlugin.mjs.map +1 -0
- package/dist/src/schemas/serverScope.cjs +37 -0
- package/dist/src/schemas/serverScope.cjs.map +1 -0
- package/dist/src/schemas/serverScope.d.mts +77 -0
- package/dist/src/schemas/serverScope.d.mts.map +1 -0
- package/dist/src/schemas/serverScope.mjs +33 -0
- package/dist/src/schemas/serverScope.mjs.map +1 -0
- package/dist/src/schemas/sessionApiContracts.cjs +320 -0
- package/dist/src/schemas/sessionApiContracts.cjs.map +1 -0
- package/dist/src/schemas/sessionApiContracts.mjs +318 -0
- package/dist/src/schemas/sessionApiContracts.mjs.map +1 -0
- package/dist/src/schemas/sessionProtocol.cjs +20 -13
- package/dist/src/schemas/sessionProtocol.cjs.map +1 -1
- package/dist/src/schemas/sessionProtocol.d.mts +37 -54
- package/dist/src/schemas/sessionProtocol.d.mts.map +1 -1
- package/dist/src/schemas/sessionProtocol.mjs +17 -8
- package/dist/src/schemas/sessionProtocol.mjs.map +1 -1
- package/dist/src/schemas/skills.cjs +16 -16
- package/dist/src/schemas/skills.cjs.map +1 -1
- package/dist/src/schemas/skills.d.mts +7 -7
- package/dist/src/schemas/skills.d.mts.map +1 -1
- package/dist/src/schemas/skills.mjs +12 -12
- package/dist/src/schemas/skills.mjs.map +1 -1
- package/dist/src/schemas/toolOverrides.cjs +9 -9
- package/dist/src/schemas/toolOverrides.cjs.map +1 -1
- package/dist/src/schemas/toolOverrides.d.mts +8 -8
- package/dist/src/schemas/toolOverrides.d.mts.map +1 -1
- package/dist/src/schemas/toolOverrides.mjs +7 -7
- package/dist/src/schemas/toolOverrides.mjs.map +1 -1
- package/dist/src/schemas/toolSurface.cjs +9 -9
- package/dist/src/schemas/toolSurface.cjs.map +1 -1
- package/dist/src/schemas/toolSurface.d.mts +13 -13
- package/dist/src/schemas/toolSurface.d.mts.map +1 -1
- package/dist/src/schemas/toolSurface.mjs +7 -7
- package/dist/src/schemas/toolSurface.mjs.map +1 -1
- package/dist/src/schemas/uiHub.cjs +9 -9
- package/dist/src/schemas/uiHub.cjs.map +1 -1
- package/dist/src/schemas/uiHub.d.mts +12 -12
- package/dist/src/schemas/uiHub.d.mts.map +1 -1
- package/dist/src/schemas/uiHub.mjs +7 -7
- package/dist/src/schemas/uiHub.mjs.map +1 -1
- package/dist/src/server/directHarnessRuntime.cjs +691 -775
- package/dist/src/server/directHarnessRuntime.cjs.map +1 -1
- package/dist/src/server/directHarnessRuntime.d.mts +5 -1
- package/dist/src/server/directHarnessRuntime.d.mts.map +1 -0
- package/dist/src/server/directHarnessRuntime.mjs +671 -754
- package/dist/src/server/directHarnessRuntime.mjs.map +1 -1
- package/dist/src/server/largeFrameLink.cjs +47 -0
- package/dist/src/server/largeFrameLink.cjs.map +1 -0
- package/dist/src/server/largeFrameLink.mjs +47 -0
- package/dist/src/server/largeFrameLink.mjs.map +1 -0
- package/dist/src/server/liveImport.cjs +1 -1
- package/dist/src/server/liveImport.cjs.map +1 -1
- package/dist/src/server/liveImport.d.mts +1 -1
- package/dist/src/server/liveImport.mjs +1 -1
- package/dist/src/server/liveImport.mjs.map +1 -1
- package/dist/src/server/mcpBundleLoader.cjs.map +1 -1
- package/dist/src/server/mcpBundleLoader.d.mts +6 -6
- package/dist/src/server/mcpBundleLoader.d.mts.map +1 -1
- package/dist/src/server/mcpBundleLoader.mjs.map +1 -1
- package/dist/src/server/serverPackages.cjs +60 -0
- package/dist/src/server/serverPackages.cjs.map +1 -0
- package/dist/src/server/serverPackages.d.mts +44 -0
- package/dist/src/server/serverPackages.d.mts.map +1 -0
- package/dist/src/server/serverPackages.mjs +59 -0
- package/dist/src/server/serverPackages.mjs.map +1 -0
- package/dist/src/server/serverScope.cjs +510 -0
- package/dist/src/server/serverScope.cjs.map +1 -0
- package/dist/src/server/serverScope.d.mts +123 -0
- package/dist/src/server/serverScope.d.mts.map +1 -0
- package/dist/src/server/serverScope.mjs +510 -0
- package/dist/src/server/serverScope.mjs.map +1 -0
- package/dist/src/server/sessionMcpHandler.cjs +3 -3
- package/dist/src/server/sessionMcpHandler.cjs.map +1 -1
- package/dist/src/server/sessionMcpHandler.mjs +4 -4
- package/dist/src/server/sessionMcpHandler.mjs.map +1 -1
- package/dist/src/server/sessionMcpRoutes.cjs +2 -1
- package/dist/src/server/sessionMcpRoutes.cjs.map +1 -1
- package/dist/src/server/sessionMcpRoutes.mjs +2 -1
- package/dist/src/server/sessionMcpRoutes.mjs.map +1 -1
- package/dist/src/server/threadJournals.cjs +38 -107
- package/dist/src/server/threadJournals.cjs.map +1 -1
- package/dist/src/server/threadJournals.mjs +38 -104
- package/dist/src/server/threadJournals.mjs.map +1 -1
- package/dist/src/services/apiSurfaceAssert/index.cjs +1 -1
- package/dist/src/services/apiSurfaceAssert/index.cjs.map +1 -1
- package/dist/src/services/apiSurfaceAssert/index.d.mts +6 -6
- package/dist/src/services/apiSurfaceAssert/index.mjs +1 -1
- package/dist/src/services/apiSurfaceAssert/index.mjs.map +1 -1
- package/dist/src/services/chatgptAuth/index.cjs +1 -220
- package/dist/src/services/chatgptAuth/index.cjs.map +1 -1
- package/dist/src/services/chatgptAuth/index.d.mts +0 -18
- package/dist/src/services/chatgptAuth/index.d.mts.map +1 -1
- package/dist/src/services/chatgptAuth/index.mjs +1 -217
- package/dist/src/services/chatgptAuth/index.mjs.map +1 -1
- package/dist/src/services/chatgptImages/index.cjs +1 -1
- package/dist/src/services/chatgptImages/index.cjs.map +1 -1
- package/dist/src/services/chatgptImages/index.mjs +1 -1
- package/dist/src/services/chatgptImages/index.mjs.map +1 -1
- package/dist/src/services/chatgptLogin/index.cjs +230 -0
- package/dist/src/services/chatgptLogin/index.cjs.map +1 -0
- package/dist/src/services/chatgptLogin/index.d.mts +21 -0
- package/dist/src/services/chatgptLogin/index.d.mts.map +1 -0
- package/dist/src/services/chatgptLogin/index.mjs +227 -0
- package/dist/src/services/chatgptLogin/index.mjs.map +1 -0
- package/dist/src/services/chatgptWebSearch/index.cjs +1 -1
- package/dist/src/services/chatgptWebSearch/index.cjs.map +1 -1
- package/dist/src/services/chatgptWebSearch/index.mjs +1 -1
- package/dist/src/services/chatgptWebSearch/index.mjs.map +1 -1
- package/dist/src/services/contextContributions/index.cjs +8 -8
- package/dist/src/services/contextContributions/index.cjs.map +1 -1
- package/dist/src/services/contextContributions/index.d.mts +3 -3
- package/dist/src/services/contextContributions/index.d.mts.map +1 -1
- package/dist/src/services/contextContributions/index.mjs +8 -8
- package/dist/src/services/contextContributions/index.mjs.map +1 -1
- package/dist/src/services/devProxyStore/devProxyRecords.cjs +59 -0
- package/dist/src/services/devProxyStore/devProxyRecords.cjs.map +1 -0
- package/dist/src/services/devProxyStore/devProxyRecords.mjs +56 -0
- package/dist/src/services/devProxyStore/devProxyRecords.mjs.map +1 -0
- package/dist/src/services/devProxyStore/index.cjs +7 -101
- package/dist/src/services/devProxyStore/index.cjs.map +1 -1
- package/dist/src/services/devProxyStore/index.mjs +7 -101
- package/dist/src/services/devProxyStore/index.mjs.map +1 -1
- package/dist/src/services/devProxyStore/sync.cjs +66 -0
- package/dist/src/services/devProxyStore/sync.cjs.map +1 -0
- package/dist/src/services/devProxyStore/sync.mjs +63 -0
- package/dist/src/services/devProxyStore/sync.mjs.map +1 -0
- package/dist/src/services/durableNavigation/docs.cjs +15 -0
- package/dist/src/services/durableNavigation/docs.cjs.map +1 -0
- package/dist/src/services/durableNavigation/docs.mjs +16 -0
- package/dist/src/services/durableNavigation/docs.mjs.map +1 -0
- package/dist/src/services/durableNavigation/index.cjs +3 -18
- package/dist/src/services/durableNavigation/index.cjs.map +1 -1
- package/dist/src/services/durableNavigation/index.mjs +2 -17
- package/dist/src/services/durableNavigation/index.mjs.map +1 -1
- package/dist/src/services/durableQueue/docs.cjs +12 -0
- package/dist/src/services/durableQueue/docs.cjs.map +1 -0
- package/dist/src/services/durableQueue/docs.mjs +13 -0
- package/dist/src/services/durableQueue/docs.mjs.map +1 -0
- package/dist/src/services/durableQueue/index.cjs +151 -0
- package/dist/src/services/durableQueue/index.cjs.map +1 -0
- package/dist/src/services/durableQueue/index.mjs +149 -0
- package/dist/src/services/durableQueue/index.mjs.map +1 -0
- package/dist/src/services/durableRequestReceipts/docs.cjs +11 -0
- package/dist/src/services/durableRequestReceipts/docs.cjs.map +1 -0
- package/dist/src/services/durableRequestReceipts/docs.mjs +12 -0
- package/dist/src/services/durableRequestReceipts/docs.mjs.map +1 -0
- package/dist/src/services/{requestReceipts → durableRequestReceipts}/index.cjs +10 -16
- package/dist/src/services/durableRequestReceipts/index.cjs.map +1 -0
- package/dist/src/services/durableRequestReceipts/index.d.mts +12 -0
- package/dist/src/services/durableRequestReceipts/index.d.mts.map +1 -0
- package/dist/src/services/{requestReceipts → durableRequestReceipts}/index.mjs +7 -13
- package/dist/src/services/durableRequestReceipts/index.mjs.map +1 -0
- package/dist/src/services/durableSession/docs.cjs +65 -0
- package/dist/src/services/durableSession/docs.cjs.map +1 -0
- package/dist/src/services/durableSession/docs.d.mts +17 -0
- package/dist/src/services/durableSession/docs.d.mts.map +1 -0
- package/dist/src/services/durableSession/docs.mjs +60 -0
- package/dist/src/services/durableSession/docs.mjs.map +1 -0
- package/dist/src/services/durableSession/index.cjs +21 -0
- package/dist/src/services/durableSession/index.cjs.map +1 -0
- package/dist/src/services/durableSession/index.d.mts +13 -0
- package/dist/src/services/durableSession/index.d.mts.map +1 -0
- package/dist/src/services/durableSession/index.mjs +20 -0
- package/dist/src/services/durableSession/index.mjs.map +1 -0
- package/dist/src/services/durableSubagents/docs.cjs +15 -0
- package/dist/src/services/durableSubagents/docs.cjs.map +1 -0
- package/dist/src/services/durableSubagents/docs.mjs +16 -0
- package/dist/src/services/durableSubagents/docs.mjs.map +1 -0
- package/dist/src/services/durableSubagents/extension.cjs +11 -0
- package/dist/src/services/durableSubagents/extension.cjs.map +1 -0
- package/dist/src/services/durableSubagents/extension.mjs +12 -0
- package/dist/src/services/durableSubagents/extension.mjs.map +1 -0
- package/dist/src/services/durableSubagents/index.cjs +95 -0
- package/dist/src/services/durableSubagents/index.cjs.map +1 -0
- package/dist/src/services/durableSubagents/index.mjs +90 -0
- package/dist/src/services/durableSubagents/index.mjs.map +1 -0
- package/dist/src/services/durableSubagents/tasks.cjs +25 -0
- package/dist/src/services/durableSubagents/tasks.cjs.map +1 -0
- package/dist/src/services/durableSubagents/tasks.mjs +26 -0
- package/dist/src/services/durableSubagents/tasks.mjs.map +1 -0
- package/dist/src/services/headlessClient/index.cjs +20 -13
- package/dist/src/services/headlessClient/index.cjs.map +1 -1
- package/dist/src/services/headlessClient/index.mjs +21 -14
- package/dist/src/services/headlessClient/index.mjs.map +1 -1
- package/dist/src/services/historyOwnership/type.d.mts +15 -0
- package/dist/src/services/historyOwnership/type.d.mts.map +1 -0
- package/dist/src/services/hubChannelHarness/index.cjs +2 -2
- package/dist/src/services/hubChannelHarness/index.cjs.map +1 -1
- package/dist/src/services/hubChannelHarness/index.d.mts +8 -8
- package/dist/src/services/hubChannelHarness/index.d.mts.map +1 -1
- package/dist/src/services/hubChannelHarness/index.mjs +2 -2
- package/dist/src/services/hubChannelHarness/index.mjs.map +1 -1
- package/dist/src/services/json/core.cjs +30 -0
- package/dist/src/services/json/core.cjs.map +1 -0
- package/dist/src/services/json/core.d.mts +21 -0
- package/dist/src/services/json/core.d.mts.map +1 -0
- package/dist/src/services/json/core.mjs +26 -0
- package/dist/src/services/json/core.mjs.map +1 -0
- package/dist/src/services/json/sync.cjs +48 -0
- package/dist/src/services/json/sync.cjs.map +1 -0
- package/dist/src/services/json/sync.d.mts +22 -0
- package/dist/src/services/json/sync.d.mts.map +1 -0
- package/dist/src/services/json/sync.mjs +43 -0
- package/dist/src/services/json/sync.mjs.map +1 -0
- package/dist/src/services/kernel/index.cjs +2 -2
- package/dist/src/services/kernel/index.cjs.map +1 -1
- package/dist/src/services/kernel/index.d.mts +3 -3
- package/dist/src/services/kernel/index.d.mts.map +1 -1
- package/dist/src/services/kernel/index.mjs +2 -2
- package/dist/src/services/kernel/index.mjs.map +1 -1
- package/dist/src/services/nativeChildTools/index.cjs +16 -0
- package/dist/src/services/nativeChildTools/index.cjs.map +1 -0
- package/dist/src/services/nativeChildTools/index.mjs +16 -0
- package/dist/src/services/nativeChildTools/index.mjs.map +1 -0
- package/dist/src/services/nodeHost/index.cjs +30 -0
- package/dist/src/services/nodeHost/index.cjs.map +1 -0
- package/dist/src/services/nodeHost/index.d.mts +16 -0
- package/dist/src/services/nodeHost/index.d.mts.map +1 -0
- package/dist/src/services/nodeHost/index.mjs +27 -0
- package/dist/src/services/nodeHost/index.mjs.map +1 -0
- package/dist/src/services/nodeModelDependencies/index.cjs +89 -0
- package/dist/src/services/nodeModelDependencies/index.cjs.map +1 -0
- package/dist/src/services/nodeModelDependencies/index.mjs +86 -0
- package/dist/src/services/nodeModelDependencies/index.mjs.map +1 -0
- package/dist/src/services/openSessionRegistry/index.cjs +6 -128
- package/dist/src/services/openSessionRegistry/index.cjs.map +1 -1
- package/dist/src/services/openSessionRegistry/index.d.mts +5 -36
- package/dist/src/services/openSessionRegistry/index.mjs +6 -128
- package/dist/src/services/openSessionRegistry/index.mjs.map +1 -1
- package/dist/src/services/openSessionRegistry/openSessionRecords.cjs +87 -0
- package/dist/src/services/openSessionRegistry/openSessionRecords.cjs.map +1 -0
- package/dist/src/services/openSessionRegistry/openSessionRecords.d.mts +30 -0
- package/dist/src/services/openSessionRegistry/openSessionRecords.d.mts.map +1 -0
- package/dist/src/services/openSessionRegistry/openSessionRecords.mjs +81 -0
- package/dist/src/services/openSessionRegistry/openSessionRecords.mjs.map +1 -0
- package/dist/src/services/openSessionRegistry/sync.cjs +71 -0
- package/dist/src/services/openSessionRegistry/sync.cjs.map +1 -0
- package/dist/src/services/openSessionRegistry/sync.d.mts +14 -0
- package/dist/src/services/openSessionRegistry/sync.d.mts.map +1 -0
- package/dist/src/services/openSessionRegistry/sync.mjs +68 -0
- package/dist/src/services/openSessionRegistry/sync.mjs.map +1 -0
- package/dist/src/services/packageApiHarness/index.cjs +1 -1
- package/dist/src/services/packageApiHarness/index.cjs.map +1 -1
- package/dist/src/services/packageApiHarness/index.d.mts +6 -6
- package/dist/src/services/packageApiHarness/index.d.mts.map +1 -1
- package/dist/src/services/packageApiHarness/index.mjs +2 -2
- package/dist/src/services/packageApiHarness/index.mjs.map +1 -1
- package/dist/src/services/piArgs/index.cjs +53 -0
- package/dist/src/services/piArgs/index.cjs.map +1 -0
- package/dist/src/services/piArgs/index.d.mts +6 -0
- package/dist/src/services/piArgs/index.d.mts.map +1 -0
- package/dist/src/services/piArgs/index.mjs +53 -0
- package/dist/src/services/piArgs/index.mjs.map +1 -0
- package/dist/src/services/piExtensionHost/index.cjs +47 -39
- package/dist/src/services/piExtensionHost/index.cjs.map +1 -1
- package/dist/src/services/piExtensionHost/index.d.mts +83 -0
- package/dist/src/services/piExtensionHost/index.d.mts.map +1 -0
- package/dist/src/services/piExtensionHost/index.mjs +47 -38
- package/dist/src/services/piExtensionHost/index.mjs.map +1 -1
- package/dist/src/services/piHelpTools/index.cjs +5 -5
- package/dist/src/services/piHelpTools/index.cjs.map +1 -1
- package/dist/src/services/piHelpTools/index.d.mts.map +1 -1
- package/dist/src/services/piHelpTools/index.mjs +7 -7
- package/dist/src/services/piHelpTools/index.mjs.map +1 -1
- package/dist/src/services/piMessages/index.cjs +106 -0
- package/dist/src/services/piMessages/index.cjs.map +1 -0
- package/dist/src/services/piMessages/index.mjs +105 -0
- package/dist/src/services/piMessages/index.mjs.map +1 -0
- package/dist/src/services/piSessionEntries/index.cjs +4 -4
- package/dist/src/services/piSessionEntries/index.cjs.map +1 -1
- package/dist/src/services/piSessionEntries/index.mjs +3 -3
- package/dist/src/services/piSessionEntries/index.mjs.map +1 -1
- package/dist/src/services/piSettings/core.cjs +308 -0
- package/dist/src/services/piSettings/core.cjs.map +1 -0
- package/dist/src/services/piSettings/core.d.mts +102 -0
- package/dist/src/services/piSettings/core.d.mts.map +1 -0
- package/dist/src/services/piSettings/core.mjs +276 -0
- package/dist/src/services/piSettings/core.mjs.map +1 -0
- package/dist/src/services/piSettings/sync.cjs +119 -0
- package/dist/src/services/piSettings/sync.cjs.map +1 -0
- package/dist/src/services/piSettings/sync.d.mts +44 -0
- package/dist/src/services/piSettings/sync.d.mts.map +1 -0
- package/dist/src/services/piSettings/sync.mjs +110 -0
- package/dist/src/services/piSettings/sync.mjs.map +1 -0
- package/dist/src/services/piSummary/index.cjs +7 -0
- package/dist/src/services/piSummary/index.cjs.map +1 -0
- package/dist/src/services/piSummary/index.mjs +7 -0
- package/dist/src/services/piSummary/index.mjs.map +1 -0
- package/dist/src/services/platformFiles/index.cjs +44 -0
- package/dist/src/services/platformFiles/index.cjs.map +1 -0
- package/dist/src/services/platformFiles/index.d.mts +16 -0
- package/dist/src/services/platformFiles/index.d.mts.map +1 -0
- package/dist/src/services/platformFiles/index.mjs +39 -0
- package/dist/src/services/platformFiles/index.mjs.map +1 -0
- package/dist/src/services/pluginLifecycle/index.cjs +19 -13
- package/dist/src/services/pluginLifecycle/index.cjs.map +1 -1
- package/dist/src/services/pluginLifecycle/index.d.mts +2 -0
- package/dist/src/services/pluginLifecycle/index.d.mts.map +1 -1
- package/dist/src/services/pluginLifecycle/index.mjs +19 -14
- package/dist/src/services/pluginLifecycle/index.mjs.map +1 -1
- package/dist/src/services/poPackage/core.cjs +73 -0
- package/dist/src/services/poPackage/core.cjs.map +1 -0
- package/dist/src/services/poPackage/core.d.mts +32 -0
- package/dist/src/services/poPackage/core.d.mts.map +1 -0
- package/dist/src/services/poPackage/core.mjs +66 -0
- package/dist/src/services/poPackage/core.mjs.map +1 -0
- package/dist/src/services/poPackage/sync.cjs +55 -0
- package/dist/src/services/poPackage/sync.cjs.map +1 -0
- package/dist/src/services/poPackage/sync.d.mts +21 -0
- package/dist/src/services/poPackage/sync.d.mts.map +1 -0
- package/dist/src/services/poPackage/sync.mjs +50 -0
- package/dist/src/services/poPackage/sync.mjs.map +1 -0
- package/dist/src/services/providerAuth/index.cjs +11 -7
- package/dist/src/services/providerAuth/index.cjs.map +1 -1
- package/dist/src/services/providerAuth/index.mjs +11 -7
- package/dist/src/services/providerAuth/index.mjs.map +1 -1
- package/dist/src/services/publicFileShares/index.cjs +1 -1
- package/dist/src/services/publicFileShares/index.cjs.map +1 -1
- package/dist/src/services/publicFileShares/index.d.mts +2 -2
- package/dist/src/services/publicFileShares/index.mjs +2 -2
- package/dist/src/services/publicFileShares/index.mjs.map +1 -1
- package/dist/src/services/remoteAccess/index.d.mts +1 -0
- package/dist/src/services/remoteAccess/index.d.mts.map +1 -1
- package/dist/src/services/remoteAccessStore/index.cjs +8 -190
- package/dist/src/services/remoteAccessStore/index.cjs.map +1 -1
- package/dist/src/services/remoteAccessStore/index.d.mts +2 -0
- package/dist/src/services/remoteAccessStore/index.mjs +7 -187
- package/dist/src/services/remoteAccessStore/index.mjs.map +1 -1
- package/dist/src/services/remoteAccessStore/remoteAccessRecords.cjs +98 -0
- package/dist/src/services/remoteAccessStore/remoteAccessRecords.cjs.map +1 -0
- package/dist/src/services/remoteAccessStore/remoteAccessRecords.mjs +88 -0
- package/dist/src/services/remoteAccessStore/remoteAccessRecords.mjs.map +1 -0
- package/dist/src/services/remoteAccessStore/sync.cjs +111 -0
- package/dist/src/services/remoteAccessStore/sync.cjs.map +1 -0
- package/dist/src/services/remoteAccessStore/sync.mjs +108 -0
- package/dist/src/services/remoteAccessStore/sync.mjs.map +1 -0
- package/dist/src/services/runtimeIdentity/sync.cjs +23 -0
- package/dist/src/services/runtimeIdentity/sync.cjs.map +1 -0
- package/dist/src/services/runtimeIdentity/sync.d.mts +9 -0
- package/dist/src/services/runtimeIdentity/sync.d.mts.map +1 -0
- package/dist/src/services/runtimeIdentity/sync.mjs +20 -0
- package/dist/src/services/runtimeIdentity/sync.mjs.map +1 -0
- package/dist/src/services/serialRunner/index.cjs +25 -0
- package/dist/src/services/serialRunner/index.cjs.map +1 -0
- package/dist/src/services/serialRunner/index.d.mts +10 -0
- package/dist/src/services/serialRunner/index.d.mts.map +1 -0
- package/dist/src/services/serialRunner/index.mjs +25 -0
- package/dist/src/services/serialRunner/index.mjs.map +1 -0
- package/dist/src/services/{serverFacet → serverHost}/index.cjs +5 -5
- package/dist/src/services/serverHost/index.cjs.map +1 -0
- package/dist/src/services/serverHost/index.d.mts +31 -0
- package/dist/src/services/serverHost/index.d.mts.map +1 -0
- package/dist/src/services/{serverFacet → serverHost}/index.mjs +5 -5
- package/dist/src/services/serverHost/index.mjs.map +1 -0
- package/dist/src/services/sessionAttachments/index.cjs +4 -3
- package/dist/src/services/sessionAttachments/index.cjs.map +1 -1
- package/dist/src/services/sessionAttachments/index.d.mts +1 -6
- package/dist/src/services/sessionAttachments/index.d.mts.map +1 -1
- package/dist/src/services/sessionAttachments/index.mjs +3 -2
- package/dist/src/services/sessionAttachments/index.mjs.map +1 -1
- package/dist/src/services/sessionAttachments/type.d.mts +9 -0
- package/dist/src/services/sessionAttachments/type.d.mts.map +1 -0
- package/dist/src/services/sessionFiles/index.cjs +96 -0
- package/dist/src/services/sessionFiles/index.cjs.map +1 -0
- package/dist/src/services/sessionFiles/index.d.mts +33 -0
- package/dist/src/services/sessionFiles/index.d.mts.map +1 -0
- package/dist/src/services/sessionFiles/index.mjs +89 -0
- package/dist/src/services/sessionFiles/index.mjs.map +1 -0
- package/dist/src/services/sessionFiles/sessionDirectory.cjs +66 -0
- package/dist/src/services/sessionFiles/sessionDirectory.cjs.map +1 -0
- package/dist/src/services/sessionFiles/sessionDirectory.mjs +62 -0
- package/dist/src/services/sessionFiles/sessionDirectory.mjs.map +1 -0
- package/dist/src/services/sessionGitStatus/index.cjs +31 -33
- package/dist/src/services/sessionGitStatus/index.cjs.map +1 -1
- package/dist/src/services/sessionGitStatus/index.mjs +31 -33
- package/dist/src/services/sessionGitStatus/index.mjs.map +1 -1
- package/dist/src/services/sessionPresentation/index.cjs +3 -27
- package/dist/src/services/sessionPresentation/index.cjs.map +1 -1
- package/dist/src/services/sessionPresentation/index.mjs +3 -27
- package/dist/src/services/sessionPresentation/index.mjs.map +1 -1
- package/dist/src/services/skillPrompt/index.cjs +11 -0
- package/dist/src/services/skillPrompt/index.cjs.map +1 -0
- package/dist/src/services/skillPrompt/index.mjs +11 -0
- package/dist/src/services/skillPrompt/index.mjs.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.cjs +44 -30
- package/dist/src/services/sqliteSessionHistory/index.cjs.map +1 -1
- package/dist/src/services/sqliteSessionHistory/index.d.mts +7 -4
- package/dist/src/services/sqliteSessionHistory/index.d.mts.map +1 -1
- package/dist/src/services/sqliteSessionHistory/index.mjs +43 -28
- package/dist/src/services/sqliteSessionHistory/index.mjs.map +1 -1
- package/dist/src/services/sqliteTranscriptReader/index.cjs +21 -45
- package/dist/src/services/sqliteTranscriptReader/index.cjs.map +1 -1
- package/dist/src/services/sqliteTranscriptReader/index.d.mts +3 -2
- package/dist/src/services/sqliteTranscriptReader/index.d.mts.map +1 -1
- package/dist/src/services/sqliteTranscriptReader/index.mjs +16 -38
- package/dist/src/services/sqliteTranscriptReader/index.mjs.map +1 -1
- package/dist/src/services/testMode/index.cjs +162 -0
- package/dist/src/services/testMode/index.cjs.map +1 -0
- package/dist/src/services/testMode/index.d.mts +17 -0
- package/dist/src/services/testMode/index.d.mts.map +1 -0
- package/dist/src/services/testMode/index.mjs +155 -0
- package/dist/src/services/testMode/index.mjs.map +1 -0
- package/dist/src/services/toolOverrides/index.cjs +6 -6
- package/dist/src/services/toolOverrides/index.cjs.map +1 -1
- package/dist/src/services/toolOverrides/index.d.mts +3 -3
- package/dist/src/services/toolOverrides/index.d.mts.map +1 -1
- package/dist/src/services/toolOverrides/index.mjs +6 -6
- package/dist/src/services/toolOverrides/index.mjs.map +1 -1
- package/dist/src/services/toolPrompt/index.d.mts +17 -0
- package/dist/src/services/toolPrompt/index.d.mts.map +1 -0
- package/dist/src/services/toolSurface/index.cjs +3 -3
- package/dist/src/services/toolSurface/index.cjs.map +1 -1
- package/dist/src/services/toolSurface/index.d.mts +3 -3
- package/dist/src/services/toolSurface/index.d.mts.map +1 -1
- package/dist/src/services/toolSurface/index.mjs +4 -4
- package/dist/src/services/toolSurface/index.mjs.map +1 -1
- package/dist/src/services/traceContext/index.cjs.map +1 -1
- package/dist/src/services/traceContext/index.mjs.map +1 -1
- package/dist/src/services/transcriptPages/index.cjs +159 -33
- package/dist/src/services/transcriptPages/index.cjs.map +1 -1
- package/dist/src/services/transcriptPages/index.mjs +158 -34
- package/dist/src/services/transcriptPages/index.mjs.map +1 -1
- package/dist/src/services/voiceToolsContract/index.cjs +7 -7
- package/dist/src/services/voiceToolsContract/index.cjs.map +1 -1
- package/dist/src/services/voiceToolsContract/index.d.mts +4 -4
- package/dist/src/services/voiceToolsContract/index.d.mts.map +1 -1
- package/dist/src/services/voiceToolsContract/index.mjs +7 -7
- package/dist/src/services/voiceToolsContract/index.mjs.map +1 -1
- package/dist/src/services/workspaceRegistry/index.cjs +9 -179
- package/dist/src/services/workspaceRegistry/index.cjs.map +1 -1
- package/dist/src/services/workspaceRegistry/index.d.mts +5 -47
- package/dist/src/services/workspaceRegistry/index.mjs +7 -176
- package/dist/src/services/workspaceRegistry/index.mjs.map +1 -1
- package/dist/src/services/workspaceRegistry/sync.cjs +148 -0
- package/dist/src/services/workspaceRegistry/sync.cjs.map +1 -0
- package/dist/src/services/workspaceRegistry/sync.d.mts +34 -0
- package/dist/src/services/workspaceRegistry/sync.d.mts.map +1 -0
- package/dist/src/services/workspaceRegistry/sync.mjs +140 -0
- package/dist/src/services/workspaceRegistry/sync.mjs.map +1 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.cjs +114 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.cjs.map +1 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.d.mts +31 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.d.mts.map +1 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.mjs +101 -0
- package/dist/src/services/workspaceRegistry/workspaceRecords.mjs.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs +339 -202
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs.map +1 -1
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts +16 -21
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts.map +1 -1
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs +329 -191
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs.map +1 -1
- package/dist/src/systems/child/services/childSession/index.cjs +94 -20
- package/dist/src/systems/child/services/childSession/index.cjs.map +1 -1
- package/dist/src/systems/child/services/childSession/index.d.mts +12 -3
- package/dist/src/systems/child/services/childSession/index.d.mts.map +1 -1
- package/dist/src/systems/child/services/childSession/index.mjs +94 -20
- package/dist/src/systems/child/services/childSession/index.mjs.map +1 -1
- package/dist/src/systems/child/types/childSession.cjs +33 -13
- package/dist/src/systems/child/types/childSession.cjs.map +1 -1
- package/dist/src/systems/child/types/childSession.d.mts +143 -80
- package/dist/src/systems/child/types/childSession.d.mts.map +1 -1
- package/dist/src/systems/child/types/childSession.mjs +24 -9
- package/dist/src/systems/child/types/childSession.mjs.map +1 -1
- package/dist/src/systems/main/adapters/headlessHost.cjs +30 -27
- package/dist/src/systems/main/adapters/headlessHost.cjs.map +1 -1
- package/dist/src/systems/main/adapters/headlessHost.d.mts +22 -22
- package/dist/src/systems/main/adapters/headlessHost.d.mts.map +1 -1
- package/dist/src/systems/main/adapters/headlessHost.mjs +33 -30
- package/dist/src/systems/main/adapters/headlessHost.mjs.map +1 -1
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs +248 -229
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -1
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts +4 -5
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts.map +1 -1
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs +239 -219
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
- package/dist/src/systems/main/types/headlessHost.d.mts +16 -14
- package/dist/src/systems/main/types/headlessHost.d.mts.map +1 -1
- package/dist/src/testing/pi/testHost.cjs +2 -2
- package/dist/src/testing/pi/testHost.cjs.map +1 -1
- package/dist/src/testing/pi/testHost.d.mts +3 -2
- package/dist/src/testing/pi/testHost.mjs +3 -3
- package/dist/src/testing/pi/testHost.mjs.map +1 -1
- package/dist/src/types/config.d.mts +1 -1
- package/dist/src/types/config.d.mts.map +1 -1
- package/dist/src/types/kernel.d.mts +3 -3
- package/dist/src/types/server/directHarnessRuntime.d.mts +54 -25
- package/dist/src/types/server/directHarnessRuntime.d.mts.map +1 -1
- package/dist/src/types/server/sessionToolSurface.d.mts +9 -9
- package/dist/src/web/services/apiClient/index.d.mts +1 -0
- package/dist/src/web/services/apiPaths/index.cjs.map +1 -1
- package/dist/src/web/services/apiPaths/index.d.mts +1 -1
- package/dist/src/web/services/apiPaths/index.mjs.map +1 -1
- package/dist/src/web/services/mcpWidget.cjs.map +1 -1
- package/dist/src/web/services/mcpWidget.d.mts +2 -2
- package/dist/src/web/services/mcpWidget.d.mts.map +1 -1
- package/dist/src/web/services/mcpWidget.mjs.map +1 -1
- package/dist/src/web/services/testing/templateRail.cjs +3 -0
- package/dist/src/web/services/testing/templateRail.cjs.map +1 -1
- package/dist/src/web/services/testing/templateRail.mjs +3 -0
- package/dist/src/web/services/testing/templateRail.mjs.map +1 -1
- package/dist/src/web/types/mcpWidget.d.mts +1 -1
- package/dist/src/web/types/nativeTemplate.d.mts +1 -1
- package/dist/src/web/types/nativeTemplate.d.mts.map +1 -1
- package/dist/src/web/types/template.d.mts +8 -0
- package/dist/src/web/types/template.d.mts.map +1 -1
- package/dist/src/web/types/webPlugin.d.mts +17 -5
- package/dist/src/web/types/webPlugin.d.mts.map +1 -1
- package/dist/testMode.cjs +4 -0
- package/dist/testMode.d.mts +2 -0
- package/dist/testMode.mjs +1 -0
- package/dist/testing.cjs +1 -1
- package/dist/testing.d.mts +2 -2
- package/dist/testing.mjs +2 -2
- package/dist/toolInventory.cjs.map +1 -1
- package/dist/toolInventory.mjs.map +1 -1
- package/dist/toolNames.mjs +1 -2
- package/dist/toolOverrides.cjs +4 -4
- package/dist/toolOverrides.d.mts +3 -3
- package/dist/toolOverrides.mjs +3 -3
- package/dist/toolSurface.cjs +4 -4
- package/dist/toolSurface.d.mts +3 -3
- package/dist/toolSurface.mjs +3 -3
- package/dist/transition.cjs +3 -3
- package/dist/transition.d.cjs +3 -3
- package/dist/transition.d.mts +2 -2
- package/dist/transition.mjs +1 -2
- package/dist/transitionClassifier.cjs.map +1 -1
- package/dist/transitionClassifier.d.mts +2 -2
- package/dist/transitionClassifier.d.mts.map +1 -1
- package/dist/transitionClassifier.mjs.map +1 -1
- package/dist/transitionCoordinator.cjs +3 -3
- package/dist/transitionCoordinator.cjs.map +1 -1
- package/dist/transitionCoordinator.d.mts +4 -4
- package/dist/transitionCoordinator.d.mts.map +1 -1
- package/dist/transitionCoordinator.mjs +3 -3
- package/dist/transitionCoordinator.mjs.map +1 -1
- package/dist/typesContextApi.d.mts +2 -1
- package/dist/typesContextApi.d.mts.map +1 -1
- package/dist/uiHub.cjs +3 -3
- package/dist/uiHub.d.mts +2 -2
- package/dist/uiHub.mjs +1 -2
- package/dist/voiceTools.cjs +5 -5
- package/dist/voiceTools.d.mts +3 -3
- package/dist/voiceTools.mjs +3 -3
- package/dist/web.cjs +8 -0
- package/dist/web.d.mts +3 -2
- package/dist/web.mjs +2 -1
- package/dist/webCompositions.cjs.map +1 -1
- package/dist/webCompositions.d.mts +7 -7
- package/dist/webCompositions.d.mts.map +1 -1
- package/dist/webCompositions.mjs.map +1 -1
- package/licenses/Codex-Apache-2.0.txt +201 -0
- package/package.json +58 -53
- package/dist/doomPackage.cjs +0 -61
- package/dist/doomPackage.cjs.map +0 -1
- package/dist/doomPackage.d.mts +0 -17
- package/dist/doomPackage.d.mts.map +0 -1
- package/dist/doomPackage.mjs +0 -54
- package/dist/doomPackage.mjs.map +0 -1
- package/dist/jsonlSessionRepo.cjs +0 -44
- package/dist/jsonlSessionRepo.cjs.map +0 -1
- package/dist/jsonlSessionRepo.d.mts +0 -7
- package/dist/jsonlSessionRepo.d.mts.map +0 -1
- package/dist/jsonlSessionRepo.mjs +0 -42
- package/dist/jsonlSessionRepo.mjs.map +0 -1
- package/dist/runtimeJson.cjs.map +0 -1
- package/dist/runtimeJson.d.mts.map +0 -1
- package/dist/runtimeJson.mjs.map +0 -1
- package/dist/runtimePiSettings.cjs.map +0 -1
- package/dist/runtimePiSettings.d.mts.map +0 -1
- package/dist/runtimePiSettings.mjs.map +0 -1
- package/dist/serverFacet.cjs +0 -34
- package/dist/serverFacet.d.mts +0 -10
- package/dist/serverFacet.mjs +0 -9
- package/dist/src/pi/piWebSocketListener.cjs +0 -115
- package/dist/src/pi/piWebSocketListener.cjs.map +0 -1
- package/dist/src/pi/piWebSocketListener.mjs +0 -115
- package/dist/src/pi/piWebSocketListener.mjs.map +0 -1
- package/dist/src/schemas/serverFacet.cjs +0 -111
- package/dist/src/schemas/serverFacet.cjs.map +0 -1
- package/dist/src/schemas/serverFacet.d.mts +0 -152
- package/dist/src/schemas/serverFacet.d.mts.map +0 -1
- package/dist/src/schemas/serverFacet.mjs +0 -101
- package/dist/src/schemas/serverFacet.mjs.map +0 -1
- package/dist/src/schemas/sessionUpdates.d.mts +0 -34
- package/dist/src/schemas/sessionUpdates.d.mts.map +0 -1
- package/dist/src/server/headlessProtocol.cjs +0 -382
- package/dist/src/server/headlessProtocol.cjs.map +0 -1
- package/dist/src/server/headlessProtocol.mjs +0 -382
- package/dist/src/server/headlessProtocol.mjs.map +0 -1
- package/dist/src/server/nativeChildTranscriptReader.cjs +0 -20
- package/dist/src/server/nativeChildTranscriptReader.cjs.map +0 -1
- package/dist/src/server/nativeChildTranscriptReader.mjs +0 -18
- package/dist/src/server/nativeChildTranscriptReader.mjs.map +0 -1
- package/dist/src/server/serverFacetLoader.cjs +0 -214
- package/dist/src/server/serverFacetLoader.cjs.map +0 -1
- package/dist/src/server/serverFacetLoader.d.mts +0 -72
- package/dist/src/server/serverFacetLoader.d.mts.map +0 -1
- package/dist/src/server/serverFacetLoader.mjs +0 -212
- package/dist/src/server/serverFacetLoader.mjs.map +0 -1
- package/dist/src/services/acpSessionUpdates/index.cjs +0 -129
- package/dist/src/services/acpSessionUpdates/index.cjs.map +0 -1
- package/dist/src/services/acpSessionUpdates/index.mjs +0 -129
- package/dist/src/services/acpSessionUpdates/index.mjs.map +0 -1
- package/dist/src/services/historyImport/index.cjs +0 -8
- package/dist/src/services/historyImport/index.cjs.map +0 -1
- package/dist/src/services/historyImport/index.d.mts +0 -68
- package/dist/src/services/historyImport/index.d.mts.map +0 -1
- package/dist/src/services/historyImport/index.mjs +0 -8
- package/dist/src/services/historyImport/index.mjs.map +0 -1
- package/dist/src/services/openSessionRegistry/index.d.mts.map +0 -1
- package/dist/src/services/requestReceipts/index.cjs.map +0 -1
- package/dist/src/services/requestReceipts/index.d.mts +0 -11
- package/dist/src/services/requestReceipts/index.d.mts.map +0 -1
- package/dist/src/services/requestReceipts/index.mjs.map +0 -1
- package/dist/src/services/rpcTranscript/index.cjs +0 -633
- package/dist/src/services/rpcTranscript/index.cjs.map +0 -1
- package/dist/src/services/rpcTranscript/index.d.mts +0 -50
- package/dist/src/services/rpcTranscript/index.d.mts.map +0 -1
- package/dist/src/services/rpcTranscript/index.mjs +0 -632
- package/dist/src/services/rpcTranscript/index.mjs.map +0 -1
- package/dist/src/services/serverFacet/index.cjs.map +0 -1
- package/dist/src/services/serverFacet/index.d.mts +0 -31
- package/dist/src/services/serverFacet/index.d.mts.map +0 -1
- package/dist/src/services/serverFacet/index.mjs.map +0 -1
- package/dist/src/services/workspaceRegistry/index.d.mts.map +0 -1
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs +0 -28
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs.map +0 -1
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs +0 -25
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs.map +0 -1
- package/dist/terminalPiChildSessionService.cjs +0 -324
- package/dist/terminalPiChildSessionService.cjs.map +0 -1
- package/dist/terminalPiChildSessionService.d.mts +0 -46
- package/dist/terminalPiChildSessionService.d.mts.map +0 -1
- package/dist/terminalPiChildSessionService.mjs +0 -318
- package/dist/terminalPiChildSessionService.mjs.map +0 -1
- package/dist/v3Export.cjs +0 -10
- package/dist/v3Export.cjs.map +0 -1
- package/dist/v3Export.d.mts +0 -35
- package/dist/v3Export.d.mts.map +0 -1
- package/dist/v3Export.mjs +0 -9
- package/dist/v3Export.mjs.map +0 -1
|
@@ -1,127 +1,63 @@
|
|
|
1
|
-
import { readSqliteTranscript } from "../services/sqliteTranscriptReader/index.mjs";
|
|
2
|
-
import { nativeChildRuntime } from "../systems/child/adapters/nativeChildRuntimes.mjs";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
1
|
//#region src/server/threadJournals.ts
|
|
6
2
|
const POLL_MS = 250;
|
|
7
|
-
const MAX_INITIAL_BYTES = 8388608;
|
|
8
|
-
const NEWLINE = 10;
|
|
9
3
|
function keyOf(sessionId, threadId) {
|
|
10
4
|
return `${sessionId}\n${threadId}`;
|
|
11
5
|
}
|
|
12
|
-
|
|
13
|
-
const frames = [];
|
|
14
|
-
for (const line of text.split("\n")) {
|
|
15
|
-
let parsed;
|
|
16
|
-
try {
|
|
17
|
-
parsed = JSON.parse(line);
|
|
18
|
-
} catch {
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
const rows = Array.isArray(parsed) ? parsed : [parsed];
|
|
22
|
-
for (const row of rows) {
|
|
23
|
-
if (typeof row !== "object" || row === null || Array.isArray(row)) continue;
|
|
24
|
-
const entry = row;
|
|
25
|
-
const isLegacyMessage = entry.type === "message";
|
|
26
|
-
const isCurrentMessage = entry.kind === "entry" && entry.type === "message";
|
|
27
|
-
if (!isLegacyMessage && !isCurrentMessage || typeof entry.id !== "string" || typeof entry.message !== "object") continue;
|
|
28
|
-
frames.push({
|
|
29
|
-
type: "entry_appended",
|
|
30
|
-
entry
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return frames;
|
|
35
|
-
}
|
|
36
|
-
function readRange(file, start, end) {
|
|
37
|
-
const buffer = Buffer.alloc(end - start);
|
|
38
|
-
let descriptor;
|
|
39
|
-
try {
|
|
40
|
-
descriptor = fs.openSync(file, "r");
|
|
41
|
-
return buffer.subarray(0, fs.readSync(descriptor, buffer, 0, buffer.length, start));
|
|
42
|
-
} catch {
|
|
43
|
-
return;
|
|
44
|
-
} finally {
|
|
45
|
-
if (descriptor !== void 0) fs.closeSync(descriptor);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** Tails child journals only while at least one browser thread is subscribed. */
|
|
6
|
+
/** Follows child transcripts only while at least one browser thread is subscribed. */
|
|
49
7
|
function createThreadJournals(options) {
|
|
50
8
|
const tails = /* @__PURE__ */ new Map();
|
|
51
9
|
const listeners = /* @__PURE__ */ new Set();
|
|
52
10
|
let timer;
|
|
53
11
|
const advance = (tail) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const frame = {
|
|
62
|
-
type: "transcript_state",
|
|
63
|
-
state
|
|
64
|
-
};
|
|
65
|
-
tail.retained = [frame];
|
|
66
|
-
for (const listener of listeners) listener({
|
|
67
|
-
sessionId: tail.sessionId,
|
|
68
|
-
threadId: tail.threadId,
|
|
69
|
-
frame
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
tail.retained = [{
|
|
12
|
+
if (tail.stop) return [];
|
|
13
|
+
const thread = options.resolve(tail.sessionId, tail.threadId);
|
|
14
|
+
if (!thread) return [];
|
|
15
|
+
const state = thread.state;
|
|
16
|
+
if (state) {
|
|
17
|
+
tail.stop = state.subscribe((value) => {
|
|
18
|
+
const frame = {
|
|
73
19
|
type: "transcript_state",
|
|
74
|
-
state:
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
20
|
+
state: value
|
|
21
|
+
};
|
|
22
|
+
tail.retained = [frame];
|
|
23
|
+
for (const listener of listeners) listener({
|
|
24
|
+
sessionId: tail.sessionId,
|
|
25
|
+
threadId: tail.threadId,
|
|
26
|
+
frame
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
tail.retained = [{
|
|
30
|
+
type: "transcript_state",
|
|
31
|
+
state: state.value
|
|
32
|
+
}];
|
|
33
|
+
} else {
|
|
34
|
+
tail.stop = () => void 0;
|
|
35
|
+
tail.retained = [{ type: "transcript_ready" }];
|
|
86
36
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
37
|
+
return tail.retained;
|
|
38
|
+
};
|
|
39
|
+
const syncTimer = () => {
|
|
40
|
+
const waiting = [...tails.values()].some((tail) => !tail.stop);
|
|
41
|
+
if (waiting && timer === void 0) timer = setInterval(tick, POLL_MS);
|
|
42
|
+
if (!waiting && timer !== void 0) {
|
|
43
|
+
clearInterval(timer);
|
|
44
|
+
timer = void 0;
|
|
90
45
|
}
|
|
91
|
-
const cut = tail.offset === 0 && size > MAX_INITIAL_BYTES;
|
|
92
|
-
const start = cut ? size - MAX_INITIAL_BYTES : tail.offset;
|
|
93
|
-
if (size <= start) return [];
|
|
94
|
-
const chunk = readRange(candidate, start, size);
|
|
95
|
-
if (chunk === void 0) return [];
|
|
96
|
-
const lastNewline = chunk.lastIndexOf(NEWLINE);
|
|
97
|
-
if (lastNewline < 0) return [];
|
|
98
|
-
const first = cut ? chunk.indexOf(NEWLINE) + 1 : 0;
|
|
99
|
-
const frames = first > lastNewline ? [] : journalFrames(chunk.toString("utf8", first, lastNewline + 1));
|
|
100
|
-
tail.offset = start + lastNewline + 1;
|
|
101
|
-
if (frames.length > 0) tail.retained = [...tail.retained, ...frames].slice(-300);
|
|
102
|
-
return frames;
|
|
103
46
|
};
|
|
104
|
-
|
|
47
|
+
function tick() {
|
|
105
48
|
for (const tail of tails.values()) for (const frame of advance(tail)) for (const listener of listeners) listener({
|
|
106
49
|
sessionId: tail.sessionId,
|
|
107
50
|
threadId: tail.threadId,
|
|
108
51
|
frame
|
|
109
52
|
});
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (tails.size > 0 && timer === void 0) timer = setInterval(tick, POLL_MS);
|
|
113
|
-
if (tails.size === 0 && timer !== void 0) {
|
|
114
|
-
clearInterval(timer);
|
|
115
|
-
timer = void 0;
|
|
116
|
-
}
|
|
117
|
-
};
|
|
53
|
+
syncTimer();
|
|
54
|
+
}
|
|
118
55
|
return {
|
|
119
56
|
async readPage(sessionId, threadId, request, context) {
|
|
120
|
-
const
|
|
121
|
-
if (!
|
|
57
|
+
const thread = options.resolve(sessionId, threadId);
|
|
58
|
+
if (!thread) throw new Error("Child transcript not found");
|
|
122
59
|
const { threadId: _threadId, ...query } = request;
|
|
123
|
-
|
|
124
|
-
return runtime ? runtime.readTranscriptPage(query, context) : readSqliteTranscript(file, query, context);
|
|
60
|
+
return thread.readTranscriptPage(query, context.abortSignal);
|
|
125
61
|
},
|
|
126
62
|
subscribe(sessionId, threadId) {
|
|
127
63
|
const key = keyOf(sessionId, threadId);
|
|
@@ -129,8 +65,6 @@ function createThreadJournals(options) {
|
|
|
129
65
|
sessionId,
|
|
130
66
|
threadId,
|
|
131
67
|
refs: 0,
|
|
132
|
-
file: void 0,
|
|
133
|
-
offset: 0,
|
|
134
68
|
retained: []
|
|
135
69
|
};
|
|
136
70
|
if (!tails.has(key)) tails.set(key, tail);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadJournals.mjs","names":[],"sources":["../../../src/server/threadJournals.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { Context } from '@earendil-works/chord';\n\nimport type { TranscriptPage, TranscriptPageRequest } from '../exports/sessionProtocol';\nimport { readSqliteTranscript } from '../services/sqliteTranscriptReader';\nimport { nativeChildRuntime } from '../systems/child/adapters/nativeChildRuntimes';\n\nconst POLL_MS = 250;\nconst RETAIN_LIMIT = 300;\nconst MAX_INITIAL_BYTES = 8 * 1024 * 1024;\nconst NEWLINE = 0x0a;\n\ntype Frame = Record<string, unknown>;\n\ninterface Tail {\n readonly sessionId: string;\n readonly threadId: string;\n refs: number;\n file: string | undefined;\n offset: number;\n retained: Frame[];\n stop?: () => void;\n}\n\nexport interface ThreadJournals {\n readPage(\n sessionId: string,\n threadId: string,\n request: TranscriptPageRequest,\n context: Context,\n ): Promise<TranscriptPage>;\n subscribe(sessionId: string, threadId: string): Frame[];\n unsubscribe(sessionId: string, threadId: string): void;\n onFrame(listener: (event: { sessionId: string; threadId: string; frame: Frame }) => void): () => void;\n close(): void;\n}\n\nfunction keyOf(sessionId: string, threadId: string): string {\n return `${sessionId}\\n${threadId}`;\n}\n\nfunction journalFrames(text: string): Frame[] {\n const frames: Frame[] = [];\n for (const line of text.split('\\n')) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch {\n continue;\n }\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n for (const row of rows) {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) continue;\n const entry = row as Record<string, unknown>;\n const isLegacyMessage = entry.type === 'message';\n const isCurrentMessage = entry.kind === 'entry' && entry.type === 'message';\n if (\n (!isLegacyMessage && !isCurrentMessage) ||\n typeof entry.id !== 'string' ||\n typeof entry.message !== 'object'\n ) {\n continue;\n }\n frames.push({ type: 'entry_appended', entry });\n }\n }\n return frames;\n}\n\nfunction readRange(file: string, start: number, end: number): Buffer | undefined {\n const buffer = Buffer.alloc(end - start);\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(file, 'r');\n return buffer.subarray(0, fs.readSync(descriptor, buffer, 0, buffer.length, start));\n } catch {\n return undefined;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n}\n\n/** Tails child journals only while at least one browser thread is subscribed. */\nexport function createThreadJournals(options: {\n resolve(sessionId: string, threadId: string): string | undefined;\n}): ThreadJournals {\n const tails = new Map<string, Tail>();\n const listeners = new Set<(event: { sessionId: string; threadId: string; frame: Frame }) => void>();\n let timer: NodeJS.Timeout | undefined;\n\n const advance = (tail: Tail): Frame[] => {\n const candidate = tail.file ?? options.resolve(tail.sessionId, tail.threadId);\n if (candidate && path.isAbsolute(candidate) && path.extname(candidate) === '.sqlite') {\n tail.file = candidate;\n if (tail.stop) return [];\n const runtime = nativeChildRuntime(candidate);\n if (runtime) {\n tail.stop = runtime.state.subscribe((state) => {\n const frame = { type: 'transcript_state', state };\n tail.retained = [frame];\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n });\n tail.retained = [{ type: 'transcript_state', state: runtime.state.value }];\n } else tail.retained = [{ type: 'transcript_ready' }];\n return tail.retained;\n }\n if (candidate === undefined || !path.isAbsolute(candidate) || path.extname(candidate) !== '.jsonl') return [];\n tail.file = candidate;\n let size: number;\n try {\n size = fs.statSync(candidate).size;\n } catch {\n return [];\n }\n if (size < tail.offset) {\n tail.offset = 0;\n tail.retained = [];\n }\n const cut = tail.offset === 0 && size > MAX_INITIAL_BYTES;\n const start = cut ? size - MAX_INITIAL_BYTES : tail.offset;\n if (size <= start) return [];\n const chunk = readRange(candidate, start, size);\n if (chunk === undefined) return [];\n const lastNewline = chunk.lastIndexOf(NEWLINE);\n if (lastNewline < 0) return [];\n const first = cut ? chunk.indexOf(NEWLINE) + 1 : 0;\n const frames = first > lastNewline ? [] : journalFrames(chunk.toString('utf8', first, lastNewline + 1));\n tail.offset = start + lastNewline + 1;\n if (frames.length > 0) tail.retained = [...tail.retained, ...frames].slice(-RETAIN_LIMIT);\n return frames;\n };\n const tick = (): void => {\n for (const tail of tails.values()) {\n for (const frame of advance(tail)) {\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n }\n }\n };\n const syncTimer = (): void => {\n if (tails.size > 0 && timer === undefined) timer = setInterval(tick, POLL_MS);\n if (tails.size === 0 && timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n\n return {\n async readPage(sessionId, threadId, request, context) {\n const file = options.resolve(sessionId, threadId);\n if (!file || !path.isAbsolute(file) || path.extname(file) !== '.sqlite')\n throw new Error('Child SQLite transcript not found');\n const { threadId: _threadId, ...query } = request;\n const runtime = nativeChildRuntime(file);\n return runtime ? runtime.readTranscriptPage(query, context) : readSqliteTranscript(file, query, context);\n },\n subscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key) ?? {\n sessionId,\n threadId,\n refs: 0,\n file: undefined,\n offset: 0,\n retained: [],\n };\n if (!tails.has(key)) tails.set(key, tail);\n tail.refs += 1;\n advance(tail);\n syncTimer();\n return [...tail.retained];\n },\n unsubscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key);\n if (tail === undefined) return;\n tail.refs -= 1;\n if (tail.refs <= 0) {\n tail.stop?.();\n tails.delete(key);\n }\n syncTimer();\n },\n onFrame(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n close() {\n if (timer !== undefined) clearInterval(timer);\n timer = undefined;\n for (const tail of tails.values()) tail.stop?.();\n tails.clear();\n listeners.clear();\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"threadJournals.mjs","names":[],"sources":["../../../src/server/threadJournals.ts"],"sourcesContent":["import type { Context } from '@earendil-works/chord';\n\nimport type { PoChildThread } from '../exports/childSession';\nimport type { TranscriptPage, TranscriptPageRequest } from '../exports/sessionProtocol';\n\nconst POLL_MS = 250;\n\ntype Frame = Record<string, unknown>;\n\ninterface Tail {\n readonly sessionId: string;\n readonly threadId: string;\n refs: number;\n retained: Frame[];\n stop?: () => void;\n}\n\nexport interface ThreadJournals {\n readPage(\n sessionId: string,\n threadId: string,\n request: TranscriptPageRequest,\n context: Context,\n ): Promise<TranscriptPage>;\n subscribe(sessionId: string, threadId: string): Frame[];\n unsubscribe(sessionId: string, threadId: string): void;\n onFrame(listener: (event: { sessionId: string; threadId: string; frame: Frame }) => void): () => void;\n close(): void;\n}\n\nfunction keyOf(sessionId: string, threadId: string): string {\n return `${sessionId}\\n${threadId}`;\n}\n\n/** Follows child transcripts only while at least one browser thread is subscribed. */\nexport function createThreadJournals(options: {\n resolve(sessionId: string, threadId: string): PoChildThread | undefined;\n}): ThreadJournals {\n const tails = new Map<string, Tail>();\n const listeners = new Set<(event: { sessionId: string; threadId: string; frame: Frame }) => void>();\n let timer: NodeJS.Timeout | undefined;\n\n // A thread is looked up until its run appears; then it follows the run's live state, or reads as finished.\n const advance = (tail: Tail): Frame[] => {\n if (tail.stop) return [];\n const thread = options.resolve(tail.sessionId, tail.threadId);\n if (!thread) return [];\n const state = thread.state;\n if (state) {\n tail.stop = state.subscribe((value) => {\n const frame = { type: 'transcript_state', state: value };\n tail.retained = [frame];\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n });\n tail.retained = [{ type: 'transcript_state', state: state.value }];\n } else {\n tail.stop = () => undefined;\n tail.retained = [{ type: 'transcript_ready' }];\n }\n return tail.retained;\n };\n const syncTimer = (): void => {\n const waiting = [...tails.values()].some((tail) => !tail.stop);\n if (waiting && timer === undefined) timer = setInterval(tick, POLL_MS);\n if (!waiting && timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n function tick(): void {\n for (const tail of tails.values()) {\n for (const frame of advance(tail)) {\n for (const listener of listeners) listener({ sessionId: tail.sessionId, threadId: tail.threadId, frame });\n }\n }\n syncTimer();\n }\n\n return {\n async readPage(sessionId, threadId, request, context) {\n const thread = options.resolve(sessionId, threadId);\n if (!thread) throw new Error('Child transcript not found');\n const { threadId: _threadId, ...query } = request;\n return thread.readTranscriptPage(query, context.abortSignal);\n },\n subscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key) ?? { sessionId, threadId, refs: 0, retained: [] };\n if (!tails.has(key)) tails.set(key, tail);\n tail.refs += 1;\n advance(tail);\n syncTimer();\n return [...tail.retained];\n },\n unsubscribe(sessionId, threadId) {\n const key = keyOf(sessionId, threadId);\n const tail = tails.get(key);\n if (tail === undefined) return;\n tail.refs -= 1;\n if (tail.refs <= 0) {\n tail.stop?.();\n tails.delete(key);\n }\n syncTimer();\n },\n onFrame(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n close() {\n if (timer !== undefined) clearInterval(timer);\n timer = undefined;\n for (const tail of tails.values()) tail.stop?.();\n tails.clear();\n listeners.clear();\n },\n };\n}\n"],"mappings":";AAKA,MAAM,UAAU;AAyBhB,SAAS,MAAM,WAAmB,UAA0B;CAC1D,OAAO,GAAG,UAAU,IAAI;AAC1B;;AAGA,SAAgB,qBAAqB,SAElB;CACjB,MAAM,wBAAQ,IAAI,IAAkB;CACpC,MAAM,4BAAY,IAAI,IAA4E;CAClG,IAAI;CAGJ,MAAM,WAAW,SAAwB;EACvC,IAAI,KAAK,MAAM,OAAO,CAAC;EACvB,MAAM,SAAS,QAAQ,QAAQ,KAAK,WAAW,KAAK,QAAQ;EAC5D,IAAI,CAAC,QAAQ,OAAO,CAAC;EACrB,MAAM,QAAQ,OAAO;EACrB,IAAI,OAAO;GACT,KAAK,OAAO,MAAM,WAAW,UAAU;IACrC,MAAM,QAAQ;KAAE,MAAM;KAAoB,OAAO;IAAM;IACvD,KAAK,WAAW,CAAC,KAAK;IACtB,KAAK,MAAM,YAAY,WAAW,SAAS;KAAE,WAAW,KAAK;KAAW,UAAU,KAAK;KAAU;IAAM,CAAC;GAC1G,CAAC;GACD,KAAK,WAAW,CAAC;IAAE,MAAM;IAAoB,OAAO,MAAM;GAAM,CAAC;EACnE,OAAO;GACL,KAAK,aAAa,KAAA;GAClB,KAAK,WAAW,CAAC,EAAE,MAAM,mBAAmB,CAAC;EAC/C;EACA,OAAO,KAAK;CACd;CACA,MAAM,kBAAwB;EAC5B,MAAM,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,IAAI;EAC7D,IAAI,WAAW,UAAU,KAAA,GAAW,QAAQ,YAAY,MAAM,OAAO;EACrE,IAAI,CAAC,WAAW,UAAU,KAAA,GAAW;GACnC,cAAc,KAAK;GACnB,QAAQ,KAAA;EACV;CACF;CACA,SAAS,OAAa;EACpB,KAAK,MAAM,QAAQ,MAAM,OAAO,GAC9B,KAAK,MAAM,SAAS,QAAQ,IAAI,GAC9B,KAAK,MAAM,YAAY,WAAW,SAAS;GAAE,WAAW,KAAK;GAAW,UAAU,KAAK;GAAU;EAAM,CAAC;EAG5G,UAAU;CACZ;CAEA,OAAO;EACL,MAAM,SAAS,WAAW,UAAU,SAAS,SAAS;GACpD,MAAM,SAAS,QAAQ,QAAQ,WAAW,QAAQ;GAClD,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,4BAA4B;GACzD,MAAM,EAAE,UAAU,WAAW,GAAG,UAAU;GAC1C,OAAO,OAAO,mBAAmB,OAAO,QAAQ,WAAW;EAC7D;EACA,UAAU,WAAW,UAAU;GAC7B,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK;IAAE;IAAW;IAAU,MAAM;IAAG,UAAU,CAAC;GAAE;GAC5E,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,KAAK,IAAI;GACxC,KAAK,QAAQ;GACb,QAAQ,IAAI;GACZ,UAAU;GACV,OAAO,CAAC,GAAG,KAAK,QAAQ;EAC1B;EACA,YAAY,WAAW,UAAU;GAC/B,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,OAAO,MAAM,IAAI,GAAG;GAC1B,IAAI,SAAS,KAAA,GAAW;GACxB,KAAK,QAAQ;GACb,IAAI,KAAK,QAAQ,GAAG;IAClB,KAAK,OAAO;IACZ,MAAM,OAAO,GAAG;GAClB;GACA,UAAU;EACZ;EACA,QAAQ,UAAU;GAChB,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;EACA,QAAQ;GACN,IAAI,UAAU,KAAA,GAAW,cAAc,KAAK;GAC5C,QAAQ,KAAA;GACR,KAAK,MAAM,QAAQ,MAAM,OAAO,GAAG,KAAK,OAAO;GAC/C,MAAM,MAAM;GACZ,UAAU,MAAM;EAClB;CACF;AACF"}
|
|
@@ -4,7 +4,7 @@ function sorted(values) {
|
|
|
4
4
|
return [...new Set(values)].sort();
|
|
5
5
|
}
|
|
6
6
|
/** A path under the same mount that no contract declares, used to calibrate. */
|
|
7
|
-
const CONTROL_PATH = "/
|
|
7
|
+
const CONTROL_PATH = "/__po_surface_control__";
|
|
8
8
|
/**
|
|
9
9
|
* Whether a response is the framework's own miss rather than a handler's answer.
|
|
10
10
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["mountPackageApi"],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["mountPackageApi"],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { PoApiContract } from '../../schemas/apiContracts';\nimport type { PoApi, PoApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: PoApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: PoApiScope;\n /** What the generated server plugin registered at this scope, in registration order. */\n readonly apis: readonly PoApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__po_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAUA,cAAAA,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { PoApi, PoApiScope } from "../../schemas/packageApi.mjs";
|
|
2
|
+
import { PoApiContract } from "../../schemas/apiContracts.mjs";
|
|
3
3
|
import { MountPackageApiOptions } from "../packageApiHarness/index.mjs";
|
|
4
4
|
//#region src/services/apiSurfaceAssert/index.d.ts
|
|
5
5
|
export interface ApiSurfaceOptions {
|
|
6
|
-
readonly contract:
|
|
6
|
+
readonly contract: PoApiContract;
|
|
7
7
|
/** The scope being checked; only its declarations and registrations are compared. */
|
|
8
|
-
readonly scope:
|
|
9
|
-
/** What the generated
|
|
10
|
-
readonly apis: readonly
|
|
8
|
+
readonly scope: PoApiScope;
|
|
9
|
+
/** What the generated server plugin registered at this scope, in registration order. */
|
|
10
|
+
readonly apis: readonly PoApi[];
|
|
11
11
|
/** Passed through to the harness, so a session API gets its id and working directory. */
|
|
12
12
|
readonly mount?: Omit<MountPackageApiOptions, 'scope'>;
|
|
13
13
|
/**
|
|
@@ -4,7 +4,7 @@ function sorted(values) {
|
|
|
4
4
|
return [...new Set(values)].sort();
|
|
5
5
|
}
|
|
6
6
|
/** A path under the same mount that no contract declares, used to calibrate. */
|
|
7
|
-
const CONTROL_PATH = "/
|
|
7
|
+
const CONTROL_PATH = "/__po_surface_control__";
|
|
8
8
|
/**
|
|
9
9
|
* Whether a response is the framework's own miss rather than a handler's answer.
|
|
10
10
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/apiSurfaceAssert/index.ts"],"sourcesContent":["/**\n * Checks that what a package declares is what it actually serves.\n *\n * Nothing else in the toolchain does. `parseApiContract` checks a contract's\n * shape, its id uniqueness and that it is JSON, and stops there; no step\n * compares it to a mounted route or to a registration. That gap is not\n * theoretical. One package shipped a valid four-route contract, a well-tested\n * Hono app and a full unit suite for an API that was never mounted at all, and\n * the only test touching the mount asserted the emptiness rather than noticing\n * it.\n *\n * Two questions, both about liveness rather than semantics: are the base paths\n * this scope registers the same set it declares, and does every declared route\n * reach a handler. A route answering 500 passes; a route answering 404 or 405\n * does not exist.\n */\n\nimport type { PoApiContract } from '../../schemas/apiContracts';\nimport type { PoApi, PoApiScope } from '../../schemas/packageApi';\nimport { mountPackageApi, type MountPackageApiOptions } from '../packageApiHarness';\n\nexport interface ApiSurfaceOptions {\n readonly contract: PoApiContract;\n /** The scope being checked; only its declarations and registrations are compared. */\n readonly scope: PoApiScope;\n /** What the generated server plugin registered at this scope, in registration order. */\n readonly apis: readonly PoApi[];\n /** Passed through to the harness, so a session API gets its id and working directory. */\n readonly mount?: Omit<MountPackageApiOptions, 'scope'>;\n /**\n * Extra request detail for a route a bare request cannot reach, keyed by\n * contract id, most often a path parameter to substitute.\n */\n readonly probe?: Readonly<Record<string, RequestInit & { readonly path?: string }>>;\n}\n\nfunction sorted(values: Iterable<string>): string[] {\n return [...new Set(values)].sort();\n}\n\n/** A path under the same mount that no contract declares, used to calibrate. */\nconst CONTROL_PATH = '/__po_surface_control__';\n\n/**\n * Whether a response is the framework's own miss rather than a handler's answer.\n *\n * Status alone cannot tell them apart: a route that refuses an unknown record\n * answers 404 legitimately, and reading that as \"not mounted\" would fail every\n * honest API. So the same request is sent to a path nothing declares, and the\n * two are compared. A declared route answering exactly what an undeclared one\n * answers is not being served.\n *\n * A catch-all route would match the control too and read as unrouted. No\n * package has one; if one appears it should probe an explicit path instead.\n */\nasync function isUnrouted(\n mounted: { readonly mountPath: string; fetch(path: string, init?: RequestInit): Promise<Response> },\n response: Response,\n init: RequestInit,\n): Promise<boolean> {\n if (response.status !== 404 && response.status !== 405) return false;\n const control = await mounted.fetch(`${mounted.mountPath}${CONTROL_PATH}`, init);\n if (control.status !== response.status) return false;\n return (await control.text()) === (await response.text());\n}\n\n/** Throws with the disagreement spelled out, or returns having found none. */\nexport async function assertContractSurface(options: ApiSurfaceOptions): Promise<void> {\n const routes = options.contract.http.filter((route) => route.scope === options.scope && route.basePath !== undefined);\n const declared = sorted(routes.map((route) => route.basePath as string));\n const registered = sorted(options.apis.map((api) => api.basePath));\n\n const missing = declared.filter((basePath) => !registered.includes(basePath));\n if (missing.length > 0) {\n throw new Error(\n `The contract declares ${missing.join(', ')} at ${options.scope} scope, but nothing is mounted there. ` +\n `Mounted: ${registered.join(', ') || '(nothing)'}.`,\n );\n }\n const undeclared = registered.filter((basePath) => !declared.includes(basePath));\n if (undeclared.length > 0) {\n throw new Error(\n `${undeclared.join(', ')} is mounted at ${options.scope} scope but the contract never declares it there.`,\n );\n }\n\n for (const api of options.apis) {\n const mounted = mountPackageApi(api, { ...options.mount, scope: options.scope });\n try {\n for (const route of routes.filter((entry) => entry.basePath === api.basePath)) {\n const probe = options.probe?.[route.id];\n const path = probe?.path ?? route.path;\n const init = { method: route.method, ...probe };\n const response = await mounted.fetch(`${mounted.mountPath}${path === '/' ? '' : path}`, init);\n if (!(await isUnrouted(mounted, response, init))) continue;\n throw new Error(\n `${route.method} ${mounted.mountPath}${path} is declared as '${route.id}' but answered ` +\n `${response.status} exactly as an unrouted path does, so no handler serves it.`,\n );\n }\n } finally {\n mounted.close();\n }\n }\n}\n"],"mappings":";;AAoCA,SAAS,OAAO,QAAoC;CAClD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AACnC;;AAGA,MAAM,eAAe;;;;;;;;;;;;;AAcrB,eAAe,WACb,SACA,UACA,MACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO;CAC/D,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,gBAAgB,IAAI;CAC/E,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAAO;CAC/C,OAAQ,MAAM,QAAQ,KAAK,MAAQ,MAAM,SAAS,KAAK;AACzD;;AAGA,eAAsB,sBAAsB,SAA2C;CACrF,MAAM,SAAS,QAAQ,SAAS,KAAK,QAAQ,UAAU,MAAM,UAAU,QAAQ,SAAS,MAAM,aAAa,KAAA,CAAS;CACpH,MAAM,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,QAAkB,CAAC;CACvE,MAAM,aAAa,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC;CAEjE,MAAM,UAAU,SAAS,QAAQ,aAAa,CAAC,WAAW,SAAS,QAAQ,CAAC;CAC5E,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,yBAAyB,QAAQ,KAAK,IAAI,EAAE,MAAM,QAAQ,MAAM,iDAClD,WAAW,KAAK,IAAI,KAAK,YAAY,EACrD;CAEF,MAAM,aAAa,WAAW,QAAQ,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC;CAC/E,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,GAAG,WAAW,KAAK,IAAI,EAAE,iBAAiB,QAAQ,MAAM,iDAC1D;CAGF,KAAK,MAAM,OAAO,QAAQ,MAAM;EAC9B,MAAM,UAAU,gBAAgB,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAC/E,IAAI;GACF,KAAK,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,aAAa,IAAI,QAAQ,GAAG;IAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;IACpC,MAAM,OAAO,OAAO,QAAQ,MAAM;IAClC,MAAM,OAAO;KAAE,QAAQ,MAAM;KAAQ,GAAG;IAAM;IAC9C,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,SAAS,MAAM,KAAK,QAAQ,IAAI;IAC5F,IAAI,CAAE,MAAM,WAAW,SAAS,UAAU,IAAI,GAAI;IAClD,MAAM,IAAI,MACR,GAAG,MAAM,OAAO,GAAG,QAAQ,YAAY,KAAK,mBAAmB,MAAM,GAAG,iBACnE,SAAS,OAAO,4DACvB;GACF;EACF,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;AACF"}
|
|
@@ -1,27 +1,8 @@
|
|
|
1
|
-
const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
const require_runtimePiSettings = require("../../../runtimePiSettings.cjs");
|
|
3
|
-
let node_crypto = require("node:crypto");
|
|
4
|
-
let node_path = require("node:path");
|
|
5
|
-
node_path = require_runtime.__toESM(node_path, 1);
|
|
6
|
-
let node_http = require("node:http");
|
|
7
|
-
let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
|
|
8
1
|
//#region src/services/chatgptAuth/index.ts
|
|
9
2
|
/** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */
|
|
10
3
|
const CHATGPT_AUTH_PROVIDER_ID = "po-chatgpt";
|
|
11
4
|
const CHATGPT_AUTH_PROVIDER_NAME = "ChatGPT for Po features";
|
|
12
5
|
const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;
|
|
13
|
-
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
14
|
-
const AUTH_ORIGIN = "https://auth.openai.com";
|
|
15
|
-
const TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;
|
|
16
|
-
/** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */
|
|
17
|
-
const SCOPE = "openid profile email offline_access api.connectors.read api.connectors.invoke";
|
|
18
|
-
const CALLBACK_HOST = "127.0.0.1";
|
|
19
|
-
const CALLBACK_PORT = 1455;
|
|
20
|
-
const CALLBACK_PATH = "/auth/callback";
|
|
21
|
-
/** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */
|
|
22
|
-
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
23
|
-
const MAX_TOKEN_RESPONSE_BYTES = 1048576;
|
|
24
|
-
const TOKEN_TIMEOUT_MS = 3e4;
|
|
25
6
|
function record(value) {
|
|
26
7
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27
8
|
}
|
|
@@ -76,212 +57,12 @@ async function chatgptCredentials(source, loginMessage, signal) {
|
|
|
76
57
|
accountId
|
|
77
58
|
};
|
|
78
59
|
}
|
|
79
|
-
async function requestTokens(body, previousRefresh, signal) {
|
|
80
|
-
const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...signal ? [signal] : []]);
|
|
81
|
-
const response = await fetch(TOKEN_URL, {
|
|
82
|
-
method: "POST",
|
|
83
|
-
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
84
|
-
body,
|
|
85
|
-
redirect: "error",
|
|
86
|
-
signal: bounded
|
|
87
|
-
});
|
|
88
|
-
if (!response.ok) {
|
|
89
|
-
await response.body?.cancel().catch(() => void 0);
|
|
90
|
-
throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);
|
|
91
|
-
}
|
|
92
|
-
const json = await readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);
|
|
93
|
-
const access = record(json) ? json.access_token : void 0;
|
|
94
|
-
const refresh = record(json) ? json.refresh_token ?? previousRefresh : void 0;
|
|
95
|
-
const expiresIn = record(json) ? json.expires_in : void 0;
|
|
96
|
-
if (typeof access !== "string" || typeof refresh !== "string" || typeof expiresIn !== "number" || expiresIn <= 0) throw new Error("ChatGPT sign-in returned an invalid token response.");
|
|
97
|
-
const accountId = accountIdOf(access);
|
|
98
|
-
if (!accountId) throw new Error("ChatGPT sign-in did not include a ChatGPT account.");
|
|
99
|
-
return {
|
|
100
|
-
access,
|
|
101
|
-
refresh,
|
|
102
|
-
expires: Date.now() + expiresIn * 1e3,
|
|
103
|
-
accountId
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
function sameState(supplied, expected) {
|
|
107
|
-
const left = Buffer.from(supplied ?? "");
|
|
108
|
-
const right = Buffer.from(expected);
|
|
109
|
-
return left.length === right.length && (0, node_crypto.timingSafeEqual)(left, right);
|
|
110
|
-
}
|
|
111
|
-
/** The authorization code from a redirect URL; pasted input must carry the expected state. */
|
|
112
|
-
function codeFromRedirect(url, state) {
|
|
113
|
-
for (const name of [
|
|
114
|
-
"state",
|
|
115
|
-
"code",
|
|
116
|
-
"error"
|
|
117
|
-
]) if (url.searchParams.getAll(name).length > 1) throw new Error("The sign-in address is invalid.");
|
|
118
|
-
if (!sameState(url.searchParams.get("state"), state)) throw new Error("The sign-in address does not match this attempt.");
|
|
119
|
-
if (url.searchParams.get("error")) throw new Error("ChatGPT sign-in was declined.");
|
|
120
|
-
const code = url.searchParams.get("code");
|
|
121
|
-
if (!code || code.trim() !== code) throw new Error("The sign-in address has no authorization code.");
|
|
122
|
-
return code;
|
|
123
|
-
}
|
|
124
|
-
/** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */
|
|
125
|
-
async function listenForCode(state, signal) {
|
|
126
|
-
const server = (0, node_http.createServer)();
|
|
127
|
-
let resolveCode;
|
|
128
|
-
let rejectCode;
|
|
129
|
-
const code = new Promise((resolve, reject) => {
|
|
130
|
-
resolveCode = resolve;
|
|
131
|
-
rejectCode = reject;
|
|
132
|
-
});
|
|
133
|
-
code.catch(() => void 0);
|
|
134
|
-
server.on("request", (request, response) => {
|
|
135
|
-
const reply = (status, text) => {
|
|
136
|
-
response.writeHead(status, {
|
|
137
|
-
"content-type": "text/plain; charset=utf-8",
|
|
138
|
-
"cache-control": "no-store"
|
|
139
|
-
});
|
|
140
|
-
response.end(text);
|
|
141
|
-
};
|
|
142
|
-
const url = new URL(request.url ?? "/", REDIRECT_URI);
|
|
143
|
-
if (request.method !== "GET" || url.pathname !== CALLBACK_PATH) return reply(404, "Not found.");
|
|
144
|
-
try {
|
|
145
|
-
resolveCode(codeFromRedirect(url, state));
|
|
146
|
-
reply(200, "Signed in. You can close this page.");
|
|
147
|
-
} catch (error) {
|
|
148
|
-
if (sameState(url.searchParams.get("state"), state)) rejectCode(error);
|
|
149
|
-
reply(400, "Sign-in could not be completed.");
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
await new Promise((resolve, reject) => {
|
|
153
|
-
server.once("error", reject);
|
|
154
|
-
server.listen({
|
|
155
|
-
host: CALLBACK_HOST,
|
|
156
|
-
port: CALLBACK_PORT,
|
|
157
|
-
exclusive: true
|
|
158
|
-
}, () => {
|
|
159
|
-
server.off("error", reject);
|
|
160
|
-
resolve();
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
const close = () => {
|
|
164
|
-
server.close();
|
|
165
|
-
server.closeAllConnections();
|
|
166
|
-
};
|
|
167
|
-
signal?.addEventListener("abort", close, { once: true });
|
|
168
|
-
return {
|
|
169
|
-
code,
|
|
170
|
-
close
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
async function login(callbacks) {
|
|
174
|
-
const { signal } = callbacks;
|
|
175
|
-
const verifier = (0, node_crypto.randomBytes)(64).toString("base64url");
|
|
176
|
-
const state = (0, node_crypto.randomBytes)(32).toString("base64url");
|
|
177
|
-
const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);
|
|
178
|
-
authorize.search = new URLSearchParams({
|
|
179
|
-
response_type: "code",
|
|
180
|
-
client_id: CLIENT_ID,
|
|
181
|
-
redirect_uri: REDIRECT_URI,
|
|
182
|
-
scope: SCOPE,
|
|
183
|
-
code_challenge: (0, node_crypto.createHash)("sha256").update(verifier).digest("base64url"),
|
|
184
|
-
code_challenge_method: "S256",
|
|
185
|
-
id_token_add_organizations: "true",
|
|
186
|
-
state
|
|
187
|
-
}).toString();
|
|
188
|
-
const callback = await listenForCode(state, signal).catch(() => void 0);
|
|
189
|
-
try {
|
|
190
|
-
callbacks.onAuth({
|
|
191
|
-
url: authorize.toString(),
|
|
192
|
-
instructions: "Sign in in your browser. If it does not return here, paste the address it lands on."
|
|
193
|
-
});
|
|
194
|
-
const pasted = (callbacks.onManualCodeInput?.() ?? callbacks.onPrompt({
|
|
195
|
-
message: "Paste the address your browser lands on",
|
|
196
|
-
placeholder: REDIRECT_URI
|
|
197
|
-
})).then((input) => {
|
|
198
|
-
if (!URL.canParse(input.trim())) throw new Error("Paste the full address from your browser.");
|
|
199
|
-
return codeFromRedirect(new URL(input.trim()), state);
|
|
200
|
-
});
|
|
201
|
-
const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);
|
|
202
|
-
signal?.throwIfAborted();
|
|
203
|
-
return await requestTokens(new URLSearchParams({
|
|
204
|
-
grant_type: "authorization_code",
|
|
205
|
-
client_id: CLIENT_ID,
|
|
206
|
-
code,
|
|
207
|
-
code_verifier: verifier,
|
|
208
|
-
redirect_uri: REDIRECT_URI
|
|
209
|
-
}), void 0, signal);
|
|
210
|
-
} finally {
|
|
211
|
-
callback?.close();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
const chatgptAuthProvider = {
|
|
215
|
-
name: CHATGPT_AUTH_PROVIDER_NAME,
|
|
216
|
-
oauth: {
|
|
217
|
-
name: CHATGPT_AUTH_PROVIDER_NAME,
|
|
218
|
-
isSubscription: true,
|
|
219
|
-
login,
|
|
220
|
-
refreshToken: (credentials, signal) => requestTokens(new URLSearchParams({
|
|
221
|
-
grant_type: "refresh_token",
|
|
222
|
-
client_id: CLIENT_ID,
|
|
223
|
-
refresh_token: credentials.refresh
|
|
224
|
-
}), credentials.refresh, signal),
|
|
225
|
-
getApiKey: (credentials) => credentials.access
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */
|
|
229
|
-
function registerChatgptAuthProvider(runtime) {
|
|
230
|
-
runtime.registerProvider(CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json
|
|
234
|
-
* a session uses; Pi's file lock keeps refreshes from different runtimes from racing.
|
|
235
|
-
*/
|
|
236
|
-
function createChatgptAuthReader(options) {
|
|
237
|
-
let loading;
|
|
238
|
-
const runtime = () => {
|
|
239
|
-
loading ??= (async () => {
|
|
240
|
-
const agentDirectory = require_runtimePiSettings.piAgentDirectory(options.environment, options.homeDirectory);
|
|
241
|
-
const directory = require_runtimePiSettings.modelConfigDirectory(agentDirectory, options.homeDirectory);
|
|
242
|
-
const created = await _earendil_works_pi_coding_agent.ModelRuntime.create({
|
|
243
|
-
authPath: node_path.default.join(directory, "auth.json"),
|
|
244
|
-
modelsPath: node_path.default.join(directory, "models.json"),
|
|
245
|
-
refreshOnCreate: false
|
|
246
|
-
});
|
|
247
|
-
registerChatgptAuthProvider(created);
|
|
248
|
-
return created;
|
|
249
|
-
})().catch((error) => {
|
|
250
|
-
loading = void 0;
|
|
251
|
-
throw error;
|
|
252
|
-
});
|
|
253
|
-
return loading;
|
|
254
|
-
};
|
|
255
|
-
const fresh = async (signal) => {
|
|
256
|
-
const current = await runtime();
|
|
257
|
-
await current.refresh({
|
|
258
|
-
allowNetwork: false,
|
|
259
|
-
providers: [CHATGPT_AUTH_PROVIDER_ID],
|
|
260
|
-
...signal ? { signal } : {}
|
|
261
|
-
});
|
|
262
|
-
return current;
|
|
263
|
-
};
|
|
264
|
-
return {
|
|
265
|
-
/** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */
|
|
266
|
-
async signedIn(signal) {
|
|
267
|
-
return (await fresh(signal)).isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID);
|
|
268
|
-
},
|
|
269
|
-
async credentials(loginMessage, signal) {
|
|
270
|
-
const current = await fresh(signal);
|
|
271
|
-
return chatgptCredentials({
|
|
272
|
-
available: () => current.isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID),
|
|
273
|
-
getAuth: (authSignal) => current.getAuth(CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {})
|
|
274
|
-
}, loginMessage, signal);
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
60
|
//#endregion
|
|
279
61
|
exports.CHATGPT_AUTH_PROVIDER_ID = CHATGPT_AUTH_PROVIDER_ID;
|
|
280
62
|
exports.CHATGPT_AUTH_PROVIDER_NAME = CHATGPT_AUTH_PROVIDER_NAME;
|
|
281
63
|
exports.CHATGPT_SIGN_IN_HINT = CHATGPT_SIGN_IN_HINT;
|
|
64
|
+
exports.accountIdOf = accountIdOf;
|
|
282
65
|
exports.chatgptCredentials = chatgptCredentials;
|
|
283
|
-
exports.createChatgptAuthReader = createChatgptAuthReader;
|
|
284
66
|
exports.readBoundedJson = readBoundedJson;
|
|
285
|
-
exports.registerChatgptAuthProvider = registerChatgptAuthProvider;
|
|
286
67
|
|
|
287
68
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["timingSafeEqual","createServer","randomBytes","createHash","piAgentDirectory","modelConfigDirectory","ModelRuntime","path"],"sources":["../../../../src/services/chatgptAuth/index.ts"],"sourcesContent":["/*\n * Portions of this file are adapted from OpenAI Codex at commit 5ecb3afd1b, by way of po-voice.\n * Copyright OpenAI. Licensed under the Apache License, Version 2.0.\n */\n\nimport { createHash, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { createServer } from 'node:http';\nimport path from 'node:path';\n\nimport { ModelRuntime, type ProviderConfig } from '@earendil-works/pi-coding-agent';\n\nimport { modelConfigDirectory, piAgentDirectory } from '../piSettings';\n\n/** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */\nexport const CHATGPT_AUTH_PROVIDER_ID = 'po-chatgpt';\nexport const CHATGPT_AUTH_PROVIDER_NAME = 'ChatGPT for Po features';\nexport const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst AUTH_ORIGIN = 'https://auth.openai.com';\nconst TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;\n/** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */\nconst SCOPE = 'openid profile email offline_access api.connectors.read api.connectors.invoke';\nconst CALLBACK_HOST = '127.0.0.1';\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = '/auth/callback';\n/** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst MAX_TOKEN_RESPONSE_BYTES = 1024 * 1024;\nconst TOKEN_TIMEOUT_MS = 30_000;\n\ntype ChatgptOAuth = NonNullable<ProviderConfig['oauth']>;\ntype LoginCallbacks = Parameters<ChatgptOAuth['login']>[0];\ntype OAuthCredentials = Awaited<ReturnType<ChatgptOAuth['login']>>;\n\n/** Where a feature reads the shared sign-in: a session's or the hub's Pi model runtime. */\nexport interface ChatgptAuthSource {\n available(): boolean;\n getAuth(signal?: AbortSignal): Promise<{ auth: { apiKey?: string } } | undefined>;\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON body without buffering more than `limit` bytes. Errors are generic; callers map them. */\nexport async function readBoundedJson(response: Response, limit: number, signal?: AbortSignal): Promise<unknown> {\n if (!response.body) throw new Error('Response has no body.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n while (true) {\n signal?.throwIfAborted();\n const { value, done } = await reader.read();\n if (done) break;\n length += value.length;\n if (length > limit) throw new Error('Response body is too large.');\n chunks.push(value);\n }\n signal?.throwIfAborted();\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n } finally {\n await reader.cancel().catch(() => undefined); // Response cleanup never replaces the operation error.\n reader.releaseLock();\n }\n}\n\n/** The ChatGPT account claim of an access token, or undefined when it is missing or malformed. */\nfunction accountIdOf(token: string): string | undefined {\n try {\n const payload: unknown = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'));\n const auth = record(payload) ? payload['https://api.openai.com/auth'] : undefined;\n const id = record(auth) ? auth.chatgpt_account_id : undefined;\n return typeof id === 'string' && /^[A-Za-z0-9_-]{1,256}$/.test(id) ? id : undefined;\n } catch {\n return undefined; // Documented fallback: a malformed token has no account, which callers treat as signed out.\n }\n}\n\n/** Resolves the subscription token and account claim; every failure becomes `loginMessage` unless aborted. */\nexport async function chatgptCredentials(\n source: ChatgptAuthSource,\n loginMessage: string,\n signal?: AbortSignal,\n): Promise<{ token: string; accountId: string }> {\n if (!source.available()) throw new Error(loginMessage);\n let token: string | undefined;\n try {\n token = (await source.getAuth(signal))?.auth.apiKey;\n } catch {\n signal?.throwIfAborted();\n throw new Error(loginMessage);\n }\n signal?.throwIfAborted();\n const accountId = token ? accountIdOf(token) : undefined;\n if (!token || !accountId) throw new Error(loginMessage);\n return { token, accountId };\n}\n\nasync function requestTokens(\n body: URLSearchParams,\n previousRefresh: string | undefined,\n signal: AbortSignal | undefined,\n): Promise<OAuthCredentials> {\n const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...(signal ? [signal] : [])]);\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body,\n redirect: 'error',\n signal: bounded,\n });\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined); // The body may echo tokens; it is never read.\n throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);\n }\n const json = await readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);\n const access = record(json) ? json.access_token : undefined;\n const refresh = record(json) ? (json.refresh_token ?? previousRefresh) : undefined;\n const expiresIn = record(json) ? json.expires_in : undefined;\n if (typeof access !== 'string' || typeof refresh !== 'string' || typeof expiresIn !== 'number' || expiresIn <= 0)\n throw new Error('ChatGPT sign-in returned an invalid token response.');\n const accountId = accountIdOf(access);\n if (!accountId) throw new Error('ChatGPT sign-in did not include a ChatGPT account.');\n return { access, refresh, expires: Date.now() + expiresIn * 1000, accountId };\n}\n\nfunction sameState(supplied: string | null, expected: string): boolean {\n const left = Buffer.from(supplied ?? '');\n const right = Buffer.from(expected);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\n/** The authorization code from a redirect URL; pasted input must carry the expected state. */\nfunction codeFromRedirect(url: URL, state: string): string {\n for (const name of ['state', 'code', 'error'])\n if (url.searchParams.getAll(name).length > 1) throw new Error('The sign-in address is invalid.');\n if (!sameState(url.searchParams.get('state'), state))\n throw new Error('The sign-in address does not match this attempt.');\n if (url.searchParams.get('error')) throw new Error('ChatGPT sign-in was declined.');\n const code = url.searchParams.get('code');\n if (!code || code.trim() !== code) throw new Error('The sign-in address has no authorization code.');\n return code;\n}\n\n/** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */\nasync function listenForCode(state: string, signal: AbortSignal | undefined) {\n const server = createServer();\n let resolveCode!: (code: string) => void;\n let rejectCode!: (error: Error) => void;\n const code = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n code.catch(() => undefined); // Observed by the caller's race; never an unhandled rejection.\n server.on('request', (request, response) => {\n const reply = (status: number, text: string): void => {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' });\n response.end(text);\n };\n const url = new URL(request.url ?? '/', REDIRECT_URI);\n if (request.method !== 'GET' || url.pathname !== CALLBACK_PATH) return reply(404, 'Not found.');\n try {\n resolveCode(codeFromRedirect(url, state));\n reply(200, 'Signed in. You can close this page.');\n } catch (error) {\n // A stray or forged request must not end the attempt; only a matching declined redirect does.\n if (sameState(url.searchParams.get('state'), state)) rejectCode(error as Error);\n reply(400, 'Sign-in could not be completed.');\n }\n });\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen({ host: CALLBACK_HOST, port: CALLBACK_PORT, exclusive: true }, () => {\n server.off('error', reject);\n resolve();\n });\n });\n const close = (): void => {\n server.close();\n server.closeAllConnections();\n };\n signal?.addEventListener('abort', close, { once: true });\n return { code, close };\n}\n\nasync function login(callbacks: LoginCallbacks): Promise<OAuthCredentials> {\n const { signal } = callbacks;\n const verifier = randomBytes(64).toString('base64url');\n const state = randomBytes(32).toString('base64url');\n const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);\n authorize.search = new URLSearchParams({\n response_type: 'code',\n client_id: CLIENT_ID,\n redirect_uri: REDIRECT_URI,\n scope: SCOPE,\n code_challenge: createHash('sha256').update(verifier).digest('base64url'),\n code_challenge_method: 'S256',\n id_token_add_organizations: 'true',\n state,\n }).toString();\n // Port 1455 is shared with Codex and Pi's own ChatGPT login; when it is taken, the pasted address still works.\n const callback = await listenForCode(state, signal).catch(() => undefined);\n try {\n callbacks.onAuth({\n url: authorize.toString(),\n instructions: 'Sign in in your browser. If it does not return here, paste the address it lands on.',\n });\n const pasted = (\n callbacks.onManualCodeInput?.() ??\n callbacks.onPrompt({ message: 'Paste the address your browser lands on', placeholder: REDIRECT_URI })\n ).then((input) => {\n if (!URL.canParse(input.trim())) throw new Error('Paste the full address from your browser.');\n return codeFromRedirect(new URL(input.trim()), state);\n });\n const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);\n signal?.throwIfAborted();\n return await requestTokens(\n new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n undefined,\n signal,\n );\n } finally {\n callback?.close();\n }\n}\n\nconst chatgptAuthProvider: ProviderConfig = {\n name: CHATGPT_AUTH_PROVIDER_NAME,\n oauth: {\n name: CHATGPT_AUTH_PROVIDER_NAME,\n isSubscription: true,\n login,\n refreshToken: (credentials, signal) =>\n requestTokens(\n new URLSearchParams({ grant_type: 'refresh_token', client_id: CLIENT_ID, refresh_token: credentials.refresh }),\n credentials.refresh,\n signal,\n ),\n getApiKey: (credentials) => credentials.access,\n },\n};\n\n/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */\nexport function registerChatgptAuthProvider(runtime: Pick<ModelRuntime, 'registerProvider'>): void {\n runtime.registerProvider(CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);\n}\n\n/**\n * Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json\n * a session uses; Pi's file lock keeps refreshes from different runtimes from racing.\n */\nexport function createChatgptAuthReader(options: {\n environment?: Readonly<Record<string, string | undefined>>;\n homeDirectory?: string;\n}) {\n let loading: Promise<ModelRuntime> | undefined;\n const runtime = (): Promise<ModelRuntime> => {\n loading ??= (async () => {\n const agentDirectory = piAgentDirectory(options.environment, options.homeDirectory);\n const directory = modelConfigDirectory(agentDirectory, options.homeDirectory);\n const created = await ModelRuntime.create({\n authPath: path.join(directory, 'auth.json'),\n modelsPath: path.join(directory, 'models.json'),\n refreshOnCreate: false,\n });\n registerChatgptAuthProvider(created);\n return created;\n })().catch((error: unknown) => {\n loading = undefined; // A failed open is retried on the next use rather than pinned.\n throw error;\n });\n return loading;\n };\n // Sign-in happens in another runtime (the Providers page or a session), so re-read the file first.\n const fresh = async (signal?: AbortSignal): Promise<ModelRuntime> => {\n const current = await runtime();\n await current.refresh({\n allowNetwork: false,\n providers: [CHATGPT_AUTH_PROVIDER_ID],\n ...(signal ? { signal } : {}),\n });\n return current;\n };\n return {\n /** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */\n async signedIn(signal?: AbortSignal): Promise<boolean> {\n return (await fresh(signal)).isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID);\n },\n async credentials(loginMessage: string, signal?: AbortSignal): Promise<{ token: string; accountId: string }> {\n const current = await fresh(signal);\n return chatgptCredentials(\n {\n available: () => current.isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID),\n getAuth: (authSignal) => current.getAuth(CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {}),\n },\n loginMessage,\n signal,\n );\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/chatgptAuth/index.ts"],"sourcesContent":["/*\n * Portions of this file are adapted from OpenAI Codex at commit 5ecb3afd1b, by way of po-voice.\n * Copyright OpenAI. Licensed under the Apache License, Version 2.0.\n */\n\n/** The one ChatGPT sign-in every Po feature shares; separate from Pi's `openai-codex` model login. */\nexport const CHATGPT_AUTH_PROVIDER_ID = 'po-chatgpt';\nexport const CHATGPT_AUTH_PROVIDER_NAME = 'ChatGPT for Po features';\nexport const CHATGPT_SIGN_IN_HINT = `Sign in to ${CHATGPT_AUTH_PROVIDER_NAME} under Settings > Providers, or with /login.`;\n\n/** Where a feature reads the shared sign-in: a session's or the hub's Pi model runtime. */\nexport interface ChatgptAuthSource {\n available(): boolean;\n getAuth(signal?: AbortSignal): Promise<{ auth: { apiKey?: string } } | undefined>;\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON body without buffering more than `limit` bytes. Errors are generic; callers map them. */\nexport async function readBoundedJson(response: Response, limit: number, signal?: AbortSignal): Promise<unknown> {\n if (!response.body) throw new Error('Response has no body.');\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n while (true) {\n signal?.throwIfAborted();\n const { value, done } = await reader.read();\n if (done) break;\n length += value.length;\n if (length > limit) throw new Error('Response body is too large.');\n chunks.push(value);\n }\n signal?.throwIfAborted();\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n } finally {\n await reader.cancel().catch(() => undefined); // Response cleanup never replaces the operation error.\n reader.releaseLock();\n }\n}\n\n/** The ChatGPT account claim of an access token, or undefined when it is missing or malformed. */\nexport function accountIdOf(token: string): string | undefined {\n try {\n const payload: unknown = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'));\n const auth = record(payload) ? payload['https://api.openai.com/auth'] : undefined;\n const id = record(auth) ? auth.chatgpt_account_id : undefined;\n return typeof id === 'string' && /^[A-Za-z0-9_-]{1,256}$/.test(id) ? id : undefined;\n } catch {\n return undefined; // Documented fallback: a malformed token has no account, which callers treat as signed out.\n }\n}\n\n/** Resolves the subscription token and account claim; every failure becomes `loginMessage` unless aborted. */\nexport async function chatgptCredentials(\n source: ChatgptAuthSource,\n loginMessage: string,\n signal?: AbortSignal,\n): Promise<{ token: string; accountId: string }> {\n if (!source.available()) throw new Error(loginMessage);\n let token: string | undefined;\n try {\n token = (await source.getAuth(signal))?.auth.apiKey;\n } catch {\n signal?.throwIfAborted();\n throw new Error(loginMessage);\n }\n signal?.throwIfAborted();\n const accountId = token ? accountIdOf(token) : undefined;\n if (!token || !accountId) throw new Error(loginMessage);\n return { token, accountId };\n}\n"],"mappings":";;AAMA,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB,cAAc,2BAA2B;AAQ7E,SAAS,OAAO,OAAkD;CAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;AAGA,eAAsB,gBAAgB,UAAoB,OAAe,QAAwC;CAC/G,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,MAAM,uBAAuB;CAC3D,MAAM,SAAS,SAAS,KAAK,UAAU;CACvC,MAAM,SAAuB,CAAC;CAC9B,IAAI,SAAS;CACb,IAAI;EACF,OAAO,MAAM;GACX,QAAQ,eAAe;GACvB,MAAM,EAAE,OAAO,SAAS,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,UAAU,MAAM;GAChB,IAAI,SAAS,OAAO,MAAM,IAAI,MAAM,6BAA6B;GACjE,OAAO,KAAK,KAAK;EACnB;EACA,QAAQ,eAAe;EACvB,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC;CAC1D,UAAU;EACR,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EAC3C,OAAO,YAAY;CACrB;AACF;;AAGA,SAAgB,YAAY,OAAmC;CAC7D,IAAI;EACF,MAAM,UAAmB,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC;EACxG,MAAM,OAAO,OAAO,OAAO,IAAI,QAAQ,iCAAiC,KAAA;EACxE,MAAM,KAAK,OAAO,IAAI,IAAI,KAAK,qBAAqB,KAAA;EACpD,OAAO,OAAO,OAAO,YAAY,yBAAyB,KAAK,EAAE,IAAI,KAAK,KAAA;CAC5E,QAAQ;EACN;CACF;AACF;;AAGA,eAAsB,mBACpB,QACA,cACA,QAC+C;CAC/C,IAAI,CAAC,OAAO,UAAU,GAAG,MAAM,IAAI,MAAM,YAAY;CACrD,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAA,EAAI,KAAK;CAC/C,QAAQ;EACN,QAAQ,eAAe;EACvB,MAAM,IAAI,MAAM,YAAY;CAC9B;CACA,QAAQ,eAAe;CACvB,MAAM,YAAY,QAAQ,YAAY,KAAK,IAAI,KAAA;CAC/C,IAAI,CAAC,SAAS,CAAC,WAAW,MAAM,IAAI,MAAM,YAAY;CACtD,OAAO;EAAE;EAAO;CAAU;AAC5B"}
|