@cats-inc/cats-platform 0.1.21 → 0.2.8
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 +18 -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 +114 -34
- package/build/desktop/bootstrapPage.js.map +1 -1
- package/build/desktop/cliInventoryProbe.d.ts +5 -2
- package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
- package/build/desktop/cliInventoryProbe.js +14 -11
- 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 +10 -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 +144 -249
- 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 +7 -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/providerSelection.d.ts +37 -0
- package/build/desktop/providerSelection.d.ts.map +1 -0
- package/build/desktop/providerSelection.js +112 -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 +16 -14
- package/build/desktop/setupAssets.js.map +1 -1
- package/build/desktop/setupAudit.d.ts +2 -3
- package/build/desktop/setupAudit.d.ts.map +1 -1
- package/build/desktop/setupAudit.js +14 -34
- package/build/desktop/setupAudit.js.map +1 -1
- 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-DImsuR9T.js → ActiveSessionPermissionChip-CAgN-tXv.js} +1 -1
- package/build/renderer/assets/App-BZA23O2J.js +2 -0
- package/build/renderer/assets/App-DxsV-tKS.css +1 -0
- package/build/renderer/assets/{App-DKOSn0o_.js → App-YqprEL2n.js} +1 -1
- package/build/renderer/assets/App-rGw9J8PZ.js +1 -0
- package/build/renderer/assets/WorkspaceAppRoutes-BCHCikmJ.js +1 -0
- package/build/renderer/assets/app-BV3UAQkR.css +1 -0
- package/build/renderer/assets/app-CVPqqfZo.js +45 -0
- package/build/renderer/assets/conversationSidebarRecentEntries-iqaLqA1n.js +6 -0
- package/build/renderer/assets/{useDraftSessionChips-DCIId0eY.js → useDraftSessionChips-D9BX6X92.js} +1 -1
- package/build/renderer/index.html +2 -2
- package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerCatalogClient.js +15 -6
- package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
- package/build/server/app/renderer/providerRegistryClient.d.ts +1 -1
- package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerRegistryClient.js +23 -41
- 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 +7 -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/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 +3 -3
- package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
- package/build/server/design/components/providerModelFieldsSupport.js +37 -38
- package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
- package/build/server/design/components/useProviderCatalogState.d.ts +1 -0
- package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
- package/build/server/design/components/useProviderCatalogState.js +1 -0
- package/build/server/design/components/useProviderCatalogState.js.map +1 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +1 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.js +20 -13
- package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +1 -1
- package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
- package/build/server/design/components/useProviderRegistryState.js +12 -25
- package/build/server/design/components/useProviderRegistryState.js.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.js +2 -1
- 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/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 +8 -0
- package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
- package/build/server/products/chat/api/routeSupport.js +5 -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/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/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 +39 -0
- package/build/server/runtime/client.js.map +1 -1
- package/build/server/runtime/setup.d.ts +10 -4
- package/build/server/runtime/setup.d.ts.map +1 -1
- package/build/server/runtime/setup.js +14 -18
- 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 +112 -81
- 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/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 +28 -22
- package/build/server/shared/providerCatalogData.d.ts.map +1 -1
- package/build/server/shared/providerCatalogData.js +22 -10
- 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/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 +23 -1
- 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/scripts/README.md +43 -26
- package/scripts/build-desktop-installer.mjs +15 -0
- 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-meta-cli.sh +8 -0
- package/scripts/linux/provider-cli-common.sh +103 -30
- package/scripts/linux/sync-agent-skills.sh +27 -5
- package/scripts/linux/test-linux-package-smoke.sh +4 -3
- package/scripts/linux/upgrade-cli-tools.sh +1 -1
- 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-meta-cli.sh +8 -0
- package/scripts/macos/provider-cli-common.sh +103 -30
- package/scripts/macos/sync-agent-skills.sh +27 -5
- package/scripts/macos/test-macos-package-smoke.sh +4 -3
- package/scripts/macos/upgrade-cli-tools.sh +1 -1
- package/scripts/package-desktop.mjs +15 -2
- package/scripts/testing/check-usage-app.mts +266 -0
- package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
- package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
- package/scripts/verify-desktop-app-bundle.mjs +108 -0
- package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
- package/scripts/windows/{Install-Aider.ps1 → Install-MetaCli.ps1} +180 -92
- package/scripts/windows/Install-Ollama.ps1 +4 -1
- package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
- package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +2 -1
- 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/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/scripts/linux/install-aider.sh +0 -8
- package/scripts/macos/install-aider.sh +0 -8
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,11 @@ 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 { resolveSelectedSetupAuditActions } from './setupAudit.js';
|
|
19
|
+
import { pauseSelectedSetupHelpers, retryPendingSetupOperationReleases, targetsForSetupHelper, withSelectedSetupTargets } from './providerSelection.js';
|
|
19
20
|
import { buildDesktopCliInventoryFromRuntime, probeContradictsCachedBootstrapState, } from './cliInventoryProbe.js';
|
|
20
21
|
import { createDesktopTrayController, } from './tray.js';
|
|
21
22
|
import { buildDesktopTrayMenuState as buildElectronTrayMenuState, buildDesktopTrayQuittingMenuState, } from './trayMenu.js';
|
|
@@ -27,7 +28,6 @@ import { createDesktopUpdateCapability, createDesktopUpdateManager, createUnavai
|
|
|
27
28
|
import { configureElectronUpdater, createElectronUpdaterAdapter, resolveAutoUpdaterExport, } from './updaterAdapter.js';
|
|
28
29
|
import { createDesktopUpdateIpcHandlers, createDesktopUpdateSnapshotBroadcast, } from './updateIpc.js';
|
|
29
30
|
import { withDesktopInstallHandoff } from './updateInstallHandoff.js';
|
|
30
|
-
import { DESKTOP_UPDATE_SETTINGS_PATH, resolveDesktopUpdateAnnouncement, } from './updateNotifications.js';
|
|
31
31
|
import { applyDesktopWindowChrome, resolveDesktopWindowChromeOptions, } from './windowChrome.js';
|
|
32
32
|
import { resolveDesktopWindowIconPath } from './windowIcon.js';
|
|
33
33
|
import { readDesktopStartupPreferences, resolveDesktopStartupLaunchContext, syncDesktopStartupPreferences, updateDesktopStartupPreferences, DESKTOP_LAUNCH_AT_LOGIN_ARG, } from './desktopStartup.js';
|
|
@@ -73,6 +73,7 @@ let runtimeCliInventoryPollTimer = null;
|
|
|
73
73
|
let runtimeCliInventoryScanPending = false;
|
|
74
74
|
let shuttingDown = false;
|
|
75
75
|
let shutdownPromise = null;
|
|
76
|
+
let setupHelperDrain = null;
|
|
76
77
|
let exitingAfterShutdown = false;
|
|
77
78
|
let trayController = null;
|
|
78
79
|
let stateStore = null;
|
|
@@ -133,8 +134,11 @@ function rememberRuntimeCliInventoryProbe(probe) {
|
|
|
133
134
|
if (!probe) {
|
|
134
135
|
return false;
|
|
135
136
|
}
|
|
136
|
-
if (probe.
|
|
137
|
-
|
|
137
|
+
if (latestCliInventoryProbe?.selection?.revision !== probe.selection?.revision) {
|
|
138
|
+
latestProviderDiagnosticsPayload = null;
|
|
139
|
+
}
|
|
140
|
+
latestCliInventoryProbe = probe;
|
|
141
|
+
if (probe.selection?.state !== 'selected' || (probe.scan && !isRuntimeCliInventoryScanActive(probe))) {
|
|
138
142
|
runtimeCliInventoryScanPending = false;
|
|
139
143
|
clearCliInventoryError();
|
|
140
144
|
return true;
|
|
@@ -753,58 +757,28 @@ function buildTrayControllerOptions() {
|
|
|
753
757
|
if (shuttingDown || !updateManager) {
|
|
754
758
|
return;
|
|
755
759
|
}
|
|
756
|
-
await runDesktopUpdateDialog(
|
|
760
|
+
await runDesktopUpdateDialog({
|
|
761
|
+
manager: updateManager,
|
|
762
|
+
platform: process.platform,
|
|
763
|
+
locale: app.getLocale(),
|
|
764
|
+
isShuttingDown: () => shuttingDown,
|
|
765
|
+
showDialog: async (dialogSpec) => {
|
|
766
|
+
const choice = await dialog.showMessageBox({
|
|
767
|
+
type: dialogSpec.action === 'none' ? 'info' : 'question',
|
|
768
|
+
title: dialogSpec.title,
|
|
769
|
+
message: dialogSpec.message,
|
|
770
|
+
detail: dialogSpec.detail,
|
|
771
|
+
buttons: dialogSpec.buttons,
|
|
772
|
+
defaultId: 0,
|
|
773
|
+
cancelId: dialogSpec.buttons.length - 1,
|
|
774
|
+
noLink: true,
|
|
775
|
+
});
|
|
776
|
+
return choice.response;
|
|
777
|
+
},
|
|
778
|
+
});
|
|
757
779
|
},
|
|
758
780
|
};
|
|
759
781
|
}
|
|
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
782
|
async function syncTrayController() {
|
|
809
783
|
if (shuttingDown) {
|
|
810
784
|
trayController?.updateMenu(buildDesktopTrayQuittingMenuState(app.getLocale()));
|
|
@@ -856,11 +830,26 @@ async function getSetupSnapshot() {
|
|
|
856
830
|
if (!hostConfig) {
|
|
857
831
|
throw new Error('Desktop host is not initialized.');
|
|
858
832
|
}
|
|
859
|
-
|
|
833
|
+
const snapshot = await buildDesktopSetupSnapshot({
|
|
860
834
|
config: hostConfig,
|
|
861
835
|
packaging: resolveCurrentPackagingPlan(hostConfig),
|
|
862
836
|
state: setupState ?? createEmptyDesktopSetupState(),
|
|
863
837
|
});
|
|
838
|
+
const probe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl);
|
|
839
|
+
snapshot.helpers = snapshot.helpers.filter((helper) => {
|
|
840
|
+
if (!probe?.selection)
|
|
841
|
+
return false;
|
|
842
|
+
try {
|
|
843
|
+
return targetsForSetupHelper(helper.id, probe.selection).length > 0;
|
|
844
|
+
}
|
|
845
|
+
catch {
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
});
|
|
849
|
+
if (snapshot.resumeAction && !snapshot.helpers.some((helper) => helper.id === snapshot.resumeAction.helperId)) {
|
|
850
|
+
snapshot.resumeAction = null;
|
|
851
|
+
}
|
|
852
|
+
return snapshot;
|
|
864
853
|
}
|
|
865
854
|
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
866
855
|
const controller = new AbortController();
|
|
@@ -890,86 +879,39 @@ async function fetchJsonWithTimeout(url, init, timeoutMs) {
|
|
|
890
879
|
}
|
|
891
880
|
return await response.json();
|
|
892
881
|
}
|
|
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
882
|
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
|
-
}
|
|
883
|
+
await retryPendingSetupOperationReleases();
|
|
884
|
+
const timeout = options.setupStateTimeoutMs ?? RUNTIME_SETUP_STATE_TIMEOUT_MS;
|
|
885
|
+
let probe;
|
|
886
|
+
try {
|
|
887
|
+
probe = await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
|
|
936
888
|
}
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
//
|
|
889
|
+
catch {
|
|
890
|
+
return null;
|
|
891
|
+
}
|
|
892
|
+
// A forced scan still needs a current, nonempty declared selection.
|
|
893
|
+
if (probe.selection?.state !== 'selected')
|
|
894
|
+
return probe;
|
|
895
|
+
if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe))
|
|
896
|
+
return probe;
|
|
897
|
+
if (!options.forceRescan && (probe.scan || !options.triggerScanIfMissing))
|
|
898
|
+
return probe;
|
|
941
899
|
try {
|
|
942
900
|
runtimeCliInventoryScanPending = true;
|
|
943
|
-
const
|
|
901
|
+
const response = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
|
|
944
902
|
method: 'POST',
|
|
945
903
|
headers: { 'content-type': 'application/json', accept: 'application/json' },
|
|
946
|
-
body: JSON.stringify({ manual:
|
|
947
|
-
}, scanTimeoutMs);
|
|
948
|
-
if (!
|
|
904
|
+
body: JSON.stringify({ manual: options.forceRescan === true, targets: probe.selection.targets }),
|
|
905
|
+
}, options.scanTimeoutMs ?? RUNTIME_SETUP_SCAN_TIMEOUT_MS);
|
|
906
|
+
if (!response.ok)
|
|
949
907
|
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);
|
|
908
|
+
return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
|
|
960
909
|
}
|
|
961
910
|
catch {
|
|
911
|
+
runtimeCliInventoryScanPending = false;
|
|
962
912
|
return probe;
|
|
963
913
|
}
|
|
964
914
|
}
|
|
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
915
|
function buildSnapshot(lastError) {
|
|
974
916
|
if (!hostConfig || !supervisor) {
|
|
975
917
|
throw new Error('Desktop host is not initialized.');
|
|
@@ -992,6 +934,8 @@ function buildSnapshot(lastError) {
|
|
|
992
934
|
packaging: packagingState ?? undefined,
|
|
993
935
|
setup: setupState ?? undefined,
|
|
994
936
|
hostStatePath: hostConfig.paths.hostStatePath,
|
|
937
|
+
providerSelection: latestCliInventoryProbe?.selection ?? null,
|
|
938
|
+
providerCatalog: latestCliInventoryProbe?.universe ?? [],
|
|
995
939
|
cliInventory: resolveSnapshotCliInventory(),
|
|
996
940
|
cliInventoryError: latestCliInventoryError,
|
|
997
941
|
});
|
|
@@ -1016,7 +960,7 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
|
|
|
1016
960
|
?? await readPersistedSetupCompletionState(hostConfig.paths.appStatePath);
|
|
1017
961
|
latestPersistedSetupState = effectivePersistedSetup;
|
|
1018
962
|
const setupCompleted = Boolean(effectivePersistedSetup.setupCompleteAt || effectivePersistedSetup.productSetupCompleted);
|
|
1019
|
-
const shouldReadCliInventory =
|
|
963
|
+
const shouldReadCliInventory = true;
|
|
1020
964
|
// /diagnostics/providers is intentionally NOT fetched on the boot critical
|
|
1021
965
|
// path — it's not authoritative for any phase decision before setup, and
|
|
1022
966
|
// for setup-complete users we kick it off in the background (see
|
|
@@ -1071,6 +1015,8 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
|
|
|
1071
1015
|
packaging: packagingState ?? undefined,
|
|
1072
1016
|
setup: setupState ?? undefined,
|
|
1073
1017
|
hostStatePath: hostConfig.paths.hostStatePath,
|
|
1018
|
+
providerSelection: latestCliInventoryProbe?.selection ?? null,
|
|
1019
|
+
providerCatalog: latestCliInventoryProbe?.universe ?? [],
|
|
1074
1020
|
cliInventory: resolveSnapshotCliInventory(),
|
|
1075
1021
|
cliInventoryError: latestCliInventoryError,
|
|
1076
1022
|
});
|
|
@@ -1082,28 +1028,20 @@ function hasPersistedProductSetupCompletion(persistedSetup = null) {
|
|
|
1082
1028
|
const productEvents = diagnosticsState?.product?.events ?? [];
|
|
1083
1029
|
return productEvents.some((event) => event.kind === 'setup_completed' && event.status === 'ok');
|
|
1084
1030
|
}
|
|
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) {
|
|
1031
|
+
const auditedSetupHelpers = new Set();
|
|
1032
|
+
async function maybePrimeSetupAudit(_snapshot, _persistedSetup = null) {
|
|
1033
|
+
if (!hostConfig)
|
|
1097
1034
|
return;
|
|
1035
|
+
const selection = latestCliInventoryProbe?.selection ?? null;
|
|
1036
|
+
for (const action of resolveSelectedSetupAuditActions(selection)) {
|
|
1037
|
+
const key = `${selection.revision}:${action.helperId}`;
|
|
1038
|
+
if (auditedSetupHelpers.has(key))
|
|
1039
|
+
continue;
|
|
1040
|
+
auditedSetupHelpers.add(key);
|
|
1041
|
+
await runSetupAction({ helperId: action.helperId, mode: 'check' }, {
|
|
1042
|
+
publishMode: 'bootstrap-only', refreshBootstrap: false,
|
|
1043
|
+
});
|
|
1098
1044
|
}
|
|
1099
|
-
await runSetupAction({
|
|
1100
|
-
helperId: setupAuditAction.helperId,
|
|
1101
|
-
mode: 'check',
|
|
1102
|
-
extraArguments: setupAuditAction.extraArguments,
|
|
1103
|
-
}, {
|
|
1104
|
-
publishMode: 'bootstrap-only',
|
|
1105
|
-
refreshBootstrap: false,
|
|
1106
|
-
});
|
|
1107
1045
|
}
|
|
1108
1046
|
function scheduleBackgroundSetupAudit(snapshot, persistedSetup = null) {
|
|
1109
1047
|
if (isDesktopBootstrapLoadingPhase(snapshot.phase) || backgroundSetupAuditPromise) {
|
|
@@ -1199,7 +1137,7 @@ async function retryCliInventoryScanInBackground(options) {
|
|
|
1199
1137
|
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
1200
1138
|
}
|
|
1201
1139
|
}
|
|
1202
|
-
if (
|
|
1140
|
+
if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(latestCliInventoryProbe)) {
|
|
1203
1141
|
scheduleRuntimeCliInventoryPoll({
|
|
1204
1142
|
setupCompleted: options.setupCompleted,
|
|
1205
1143
|
});
|
|
@@ -1228,22 +1166,12 @@ function scheduleBackgroundBootstrapWork(snapshot, persistedSetup) {
|
|
|
1228
1166
|
const setupCompleted = Boolean(snapshot.app.setupCompleteAt
|
|
1229
1167
|
?? persistedSetup?.setupCompleteAt
|
|
1230
1168
|
?? 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.
|
|
1169
|
+
// Run shared Node and local-model checks only for eligible selected targets.
|
|
1235
1170
|
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.
|
|
1171
|
+
// Inventory observes the saved selection; missing/invalid/empty selections
|
|
1172
|
+
// never launch a provider scan. Availability does not gate product onboarding.
|
|
1245
1173
|
void retryCliInventoryScanInBackground({
|
|
1246
|
-
forceRescan:
|
|
1174
|
+
forceRescan: false,
|
|
1247
1175
|
setupCompleted,
|
|
1248
1176
|
}).catch((error) => {
|
|
1249
1177
|
process.stderr.write(`Background CLI inventory rescan failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
@@ -1378,7 +1306,17 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
|
|
|
1378
1306
|
// supervisor-lifetime environment snapshot populated during the first
|
|
1379
1307
|
// bootstrap, including the Desktop-provisioned platform auth secret.
|
|
1380
1308
|
exitingAfterShutdown = false;
|
|
1381
|
-
|
|
1309
|
+
try {
|
|
1310
|
+
await supervisor?.startAll();
|
|
1311
|
+
}
|
|
1312
|
+
finally {
|
|
1313
|
+
// A failed recovery leaves Runtime unavailable, not helper admission
|
|
1314
|
+
// permanently paused after a later successful Retry.
|
|
1315
|
+
if (!shuttingDown) {
|
|
1316
|
+
setupHelperDrain?.resume();
|
|
1317
|
+
setupHelperDrain = null;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1382
1320
|
await syncTrayController();
|
|
1383
1321
|
},
|
|
1384
1322
|
exitAfterUncertainHandoff: async () => {
|
|
@@ -1409,77 +1347,6 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
|
|
|
1409
1347
|
},
|
|
1410
1348
|
});
|
|
1411
1349
|
}
|
|
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
1350
|
async function bootstrapDesktopHost(restartServices = false) {
|
|
1484
1351
|
if (!hostConfig || !supervisor) {
|
|
1485
1352
|
throw new Error('Desktop host is not initialized.');
|
|
@@ -1487,7 +1354,9 @@ async function bootstrapDesktopHost(restartServices = false) {
|
|
|
1487
1354
|
if (bootstrapPromise) {
|
|
1488
1355
|
return bootstrapPromise;
|
|
1489
1356
|
}
|
|
1357
|
+
const helperPause = restartServices ? pauseSelectedSetupHelpers() : null;
|
|
1490
1358
|
bootstrapPromise = (async () => {
|
|
1359
|
+
await helperPause?.drained;
|
|
1491
1360
|
latestBootstrapError = null;
|
|
1492
1361
|
latestCliInventoryError = null;
|
|
1493
1362
|
runtimeCliInventoryScanPending = false;
|
|
@@ -1523,6 +1392,7 @@ async function bootstrapDesktopHost(restartServices = false) {
|
|
|
1523
1392
|
const snapshot = publishSnapshot(buildSnapshot());
|
|
1524
1393
|
return maybeOpenApp(snapshot).then(() => snapshot);
|
|
1525
1394
|
}).finally(() => {
|
|
1395
|
+
helperPause?.resume();
|
|
1526
1396
|
bootstrapPromise = null;
|
|
1527
1397
|
});
|
|
1528
1398
|
return bootstrapPromise;
|
|
@@ -1553,17 +1423,15 @@ async function runHostAction(actionId) {
|
|
|
1553
1423
|
}
|
|
1554
1424
|
if (actionId === 'open_setup') {
|
|
1555
1425
|
const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
|
|
1556
|
-
if (
|
|
1426
|
+
if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
|
|
1557
1427
|
return snapshot;
|
|
1558
|
-
}
|
|
1559
1428
|
await showMainWindow(`${hostConfig.appBaseUrl}/setup`);
|
|
1560
1429
|
return snapshot;
|
|
1561
1430
|
}
|
|
1562
1431
|
if (actionId === 'open_chat') {
|
|
1563
1432
|
const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
|
|
1564
|
-
if (
|
|
1433
|
+
if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
|
|
1565
1434
|
return snapshot;
|
|
1566
|
-
}
|
|
1567
1435
|
await showMainWindow(`${hostConfig.appBaseUrl}${snapshot.app.entryPath}`);
|
|
1568
1436
|
return snapshot;
|
|
1569
1437
|
}
|
|
@@ -1578,10 +1446,9 @@ async function runSetupAction(action, options = {}) {
|
|
|
1578
1446
|
throw new Error('Desktop host is not initialized.');
|
|
1579
1447
|
}
|
|
1580
1448
|
const packaging = resolveCurrentPackagingPlan(hostConfig);
|
|
1581
|
-
const result = await
|
|
1582
|
-
|
|
1583
|
-
packaging,
|
|
1584
|
-
action,
|
|
1449
|
+
const result = await withSelectedSetupTargets({
|
|
1450
|
+
baseUrl: hostConfig.runtimeBaseUrl, helperId: action.helperId,
|
|
1451
|
+
run: () => runDesktopSetupHelper({ config: hostConfig, packaging, action }),
|
|
1585
1452
|
});
|
|
1586
1453
|
packagingState = packaging;
|
|
1587
1454
|
setupState = {
|
|
@@ -1620,8 +1487,7 @@ async function runSetupAction(action, options = {}) {
|
|
|
1620
1487
|
// depend on the helper's runState — the rescan itself is authoritative.
|
|
1621
1488
|
const setupCompleted = hasPersistedSetupCompletion();
|
|
1622
1489
|
const shouldRefreshCliInventory = action.mode !== 'check'
|
|
1623
|
-
&& shouldRefreshCliInventoryAfterSetupAction(action.helperId)
|
|
1624
|
-
&& (setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate');
|
|
1490
|
+
&& shouldRefreshCliInventoryAfterSetupAction(action.helperId);
|
|
1625
1491
|
if (shouldRefreshCliInventory) {
|
|
1626
1492
|
const refreshedProbe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl, {
|
|
1627
1493
|
forceRescan: true,
|
|
@@ -1750,6 +1616,9 @@ function waitForShutdownDeadline(ms) {
|
|
|
1750
1616
|
* surviving sidecar may still hold.
|
|
1751
1617
|
*/
|
|
1752
1618
|
async function drainManagedServices() {
|
|
1619
|
+
setupHelperDrain ??= pauseSelectedSetupHelpers();
|
|
1620
|
+
// Installer completion is outside the sidecar shutdown watchdog budget.
|
|
1621
|
+
await setupHelperDrain.drained;
|
|
1753
1622
|
const drain = supervisor?.stopAll() ?? Promise.resolve();
|
|
1754
1623
|
const shutdownWatchdogMs = hostConfig
|
|
1755
1624
|
? resolveShutdownWatchdogMs(hostConfig, supervisor?.getManagedServiceCount() ?? 0)
|
|
@@ -1773,8 +1642,10 @@ async function shutdownHost() {
|
|
|
1773
1642
|
return shutdownPromise;
|
|
1774
1643
|
}
|
|
1775
1644
|
shuttingDown = true;
|
|
1645
|
+
setupHelperDrain ??= pauseSelectedSetupHelpers();
|
|
1776
1646
|
clearRuntimeCliInventoryPoll();
|
|
1777
1647
|
shutdownPromise = (async () => {
|
|
1648
|
+
await setupHelperDrain.drained;
|
|
1778
1649
|
let shutdownExitCode = 0;
|
|
1779
1650
|
let forcedStopAttempted = false;
|
|
1780
1651
|
const activeTrayController = trayController;
|
|
@@ -1819,11 +1690,8 @@ async function main() {
|
|
|
1819
1690
|
return;
|
|
1820
1691
|
}
|
|
1821
1692
|
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.
|
|
1693
|
+
// Keep the packaged process identity aligned with the installer-created
|
|
1694
|
+
// Windows shortcuts and taskbar grouping.
|
|
1827
1695
|
if (process.platform === 'win32' && app.isPackaged && DESKTOP_APP_USER_MODEL_ID) {
|
|
1828
1696
|
app.setAppUserModelId(DESKTOP_APP_USER_MODEL_ID);
|
|
1829
1697
|
}
|
|
@@ -1939,6 +1807,33 @@ async function main() {
|
|
|
1939
1807
|
}
|
|
1940
1808
|
return await runHostAction(actionId);
|
|
1941
1809
|
});
|
|
1810
|
+
ipcMain.handle('cats-host:save-provider-selection', async (event, payload) => {
|
|
1811
|
+
assertMainWindowIpcSender(event, mainWindow, 'Provider selection is only available to the main Cats window.');
|
|
1812
|
+
if (!hostConfig || !payload || typeof payload !== 'object')
|
|
1813
|
+
throw new Error('Invalid provider selection.');
|
|
1814
|
+
const body = payload;
|
|
1815
|
+
if ((!Array.isArray(body.targets) && body.reload !== true) || typeof body.expectedRevision !== 'string') {
|
|
1816
|
+
throw new Error('Invalid provider selection.');
|
|
1817
|
+
}
|
|
1818
|
+
await retryPendingSetupOperationReleases();
|
|
1819
|
+
const response = await fetchWithTimeout(`${hostConfig.runtimeBaseUrl}/setup-selection${body.reload === true ? '/reload' : ''}`, {
|
|
1820
|
+
method: body.reload === true ? 'POST' : 'PUT',
|
|
1821
|
+
headers: { 'content-type': 'application/json' },
|
|
1822
|
+
body: JSON.stringify({ targets: body.targets, expectedRevision: body.expectedRevision }),
|
|
1823
|
+
}, RUNTIME_SETUP_STATE_TIMEOUT_MS);
|
|
1824
|
+
if (!response.ok) {
|
|
1825
|
+
const result = await response.json();
|
|
1826
|
+
throw new Error(result.error || 'Could not save provider selection.');
|
|
1827
|
+
}
|
|
1828
|
+
latestProviderDiagnosticsPayload = null;
|
|
1829
|
+
latestCliInventoryError = null;
|
|
1830
|
+
runtimeCliInventoryScanPending = false;
|
|
1831
|
+
const snapshot = await refreshBootstrapSnapshot();
|
|
1832
|
+
publishSnapshot(snapshot);
|
|
1833
|
+
scheduleBackgroundBootstrapWork(snapshot, latestPersistedSetupState);
|
|
1834
|
+
await maybeOpenApp(snapshot);
|
|
1835
|
+
return snapshot;
|
|
1836
|
+
});
|
|
1942
1837
|
ipcMain.handle('cats-host:run-setup-helper', async (_event, payload) => {
|
|
1943
1838
|
if (typeof payload !== 'object'
|
|
1944
1839
|
|| payload === null
|
|
@@ -2135,7 +2030,7 @@ async function main() {
|
|
|
2135
2030
|
// SPEC-111 section 6: at most one silent check per launch, and only when the
|
|
2136
2031
|
// build actually has update capability.
|
|
2137
2032
|
if (hostConfig.update.checkOnStartup && updateManager?.getSnapshot().capability.canCheck) {
|
|
2138
|
-
void
|
|
2033
|
+
void updateManager.checkForUpdates();
|
|
2139
2034
|
}
|
|
2140
2035
|
}
|
|
2141
2036
|
void main().catch((error) => {
|