@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.
Files changed (548) hide show
  1. package/.env.example +3 -7
  2. package/README.md +35 -0
  3. package/build/desktop/bootstrapNavigation.d.ts.map +1 -1
  4. package/build/desktop/bootstrapNavigation.js +6 -13
  5. package/build/desktop/bootstrapNavigation.js.map +1 -1
  6. package/build/desktop/bootstrapPage.d.ts.map +1 -1
  7. package/build/desktop/bootstrapPage.js +63 -86
  8. package/build/desktop/bootstrapPage.js.map +1 -1
  9. package/build/desktop/cliInventoryProbe.d.ts +11 -2
  10. package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
  11. package/build/desktop/cliInventoryProbe.js +19 -13
  12. package/build/desktop/cliInventoryProbe.js.map +1 -1
  13. package/build/desktop/config.d.ts +0 -4
  14. package/build/desktop/config.d.ts.map +1 -1
  15. package/build/desktop/config.js +1 -6
  16. package/build/desktop/config.js.map +1 -1
  17. package/build/desktop/contracts.d.ts +12 -2
  18. package/build/desktop/contracts.d.ts.map +1 -1
  19. package/build/desktop/contracts.js +1 -2
  20. package/build/desktop/contracts.js.map +1 -1
  21. package/build/desktop/hostVersion.d.ts.map +1 -1
  22. package/build/desktop/hostVersion.js +3 -5
  23. package/build/desktop/hostVersion.js.map +1 -1
  24. package/build/desktop/main.js +205 -256
  25. package/build/desktop/main.js.map +1 -1
  26. package/build/desktop/packaging.d.ts +2 -0
  27. package/build/desktop/packaging.d.ts.map +1 -1
  28. package/build/desktop/packaging.js +34 -14
  29. package/build/desktop/packaging.js.map +1 -1
  30. package/build/desktop/preload.cjs +9 -0
  31. package/build/desktop/preload.cjs.map +1 -1
  32. package/build/desktop/processSupervisor.d.ts.map +1 -1
  33. package/build/desktop/processSupervisor.js +3 -0
  34. package/build/desktop/processSupervisor.js.map +1 -1
  35. package/build/desktop/providerManager.d.ts +46 -0
  36. package/build/desktop/providerManager.d.ts.map +1 -0
  37. package/build/desktop/providerManager.js +220 -0
  38. package/build/desktop/providerManager.js.map +1 -0
  39. package/build/desktop/providerSelection.d.ts +38 -0
  40. package/build/desktop/providerSelection.d.ts.map +1 -0
  41. package/build/desktop/providerSelection.js +118 -0
  42. package/build/desktop/providerSelection.js.map +1 -0
  43. package/build/desktop/readiness.d.ts +2 -0
  44. package/build/desktop/readiness.d.ts.map +1 -1
  45. package/build/desktop/readiness.js +14 -33
  46. package/build/desktop/readiness.js.map +1 -1
  47. package/build/desktop/setupAssets.d.ts.map +1 -1
  48. package/build/desktop/setupAssets.js +28 -14
  49. package/build/desktop/setupAssets.js.map +1 -1
  50. package/build/desktop/setupAudit.d.ts +4 -3
  51. package/build/desktop/setupAudit.d.ts.map +1 -1
  52. package/build/desktop/setupAudit.js +18 -34
  53. package/build/desktop/setupAudit.js.map +1 -1
  54. package/build/desktop/setupBridge.js +1 -1
  55. package/build/desktop/setupBridge.js.map +1 -1
  56. package/build/desktop/setupPrerequisites.d.ts +11 -0
  57. package/build/desktop/setupPrerequisites.d.ts.map +1 -0
  58. package/build/desktop/setupPrerequisites.js +47 -0
  59. package/build/desktop/setupPrerequisites.js.map +1 -0
  60. package/build/desktop/updateDialog.d.ts +27 -1
  61. package/build/desktop/updateDialog.d.ts.map +1 -1
  62. package/build/desktop/updateDialog.js +85 -5
  63. package/build/desktop/updateDialog.js.map +1 -1
  64. package/build/renderer/assets/ActiveSessionPermissionChip-B49WcZBJ.js +1 -0
  65. package/build/renderer/assets/App-BpxZB5ym.js +2 -0
  66. package/build/renderer/assets/App-DYTUfAl6.js +1 -0
  67. package/build/renderer/assets/App-DxsV-tKS.css +1 -0
  68. package/build/renderer/assets/{App-DKOSn0o_.js → App-boB4WrmU.js} +1 -1
  69. package/build/renderer/assets/WorkspaceAppRoutes-CPqz85iw.js +1 -0
  70. package/build/renderer/assets/app-C52wwCGz.js +85 -0
  71. package/build/renderer/assets/app-CqnsY5ed.css +1 -0
  72. package/build/renderer/assets/{client-BdGHAUoK.js → client-DREGSZqQ.js} +1 -1
  73. package/build/renderer/assets/conversationSidebarRecentEntries-DK0iWS73.js +6 -0
  74. package/build/renderer/assets/{screenshotOverlay-DfBcolX-.js → screenshotOverlay-EF07cXvw.js} +1 -1
  75. package/build/renderer/assets/{useDraftSessionChips-DCIId0eY.js → useDraftSessionChips-BdZ_B1gy.js} +1 -1
  76. package/build/renderer/desktop/overlay/index.html +2 -2
  77. package/build/renderer/index.html +3 -3
  78. package/build/server/app/renderer/auth/api.d.ts.map +1 -1
  79. package/build/server/app/renderer/auth/api.js +4 -1
  80. package/build/server/app/renderer/auth/api.js.map +1 -1
  81. package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
  82. package/build/server/app/renderer/providerCatalogClient.js +34 -12
  83. package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
  84. package/build/server/app/renderer/providerClientInvalidation.d.ts +6 -0
  85. package/build/server/app/renderer/providerClientInvalidation.d.ts.map +1 -0
  86. package/build/server/app/renderer/providerClientInvalidation.js +12 -0
  87. package/build/server/app/renderer/providerClientInvalidation.js.map +1 -0
  88. package/build/server/app/renderer/providerReadLoop.d.ts +5 -0
  89. package/build/server/app/renderer/providerReadLoop.d.ts.map +1 -0
  90. package/build/server/app/renderer/providerReadLoop.js +52 -0
  91. package/build/server/app/renderer/providerReadLoop.js.map +1 -0
  92. package/build/server/app/renderer/providerRegistryClient.d.ts +3 -2
  93. package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
  94. package/build/server/app/renderer/providerRegistryClient.js +51 -53
  95. package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
  96. package/build/server/app/server/appPackageRoutes.d.ts +2 -0
  97. package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
  98. package/build/server/app/server/appPackageRoutes.js +105 -0
  99. package/build/server/app/server/appPackageRoutes.js.map +1 -1
  100. package/build/server/app/server/authGatePolicy.js +14 -1
  101. package/build/server/app/server/authGatePolicy.js.map +1 -1
  102. package/build/server/app/server/contracts.d.ts +15 -0
  103. package/build/server/app/server/contracts.d.ts.map +1 -1
  104. package/build/server/app/server/dependencies.d.ts.map +1 -1
  105. package/build/server/app/server/dependencies.js +42 -1
  106. package/build/server/app/server/dependencies.js.map +1 -1
  107. package/build/server/app/server/goldenPathStartupResume.d.ts +55 -0
  108. package/build/server/app/server/goldenPathStartupResume.d.ts.map +1 -0
  109. package/build/server/app/server/goldenPathStartupResume.js +109 -0
  110. package/build/server/app/server/goldenPathStartupResume.js.map +1 -0
  111. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  112. package/build/server/app/server/platformSetupRoutes.js +1 -13
  113. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  114. package/build/server/app/server/polling.d.ts.map +1 -1
  115. package/build/server/app/server/polling.js +2 -0
  116. package/build/server/app/server/polling.js.map +1 -1
  117. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  118. package/build/server/app/server/requestRouter.js +30 -0
  119. package/build/server/app/server/requestRouter.js.map +1 -1
  120. package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
  121. package/build/server/app/server/runtimeSurfaceProxy.js +4 -2
  122. package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
  123. package/build/server/app/server/startupRecovery.d.ts.map +1 -1
  124. package/build/server/app/server/startupRecovery.js +5 -0
  125. package/build/server/app/server/startupRecovery.js.map +1 -1
  126. package/build/server/app/server/subscribeRoutes.d.ts.map +1 -1
  127. package/build/server/app/server/subscribeRoutes.js +5 -3
  128. package/build/server/app/server/subscribeRoutes.js.map +1 -1
  129. package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
  130. package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
  131. package/build/server/app/server/telegramCommandSurface.js +123 -0
  132. package/build/server/app/server/telegramCommandSurface.js.map +1 -0
  133. package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
  134. package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
  135. package/build/server/app/server/transportWorkGoldenPath.js +307 -0
  136. package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
  137. package/build/server/config.d.ts +21 -0
  138. package/build/server/config.d.ts.map +1 -1
  139. package/build/server/config.js +12 -0
  140. package/build/server/config.js.map +1 -1
  141. package/build/server/design/components/providerModelFieldsSupport.d.ts +5 -24
  142. package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
  143. package/build/server/design/components/providerModelFieldsSupport.js +65 -70
  144. package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
  145. package/build/server/design/components/useProviderCatalogState.d.ts +2 -2
  146. package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
  147. package/build/server/design/components/useProviderCatalogState.js +71 -151
  148. package/build/server/design/components/useProviderCatalogState.js.map +1 -1
  149. package/build/server/design/components/useProviderModelFieldActions.js +2 -2
  150. package/build/server/design/components/useProviderModelFieldActions.js.map +1 -1
  151. package/build/server/design/components/useProviderRegistryState.d.ts +1 -7
  152. package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
  153. package/build/server/design/components/useProviderRegistryState.js +41 -104
  154. package/build/server/design/components/useProviderRegistryState.js.map +1 -1
  155. package/build/server/design/components/useProviderTargetReconciliation.d.ts +1 -0
  156. package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
  157. package/build/server/design/components/useProviderTargetReconciliation.js +3 -2
  158. package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
  159. package/build/server/index.js +4 -0
  160. package/build/server/index.js.map +1 -1
  161. package/build/server/platform/apps/packageInstaller.d.ts +19 -0
  162. package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
  163. package/build/server/platform/apps/packageInstaller.js +92 -0
  164. package/build/server/platform/apps/packageInstaller.js.map +1 -0
  165. package/build/server/platform/apps/registry.d.ts +6 -0
  166. package/build/server/platform/apps/registry.d.ts.map +1 -1
  167. package/build/server/platform/apps/registry.js +24 -0
  168. package/build/server/platform/apps/registry.js.map +1 -1
  169. package/build/server/platform/apps/renderer.d.ts +6 -0
  170. package/build/server/platform/apps/renderer.d.ts.map +1 -0
  171. package/build/server/platform/apps/renderer.js +18 -0
  172. package/build/server/platform/apps/renderer.js.map +1 -0
  173. package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts +2 -1
  174. package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts.map +1 -1
  175. package/build/server/platform/orchestration/entitySubscriptions/channel.js +3 -18
  176. package/build/server/platform/orchestration/entitySubscriptions/channel.js.map +1 -1
  177. package/build/server/platform/orchestration/entitySubscriptions/index.d.ts +1 -0
  178. package/build/server/platform/orchestration/entitySubscriptions/index.d.ts.map +1 -1
  179. package/build/server/platform/orchestration/entitySubscriptions/index.js.map +1 -1
  180. package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
  181. package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
  182. package/build/server/platform/runtime/deliveryClient.js +289 -0
  183. package/build/server/platform/runtime/deliveryClient.js.map +1 -0
  184. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
  185. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
  186. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
  187. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
  188. package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
  189. package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
  190. package/build/server/platform/supervision/runtimeBoundary.js +2 -2
  191. package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
  192. package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
  193. package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
  194. package/build/server/platform/transports/telegram/bridge.js +176 -0
  195. package/build/server/platform/transports/telegram/bridge.js.map +1 -1
  196. package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
  197. package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
  198. package/build/server/platform/transports/telegram/commandPort.js +17 -0
  199. package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
  200. package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
  201. package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
  202. package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
  203. package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
  204. package/build/server/platform/transports/telegram/commands/index.js +38 -0
  205. package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
  206. package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
  207. package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
  208. package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
  209. package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
  210. package/build/server/platform/transports/telegram/polling.d.ts +34 -0
  211. package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
  212. package/build/server/platform/transports/telegram/polling.js +86 -9
  213. package/build/server/platform/transports/telegram/polling.js.map +1 -1
  214. package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
  215. package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
  216. package/build/server/platform/transports/telegram/relay/index.js +5 -1
  217. package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
  218. package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
  219. package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
  220. package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
  221. package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
  222. package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
  223. package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
  224. package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
  225. package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
  226. package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
  227. package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
  228. package/build/server/platform/transports/work-delivery/contracts.js +26 -0
  229. package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
  230. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
  231. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
  232. package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
  233. package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
  234. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
  235. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
  236. package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
  237. package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
  238. package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
  239. package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
  240. package/build/server/platform/transports/work-delivery/outbox.js +270 -0
  241. package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
  242. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
  243. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
  244. package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
  245. package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
  246. package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
  247. package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
  248. package/build/server/platform/transports/work-delivery/port.js +15 -0
  249. package/build/server/platform/transports/work-delivery/port.js.map +1 -0
  250. package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
  251. package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
  252. package/build/server/platform/transports/work-delivery/proposal.js +59 -0
  253. package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
  254. package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
  255. package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
  256. package/build/server/platform/transports/work-delivery/readiness.js +123 -0
  257. package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
  258. package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
  259. package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
  260. package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
  261. package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
  262. package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
  263. package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
  264. package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
  265. package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
  266. package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
  267. package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
  268. package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
  269. package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
  270. package/build/server/products/chat/api/contracts.d.ts +10 -0
  271. package/build/server/products/chat/api/contracts.d.ts.map +1 -1
  272. package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
  273. package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
  274. package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
  275. package/build/server/products/chat/api/routeSupport.d.ts +17 -1
  276. package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
  277. package/build/server/products/chat/api/routeSupport.js +27 -4
  278. package/build/server/products/chat/api/routeSupport.js.map +1 -1
  279. package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
  280. package/build/server/products/chat/api/setupRoutes.js +23 -8
  281. package/build/server/products/chat/api/setupRoutes.js.map +1 -1
  282. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
  283. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
  284. package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
  285. package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
  286. package/build/server/products/chat/state/model/index.d.ts +1 -1
  287. package/build/server/products/chat/state/model/index.d.ts.map +1 -1
  288. package/build/server/products/chat/state/model/index.js +1 -1
  289. package/build/server/products/chat/state/model/index.js.map +1 -1
  290. package/build/server/products/chat/state/model/readModels.d.ts +1 -0
  291. package/build/server/products/chat/state/model/readModels.d.ts.map +1 -1
  292. package/build/server/products/chat/state/model/readModels.js +2 -1
  293. package/build/server/products/chat/state/model/readModels.js.map +1 -1
  294. package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
  295. package/build/server/products/code/api/relayRoutes.js +36 -7
  296. package/build/server/products/code/api/relayRoutes.js.map +1 -1
  297. package/build/server/products/code/state/relayState.d.ts +2 -1
  298. package/build/server/products/code/state/relayState.d.ts.map +1 -1
  299. package/build/server/products/code/state/relayState.js +7 -7
  300. package/build/server/products/code/state/relayState.js.map +1 -1
  301. package/build/server/products/shared/api/workspaceContracts.d.ts +5 -0
  302. package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
  303. package/build/server/products/shared/renderer/api/appShell.d.ts +1 -0
  304. package/build/server/products/shared/renderer/api/appShell.d.ts.map +1 -1
  305. package/build/server/products/shared/renderer/api/appShell.js +9 -0
  306. package/build/server/products/shared/renderer/api/appShell.js.map +1 -1
  307. package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
  308. package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
  309. package/build/server/products/work/api/goldenPathProjection.js +252 -0
  310. package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
  311. package/build/server/products/work/api/index.d.ts +54 -1
  312. package/build/server/products/work/api/index.d.ts.map +1 -1
  313. package/build/server/products/work/api/index.js +182 -4
  314. package/build/server/products/work/api/index.js.map +1 -1
  315. package/build/server/products/work/api/projection.d.ts +7 -1
  316. package/build/server/products/work/api/projection.d.ts.map +1 -1
  317. package/build/server/products/work/api/projection.js +7 -1
  318. package/build/server/products/work/api/projection.js.map +1 -1
  319. package/build/server/products/work/shared/apiPaths.d.ts +8 -0
  320. package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
  321. package/build/server/products/work/shared/apiPaths.js +8 -0
  322. package/build/server/products/work/shared/apiPaths.js.map +1 -1
  323. package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
  324. package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
  325. package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
  326. package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
  327. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
  328. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
  329. package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
  330. package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
  331. package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
  332. package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
  333. package/build/server/products/work/state/workCompletionEvidence.js +59 -0
  334. package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
  335. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
  336. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
  337. package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
  338. package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
  339. package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
  340. package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
  341. package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
  342. package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
  343. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
  344. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
  345. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
  346. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
  347. package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
  348. package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
  349. package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
  350. package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
  351. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
  352. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
  353. package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
  354. package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
  355. package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
  356. package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
  357. package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
  358. package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
  359. package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
  360. package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
  361. package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
  362. package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
  363. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
  364. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
  365. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
  366. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
  367. package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
  368. package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
  369. package/build/server/products/work/state/workGoldenPathService.js +1057 -0
  370. package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
  371. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
  372. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
  373. package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
  374. package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
  375. package/build/server/runtime/client.d.ts +13 -0
  376. package/build/server/runtime/client.d.ts.map +1 -1
  377. package/build/server/runtime/client.js +44 -1
  378. package/build/server/runtime/client.js.map +1 -1
  379. package/build/server/runtime/setup.d.ts +14 -4
  380. package/build/server/runtime/setup.d.ts.map +1 -1
  381. package/build/server/runtime/setup.js +17 -19
  382. package/build/server/runtime/setup.js.map +1 -1
  383. package/build/server/runtime/usageSnapshot.d.ts +3 -0
  384. package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
  385. package/build/server/runtime/usageSnapshot.js +69 -0
  386. package/build/server/runtime/usageSnapshot.js.map +1 -0
  387. package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
  388. package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
  389. package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
  390. package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
  391. package/build/server/server/routes/providers.d.ts.map +1 -1
  392. package/build/server/server/routes/providers.js +133 -131
  393. package/build/server/server/routes/providers.js.map +1 -1
  394. package/build/server/server/routes/telegram.d.ts +9 -0
  395. package/build/server/server/routes/telegram.d.ts.map +1 -1
  396. package/build/server/server/routes/telegram.js +79 -72
  397. package/build/server/server/routes/telegram.js.map +1 -1
  398. package/build/server/shared/catsAppManifest.d.ts +3 -1
  399. package/build/server/shared/catsAppManifest.d.ts.map +1 -1
  400. package/build/server/shared/catsAppManifest.js +2 -0
  401. package/build/server/shared/catsAppManifest.js.map +1 -1
  402. package/build/server/shared/desktopRecoveryBridge.d.ts +2 -1
  403. package/build/server/shared/desktopRecoveryBridge.d.ts.map +1 -1
  404. package/build/server/shared/desktopRecoveryBridge.js.map +1 -1
  405. package/build/server/shared/executionLabel.d.ts.map +1 -1
  406. package/build/server/shared/executionLabel.js +8 -1
  407. package/build/server/shared/executionLabel.js.map +1 -1
  408. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  409. package/build/server/shared/i18n/catalogs/en.js +198 -3
  410. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  411. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  412. package/build/server/shared/i18n/catalogs/zh-TW.js +197 -3
  413. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  414. package/build/server/shared/i18n/index.d.ts +192 -0
  415. package/build/server/shared/i18n/index.d.ts.map +1 -1
  416. package/build/server/shared/i18n/messageKeys.d.ts +192 -0
  417. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  418. package/build/server/shared/i18n/messageKeys.js +192 -0
  419. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  420. package/build/server/shared/platformSetupOperation.d.ts +2 -0
  421. package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
  422. package/build/server/shared/platformSetupOperation.js +9 -0
  423. package/build/server/shared/platformSetupOperation.js.map +1 -0
  424. package/build/server/shared/providerCatalog.d.ts +5 -2
  425. package/build/server/shared/providerCatalog.d.ts.map +1 -1
  426. package/build/server/shared/providerCatalog.js +6 -0
  427. package/build/server/shared/providerCatalog.js.map +1 -1
  428. package/build/server/shared/providerCatalogData.d.ts +154 -77
  429. package/build/server/shared/providerCatalogData.d.ts.map +1 -1
  430. package/build/server/shared/providerCatalogData.js +73 -36
  431. package/build/server/shared/providerCatalogData.js.map +1 -1
  432. package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
  433. package/build/server/shared/providerCatalogInstances.js +3 -0
  434. package/build/server/shared/providerCatalogInstances.js.map +1 -1
  435. package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
  436. package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
  437. package/build/server/shared/providerModelLabelRegistry.js +49 -0
  438. package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
  439. package/build/server/shared/providerRegistryWarnings.d.ts +4 -0
  440. package/build/server/shared/providerRegistryWarnings.d.ts.map +1 -1
  441. package/build/server/shared/providerRegistryWarnings.js +7 -0
  442. package/build/server/shared/providerRegistryWarnings.js.map +1 -1
  443. package/build/server/shared/providerSelection.d.ts.map +1 -1
  444. package/build/server/shared/providerSelection.js +10 -13
  445. package/build/server/shared/providerSelection.js.map +1 -1
  446. package/build/server/shared/runtimeSetup.d.ts +17 -4
  447. package/build/server/shared/runtimeSetup.d.ts.map +1 -1
  448. package/build/server/shared/runtimeStatusPresentation.js +1 -1
  449. package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
  450. package/package.json +32 -3
  451. package/packages/app-sdk/browser.d.ts +51 -0
  452. package/packages/app-sdk/browser.js +48 -0
  453. package/packages/app-sdk/package.d.ts +14 -0
  454. package/packages/app-sdk/package.js +131 -0
  455. package/packages/app-sdk/package.json +7 -0
  456. package/packages/provider-setup/manager.d.ts +79 -0
  457. package/packages/provider-setup/manager.js +441 -0
  458. package/scripts/README.md +66 -26
  459. package/scripts/build-desktop-installer.mjs +139 -16
  460. package/scripts/build-test-ui.mjs +1 -1
  461. package/scripts/bundle-server.mjs +23 -10
  462. package/scripts/linux/build-desktop-package.sh +6 -6
  463. package/scripts/linux/install-antigravity.sh +0 -0
  464. package/scripts/linux/install-devin.sh +0 -0
  465. package/scripts/linux/install-github-cli.sh +5 -0
  466. package/scripts/linux/install-meta-cli.sh +8 -0
  467. package/scripts/linux/install-node.sh +9 -3
  468. package/scripts/linux/node-cli-common.sh +87 -48
  469. package/scripts/linux/provider-cli-common.sh +178 -130
  470. package/scripts/linux/provider-version-common.sh +247 -0
  471. package/scripts/linux/sync-agent-skills.sh +27 -5
  472. package/scripts/linux/test-linux-package-smoke.sh +6 -3
  473. package/scripts/linux/upgrade-cli-tools.sh +1 -1
  474. package/scripts/linux/verified-npm-update.sh +20 -0
  475. package/scripts/macos/build-desktop-package.sh +5 -5
  476. package/scripts/macos/install-antigravity.sh +0 -0
  477. package/scripts/macos/install-devin.sh +0 -0
  478. package/scripts/macos/install-github-cli.sh +5 -0
  479. package/scripts/macos/install-meta-cli.sh +8 -0
  480. package/scripts/macos/install-node.sh +9 -3
  481. package/scripts/macos/node-cli-common.sh +87 -48
  482. package/scripts/macos/provider-cli-common.sh +178 -130
  483. package/scripts/macos/provider-version-common.sh +247 -0
  484. package/scripts/macos/sync-agent-skills.sh +27 -5
  485. package/scripts/macos/test-macos-package-smoke.sh +6 -3
  486. package/scripts/macos/upgrade-cli-tools.sh +1 -1
  487. package/scripts/macos/verified-npm-update.sh +20 -0
  488. package/scripts/package-desktop.mjs +15 -2
  489. package/scripts/testing/check-usage-app.mts +266 -0
  490. package/scripts/testing/conversation-navigation-smoke-electron.cjs +134 -0
  491. package/scripts/testing/conversation-navigation-smoke-renderer.tsx +102 -0
  492. package/scripts/testing/conversation-navigation-smoke.mjs +67 -0
  493. package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
  494. package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
  495. package/scripts/validate-release-assets.mjs +4 -1
  496. package/scripts/verify-desktop-app-bundle.mjs +108 -0
  497. package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
  498. package/scripts/windows/Install-Antigravity.ps1 +26 -3
  499. package/scripts/windows/Install-ClaudeCode.ps1 +25 -7
  500. package/scripts/windows/Install-CursorAgent.ps1 +45 -30
  501. package/scripts/windows/Install-Devin.ps1 +16 -47
  502. package/scripts/windows/Install-GitHubCli.ps1 +4 -0
  503. package/scripts/windows/Install-Goose.ps1 +18 -1
  504. package/scripts/windows/Install-Grok.ps1 +14 -1
  505. package/scripts/windows/Install-Junie.ps1 +32 -11
  506. package/scripts/windows/Install-KiroCli.ps1 +37 -13
  507. package/scripts/windows/Install-MetaCli.ps1 +463 -0
  508. package/scripts/windows/Install-Node.ps1 +6 -1
  509. package/scripts/windows/Install-Ollama.ps1 +4 -1
  510. package/scripts/windows/Setup-NodeGlobalPrefix.ps1 +10 -0
  511. package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
  512. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +4 -1
  513. package/scripts/windows/_HiddenProcess.ps1 +14 -3
  514. package/scripts/windows/_NativeInstallerSupport.ps1 +308 -0
  515. package/scripts/windows/_NpmCliInstaller.ps1 +35 -14
  516. package/scripts/windows/_PackagedUninstall.ps1 +9 -1
  517. package/scripts/windows/_VerifiedNpmUpdate.ps1 +25 -0
  518. package/build/desktop/updateNotifications.d.ts +0 -64
  519. package/build/desktop/updateNotifications.d.ts.map +0 -1
  520. package/build/desktop/updateNotifications.js +0 -143
  521. package/build/desktop/updateNotifications.js.map +0 -1
  522. package/build/renderer/assets/ActiveSessionPermissionChip-DImsuR9T.js +0 -1
  523. package/build/renderer/assets/App-BfOvMP2m.js +0 -1
  524. package/build/renderer/assets/App-DGwkRFZl.css +0 -1
  525. package/build/renderer/assets/App-DWd7I3Z2.js +0 -2
  526. package/build/renderer/assets/WorkspaceAppRoutes-CrbTA9En.js +0 -1
  527. package/build/renderer/assets/app-BTww3Hl4.js +0 -43
  528. package/build/renderer/assets/app-CPxWQwLA.css +0 -1
  529. package/build/renderer/assets/conversationSidebarRecentEntries-QuaOPxCb.js +0 -6
  530. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts +0 -48
  531. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts.map +0 -1
  532. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js +0 -535
  533. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js.map +0 -1
  534. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts +0 -13
  535. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +0 -1
  536. package/build/server/design/components/useProviderRegistryAutoRecheck.js +0 -63
  537. package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +0 -1
  538. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts +0 -19
  539. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts.map +0 -1
  540. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js +0 -53
  541. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js.map +0 -1
  542. package/build/server/products/shared/renderer/api/providers.d.ts +0 -17
  543. package/build/server/products/shared/renderer/api/providers.d.ts.map +0 -1
  544. package/build/server/products/shared/renderer/api/providers.js +0 -50
  545. package/build/server/products/shared/renderer/api/providers.js.map +0 -1
  546. package/scripts/linux/install-aider.sh +0 -8
  547. package/scripts/macos/install-aider.sh +0 -8
  548. package/scripts/windows/Install-Aider.ps1 +0 -368
