@agimon-ai/po-core 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/agentModel.cjs +4 -0
- package/dist/agentModel.d.mts +2 -0
- package/dist/agentModel.mjs +2 -0
- package/dist/apiContracts.cjs +2094 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +1086 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +2074 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/askUser.cjs +8 -0
- package/dist/askUser.d.mts +2 -0
- package/dist/askUser.mjs +2 -0
- package/dist/authorTools.cjs +5 -0
- package/dist/authorTools.d.mts +2 -0
- package/dist/authorTools.mjs +2 -0
- package/dist/backgroundWork.cjs +9 -0
- package/dist/backgroundWork.d.mts +2 -0
- package/dist/backgroundWork.mjs +2 -0
- package/dist/bundleAssetPolicy.cjs +5 -0
- package/dist/bundleAssetPolicy.d.mts +2 -0
- package/dist/bundleAssetPolicy.mjs +2 -0
- package/dist/childProcess.cjs +15 -0
- package/dist/childProcess.d.mts +2 -0
- package/dist/childProcess.mjs +2 -0
- package/dist/childSession.cjs +9 -0
- package/dist/childSession.d.mts +3 -0
- package/dist/childSession.mjs +3 -0
- package/dist/cockpitContainer.cjs +4 -0
- package/dist/cockpitContainer.d.mts +2 -0
- package/dist/cockpitContainer.mjs +2 -0
- package/dist/config.cjs +13 -0
- package/dist/config.d.mts +3 -0
- package/dist/config.mjs +2 -0
- package/dist/contextApi.cjs +12 -0
- package/dist/contextApi.d.mts +4 -0
- package/dist/contextApi.mjs +3 -0
- package/dist/contextContributions.cjs +7 -0
- package/dist/contextContributions.d.mts +3 -0
- package/dist/contextContributions.mjs +3 -0
- package/dist/contextDetail.cjs +65 -0
- package/dist/contextDetail.cjs.map +1 -0
- package/dist/contextDetail.d.mts +19 -0
- package/dist/contextDetail.d.mts.map +1 -0
- package/dist/contextDetail.mjs +64 -0
- package/dist/contextDetail.mjs.map +1 -0
- package/dist/contextDetailStore.cjs +96 -0
- package/dist/contextDetailStore.cjs.map +1 -0
- package/dist/contextDetailStore.d.mts +21 -0
- package/dist/contextDetailStore.d.mts.map +1 -0
- package/dist/contextDetailStore.mjs +87 -0
- package/dist/contextDetailStore.mjs.map +1 -0
- package/dist/contextProjection.cjs +121 -0
- package/dist/contextProjection.cjs.map +1 -0
- package/dist/contextProjection.d.mts +130 -0
- package/dist/contextProjection.d.mts.map +1 -0
- package/dist/contextProjection.mjs +117 -0
- package/dist/contextProjection.mjs.map +1 -0
- package/dist/cordisHost.cjs +13 -0
- package/dist/cordisHost.d.mts +2 -0
- package/dist/cordisHost.mjs +2 -0
- package/dist/delegation.cjs +18 -0
- package/dist/delegation.d.mts +2 -0
- package/dist/delegation.mjs +2 -0
- package/dist/doomPackage.cjs +61 -0
- package/dist/doomPackage.cjs.map +1 -0
- package/dist/doomPackage.d.mts +17 -0
- package/dist/doomPackage.d.mts.map +1 -0
- package/dist/doomPackage.mjs +54 -0
- package/dist/doomPackage.mjs.map +1 -0
- package/dist/executionBudget.cjs +232 -0
- package/dist/executionBudget.cjs.map +1 -0
- package/dist/executionBudget.d.mts +11 -0
- package/dist/executionBudget.d.mts.map +1 -0
- package/dist/executionBudget.mjs +226 -0
- package/dist/executionBudget.mjs.map +1 -0
- package/dist/extensionFile.cjs +19 -0
- package/dist/extensionFile.d.mts +3 -0
- package/dist/extensionFile.mjs +2 -0
- package/dist/footer.cjs +6 -0
- package/dist/footer.d.mts +2 -0
- package/dist/footer.mjs +2 -0
- package/dist/headless.cjs +16 -0
- package/dist/headless.d.mts +2 -0
- package/dist/headless.mjs +2 -0
- package/dist/headlessHub.cjs +1008 -0
- package/dist/headlessHub.cjs.map +1 -0
- package/dist/headlessHub.d.mts +176 -0
- package/dist/headlessHub.d.mts.map +1 -0
- package/dist/headlessHub.mjs +1005 -0
- package/dist/headlessHub.mjs.map +1 -0
- package/dist/headlessServer.cjs +956 -0
- package/dist/headlessServer.cjs.map +1 -0
- package/dist/headlessServer.d.mts +66 -0
- package/dist/headlessServer.d.mts.map +1 -0
- package/dist/headlessServer.mjs +949 -0
- package/dist/headlessServer.mjs.map +1 -0
- package/dist/headlessSessionHost.cjs +0 -0
- package/dist/headlessSessionHost.d.mts +89 -0
- package/dist/headlessSessionHost.d.mts.map +1 -0
- package/dist/headlessSessionHost.mjs +1 -0
- package/dist/headlessSessionManager.cjs +51 -0
- package/dist/headlessSessionManager.cjs.map +1 -0
- package/dist/headlessSessionManager.d.mts +6 -0
- package/dist/headlessSessionManager.d.mts.map +1 -0
- package/dist/headlessSessionManager.mjs +50 -0
- package/dist/headlessSessionManager.mjs.map +1 -0
- package/dist/help.cjs +24 -0
- package/dist/help.d.mts +3 -0
- package/dist/help.mjs +3 -0
- package/dist/history.cjs +25 -0
- package/dist/history.d.mts +10 -0
- package/dist/history.mjs +10 -0
- package/dist/historyOwnership.cjs +253 -0
- package/dist/historyOwnership.cjs.map +1 -0
- package/dist/historyOwnership.d.mts +23 -0
- package/dist/historyOwnership.d.mts.map +1 -0
- package/dist/historyOwnership.mjs +247 -0
- package/dist/historyOwnership.mjs.map +1 -0
- package/dist/hubChannel.cjs +4 -0
- package/dist/hubChannel.d.mts +2 -0
- package/dist/hubChannel.mjs +2 -0
- package/dist/index.cjs +44 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.mjs +6 -0
- package/dist/json.cjs +6 -0
- package/dist/json.d.mts +2 -0
- package/dist/json.mjs +2 -0
- package/dist/jsonlSessionRepo.cjs +44 -0
- package/dist/jsonlSessionRepo.cjs.map +1 -0
- package/dist/jsonlSessionRepo.d.mts +7 -0
- package/dist/jsonlSessionRepo.d.mts.map +1 -0
- package/dist/jsonlSessionRepo.mjs +42 -0
- package/dist/jsonlSessionRepo.mjs.map +1 -0
- package/dist/kernel.cjs +3 -0
- package/dist/kernel.d.mts +3 -0
- package/dist/kernel.mjs +2 -0
- package/dist/leader.cjs +9 -0
- package/dist/leader.d.mts +2 -0
- package/dist/leader.mjs +2 -0
- package/dist/logSinkTelemetry.cjs +5 -0
- package/dist/logSinkTelemetry.d.mts +2 -0
- package/dist/logSinkTelemetry.mjs +2 -0
- package/dist/machineApi.cjs +92 -0
- package/dist/machineApi.cjs.map +1 -0
- package/dist/machineApi.d.mts +7 -0
- package/dist/machineApi.d.mts.map +1 -0
- package/dist/machineApi.mjs +88 -0
- package/dist/machineApi.mjs.map +1 -0
- package/dist/main.cjs +11 -0
- package/dist/main.d.mts +5 -0
- package/dist/main.mjs +4 -0
- package/dist/mcpFacet.cjs +9 -0
- package/dist/mcpFacet.d.mts +4 -0
- package/dist/mcpFacet.mjs +3 -0
- package/dist/mcpProjection.cjs +16 -0
- package/dist/mcpProjection.d.mts +2 -0
- package/dist/mcpProjection.mjs +2 -0
- package/dist/mcpSchemaCost.cjs +195 -0
- package/dist/mcpSchemaCost.cjs.map +1 -0
- package/dist/mcpSchemaCost.d.mts +35 -0
- package/dist/mcpSchemaCost.d.mts.map +1 -0
- package/dist/mcpSchemaCost.mjs +190 -0
- package/dist/mcpSchemaCost.mjs.map +1 -0
- package/dist/mcpSession.cjs +9 -0
- package/dist/mcpSession.d.mts +2 -0
- package/dist/mcpSession.mjs +2 -0
- package/dist/mcpStatus.cjs +7 -0
- package/dist/mcpStatus.d.mts +2 -0
- package/dist/mcpStatus.mjs +2 -0
- package/dist/mcpToolResolver.cjs +5 -0
- package/dist/mcpToolResolver.d.mts +2 -0
- package/dist/mcpToolResolver.mjs +2 -0
- package/dist/mcpWidget.cjs +0 -0
- package/dist/mcpWidget.d.mts +2 -0
- package/dist/mcpWidget.mjs +1 -0
- package/dist/moduleResolution.cjs +412 -0
- package/dist/moduleResolution.cjs.map +1 -0
- package/dist/moduleResolution.d.mts +72 -0
- package/dist/moduleResolution.d.mts.map +1 -0
- package/dist/moduleResolution.mjs +396 -0
- package/dist/moduleResolution.mjs.map +1 -0
- package/dist/narration.cjs +10 -0
- package/dist/narration.d.mts +2 -0
- package/dist/narration.mjs +2 -0
- package/dist/native.cjs +29 -0
- package/dist/native.d.mts +12 -0
- package/dist/native.mjs +8 -0
- package/dist/notification.cjs +17 -0
- package/dist/notification.d.mts +2 -0
- package/dist/notification.mjs +2 -0
- package/dist/packageApi.cjs +17 -0
- package/dist/packageApi.d.mts +3 -0
- package/dist/packageApi.mjs +3 -0
- package/dist/packageApiServer.cjs +196 -0
- package/dist/packageApiServer.cjs.map +1 -0
- package/dist/packageApiServer.d.mts +62 -0
- package/dist/packageApiServer.d.mts.map +1 -0
- package/dist/packageApiServer.mjs +194 -0
- package/dist/packageApiServer.mjs.map +1 -0
- package/dist/piSettings.cjs +20 -0
- package/dist/piSettings.d.mts +2 -0
- package/dist/piSettings.mjs +2 -0
- package/dist/pluginProtocol.cjs +10 -0
- package/dist/pluginProtocol.d.mts +2 -0
- package/dist/pluginProtocol.mjs +2 -0
- package/dist/profileIdentity.cjs +6 -0
- package/dist/profileIdentity.d.mts +2 -0
- package/dist/profileIdentity.mjs +2 -0
- package/dist/protocol.cjs +10 -0
- package/dist/protocol.d.mts +2 -0
- package/dist/protocol.mjs +2 -0
- package/dist/readiness.cjs +8 -0
- package/dist/readiness.d.mts +2 -0
- package/dist/readiness.mjs +2 -0
- package/dist/remoteApi.cjs +45 -0
- package/dist/remoteApi.cjs.map +1 -0
- package/dist/remoteApi.d.mts +7 -0
- package/dist/remoteApi.d.mts.map +1 -0
- package/dist/remoteApi.mjs +44 -0
- package/dist/remoteApi.mjs.map +1 -0
- package/dist/remoteRuntime.cjs +498 -0
- package/dist/remoteRuntime.cjs.map +1 -0
- package/dist/remoteRuntime.d.mts +36 -0
- package/dist/remoteRuntime.d.mts.map +1 -0
- package/dist/remoteRuntime.mjs +494 -0
- package/dist/remoteRuntime.mjs.map +1 -0
- package/dist/runtimeConfig.cjs +232 -0
- package/dist/runtimeConfig.cjs.map +1 -0
- package/dist/runtimeConfig.d.mts +313 -0
- package/dist/runtimeConfig.d.mts.map +1 -0
- package/dist/runtimeConfig.mjs +221 -0
- package/dist/runtimeConfig.mjs.map +1 -0
- package/dist/runtimeContextApi.cjs +64 -0
- package/dist/runtimeContextApi.cjs.map +1 -0
- package/dist/runtimeContextApi.d.mts +16 -0
- package/dist/runtimeContextApi.d.mts.map +1 -0
- package/dist/runtimeContextApi.mjs +62 -0
- package/dist/runtimeContextApi.mjs.map +1 -0
- package/dist/runtimeCordisHost.cjs +223 -0
- package/dist/runtimeCordisHost.cjs.map +1 -0
- package/dist/runtimeCordisHost.d.mts +78 -0
- package/dist/runtimeCordisHost.d.mts.map +1 -0
- package/dist/runtimeCordisHost.mjs +212 -0
- package/dist/runtimeCordisHost.mjs.map +1 -0
- package/dist/runtimeHeadlessSessionManager.cjs +0 -0
- package/dist/runtimeHeadlessSessionManager.d.mts +18 -0
- package/dist/runtimeHeadlessSessionManager.d.mts.map +1 -0
- package/dist/runtimeHeadlessSessionManager.mjs +1 -0
- package/dist/runtimeIdentity.cjs +26 -0
- package/dist/runtimeIdentity.cjs.map +1 -0
- package/dist/runtimeIdentity.d.mts +7 -0
- package/dist/runtimeIdentity.d.mts.map +1 -0
- package/dist/runtimeIdentity.mjs +21 -0
- package/dist/runtimeIdentity.mjs.map +1 -0
- package/dist/runtimeJson.cjs +46 -0
- package/dist/runtimeJson.cjs.map +1 -0
- package/dist/runtimeJson.d.mts +22 -0
- package/dist/runtimeJson.d.mts.map +1 -0
- package/dist/runtimeJson.mjs +39 -0
- package/dist/runtimeJson.mjs.map +1 -0
- package/dist/runtimeLogSinkTelemetry.cjs +102 -0
- package/dist/runtimeLogSinkTelemetry.cjs.map +1 -0
- package/dist/runtimeLogSinkTelemetry.d.mts +49 -0
- package/dist/runtimeLogSinkTelemetry.d.mts.map +1 -0
- package/dist/runtimeLogSinkTelemetry.mjs +99 -0
- package/dist/runtimeLogSinkTelemetry.mjs.map +1 -0
- package/dist/runtimePackages.cjs +120 -0
- package/dist/runtimePackages.cjs.map +1 -0
- package/dist/runtimePackages.d.mts +57 -0
- package/dist/runtimePackages.d.mts.map +1 -0
- package/dist/runtimePackages.mjs +110 -0
- package/dist/runtimePackages.mjs.map +1 -0
- package/dist/runtimePiSettings.cjs +257 -0
- package/dist/runtimePiSettings.cjs.map +1 -0
- package/dist/runtimePiSettings.d.mts +70 -0
- package/dist/runtimePiSettings.d.mts.map +1 -0
- package/dist/runtimePiSettings.mjs +235 -0
- package/dist/runtimePiSettings.mjs.map +1 -0
- package/dist/runtimeProtocol.cjs +228 -0
- package/dist/runtimeProtocol.cjs.map +1 -0
- package/dist/runtimeProtocol.d.mts +86 -0
- package/dist/runtimeProtocol.d.mts.map +1 -0
- package/dist/runtimeProtocol.mjs +219 -0
- package/dist/runtimeProtocol.mjs.map +1 -0
- package/dist/runtimeToolNames.cjs +51 -0
- package/dist/runtimeToolNames.cjs.map +1 -0
- package/dist/runtimeToolNames.d.mts +24 -0
- package/dist/runtimeToolNames.d.mts.map +1 -0
- package/dist/runtimeToolNames.mjs +49 -0
- package/dist/runtimeToolNames.mjs.map +1 -0
- package/dist/runtimeTransition.cjs +27 -0
- package/dist/runtimeTransition.cjs.map +1 -0
- package/dist/runtimeTransition.d.mts +114 -0
- package/dist/runtimeTransition.d.mts.map +1 -0
- package/dist/runtimeTransition.mjs +24 -0
- package/dist/runtimeTransition.mjs.map +1 -0
- package/dist/sandboxHarness.cjs +6 -0
- package/dist/sandboxHarness.d.mts +2 -0
- package/dist/sandboxHarness.mjs +2 -0
- package/dist/server.cjs +17 -0
- package/dist/server.d.mts +10 -0
- package/dist/server.mjs +7 -0
- package/dist/serverFacet.cjs +34 -0
- package/dist/serverFacet.d.mts +10 -0
- package/dist/serverFacet.mjs +9 -0
- package/dist/serverTelemetry.cjs +25 -0
- package/dist/serverTelemetry.cjs.map +1 -0
- package/dist/serverTelemetry.d.mts +12 -0
- package/dist/serverTelemetry.d.mts.map +1 -0
- package/dist/serverTelemetry.mjs +23 -0
- package/dist/serverTelemetry.mjs.map +1 -0
- package/dist/sessionFilesApi.cjs +96 -0
- package/dist/sessionFilesApi.cjs.map +1 -0
- package/dist/sessionFilesApi.d.mts +7 -0
- package/dist/sessionFilesApi.d.mts.map +1 -0
- package/dist/sessionFilesApi.mjs +91 -0
- package/dist/sessionFilesApi.mjs.map +1 -0
- package/dist/sessionMcp.cjs +6 -0
- package/dist/sessionMcp.d.mts +5 -0
- package/dist/sessionMcp.mjs +3 -0
- package/dist/sessionProtocol.cjs +8 -0
- package/dist/sessionProtocol.d.mts +3 -0
- package/dist/sessionProtocol.mjs +2 -0
- package/dist/skills.cjs +9 -0
- package/dist/skills.d.mts +2 -0
- package/dist/skills.mjs +2 -0
- package/dist/sqliteSessionStorage.cjs +168 -0
- package/dist/sqliteSessionStorage.cjs.map +1 -0
- package/dist/sqliteSessionStorage.d.mts +35 -0
- package/dist/sqliteSessionStorage.d.mts.map +1 -0
- package/dist/sqliteSessionStorage.mjs +158 -0
- package/dist/sqliteSessionStorage.mjs.map +1 -0
- package/dist/src/constants/authorTools.cjs +10 -0
- package/dist/src/constants/authorTools.cjs.map +1 -0
- package/dist/src/constants/authorTools.d.mts +6 -0
- package/dist/src/constants/authorTools.d.mts.map +1 -0
- package/dist/src/constants/authorTools.mjs +8 -0
- package/dist/src/constants/authorTools.mjs.map +1 -0
- package/dist/src/constants/contextApi.cjs +31 -0
- package/dist/src/constants/contextApi.cjs.map +1 -0
- package/dist/src/constants/contextApi.d.mts +23 -0
- package/dist/src/constants/contextApi.d.mts.map +1 -0
- package/dist/src/constants/contextApi.mjs +25 -0
- package/dist/src/constants/contextApi.mjs.map +1 -0
- package/dist/src/constants/nativeHost.cjs +56 -0
- package/dist/src/constants/nativeHost.cjs.map +1 -0
- package/dist/src/constants/nativeHost.d.mts +21 -0
- package/dist/src/constants/nativeHost.d.mts.map +1 -0
- package/dist/src/constants/nativeHost.mjs +53 -0
- package/dist/src/constants/nativeHost.mjs.map +1 -0
- package/dist/src/constants/remote.cjs +132 -0
- package/dist/src/constants/remote.cjs.map +1 -0
- package/dist/src/constants/remote.mjs +99 -0
- package/dist/src/constants/remote.mjs.map +1 -0
- package/dist/src/constants/sessionFiles.cjs +27 -0
- package/dist/src/constants/sessionFiles.cjs.map +1 -0
- package/dist/src/constants/sessionFiles.mjs +25 -0
- package/dist/src/constants/sessionFiles.mjs.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.cjs +12 -0
- package/dist/src/constants/voiceReloadHandoff.cjs.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.d.mts +7 -0
- package/dist/src/constants/voiceReloadHandoff.d.mts.map +1 -0
- package/dist/src/constants/voiceReloadHandoff.mjs +9 -0
- package/dist/src/constants/voiceReloadHandoff.mjs.map +1 -0
- package/dist/src/constants/voiceTools.cjs +96 -0
- package/dist/src/constants/voiceTools.cjs.map +1 -0
- package/dist/src/constants/voiceTools.d.mts +58 -0
- package/dist/src/constants/voiceTools.d.mts.map +1 -0
- package/dist/src/constants/voiceTools.mjs +60 -0
- package/dist/src/constants/voiceTools.mjs.map +1 -0
- package/dist/src/extensions/extensionFile.cjs +140 -0
- package/dist/src/extensions/extensionFile.cjs.map +1 -0
- package/dist/src/extensions/extensionFile.d.mts +69 -0
- package/dist/src/extensions/extensionFile.d.mts.map +1 -0
- package/dist/src/extensions/extensionFile.mjs +124 -0
- package/dist/src/extensions/extensionFile.mjs.map +1 -0
- package/dist/src/extensions/serverPlugin.cjs +107 -0
- package/dist/src/extensions/serverPlugin.cjs.map +1 -0
- package/dist/src/extensions/serverPlugin.d.mts +5 -0
- package/dist/src/extensions/serverPlugin.d.mts.map +1 -0
- package/dist/src/extensions/serverPlugin.mjs +107 -0
- package/dist/src/extensions/serverPlugin.mjs.map +1 -0
- package/dist/src/extensions/webPlugin.cjs +136 -0
- package/dist/src/extensions/webPlugin.cjs.map +1 -0
- package/dist/src/extensions/webPlugin.d.mts +68 -0
- package/dist/src/extensions/webPlugin.d.mts.map +1 -0
- package/dist/src/extensions/webPlugin.mjs +114 -0
- package/dist/src/extensions/webPlugin.mjs.map +1 -0
- package/dist/src/pi/piSessionRuntime.cjs +625 -0
- package/dist/src/pi/piSessionRuntime.cjs.map +1 -0
- package/dist/src/pi/piSessionRuntime.d.mts +43 -0
- package/dist/src/pi/piSessionRuntime.d.mts.map +1 -0
- package/dist/src/pi/piSessionRuntime.mjs +624 -0
- package/dist/src/pi/piSessionRuntime.mjs.map +1 -0
- package/dist/src/pi/piWebSocketListener.cjs +115 -0
- package/dist/src/pi/piWebSocketListener.cjs.map +1 -0
- package/dist/src/pi/piWebSocketListener.mjs +115 -0
- package/dist/src/pi/piWebSocketListener.mjs.map +1 -0
- package/dist/src/schemas/agentModel.cjs +33 -0
- package/dist/src/schemas/agentModel.cjs.map +1 -0
- package/dist/src/schemas/agentModel.d.mts +26 -0
- package/dist/src/schemas/agentModel.d.mts.map +1 -0
- package/dist/src/schemas/agentModel.mjs +32 -0
- package/dist/src/schemas/agentModel.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.d.mts +58 -0
- package/dist/src/schemas/apiContracts.d.mts.map +1 -0
- package/dist/src/schemas/askUser.cjs +42 -0
- package/dist/src/schemas/askUser.cjs.map +1 -0
- package/dist/src/schemas/askUser.d.mts +47 -0
- package/dist/src/schemas/askUser.d.mts.map +1 -0
- package/dist/src/schemas/askUser.mjs +37 -0
- package/dist/src/schemas/askUser.mjs.map +1 -0
- package/dist/src/schemas/backgroundWork.cjs +44 -0
- package/dist/src/schemas/backgroundWork.cjs.map +1 -0
- package/dist/src/schemas/backgroundWork.d.mts +76 -0
- package/dist/src/schemas/backgroundWork.d.mts.map +1 -0
- package/dist/src/schemas/backgroundWork.mjs +38 -0
- package/dist/src/schemas/backgroundWork.mjs.map +1 -0
- package/dist/src/schemas/childProcess.cjs +67 -0
- package/dist/src/schemas/childProcess.cjs.map +1 -0
- package/dist/src/schemas/childProcess.d.mts +30 -0
- package/dist/src/schemas/childProcess.d.mts.map +1 -0
- package/dist/src/schemas/childProcess.mjs +55 -0
- package/dist/src/schemas/childProcess.mjs.map +1 -0
- package/dist/src/schemas/cockpitContainer.cjs +31 -0
- package/dist/src/schemas/cockpitContainer.cjs.map +1 -0
- package/dist/src/schemas/cockpitContainer.d.mts +80 -0
- package/dist/src/schemas/cockpitContainer.d.mts.map +1 -0
- package/dist/src/schemas/cockpitContainer.mjs +30 -0
- package/dist/src/schemas/cockpitContainer.mjs.map +1 -0
- package/dist/src/schemas/contextContributions.cjs +17 -0
- package/dist/src/schemas/contextContributions.cjs.map +1 -0
- package/dist/src/schemas/contextContributions.d.mts +49 -0
- package/dist/src/schemas/contextContributions.d.mts.map +1 -0
- package/dist/src/schemas/contextContributions.mjs +15 -0
- package/dist/src/schemas/contextContributions.mjs.map +1 -0
- package/dist/src/schemas/delegation.cjs +91 -0
- package/dist/src/schemas/delegation.cjs.map +1 -0
- package/dist/src/schemas/delegation.d.mts +95 -0
- package/dist/src/schemas/delegation.d.mts.map +1 -0
- package/dist/src/schemas/delegation.mjs +76 -0
- package/dist/src/schemas/delegation.mjs.map +1 -0
- package/dist/src/schemas/extensionFile.d.mts +116 -0
- package/dist/src/schemas/extensionFile.d.mts.map +1 -0
- package/dist/src/schemas/footer.cjs +48 -0
- package/dist/src/schemas/footer.cjs.map +1 -0
- package/dist/src/schemas/footer.d.mts +48 -0
- package/dist/src/schemas/footer.d.mts.map +1 -0
- package/dist/src/schemas/footer.mjs +45 -0
- package/dist/src/schemas/footer.mjs.map +1 -0
- package/dist/src/schemas/headless.cjs +97 -0
- package/dist/src/schemas/headless.cjs.map +1 -0
- package/dist/src/schemas/headless.d.mts +472 -0
- package/dist/src/schemas/headless.d.mts.map +1 -0
- package/dist/src/schemas/headless.mjs +84 -0
- package/dist/src/schemas/headless.mjs.map +1 -0
- package/dist/src/schemas/help.cjs +281 -0
- package/dist/src/schemas/help.cjs.map +1 -0
- package/dist/src/schemas/help.d.mts +119 -0
- package/dist/src/schemas/help.d.mts.map +1 -0
- package/dist/src/schemas/help.mjs +262 -0
- package/dist/src/schemas/help.mjs.map +1 -0
- package/dist/src/schemas/hubChannel.cjs +20 -0
- package/dist/src/schemas/hubChannel.cjs.map +1 -0
- package/dist/src/schemas/hubChannel.d.mts +271 -0
- package/dist/src/schemas/hubChannel.d.mts.map +1 -0
- package/dist/src/schemas/hubChannel.mjs +19 -0
- package/dist/src/schemas/hubChannel.mjs.map +1 -0
- package/dist/src/schemas/leader.cjs +57 -0
- package/dist/src/schemas/leader.cjs.map +1 -0
- package/dist/src/schemas/leader.d.mts +107 -0
- package/dist/src/schemas/leader.d.mts.map +1 -0
- package/dist/src/schemas/leader.mjs +51 -0
- package/dist/src/schemas/leader.mjs.map +1 -0
- package/dist/src/schemas/mcpBundle.d.mts +13 -0
- package/dist/src/schemas/mcpBundle.d.mts.map +1 -0
- package/dist/src/schemas/mcpFacet.cjs +24 -0
- package/dist/src/schemas/mcpFacet.cjs.map +1 -0
- package/dist/src/schemas/mcpFacet.d.mts +91 -0
- package/dist/src/schemas/mcpFacet.d.mts.map +1 -0
- package/dist/src/schemas/mcpFacet.mjs +21 -0
- package/dist/src/schemas/mcpFacet.mjs.map +1 -0
- package/dist/src/schemas/mcpProjection.cjs +117 -0
- package/dist/src/schemas/mcpProjection.cjs.map +1 -0
- package/dist/src/schemas/mcpProjection.d.mts +124 -0
- package/dist/src/schemas/mcpProjection.d.mts.map +1 -0
- package/dist/src/schemas/mcpProjection.mjs +104 -0
- package/dist/src/schemas/mcpProjection.mjs.map +1 -0
- package/dist/src/schemas/mcpSession.cjs +57 -0
- package/dist/src/schemas/mcpSession.cjs.map +1 -0
- package/dist/src/schemas/mcpSession.d.mts +57 -0
- package/dist/src/schemas/mcpSession.d.mts.map +1 -0
- package/dist/src/schemas/mcpSession.mjs +51 -0
- package/dist/src/schemas/mcpSession.mjs.map +1 -0
- package/dist/src/schemas/mcpStatus.cjs +52 -0
- package/dist/src/schemas/mcpStatus.cjs.map +1 -0
- package/dist/src/schemas/mcpStatus.d.mts +73 -0
- package/dist/src/schemas/mcpStatus.d.mts.map +1 -0
- package/dist/src/schemas/mcpStatus.mjs +48 -0
- package/dist/src/schemas/mcpStatus.mjs.map +1 -0
- package/dist/src/schemas/mcpToolResolver.cjs +17 -0
- package/dist/src/schemas/mcpToolResolver.cjs.map +1 -0
- package/dist/src/schemas/mcpToolResolver.d.mts +24 -0
- package/dist/src/schemas/mcpToolResolver.d.mts.map +1 -0
- package/dist/src/schemas/mcpToolResolver.mjs +15 -0
- package/dist/src/schemas/mcpToolResolver.mjs.map +1 -0
- package/dist/src/schemas/narration.cjs +54 -0
- package/dist/src/schemas/narration.cjs.map +1 -0
- package/dist/src/schemas/narration.d.mts +29 -0
- package/dist/src/schemas/narration.d.mts.map +1 -0
- package/dist/src/schemas/narration.mjs +47 -0
- package/dist/src/schemas/narration.mjs.map +1 -0
- package/dist/src/schemas/notification.cjs +122 -0
- package/dist/src/schemas/notification.cjs.map +1 -0
- package/dist/src/schemas/notification.d.mts +48 -0
- package/dist/src/schemas/notification.d.mts.map +1 -0
- package/dist/src/schemas/notification.mjs +108 -0
- package/dist/src/schemas/notification.mjs.map +1 -0
- package/dist/src/schemas/packageApi.cjs +76 -0
- package/dist/src/schemas/packageApi.cjs.map +1 -0
- package/dist/src/schemas/packageApi.d.mts +302 -0
- package/dist/src/schemas/packageApi.d.mts.map +1 -0
- package/dist/src/schemas/packageApi.mjs +66 -0
- package/dist/src/schemas/packageApi.mjs.map +1 -0
- package/dist/src/schemas/pluginContributions.cjs +19 -0
- package/dist/src/schemas/pluginContributions.cjs.map +1 -0
- package/dist/src/schemas/pluginContributions.d.mts +56 -0
- package/dist/src/schemas/pluginContributions.d.mts.map +1 -0
- package/dist/src/schemas/pluginContributions.mjs +18 -0
- package/dist/src/schemas/pluginContributions.mjs.map +1 -0
- package/dist/src/schemas/pluginProtocol.cjs +103 -0
- package/dist/src/schemas/pluginProtocol.cjs.map +1 -0
- package/dist/src/schemas/pluginProtocol.d.mts +70 -0
- package/dist/src/schemas/pluginProtocol.d.mts.map +1 -0
- package/dist/src/schemas/pluginProtocol.mjs +96 -0
- package/dist/src/schemas/pluginProtocol.mjs.map +1 -0
- package/dist/src/schemas/profileIdentity.cjs +67 -0
- package/dist/src/schemas/profileIdentity.cjs.map +1 -0
- package/dist/src/schemas/profileIdentity.d.mts +50 -0
- package/dist/src/schemas/profileIdentity.d.mts.map +1 -0
- package/dist/src/schemas/profileIdentity.mjs +64 -0
- package/dist/src/schemas/profileIdentity.mjs.map +1 -0
- package/dist/src/schemas/readiness.cjs +251 -0
- package/dist/src/schemas/readiness.cjs.map +1 -0
- package/dist/src/schemas/readiness.d.mts +84 -0
- package/dist/src/schemas/readiness.d.mts.map +1 -0
- package/dist/src/schemas/readiness.mjs +246 -0
- package/dist/src/schemas/readiness.mjs.map +1 -0
- package/dist/src/schemas/sandboxHarness.cjs +29 -0
- package/dist/src/schemas/sandboxHarness.cjs.map +1 -0
- package/dist/src/schemas/sandboxHarness.d.mts +39 -0
- package/dist/src/schemas/sandboxHarness.d.mts.map +1 -0
- package/dist/src/schemas/sandboxHarness.mjs +26 -0
- package/dist/src/schemas/sandboxHarness.mjs.map +1 -0
- package/dist/src/schemas/serverBundle.d.mts +19 -0
- package/dist/src/schemas/serverBundle.d.mts.map +1 -0
- package/dist/src/schemas/serverFacet.cjs +111 -0
- package/dist/src/schemas/serverFacet.cjs.map +1 -0
- package/dist/src/schemas/serverFacet.d.mts +152 -0
- package/dist/src/schemas/serverFacet.d.mts.map +1 -0
- package/dist/src/schemas/serverFacet.mjs +101 -0
- package/dist/src/schemas/serverFacet.mjs.map +1 -0
- package/dist/src/schemas/sessionMcpActivity.d.mts +47 -0
- package/dist/src/schemas/sessionMcpActivity.d.mts.map +1 -0
- package/dist/src/schemas/sessionProtocol.cjs +17 -0
- package/dist/src/schemas/sessionProtocol.cjs.map +1 -0
- package/dist/src/schemas/sessionProtocol.d.mts +313 -0
- package/dist/src/schemas/sessionProtocol.d.mts.map +1 -0
- package/dist/src/schemas/sessionProtocol.mjs +12 -0
- package/dist/src/schemas/sessionProtocol.mjs.map +1 -0
- package/dist/src/schemas/sessionUpdates.d.mts +34 -0
- package/dist/src/schemas/sessionUpdates.d.mts.map +1 -0
- package/dist/src/schemas/skills.cjs +115 -0
- package/dist/src/schemas/skills.cjs.map +1 -0
- package/dist/src/schemas/skills.d.mts +65 -0
- package/dist/src/schemas/skills.d.mts.map +1 -0
- package/dist/src/schemas/skills.mjs +109 -0
- package/dist/src/schemas/skills.mjs.map +1 -0
- package/dist/src/schemas/toolOverrides.cjs +17 -0
- package/dist/src/schemas/toolOverrides.cjs.map +1 -0
- package/dist/src/schemas/toolOverrides.d.mts +29 -0
- package/dist/src/schemas/toolOverrides.d.mts.map +1 -0
- package/dist/src/schemas/toolOverrides.mjs +15 -0
- package/dist/src/schemas/toolOverrides.mjs.map +1 -0
- package/dist/src/schemas/toolSurface.cjs +17 -0
- package/dist/src/schemas/toolSurface.cjs.map +1 -0
- package/dist/src/schemas/toolSurface.d.mts +70 -0
- package/dist/src/schemas/toolSurface.d.mts.map +1 -0
- package/dist/src/schemas/toolSurface.mjs +15 -0
- package/dist/src/schemas/toolSurface.mjs.map +1 -0
- package/dist/src/schemas/uiHub.cjs +17 -0
- package/dist/src/schemas/uiHub.cjs.map +1 -0
- package/dist/src/schemas/uiHub.d.mts +23 -0
- package/dist/src/schemas/uiHub.d.mts.map +1 -0
- package/dist/src/schemas/uiHub.mjs +15 -0
- package/dist/src/schemas/uiHub.mjs.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.cjs +78 -0
- package/dist/src/schemas/voiceReloadHandoff.cjs.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.d.mts +31 -0
- package/dist/src/schemas/voiceReloadHandoff.d.mts.map +1 -0
- package/dist/src/schemas/voiceReloadHandoff.mjs +75 -0
- package/dist/src/schemas/voiceReloadHandoff.mjs.map +1 -0
- package/dist/src/schemas/voiceTools.cjs +205 -0
- package/dist/src/schemas/voiceTools.cjs.map +1 -0
- package/dist/src/schemas/voiceTools.d.mts +120 -0
- package/dist/src/schemas/voiceTools.d.mts.map +1 -0
- package/dist/src/schemas/voiceTools.mjs +194 -0
- package/dist/src/schemas/voiceTools.mjs.map +1 -0
- package/dist/src/server/devProxyForward.cjs +141 -0
- package/dist/src/server/devProxyForward.cjs.map +1 -0
- package/dist/src/server/devProxyForward.mjs +139 -0
- package/dist/src/server/devProxyForward.mjs.map +1 -0
- package/dist/src/server/devProxyRoutes.cjs +97 -0
- package/dist/src/server/devProxyRoutes.cjs.map +1 -0
- package/dist/src/server/devProxyRoutes.mjs +97 -0
- package/dist/src/server/devProxyRoutes.mjs.map +1 -0
- package/dist/src/server/devProxySocket.cjs +93 -0
- package/dist/src/server/devProxySocket.cjs.map +1 -0
- package/dist/src/server/devProxySocket.d.mts +25 -0
- package/dist/src/server/devProxySocket.d.mts.map +1 -0
- package/dist/src/server/devProxySocket.mjs +93 -0
- package/dist/src/server/devProxySocket.mjs.map +1 -0
- package/dist/src/server/directHarnessRuntime.cjs +2387 -0
- package/dist/src/server/directHarnessRuntime.cjs.map +1 -0
- package/dist/src/server/directHarnessRuntime.d.mts +4 -0
- package/dist/src/server/directHarnessRuntime.mjs +2384 -0
- package/dist/src/server/directHarnessRuntime.mjs.map +1 -0
- package/dist/src/server/harnessErrorMessage.cjs +13 -0
- package/dist/src/server/harnessErrorMessage.cjs.map +1 -0
- package/dist/src/server/harnessErrorMessage.mjs +13 -0
- package/dist/src/server/harnessErrorMessage.mjs.map +1 -0
- package/dist/src/server/headlessProtocol.cjs +382 -0
- package/dist/src/server/headlessProtocol.cjs.map +1 -0
- package/dist/src/server/headlessProtocol.mjs +382 -0
- package/dist/src/server/headlessProtocol.mjs.map +1 -0
- package/dist/src/server/liveImport.cjs +37 -0
- package/dist/src/server/liveImport.cjs.map +1 -0
- package/dist/src/server/liveImport.d.mts +27 -0
- package/dist/src/server/liveImport.d.mts.map +1 -0
- package/dist/src/server/liveImport.mjs +34 -0
- package/dist/src/server/liveImport.mjs.map +1 -0
- package/dist/src/server/mcpBundleLoader.cjs +108 -0
- package/dist/src/server/mcpBundleLoader.cjs.map +1 -0
- package/dist/src/server/mcpBundleLoader.d.mts +46 -0
- package/dist/src/server/mcpBundleLoader.d.mts.map +1 -0
- package/dist/src/server/mcpBundleLoader.mjs +107 -0
- package/dist/src/server/mcpBundleLoader.mjs.map +1 -0
- package/dist/src/server/nativeChildTranscriptReader.cjs +20 -0
- package/dist/src/server/nativeChildTranscriptReader.cjs.map +1 -0
- package/dist/src/server/nativeChildTranscriptReader.mjs +18 -0
- package/dist/src/server/nativeChildTranscriptReader.mjs.map +1 -0
- package/dist/src/server/remoteRoutes.cjs +463 -0
- package/dist/src/server/remoteRoutes.cjs.map +1 -0
- package/dist/src/server/remoteRoutes.mjs +463 -0
- package/dist/src/server/remoteRoutes.mjs.map +1 -0
- package/dist/src/server/serverFacetLoader.cjs +214 -0
- package/dist/src/server/serverFacetLoader.cjs.map +1 -0
- package/dist/src/server/serverFacetLoader.d.mts +72 -0
- package/dist/src/server/serverFacetLoader.d.mts.map +1 -0
- package/dist/src/server/serverFacetLoader.mjs +212 -0
- package/dist/src/server/serverFacetLoader.mjs.map +1 -0
- package/dist/src/server/sessionMcpHandler.cjs +585 -0
- package/dist/src/server/sessionMcpHandler.cjs.map +1 -0
- package/dist/src/server/sessionMcpHandler.d.mts +50 -0
- package/dist/src/server/sessionMcpHandler.d.mts.map +1 -0
- package/dist/src/server/sessionMcpHandler.mjs +582 -0
- package/dist/src/server/sessionMcpHandler.mjs.map +1 -0
- package/dist/src/server/sessionMcpRoutes.cjs +809 -0
- package/dist/src/server/sessionMcpRoutes.cjs.map +1 -0
- package/dist/src/server/sessionMcpRoutes.mjs +804 -0
- package/dist/src/server/sessionMcpRoutes.mjs.map +1 -0
- package/dist/src/server/threadJournals.cjs +172 -0
- package/dist/src/server/threadJournals.cjs.map +1 -0
- package/dist/src/server/threadJournals.mjs +169 -0
- package/dist/src/server/threadJournals.mjs.map +1 -0
- package/dist/src/services/acpSessionUpdates/index.cjs +129 -0
- package/dist/src/services/acpSessionUpdates/index.cjs.map +1 -0
- package/dist/src/services/acpSessionUpdates/index.mjs +129 -0
- package/dist/src/services/acpSessionUpdates/index.mjs.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.cjs +60 -0
- package/dist/src/services/apiSurfaceAssert/index.cjs.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.d.mts +24 -0
- package/dist/src/services/apiSurfaceAssert/index.d.mts.map +1 -0
- package/dist/src/services/apiSurfaceAssert/index.mjs +60 -0
- package/dist/src/services/apiSurfaceAssert/index.mjs.map +1 -0
- package/dist/src/services/bundlePublication/index.cjs +89 -0
- package/dist/src/services/bundlePublication/index.cjs.map +1 -0
- package/dist/src/services/bundlePublication/index.mjs +86 -0
- package/dist/src/services/bundlePublication/index.mjs.map +1 -0
- package/dist/src/services/contextApiUrls/index.cjs +53 -0
- package/dist/src/services/contextApiUrls/index.cjs.map +1 -0
- package/dist/src/services/contextApiUrls/index.d.mts +8 -0
- package/dist/src/services/contextApiUrls/index.d.mts.map +1 -0
- package/dist/src/services/contextApiUrls/index.mjs +52 -0
- package/dist/src/services/contextApiUrls/index.mjs.map +1 -0
- package/dist/src/services/contextContributions/index.cjs +79 -0
- package/dist/src/services/contextContributions/index.cjs.map +1 -0
- package/dist/src/services/contextContributions/index.d.mts +6 -0
- package/dist/src/services/contextContributions/index.d.mts.map +1 -0
- package/dist/src/services/contextContributions/index.mjs +79 -0
- package/dist/src/services/contextContributions/index.mjs.map +1 -0
- package/dist/src/services/contextUsage/index.cjs +27 -0
- package/dist/src/services/contextUsage/index.cjs.map +1 -0
- package/dist/src/services/contextUsage/index.mjs +25 -0
- package/dist/src/services/contextUsage/index.mjs.map +1 -0
- package/dist/src/services/devProxyPolicy/index.cjs +168 -0
- package/dist/src/services/devProxyPolicy/index.cjs.map +1 -0
- package/dist/src/services/devProxyPolicy/index.mjs +165 -0
- package/dist/src/services/devProxyPolicy/index.mjs.map +1 -0
- package/dist/src/services/devProxyStore/index.cjs +107 -0
- package/dist/src/services/devProxyStore/index.cjs.map +1 -0
- package/dist/src/services/devProxyStore/index.mjs +104 -0
- package/dist/src/services/devProxyStore/index.mjs.map +1 -0
- package/dist/src/services/deviceAuth/index.cjs +146 -0
- package/dist/src/services/deviceAuth/index.cjs.map +1 -0
- package/dist/src/services/deviceAuth/index.d.mts +9 -0
- package/dist/src/services/deviceAuth/index.d.mts.map +1 -0
- package/dist/src/services/deviceAuth/index.mjs +146 -0
- package/dist/src/services/deviceAuth/index.mjs.map +1 -0
- package/dist/src/services/deviceSessions/index.cjs +147 -0
- package/dist/src/services/deviceSessions/index.cjs.map +1 -0
- package/dist/src/services/deviceSessions/index.d.mts +18 -0
- package/dist/src/services/deviceSessions/index.d.mts.map +1 -0
- package/dist/src/services/deviceSessions/index.mjs +141 -0
- package/dist/src/services/deviceSessions/index.mjs.map +1 -0
- package/dist/src/services/deviceTrust/index.cjs +294 -0
- package/dist/src/services/deviceTrust/index.cjs.map +1 -0
- package/dist/src/services/deviceTrust/index.mjs +282 -0
- package/dist/src/services/deviceTrust/index.mjs.map +1 -0
- package/dist/src/services/durableNavigation/index.cjs +46 -0
- package/dist/src/services/durableNavigation/index.cjs.map +1 -0
- package/dist/src/services/durableNavigation/index.mjs +45 -0
- package/dist/src/services/durableNavigation/index.mjs.map +1 -0
- package/dist/src/services/headlessClient/index.cjs +126 -0
- package/dist/src/services/headlessClient/index.cjs.map +1 -0
- package/dist/src/services/headlessClient/index.mjs +126 -0
- package/dist/src/services/headlessClient/index.mjs.map +1 -0
- package/dist/src/services/historyImport/index.cjs +8 -0
- package/dist/src/services/historyImport/index.cjs.map +1 -0
- package/dist/src/services/historyImport/index.d.mts +68 -0
- package/dist/src/services/historyImport/index.d.mts.map +1 -0
- package/dist/src/services/historyImport/index.mjs +8 -0
- package/dist/src/services/historyImport/index.mjs.map +1 -0
- package/dist/src/services/hubChannelHarness/index.cjs +50 -0
- package/dist/src/services/hubChannelHarness/index.cjs.map +1 -0
- package/dist/src/services/hubChannelHarness/index.d.mts +17 -0
- package/dist/src/services/hubChannelHarness/index.d.mts.map +1 -0
- package/dist/src/services/hubChannelHarness/index.mjs +50 -0
- package/dist/src/services/hubChannelHarness/index.mjs.map +1 -0
- package/dist/src/services/kernel/index.cjs +147 -0
- package/dist/src/services/kernel/index.cjs.map +1 -0
- package/dist/src/services/kernel/index.d.mts +9 -0
- package/dist/src/services/kernel/index.d.mts.map +1 -0
- package/dist/src/services/kernel/index.mjs +147 -0
- package/dist/src/services/kernel/index.mjs.map +1 -0
- package/dist/src/services/loginFlow/index.cjs +131 -0
- package/dist/src/services/loginFlow/index.cjs.map +1 -0
- package/dist/src/services/loginFlow/index.mjs +131 -0
- package/dist/src/services/loginFlow/index.mjs.map +1 -0
- package/dist/src/services/loopbackAddress/index.cjs +58 -0
- package/dist/src/services/loopbackAddress/index.cjs.map +1 -0
- package/dist/src/services/loopbackAddress/index.mjs +56 -0
- package/dist/src/services/loopbackAddress/index.mjs.map +1 -0
- package/dist/src/services/openSessionRegistry/index.cjs +134 -0
- package/dist/src/services/openSessionRegistry/index.cjs.map +1 -0
- package/dist/src/services/openSessionRegistry/index.d.mts +36 -0
- package/dist/src/services/openSessionRegistry/index.d.mts.map +1 -0
- package/dist/src/services/openSessionRegistry/index.mjs +131 -0
- package/dist/src/services/openSessionRegistry/index.mjs.map +1 -0
- package/dist/src/services/packageApiHarness/index.cjs +36 -0
- package/dist/src/services/packageApiHarness/index.cjs.map +1 -0
- package/dist/src/services/packageApiHarness/index.d.mts +40 -0
- package/dist/src/services/packageApiHarness/index.d.mts.map +1 -0
- package/dist/src/services/packageApiHarness/index.mjs +36 -0
- package/dist/src/services/packageApiHarness/index.mjs.map +1 -0
- package/dist/src/services/packageResource/index.cjs +54 -0
- package/dist/src/services/packageResource/index.cjs.map +1 -0
- package/dist/src/services/packageResource/index.d.mts +26 -0
- package/dist/src/services/packageResource/index.d.mts.map +1 -0
- package/dist/src/services/packageResource/index.mjs +51 -0
- package/dist/src/services/packageResource/index.mjs.map +1 -0
- package/dist/src/services/pairingFlow/index.cjs +145 -0
- package/dist/src/services/pairingFlow/index.cjs.map +1 -0
- package/dist/src/services/pairingFlow/index.d.mts +44 -0
- package/dist/src/services/pairingFlow/index.d.mts.map +1 -0
- package/dist/src/services/pairingFlow/index.mjs +145 -0
- package/dist/src/services/pairingFlow/index.mjs.map +1 -0
- package/dist/src/services/pairingPage/index.cjs +450 -0
- package/dist/src/services/pairingPage/index.cjs.map +1 -0
- package/dist/src/services/pairingPage/index.mjs +447 -0
- package/dist/src/services/pairingPage/index.mjs.map +1 -0
- package/dist/src/services/piExtensionHost/index.cjs +889 -0
- package/dist/src/services/piExtensionHost/index.cjs.map +1 -0
- package/dist/src/services/piExtensionHost/index.mjs +885 -0
- package/dist/src/services/piExtensionHost/index.mjs.map +1 -0
- package/dist/src/services/piHelpTools/index.cjs +68 -0
- package/dist/src/services/piHelpTools/index.cjs.map +1 -0
- package/dist/src/services/piHelpTools/index.d.mts +10 -0
- package/dist/src/services/piHelpTools/index.d.mts.map +1 -0
- package/dist/src/services/piHelpTools/index.mjs +68 -0
- package/dist/src/services/piHelpTools/index.mjs.map +1 -0
- package/dist/src/services/piSessionEntries/index.cjs +121 -0
- package/dist/src/services/piSessionEntries/index.cjs.map +1 -0
- package/dist/src/services/piSessionEntries/index.mjs +117 -0
- package/dist/src/services/piSessionEntries/index.mjs.map +1 -0
- package/dist/src/services/pluginLifecycle/index.cjs +71 -0
- package/dist/src/services/pluginLifecycle/index.cjs.map +1 -0
- package/dist/src/services/pluginLifecycle/index.d.mts +8 -0
- package/dist/src/services/pluginLifecycle/index.d.mts.map +1 -0
- package/dist/src/services/pluginLifecycle/index.mjs +71 -0
- package/dist/src/services/pluginLifecycle/index.mjs.map +1 -0
- package/dist/src/services/providerAuth/index.cjs +156 -0
- package/dist/src/services/providerAuth/index.cjs.map +1 -0
- package/dist/src/services/providerAuth/index.mjs +154 -0
- package/dist/src/services/providerAuth/index.mjs.map +1 -0
- package/dist/src/services/publicFileShares/index.cjs +192 -0
- package/dist/src/services/publicFileShares/index.cjs.map +1 -0
- package/dist/src/services/publicFileShares/index.d.mts +16 -0
- package/dist/src/services/publicFileShares/index.d.mts.map +1 -0
- package/dist/src/services/publicFileShares/index.mjs +188 -0
- package/dist/src/services/publicFileShares/index.mjs.map +1 -0
- package/dist/src/services/remoteAccess/index.cjs +567 -0
- package/dist/src/services/remoteAccess/index.cjs.map +1 -0
- package/dist/src/services/remoteAccess/index.d.mts +121 -0
- package/dist/src/services/remoteAccess/index.d.mts.map +1 -0
- package/dist/src/services/remoteAccess/index.mjs +567 -0
- package/dist/src/services/remoteAccess/index.mjs.map +1 -0
- package/dist/src/services/remoteAccessSettings/index.cjs +151 -0
- package/dist/src/services/remoteAccessSettings/index.cjs.map +1 -0
- package/dist/src/services/remoteAccessSettings/index.mjs +149 -0
- package/dist/src/services/remoteAccessSettings/index.mjs.map +1 -0
- package/dist/src/services/remoteAccessStore/index.cjs +197 -0
- package/dist/src/services/remoteAccessStore/index.cjs.map +1 -0
- package/dist/src/services/remoteAccessStore/index.mjs +192 -0
- package/dist/src/services/remoteAccessStore/index.mjs.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.cjs +200 -0
- package/dist/src/services/remoteGuardPolicy/index.cjs.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.d.mts +7 -0
- package/dist/src/services/remoteGuardPolicy/index.d.mts.map +1 -0
- package/dist/src/services/remoteGuardPolicy/index.mjs +196 -0
- package/dist/src/services/remoteGuardPolicy/index.mjs.map +1 -0
- package/dist/src/services/requestReceipts/index.cjs +167 -0
- package/dist/src/services/requestReceipts/index.cjs.map +1 -0
- package/dist/src/services/requestReceipts/index.d.mts +11 -0
- package/dist/src/services/requestReceipts/index.d.mts.map +1 -0
- package/dist/src/services/requestReceipts/index.mjs +167 -0
- package/dist/src/services/requestReceipts/index.mjs.map +1 -0
- package/dist/src/services/rpcTranscript/index.cjs +633 -0
- package/dist/src/services/rpcTranscript/index.cjs.map +1 -0
- package/dist/src/services/rpcTranscript/index.d.mts +50 -0
- package/dist/src/services/rpcTranscript/index.d.mts.map +1 -0
- package/dist/src/services/rpcTranscript/index.mjs +632 -0
- package/dist/src/services/rpcTranscript/index.mjs.map +1 -0
- package/dist/src/services/serverFacet/index.cjs +197 -0
- package/dist/src/services/serverFacet/index.cjs.map +1 -0
- package/dist/src/services/serverFacet/index.d.mts +31 -0
- package/dist/src/services/serverFacet/index.d.mts.map +1 -0
- package/dist/src/services/serverFacet/index.mjs +197 -0
- package/dist/src/services/serverFacet/index.mjs.map +1 -0
- package/dist/src/services/sessionAttachments/index.cjs +111 -0
- package/dist/src/services/sessionAttachments/index.cjs.map +1 -0
- package/dist/src/services/sessionAttachments/index.d.mts +11 -0
- package/dist/src/services/sessionAttachments/index.d.mts.map +1 -0
- package/dist/src/services/sessionAttachments/index.mjs +107 -0
- package/dist/src/services/sessionAttachments/index.mjs.map +1 -0
- package/dist/src/services/sessionGitStatus/index.cjs +46 -0
- package/dist/src/services/sessionGitStatus/index.cjs.map +1 -0
- package/dist/src/services/sessionGitStatus/index.mjs +46 -0
- package/dist/src/services/sessionGitStatus/index.mjs.map +1 -0
- package/dist/src/services/sessionGitStatus/type.d.mts +8 -0
- package/dist/src/services/sessionGitStatus/type.d.mts.map +1 -0
- package/dist/src/services/sessionMcpActivity/index.cjs +115 -0
- package/dist/src/services/sessionMcpActivity/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpActivity/index.mjs +111 -0
- package/dist/src/services/sessionMcpActivity/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.cjs +473 -0
- package/dist/src/services/sessionMcpAuthorization/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.d.mts +125 -0
- package/dist/src/services/sessionMcpAuthorization/index.d.mts.map +1 -0
- package/dist/src/services/sessionMcpAuthorization/index.mjs +469 -0
- package/dist/src/services/sessionMcpAuthorization/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpConversations/index.cjs +217 -0
- package/dist/src/services/sessionMcpConversations/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpConversations/index.mjs +212 -0
- package/dist/src/services/sessionMcpConversations/index.mjs.map +1 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.cjs +86 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.cjs.map +1 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.mjs +83 -0
- package/dist/src/services/sessionMcpRegistrationStore/index.mjs.map +1 -0
- package/dist/src/services/sessionPresentation/index.cjs +120 -0
- package/dist/src/services/sessionPresentation/index.cjs.map +1 -0
- package/dist/src/services/sessionPresentation/index.mjs +120 -0
- package/dist/src/services/sessionPresentation/index.mjs.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.cjs +97 -0
- package/dist/src/services/sqliteSessionHistory/index.cjs.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.d.mts +28 -0
- package/dist/src/services/sqliteSessionHistory/index.d.mts.map +1 -0
- package/dist/src/services/sqliteSessionHistory/index.mjs +92 -0
- package/dist/src/services/sqliteSessionHistory/index.mjs.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.cjs +67 -0
- package/dist/src/services/sqliteTranscriptReader/index.cjs.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.d.mts +14 -0
- package/dist/src/services/sqliteTranscriptReader/index.d.mts.map +1 -0
- package/dist/src/services/sqliteTranscriptReader/index.mjs +65 -0
- package/dist/src/services/sqliteTranscriptReader/index.mjs.map +1 -0
- package/dist/src/services/toolCost/index.cjs +47 -0
- package/dist/src/services/toolCost/index.cjs.map +1 -0
- package/dist/src/services/toolCost/index.d.mts +38 -0
- package/dist/src/services/toolCost/index.d.mts.map +1 -0
- package/dist/src/services/toolCost/index.mjs +46 -0
- package/dist/src/services/toolCost/index.mjs.map +1 -0
- package/dist/src/services/toolOverrides/index.cjs +45 -0
- package/dist/src/services/toolOverrides/index.cjs.map +1 -0
- package/dist/src/services/toolOverrides/index.d.mts +6 -0
- package/dist/src/services/toolOverrides/index.d.mts.map +1 -0
- package/dist/src/services/toolOverrides/index.mjs +45 -0
- package/dist/src/services/toolOverrides/index.mjs.map +1 -0
- package/dist/src/services/toolPrompt/index.cjs +13 -0
- package/dist/src/services/toolPrompt/index.cjs.map +1 -0
- package/dist/src/services/toolPrompt/index.mjs +13 -0
- package/dist/src/services/toolPrompt/index.mjs.map +1 -0
- package/dist/src/services/toolSurface/index.cjs +134 -0
- package/dist/src/services/toolSurface/index.cjs.map +1 -0
- package/dist/src/services/toolSurface/index.d.mts +19 -0
- package/dist/src/services/toolSurface/index.d.mts.map +1 -0
- package/dist/src/services/toolSurface/index.mjs +134 -0
- package/dist/src/services/toolSurface/index.mjs.map +1 -0
- package/dist/src/services/traceContext/index.cjs +13 -0
- package/dist/src/services/traceContext/index.cjs.map +1 -0
- package/dist/src/services/traceContext/index.mjs +13 -0
- package/dist/src/services/traceContext/index.mjs.map +1 -0
- package/dist/src/services/transcriptPages/index.cjs +117 -0
- package/dist/src/services/transcriptPages/index.cjs.map +1 -0
- package/dist/src/services/transcriptPages/index.mjs +115 -0
- package/dist/src/services/transcriptPages/index.mjs.map +1 -0
- package/dist/src/services/tunnelOutput/index.cjs +58 -0
- package/dist/src/services/tunnelOutput/index.cjs.map +1 -0
- package/dist/src/services/tunnelOutput/index.mjs +54 -0
- package/dist/src/services/tunnelOutput/index.mjs.map +1 -0
- package/dist/src/services/tunnelProcess/index.cjs +487 -0
- package/dist/src/services/tunnelProcess/index.cjs.map +1 -0
- package/dist/src/services/tunnelProcess/index.mjs +481 -0
- package/dist/src/services/tunnelProcess/index.mjs.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.cjs +136 -0
- package/dist/src/services/voiceReloadHandoff/index.cjs.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.d.mts +34 -0
- package/dist/src/services/voiceReloadHandoff/index.d.mts.map +1 -0
- package/dist/src/services/voiceReloadHandoff/index.mjs +135 -0
- package/dist/src/services/voiceReloadHandoff/index.mjs.map +1 -0
- package/dist/src/services/voiceToolsContract/index.cjs +26 -0
- package/dist/src/services/voiceToolsContract/index.cjs.map +1 -0
- package/dist/src/services/voiceToolsContract/index.d.mts +76 -0
- package/dist/src/services/voiceToolsContract/index.d.mts.map +1 -0
- package/dist/src/services/voiceToolsContract/index.mjs +24 -0
- package/dist/src/services/voiceToolsContract/index.mjs.map +1 -0
- package/dist/src/services/webauthn/index.cjs +262 -0
- package/dist/src/services/webauthn/index.cjs.map +1 -0
- package/dist/src/services/webauthn/index.d.mts +39 -0
- package/dist/src/services/webauthn/index.d.mts.map +1 -0
- package/dist/src/services/webauthn/index.mjs +262 -0
- package/dist/src/services/webauthn/index.mjs.map +1 -0
- package/dist/src/services/webauthnPolicy/index.cjs +174 -0
- package/dist/src/services/webauthnPolicy/index.cjs.map +1 -0
- package/dist/src/services/webauthnPolicy/index.d.mts +41 -0
- package/dist/src/services/webauthnPolicy/index.d.mts.map +1 -0
- package/dist/src/services/webauthnPolicy/index.mjs +167 -0
- package/dist/src/services/webauthnPolicy/index.mjs.map +1 -0
- package/dist/src/services/workspaceRegistry/index.cjs +187 -0
- package/dist/src/services/workspaceRegistry/index.cjs.map +1 -0
- package/dist/src/services/workspaceRegistry/index.d.mts +47 -0
- package/dist/src/services/workspaceRegistry/index.d.mts.map +1 -0
- package/dist/src/services/workspaceRegistry/index.mjs +179 -0
- package/dist/src/services/workspaceRegistry/index.mjs.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs +466 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.cjs.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts +36 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.d.mts.map +1 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs +457 -0
- package/dist/src/systems/child/adapters/headlessChildSessionService.mjs.map +1 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs +28 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.cjs.map +1 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs +25 -0
- package/dist/src/systems/child/adapters/nativeChildRuntimes.mjs.map +1 -0
- package/dist/src/systems/child/services/childSession/index.cjs +219 -0
- package/dist/src/systems/child/services/childSession/index.cjs.map +1 -0
- package/dist/src/systems/child/services/childSession/index.d.mts +14 -0
- package/dist/src/systems/child/services/childSession/index.d.mts.map +1 -0
- package/dist/src/systems/child/services/childSession/index.mjs +219 -0
- package/dist/src/systems/child/services/childSession/index.mjs.map +1 -0
- package/dist/src/systems/child/types/childSession.cjs +21 -0
- package/dist/src/systems/child/types/childSession.cjs.map +1 -0
- package/dist/src/systems/child/types/childSession.d.mts +182 -0
- package/dist/src/systems/child/types/childSession.d.mts.map +1 -0
- package/dist/src/systems/child/types/childSession.mjs +17 -0
- package/dist/src/systems/child/types/childSession.mjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.cjs +597 -0
- package/dist/src/systems/main/adapters/headlessHost.cjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.d.mts +116 -0
- package/dist/src/systems/main/adapters/headlessHost.d.mts.map +1 -0
- package/dist/src/systems/main/adapters/headlessHost.mjs +595 -0
- package/dist/src/systems/main/adapters/headlessHost.mjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs +1668 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts +20 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.d.mts.map +1 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs +1663 -0
- package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -0
- package/dist/src/systems/main/types/headlessHost.d.mts +37 -0
- package/dist/src/systems/main/types/headlessHost.d.mts.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.cjs +73 -0
- package/dist/src/testing/pi/extensionScenarios.cjs.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.d.mts +41 -0
- package/dist/src/testing/pi/extensionScenarios.d.mts.map +1 -0
- package/dist/src/testing/pi/extensionScenarios.mjs +73 -0
- package/dist/src/testing/pi/extensionScenarios.mjs.map +1 -0
- package/dist/src/testing/pi/testHost.cjs +399 -0
- package/dist/src/testing/pi/testHost.cjs.map +1 -0
- package/dist/src/testing/pi/testHost.d.mts +160 -0
- package/dist/src/testing/pi/testHost.d.mts.map +1 -0
- package/dist/src/testing/pi/testHost.mjs +399 -0
- package/dist/src/testing/pi/testHost.mjs.map +1 -0
- package/dist/src/types/config.d.mts +20 -0
- package/dist/src/types/config.d.mts.map +1 -0
- package/dist/src/types/kernel.d.mts +69 -0
- package/dist/src/types/kernel.d.mts.map +1 -0
- package/dist/src/types/remote.d.mts +152 -0
- package/dist/src/types/remote.d.mts.map +1 -0
- package/dist/src/types/server/directHarnessRuntime.d.mts +526 -0
- package/dist/src/types/server/directHarnessRuntime.d.mts.map +1 -0
- package/dist/src/types/server/session.d.mts +5 -0
- package/dist/src/types/server/session.d.mts.map +1 -0
- package/dist/src/types/server/sessionToolSurface.d.mts +44 -0
- package/dist/src/types/server/sessionToolSurface.d.mts.map +1 -0
- package/dist/src/web/models/globalStore.cjs +23 -0
- package/dist/src/web/models/globalStore.cjs.map +1 -0
- package/dist/src/web/models/globalStore.d.mts +6 -0
- package/dist/src/web/models/globalStore.d.mts.map +1 -0
- package/dist/src/web/models/globalStore.mjs +23 -0
- package/dist/src/web/models/globalStore.mjs.map +1 -0
- package/dist/src/web/models/sessionStore.cjs +56 -0
- package/dist/src/web/models/sessionStore.cjs.map +1 -0
- package/dist/src/web/models/sessionStore.d.mts +14 -0
- package/dist/src/web/models/sessionStore.d.mts.map +1 -0
- package/dist/src/web/models/sessionStore.mjs +56 -0
- package/dist/src/web/models/sessionStore.mjs.map +1 -0
- package/dist/src/web/models/workspaceStore.cjs +50 -0
- package/dist/src/web/models/workspaceStore.cjs.map +1 -0
- package/dist/src/web/models/workspaceStore.d.mts +18 -0
- package/dist/src/web/models/workspaceStore.d.mts.map +1 -0
- package/dist/src/web/models/workspaceStore.mjs +50 -0
- package/dist/src/web/models/workspaceStore.mjs.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.cjs +20 -0
- package/dist/src/web/schemas/bundleAssetPolicy.cjs.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.d.mts +10 -0
- package/dist/src/web/schemas/bundleAssetPolicy.d.mts.map +1 -0
- package/dist/src/web/schemas/bundleAssetPolicy.mjs +18 -0
- package/dist/src/web/schemas/bundleAssetPolicy.mjs.map +1 -0
- package/dist/src/web/schemas/template.cjs +35 -0
- package/dist/src/web/schemas/template.cjs.map +1 -0
- package/dist/src/web/schemas/template.d.mts +9 -0
- package/dist/src/web/schemas/template.d.mts.map +1 -0
- package/dist/src/web/schemas/template.mjs +34 -0
- package/dist/src/web/schemas/template.mjs.map +1 -0
- package/dist/src/web/services/apiClient/index.cjs +156 -0
- package/dist/src/web/services/apiClient/index.cjs.map +1 -0
- package/dist/src/web/services/apiClient/index.d.mts +152 -0
- package/dist/src/web/services/apiClient/index.d.mts.map +1 -0
- package/dist/src/web/services/apiClient/index.mjs +154 -0
- package/dist/src/web/services/apiClient/index.mjs.map +1 -0
- package/dist/src/web/services/apiPaths/index.cjs +83 -0
- package/dist/src/web/services/apiPaths/index.cjs.map +1 -0
- package/dist/src/web/services/apiPaths/index.d.mts +81 -0
- package/dist/src/web/services/apiPaths/index.d.mts.map +1 -0
- package/dist/src/web/services/apiPaths/index.mjs +78 -0
- package/dist/src/web/services/apiPaths/index.mjs.map +1 -0
- package/dist/src/web/services/apiRoutes/index.cjs +47 -0
- package/dist/src/web/services/apiRoutes/index.cjs.map +1 -0
- package/dist/src/web/services/apiRoutes/index.d.mts +21 -0
- package/dist/src/web/services/apiRoutes/index.d.mts.map +1 -0
- package/dist/src/web/services/apiRoutes/index.mjs +43 -0
- package/dist/src/web/services/apiRoutes/index.mjs.map +1 -0
- package/dist/src/web/services/mcpWidget.cjs +9 -0
- package/dist/src/web/services/mcpWidget.cjs.map +1 -0
- package/dist/src/web/services/mcpWidget.d.mts +6 -0
- package/dist/src/web/services/mcpWidget.d.mts.map +1 -0
- package/dist/src/web/services/mcpWidget.mjs +9 -0
- package/dist/src/web/services/mcpWidget.mjs.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.cjs +70 -0
- package/dist/src/web/services/sessionRegistry/index.cjs.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.d.mts +29 -0
- package/dist/src/web/services/sessionRegistry/index.d.mts.map +1 -0
- package/dist/src/web/services/sessionRegistry/index.mjs +66 -0
- package/dist/src/web/services/sessionRegistry/index.mjs.map +1 -0
- package/dist/src/web/services/testing/channels.cjs +11 -0
- package/dist/src/web/services/testing/channels.cjs.map +1 -0
- package/dist/src/web/services/testing/channels.d.mts +8 -0
- package/dist/src/web/services/testing/channels.d.mts.map +1 -0
- package/dist/src/web/services/testing/channels.mjs +11 -0
- package/dist/src/web/services/testing/channels.mjs.map +1 -0
- package/dist/src/web/services/testing/index.cjs +27 -0
- package/dist/src/web/services/testing/index.cjs.map +1 -0
- package/dist/src/web/services/testing/index.d.mts +31 -0
- package/dist/src/web/services/testing/index.d.mts.map +1 -0
- package/dist/src/web/services/testing/index.mjs +27 -0
- package/dist/src/web/services/testing/index.mjs.map +1 -0
- package/dist/src/web/services/testing/rpcStub.cjs +58 -0
- package/dist/src/web/services/testing/rpcStub.cjs.map +1 -0
- package/dist/src/web/services/testing/rpcStub.d.mts +37 -0
- package/dist/src/web/services/testing/rpcStub.d.mts.map +1 -0
- package/dist/src/web/services/testing/rpcStub.mjs +58 -0
- package/dist/src/web/services/testing/rpcStub.mjs.map +1 -0
- package/dist/src/web/services/testing/slotProps.cjs +97 -0
- package/dist/src/web/services/testing/slotProps.cjs.map +1 -0
- package/dist/src/web/services/testing/slotProps.d.mts +69 -0
- package/dist/src/web/services/testing/slotProps.d.mts.map +1 -0
- package/dist/src/web/services/testing/slotProps.mjs +96 -0
- package/dist/src/web/services/testing/slotProps.mjs.map +1 -0
- package/dist/src/web/services/testing/templateRail.cjs +156 -0
- package/dist/src/web/services/testing/templateRail.cjs.map +1 -0
- package/dist/src/web/services/testing/templateRail.d.mts +32 -0
- package/dist/src/web/services/testing/templateRail.d.mts.map +1 -0
- package/dist/src/web/services/testing/templateRail.mjs +154 -0
- package/dist/src/web/services/testing/templateRail.mjs.map +1 -0
- package/dist/src/web/services/toolResult/index.cjs +30 -0
- package/dist/src/web/services/toolResult/index.cjs.map +1 -0
- package/dist/src/web/services/toolResult/index.d.mts +14 -0
- package/dist/src/web/services/toolResult/index.d.mts.map +1 -0
- package/dist/src/web/services/toolResult/index.mjs +29 -0
- package/dist/src/web/services/toolResult/index.mjs.map +1 -0
- package/dist/src/web/types/extensionFile.d.mts +62 -0
- package/dist/src/web/types/extensionFile.d.mts.map +1 -0
- package/dist/src/web/types/mcpWidget.d.mts +14 -0
- package/dist/src/web/types/mcpWidget.d.mts.map +1 -0
- package/dist/src/web/types/modelContext.d.mts +43 -0
- package/dist/src/web/types/modelContext.d.mts.map +1 -0
- package/dist/src/web/types/nativeTemplate.d.mts +29 -0
- package/dist/src/web/types/nativeTemplate.d.mts.map +1 -0
- package/dist/src/web/types/sessionRegistry.d.mts +46 -0
- package/dist/src/web/types/sessionRegistry.d.mts.map +1 -0
- package/dist/src/web/types/template.d.mts +135 -0
- package/dist/src/web/types/template.d.mts.map +1 -0
- package/dist/src/web/types/webPlugin.d.mts +915 -0
- package/dist/src/web/types/webPlugin.d.mts.map +1 -0
- package/dist/terminalPiChildSessionService.cjs +324 -0
- package/dist/terminalPiChildSessionService.cjs.map +1 -0
- package/dist/terminalPiChildSessionService.d.mts +46 -0
- package/dist/terminalPiChildSessionService.d.mts.map +1 -0
- package/dist/terminalPiChildSessionService.mjs +318 -0
- package/dist/terminalPiChildSessionService.mjs.map +1 -0
- package/dist/testing.cjs +11 -0
- package/dist/testing.d.mts +6 -0
- package/dist/testing.mjs +6 -0
- package/dist/toolInventory.cjs +136 -0
- package/dist/toolInventory.cjs.map +1 -0
- package/dist/toolInventory.d.mts +66 -0
- package/dist/toolInventory.d.mts.map +1 -0
- package/dist/toolInventory.mjs +133 -0
- package/dist/toolInventory.mjs.map +1 -0
- package/dist/toolNames.cjs +4 -0
- package/dist/toolNames.d.mts +2 -0
- package/dist/toolNames.mjs +2 -0
- package/dist/toolOverrides.cjs +7 -0
- package/dist/toolOverrides.d.mts +3 -0
- package/dist/toolOverrides.mjs +3 -0
- package/dist/toolSurface.cjs +7 -0
- package/dist/toolSurface.d.mts +3 -0
- package/dist/toolSurface.mjs +3 -0
- package/dist/transition.cjs +5 -0
- package/dist/transition.d.cjs +5 -0
- package/dist/transition.d.mts +2 -0
- package/dist/transition.mjs +2 -0
- package/dist/transitionClassifier.cjs +112 -0
- package/dist/transitionClassifier.cjs.map +1 -0
- package/dist/transitionClassifier.d.mts +18 -0
- package/dist/transitionClassifier.d.mts.map +1 -0
- package/dist/transitionClassifier.mjs +111 -0
- package/dist/transitionClassifier.mjs.map +1 -0
- package/dist/transitionCoordinator.cjs +131 -0
- package/dist/transitionCoordinator.cjs.map +1 -0
- package/dist/transitionCoordinator.d.mts +16 -0
- package/dist/transitionCoordinator.d.mts.map +1 -0
- package/dist/transitionCoordinator.mjs +130 -0
- package/dist/transitionCoordinator.mjs.map +1 -0
- package/dist/typesContextApi.cjs +0 -0
- package/dist/typesContextApi.d.mts +79 -0
- package/dist/typesContextApi.d.mts.map +1 -0
- package/dist/typesContextApi.mjs +1 -0
- package/dist/uiHub.cjs +5 -0
- package/dist/uiHub.d.mts +2 -0
- package/dist/uiHub.mjs +2 -0
- package/dist/v3Export.cjs +10 -0
- package/dist/v3Export.cjs.map +1 -0
- package/dist/v3Export.d.mts +35 -0
- package/dist/v3Export.d.mts.map +1 -0
- package/dist/v3Export.mjs +9 -0
- package/dist/v3Export.mjs.map +1 -0
- package/dist/voiceReloadHandoff.cjs +14 -0
- package/dist/voiceReloadHandoff.d.mts +4 -0
- package/dist/voiceReloadHandoff.mjs +4 -0
- package/dist/voiceTools.cjs +56 -0
- package/dist/voiceTools.d.mts +4 -0
- package/dist/voiceTools.mjs +4 -0
- package/dist/web.cjs +65 -0
- package/dist/web.d.mts +20 -0
- package/dist/web.mjs +13 -0
- package/dist/webCompositions.cjs +181 -0
- package/dist/webCompositions.cjs.map +1 -0
- package/dist/webCompositions.d.mts +79 -0
- package/dist/webCompositions.d.mts.map +1 -0
- package/dist/webCompositions.mjs +174 -0
- package/dist/webCompositions.mjs.map +1 -0
- package/dist/webTesting.cjs +14 -0
- package/dist/webTesting.d.mts +6 -0
- package/dist/webTesting.mjs +6 -0
- package/package.json +586 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/remoteAccess/index.ts"],"sourcesContent":["import { createHash, randomBytes, randomInt } from 'node:crypto';\n\nimport { SEALED_KEY_PARAM } from '@agimon-ai/po-web-security';\nimport { createHostHandshake, type HostHandshake, type SealedChannel } from '@agimon-ai/po-web-security/node';\n\nimport {\n BUNDLE_MINIMUM_REVISION_PARAM,\n BUNDLE_SIGNING_KEY_PARAM,\n PAIRING_PAGE_ROUTE,\n REMOTE_PAIRING_REQUEST_TYPE,\n REMOTE_STATE_TYPE,\n} from '../../constants/remote';\nimport { COOKIE_CEILING_SECONDS, TRUSTED_DEVICE_LIMIT } from '../../constants/remote';\nimport {\n type BundlePairingTrust,\n type DeviceTrust,\n type DeviceTrustKind,\n type PairingStatus,\n type RemoteAccessSettings,\n type RemoteAccessStateView,\n type RemoteAccessStatus,\n type RemoteChannelScope,\n type TunnelLauncher,\n type TunnelStartResult,\n} from '../../types/remote';\nimport { createDeviceAuth, type DeviceAuth, type EnrolledDevice } from '../deviceAuth';\nimport { cookieMaxAgeSeconds } from '../deviceSessions';\nimport {\n createDeviceChallenges,\n deviceAuthChallenge,\n deviceStepUpChallenge,\n type DeviceChallenges,\n isDeviceNonce,\n isOpaqueId,\n verifyAuthentication,\n verifyRegistration,\n verifyStepUp,\n} from '../deviceTrust';\nimport { createPairingFlow, type PairingFlow } from '../pairingFlow';\nimport { parseRemoteAccessSettings, serializeRemoteAccessSettings } from '../remoteAccessSettings';\nimport type { RemoteAccessStore } from '../remoteAccessStore';\nimport { type OriginPolicy, tunnelOriginPolicy } from '../remoteGuardPolicy';\nimport { createWebAuthn, type PasskeySupport, type WebAuthn } from '../webauthn';\nimport type { StepUpAction, StoredCredential } from '../webauthnPolicy';\n\nconst TOKEN_BYTES = 32;\nconst TRUSTED_DEVICE_ID_BYTES = 16;\nconst PAIRING_TRUST: DeviceTrust = { kind: 'pairing' };\nconst PASSKEY_TRUST: DeviceTrust = { kind: 'passkey' };\nconst SWEEP_INTERVAL_MS = 5 * 60_000;\nconst MS_PER_MINUTE = 60_000;\n\n/** The tunnel listener, bound by the host so this file never imports an HTTP server. */\nexport interface TunnelListener {\n port: number;\n close: () => Promise<void>;\n}\n\nexport interface RemoteAccessOptions {\n store: RemoteAccessStore;\n launchTunnel: TunnelLauncher;\n /** Binds a fresh loopback listener for the tunnel to point at. */\n bindListener: () => Promise<TunnelListener>;\n /** Current signed publication authenticated through the physical pairing display. */\n bundleTrust?: () => { publicKey: string; revision: number } | undefined;\n /**\n * Signs `po/host-channel-key/v1` fields with the same bundle signer the QR pins, so a reconnecting\n * phone can trust a fresh tunnel key. Undefined while no shell is published.\n */\n attestHost?: (fields: readonly string[]) => string | undefined;\n /** Removes ephemeral state owned by a paired device when its authorization ends. */\n onDeviceDropped?: (deviceId: string) => void;\n onNotice?: (message: string) => void;\n /** Frames only the local cockpit may see, such as an approval prompt. */\n broadcastLocal?: (frame: object) => void;\n /** Frames both local and remote pages see. */\n broadcastAll?: (frame: object) => void;\n /**\n * Asks the launcher to hand this cockpit over to a container.\n *\n * A signal rather than a call that does the work, because handing over means\n * closing the server this code is running inside, which it cannot do to\n * itself. The launcher owns that sequence and the rollback if it fails.\n */\n requestHandover?: (settings: RemoteAccessSettings) => void;\n /**\n * Whether this cockpit is already the one inside the container.\n *\n * Without it the contained hub would read the same settings it was handed and\n * try to hand over again, to a container inside a container.\n */\n contained?: boolean;\n now?: () => number;\n}\n\nexport interface RemoteAccess {\n state(selfDeviceId?: string, forLocalCaller?: boolean): RemoteAccessStateView;\n settings(): RemoteAccessSettings;\n updateSettings(patch: Partial<RemoteAccessSettings>): RemoteAccessSettings;\n tunnelPort(): number | undefined;\n /** The public origin the tunnel currently answers on, while one is up. */\n publicOrigin(): string | undefined;\n /** Changes whenever an established public exposure is torn down. */\n publicOriginRevision(): number;\n tunnelPolicy(): OriginPolicy | undefined;\n enable(): Promise<{ ok: true } | { ok: false; error: string }>;\n /** True between a contained `enable` and the handover its response defers. */\n handoverPending(): boolean;\n /** Runs that deferred handover, once the response asking for it is on the wire. */\n commitHandover(): void;\n disable(): Promise<void>;\n /** Mints the QR credential, separate manual code, and URL. Undefined while unavailable. */\n mintPairing():\n | ({ code: string; manualCode: string; pairUrl: string; expiresAt: string } & BundlePairingTrust)\n | undefined;\n bundleTrust(): BundlePairingTrust | undefined;\n claim(input: {\n code: string;\n userAgent: string | undefined;\n edgeIp: string | undefined;\n sourceAddress: string | undefined;\n }): ReturnType<PairingFlow['claim']>;\n pairingStatus(requestId: string): PairingStatus | undefined;\n approve(requestId: string): ReturnType<PairingFlow['approve']>;\n deny(requestId: string): ReturnType<PairingFlow['deny']>;\n /** Turns an approved request into a session, exactly once. */\n redeem(requestId: string): (EnrolledDevice & { maxAgeSeconds: number }) | undefined;\n authorize(token: string | undefined): string | undefined;\n /** Liveness check for a server-authenticated device identity, without extending expiry. */\n isDeviceAuthorized(deviceId: string): boolean;\n /** Mints a session for a device that proved a registered passkey. */\n sessionForPasskey(label: string): EnrolledDevice & { maxAgeSeconds: number };\n passkeys(): {\n support: () => PasskeySupport;\n list: () => readonly StoredCredential[];\n beginRegistration: WebAuthn['beginRegistration'];\n finishRegistration: WebAuthn['finishRegistration'];\n beginAuthentication: WebAuthn['beginAuthentication'];\n finishAuthentication: WebAuthn['finishAuthentication'];\n beginStepUp: WebAuthn['beginStepUp'];\n finishStepUp: WebAuthn['finishStepUp'];\n forget: (id: string) => boolean;\n };\n /** Registers a native device from a sealed, QR-approved pairing session, exactly once. */\n registerTrustedDevice(\n sessionDeviceId: string,\n body: unknown,\n ): { ok: true; trustedDeviceId: string } | { ok: false; reason: 'forbidden' | 'invalid' | 'full' | 'unavailable' };\n /** Public reconnect challenge with the same shape for known and unknown ids. */\n beginDeviceAuth(input: {\n trustedDeviceId: unknown;\n nonce: unknown;\n }):\n | { ok: true; challengeId: string; challenge: string; hostPublicKey: string; attestation: string }\n | { ok: false; reason: 'invalid' | 'unavailable' };\n /** Verifies a device sign-in, opens all three channels at once, and mints a session. */\n finishDeviceAuth(body: unknown): (EnrolledDevice & { maxAgeSeconds: number }) | undefined;\n beginDeviceStepUp(\n sessionDeviceId: string,\n action: StepUpAction,\n ): { ceremonyId: string; challenge: string; kind: 'device-key' } | undefined;\n finishDeviceStepUp(sessionDeviceId: string, action: StepUpAction, ceremonyId: unknown, signature: unknown): boolean;\n /** Removes the stored device and ends every live session, channel, and socket it holds. */\n revokeTrustedDevice(id: string): boolean;\n trustKind(deviceId: string): DeviceTrustKind | undefined;\n /**\n * Whether this action needs a fresh gesture that has not been supplied. Always true for a device-key\n * session; otherwise only where passkeys are supported.\n */\n stepUpRequired(action: StepUpAction, deviceId?: string): boolean;\n /** The host's ephemeral public key for this tunnel, delivered after QR pairing or passkey sign-in. */\n channelPublicKey(): string | undefined;\n /** Completes one purpose-bound sealed channel against a fresh device key. */\n openChannel(deviceId: string, scope: RemoteChannelScope, clientPublicKey: string): boolean;\n channelFor(deviceId: string, scope: RemoteChannelScope): SealedChannel | undefined;\n revokeDevice(id: string): boolean;\n isDeviceConnected(deviceId: string): boolean;\n /** Registers a remote socket against its device so revocation closes it immediately. */\n trackSocket(deviceId: string, close: (code: number, reason: string) => void): () => void;\n close(): Promise<void>;\n}\n\nfunction bundlePairingTrust(\n value: { publicKey: string; revision: number } | undefined,\n): BundlePairingTrust | undefined {\n if (value === undefined) return undefined;\n return {\n ...value,\n fingerprint: createHash('sha256').update(Buffer.from(value.publicKey, 'base64url')).digest('hex'),\n };\n}\n\nexport function createRemoteAccess(options: RemoteAccessOptions): RemoteAccess {\n const notice = options.onNotice ?? ((): void => {});\n const now = options.now ?? ((): number => Date.now());\n const broadcastLocal = options.broadcastLocal ?? ((): void => {});\n const broadcastAll = options.broadcastAll ?? ((): void => {});\n\n let settings = options.store.settings();\n let status: RemoteAccessStatus = 'off';\n let listener: TunnelListener | undefined;\n let stopTunnel: (() => Promise<void>) | undefined;\n let tunnelStartup: { controller: AbortController; outcome: Promise<TunnelStartResult> } | undefined;\n let publicOrigin: string | undefined;\n let publicOriginRevision = 0;\n let policy: OriginPolicy | undefined;\n let startedAt: number | undefined;\n let closesAt: number | undefined;\n let failure: string | undefined;\n /** Settings an `enable` asked to hand over with, waiting for its response to flush. */\n let pendingHandover: RemoteAccessSettings | undefined;\n let autoCloseTimer: ReturnType<typeof setTimeout> | undefined;\n /** One handshake per tunnel; its public half goes in every QR while the tunnel lives. */\n let handshake: HostHandshake | undefined;\n const channels = new Map<string, SealedChannel>();\n const deviceChallenges: DeviceChallenges = createDeviceChallenges({ now });\n const sockets = new Map<string, Set<(code: number, reason: string) => void>>();\n\n const channelKey = (deviceId: string, scope: RemoteChannelScope): string => `${deviceId}:${scope}`;\n const dropDeviceAccess = (deviceId: string, reason: 'revoked' | 'expired'): void => {\n options.onDeviceDropped?.(deviceId);\n for (const scope of ['session', 'protocol', 'http'] as const) channels.delete(channelKey(deviceId, scope));\n const held = sockets.get(deviceId);\n sockets.delete(deviceId);\n for (const close of held ?? []) {\n try {\n close(1008, `device ${reason}`);\n } catch {\n // The socket is already gone.\n }\n }\n };\n\n const devices: DeviceAuth = createDeviceAuth({\n settings: () => settings,\n now,\n onNotice: notice,\n onDrop: (record, reason) => dropDeviceAccess(record.id, reason),\n });\n\n const webauthn: WebAuthn = createWebAuthn({\n publicOrigin: () => publicOrigin,\n credentials: () => options.store.credentials(),\n saveCredential: (credential) => options.store.saveCredential(credential),\n removeCredential: (id) => options.store.removeCredential(id),\n now,\n onNotice: notice,\n });\n\n const pairing: PairingFlow = createPairingFlow({\n randomToken: () => randomBytes(TOKEN_BYTES).toString('base64url'),\n randomManualCode: () => randomInt(100_000_000).toString().padStart(8, '0'),\n digest: (token) => createHash('sha256').update(token).digest('hex'),\n now,\n onNotice: notice,\n });\n\n const sweeper = setInterval(() => {\n devices.sweep();\n pairing.sweep();\n }, SWEEP_INTERVAL_MS);\n sweeper.unref();\n\n function publish(): void {\n broadcastAll({ type: REMOTE_STATE_TYPE, state: view(undefined, false) });\n }\n\n function view(selfDeviceId: string | undefined, forLocalCaller: boolean): RemoteAccessStateView {\n const selfTrust = selfDeviceId === undefined ? undefined : devices.trustOf(selfDeviceId);\n const selfTrustedDeviceId = selfTrust?.kind === 'device-key' ? selfTrust.trustedDeviceId : undefined;\n return {\n status,\n ...(publicOrigin === undefined ? {} : { publicUrl: publicOrigin }),\n ...(startedAt === undefined ? {} : { startedAt: new Date(startedAt).toISOString() }),\n ...(closesAt === undefined ? {} : { closesAt: new Date(closesAt).toISOString() }),\n ...(failure === undefined ? {} : { error: failure }),\n devices: devices.list().map((record) => ({\n id: record.id,\n label: record.label,\n userAgent: record.userAgent,\n createdAt: new Date(record.createdAt).toISOString(),\n lastSeenAt: new Date(record.lastSeenAt).toISOString(),\n self: record.id === selfDeviceId,\n })),\n // A paired phone must never see the approval queue: a device that can\n // approve devices makes its own access permanent, which is exactly what\n // host confirmation exists to prevent.\n pending: forLocalCaller\n ? pairing.pending().map((request) => ({\n id: request.id,\n userAgent: request.userAgent,\n edgeIp: request.edgeIp,\n createdAt: new Date(request.createdAt).toISOString(),\n expiresAt: new Date(request.createdAt + 180_000).toISOString(),\n }))\n : [],\n trustedDevices: options.store.trustedDevices().map((record) => ({\n id: record.id,\n label: record.label,\n platform: record.platform,\n createdAt: new Date(record.createdAt).toISOString(),\n lastSeenAt: new Date(record.lastSeenAt).toISOString(),\n self: selfTrustedDeviceId !== undefined && record.id === selfTrustedDeviceId,\n })),\n settings,\n };\n }\n\n function armAutoClose(): void {\n clearTimeout(autoCloseTimer);\n autoCloseTimer = undefined;\n closesAt = undefined;\n if (!settings.autoCloseEnabled || status !== 'on') return;\n const at = now() + settings.autoCloseMinutes * MS_PER_MINUTE;\n closesAt = at;\n autoCloseTimer = setTimeout(() => {\n notice('remote access reached its time limit; closing');\n void disable();\n }, settings.autoCloseMinutes * MS_PER_MINUTE);\n autoCloseTimer.unref();\n }\n\n /** Everything teardown has to do, in the order it has to happen. */\n async function teardown(): Promise<void> {\n clearTimeout(autoCloseTimer);\n autoCloseTimer = undefined;\n closesAt = undefined;\n // Sockets first. An upgraded socket has left the HTTP server's connection\n // tracking, so closing the listener does not touch it: without this a\n // paired phone keeps driving the agent after remote access is switched off.\n for (const held of sockets.values()) {\n for (const close of held) {\n try {\n close(1008, 'remote access revoked');\n } catch {\n // The socket is already gone, which is the outcome we wanted.\n }\n }\n }\n sockets.clear();\n const starting = tunnelStartup;\n tunnelStartup = undefined;\n starting?.controller.abort();\n const startingOutcome = await starting?.outcome.catch(() => undefined);\n if (startingOutcome?.ok === true) await startingOutcome.stop().catch(() => undefined);\n await stopTunnel?.().catch(() => undefined);\n stopTunnel = undefined;\n await listener?.close().catch(() => undefined);\n listener = undefined;\n if (publicOrigin !== undefined) publicOriginRevision += 1;\n publicOrigin = undefined;\n policy = undefined;\n startedAt = undefined;\n pairing.clear();\n webauthn.clearChallenges();\n // Challenges are bound to this tunnel's key. Trusted devices stay on disk, like passkeys.\n deviceChallenges.clear();\n handshake = undefined;\n channels.clear();\n // Sessions go; passkeys and any other durable credential do not, so\n // switching back on does not mean enrolling every device again.\n devices.revokeAll();\n }\n\n async function disable(): Promise<void> {\n if (status === 'off') return;\n await teardown();\n status = 'off';\n failure = undefined;\n notice('remote access off');\n publish();\n }\n\n return {\n state: (selfDeviceId, forLocalCaller = false) => view(selfDeviceId, forLocalCaller),\n settings: () => settings,\n publicOrigin: () => publicOrigin,\n publicOriginRevision: () => publicOriginRevision,\n\n updateSettings(patch) {\n // Through the parser rather than spread straight in, so a value out of\n // range is clamped now instead of silently differing until the next load.\n const parsed = parseRemoteAccessSettings(\n serializeRemoteAccessSettings({ ...settings, ...patch }) as Record<string, unknown>,\n );\n for (const warning of parsed.warnings) notice(`remote access settings: ${warning}`);\n settings = parsed.settings;\n options.store.save(settings);\n // Re-arm rather than leave the old deadline: shortening the window has to\n // take effect now, and lengthening it should not close early.\n devices.reschedule();\n armAutoClose();\n publish();\n return settings;\n },\n\n /**\n * Runs a handover `enable` deferred, once its response is on the wire.\n *\n * Split out rather than done inside `enable` because the reply and the\n * teardown travel over the same socket, and doing them in the wrong order\n * leaves the caller unable to tell success from a dropped connection.\n */\n commitHandover() {\n const handing = pendingHandover;\n if (handing === undefined) return;\n pendingHandover = undefined;\n notice('handing the cockpit over to a container');\n options.requestHandover?.(handing);\n },\n\n /** True between a contained `enable` and the handover its response defers. */\n handoverPending: () => pendingHandover !== undefined,\n\n tunnelPort: () => listener?.port,\n tunnelPolicy: () => policy,\n\n async enable() {\n if (status === 'on' || status === 'starting') return { ok: true };\n status = 'starting';\n failure = undefined;\n publish();\n\n // Containment has to be in place before the tunnel is, so a contained\n // cockpit hands over instead of starting a tunnel here. The container's\n // own hub turns remote access on once it is serving.\n if (settings.sandbox.enabled && options.contained !== true) {\n if (settings.sandbox.workspaces.length === 0) {\n status = 'failed';\n failure = 'Add at least one workspace before running the cockpit in a container.';\n publish();\n return { ok: false, error: failure };\n }\n if (options.requestHandover === undefined) {\n status = 'failed';\n failure = 'This cockpit cannot hand over to a container.';\n publish();\n return { ok: false, error: failure };\n }\n // Held rather than run: the handover closes the server carrying this\n // very response, so the caller has to hear the answer first.\n pendingHandover = settings;\n return { ok: true };\n }\n let bound: TunnelListener;\n try {\n bound = await options.bindListener();\n } catch (error) {\n status = 'failed';\n failure = `The tunnel listener could not bind: ${error instanceof Error ? error.message : String(error)}`;\n publish();\n return { ok: false, error: failure };\n }\n listener = bound;\n const controller = new AbortController();\n const launching = options.launchTunnel({\n port: bound.port,\n config: settings.tunnel,\n signal: controller.signal,\n acceptOrigin: (origin) => {\n policy = tunnelOriginPolicy(origin);\n },\n });\n const startup = { controller, outcome: launching };\n tunnelStartup = startup;\n const outcome = await launching;\n if (tunnelStartup !== startup || controller.signal.aborted) {\n return { ok: false, error: 'Tunnel startup was cancelled.' };\n }\n tunnelStartup = undefined;\n if (!outcome.ok) {\n await teardown();\n status = 'failed';\n failure = outcome.message;\n notice(`remote access failed: ${outcome.message}`);\n publish();\n return { ok: false, error: outcome.message };\n }\n stopTunnel = outcome.stop;\n // A fresh key pair per tunnel: the QR is the only place its public half\n // travels, so it must not outlive the code that carried it.\n handshake = createHostHandshake();\n publicOrigin = outcome.publicOrigin;\n policy = tunnelOriginPolicy(outcome.publicOrigin);\n startedAt = now();\n status = 'on';\n armAutoClose();\n notice(`remote access on at ${outcome.publicOrigin}`);\n publish();\n return { ok: true };\n },\n\n disable,\n\n mintPairing() {\n if (status !== 'on' || publicOrigin === undefined || handshake === undefined) return undefined;\n const trust = bundlePairingTrust(options.bundleTrust?.());\n if (trust === undefined) return undefined;\n const { code, manualCode, expiresAt } = pairing.mintCode();\n // The token, channel key, signer key, and publication floor ride in the fragment,\n // so the relay never observes the values used to authenticate either channel.\n const fragment = new URLSearchParams({\n c: code,\n [SEALED_KEY_PARAM]: handshake.publicKey,\n [BUNDLE_SIGNING_KEY_PARAM]: trust.publicKey,\n [BUNDLE_MINIMUM_REVISION_PARAM]: String(trust.revision),\n });\n return {\n code,\n manualCode,\n pairUrl: `${publicOrigin}${PAIRING_PAGE_ROUTE}#${fragment.toString()}`,\n expiresAt: new Date(expiresAt).toISOString(),\n ...trust,\n };\n },\n\n bundleTrust: () => bundlePairingTrust(options.bundleTrust?.()),\n\n claim(input) {\n const outcome = pairing.claim(input);\n if (outcome.ok) {\n broadcastLocal({ type: REMOTE_PAIRING_REQUEST_TYPE, state: view(undefined, true) });\n }\n return outcome;\n },\n\n pairingStatus: (requestId) => pairing.status(requestId),\n\n approve(requestId) {\n const outcome = pairing.approve(requestId);\n if (outcome === 'approved') broadcastLocal({ type: REMOTE_PAIRING_REQUEST_TYPE, state: view(undefined, true) });\n return outcome;\n },\n\n deny(requestId) {\n const outcome = pairing.deny(requestId);\n if (outcome === 'denied') broadcastLocal({ type: REMOTE_PAIRING_REQUEST_TYPE, state: view(undefined, true) });\n return outcome;\n },\n\n redeem(requestId) {\n const approved = pairing.consume(requestId);\n if (approved === undefined) return undefined;\n const enrolled = devices.enrol({ userAgent: approved.userAgent, trust: PAIRING_TRUST });\n publish();\n return { ...enrolled, maxAgeSeconds: cookieMaxAgeSeconds(settings, COOKIE_CEILING_SECONDS) };\n },\n\n authorize: (token) => devices.verify(token)?.id,\n isDeviceAuthorized(deviceId) {\n devices.sweep();\n return listener !== undefined && devices.list().some((record) => record.id === deviceId);\n },\n\n sessionForPasskey(label) {\n const enrolled = devices.enrol({ userAgent: label, trust: PASSKEY_TRUST });\n publish();\n return { ...enrolled, maxAgeSeconds: cookieMaxAgeSeconds(settings, COOKIE_CEILING_SECONDS) };\n },\n\n passkeys: () => ({\n support: () => webauthn.support(),\n list: () => options.store.credentials(),\n // Wrapped rather than passed by reference: an unbound method carries\n // whatever `this` the caller happens to have.\n beginRegistration: async (caller, label) => await webauthn.beginRegistration(caller, label),\n finishRegistration: async (ceremonyId, caller, response, label) =>\n await webauthn.finishRegistration(ceremonyId, caller, response, label),\n beginAuthentication: async (caller) => await webauthn.beginAuthentication(caller),\n finishAuthentication: async (ceremonyId, caller, response) =>\n await webauthn.finishAuthentication(ceremonyId, caller, response),\n beginStepUp: async (caller, action) => await webauthn.beginStepUp(caller, action),\n finishStepUp: async (ceremonyId, caller, action, response) =>\n await webauthn.finishStepUp(ceremonyId, caller, action, response),\n forget: (id) => {\n const forgotten = options.store.removeCredential(id);\n if (forgotten) publish();\n return forgotten;\n },\n }),\n\n registerTrustedDevice(sessionDeviceId, body) {\n if (publicOrigin === undefined || handshake === undefined) return { ok: false, reason: 'unavailable' };\n const verdict = verifyRegistration({\n origin: publicOrigin,\n hostPublicKey: handshake.publicKey,\n sessionDeviceId,\n trust: devices.trustOf(sessionDeviceId),\n body,\n });\n if (!verdict.ok) return { ok: false, reason: verdict.reason === 'not-pairing' ? 'forbidden' : 'invalid' };\n if (options.store.trustedDevices().length >= TRUSTED_DEVICE_LIMIT) return { ok: false, reason: 'full' };\n const at = now();\n const trustedDeviceId = randomBytes(TRUSTED_DEVICE_ID_BYTES).toString('base64url');\n const saved = options.store.saveTrustedDevice({\n id: trustedDeviceId,\n identityPublicKey: verdict.identityPublicKey,\n stepUpPublicKey: verdict.stepUpPublicKey,\n label: verdict.label,\n platform: verdict.platform,\n createdAt: at,\n lastSeenAt: at,\n });\n if (!saved) return { ok: false, reason: 'full' };\n // The pairing session becomes a device-key session, so it cannot register a second time and\n // every gated action from it now needs the biometric key.\n devices.setTrust(sessionDeviceId, { kind: 'device-key', trustedDeviceId });\n notice(`trusted ${verdict.label} (${trustedDeviceId})`);\n publish();\n return { ok: true, trustedDeviceId };\n },\n\n beginDeviceAuth(input) {\n if (!isOpaqueId(input.trustedDeviceId) || !isDeviceNonce(input.nonce)) return { ok: false, reason: 'invalid' };\n if (status !== 'on' || publicOrigin === undefined || handshake === undefined || options.attestHost === undefined)\n return { ok: false, reason: 'unavailable' };\n const attest = options.attestHost;\n const begun = deviceAuthChallenge({\n challenges: deviceChallenges,\n trustedDeviceId: input.trustedDeviceId,\n nonce: input.nonce,\n origin: publicOrigin,\n hostPublicKey: handshake.publicKey,\n attest: (fields) => attest(fields),\n });\n return begun === undefined ? { ok: false, reason: 'unavailable' } : { ok: true, ...begun };\n },\n\n finishDeviceAuth(body) {\n if (status !== 'on' || publicOrigin === undefined || handshake === undefined) return undefined;\n const verdict = verifyAuthentication({\n challenges: deviceChallenges,\n origin: publicOrigin,\n hostPublicKey: handshake.publicKey,\n find: (id) => options.store.trustedDevices().find((record) => record.id === id),\n body,\n });\n if (!verdict.ok) return undefined;\n const enrolled = devices.enrol({\n userAgent: verdict.record.label,\n trust: { kind: 'device-key', trustedDeviceId: verdict.record.id },\n });\n // All three channels open together or the session goes: a relay holding the cookie must never\n // be able to add a channel of its own.\n const opened: [RemoteChannelScope, SealedChannel | undefined][] = [\n ['session', handshake.accept(verdict.channels.session)],\n ['protocol', handshake.accept(verdict.channels.protocol)],\n ['http', handshake.accept(verdict.channels.http)],\n ];\n if (opened.some(([, channel]) => channel === undefined)) {\n devices.revoke(enrolled.record.id);\n return undefined;\n }\n for (const [scope, channel] of opened) {\n if (channel !== undefined) channels.set(channelKey(enrolled.record.id, scope), channel);\n }\n options.store.saveTrustedDevice({ ...verdict.record, lastSeenAt: now() });\n publish();\n return { ...enrolled, maxAgeSeconds: cookieMaxAgeSeconds(settings, COOKIE_CEILING_SECONDS) };\n },\n\n beginDeviceStepUp(sessionDeviceId, action) {\n if (handshake === undefined || devices.trustOf(sessionDeviceId)?.kind !== 'device-key') return undefined;\n return deviceStepUpChallenge({\n challenges: deviceChallenges,\n sessionDeviceId,\n action,\n hostPublicKey: handshake.publicKey,\n });\n },\n\n finishDeviceStepUp(sessionDeviceId, action, ceremonyId, signature) {\n const trust = devices.trustOf(sessionDeviceId);\n if (trust?.kind !== 'device-key' || publicOrigin === undefined) return false;\n const record = options.store.trustedDevices().find((held) => held.id === trust.trustedDeviceId);\n if (record === undefined) return false;\n return verifyStepUp({\n challenges: deviceChallenges,\n origin: publicOrigin,\n hostPublicKey: handshake?.publicKey,\n sessionDeviceId,\n action,\n ceremonyId,\n signature,\n stepUpPublicKey: record.stepUpPublicKey,\n });\n },\n\n revokeTrustedDevice(id) {\n const heldBy = (record: { trust: DeviceTrust }): boolean =>\n record.trust.kind === 'device-key' && record.trust.trustedDeviceId === id;\n const removed = options.store.removeTrustedDevice(id);\n const endedIds = new Set(\n devices\n .list()\n .filter(heldBy)\n .map((record) => record.id),\n );\n // The drop path deletes channels and closes sockets with 1008, exactly as a session revoke does.\n const ended = devices.revokeWhere(heldBy);\n deviceChallenges.dropWhere(\n (challenge) =>\n (challenge.purpose.kind === 'auth' && challenge.purpose.trustedDeviceId === id) ||\n (challenge.purpose.kind === 'step-up' && endedIds.has(challenge.purpose.sessionDeviceId)),\n );\n if (!removed && ended === 0) return false;\n notice(`revoked trusted device ${id}`);\n publish();\n return true;\n },\n\n trustKind: (deviceId) => devices.trustOf(deviceId)?.kind,\n\n // A device-key session always steps up with its biometric key, on every tunnel. Otherwise this is\n // only meaningful where passkeys are: a quick tunnel has no stable rpID, so there is nothing to\n // step up with and the session cookie is all there is.\n stepUpRequired: (_action, deviceId) =>\n (deviceId !== undefined && devices.trustOf(deviceId)?.kind === 'device-key') || webauthn.support().supported,\n\n channelPublicKey: () => handshake?.publicKey,\n\n openChannel(deviceId, scope, clientPublicKey) {\n const channel = handshake?.accept(clientPublicKey);\n if (channel === undefined) return false;\n channels.set(channelKey(deviceId, scope), channel);\n return true;\n },\n\n channelFor: (deviceId, scope) => channels.get(channelKey(deviceId, scope)),\n\n revokeDevice(id) {\n const revoked = devices.revoke(id);\n if (revoked) publish();\n return revoked;\n },\n\n isDeviceConnected: (deviceId) => (sockets.get(deviceId)?.size ?? 0) > 0,\n\n trackSocket(deviceId, close) {\n const held = sockets.get(deviceId) ?? new Set();\n held.add(close);\n sockets.set(deviceId, held);\n return () => {\n held.delete(close);\n if (held.size === 0) sockets.delete(deviceId);\n };\n },\n\n async close() {\n clearInterval(sweeper);\n await teardown();\n status = 'off';\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
const MIN_MINUTES = 1;
|
|
2
|
+
const MAX_MINUTES = 1440;
|
|
3
|
+
const MIN_HOURS = 1;
|
|
4
|
+
const MAX_HOURS = 720;
|
|
5
|
+
/**
|
|
6
|
+
* Both time limits start off.
|
|
7
|
+
*
|
|
8
|
+
* The durations are still here so switching one on lands on a sensible number
|
|
9
|
+
* rather than an empty field. What being off actually means: a tunnel stays up
|
|
10
|
+
* until it is closed or the hub restarts, and a paired session lasts until it
|
|
11
|
+
* is revoked or remote access is switched off. Those two events are the only
|
|
12
|
+
* expiry there is by default.
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_REMOTE_SETTINGS = {
|
|
15
|
+
autoCloseEnabled: false,
|
|
16
|
+
autoCloseMinutes: 60,
|
|
17
|
+
sessionExpiryEnabled: false,
|
|
18
|
+
idleMinutes: 30,
|
|
19
|
+
absoluteHours: 12,
|
|
20
|
+
tunnel: { kind: "quick" },
|
|
21
|
+
sandbox: {
|
|
22
|
+
enabled: false,
|
|
23
|
+
workspaces: []
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function readBoolean(raw, fallback, field, warnings) {
|
|
30
|
+
if (raw === void 0) return fallback;
|
|
31
|
+
if (typeof raw !== "boolean") {
|
|
32
|
+
warnings.push(`${field} must be true or false; using ${String(fallback)}.`);
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
return raw;
|
|
36
|
+
}
|
|
37
|
+
function readClamped(raw, fallback, bounds, field, warnings) {
|
|
38
|
+
if (raw === void 0) return fallback;
|
|
39
|
+
if (typeof raw !== "number" || !Number.isFinite(raw)) {
|
|
40
|
+
warnings.push(`${field} must be a number; using ${String(fallback)}.`);
|
|
41
|
+
return fallback;
|
|
42
|
+
}
|
|
43
|
+
const clamped = Math.min(bounds.max, Math.max(bounds.min, Math.round(raw)));
|
|
44
|
+
if (clamped !== raw) warnings.push(`${field} must be between ${String(bounds.min)} and ${String(bounds.max)}; using ${String(clamped)}.`);
|
|
45
|
+
return clamped;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A tunnel configuration is only accepted whole.
|
|
49
|
+
*
|
|
50
|
+
* A named tunnel missing its hostname is not a named tunnel with a default, it
|
|
51
|
+
* is a misconfiguration, and quietly falling back to a quick tunnel would swap
|
|
52
|
+
* a stable origin for a rotating one without telling anybody.
|
|
53
|
+
*/
|
|
54
|
+
function readTunnel(raw, warnings) {
|
|
55
|
+
if (raw === void 0) return DEFAULT_REMOTE_SETTINGS.tunnel;
|
|
56
|
+
if (!isRecord(raw)) {
|
|
57
|
+
warnings.push("tunnel must be an object; using a quick tunnel.");
|
|
58
|
+
return { kind: "quick" };
|
|
59
|
+
}
|
|
60
|
+
if (raw.kind === "quick") return { kind: "quick" };
|
|
61
|
+
if (raw.kind !== "named") {
|
|
62
|
+
warnings.push(`tunnel.kind must be "quick" or "named"; using a quick tunnel.`);
|
|
63
|
+
return { kind: "quick" };
|
|
64
|
+
}
|
|
65
|
+
if (typeof raw.hostname !== "string" || raw.hostname === "") {
|
|
66
|
+
warnings.push("A named tunnel needs a hostname; using a quick tunnel.");
|
|
67
|
+
return { kind: "quick" };
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
kind: "named",
|
|
71
|
+
hostname: raw.hostname,
|
|
72
|
+
...typeof raw.name === "string" && raw.name !== "" ? { name: raw.name } : {},
|
|
73
|
+
...typeof raw.tokenFile === "string" && raw.tokenFile !== "" ? { tokenFile: raw.tokenFile } : {},
|
|
74
|
+
...typeof raw.configFile === "string" && raw.configFile !== "" ? { configFile: raw.configFile } : {}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the container settings, keeping only absolute workspace paths.
|
|
79
|
+
*
|
|
80
|
+
* A relative path would resolve against the container's working directory
|
|
81
|
+
* rather than the host's, which is a mount that silently points somewhere else.
|
|
82
|
+
* Refusing one is better than mounting the wrong directory.
|
|
83
|
+
*/
|
|
84
|
+
function readSandbox(raw, warnings) {
|
|
85
|
+
const fallback = DEFAULT_REMOTE_SETTINGS.sandbox;
|
|
86
|
+
if (raw === void 0) return fallback;
|
|
87
|
+
if (!isRecord(raw)) {
|
|
88
|
+
warnings.push("sandbox must be an object; the cockpit will not be contained.");
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
91
|
+
const workspaces = [];
|
|
92
|
+
for (const entry of Array.isArray(raw.workspaces) ? raw.workspaces : []) {
|
|
93
|
+
if (typeof entry !== "string" || !entry.startsWith("/")) {
|
|
94
|
+
warnings.push(`A workspace must be an absolute path; ignoring ${String(entry)}.`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!workspaces.includes(entry)) workspaces.push(entry);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
enabled: readBoolean(raw.enabled, fallback.enabled, "sandbox.enabled", warnings),
|
|
101
|
+
workspaces
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function parseRemoteAccessSettings(raw) {
|
|
105
|
+
const warnings = [];
|
|
106
|
+
if (!isRecord(raw)) return {
|
|
107
|
+
settings: DEFAULT_REMOTE_SETTINGS,
|
|
108
|
+
warnings
|
|
109
|
+
};
|
|
110
|
+
if (raw.version !== 1) {
|
|
111
|
+
warnings.push(`Settings version ${String(raw.version)} is not version ${String(1)}; using defaults.`);
|
|
112
|
+
return {
|
|
113
|
+
settings: DEFAULT_REMOTE_SETTINGS,
|
|
114
|
+
warnings
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const defaults = DEFAULT_REMOTE_SETTINGS;
|
|
118
|
+
return {
|
|
119
|
+
settings: {
|
|
120
|
+
autoCloseEnabled: readBoolean(raw.autoCloseEnabled, defaults.autoCloseEnabled, "autoCloseEnabled", warnings),
|
|
121
|
+
autoCloseMinutes: readClamped(raw.autoCloseMinutes, defaults.autoCloseMinutes, {
|
|
122
|
+
min: MIN_MINUTES,
|
|
123
|
+
max: MAX_MINUTES
|
|
124
|
+
}, "autoCloseMinutes", warnings),
|
|
125
|
+
sessionExpiryEnabled: readBoolean(raw.sessionExpiryEnabled, defaults.sessionExpiryEnabled, "sessionExpiryEnabled", warnings),
|
|
126
|
+
idleMinutes: readClamped(raw.idleMinutes, defaults.idleMinutes, {
|
|
127
|
+
min: MIN_MINUTES,
|
|
128
|
+
max: MAX_MINUTES
|
|
129
|
+
}, "idleMinutes", warnings),
|
|
130
|
+
absoluteHours: readClamped(raw.absoluteHours, defaults.absoluteHours, {
|
|
131
|
+
min: MIN_HOURS,
|
|
132
|
+
max: MAX_HOURS
|
|
133
|
+
}, "absoluteHours", warnings),
|
|
134
|
+
tunnel: readTunnel(raw.tunnel, warnings),
|
|
135
|
+
sandbox: readSandbox(raw.sandbox, warnings)
|
|
136
|
+
},
|
|
137
|
+
warnings
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function serializeRemoteAccessSettings(settings) {
|
|
141
|
+
return {
|
|
142
|
+
version: 1,
|
|
143
|
+
...settings
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
exports.DEFAULT_REMOTE_SETTINGS = DEFAULT_REMOTE_SETTINGS;
|
|
148
|
+
exports.parseRemoteAccessSettings = parseRemoteAccessSettings;
|
|
149
|
+
exports.serializeRemoteAccessSettings = serializeRemoteAccessSettings;
|
|
150
|
+
|
|
151
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/remoteAccessSettings/index.ts"],"sourcesContent":["/**\n * The persisted remote-access settings, and how a bad file becomes a good one.\n *\n * Every failure here is recoverable by falling back, never by throwing: a\n * corrupt settings file must not stop the cockpit from starting, because the\n * cockpit is how you would fix it.\n */\n\nimport type { RemoteAccessSettings, SandboxSettings, TunnelConfig } from '../../types/remote';\n\n/** Bumped when a field changes meaning; an unrecognised version falls back to defaults. */\nexport const REMOTE_SETTINGS_VERSION = 1;\n\nconst MIN_MINUTES = 1;\nconst MAX_MINUTES = 1440;\nconst MIN_HOURS = 1;\nconst MAX_HOURS = 720;\n\n/**\n * Both time limits start off.\n *\n * The durations are still here so switching one on lands on a sensible number\n * rather than an empty field. What being off actually means: a tunnel stays up\n * until it is closed or the hub restarts, and a paired session lasts until it\n * is revoked or remote access is switched off. Those two events are the only\n * expiry there is by default.\n */\nexport const DEFAULT_REMOTE_SETTINGS: RemoteAccessSettings = {\n autoCloseEnabled: false,\n autoCloseMinutes: 60,\n sessionExpiryEnabled: false,\n idleMinutes: 30,\n absoluteHours: 12,\n tunnel: { kind: 'quick' },\n sandbox: { enabled: false, workspaces: [] },\n};\n\nexport interface ParsedRemoteSettings {\n settings: RemoteAccessSettings;\n /** Everything that had to be corrected, so the host can say so once rather than silently differ. */\n warnings: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readBoolean(raw: unknown, fallback: boolean, field: string, warnings: string[]): boolean {\n if (raw === undefined) return fallback;\n if (typeof raw !== 'boolean') {\n warnings.push(`${field} must be true or false; using ${String(fallback)}.`);\n return fallback;\n }\n return raw;\n}\n\nfunction readClamped(\n raw: unknown,\n fallback: number,\n bounds: { min: number; max: number },\n field: string,\n warnings: string[],\n): number {\n if (raw === undefined) return fallback;\n if (typeof raw !== 'number' || !Number.isFinite(raw)) {\n warnings.push(`${field} must be a number; using ${String(fallback)}.`);\n return fallback;\n }\n const clamped = Math.min(bounds.max, Math.max(bounds.min, Math.round(raw)));\n if (clamped !== raw) {\n warnings.push(\n `${field} must be between ${String(bounds.min)} and ${String(bounds.max)}; using ${String(clamped)}.`,\n );\n }\n return clamped;\n}\n\n/**\n * A tunnel configuration is only accepted whole.\n *\n * A named tunnel missing its hostname is not a named tunnel with a default, it\n * is a misconfiguration, and quietly falling back to a quick tunnel would swap\n * a stable origin for a rotating one without telling anybody.\n */\nfunction readTunnel(raw: unknown, warnings: string[]): TunnelConfig {\n if (raw === undefined) return DEFAULT_REMOTE_SETTINGS.tunnel;\n if (!isRecord(raw)) {\n warnings.push('tunnel must be an object; using a quick tunnel.');\n return { kind: 'quick' };\n }\n if (raw.kind === 'quick') return { kind: 'quick' };\n if (raw.kind !== 'named') {\n warnings.push(`tunnel.kind must be \"quick\" or \"named\"; using a quick tunnel.`);\n return { kind: 'quick' };\n }\n if (typeof raw.hostname !== 'string' || raw.hostname === '') {\n warnings.push('A named tunnel needs a hostname; using a quick tunnel.');\n return { kind: 'quick' };\n }\n return {\n kind: 'named',\n hostname: raw.hostname,\n ...(typeof raw.name === 'string' && raw.name !== '' ? { name: raw.name } : {}),\n ...(typeof raw.tokenFile === 'string' && raw.tokenFile !== '' ? { tokenFile: raw.tokenFile } : {}),\n ...(typeof raw.configFile === 'string' && raw.configFile !== '' ? { configFile: raw.configFile } : {}),\n };\n}\n\n/**\n * Reads the container settings, keeping only absolute workspace paths.\n *\n * A relative path would resolve against the container's working directory\n * rather than the host's, which is a mount that silently points somewhere else.\n * Refusing one is better than mounting the wrong directory.\n */\nfunction readSandbox(raw: unknown, warnings: string[]): SandboxSettings {\n const fallback = DEFAULT_REMOTE_SETTINGS.sandbox;\n if (raw === undefined) return fallback;\n if (!isRecord(raw)) {\n warnings.push('sandbox must be an object; the cockpit will not be contained.');\n return fallback;\n }\n const workspaces: string[] = [];\n for (const entry of Array.isArray(raw.workspaces) ? raw.workspaces : []) {\n if (typeof entry !== 'string' || !entry.startsWith('/')) {\n warnings.push(`A workspace must be an absolute path; ignoring ${String(entry)}.`);\n continue;\n }\n if (!workspaces.includes(entry)) workspaces.push(entry);\n }\n return { enabled: readBoolean(raw.enabled, fallback.enabled, 'sandbox.enabled', warnings), workspaces };\n}\n\nexport function parseRemoteAccessSettings(raw: unknown): ParsedRemoteSettings {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { settings: DEFAULT_REMOTE_SETTINGS, warnings };\n }\n if (raw.version !== REMOTE_SETTINGS_VERSION) {\n warnings.push(\n `Settings version ${String(raw.version)} is not version ${String(REMOTE_SETTINGS_VERSION)}; using defaults.`,\n );\n return { settings: DEFAULT_REMOTE_SETTINGS, warnings };\n }\n const defaults = DEFAULT_REMOTE_SETTINGS;\n return {\n settings: {\n autoCloseEnabled: readBoolean(raw.autoCloseEnabled, defaults.autoCloseEnabled, 'autoCloseEnabled', warnings),\n autoCloseMinutes: readClamped(\n raw.autoCloseMinutes,\n defaults.autoCloseMinutes,\n { min: MIN_MINUTES, max: MAX_MINUTES },\n 'autoCloseMinutes',\n warnings,\n ),\n sessionExpiryEnabled: readBoolean(\n raw.sessionExpiryEnabled,\n defaults.sessionExpiryEnabled,\n 'sessionExpiryEnabled',\n warnings,\n ),\n idleMinutes: readClamped(\n raw.idleMinutes,\n defaults.idleMinutes,\n { min: MIN_MINUTES, max: MAX_MINUTES },\n 'idleMinutes',\n warnings,\n ),\n absoluteHours: readClamped(\n raw.absoluteHours,\n defaults.absoluteHours,\n { min: MIN_HOURS, max: MAX_HOURS },\n 'absoluteHours',\n warnings,\n ),\n tunnel: readTunnel(raw.tunnel, warnings),\n sandbox: readSandbox(raw.sandbox, warnings),\n },\n warnings,\n };\n}\n\nexport function serializeRemoteAccessSettings(settings: RemoteAccessSettings): unknown {\n return { version: REMOTE_SETTINGS_VERSION, ...settings };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const MIN_MINUTES = 1;
|
|
2
|
+
const MAX_MINUTES = 1440;
|
|
3
|
+
const MIN_HOURS = 1;
|
|
4
|
+
const MAX_HOURS = 720;
|
|
5
|
+
/**
|
|
6
|
+
* Both time limits start off.
|
|
7
|
+
*
|
|
8
|
+
* The durations are still here so switching one on lands on a sensible number
|
|
9
|
+
* rather than an empty field. What being off actually means: a tunnel stays up
|
|
10
|
+
* until it is closed or the hub restarts, and a paired session lasts until it
|
|
11
|
+
* is revoked or remote access is switched off. Those two events are the only
|
|
12
|
+
* expiry there is by default.
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_REMOTE_SETTINGS = {
|
|
15
|
+
autoCloseEnabled: false,
|
|
16
|
+
autoCloseMinutes: 60,
|
|
17
|
+
sessionExpiryEnabled: false,
|
|
18
|
+
idleMinutes: 30,
|
|
19
|
+
absoluteHours: 12,
|
|
20
|
+
tunnel: { kind: "quick" },
|
|
21
|
+
sandbox: {
|
|
22
|
+
enabled: false,
|
|
23
|
+
workspaces: []
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function readBoolean(raw, fallback, field, warnings) {
|
|
30
|
+
if (raw === void 0) return fallback;
|
|
31
|
+
if (typeof raw !== "boolean") {
|
|
32
|
+
warnings.push(`${field} must be true or false; using ${String(fallback)}.`);
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
return raw;
|
|
36
|
+
}
|
|
37
|
+
function readClamped(raw, fallback, bounds, field, warnings) {
|
|
38
|
+
if (raw === void 0) return fallback;
|
|
39
|
+
if (typeof raw !== "number" || !Number.isFinite(raw)) {
|
|
40
|
+
warnings.push(`${field} must be a number; using ${String(fallback)}.`);
|
|
41
|
+
return fallback;
|
|
42
|
+
}
|
|
43
|
+
const clamped = Math.min(bounds.max, Math.max(bounds.min, Math.round(raw)));
|
|
44
|
+
if (clamped !== raw) warnings.push(`${field} must be between ${String(bounds.min)} and ${String(bounds.max)}; using ${String(clamped)}.`);
|
|
45
|
+
return clamped;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A tunnel configuration is only accepted whole.
|
|
49
|
+
*
|
|
50
|
+
* A named tunnel missing its hostname is not a named tunnel with a default, it
|
|
51
|
+
* is a misconfiguration, and quietly falling back to a quick tunnel would swap
|
|
52
|
+
* a stable origin for a rotating one without telling anybody.
|
|
53
|
+
*/
|
|
54
|
+
function readTunnel(raw, warnings) {
|
|
55
|
+
if (raw === void 0) return DEFAULT_REMOTE_SETTINGS.tunnel;
|
|
56
|
+
if (!isRecord(raw)) {
|
|
57
|
+
warnings.push("tunnel must be an object; using a quick tunnel.");
|
|
58
|
+
return { kind: "quick" };
|
|
59
|
+
}
|
|
60
|
+
if (raw.kind === "quick") return { kind: "quick" };
|
|
61
|
+
if (raw.kind !== "named") {
|
|
62
|
+
warnings.push(`tunnel.kind must be "quick" or "named"; using a quick tunnel.`);
|
|
63
|
+
return { kind: "quick" };
|
|
64
|
+
}
|
|
65
|
+
if (typeof raw.hostname !== "string" || raw.hostname === "") {
|
|
66
|
+
warnings.push("A named tunnel needs a hostname; using a quick tunnel.");
|
|
67
|
+
return { kind: "quick" };
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
kind: "named",
|
|
71
|
+
hostname: raw.hostname,
|
|
72
|
+
...typeof raw.name === "string" && raw.name !== "" ? { name: raw.name } : {},
|
|
73
|
+
...typeof raw.tokenFile === "string" && raw.tokenFile !== "" ? { tokenFile: raw.tokenFile } : {},
|
|
74
|
+
...typeof raw.configFile === "string" && raw.configFile !== "" ? { configFile: raw.configFile } : {}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the container settings, keeping only absolute workspace paths.
|
|
79
|
+
*
|
|
80
|
+
* A relative path would resolve against the container's working directory
|
|
81
|
+
* rather than the host's, which is a mount that silently points somewhere else.
|
|
82
|
+
* Refusing one is better than mounting the wrong directory.
|
|
83
|
+
*/
|
|
84
|
+
function readSandbox(raw, warnings) {
|
|
85
|
+
const fallback = DEFAULT_REMOTE_SETTINGS.sandbox;
|
|
86
|
+
if (raw === void 0) return fallback;
|
|
87
|
+
if (!isRecord(raw)) {
|
|
88
|
+
warnings.push("sandbox must be an object; the cockpit will not be contained.");
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
91
|
+
const workspaces = [];
|
|
92
|
+
for (const entry of Array.isArray(raw.workspaces) ? raw.workspaces : []) {
|
|
93
|
+
if (typeof entry !== "string" || !entry.startsWith("/")) {
|
|
94
|
+
warnings.push(`A workspace must be an absolute path; ignoring ${String(entry)}.`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!workspaces.includes(entry)) workspaces.push(entry);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
enabled: readBoolean(raw.enabled, fallback.enabled, "sandbox.enabled", warnings),
|
|
101
|
+
workspaces
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function parseRemoteAccessSettings(raw) {
|
|
105
|
+
const warnings = [];
|
|
106
|
+
if (!isRecord(raw)) return {
|
|
107
|
+
settings: DEFAULT_REMOTE_SETTINGS,
|
|
108
|
+
warnings
|
|
109
|
+
};
|
|
110
|
+
if (raw.version !== 1) {
|
|
111
|
+
warnings.push(`Settings version ${String(raw.version)} is not version ${String(1)}; using defaults.`);
|
|
112
|
+
return {
|
|
113
|
+
settings: DEFAULT_REMOTE_SETTINGS,
|
|
114
|
+
warnings
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const defaults = DEFAULT_REMOTE_SETTINGS;
|
|
118
|
+
return {
|
|
119
|
+
settings: {
|
|
120
|
+
autoCloseEnabled: readBoolean(raw.autoCloseEnabled, defaults.autoCloseEnabled, "autoCloseEnabled", warnings),
|
|
121
|
+
autoCloseMinutes: readClamped(raw.autoCloseMinutes, defaults.autoCloseMinutes, {
|
|
122
|
+
min: MIN_MINUTES,
|
|
123
|
+
max: MAX_MINUTES
|
|
124
|
+
}, "autoCloseMinutes", warnings),
|
|
125
|
+
sessionExpiryEnabled: readBoolean(raw.sessionExpiryEnabled, defaults.sessionExpiryEnabled, "sessionExpiryEnabled", warnings),
|
|
126
|
+
idleMinutes: readClamped(raw.idleMinutes, defaults.idleMinutes, {
|
|
127
|
+
min: MIN_MINUTES,
|
|
128
|
+
max: MAX_MINUTES
|
|
129
|
+
}, "idleMinutes", warnings),
|
|
130
|
+
absoluteHours: readClamped(raw.absoluteHours, defaults.absoluteHours, {
|
|
131
|
+
min: MIN_HOURS,
|
|
132
|
+
max: MAX_HOURS
|
|
133
|
+
}, "absoluteHours", warnings),
|
|
134
|
+
tunnel: readTunnel(raw.tunnel, warnings),
|
|
135
|
+
sandbox: readSandbox(raw.sandbox, warnings)
|
|
136
|
+
},
|
|
137
|
+
warnings
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function serializeRemoteAccessSettings(settings) {
|
|
141
|
+
return {
|
|
142
|
+
version: 1,
|
|
143
|
+
...settings
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { DEFAULT_REMOTE_SETTINGS, parseRemoteAccessSettings, serializeRemoteAccessSettings };
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/remoteAccessSettings/index.ts"],"sourcesContent":["/**\n * The persisted remote-access settings, and how a bad file becomes a good one.\n *\n * Every failure here is recoverable by falling back, never by throwing: a\n * corrupt settings file must not stop the cockpit from starting, because the\n * cockpit is how you would fix it.\n */\n\nimport type { RemoteAccessSettings, SandboxSettings, TunnelConfig } from '../../types/remote';\n\n/** Bumped when a field changes meaning; an unrecognised version falls back to defaults. */\nexport const REMOTE_SETTINGS_VERSION = 1;\n\nconst MIN_MINUTES = 1;\nconst MAX_MINUTES = 1440;\nconst MIN_HOURS = 1;\nconst MAX_HOURS = 720;\n\n/**\n * Both time limits start off.\n *\n * The durations are still here so switching one on lands on a sensible number\n * rather than an empty field. What being off actually means: a tunnel stays up\n * until it is closed or the hub restarts, and a paired session lasts until it\n * is revoked or remote access is switched off. Those two events are the only\n * expiry there is by default.\n */\nexport const DEFAULT_REMOTE_SETTINGS: RemoteAccessSettings = {\n autoCloseEnabled: false,\n autoCloseMinutes: 60,\n sessionExpiryEnabled: false,\n idleMinutes: 30,\n absoluteHours: 12,\n tunnel: { kind: 'quick' },\n sandbox: { enabled: false, workspaces: [] },\n};\n\nexport interface ParsedRemoteSettings {\n settings: RemoteAccessSettings;\n /** Everything that had to be corrected, so the host can say so once rather than silently differ. */\n warnings: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readBoolean(raw: unknown, fallback: boolean, field: string, warnings: string[]): boolean {\n if (raw === undefined) return fallback;\n if (typeof raw !== 'boolean') {\n warnings.push(`${field} must be true or false; using ${String(fallback)}.`);\n return fallback;\n }\n return raw;\n}\n\nfunction readClamped(\n raw: unknown,\n fallback: number,\n bounds: { min: number; max: number },\n field: string,\n warnings: string[],\n): number {\n if (raw === undefined) return fallback;\n if (typeof raw !== 'number' || !Number.isFinite(raw)) {\n warnings.push(`${field} must be a number; using ${String(fallback)}.`);\n return fallback;\n }\n const clamped = Math.min(bounds.max, Math.max(bounds.min, Math.round(raw)));\n if (clamped !== raw) {\n warnings.push(\n `${field} must be between ${String(bounds.min)} and ${String(bounds.max)}; using ${String(clamped)}.`,\n );\n }\n return clamped;\n}\n\n/**\n * A tunnel configuration is only accepted whole.\n *\n * A named tunnel missing its hostname is not a named tunnel with a default, it\n * is a misconfiguration, and quietly falling back to a quick tunnel would swap\n * a stable origin for a rotating one without telling anybody.\n */\nfunction readTunnel(raw: unknown, warnings: string[]): TunnelConfig {\n if (raw === undefined) return DEFAULT_REMOTE_SETTINGS.tunnel;\n if (!isRecord(raw)) {\n warnings.push('tunnel must be an object; using a quick tunnel.');\n return { kind: 'quick' };\n }\n if (raw.kind === 'quick') return { kind: 'quick' };\n if (raw.kind !== 'named') {\n warnings.push(`tunnel.kind must be \"quick\" or \"named\"; using a quick tunnel.`);\n return { kind: 'quick' };\n }\n if (typeof raw.hostname !== 'string' || raw.hostname === '') {\n warnings.push('A named tunnel needs a hostname; using a quick tunnel.');\n return { kind: 'quick' };\n }\n return {\n kind: 'named',\n hostname: raw.hostname,\n ...(typeof raw.name === 'string' && raw.name !== '' ? { name: raw.name } : {}),\n ...(typeof raw.tokenFile === 'string' && raw.tokenFile !== '' ? { tokenFile: raw.tokenFile } : {}),\n ...(typeof raw.configFile === 'string' && raw.configFile !== '' ? { configFile: raw.configFile } : {}),\n };\n}\n\n/**\n * Reads the container settings, keeping only absolute workspace paths.\n *\n * A relative path would resolve against the container's working directory\n * rather than the host's, which is a mount that silently points somewhere else.\n * Refusing one is better than mounting the wrong directory.\n */\nfunction readSandbox(raw: unknown, warnings: string[]): SandboxSettings {\n const fallback = DEFAULT_REMOTE_SETTINGS.sandbox;\n if (raw === undefined) return fallback;\n if (!isRecord(raw)) {\n warnings.push('sandbox must be an object; the cockpit will not be contained.');\n return fallback;\n }\n const workspaces: string[] = [];\n for (const entry of Array.isArray(raw.workspaces) ? raw.workspaces : []) {\n if (typeof entry !== 'string' || !entry.startsWith('/')) {\n warnings.push(`A workspace must be an absolute path; ignoring ${String(entry)}.`);\n continue;\n }\n if (!workspaces.includes(entry)) workspaces.push(entry);\n }\n return { enabled: readBoolean(raw.enabled, fallback.enabled, 'sandbox.enabled', warnings), workspaces };\n}\n\nexport function parseRemoteAccessSettings(raw: unknown): ParsedRemoteSettings {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { settings: DEFAULT_REMOTE_SETTINGS, warnings };\n }\n if (raw.version !== REMOTE_SETTINGS_VERSION) {\n warnings.push(\n `Settings version ${String(raw.version)} is not version ${String(REMOTE_SETTINGS_VERSION)}; using defaults.`,\n );\n return { settings: DEFAULT_REMOTE_SETTINGS, warnings };\n }\n const defaults = DEFAULT_REMOTE_SETTINGS;\n return {\n settings: {\n autoCloseEnabled: readBoolean(raw.autoCloseEnabled, defaults.autoCloseEnabled, 'autoCloseEnabled', warnings),\n autoCloseMinutes: readClamped(\n raw.autoCloseMinutes,\n defaults.autoCloseMinutes,\n { min: MIN_MINUTES, max: MAX_MINUTES },\n 'autoCloseMinutes',\n warnings,\n ),\n sessionExpiryEnabled: readBoolean(\n raw.sessionExpiryEnabled,\n defaults.sessionExpiryEnabled,\n 'sessionExpiryEnabled',\n warnings,\n ),\n idleMinutes: readClamped(\n raw.idleMinutes,\n defaults.idleMinutes,\n { min: MIN_MINUTES, max: MAX_MINUTES },\n 'idleMinutes',\n warnings,\n ),\n absoluteHours: readClamped(\n raw.absoluteHours,\n defaults.absoluteHours,\n { min: MIN_HOURS, max: MAX_HOURS },\n 'absoluteHours',\n warnings,\n ),\n tunnel: readTunnel(raw.tunnel, warnings),\n sandbox: readSandbox(raw.sandbox, warnings),\n },\n warnings,\n };\n}\n\nexport function serializeRemoteAccessSettings(settings: RemoteAccessSettings): unknown {\n return { version: REMOTE_SETTINGS_VERSION, ...settings };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_runtimePiSettings = require("../../../runtimePiSettings.cjs");
|
|
3
|
+
require("../../constants/remote.cjs");
|
|
4
|
+
const require_index = require("../remoteAccessSettings/index.cjs");
|
|
5
|
+
let node_fs = require("node:fs");
|
|
6
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
7
|
+
let node_os = require("node:os");
|
|
8
|
+
node_os = require_runtime.__toESM(node_os, 1);
|
|
9
|
+
let node_path = require("node:path");
|
|
10
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
11
|
+
//#region src/services/remoteAccessStore/index.ts
|
|
12
|
+
/** Where the cockpit keeps machine-local state; `po sync` already writes its bundle here. */
|
|
13
|
+
const STATE_DIRECTORY = "web";
|
|
14
|
+
const SETTINGS_FILE = "remote-access.json";
|
|
15
|
+
const CREDENTIALS_FILE = "credentials.json";
|
|
16
|
+
const TRUSTED_DEVICES_FILE = "trusted-devices.json";
|
|
17
|
+
const TRUSTED_DEVICE_PLATFORMS = /* @__PURE__ */ new Set(["ios", "android"]);
|
|
18
|
+
const STORED_ID = /^[A-Za-z0-9_-]{1,64}$/u;
|
|
19
|
+
const STORED_KEY = /^[A-Za-z0-9_-]{1,512}$/u;
|
|
20
|
+
const MAX_STORED_LABEL = 200;
|
|
21
|
+
const DIRECTORY_MODE = 448;
|
|
22
|
+
const FILE_MODE = 384;
|
|
23
|
+
/** Any bit set for group or other; a state file readable by another account is worth repairing. */
|
|
24
|
+
const LOOSE_MODE_MASK = 63;
|
|
25
|
+
function defaultRemoteStateDir(homeDir = node_os.default.homedir()) {
|
|
26
|
+
return node_path.default.join(require_runtimePiSettings.poHomeDirectory(homeDir), STATE_DIRECTORY);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Repairs a state file another account can read.
|
|
30
|
+
*
|
|
31
|
+
* Cheap, and it catches the cases a fresh write never would: a file restored
|
|
32
|
+
* from a backup, copied with a permissive umask, or checked out of somewhere it
|
|
33
|
+
* should not have been.
|
|
34
|
+
*/
|
|
35
|
+
function tightenMode(filePath, notice) {
|
|
36
|
+
try {
|
|
37
|
+
if ((node_fs.default.statSync(filePath).mode & LOOSE_MODE_MASK) === 0) return;
|
|
38
|
+
node_fs.default.chmodSync(filePath, FILE_MODE);
|
|
39
|
+
notice(`tightened permissions on ${filePath}`);
|
|
40
|
+
} catch {}
|
|
41
|
+
}
|
|
42
|
+
/** Whether one parsed entry is a complete trusted-device record; anything else is dropped. */
|
|
43
|
+
function isTrustedDeviceRecord(value) {
|
|
44
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
45
|
+
const record = value;
|
|
46
|
+
return typeof record.id === "string" && STORED_ID.test(record.id) && typeof record.identityPublicKey === "string" && STORED_KEY.test(record.identityPublicKey) && typeof record.stepUpPublicKey === "string" && STORED_KEY.test(record.stepUpPublicKey) && record.identityPublicKey !== record.stepUpPublicKey && typeof record.label === "string" && record.label.length <= MAX_STORED_LABEL && typeof record.platform === "string" && TRUSTED_DEVICE_PLATFORMS.has(record.platform) && Number.isFinite(record.createdAt) && Number.isFinite(record.lastSeenAt);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Settings and passkeys on disk. Sessions deliberately not.
|
|
50
|
+
*
|
|
51
|
+
* A session is revoked when remote access is switched off, and a hub restart is
|
|
52
|
+
* a switch-off, so persisting one would buy nothing while creating a bearer
|
|
53
|
+
* secret worth stealing. A passkey is the opposite: surviving is its whole
|
|
54
|
+
* point, and what is stored is a public key.
|
|
55
|
+
*/
|
|
56
|
+
function createRemoteAccessStore(options = {}) {
|
|
57
|
+
const directory = options.stateDir ?? defaultRemoteStateDir();
|
|
58
|
+
const notice = options.onNotice ?? (() => {});
|
|
59
|
+
const settingsPath = node_path.default.join(directory, SETTINGS_FILE);
|
|
60
|
+
const credentialsPath = node_path.default.join(directory, CREDENTIALS_FILE);
|
|
61
|
+
const trustedDevicesPath = node_path.default.join(directory, TRUSTED_DEVICES_FILE);
|
|
62
|
+
let current = load();
|
|
63
|
+
let registered = loadCredentials();
|
|
64
|
+
let trusted = loadTrustedDevices();
|
|
65
|
+
function load() {
|
|
66
|
+
let raw;
|
|
67
|
+
try {
|
|
68
|
+
raw = node_fs.default.readFileSync(settingsPath, "utf8");
|
|
69
|
+
} catch {
|
|
70
|
+
return require_index.DEFAULT_REMOTE_SETTINGS;
|
|
71
|
+
}
|
|
72
|
+
tightenMode(settingsPath, notice);
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = JSON.parse(raw);
|
|
76
|
+
} catch {
|
|
77
|
+
notice(`remote access settings at ${settingsPath} are not valid JSON; using defaults`);
|
|
78
|
+
return require_index.DEFAULT_REMOTE_SETTINGS;
|
|
79
|
+
}
|
|
80
|
+
const outcome = require_index.parseRemoteAccessSettings(parsed);
|
|
81
|
+
for (const warning of outcome.warnings) notice(`remote access settings: ${warning}`);
|
|
82
|
+
return outcome.settings;
|
|
83
|
+
}
|
|
84
|
+
function loadCredentials() {
|
|
85
|
+
let raw;
|
|
86
|
+
try {
|
|
87
|
+
raw = node_fs.default.readFileSync(credentialsPath, "utf8");
|
|
88
|
+
} catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
tightenMode(credentialsPath, notice);
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
95
|
+
} catch {
|
|
96
|
+
notice(`registered passkeys at ${credentialsPath} are not valid JSON; none will load`);
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function loadTrustedDevices() {
|
|
101
|
+
let raw;
|
|
102
|
+
try {
|
|
103
|
+
raw = node_fs.default.readFileSync(trustedDevicesPath, "utf8");
|
|
104
|
+
} catch {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
tightenMode(trustedDevicesPath, notice);
|
|
108
|
+
let parsed;
|
|
109
|
+
try {
|
|
110
|
+
parsed = JSON.parse(raw);
|
|
111
|
+
} catch {
|
|
112
|
+
notice(`trusted devices at ${trustedDevicesPath} are not valid JSON; none will load`);
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
if (!Array.isArray(parsed)) {
|
|
116
|
+
notice(`trusted devices at ${trustedDevicesPath} are not a list; none will load`);
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const loaded = [];
|
|
120
|
+
for (const entry of parsed) {
|
|
121
|
+
if (!isTrustedDeviceRecord(entry) || loaded.some((held) => held.id === entry.id)) {
|
|
122
|
+
notice(`dropped an invalid trusted device record from ${trustedDevicesPath}`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (loaded.length >= 32) {
|
|
126
|
+
notice(`dropped trusted devices beyond the limit of ${String(32)} from ${trustedDevicesPath}`);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
loaded.push({
|
|
130
|
+
id: entry.id,
|
|
131
|
+
identityPublicKey: entry.identityPublicKey,
|
|
132
|
+
stepUpPublicKey: entry.stepUpPublicKey,
|
|
133
|
+
label: entry.label,
|
|
134
|
+
platform: entry.platform,
|
|
135
|
+
createdAt: entry.createdAt,
|
|
136
|
+
lastSeenAt: entry.lastSeenAt
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return loaded;
|
|
140
|
+
}
|
|
141
|
+
function writeJson(target, body) {
|
|
142
|
+
const temporary = `${target}.${String(process.pid)}.tmp`;
|
|
143
|
+
try {
|
|
144
|
+
node_fs.default.mkdirSync(directory, {
|
|
145
|
+
recursive: true,
|
|
146
|
+
mode: DIRECTORY_MODE
|
|
147
|
+
});
|
|
148
|
+
node_fs.default.writeFileSync(temporary, `${JSON.stringify(body, void 0, 2)}\n`, { mode: FILE_MODE });
|
|
149
|
+
node_fs.default.renameSync(temporary, target);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
notice(`${target} could not be saved: ${error instanceof Error ? error.message : String(error)}`);
|
|
152
|
+
try {
|
|
153
|
+
node_fs.default.rmSync(temporary, { force: true });
|
|
154
|
+
} catch {}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
directory,
|
|
159
|
+
settings: () => current,
|
|
160
|
+
credentials: () => registered,
|
|
161
|
+
saveCredential(credential) {
|
|
162
|
+
registered = [...registered.filter((held) => held.id !== credential.id), credential];
|
|
163
|
+
writeJson(credentialsPath, registered);
|
|
164
|
+
},
|
|
165
|
+
removeCredential(id) {
|
|
166
|
+
const next = registered.filter((held) => held.id !== id);
|
|
167
|
+
if (next.length === registered.length) return false;
|
|
168
|
+
registered = next;
|
|
169
|
+
writeJson(credentialsPath, registered);
|
|
170
|
+
return true;
|
|
171
|
+
},
|
|
172
|
+
trustedDevices: () => trusted,
|
|
173
|
+
saveTrustedDevice(record) {
|
|
174
|
+
const others = trusted.filter((held) => held.id !== record.id);
|
|
175
|
+
if (others.length === trusted.length && trusted.length >= 32) return false;
|
|
176
|
+
trusted = [...others, record];
|
|
177
|
+
writeJson(trustedDevicesPath, trusted);
|
|
178
|
+
return true;
|
|
179
|
+
},
|
|
180
|
+
removeTrustedDevice(id) {
|
|
181
|
+
const next = trusted.filter((held) => held.id !== id);
|
|
182
|
+
if (next.length === trusted.length) return false;
|
|
183
|
+
trusted = next;
|
|
184
|
+
writeJson(trustedDevicesPath, trusted);
|
|
185
|
+
return true;
|
|
186
|
+
},
|
|
187
|
+
save(settings) {
|
|
188
|
+
current = settings;
|
|
189
|
+
writeJson(settingsPath, require_index.serializeRemoteAccessSettings(settings));
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
exports.createRemoteAccessStore = createRemoteAccessStore;
|
|
195
|
+
exports.defaultRemoteStateDir = defaultRemoteStateDir;
|
|
196
|
+
|
|
197
|
+
//# sourceMappingURL=index.cjs.map
|