@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
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_core = require("../piSettings/core.cjs");
|
|
3
|
+
const require_sync = require("../piSettings/sync.cjs");
|
|
4
|
+
require("../../../runtimePiSettings.cjs");
|
|
5
|
+
const require_index = require("../chatgptAuth/index.cjs");
|
|
6
|
+
let node_crypto = require("node:crypto");
|
|
7
|
+
let node_path = require("node:path");
|
|
8
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
9
|
+
let node_http = require("node:http");
|
|
10
|
+
let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
|
|
11
|
+
//#region src/services/chatgptLogin/index.ts
|
|
12
|
+
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
13
|
+
const AUTH_ORIGIN = "https://auth.openai.com";
|
|
14
|
+
const TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;
|
|
15
|
+
/** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */
|
|
16
|
+
const SCOPE = "openid profile email offline_access api.connectors.read api.connectors.invoke";
|
|
17
|
+
const CALLBACK_HOST = "127.0.0.1";
|
|
18
|
+
const CALLBACK_PORT = 1455;
|
|
19
|
+
const CALLBACK_PATH = "/auth/callback";
|
|
20
|
+
/** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */
|
|
21
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
22
|
+
const MAX_TOKEN_RESPONSE_BYTES = 1048576;
|
|
23
|
+
const TOKEN_TIMEOUT_MS = 3e4;
|
|
24
|
+
function record(value) {
|
|
25
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
async function requestTokens(body, previousRefresh, signal) {
|
|
28
|
+
const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...signal ? [signal] : []]);
|
|
29
|
+
const response = await fetch(TOKEN_URL, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
32
|
+
body,
|
|
33
|
+
redirect: "error",
|
|
34
|
+
signal: bounded
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
await response.body?.cancel().catch(() => void 0);
|
|
38
|
+
throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);
|
|
39
|
+
}
|
|
40
|
+
const json = await require_index.readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);
|
|
41
|
+
const access = record(json) ? json.access_token : void 0;
|
|
42
|
+
const refresh = record(json) ? json.refresh_token ?? previousRefresh : void 0;
|
|
43
|
+
const expiresIn = record(json) ? json.expires_in : void 0;
|
|
44
|
+
if (typeof access !== "string" || typeof refresh !== "string" || typeof expiresIn !== "number" || expiresIn <= 0) throw new Error("ChatGPT sign-in returned an invalid token response.");
|
|
45
|
+
const accountId = require_index.accountIdOf(access);
|
|
46
|
+
if (!accountId) throw new Error("ChatGPT sign-in did not include a ChatGPT account.");
|
|
47
|
+
return {
|
|
48
|
+
access,
|
|
49
|
+
refresh,
|
|
50
|
+
expires: Date.now() + expiresIn * 1e3,
|
|
51
|
+
accountId
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function sameState(supplied, expected) {
|
|
55
|
+
const left = Buffer.from(supplied ?? "");
|
|
56
|
+
const right = Buffer.from(expected);
|
|
57
|
+
return left.length === right.length && (0, node_crypto.timingSafeEqual)(left, right);
|
|
58
|
+
}
|
|
59
|
+
/** The authorization code from a redirect URL; pasted input must carry the expected state. */
|
|
60
|
+
function codeFromRedirect(url, state) {
|
|
61
|
+
for (const name of [
|
|
62
|
+
"state",
|
|
63
|
+
"code",
|
|
64
|
+
"error"
|
|
65
|
+
]) if (url.searchParams.getAll(name).length > 1) throw new Error("The sign-in address is invalid.");
|
|
66
|
+
if (!sameState(url.searchParams.get("state"), state)) throw new Error("The sign-in address does not match this attempt.");
|
|
67
|
+
if (url.searchParams.get("error")) throw new Error("ChatGPT sign-in was declined.");
|
|
68
|
+
const code = url.searchParams.get("code");
|
|
69
|
+
if (!code || code.trim() !== code) throw new Error("The sign-in address has no authorization code.");
|
|
70
|
+
return code;
|
|
71
|
+
}
|
|
72
|
+
/** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */
|
|
73
|
+
async function listenForCode(state, signal) {
|
|
74
|
+
const server = (0, node_http.createServer)();
|
|
75
|
+
let resolveCode;
|
|
76
|
+
let rejectCode;
|
|
77
|
+
const code = new Promise((resolve, reject) => {
|
|
78
|
+
resolveCode = resolve;
|
|
79
|
+
rejectCode = reject;
|
|
80
|
+
});
|
|
81
|
+
code.catch(() => void 0);
|
|
82
|
+
server.on("request", (request, response) => {
|
|
83
|
+
const reply = (status, text) => {
|
|
84
|
+
response.writeHead(status, {
|
|
85
|
+
"content-type": "text/plain; charset=utf-8",
|
|
86
|
+
"cache-control": "no-store"
|
|
87
|
+
});
|
|
88
|
+
response.end(text);
|
|
89
|
+
};
|
|
90
|
+
const url = new URL(request.url ?? "/", REDIRECT_URI);
|
|
91
|
+
if (request.method !== "GET" || url.pathname !== CALLBACK_PATH) return reply(404, "Not found.");
|
|
92
|
+
try {
|
|
93
|
+
resolveCode(codeFromRedirect(url, state));
|
|
94
|
+
reply(200, "Signed in. You can close this page.");
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (sameState(url.searchParams.get("state"), state)) rejectCode(error);
|
|
97
|
+
reply(400, "Sign-in could not be completed.");
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
await new Promise((resolve, reject) => {
|
|
101
|
+
server.once("error", reject);
|
|
102
|
+
server.listen({
|
|
103
|
+
host: CALLBACK_HOST,
|
|
104
|
+
port: CALLBACK_PORT,
|
|
105
|
+
exclusive: true
|
|
106
|
+
}, () => {
|
|
107
|
+
server.off("error", reject);
|
|
108
|
+
resolve();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
const close = () => {
|
|
112
|
+
server.close();
|
|
113
|
+
server.closeAllConnections();
|
|
114
|
+
};
|
|
115
|
+
signal?.addEventListener("abort", close, { once: true });
|
|
116
|
+
return {
|
|
117
|
+
code,
|
|
118
|
+
close
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function login(callbacks) {
|
|
122
|
+
const { signal } = callbacks;
|
|
123
|
+
const verifier = (0, node_crypto.randomBytes)(64).toString("base64url");
|
|
124
|
+
const state = (0, node_crypto.randomBytes)(32).toString("base64url");
|
|
125
|
+
const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);
|
|
126
|
+
authorize.search = new URLSearchParams({
|
|
127
|
+
response_type: "code",
|
|
128
|
+
client_id: CLIENT_ID,
|
|
129
|
+
redirect_uri: REDIRECT_URI,
|
|
130
|
+
scope: SCOPE,
|
|
131
|
+
code_challenge: (0, node_crypto.createHash)("sha256").update(verifier).digest("base64url"),
|
|
132
|
+
code_challenge_method: "S256",
|
|
133
|
+
id_token_add_organizations: "true",
|
|
134
|
+
state
|
|
135
|
+
}).toString();
|
|
136
|
+
const callback = await listenForCode(state, signal).catch(() => void 0);
|
|
137
|
+
try {
|
|
138
|
+
callbacks.onAuth({
|
|
139
|
+
url: authorize.toString(),
|
|
140
|
+
instructions: "Sign in in your browser. If it does not return here, paste the address it lands on."
|
|
141
|
+
});
|
|
142
|
+
const pasted = (callbacks.onManualCodeInput?.() ?? callbacks.onPrompt({
|
|
143
|
+
message: "Paste the address your browser lands on",
|
|
144
|
+
placeholder: REDIRECT_URI
|
|
145
|
+
})).then((input) => {
|
|
146
|
+
if (!URL.canParse(input.trim())) throw new Error("Paste the full address from your browser.");
|
|
147
|
+
return codeFromRedirect(new URL(input.trim()), state);
|
|
148
|
+
});
|
|
149
|
+
const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);
|
|
150
|
+
signal?.throwIfAborted();
|
|
151
|
+
return await requestTokens(new URLSearchParams({
|
|
152
|
+
grant_type: "authorization_code",
|
|
153
|
+
client_id: CLIENT_ID,
|
|
154
|
+
code,
|
|
155
|
+
code_verifier: verifier,
|
|
156
|
+
redirect_uri: REDIRECT_URI
|
|
157
|
+
}), void 0, signal);
|
|
158
|
+
} finally {
|
|
159
|
+
callback?.close();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const chatgptAuthProvider = {
|
|
163
|
+
name: require_index.CHATGPT_AUTH_PROVIDER_NAME,
|
|
164
|
+
oauth: {
|
|
165
|
+
name: require_index.CHATGPT_AUTH_PROVIDER_NAME,
|
|
166
|
+
isSubscription: true,
|
|
167
|
+
login,
|
|
168
|
+
refreshToken: (credentials, signal) => requestTokens(new URLSearchParams({
|
|
169
|
+
grant_type: "refresh_token",
|
|
170
|
+
client_id: CLIENT_ID,
|
|
171
|
+
refresh_token: credentials.refresh
|
|
172
|
+
}), credentials.refresh, signal),
|
|
173
|
+
getApiKey: (credentials) => credentials.access
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */
|
|
177
|
+
function registerChatgptAuthProvider(runtime) {
|
|
178
|
+
runtime.registerProvider(require_index.CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json
|
|
182
|
+
* a session uses; Pi's file lock keeps refreshes from different runtimes from racing.
|
|
183
|
+
*/
|
|
184
|
+
function createChatgptAuthReader(options) {
|
|
185
|
+
let loading;
|
|
186
|
+
const runtime = () => {
|
|
187
|
+
loading ??= (async () => {
|
|
188
|
+
const agentDirectory = require_core.piAgentDirectory(options.environment, options.homeDirectory);
|
|
189
|
+
const directory = require_sync.modelConfigDirectory(agentDirectory, options.homeDirectory);
|
|
190
|
+
const created = await _earendil_works_pi_coding_agent.ModelRuntime.create({
|
|
191
|
+
authPath: node_path.default.join(directory, "auth.json"),
|
|
192
|
+
modelsPath: node_path.default.join(directory, "models.json"),
|
|
193
|
+
refreshOnCreate: false
|
|
194
|
+
});
|
|
195
|
+
registerChatgptAuthProvider(created);
|
|
196
|
+
return created;
|
|
197
|
+
})().catch((error) => {
|
|
198
|
+
loading = void 0;
|
|
199
|
+
throw error;
|
|
200
|
+
});
|
|
201
|
+
return loading;
|
|
202
|
+
};
|
|
203
|
+
const fresh = async (signal) => {
|
|
204
|
+
const current = await runtime();
|
|
205
|
+
await current.refresh({
|
|
206
|
+
allowNetwork: false,
|
|
207
|
+
providers: [require_index.CHATGPT_AUTH_PROVIDER_ID],
|
|
208
|
+
...signal ? { signal } : {}
|
|
209
|
+
});
|
|
210
|
+
return current;
|
|
211
|
+
};
|
|
212
|
+
return {
|
|
213
|
+
/** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */
|
|
214
|
+
async signedIn(signal) {
|
|
215
|
+
return (await fresh(signal)).isUsingSubscription(require_index.CHATGPT_AUTH_PROVIDER_ID);
|
|
216
|
+
},
|
|
217
|
+
async credentials(loginMessage, signal) {
|
|
218
|
+
const current = await fresh(signal);
|
|
219
|
+
return require_index.chatgptCredentials({
|
|
220
|
+
available: () => current.isUsingSubscription(require_index.CHATGPT_AUTH_PROVIDER_ID),
|
|
221
|
+
getAuth: (authSignal) => current.getAuth(require_index.CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {})
|
|
222
|
+
}, loginMessage, signal);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//#endregion
|
|
227
|
+
exports.createChatgptAuthReader = createChatgptAuthReader;
|
|
228
|
+
exports.registerChatgptAuthProvider = registerChatgptAuthProvider;
|
|
229
|
+
|
|
230
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["readBoundedJson","accountIdOf","timingSafeEqual","createServer","randomBytes","createHash","CHATGPT_AUTH_PROVIDER_NAME","CHATGPT_AUTH_PROVIDER_ID","piAgentDirectory","modelConfigDirectory","ModelRuntime","path","chatgptCredentials"],"sources":["../../../../src/services/chatgptLogin/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 {\n accountIdOf,\n CHATGPT_AUTH_PROVIDER_ID,\n CHATGPT_AUTH_PROVIDER_NAME,\n chatgptCredentials,\n readBoundedJson,\n} from '../chatgptAuth';\nimport { modelConfigDirectory, piAgentDirectory } from '../piSettings';\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\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\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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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
//#region src/services/chatgptLogin/index.d.ts
|
|
3
|
+
/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */
|
|
4
|
+
export declare function registerChatgptAuthProvider(runtime: Pick<ModelRuntime, 'registerProvider'>): void;
|
|
5
|
+
/**
|
|
6
|
+
* Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json
|
|
7
|
+
* a session uses; Pi's file lock keeps refreshes from different runtimes from racing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createChatgptAuthReader(options: {
|
|
10
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
11
|
+
homeDirectory?: string;
|
|
12
|
+
}): {
|
|
13
|
+
/** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */
|
|
14
|
+
signedIn(signal?: AbortSignal): Promise<boolean>;
|
|
15
|
+
credentials(loginMessage: string, signal?: AbortSignal): Promise<{
|
|
16
|
+
token: string;
|
|
17
|
+
accountId: string;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/chatgptLogin/index.ts"],"mappings":";;;wBAgMgB,4BAA4B,SAAS,KAAK;;;;;wBAQ1C,wBAAwB;EACtC,cAAc,SAAS;EACvB;;;EAgCQ,SAAQ,SAAU,cAAc;EAGhC,YAAW,sBAAqB,SAAW,cAAc;IAAU;IAAe"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { piAgentDirectory } from "../piSettings/core.mjs";
|
|
2
|
+
import { modelConfigDirectory } from "../piSettings/sync.mjs";
|
|
3
|
+
import "../../../runtimePiSettings.mjs";
|
|
4
|
+
import { CHATGPT_AUTH_PROVIDER_ID, CHATGPT_AUTH_PROVIDER_NAME, accountIdOf, chatgptCredentials, readBoundedJson } from "../chatgptAuth/index.mjs";
|
|
5
|
+
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { createServer } from "node:http";
|
|
8
|
+
import { ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
//#region src/services/chatgptLogin/index.ts
|
|
10
|
+
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
11
|
+
const AUTH_ORIGIN = "https://auth.openai.com";
|
|
12
|
+
const TOKEN_URL = `${AUTH_ORIGIN}/oauth/token`;
|
|
13
|
+
/** Realtime voice needs the connector scopes that Pi's own ChatGPT login does not request. */
|
|
14
|
+
const SCOPE = "openid profile email offline_access api.connectors.read api.connectors.invoke";
|
|
15
|
+
const CALLBACK_HOST = "127.0.0.1";
|
|
16
|
+
const CALLBACK_PORT = 1455;
|
|
17
|
+
const CALLBACK_PATH = "/auth/callback";
|
|
18
|
+
/** The redirect registered for this OAuth client; the browser reaches the listener through localhost. */
|
|
19
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
20
|
+
const MAX_TOKEN_RESPONSE_BYTES = 1048576;
|
|
21
|
+
const TOKEN_TIMEOUT_MS = 3e4;
|
|
22
|
+
function record(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
async function requestTokens(body, previousRefresh, signal) {
|
|
26
|
+
const bounded = AbortSignal.any([AbortSignal.timeout(TOKEN_TIMEOUT_MS), ...signal ? [signal] : []]);
|
|
27
|
+
const response = await fetch(TOKEN_URL, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
30
|
+
body,
|
|
31
|
+
redirect: "error",
|
|
32
|
+
signal: bounded
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
await response.body?.cancel().catch(() => void 0);
|
|
36
|
+
throw new Error(`ChatGPT sign-in was rejected (HTTP ${response.status}). Sign in again.`);
|
|
37
|
+
}
|
|
38
|
+
const json = await readBoundedJson(response, MAX_TOKEN_RESPONSE_BYTES, bounded);
|
|
39
|
+
const access = record(json) ? json.access_token : void 0;
|
|
40
|
+
const refresh = record(json) ? json.refresh_token ?? previousRefresh : void 0;
|
|
41
|
+
const expiresIn = record(json) ? json.expires_in : void 0;
|
|
42
|
+
if (typeof access !== "string" || typeof refresh !== "string" || typeof expiresIn !== "number" || expiresIn <= 0) throw new Error("ChatGPT sign-in returned an invalid token response.");
|
|
43
|
+
const accountId = accountIdOf(access);
|
|
44
|
+
if (!accountId) throw new Error("ChatGPT sign-in did not include a ChatGPT account.");
|
|
45
|
+
return {
|
|
46
|
+
access,
|
|
47
|
+
refresh,
|
|
48
|
+
expires: Date.now() + expiresIn * 1e3,
|
|
49
|
+
accountId
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function sameState(supplied, expected) {
|
|
53
|
+
const left = Buffer.from(supplied ?? "");
|
|
54
|
+
const right = Buffer.from(expected);
|
|
55
|
+
return left.length === right.length && timingSafeEqual(left, right);
|
|
56
|
+
}
|
|
57
|
+
/** The authorization code from a redirect URL; pasted input must carry the expected state. */
|
|
58
|
+
function codeFromRedirect(url, state) {
|
|
59
|
+
for (const name of [
|
|
60
|
+
"state",
|
|
61
|
+
"code",
|
|
62
|
+
"error"
|
|
63
|
+
]) if (url.searchParams.getAll(name).length > 1) throw new Error("The sign-in address is invalid.");
|
|
64
|
+
if (!sameState(url.searchParams.get("state"), state)) throw new Error("The sign-in address does not match this attempt.");
|
|
65
|
+
if (url.searchParams.get("error")) throw new Error("ChatGPT sign-in was declined.");
|
|
66
|
+
const code = url.searchParams.get("code");
|
|
67
|
+
if (!code || code.trim() !== code) throw new Error("The sign-in address has no authorization code.");
|
|
68
|
+
return code;
|
|
69
|
+
}
|
|
70
|
+
/** Listens for the browser redirect on the registered loopback port; rejects when the port is taken. */
|
|
71
|
+
async function listenForCode(state, signal) {
|
|
72
|
+
const server = createServer();
|
|
73
|
+
let resolveCode;
|
|
74
|
+
let rejectCode;
|
|
75
|
+
const code = new Promise((resolve, reject) => {
|
|
76
|
+
resolveCode = resolve;
|
|
77
|
+
rejectCode = reject;
|
|
78
|
+
});
|
|
79
|
+
code.catch(() => void 0);
|
|
80
|
+
server.on("request", (request, response) => {
|
|
81
|
+
const reply = (status, text) => {
|
|
82
|
+
response.writeHead(status, {
|
|
83
|
+
"content-type": "text/plain; charset=utf-8",
|
|
84
|
+
"cache-control": "no-store"
|
|
85
|
+
});
|
|
86
|
+
response.end(text);
|
|
87
|
+
};
|
|
88
|
+
const url = new URL(request.url ?? "/", REDIRECT_URI);
|
|
89
|
+
if (request.method !== "GET" || url.pathname !== CALLBACK_PATH) return reply(404, "Not found.");
|
|
90
|
+
try {
|
|
91
|
+
resolveCode(codeFromRedirect(url, state));
|
|
92
|
+
reply(200, "Signed in. You can close this page.");
|
|
93
|
+
} catch (error) {
|
|
94
|
+
if (sameState(url.searchParams.get("state"), state)) rejectCode(error);
|
|
95
|
+
reply(400, "Sign-in could not be completed.");
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
await new Promise((resolve, reject) => {
|
|
99
|
+
server.once("error", reject);
|
|
100
|
+
server.listen({
|
|
101
|
+
host: CALLBACK_HOST,
|
|
102
|
+
port: CALLBACK_PORT,
|
|
103
|
+
exclusive: true
|
|
104
|
+
}, () => {
|
|
105
|
+
server.off("error", reject);
|
|
106
|
+
resolve();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
const close = () => {
|
|
110
|
+
server.close();
|
|
111
|
+
server.closeAllConnections();
|
|
112
|
+
};
|
|
113
|
+
signal?.addEventListener("abort", close, { once: true });
|
|
114
|
+
return {
|
|
115
|
+
code,
|
|
116
|
+
close
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function login(callbacks) {
|
|
120
|
+
const { signal } = callbacks;
|
|
121
|
+
const verifier = randomBytes(64).toString("base64url");
|
|
122
|
+
const state = randomBytes(32).toString("base64url");
|
|
123
|
+
const authorize = new URL(`${AUTH_ORIGIN}/oauth/authorize`);
|
|
124
|
+
authorize.search = new URLSearchParams({
|
|
125
|
+
response_type: "code",
|
|
126
|
+
client_id: CLIENT_ID,
|
|
127
|
+
redirect_uri: REDIRECT_URI,
|
|
128
|
+
scope: SCOPE,
|
|
129
|
+
code_challenge: createHash("sha256").update(verifier).digest("base64url"),
|
|
130
|
+
code_challenge_method: "S256",
|
|
131
|
+
id_token_add_organizations: "true",
|
|
132
|
+
state
|
|
133
|
+
}).toString();
|
|
134
|
+
const callback = await listenForCode(state, signal).catch(() => void 0);
|
|
135
|
+
try {
|
|
136
|
+
callbacks.onAuth({
|
|
137
|
+
url: authorize.toString(),
|
|
138
|
+
instructions: "Sign in in your browser. If it does not return here, paste the address it lands on."
|
|
139
|
+
});
|
|
140
|
+
const pasted = (callbacks.onManualCodeInput?.() ?? callbacks.onPrompt({
|
|
141
|
+
message: "Paste the address your browser lands on",
|
|
142
|
+
placeholder: REDIRECT_URI
|
|
143
|
+
})).then((input) => {
|
|
144
|
+
if (!URL.canParse(input.trim())) throw new Error("Paste the full address from your browser.");
|
|
145
|
+
return codeFromRedirect(new URL(input.trim()), state);
|
|
146
|
+
});
|
|
147
|
+
const code = await (callback ? Promise.race([callback.code, pasted]) : pasted);
|
|
148
|
+
signal?.throwIfAborted();
|
|
149
|
+
return await requestTokens(new URLSearchParams({
|
|
150
|
+
grant_type: "authorization_code",
|
|
151
|
+
client_id: CLIENT_ID,
|
|
152
|
+
code,
|
|
153
|
+
code_verifier: verifier,
|
|
154
|
+
redirect_uri: REDIRECT_URI
|
|
155
|
+
}), void 0, signal);
|
|
156
|
+
} finally {
|
|
157
|
+
callback?.close();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const chatgptAuthProvider = {
|
|
161
|
+
name: CHATGPT_AUTH_PROVIDER_NAME,
|
|
162
|
+
oauth: {
|
|
163
|
+
name: CHATGPT_AUTH_PROVIDER_NAME,
|
|
164
|
+
isSubscription: true,
|
|
165
|
+
login,
|
|
166
|
+
refreshToken: (credentials, signal) => requestTokens(new URLSearchParams({
|
|
167
|
+
grant_type: "refresh_token",
|
|
168
|
+
client_id: CLIENT_ID,
|
|
169
|
+
refresh_token: credentials.refresh
|
|
170
|
+
}), credentials.refresh, signal),
|
|
171
|
+
getApiKey: (credentials) => credentials.access
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
/** Adds the shared sign-in to a Pi model runtime: its Providers row, /login entry, refresh and storage. */
|
|
175
|
+
function registerChatgptAuthProvider(runtime) {
|
|
176
|
+
runtime.registerProvider(CHATGPT_AUTH_PROVIDER_ID, chatgptAuthProvider);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Reads the shared sign-in outside a session (Voice runs at the hub). It opens the same auth.json
|
|
180
|
+
* a session uses; Pi's file lock keeps refreshes from different runtimes from racing.
|
|
181
|
+
*/
|
|
182
|
+
function createChatgptAuthReader(options) {
|
|
183
|
+
let loading;
|
|
184
|
+
const runtime = () => {
|
|
185
|
+
loading ??= (async () => {
|
|
186
|
+
const agentDirectory = piAgentDirectory(options.environment, options.homeDirectory);
|
|
187
|
+
const directory = modelConfigDirectory(agentDirectory, options.homeDirectory);
|
|
188
|
+
const created = await ModelRuntime.create({
|
|
189
|
+
authPath: path.join(directory, "auth.json"),
|
|
190
|
+
modelsPath: path.join(directory, "models.json"),
|
|
191
|
+
refreshOnCreate: false
|
|
192
|
+
});
|
|
193
|
+
registerChatgptAuthProvider(created);
|
|
194
|
+
return created;
|
|
195
|
+
})().catch((error) => {
|
|
196
|
+
loading = void 0;
|
|
197
|
+
throw error;
|
|
198
|
+
});
|
|
199
|
+
return loading;
|
|
200
|
+
};
|
|
201
|
+
const fresh = async (signal) => {
|
|
202
|
+
const current = await runtime();
|
|
203
|
+
await current.refresh({
|
|
204
|
+
allowNetwork: false,
|
|
205
|
+
providers: [CHATGPT_AUTH_PROVIDER_ID],
|
|
206
|
+
...signal ? { signal } : {}
|
|
207
|
+
});
|
|
208
|
+
return current;
|
|
209
|
+
};
|
|
210
|
+
return {
|
|
211
|
+
/** Whether the shared sign-in exists on disk. No network call; the same check `credentials` runs first. */
|
|
212
|
+
async signedIn(signal) {
|
|
213
|
+
return (await fresh(signal)).isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID);
|
|
214
|
+
},
|
|
215
|
+
async credentials(loginMessage, signal) {
|
|
216
|
+
const current = await fresh(signal);
|
|
217
|
+
return chatgptCredentials({
|
|
218
|
+
available: () => current.isUsingSubscription(CHATGPT_AUTH_PROVIDER_ID),
|
|
219
|
+
getAuth: (authSignal) => current.getAuth(CHATGPT_AUTH_PROVIDER_ID, authSignal ? { signal: authSignal } : {})
|
|
220
|
+
}, loginMessage, signal);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//#endregion
|
|
225
|
+
export { createChatgptAuthReader, registerChatgptAuthProvider };
|
|
226
|
+
|
|
227
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/chatgptLogin/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 {\n accountIdOf,\n CHATGPT_AUTH_PROVIDER_ID,\n CHATGPT_AUTH_PROVIDER_NAME,\n chatgptCredentials,\n readBoundedJson,\n} from '../chatgptAuth';\nimport { modelConfigDirectory, piAgentDirectory } from '../piSettings';\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\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\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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"}
|
|
@@ -48,7 +48,7 @@ function conversationInput(conversation) {
|
|
|
48
48
|
};
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
|
-
/** Host-only transport: authentication never crosses the
|
|
51
|
+
/** Host-only transport: authentication never crosses the package boundary. */
|
|
52
52
|
function createChatgptWebSearchClient(dependencies) {
|
|
53
53
|
return { async search(request) {
|
|
54
54
|
const { signal } = request;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["CHATGPT_SIGN_IN_HINT","chatgptCredentials","readBoundedJson"],"sources":["../../../../src/services/chatgptWebSearch/index.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["CHATGPT_SIGN_IN_HINT","chatgptCredentials","readBoundedJson"],"sources":["../../../../src/services/chatgptWebSearch/index.ts"],"sourcesContent":["import type { PoHeadlessExecutionContext } from '../../schemas/headless';\nimport { CHATGPT_SIGN_IN_HINT, chatgptCredentials, readBoundedJson } from '../chatgptAuth';\nimport type { ChatgptBackendDependencies } from '../chatgptImages/type';\n\nconst ENDPOINT = 'https://chatgpt.com/backend-api/codex/alpha/search';\nconst MAX_OUTPUT_TOKENS = 10_000; // Codex models.json tool truncation budget.\nconst MAX_COMMANDS_BYTES = 64 * 1024;\n// Fits the layer's ~20k-character excerpt even when every character needs a six-byte JSON escape.\nconst MAX_CONVERSATION_BYTES = 256 * 1024;\nconst MAX_CONVERSATION_ITEMS = 16;\nconst MAX_RESPONSE_BYTES = 4 * 1024 * 1024;\nconst MAX_RESULTS = 100;\nconst LOGIN_MESSAGE = `Web search needs a ChatGPT sign-in. ${CHATGPT_SIGN_IN_HINT}`;\nconst INVALID_RESPONSE = 'Web search returned an invalid response.';\nconst FAILED = 'Web search request failed.';\nconst ACCESS = { cached: false, indexed: 'indexed', live: true } as const;\n// ponytail: copy of Pi's defaultModelPerProvider['openai-codex'] (model-resolver.js), which Pi does not export.\n// Used when the chat model is not a ChatGPT model; goes stale when Pi's catalog moves.\nconst DEFAULT_MODEL = 'gpt-6.1-sol';\n\nexport type WebSearchRequest = Parameters<NonNullable<PoHeadlessExecutionContext['webSearch']>['search']>[0] & {\n sessionId: string;\n /** The active ChatGPT model id; omitted when the chat model belongs to another provider. */\n model?: string;\n};\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Detaches caller data into plain JSON so the wire body is exactly what was validated. */\nfunction boundedJson(value: unknown, limit: number, message: string): unknown {\n let json: string | undefined;\n try {\n json = JSON.stringify(value);\n } catch {\n throw new Error(message);\n }\n if (json === undefined || Buffer.byteLength(json) > limit) throw new Error(message);\n return JSON.parse(json) as unknown;\n}\n\nfunction conversationInput(conversation: unknown) {\n if (conversation === undefined) return undefined;\n const message = 'Invalid web search conversation.';\n if (!Array.isArray(conversation) || conversation.length > MAX_CONVERSATION_ITEMS) throw new Error(message);\n const items = boundedJson(conversation, MAX_CONVERSATION_BYTES, message) as unknown[];\n if (items.length === 0) return undefined;\n return items.map((item) => {\n if (\n !record(item) ||\n (item.role !== 'user' && item.role !== 'assistant') ||\n typeof item.text !== 'string' ||\n !item.text\n )\n throw new Error(message);\n return {\n type: 'message',\n role: item.role,\n content: [{ type: item.role === 'user' ? 'input_text' : 'output_text', text: item.text }],\n };\n });\n}\n\n/** Host-only transport: authentication never crosses the package boundary. */\nexport function createChatgptWebSearchClient(dependencies: ChatgptBackendDependencies) {\n return {\n async search(request: WebSearchRequest): Promise<{ output: string; results?: Record<string, unknown>[] }> {\n const { signal } = request;\n signal?.throwIfAborted();\n if (!record(request.commands) || Object.keys(request.commands).length === 0)\n throw new Error('Invalid web search commands.');\n const commands = boundedJson(request.commands, MAX_COMMANDS_BYTES, 'Invalid web search commands.');\n const input = conversationInput(request.conversation);\n if (!Object.hasOwn(ACCESS, request.access)) throw new Error('Invalid web search access mode.');\n const model = request.model ?? DEFAULT_MODEL;\n if (typeof model !== 'string' || !/^[A-Za-z0-9._:-]{1,128}$/.test(model))\n throw new Error('Invalid web search model.');\n if (typeof request.sessionId !== 'string' || !/^[\\x21-\\x7e]{1,256}$/.test(request.sessionId))\n throw new Error('Invalid web search session.');\n const { token, accountId } = await chatgptCredentials(dependencies, LOGIN_MESSAGE, signal);\n let response: Response;\n try {\n response = await (dependencies.fetch ?? globalThis.fetch)(ENDPOINT, {\n method: 'POST',\n redirect: 'error',\n signal,\n headers: {\n Authorization: `Bearer ${token}`,\n 'chatgpt-account-id': accountId,\n originator: 'po_web_search',\n 'User-Agent': '@agimon-ai/po-web-search',\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n id: request.sessionId,\n model,\n ...(input ? { input } : {}),\n commands,\n settings: { allowed_callers: ['direct'], external_web_access: ACCESS[request.access] },\n max_output_tokens: MAX_OUTPUT_TOKENS,\n }),\n });\n } catch {\n signal?.throwIfAborted();\n throw new Error(FAILED);\n }\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n if (response.status === 401) throw new Error(LOGIN_MESSAGE);\n if (response.status === 403) throw new Error('Web search is not available for this ChatGPT account.');\n if (response.status === 429) {\n const retry = response.headers.get('retry-after');\n throw new Error(\n `Web search quota reached.${retry && /^\\d{1,6}$/.test(retry) ? ` Try again in ${retry} seconds.` : ''}`,\n );\n }\n throw new Error(`Web search request failed (HTTP ${response.status}).`);\n }\n let body: unknown;\n try {\n body = await readBoundedJson(response, MAX_RESPONSE_BYTES, signal);\n } catch {\n signal?.throwIfAborted();\n throw new Error(INVALID_RESPONSE);\n }\n if (!record(body) || typeof body.output !== 'string') throw new Error(INVALID_RESPONSE);\n const output = body.output.trim() ? body.output : 'Web search returned no results.';\n // `results` is display-only, so a malformed list is dropped rather than failing the search.\n const results =\n Array.isArray(body.results) && body.results.length <= MAX_RESULTS && body.results.every(record)\n ? body.results\n : undefined;\n return results ? { output, results } : { output };\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -48,7 +48,7 @@ function conversationInput(conversation) {
|
|
|
48
48
|
};
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
|
-
/** Host-only transport: authentication never crosses the
|
|
51
|
+
/** Host-only transport: authentication never crosses the package boundary. */
|
|
52
52
|
function createChatgptWebSearchClient(dependencies) {
|
|
53
53
|
return { async search(request) {
|
|
54
54
|
const { signal } = request;
|