@cats-inc/cats-platform 0.1.21 → 0.3.4
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/.env.example +3 -7
- package/README.md +35 -0
- package/build/desktop/bootstrapNavigation.d.ts.map +1 -1
- package/build/desktop/bootstrapNavigation.js +6 -13
- package/build/desktop/bootstrapNavigation.js.map +1 -1
- package/build/desktop/bootstrapPage.d.ts.map +1 -1
- package/build/desktop/bootstrapPage.js +63 -86
- package/build/desktop/bootstrapPage.js.map +1 -1
- package/build/desktop/cliInventoryProbe.d.ts +11 -2
- package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
- package/build/desktop/cliInventoryProbe.js +19 -13
- package/build/desktop/cliInventoryProbe.js.map +1 -1
- package/build/desktop/config.d.ts +0 -4
- package/build/desktop/config.d.ts.map +1 -1
- package/build/desktop/config.js +1 -6
- package/build/desktop/config.js.map +1 -1
- package/build/desktop/contracts.d.ts +12 -2
- package/build/desktop/contracts.d.ts.map +1 -1
- package/build/desktop/contracts.js +1 -2
- package/build/desktop/contracts.js.map +1 -1
- package/build/desktop/hostVersion.d.ts.map +1 -1
- package/build/desktop/hostVersion.js +3 -5
- package/build/desktop/hostVersion.js.map +1 -1
- package/build/desktop/main.js +205 -256
- package/build/desktop/main.js.map +1 -1
- package/build/desktop/packaging.d.ts +2 -0
- package/build/desktop/packaging.d.ts.map +1 -1
- package/build/desktop/packaging.js +34 -14
- package/build/desktop/packaging.js.map +1 -1
- package/build/desktop/preload.cjs +9 -0
- package/build/desktop/preload.cjs.map +1 -1
- package/build/desktop/processSupervisor.d.ts.map +1 -1
- package/build/desktop/processSupervisor.js +3 -0
- package/build/desktop/processSupervisor.js.map +1 -1
- package/build/desktop/providerManager.d.ts +46 -0
- package/build/desktop/providerManager.d.ts.map +1 -0
- package/build/desktop/providerManager.js +220 -0
- package/build/desktop/providerManager.js.map +1 -0
- package/build/desktop/providerSelection.d.ts +38 -0
- package/build/desktop/providerSelection.d.ts.map +1 -0
- package/build/desktop/providerSelection.js +118 -0
- package/build/desktop/providerSelection.js.map +1 -0
- package/build/desktop/readiness.d.ts +2 -0
- package/build/desktop/readiness.d.ts.map +1 -1
- package/build/desktop/readiness.js +14 -33
- package/build/desktop/readiness.js.map +1 -1
- package/build/desktop/setupAssets.d.ts.map +1 -1
- package/build/desktop/setupAssets.js +28 -14
- package/build/desktop/setupAssets.js.map +1 -1
- package/build/desktop/setupAudit.d.ts +4 -3
- package/build/desktop/setupAudit.d.ts.map +1 -1
- package/build/desktop/setupAudit.js +18 -34
- package/build/desktop/setupAudit.js.map +1 -1
- package/build/desktop/setupBridge.js +1 -1
- package/build/desktop/setupBridge.js.map +1 -1
- package/build/desktop/setupPrerequisites.d.ts +11 -0
- package/build/desktop/setupPrerequisites.d.ts.map +1 -0
- package/build/desktop/setupPrerequisites.js +47 -0
- package/build/desktop/setupPrerequisites.js.map +1 -0
- package/build/desktop/updateDialog.d.ts +27 -1
- package/build/desktop/updateDialog.d.ts.map +1 -1
- package/build/desktop/updateDialog.js +85 -5
- package/build/desktop/updateDialog.js.map +1 -1
- package/build/renderer/assets/ActiveSessionPermissionChip-B49WcZBJ.js +1 -0
- package/build/renderer/assets/App-BpxZB5ym.js +2 -0
- package/build/renderer/assets/App-DYTUfAl6.js +1 -0
- package/build/renderer/assets/App-DxsV-tKS.css +1 -0
- package/build/renderer/assets/{App-DKOSn0o_.js → App-boB4WrmU.js} +1 -1
- package/build/renderer/assets/WorkspaceAppRoutes-CPqz85iw.js +1 -0
- package/build/renderer/assets/app-C52wwCGz.js +85 -0
- package/build/renderer/assets/app-CqnsY5ed.css +1 -0
- package/build/renderer/assets/{client-BdGHAUoK.js → client-DREGSZqQ.js} +1 -1
- package/build/renderer/assets/conversationSidebarRecentEntries-DK0iWS73.js +6 -0
- package/build/renderer/assets/{screenshotOverlay-DfBcolX-.js → screenshotOverlay-EF07cXvw.js} +1 -1
- package/build/renderer/assets/{useDraftSessionChips-DCIId0eY.js → useDraftSessionChips-BdZ_B1gy.js} +1 -1
- package/build/renderer/desktop/overlay/index.html +2 -2
- package/build/renderer/index.html +3 -3
- package/build/server/app/renderer/auth/api.d.ts.map +1 -1
- package/build/server/app/renderer/auth/api.js +4 -1
- package/build/server/app/renderer/auth/api.js.map +1 -1
- package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerCatalogClient.js +34 -12
- package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
- package/build/server/app/renderer/providerClientInvalidation.d.ts +6 -0
- package/build/server/app/renderer/providerClientInvalidation.d.ts.map +1 -0
- package/build/server/app/renderer/providerClientInvalidation.js +12 -0
- package/build/server/app/renderer/providerClientInvalidation.js.map +1 -0
- package/build/server/app/renderer/providerReadLoop.d.ts +5 -0
- package/build/server/app/renderer/providerReadLoop.d.ts.map +1 -0
- package/build/server/app/renderer/providerReadLoop.js +52 -0
- package/build/server/app/renderer/providerReadLoop.js.map +1 -0
- package/build/server/app/renderer/providerRegistryClient.d.ts +3 -2
- package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerRegistryClient.js +51 -53
- package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
- package/build/server/app/server/appPackageRoutes.d.ts +2 -0
- package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
- package/build/server/app/server/appPackageRoutes.js +105 -0
- package/build/server/app/server/appPackageRoutes.js.map +1 -1
- package/build/server/app/server/authGatePolicy.js +14 -1
- package/build/server/app/server/authGatePolicy.js.map +1 -1
- package/build/server/app/server/contracts.d.ts +15 -0
- package/build/server/app/server/contracts.d.ts.map +1 -1
- package/build/server/app/server/dependencies.d.ts.map +1 -1
- package/build/server/app/server/dependencies.js +42 -1
- package/build/server/app/server/dependencies.js.map +1 -1
- package/build/server/app/server/goldenPathStartupResume.d.ts +55 -0
- package/build/server/app/server/goldenPathStartupResume.d.ts.map +1 -0
- package/build/server/app/server/goldenPathStartupResume.js +109 -0
- package/build/server/app/server/goldenPathStartupResume.js.map +1 -0
- package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
- package/build/server/app/server/platformSetupRoutes.js +1 -13
- package/build/server/app/server/platformSetupRoutes.js.map +1 -1
- package/build/server/app/server/polling.d.ts.map +1 -1
- package/build/server/app/server/polling.js +2 -0
- package/build/server/app/server/polling.js.map +1 -1
- package/build/server/app/server/requestRouter.d.ts.map +1 -1
- package/build/server/app/server/requestRouter.js +30 -0
- package/build/server/app/server/requestRouter.js.map +1 -1
- package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
- package/build/server/app/server/runtimeSurfaceProxy.js +4 -2
- package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
- package/build/server/app/server/startupRecovery.d.ts.map +1 -1
- package/build/server/app/server/startupRecovery.js +5 -0
- package/build/server/app/server/startupRecovery.js.map +1 -1
- package/build/server/app/server/subscribeRoutes.d.ts.map +1 -1
- package/build/server/app/server/subscribeRoutes.js +5 -3
- package/build/server/app/server/subscribeRoutes.js.map +1 -1
- package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
- package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
- package/build/server/app/server/telegramCommandSurface.js +123 -0
- package/build/server/app/server/telegramCommandSurface.js.map +1 -0
- package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
- package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
- package/build/server/app/server/transportWorkGoldenPath.js +307 -0
- package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
- package/build/server/config.d.ts +21 -0
- package/build/server/config.d.ts.map +1 -1
- package/build/server/config.js +12 -0
- package/build/server/config.js.map +1 -1
- package/build/server/design/components/providerModelFieldsSupport.d.ts +5 -24
- package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
- package/build/server/design/components/providerModelFieldsSupport.js +65 -70
- package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
- package/build/server/design/components/useProviderCatalogState.d.ts +2 -2
- package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
- package/build/server/design/components/useProviderCatalogState.js +71 -151
- package/build/server/design/components/useProviderCatalogState.js.map +1 -1
- package/build/server/design/components/useProviderModelFieldActions.js +2 -2
- package/build/server/design/components/useProviderModelFieldActions.js.map +1 -1
- package/build/server/design/components/useProviderRegistryState.d.ts +1 -7
- package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
- package/build/server/design/components/useProviderRegistryState.js +41 -104
- package/build/server/design/components/useProviderRegistryState.js.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.d.ts +1 -0
- package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.js +3 -2
- package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
- package/build/server/index.js +4 -0
- package/build/server/index.js.map +1 -1
- package/build/server/platform/apps/packageInstaller.d.ts +19 -0
- package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
- package/build/server/platform/apps/packageInstaller.js +92 -0
- package/build/server/platform/apps/packageInstaller.js.map +1 -0
- package/build/server/platform/apps/registry.d.ts +6 -0
- package/build/server/platform/apps/registry.d.ts.map +1 -1
- package/build/server/platform/apps/registry.js +24 -0
- package/build/server/platform/apps/registry.js.map +1 -1
- package/build/server/platform/apps/renderer.d.ts +6 -0
- package/build/server/platform/apps/renderer.d.ts.map +1 -0
- package/build/server/platform/apps/renderer.js +18 -0
- package/build/server/platform/apps/renderer.js.map +1 -0
- package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts +2 -1
- package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts.map +1 -1
- package/build/server/platform/orchestration/entitySubscriptions/channel.js +3 -18
- package/build/server/platform/orchestration/entitySubscriptions/channel.js.map +1 -1
- package/build/server/platform/orchestration/entitySubscriptions/index.d.ts +1 -0
- package/build/server/platform/orchestration/entitySubscriptions/index.d.ts.map +1 -1
- package/build/server/platform/orchestration/entitySubscriptions/index.js.map +1 -1
- package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
- package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
- package/build/server/platform/runtime/deliveryClient.js +289 -0
- package/build/server/platform/runtime/deliveryClient.js.map +1 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
- package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
- package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
- package/build/server/platform/supervision/runtimeBoundary.js +2 -2
- package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
- package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
- package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/bridge.js +176 -0
- package/build/server/platform/transports/telegram/bridge.js.map +1 -1
- package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
- package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
- package/build/server/platform/transports/telegram/commandPort.js +17 -0
- package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
- package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
- package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
- package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/commands/index.js +38 -0
- package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
- package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
- package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
- package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
- package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
- package/build/server/platform/transports/telegram/polling.d.ts +34 -0
- package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/polling.js +86 -9
- package/build/server/platform/transports/telegram/polling.js.map +1 -1
- package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
- package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/relay/index.js +5 -1
- package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
- package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
- package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
- package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
- package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
- package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
- package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/contracts.js +26 -0
- package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
- package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
- package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/outbox.js +270 -0
- package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
- package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
- package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/port.js +15 -0
- package/build/server/platform/transports/work-delivery/port.js.map +1 -0
- package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
- package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/proposal.js +59 -0
- package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
- package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
- package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/readiness.js +123 -0
- package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
- package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
- package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
- package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
- package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
- package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
- package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
- package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
- package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
- package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
- package/build/server/products/chat/api/contracts.d.ts +10 -0
- package/build/server/products/chat/api/contracts.d.ts.map +1 -1
- package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
- package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
- package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
- package/build/server/products/chat/api/routeSupport.d.ts +17 -1
- package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
- package/build/server/products/chat/api/routeSupport.js +27 -4
- package/build/server/products/chat/api/routeSupport.js.map +1 -1
- package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
- package/build/server/products/chat/api/setupRoutes.js +23 -8
- package/build/server/products/chat/api/setupRoutes.js.map +1 -1
- package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
- package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
- package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
- package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
- package/build/server/products/chat/state/model/index.d.ts +1 -1
- package/build/server/products/chat/state/model/index.d.ts.map +1 -1
- package/build/server/products/chat/state/model/index.js +1 -1
- package/build/server/products/chat/state/model/index.js.map +1 -1
- package/build/server/products/chat/state/model/readModels.d.ts +1 -0
- package/build/server/products/chat/state/model/readModels.d.ts.map +1 -1
- package/build/server/products/chat/state/model/readModels.js +2 -1
- package/build/server/products/chat/state/model/readModels.js.map +1 -1
- package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
- package/build/server/products/code/api/relayRoutes.js +36 -7
- package/build/server/products/code/api/relayRoutes.js.map +1 -1
- package/build/server/products/code/state/relayState.d.ts +2 -1
- package/build/server/products/code/state/relayState.d.ts.map +1 -1
- package/build/server/products/code/state/relayState.js +7 -7
- package/build/server/products/code/state/relayState.js.map +1 -1
- package/build/server/products/shared/api/workspaceContracts.d.ts +5 -0
- package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
- package/build/server/products/shared/renderer/api/appShell.d.ts +1 -0
- package/build/server/products/shared/renderer/api/appShell.d.ts.map +1 -1
- package/build/server/products/shared/renderer/api/appShell.js +9 -0
- package/build/server/products/shared/renderer/api/appShell.js.map +1 -1
- package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
- package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
- package/build/server/products/work/api/goldenPathProjection.js +252 -0
- package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
- package/build/server/products/work/api/index.d.ts +54 -1
- package/build/server/products/work/api/index.d.ts.map +1 -1
- package/build/server/products/work/api/index.js +182 -4
- package/build/server/products/work/api/index.js.map +1 -1
- package/build/server/products/work/api/projection.d.ts +7 -1
- package/build/server/products/work/api/projection.d.ts.map +1 -1
- package/build/server/products/work/api/projection.js +7 -1
- package/build/server/products/work/api/projection.js.map +1 -1
- package/build/server/products/work/shared/apiPaths.d.ts +8 -0
- package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
- package/build/server/products/work/shared/apiPaths.js +8 -0
- package/build/server/products/work/shared/apiPaths.js.map +1 -1
- package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
- package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
- package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
- package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
- package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
- package/build/server/products/work/state/workCompletionEvidence.js +59 -0
- package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
- package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
- package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
- package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
- package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
- package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
- package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
- package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
- package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
- package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
- package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
- package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
- package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
- package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
- package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathService.js +1057 -0
- package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
- package/build/server/runtime/client.d.ts +13 -0
- package/build/server/runtime/client.d.ts.map +1 -1
- package/build/server/runtime/client.js +44 -1
- package/build/server/runtime/client.js.map +1 -1
- package/build/server/runtime/setup.d.ts +14 -4
- package/build/server/runtime/setup.d.ts.map +1 -1
- package/build/server/runtime/setup.js +17 -19
- package/build/server/runtime/setup.js.map +1 -1
- package/build/server/runtime/usageSnapshot.d.ts +3 -0
- package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
- package/build/server/runtime/usageSnapshot.js +69 -0
- package/build/server/runtime/usageSnapshot.js.map +1 -0
- package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
- package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
- package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
- package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
- package/build/server/server/routes/providers.d.ts.map +1 -1
- package/build/server/server/routes/providers.js +133 -131
- package/build/server/server/routes/providers.js.map +1 -1
- package/build/server/server/routes/telegram.d.ts +9 -0
- package/build/server/server/routes/telegram.d.ts.map +1 -1
- package/build/server/server/routes/telegram.js +79 -72
- package/build/server/server/routes/telegram.js.map +1 -1
- package/build/server/shared/catsAppManifest.d.ts +3 -1
- package/build/server/shared/catsAppManifest.d.ts.map +1 -1
- package/build/server/shared/catsAppManifest.js +2 -0
- package/build/server/shared/catsAppManifest.js.map +1 -1
- package/build/server/shared/desktopRecoveryBridge.d.ts +2 -1
- package/build/server/shared/desktopRecoveryBridge.d.ts.map +1 -1
- package/build/server/shared/desktopRecoveryBridge.js.map +1 -1
- package/build/server/shared/executionLabel.d.ts.map +1 -1
- package/build/server/shared/executionLabel.js +8 -1
- package/build/server/shared/executionLabel.js.map +1 -1
- package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
- package/build/server/shared/i18n/catalogs/en.js +198 -3
- package/build/server/shared/i18n/catalogs/en.js.map +1 -1
- package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/build/server/shared/i18n/catalogs/zh-TW.js +197 -3
- package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
- package/build/server/shared/i18n/index.d.ts +192 -0
- package/build/server/shared/i18n/index.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.d.ts +192 -0
- package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.js +192 -0
- package/build/server/shared/i18n/messageKeys.js.map +1 -1
- package/build/server/shared/platformSetupOperation.d.ts +2 -0
- package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
- package/build/server/shared/platformSetupOperation.js +9 -0
- package/build/server/shared/platformSetupOperation.js.map +1 -0
- package/build/server/shared/providerCatalog.d.ts +5 -2
- package/build/server/shared/providerCatalog.d.ts.map +1 -1
- package/build/server/shared/providerCatalog.js +6 -0
- package/build/server/shared/providerCatalog.js.map +1 -1
- package/build/server/shared/providerCatalogData.d.ts +154 -77
- package/build/server/shared/providerCatalogData.d.ts.map +1 -1
- package/build/server/shared/providerCatalogData.js +73 -36
- package/build/server/shared/providerCatalogData.js.map +1 -1
- package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
- package/build/server/shared/providerCatalogInstances.js +3 -0
- package/build/server/shared/providerCatalogInstances.js.map +1 -1
- package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
- package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
- package/build/server/shared/providerModelLabelRegistry.js +49 -0
- package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
- package/build/server/shared/providerRegistryWarnings.d.ts +4 -0
- package/build/server/shared/providerRegistryWarnings.d.ts.map +1 -1
- package/build/server/shared/providerRegistryWarnings.js +7 -0
- package/build/server/shared/providerRegistryWarnings.js.map +1 -1
- package/build/server/shared/providerSelection.d.ts.map +1 -1
- package/build/server/shared/providerSelection.js +10 -13
- package/build/server/shared/providerSelection.js.map +1 -1
- package/build/server/shared/runtimeSetup.d.ts +17 -4
- package/build/server/shared/runtimeSetup.d.ts.map +1 -1
- package/build/server/shared/runtimeStatusPresentation.js +1 -1
- package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
- package/package.json +32 -3
- package/packages/app-sdk/browser.d.ts +51 -0
- package/packages/app-sdk/browser.js +48 -0
- package/packages/app-sdk/package.d.ts +14 -0
- package/packages/app-sdk/package.js +131 -0
- package/packages/app-sdk/package.json +7 -0
- package/packages/provider-setup/manager.d.ts +79 -0
- package/packages/provider-setup/manager.js +441 -0
- package/scripts/README.md +66 -26
- package/scripts/build-desktop-installer.mjs +139 -16
- package/scripts/build-test-ui.mjs +1 -1
- package/scripts/bundle-server.mjs +23 -10
- package/scripts/linux/build-desktop-package.sh +6 -6
- package/scripts/linux/install-antigravity.sh +0 -0
- package/scripts/linux/install-devin.sh +0 -0
- package/scripts/linux/install-github-cli.sh +5 -0
- package/scripts/linux/install-meta-cli.sh +8 -0
- package/scripts/linux/install-node.sh +9 -3
- package/scripts/linux/node-cli-common.sh +87 -48
- package/scripts/linux/provider-cli-common.sh +178 -130
- package/scripts/linux/provider-version-common.sh +247 -0
- package/scripts/linux/sync-agent-skills.sh +27 -5
- package/scripts/linux/test-linux-package-smoke.sh +6 -3
- package/scripts/linux/upgrade-cli-tools.sh +1 -1
- package/scripts/linux/verified-npm-update.sh +20 -0
- package/scripts/macos/build-desktop-package.sh +5 -5
- package/scripts/macos/install-antigravity.sh +0 -0
- package/scripts/macos/install-devin.sh +0 -0
- package/scripts/macos/install-github-cli.sh +5 -0
- package/scripts/macos/install-meta-cli.sh +8 -0
- package/scripts/macos/install-node.sh +9 -3
- package/scripts/macos/node-cli-common.sh +87 -48
- package/scripts/macos/provider-cli-common.sh +178 -130
- package/scripts/macos/provider-version-common.sh +247 -0
- package/scripts/macos/sync-agent-skills.sh +27 -5
- package/scripts/macos/test-macos-package-smoke.sh +6 -3
- package/scripts/macos/upgrade-cli-tools.sh +1 -1
- package/scripts/macos/verified-npm-update.sh +20 -0
- package/scripts/package-desktop.mjs +15 -2
- package/scripts/testing/check-usage-app.mts +266 -0
- package/scripts/testing/conversation-navigation-smoke-electron.cjs +134 -0
- package/scripts/testing/conversation-navigation-smoke-renderer.tsx +102 -0
- package/scripts/testing/conversation-navigation-smoke.mjs +67 -0
- package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
- package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
- package/scripts/validate-release-assets.mjs +4 -1
- package/scripts/verify-desktop-app-bundle.mjs +108 -0
- package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
- package/scripts/windows/Install-Antigravity.ps1 +26 -3
- package/scripts/windows/Install-ClaudeCode.ps1 +25 -7
- package/scripts/windows/Install-CursorAgent.ps1 +45 -30
- package/scripts/windows/Install-Devin.ps1 +16 -47
- package/scripts/windows/Install-GitHubCli.ps1 +4 -0
- package/scripts/windows/Install-Goose.ps1 +18 -1
- package/scripts/windows/Install-Grok.ps1 +14 -1
- package/scripts/windows/Install-Junie.ps1 +32 -11
- package/scripts/windows/Install-KiroCli.ps1 +37 -13
- package/scripts/windows/Install-MetaCli.ps1 +463 -0
- package/scripts/windows/Install-Node.ps1 +6 -1
- package/scripts/windows/Install-Ollama.ps1 +4 -1
- package/scripts/windows/Setup-NodeGlobalPrefix.ps1 +10 -0
- package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
- package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +4 -1
- package/scripts/windows/_HiddenProcess.ps1 +14 -3
- package/scripts/windows/_NativeInstallerSupport.ps1 +308 -0
- package/scripts/windows/_NpmCliInstaller.ps1 +35 -14
- package/scripts/windows/_PackagedUninstall.ps1 +9 -1
- package/scripts/windows/_VerifiedNpmUpdate.ps1 +25 -0
- package/build/desktop/updateNotifications.d.ts +0 -64
- package/build/desktop/updateNotifications.d.ts.map +0 -1
- package/build/desktop/updateNotifications.js +0 -143
- package/build/desktop/updateNotifications.js.map +0 -1
- package/build/renderer/assets/ActiveSessionPermissionChip-DImsuR9T.js +0 -1
- package/build/renderer/assets/App-BfOvMP2m.js +0 -1
- package/build/renderer/assets/App-DGwkRFZl.css +0 -1
- package/build/renderer/assets/App-DWd7I3Z2.js +0 -2
- package/build/renderer/assets/WorkspaceAppRoutes-CrbTA9En.js +0 -1
- package/build/renderer/assets/app-BTww3Hl4.js +0 -43
- package/build/renderer/assets/app-CPxWQwLA.css +0 -1
- package/build/renderer/assets/conversationSidebarRecentEntries-QuaOPxCb.js +0 -6
- package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts +0 -48
- package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts.map +0 -1
- package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js +0 -535
- package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js.map +0 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts +0 -13
- package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +0 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.js +0 -63
- package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +0 -1
- package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts +0 -19
- package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts.map +0 -1
- package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js +0 -53
- package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js.map +0 -1
- package/build/server/products/shared/renderer/api/providers.d.ts +0 -17
- package/build/server/products/shared/renderer/api/providers.d.ts.map +0 -1
- package/build/server/products/shared/renderer/api/providers.js +0 -50
- package/build/server/products/shared/renderer/api/providers.js.map +0 -1
- package/scripts/linux/install-aider.sh +0 -8
- package/scripts/macos/install-aider.sh +0 -8
- package/scripts/windows/Install-Aider.ps1 +0 -368
package/build/desktop/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dirname, join } from 'node:path';
|
|
2
|
-
import { app, BrowserWindow, dialog, ipcMain,
|
|
2
|
+
import { app, BrowserWindow, dialog, ipcMain, session, shell, systemPreferences, } from 'electron';
|
|
3
3
|
import { buildDesktopBootstrapPage } from './bootstrapPage.js';
|
|
4
4
|
import { resolveDesktopBootstrapNavigation, shouldRevealDesktopBootstrapRecovery, shouldNavigateDesktopBootstrap, resolveDesktopWindowRevealNavigation, shouldAllowDesktopBootstrapWindowNavigation, } from './bootstrapNavigation.js';
|
|
5
5
|
import { resolveCatsHomeDir, resolveDesktopHostConfig, resolveDesktopUserDataDir, } from './config.js';
|
|
@@ -12,10 +12,13 @@ import { buildDesktopBootstrapSnapshot, fetchJson, } from './readiness.js';
|
|
|
12
12
|
import { isDesktopAppOriginUrl, isDesktopHostActionId, resolveDesktopBrowserHandoffUrl, validateDesktopUrl, } from './security.js';
|
|
13
13
|
import { assertMainWindowIpcSender } from './ipcSecurity.js';
|
|
14
14
|
import { readPersistedSetupCompletionState, } from './persistedSetupState.js';
|
|
15
|
-
import { buildDesktopSetupSnapshot, createEmptyDesktopSetupState, runDesktopSetupHelper,
|
|
15
|
+
import { buildDesktopSetupSnapshot, createEmptyDesktopSetupState, runDesktopSetupHelper, } from './setupBridge.js';
|
|
16
16
|
import { isDesktopBootstrapLoadingPhase, resolveDesktopBootstrapError, shouldAttemptDesktopLateReadyRecovery, } from './startupRecovery.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
17
|
+
import { runDesktopUpdateDialog } from './updateDialog.js';
|
|
18
|
+
import { isDesktopPrerequisiteHelper, resolveSelectedSetupAuditActions } from './setupAudit.js';
|
|
19
|
+
import { DesktopPrerequisiteChecks } from './setupPrerequisites.js';
|
|
20
|
+
import { pauseSelectedSetupHelpers, retryPendingSetupOperationReleases, targetsForSetupHelper, withSelectedSetupTargets } from './providerSelection.js';
|
|
21
|
+
import { DesktopProviderManager } from './providerManager.js';
|
|
19
22
|
import { buildDesktopCliInventoryFromRuntime, probeContradictsCachedBootstrapState, } from './cliInventoryProbe.js';
|
|
20
23
|
import { createDesktopTrayController, } from './tray.js';
|
|
21
24
|
import { buildDesktopTrayMenuState as buildElectronTrayMenuState, buildDesktopTrayQuittingMenuState, } from './trayMenu.js';
|
|
@@ -27,7 +30,6 @@ import { createDesktopUpdateCapability, createDesktopUpdateManager, createUnavai
|
|
|
27
30
|
import { configureElectronUpdater, createElectronUpdaterAdapter, resolveAutoUpdaterExport, } from './updaterAdapter.js';
|
|
28
31
|
import { createDesktopUpdateIpcHandlers, createDesktopUpdateSnapshotBroadcast, } from './updateIpc.js';
|
|
29
32
|
import { withDesktopInstallHandoff } from './updateInstallHandoff.js';
|
|
30
|
-
import { DESKTOP_UPDATE_SETTINGS_PATH, resolveDesktopUpdateAnnouncement, } from './updateNotifications.js';
|
|
31
33
|
import { applyDesktopWindowChrome, resolveDesktopWindowChromeOptions, } from './windowChrome.js';
|
|
32
34
|
import { resolveDesktopWindowIconPath } from './windowIcon.js';
|
|
33
35
|
import { readDesktopStartupPreferences, resolveDesktopStartupLaunchContext, syncDesktopStartupPreferences, updateDesktopStartupPreferences, DESKTOP_LAUNCH_AT_LOGIN_ARG, } from './desktopStartup.js';
|
|
@@ -73,6 +75,7 @@ let runtimeCliInventoryPollTimer = null;
|
|
|
73
75
|
let runtimeCliInventoryScanPending = false;
|
|
74
76
|
let shuttingDown = false;
|
|
75
77
|
let shutdownPromise = null;
|
|
78
|
+
let setupHelperDrain = null;
|
|
76
79
|
let exitingAfterShutdown = false;
|
|
77
80
|
let trayController = null;
|
|
78
81
|
let stateStore = null;
|
|
@@ -133,8 +136,16 @@ function rememberRuntimeCliInventoryProbe(probe) {
|
|
|
133
136
|
if (!probe) {
|
|
134
137
|
return false;
|
|
135
138
|
}
|
|
136
|
-
if (probe.
|
|
137
|
-
|
|
139
|
+
if (latestCliInventoryProbe?.selection?.revision !== probe.selection?.revision) {
|
|
140
|
+
latestProviderDiagnosticsPayload = null;
|
|
141
|
+
}
|
|
142
|
+
latestCliInventoryProbe = probe;
|
|
143
|
+
if (probe.state?.status === 'error') {
|
|
144
|
+
runtimeCliInventoryScanPending = false;
|
|
145
|
+
latestCliInventoryError = createCliInventoryScanFailedError();
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (probe.selection?.state !== 'selected' || (probe.scan && !isRuntimeCliInventoryScanActive(probe))) {
|
|
138
149
|
runtimeCliInventoryScanPending = false;
|
|
139
150
|
clearCliInventoryError();
|
|
140
151
|
return true;
|
|
@@ -753,58 +764,28 @@ function buildTrayControllerOptions() {
|
|
|
753
764
|
if (shuttingDown || !updateManager) {
|
|
754
765
|
return;
|
|
755
766
|
}
|
|
756
|
-
await runDesktopUpdateDialog(
|
|
767
|
+
await runDesktopUpdateDialog({
|
|
768
|
+
manager: updateManager,
|
|
769
|
+
platform: process.platform,
|
|
770
|
+
locale: app.getLocale(),
|
|
771
|
+
isShuttingDown: () => shuttingDown,
|
|
772
|
+
showDialog: async (dialogSpec) => {
|
|
773
|
+
const choice = await dialog.showMessageBox({
|
|
774
|
+
type: dialogSpec.action === 'none' ? 'info' : 'question',
|
|
775
|
+
title: dialogSpec.title,
|
|
776
|
+
message: dialogSpec.message,
|
|
777
|
+
detail: dialogSpec.detail,
|
|
778
|
+
buttons: dialogSpec.buttons,
|
|
779
|
+
defaultId: 0,
|
|
780
|
+
cancelId: dialogSpec.buttons.length - 1,
|
|
781
|
+
noLink: true,
|
|
782
|
+
});
|
|
783
|
+
return choice.response;
|
|
784
|
+
},
|
|
785
|
+
});
|
|
757
786
|
},
|
|
758
787
|
};
|
|
759
788
|
}
|
|
760
|
-
/**
|
|
761
|
-
* Shows the update dialog for the current state and carries out whatever the
|
|
762
|
-
* user confirmed, re-entering once when the state it described was "nothing
|
|
763
|
-
* asked yet" and the answer needed a check first.
|
|
764
|
-
*/
|
|
765
|
-
async function runDesktopUpdateDialog(snapshot, allowRecheck = true) {
|
|
766
|
-
if (!updateManager) {
|
|
767
|
-
return;
|
|
768
|
-
}
|
|
769
|
-
const dialogSpec = resolveDesktopUpdateDialog({
|
|
770
|
-
snapshot,
|
|
771
|
-
platform: process.platform,
|
|
772
|
-
locale: app.getLocale(),
|
|
773
|
-
});
|
|
774
|
-
// An idle host has nothing to report yet. Run the check first and answer
|
|
775
|
-
// with its result, so one click produces one dialog rather than a dialog
|
|
776
|
-
// saying "about to look" followed by silence.
|
|
777
|
-
if (dialogSpec.action === 'check' && allowRecheck) {
|
|
778
|
-
const checked = await refreshUpdateState('tray');
|
|
779
|
-
if (checked && !shuttingDown) {
|
|
780
|
-
await runDesktopUpdateDialog(checked, false);
|
|
781
|
-
}
|
|
782
|
-
return;
|
|
783
|
-
}
|
|
784
|
-
const choice = await dialog.showMessageBox({
|
|
785
|
-
type: dialogSpec.action === 'none' ? 'info' : 'question',
|
|
786
|
-
title: dialogSpec.title,
|
|
787
|
-
message: dialogSpec.message,
|
|
788
|
-
detail: dialogSpec.detail,
|
|
789
|
-
buttons: dialogSpec.buttons,
|
|
790
|
-
defaultId: 0,
|
|
791
|
-
cancelId: dialogSpec.buttons.length - 1,
|
|
792
|
-
noLink: true,
|
|
793
|
-
});
|
|
794
|
-
if (choice.response !== 0 || dialogSpec.action === 'none' || shuttingDown) {
|
|
795
|
-
return;
|
|
796
|
-
}
|
|
797
|
-
if (dialogSpec.action === 'update') {
|
|
798
|
-
const downloaded = await updateManager.downloadUpdate();
|
|
799
|
-
if (downloaded.status !== 'downloaded' || shuttingDown) {
|
|
800
|
-
// The dialog is closed and the tray never held the answer, so a failed
|
|
801
|
-
// download has to be carried to the user rather than left to be found.
|
|
802
|
-
await announceDesktopUpdateResult('tray', downloaded);
|
|
803
|
-
return;
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
await updateManager.restartAndInstall();
|
|
807
|
-
}
|
|
808
789
|
async function syncTrayController() {
|
|
809
790
|
if (shuttingDown) {
|
|
810
791
|
trayController?.updateMenu(buildDesktopTrayQuittingMenuState(app.getLocale()));
|
|
@@ -856,11 +837,63 @@ async function getSetupSnapshot() {
|
|
|
856
837
|
if (!hostConfig) {
|
|
857
838
|
throw new Error('Desktop host is not initialized.');
|
|
858
839
|
}
|
|
859
|
-
|
|
840
|
+
const snapshot = await buildDesktopSetupSnapshot({
|
|
860
841
|
config: hostConfig,
|
|
861
842
|
packaging: resolveCurrentPackagingPlan(hostConfig),
|
|
862
843
|
state: setupState ?? createEmptyDesktopSetupState(),
|
|
863
844
|
});
|
|
845
|
+
const probe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl).catch(() => null);
|
|
846
|
+
snapshot.helpers = snapshot.helpers.filter((helper) => {
|
|
847
|
+
if (isDesktopPrerequisiteHelper(helper.id))
|
|
848
|
+
return true;
|
|
849
|
+
if (!probe?.selection)
|
|
850
|
+
return false;
|
|
851
|
+
try {
|
|
852
|
+
return targetsForSetupHelper(helper.id, probe.selection).length > 0;
|
|
853
|
+
}
|
|
854
|
+
catch {
|
|
855
|
+
return false;
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
snapshot.prerequisiteChecks = desktopPrerequisites.read();
|
|
859
|
+
if (snapshot.resumeAction && !snapshot.helpers.some((helper) => helper.id === snapshot.resumeAction.helperId)) {
|
|
860
|
+
snapshot.resumeAction = null;
|
|
861
|
+
}
|
|
862
|
+
return snapshot;
|
|
863
|
+
}
|
|
864
|
+
let providerManager = null;
|
|
865
|
+
const desktopPrerequisites = new DesktopPrerequisiteChecks(process.platform === 'win32' ? 'windows' : process.platform === 'darwin' ? 'macos' : 'linux');
|
|
866
|
+
let holdProviderOnboarding = false;
|
|
867
|
+
function getProviderManager() {
|
|
868
|
+
if (!hostConfig)
|
|
869
|
+
throw new Error('Desktop host is not initialized.');
|
|
870
|
+
providerManager ??= new DesktopProviderManager({
|
|
871
|
+
platform: process.platform === 'win32' ? 'windows' : process.platform === 'darwin' ? 'macos' : 'linux',
|
|
872
|
+
prerequisites: () => desktopPrerequisites.read(),
|
|
873
|
+
request: async (path, init = {}) => {
|
|
874
|
+
const response = await fetchWithTimeout(`${hostConfig.runtimeBaseUrl}${path}`, init, RUNTIME_SETUP_STATE_TIMEOUT_MS);
|
|
875
|
+
if (!response.ok) {
|
|
876
|
+
const result = await response.json().catch(() => null);
|
|
877
|
+
throw new Error(result?.error || `Runtime provider request failed (${response.status}).`);
|
|
878
|
+
}
|
|
879
|
+
return response.json();
|
|
880
|
+
},
|
|
881
|
+
helpers: async () => (await buildDesktopSetupSnapshot({ config: hostConfig,
|
|
882
|
+
packaging: resolveCurrentPackagingPlan(hostConfig), state: setupState ?? createEmptyDesktopSetupState() })).helpers,
|
|
883
|
+
helper: async (helperId, mode, dryRun, expectedRevision) => {
|
|
884
|
+
const snapshot = await runSetupAction({ helperId, mode, dryRun }, { refreshInventory: false, expectedRevision });
|
|
885
|
+
if (!snapshot.state.lastAction)
|
|
886
|
+
throw new Error('Installer did not return a result.');
|
|
887
|
+
return snapshot.state.lastAction;
|
|
888
|
+
},
|
|
889
|
+
changed: async (runtime) => {
|
|
890
|
+
rememberRuntimeCliInventoryProbe(runtime);
|
|
891
|
+
latestProviderDiagnosticsPayload = null;
|
|
892
|
+
const snapshot = await refreshBootstrapSnapshot();
|
|
893
|
+
publishSnapshot(snapshot);
|
|
894
|
+
},
|
|
895
|
+
});
|
|
896
|
+
return providerManager;
|
|
864
897
|
}
|
|
865
898
|
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
866
899
|
const controller = new AbortController();
|
|
@@ -890,86 +923,39 @@ async function fetchJsonWithTimeout(url, init, timeoutMs) {
|
|
|
890
923
|
}
|
|
891
924
|
return await response.json();
|
|
892
925
|
}
|
|
893
|
-
function shouldRefreshRuntimeCliInventoryProbe(probe, options) {
|
|
894
|
-
if (options.triggerScanIfMissing !== true) {
|
|
895
|
-
return false;
|
|
896
|
-
}
|
|
897
|
-
if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe)) {
|
|
898
|
-
return false;
|
|
899
|
-
}
|
|
900
|
-
if (!probe?.scan) {
|
|
901
|
-
return true;
|
|
902
|
-
}
|
|
903
|
-
return !probe.scan.providers.some((provider) => provider.available === true);
|
|
904
|
-
}
|
|
905
926
|
async function fetchRuntimeCliInventoryProbe(baseUrl, options = {}) {
|
|
906
|
-
|
|
907
|
-
const
|
|
908
|
-
let probe
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
// persisted state: a runtime killed mid-scan -- which the packaged update
|
|
912
|
-
// handoff does deliberately when it drains the sidecars -- leaves it set for
|
|
913
|
-
// every launch that follows. Backing off on the strength of that flag turned
|
|
914
|
-
// Detect into a button that could never do anything again.
|
|
915
|
-
const shouldReadSetupStateFirst = !options.forceRescan;
|
|
916
|
-
if (shouldReadSetupStateFirst) {
|
|
917
|
-
try {
|
|
918
|
-
probe = await fetchJsonWithTimeout(`${baseUrl}/setup-state`, {
|
|
919
|
-
method: 'GET',
|
|
920
|
-
}, setupStateTimeoutMs);
|
|
921
|
-
}
|
|
922
|
-
catch {
|
|
923
|
-
if (options.triggerScanIfMissing !== true) {
|
|
924
|
-
return null;
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
if (probe?.scan || isRuntimeCliInventoryScanActive(probe)) {
|
|
928
|
-
return probe;
|
|
929
|
-
}
|
|
930
|
-
if (runtimeCliInventoryScanPending) {
|
|
931
|
-
return probe;
|
|
932
|
-
}
|
|
933
|
-
if (!options.forceRescan && !shouldRefreshRuntimeCliInventoryProbe(probe, options)) {
|
|
934
|
-
return probe;
|
|
935
|
-
}
|
|
927
|
+
await retryPendingSetupOperationReleases();
|
|
928
|
+
const timeout = options.setupStateTimeoutMs ?? RUNTIME_SETUP_STATE_TIMEOUT_MS;
|
|
929
|
+
let probe;
|
|
930
|
+
try {
|
|
931
|
+
probe = await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
|
|
936
932
|
}
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
//
|
|
933
|
+
catch {
|
|
934
|
+
return null;
|
|
935
|
+
}
|
|
936
|
+
// A forced scan still needs a current, nonempty declared selection.
|
|
937
|
+
if (probe.selection?.state !== 'selected')
|
|
938
|
+
return probe;
|
|
939
|
+
if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe))
|
|
940
|
+
return probe;
|
|
941
|
+
if (!options.forceRescan && (probe.scan || !options.triggerScanIfMissing))
|
|
942
|
+
return probe;
|
|
941
943
|
try {
|
|
942
944
|
runtimeCliInventoryScanPending = true;
|
|
943
|
-
const
|
|
945
|
+
const response = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
|
|
944
946
|
method: 'POST',
|
|
945
947
|
headers: { 'content-type': 'application/json', accept: 'application/json' },
|
|
946
|
-
body: JSON.stringify({ manual:
|
|
947
|
-
}, scanTimeoutMs);
|
|
948
|
-
if (!
|
|
948
|
+
body: JSON.stringify({ manual: options.forceRescan === true, targets: probe.selection.targets, expectedRevision: probe.selection.revision }),
|
|
949
|
+
}, options.scanTimeoutMs ?? RUNTIME_SETUP_SCAN_TIMEOUT_MS);
|
|
950
|
+
if (!response.ok)
|
|
949
951
|
runtimeCliInventoryScanPending = false;
|
|
950
|
-
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
catch {
|
|
954
|
-
return probe;
|
|
955
|
-
}
|
|
956
|
-
try {
|
|
957
|
-
return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, {
|
|
958
|
-
method: 'GET',
|
|
959
|
-
}, setupStateTimeoutMs);
|
|
952
|
+
return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
|
|
960
953
|
}
|
|
961
954
|
catch {
|
|
955
|
+
runtimeCliInventoryScanPending = false;
|
|
962
956
|
return probe;
|
|
963
957
|
}
|
|
964
958
|
}
|
|
965
|
-
function isCliMissingBootstrapSnapshot(snapshot) {
|
|
966
|
-
if (hostConfig?.bootstrap.onboardingMode !== 'cli_inventory_gate') {
|
|
967
|
-
return false;
|
|
968
|
-
}
|
|
969
|
-
return Boolean(snapshot.phase === 'needs_prerequisites'
|
|
970
|
-
&& snapshot.prerequisites?.cliInventory?.source === 'runtime'
|
|
971
|
-
&& snapshot.prerequisites.cliInventory.total === 0);
|
|
972
|
-
}
|
|
973
959
|
function buildSnapshot(lastError) {
|
|
974
960
|
if (!hostConfig || !supervisor) {
|
|
975
961
|
throw new Error('Desktop host is not initialized.');
|
|
@@ -992,6 +978,8 @@ function buildSnapshot(lastError) {
|
|
|
992
978
|
packaging: packagingState ?? undefined,
|
|
993
979
|
setup: setupState ?? undefined,
|
|
994
980
|
hostStatePath: hostConfig.paths.hostStatePath,
|
|
981
|
+
providerSelection: latestCliInventoryProbe?.selection ?? null,
|
|
982
|
+
providerCatalog: latestCliInventoryProbe?.universe ?? [],
|
|
995
983
|
cliInventory: resolveSnapshotCliInventory(),
|
|
996
984
|
cliInventoryError: latestCliInventoryError,
|
|
997
985
|
});
|
|
@@ -1016,7 +1004,7 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
|
|
|
1016
1004
|
?? await readPersistedSetupCompletionState(hostConfig.paths.appStatePath);
|
|
1017
1005
|
latestPersistedSetupState = effectivePersistedSetup;
|
|
1018
1006
|
const setupCompleted = Boolean(effectivePersistedSetup.setupCompleteAt || effectivePersistedSetup.productSetupCompleted);
|
|
1019
|
-
const shouldReadCliInventory =
|
|
1007
|
+
const shouldReadCliInventory = true;
|
|
1020
1008
|
// /diagnostics/providers is intentionally NOT fetched on the boot critical
|
|
1021
1009
|
// path — it's not authoritative for any phase decision before setup, and
|
|
1022
1010
|
// for setup-complete users we kick it off in the background (see
|
|
@@ -1071,6 +1059,8 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
|
|
|
1071
1059
|
packaging: packagingState ?? undefined,
|
|
1072
1060
|
setup: setupState ?? undefined,
|
|
1073
1061
|
hostStatePath: hostConfig.paths.hostStatePath,
|
|
1062
|
+
providerSelection: latestCliInventoryProbe?.selection ?? null,
|
|
1063
|
+
providerCatalog: latestCliInventoryProbe?.universe ?? [],
|
|
1074
1064
|
cliInventory: resolveSnapshotCliInventory(),
|
|
1075
1065
|
cliInventoryError: latestCliInventoryError,
|
|
1076
1066
|
});
|
|
@@ -1082,28 +1072,32 @@ function hasPersistedProductSetupCompletion(persistedSetup = null) {
|
|
|
1082
1072
|
const productEvents = diagnosticsState?.product?.events ?? [];
|
|
1083
1073
|
return productEvents.some((event) => event.kind === 'setup_completed' && event.status === 'ok');
|
|
1084
1074
|
}
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
}
|
|
1089
|
-
if (!shouldAutoRunSetupAudit(setupState, {
|
|
1090
|
-
setupCompleteAt: snapshot.app.setupCompleteAt ?? persistedSetup?.setupCompleteAt ?? null,
|
|
1091
|
-
productSetupCompleted: hasPersistedProductSetupCompletion(persistedSetup),
|
|
1092
|
-
})) {
|
|
1093
|
-
return;
|
|
1094
|
-
}
|
|
1095
|
-
const setupAuditAction = resolveDefaultSetupAuditAction(hostConfig);
|
|
1096
|
-
if (!setupAuditAction) {
|
|
1075
|
+
const auditedSetupHelpers = new Set();
|
|
1076
|
+
async function maybePrimeSetupAudit(_snapshot, _persistedSetup = null) {
|
|
1077
|
+
if (!hostConfig)
|
|
1097
1078
|
return;
|
|
1079
|
+
const selection = latestCliInventoryProbe?.selection ?? null;
|
|
1080
|
+
for (const action of resolveSelectedSetupAuditActions(selection)) {
|
|
1081
|
+
const prerequisites = desktopPrerequisites.read();
|
|
1082
|
+
if (prerequisites.some((entry) => entry.helperId === action.helperId && entry.result))
|
|
1083
|
+
continue;
|
|
1084
|
+
if (action.helperId.endsWith('-npm-prefix-helper') && !prerequisites.some((entry) => entry.helperId.endsWith('-node-host-installer') && entry.result?.status === 'ready'))
|
|
1085
|
+
continue;
|
|
1086
|
+
const key = `${isDesktopPrerequisiteHelper(action.helperId) ? 'desktop' : selection?.revision}:${action.helperId}`;
|
|
1087
|
+
if (auditedSetupHelpers.has(key))
|
|
1088
|
+
continue;
|
|
1089
|
+
auditedSetupHelpers.add(key);
|
|
1090
|
+
try {
|
|
1091
|
+
await runSetupAction({ helperId: action.helperId, mode: 'check' }, {
|
|
1092
|
+
publishMode: 'bootstrap-only', refreshBootstrap: false,
|
|
1093
|
+
});
|
|
1094
|
+
}
|
|
1095
|
+
catch (error) {
|
|
1096
|
+
// Each failed prerequisite remains retryable in its card; do not let one
|
|
1097
|
+
// missing host tool prevent the other environment checks from finishing.
|
|
1098
|
+
process.stderr.write(`Desktop setup check failed (${action.helperId}): ${String(error)}\n`);
|
|
1099
|
+
}
|
|
1098
1100
|
}
|
|
1099
|
-
await runSetupAction({
|
|
1100
|
-
helperId: setupAuditAction.helperId,
|
|
1101
|
-
mode: 'check',
|
|
1102
|
-
extraArguments: setupAuditAction.extraArguments,
|
|
1103
|
-
}, {
|
|
1104
|
-
publishMode: 'bootstrap-only',
|
|
1105
|
-
refreshBootstrap: false,
|
|
1106
|
-
});
|
|
1107
1101
|
}
|
|
1108
1102
|
function scheduleBackgroundSetupAudit(snapshot, persistedSetup = null) {
|
|
1109
1103
|
if (isDesktopBootstrapLoadingPhase(snapshot.phase) || backgroundSetupAuditPromise) {
|
|
@@ -1134,7 +1128,7 @@ async function pollRuntimeCliInventory(options) {
|
|
|
1134
1128
|
if (!hostConfig)
|
|
1135
1129
|
return;
|
|
1136
1130
|
const probe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl, {
|
|
1137
|
-
triggerScanIfMissing:
|
|
1131
|
+
triggerScanIfMissing: false,
|
|
1138
1132
|
scanTimeoutMs: options.setupCompleted
|
|
1139
1133
|
? RUNTIME_SETUP_SCAN_TIMEOUT_MS
|
|
1140
1134
|
: RUNTIME_BOOTSTRAP_SETUP_SCAN_TIMEOUT_MS,
|
|
@@ -1199,7 +1193,7 @@ async function retryCliInventoryScanInBackground(options) {
|
|
|
1199
1193
|
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
1200
1194
|
}
|
|
1201
1195
|
}
|
|
1202
|
-
if (
|
|
1196
|
+
if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(latestCliInventoryProbe)) {
|
|
1203
1197
|
scheduleRuntimeCliInventoryPoll({
|
|
1204
1198
|
setupCompleted: options.setupCompleted,
|
|
1205
1199
|
});
|
|
@@ -1228,22 +1222,12 @@ function scheduleBackgroundBootstrapWork(snapshot, persistedSetup) {
|
|
|
1228
1222
|
const setupCompleted = Boolean(snapshot.app.setupCompleteAt
|
|
1229
1223
|
?? persistedSetup?.setupCompleteAt
|
|
1230
1224
|
?? persistedSetup?.productSetupCompleted);
|
|
1231
|
-
//
|
|
1232
|
-
// the packaged readiness audit, not in cats-runtime's CLI inventory probe.
|
|
1233
|
-
// Fresh users without Node need this signal so the recovery panel can
|
|
1234
|
-
// surface install_node_lts before they fail an Install action.
|
|
1225
|
+
// Always check Desktop prerequisites; provider/local-model probes remain scoped.
|
|
1235
1226
|
scheduleBackgroundSetupAudit(snapshot, persistedSetup);
|
|
1236
|
-
//
|
|
1237
|
-
//
|
|
1238
|
-
// already installed shows a grid of "not detected yet" until the user clicks
|
|
1239
|
-
// Detect. This is background work on its own pre-setup timeout budget
|
|
1240
|
-
// (RUNTIME_BOOTSTRAP_SETUP_SCAN_TIMEOUT_MS) and, outside the legacy
|
|
1241
|
-
// cli_inventory_gate policy, is display-only: buildDesktopBootstrapSnapshot
|
|
1242
|
-
// gates every phase decision that reads cliInventory on that mode, so a scan
|
|
1243
|
-
// landing here can never move the phase or navigate the window away from
|
|
1244
|
-
// onboarding.
|
|
1227
|
+
// Inventory observes the saved selection; missing/invalid/empty selections
|
|
1228
|
+
// never launch a provider scan. Availability does not gate product onboarding.
|
|
1245
1229
|
void retryCliInventoryScanInBackground({
|
|
1246
|
-
forceRescan:
|
|
1230
|
+
forceRescan: false,
|
|
1247
1231
|
setupCompleted,
|
|
1248
1232
|
}).catch((error) => {
|
|
1249
1233
|
process.stderr.write(`Background CLI inventory rescan failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
@@ -1257,6 +1241,8 @@ function scheduleBackgroundBootstrapWork(snapshot, persistedSetup) {
|
|
|
1257
1241
|
}
|
|
1258
1242
|
}
|
|
1259
1243
|
async function maybeOpenApp(snapshot) {
|
|
1244
|
+
if (holdProviderOnboarding && snapshot.phase !== 'failed')
|
|
1245
|
+
return;
|
|
1260
1246
|
if (!mainWindow || !hostConfig) {
|
|
1261
1247
|
return;
|
|
1262
1248
|
}
|
|
@@ -1378,7 +1364,17 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
|
|
|
1378
1364
|
// supervisor-lifetime environment snapshot populated during the first
|
|
1379
1365
|
// bootstrap, including the Desktop-provisioned platform auth secret.
|
|
1380
1366
|
exitingAfterShutdown = false;
|
|
1381
|
-
|
|
1367
|
+
try {
|
|
1368
|
+
await supervisor?.startAll();
|
|
1369
|
+
}
|
|
1370
|
+
finally {
|
|
1371
|
+
// A failed recovery leaves Runtime unavailable, not helper admission
|
|
1372
|
+
// permanently paused after a later successful Retry.
|
|
1373
|
+
if (!shuttingDown) {
|
|
1374
|
+
setupHelperDrain?.resume();
|
|
1375
|
+
setupHelperDrain = null;
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1382
1378
|
await syncTrayController();
|
|
1383
1379
|
},
|
|
1384
1380
|
exitAfterUncertainHandoff: async () => {
|
|
@@ -1409,77 +1405,6 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
|
|
|
1409
1405
|
},
|
|
1410
1406
|
});
|
|
1411
1407
|
}
|
|
1412
|
-
async function openDesktopUpdateSettings() {
|
|
1413
|
-
if (shuttingDown || !hostConfig) {
|
|
1414
|
-
return;
|
|
1415
|
-
}
|
|
1416
|
-
await showMainWindow(`${hostConfig.appBaseUrl}${DESKTOP_UPDATE_SETTINGS_PATH}`);
|
|
1417
|
-
}
|
|
1418
|
-
/**
|
|
1419
|
-
* Shows a native notification, reporting whether the user will actually see it.
|
|
1420
|
-
*
|
|
1421
|
-
* A false return sends the caller to the navigation fallback. Notifying is not
|
|
1422
|
-
* worth failing a check over, so a throwing platform is treated the same as one
|
|
1423
|
-
* without notification support.
|
|
1424
|
-
*/
|
|
1425
|
-
function showDesktopUpdateNotification(notification) {
|
|
1426
|
-
try {
|
|
1427
|
-
const native = new Notification({
|
|
1428
|
-
title: notification.title,
|
|
1429
|
-
body: notification.body,
|
|
1430
|
-
});
|
|
1431
|
-
native.on('click', () => {
|
|
1432
|
-
void openDesktopUpdateSettings();
|
|
1433
|
-
});
|
|
1434
|
-
native.show();
|
|
1435
|
-
return true;
|
|
1436
|
-
}
|
|
1437
|
-
catch (error) {
|
|
1438
|
-
process.stderr.write('[desktop-update] native notification unavailable: '
|
|
1439
|
-
+ `${error instanceof Error ? error.message : String(error)}\n`);
|
|
1440
|
-
return false;
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
function areNativeNotificationsSupported() {
|
|
1444
|
-
try {
|
|
1445
|
-
return Notification.isSupported();
|
|
1446
|
-
}
|
|
1447
|
-
catch {
|
|
1448
|
-
return false;
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
async function announceDesktopUpdateResult(origin, snapshot) {
|
|
1452
|
-
if (!snapshot || shuttingDown) {
|
|
1453
|
-
return;
|
|
1454
|
-
}
|
|
1455
|
-
const announcement = resolveDesktopUpdateAnnouncement({
|
|
1456
|
-
origin,
|
|
1457
|
-
snapshot,
|
|
1458
|
-
locale: app.getLocale(),
|
|
1459
|
-
notificationsSupported: areNativeNotificationsSupported(),
|
|
1460
|
-
});
|
|
1461
|
-
if (announcement.notification && showDesktopUpdateNotification(announcement.notification)) {
|
|
1462
|
-
return;
|
|
1463
|
-
}
|
|
1464
|
-
if (announcement.fallbackNavigatePath) {
|
|
1465
|
-
await openDesktopUpdateSettings();
|
|
1466
|
-
}
|
|
1467
|
-
}
|
|
1468
|
-
/**
|
|
1469
|
-
* Runs a check and reports its result to whoever asked for it.
|
|
1470
|
-
*
|
|
1471
|
-
* The origin is required rather than defaulted: it decides whether the result
|
|
1472
|
-
* is announced at all, and a new caller silently inheriting another surface's
|
|
1473
|
-
* policy is the failure this signature exists to prevent.
|
|
1474
|
-
*/
|
|
1475
|
-
async function refreshUpdateState(origin) {
|
|
1476
|
-
if (!updateManager) {
|
|
1477
|
-
return null;
|
|
1478
|
-
}
|
|
1479
|
-
updateState = await updateManager.checkForUpdates();
|
|
1480
|
-
await announceDesktopUpdateResult(origin, updateState);
|
|
1481
|
-
return updateState;
|
|
1482
|
-
}
|
|
1483
1408
|
async function bootstrapDesktopHost(restartServices = false) {
|
|
1484
1409
|
if (!hostConfig || !supervisor) {
|
|
1485
1410
|
throw new Error('Desktop host is not initialized.');
|
|
@@ -1487,7 +1412,9 @@ async function bootstrapDesktopHost(restartServices = false) {
|
|
|
1487
1412
|
if (bootstrapPromise) {
|
|
1488
1413
|
return bootstrapPromise;
|
|
1489
1414
|
}
|
|
1415
|
+
const helperPause = restartServices ? pauseSelectedSetupHelpers() : null;
|
|
1490
1416
|
bootstrapPromise = (async () => {
|
|
1417
|
+
await helperPause?.drained;
|
|
1491
1418
|
latestBootstrapError = null;
|
|
1492
1419
|
latestCliInventoryError = null;
|
|
1493
1420
|
runtimeCliInventoryScanPending = false;
|
|
@@ -1523,6 +1450,7 @@ async function bootstrapDesktopHost(restartServices = false) {
|
|
|
1523
1450
|
const snapshot = publishSnapshot(buildSnapshot());
|
|
1524
1451
|
return maybeOpenApp(snapshot).then(() => snapshot);
|
|
1525
1452
|
}).finally(() => {
|
|
1453
|
+
helperPause?.resume();
|
|
1526
1454
|
bootstrapPromise = null;
|
|
1527
1455
|
});
|
|
1528
1456
|
return bootstrapPromise;
|
|
@@ -1552,18 +1480,18 @@ async function runHostAction(actionId) {
|
|
|
1552
1480
|
return latestSnapshot ?? buildSnapshot(null);
|
|
1553
1481
|
}
|
|
1554
1482
|
if (actionId === 'open_setup') {
|
|
1555
|
-
const snapshot =
|
|
1556
|
-
if (
|
|
1483
|
+
const snapshot = await refreshBootstrapSnapshot();
|
|
1484
|
+
if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
|
|
1557
1485
|
return snapshot;
|
|
1558
|
-
|
|
1486
|
+
holdProviderOnboarding = false;
|
|
1559
1487
|
await showMainWindow(`${hostConfig.appBaseUrl}/setup`);
|
|
1560
1488
|
return snapshot;
|
|
1561
1489
|
}
|
|
1562
1490
|
if (actionId === 'open_chat') {
|
|
1563
|
-
const snapshot =
|
|
1564
|
-
if (
|
|
1491
|
+
const snapshot = await refreshBootstrapSnapshot();
|
|
1492
|
+
if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
|
|
1565
1493
|
return snapshot;
|
|
1566
|
-
|
|
1494
|
+
holdProviderOnboarding = false;
|
|
1567
1495
|
await showMainWindow(`${hostConfig.appBaseUrl}${snapshot.app.entryPath}`);
|
|
1568
1496
|
return snapshot;
|
|
1569
1497
|
}
|
|
@@ -1578,11 +1506,11 @@ async function runSetupAction(action, options = {}) {
|
|
|
1578
1506
|
throw new Error('Desktop host is not initialized.');
|
|
1579
1507
|
}
|
|
1580
1508
|
const packaging = resolveCurrentPackagingPlan(hostConfig);
|
|
1581
|
-
const result = await
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
action,
|
|
1585
|
-
});
|
|
1509
|
+
const result = await desktopPrerequisites.run(action.helperId, () => withSelectedSetupTargets({
|
|
1510
|
+
baseUrl: hostConfig.runtimeBaseUrl, helperId: action.helperId,
|
|
1511
|
+
expectedRevision: options.expectedRevision,
|
|
1512
|
+
run: () => runDesktopSetupHelper({ config: hostConfig, packaging, action }),
|
|
1513
|
+
}));
|
|
1586
1514
|
packagingState = packaging;
|
|
1587
1515
|
setupState = {
|
|
1588
1516
|
lastAction: result,
|
|
@@ -1620,9 +1548,8 @@ async function runSetupAction(action, options = {}) {
|
|
|
1620
1548
|
// depend on the helper's runState — the rescan itself is authoritative.
|
|
1621
1549
|
const setupCompleted = hasPersistedSetupCompletion();
|
|
1622
1550
|
const shouldRefreshCliInventory = action.mode !== 'check'
|
|
1623
|
-
&& shouldRefreshCliInventoryAfterSetupAction(action.helperId)
|
|
1624
|
-
|
|
1625
|
-
if (shouldRefreshCliInventory) {
|
|
1551
|
+
&& shouldRefreshCliInventoryAfterSetupAction(action.helperId);
|
|
1552
|
+
if (shouldRefreshCliInventory && options.refreshInventory !== false) {
|
|
1626
1553
|
const refreshedProbe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl, {
|
|
1627
1554
|
forceRescan: true,
|
|
1628
1555
|
});
|
|
@@ -1644,7 +1571,8 @@ async function runSetupAction(action, options = {}) {
|
|
|
1644
1571
|
publishSnapshot(snapshot);
|
|
1645
1572
|
}
|
|
1646
1573
|
}
|
|
1647
|
-
|
|
1574
|
+
const snapshot = await getSetupSnapshot();
|
|
1575
|
+
return { ...snapshot, state: { ...snapshot.state, lastAction: result } };
|
|
1648
1576
|
}
|
|
1649
1577
|
function shouldRefreshCliInventoryAfterSetupAction(helperId) {
|
|
1650
1578
|
return helperId.endsWith('-native-installer')
|
|
@@ -1750,6 +1678,9 @@ function waitForShutdownDeadline(ms) {
|
|
|
1750
1678
|
* surviving sidecar may still hold.
|
|
1751
1679
|
*/
|
|
1752
1680
|
async function drainManagedServices() {
|
|
1681
|
+
setupHelperDrain ??= pauseSelectedSetupHelpers();
|
|
1682
|
+
// Installer completion is outside the sidecar shutdown watchdog budget.
|
|
1683
|
+
await setupHelperDrain.drained;
|
|
1753
1684
|
const drain = supervisor?.stopAll() ?? Promise.resolve();
|
|
1754
1685
|
const shutdownWatchdogMs = hostConfig
|
|
1755
1686
|
? resolveShutdownWatchdogMs(hostConfig, supervisor?.getManagedServiceCount() ?? 0)
|
|
@@ -1773,8 +1704,10 @@ async function shutdownHost() {
|
|
|
1773
1704
|
return shutdownPromise;
|
|
1774
1705
|
}
|
|
1775
1706
|
shuttingDown = true;
|
|
1707
|
+
setupHelperDrain ??= pauseSelectedSetupHelpers();
|
|
1776
1708
|
clearRuntimeCliInventoryPoll();
|
|
1777
1709
|
shutdownPromise = (async () => {
|
|
1710
|
+
await setupHelperDrain.drained;
|
|
1778
1711
|
let shutdownExitCode = 0;
|
|
1779
1712
|
let forcedStopAttempted = false;
|
|
1780
1713
|
const activeTrayController = trayController;
|
|
@@ -1819,11 +1752,8 @@ async function main() {
|
|
|
1819
1752
|
return;
|
|
1820
1753
|
}
|
|
1821
1754
|
app.setPath('userData', resolveDesktopUserDataDir(app.getPath('appData')));
|
|
1822
|
-
//
|
|
1823
|
-
//
|
|
1824
|
-
// that shortcut with the electron-builder appId, so claiming it here is what
|
|
1825
|
-
// makes update notifications visible at all. Unpackaged runs have no such
|
|
1826
|
-
// shortcut, so the claim would buy nothing.
|
|
1755
|
+
// Keep the packaged process identity aligned with the installer-created
|
|
1756
|
+
// Windows shortcuts and taskbar grouping.
|
|
1827
1757
|
if (process.platform === 'win32' && app.isPackaged && DESKTOP_APP_USER_MODEL_ID) {
|
|
1828
1758
|
app.setAppUserModelId(DESKTOP_APP_USER_MODEL_ID);
|
|
1829
1759
|
}
|
|
@@ -1939,7 +1869,26 @@ async function main() {
|
|
|
1939
1869
|
}
|
|
1940
1870
|
return await runHostAction(actionId);
|
|
1941
1871
|
});
|
|
1942
|
-
ipcMain.handle('cats-host:
|
|
1872
|
+
ipcMain.handle('cats-host:provider-setup-read', async (event, context) => {
|
|
1873
|
+
assertMainWindowIpcSender(event, mainWindow, 'Provider setup is only available to the main Cats window.');
|
|
1874
|
+
if (context !== 'onboarding' && context !== 'settings')
|
|
1875
|
+
throw new Error('Invalid provider setup context.');
|
|
1876
|
+
if (context === 'onboarding')
|
|
1877
|
+
holdProviderOnboarding = true;
|
|
1878
|
+
return await getProviderManager().read();
|
|
1879
|
+
});
|
|
1880
|
+
ipcMain.handle('cats-host:provider-setup-apply', async (event, payload) => {
|
|
1881
|
+
assertMainWindowIpcSender(event, mainWindow, 'Provider setup is only available to the main Cats window.');
|
|
1882
|
+
await retryPendingSetupOperationReleases();
|
|
1883
|
+
return await getProviderManager().apply(payload);
|
|
1884
|
+
});
|
|
1885
|
+
ipcMain.handle('cats-host:provider-setup-run', async (event, payload) => {
|
|
1886
|
+
assertMainWindowIpcSender(event, mainWindow, 'Provider setup is only available to the main Cats window.');
|
|
1887
|
+
await retryPendingSetupOperationReleases();
|
|
1888
|
+
return await getProviderManager().run(payload);
|
|
1889
|
+
});
|
|
1890
|
+
ipcMain.handle('cats-host:run-setup-helper', async (event, payload) => {
|
|
1891
|
+
assertMainWindowIpcSender(event, mainWindow, 'Setup helpers are only available to the main Cats window.');
|
|
1943
1892
|
if (typeof payload !== 'object'
|
|
1944
1893
|
|| payload === null
|
|
1945
1894
|
|| typeof payload.helperId !== 'string'
|
|
@@ -2135,7 +2084,7 @@ async function main() {
|
|
|
2135
2084
|
// SPEC-111 section 6: at most one silent check per launch, and only when the
|
|
2136
2085
|
// build actually has update capability.
|
|
2137
2086
|
if (hostConfig.update.checkOnStartup && updateManager?.getSnapshot().capability.canCheck) {
|
|
2138
|
-
void
|
|
2087
|
+
void updateManager.checkForUpdates();
|
|
2139
2088
|
}
|
|
2140
2089
|
}
|
|
2141
2090
|
void main().catch((error) => {
|