@@ -1,5 +1,5 @@
1
1
  import { dirname, join } from 'node:path';
2
- import { app, BrowserWindow, dialog, ipcMain, Notification, session, shell, systemPreferences, } from 'electron';
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, shouldAutoRunSetupAudit, } from './setupBridge.js';
15
+ import { buildDesktopSetupSnapshot, createEmptyDesktopSetupState, runDesktopSetupHelper, } from './setupBridge.js';
16
16
  import { isDesktopBootstrapLoadingPhase, resolveDesktopBootstrapError, shouldAttemptDesktopLateReadyRecovery, } from './startupRecovery.js';
17
- import { resolveDesktopUpdateDialog } from './updateDialog.js';
18
- import { resolveDefaultSetupAuditAction } from './setupAudit.js';
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.scan) {
137
- latestCliInventoryProbe = probe;
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(updateManager.getSnapshot());
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
- return await buildDesktopSetupSnapshot({
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
- const setupStateTimeoutMs = options.setupStateTimeoutMs ?? RUNTIME_SETUP_STATE_TIMEOUT_MS;
907
- const scanTimeoutMs = options.scanTimeoutMs ?? RUNTIME_SETUP_SCAN_TIMEOUT_MS;
908
- let probe = null;
909
- // A forced rescan is a user pressing Detect, and it has to reach the runtime
910
- // even when the runtime says a scan is already running. `scanning` is
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
- // Trigger a fresh scan (none cached before setup, cached zero CLIs, or caller
938
- // forced rescan after install/uninstall). The runtime exposes scan progress
939
- // through /setup-state, so a host-side HTTP timeout means "poll later", not
940
- // "startup failed".
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 scanResponse = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
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: false }),
947
- }, scanTimeoutMs);
948
- if (!scanResponse.ok) {
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
- return probe;
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 = setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate';
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
- async function maybePrimeSetupAudit(snapshot, persistedSetup = null) {
1086
- if (!hostConfig) {
1087
- return;
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: !runtimeCliInventoryScanPending,
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 (!options.setupCompleted && latestSnapshot && isDesktopBootstrapLoadingPhase(latestSnapshot.phase)) {
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
- // Prerequisite audit Node / GitHub CLI / npm prefix detection lives in
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
- // CLI inventory is the only source the onboarding cards can read, so it has
1237
- // to be probed before setup as well otherwise a machine with every CLI
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: setupCompleted,
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
- await supervisor?.startAll();
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 = latestSnapshot ?? await refreshBootstrapSnapshot();
1556
- if (isCliMissingBootstrapSnapshot(snapshot)) {
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 = latestSnapshot ?? await refreshBootstrapSnapshot();
1564
- if (isCliMissingBootstrapSnapshot(snapshot)) {
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 runDesktopSetupHelper({
1582
- config: hostConfig,
1583
- packaging,
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
- && (setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate');
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
- return await getSetupSnapshot();
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
- // Windows routes a notification through the Start Menu shortcut whose
1823
- // Application User Model ID matches the running process. The installer writes
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:run-setup-helper', async (_event, payload) => {
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 refreshUpdateState('startup');
2087
+ void updateManager.checkForUpdates();
2139
2088
  }
2140
2089
  }
2141
2090
  void main().catch((error) => {