@cats-inc/cats-platform 0.1.10 → 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.
Files changed (516) hide show
  1. package/.env.example +9 -16
  2. package/README.md +18 -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 +264 -77
  8. package/build/desktop/bootstrapPage.js.map +1 -1
  9. package/build/desktop/cliInventoryProbe.d.ts +23 -2
  10. package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
  11. package/build/desktop/cliInventoryProbe.js +54 -9
  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 +19 -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 +177 -201
  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 +7 -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/providerSelection.d.ts +37 -0
  36. package/build/desktop/providerSelection.d.ts.map +1 -0
  37. package/build/desktop/providerSelection.js +112 -0
  38. package/build/desktop/providerSelection.js.map +1 -0
  39. package/build/desktop/readiness.d.ts +2 -0
  40. package/build/desktop/readiness.d.ts.map +1 -1
  41. package/build/desktop/readiness.js +49 -35
  42. package/build/desktop/readiness.js.map +1 -1
  43. package/build/desktop/setupAssets.d.ts.map +1 -1
  44. package/build/desktop/setupAssets.js +16 -14
  45. package/build/desktop/setupAssets.js.map +1 -1
  46. package/build/desktop/setupAudit.d.ts +2 -3
  47. package/build/desktop/setupAudit.d.ts.map +1 -1
  48. package/build/desktop/setupAudit.js +14 -34
  49. package/build/desktop/setupAudit.js.map +1 -1
  50. package/build/desktop/tray.d.ts +1 -1
  51. package/build/desktop/tray.d.ts.map +1 -1
  52. package/build/desktop/tray.js +2 -7
  53. package/build/desktop/tray.js.map +1 -1
  54. package/build/desktop/trayMenu.d.ts +23 -2
  55. package/build/desktop/trayMenu.d.ts.map +1 -1
  56. package/build/desktop/trayMenu.js +24 -30
  57. package/build/desktop/trayMenu.js.map +1 -1
  58. package/build/desktop/updateDialog.d.ts +66 -0
  59. package/build/desktop/updateDialog.d.ts.map +1 -0
  60. package/build/desktop/updateDialog.js +258 -0
  61. package/build/desktop/updateDialog.js.map +1 -0
  62. package/build/desktop/updaterAdapter.d.ts +1 -0
  63. package/build/desktop/updaterAdapter.d.ts.map +1 -1
  64. package/build/desktop/updaterAdapter.js +13 -1
  65. package/build/desktop/updaterAdapter.js.map +1 -1
  66. package/build/renderer/assets/{ActiveSessionPermissionChip-Dl2UOFgh.js → ActiveSessionPermissionChip-CAgN-tXv.js} +1 -1
  67. package/build/renderer/assets/App-BZA23O2J.js +2 -0
  68. package/build/renderer/assets/App-DxsV-tKS.css +1 -0
  69. package/build/renderer/assets/{App-ChvP0G9X.js → App-YqprEL2n.js} +1 -1
  70. package/build/renderer/assets/App-rGw9J8PZ.js +1 -0
  71. package/build/renderer/assets/WorkspaceAppRoutes-BCHCikmJ.js +1 -0
  72. package/build/renderer/assets/app-BV3UAQkR.css +1 -0
  73. package/build/renderer/assets/app-CVPqqfZo.js +45 -0
  74. package/build/renderer/assets/conversationSidebarRecentEntries-iqaLqA1n.js +6 -0
  75. package/build/renderer/assets/{useDraftSessionChips-By3XXabI.js → useDraftSessionChips-D9BX6X92.js} +1 -1
  76. package/build/renderer/index.html +2 -2
  77. package/build/server/app/renderer/auth/api.d.ts +28 -2
  78. package/build/server/app/renderer/auth/api.d.ts.map +1 -1
  79. package/build/server/app/renderer/auth/api.js +29 -4
  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 +15 -6
  83. package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
  84. package/build/server/app/renderer/providerRegistryClient.d.ts +1 -1
  85. package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
  86. package/build/server/app/renderer/providerRegistryClient.js +23 -41
  87. package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
  88. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts +11 -4
  89. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts.map +1 -1
  90. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js +25 -5
  91. package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js.map +1 -1
  92. package/build/server/app/server/appPackageRoutes.d.ts +2 -0
  93. package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
  94. package/build/server/app/server/appPackageRoutes.js +105 -0
  95. package/build/server/app/server/appPackageRoutes.js.map +1 -1
  96. package/build/server/app/server/authGatePolicy.js +8 -3
  97. package/build/server/app/server/authGatePolicy.js.map +1 -1
  98. package/build/server/app/server/authRoutes.d.ts +14 -1
  99. package/build/server/app/server/authRoutes.d.ts.map +1 -1
  100. package/build/server/app/server/authRoutes.js +395 -76
  101. package/build/server/app/server/authRoutes.js.map +1 -1
  102. package/build/server/app/server/contracts.d.ts +19 -1
  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 +48 -2
  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 +2 -1
  112. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  113. package/build/server/app/server/platformSetupRoutes.js +117 -64
  114. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  115. package/build/server/app/server/polling.d.ts.map +1 -1
  116. package/build/server/app/server/polling.js +2 -0
  117. package/build/server/app/server/polling.js.map +1 -1
  118. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  119. package/build/server/app/server/requestRouter.js +33 -0
  120. package/build/server/app/server/requestRouter.js.map +1 -1
  121. package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
  122. package/build/server/app/server/runtimeSurfaceProxy.js +16 -19
  123. package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
  124. package/build/server/app/server/startupRecovery.d.ts.map +1 -1
  125. package/build/server/app/server/startupRecovery.js +5 -0
  126. package/build/server/app/server/startupRecovery.js.map +1 -1
  127. package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
  128. package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
  129. package/build/server/app/server/telegramCommandSurface.js +123 -0
  130. package/build/server/app/server/telegramCommandSurface.js.map +1 -0
  131. package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
  132. package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
  133. package/build/server/app/server/transportWorkGoldenPath.js +307 -0
  134. package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
  135. package/build/server/config.d.ts +22 -3
  136. package/build/server/config.d.ts.map +1 -1
  137. package/build/server/config.js +14 -13
  138. package/build/server/config.js.map +1 -1
  139. package/build/server/design/components/providerModelFieldsSupport.d.ts +3 -3
  140. package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
  141. package/build/server/design/components/providerModelFieldsSupport.js +40 -38
  142. package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
  143. package/build/server/design/components/useProviderCatalogState.d.ts +1 -0
  144. package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
  145. package/build/server/design/components/useProviderCatalogState.js +1 -0
  146. package/build/server/design/components/useProviderCatalogState.js.map +1 -1
  147. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +1 -1
  148. package/build/server/design/components/useProviderRegistryAutoRecheck.js +20 -13
  149. package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +1 -1
  150. package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
  151. package/build/server/design/components/useProviderRegistryState.js +12 -25
  152. package/build/server/design/components/useProviderRegistryState.js.map +1 -1
  153. package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
  154. package/build/server/design/components/useProviderTargetReconciliation.js +5 -2
  155. package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
  156. package/build/server/index.js +4 -0
  157. package/build/server/index.js.map +1 -1
  158. package/build/server/platform/apps/packageInstaller.d.ts +19 -0
  159. package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
  160. package/build/server/platform/apps/packageInstaller.js +92 -0
  161. package/build/server/platform/apps/packageInstaller.js.map +1 -0
  162. package/build/server/platform/apps/registry.d.ts +6 -0
  163. package/build/server/platform/apps/registry.d.ts.map +1 -1
  164. package/build/server/platform/apps/registry.js +24 -0
  165. package/build/server/platform/apps/registry.js.map +1 -1
  166. package/build/server/platform/apps/renderer.d.ts +6 -0
  167. package/build/server/platform/apps/renderer.d.ts.map +1 -0
  168. package/build/server/platform/apps/renderer.js +18 -0
  169. package/build/server/platform/apps/renderer.js.map +1 -0
  170. package/build/server/platform/auth/actionGrant.d.ts +61 -0
  171. package/build/server/platform/auth/actionGrant.d.ts.map +1 -0
  172. package/build/server/platform/auth/actionGrant.js +108 -0
  173. package/build/server/platform/auth/actionGrant.js.map +1 -0
  174. package/build/server/platform/auth/adminCredentials.d.ts +37 -0
  175. package/build/server/platform/auth/adminCredentials.d.ts.map +1 -0
  176. package/build/server/platform/auth/adminCredentials.js +63 -0
  177. package/build/server/platform/auth/adminCredentials.js.map +1 -0
  178. package/build/server/platform/auth/bootstrap.d.ts +14 -0
  179. package/build/server/platform/auth/bootstrap.d.ts.map +1 -1
  180. package/build/server/platform/auth/bootstrap.js +29 -4
  181. package/build/server/platform/auth/bootstrap.js.map +1 -1
  182. package/build/server/platform/auth/config.d.ts.map +1 -1
  183. package/build/server/platform/auth/config.js +1 -1
  184. package/build/server/platform/auth/config.js.map +1 -1
  185. package/build/server/platform/auth/errorCodes.d.ts +2 -0
  186. package/build/server/platform/auth/errorCodes.d.ts.map +1 -1
  187. package/build/server/platform/auth/errorCodes.js +2 -0
  188. package/build/server/platform/auth/errorCodes.js.map +1 -1
  189. package/build/server/platform/auth/googleAccount.d.ts +40 -13
  190. package/build/server/platform/auth/googleAccount.d.ts.map +1 -1
  191. package/build/server/platform/auth/googleAccount.js +89 -70
  192. package/build/server/platform/auth/googleAccount.js.map +1 -1
  193. package/build/server/platform/auth/index.d.ts +4 -0
  194. package/build/server/platform/auth/index.d.ts.map +1 -1
  195. package/build/server/platform/auth/index.js +4 -0
  196. package/build/server/platform/auth/index.js.map +1 -1
  197. package/build/server/platform/auth/localLogin.d.ts +10 -0
  198. package/build/server/platform/auth/localLogin.d.ts.map +1 -1
  199. package/build/server/platform/auth/localLogin.js +17 -0
  200. package/build/server/platform/auth/localLogin.js.map +1 -1
  201. package/build/server/platform/auth/loginMethods.d.ts +18 -0
  202. package/build/server/platform/auth/loginMethods.d.ts.map +1 -0
  203. package/build/server/platform/auth/loginMethods.js +19 -0
  204. package/build/server/platform/auth/loginMethods.js.map +1 -0
  205. package/build/server/platform/auth/securityEvents.d.ts +31 -0
  206. package/build/server/platform/auth/securityEvents.d.ts.map +1 -0
  207. package/build/server/platform/auth/securityEvents.js +45 -0
  208. package/build/server/platform/auth/securityEvents.js.map +1 -0
  209. package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
  210. package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
  211. package/build/server/platform/runtime/deliveryClient.js +289 -0
  212. package/build/server/platform/runtime/deliveryClient.js.map +1 -0
  213. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
  214. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
  215. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
  216. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
  217. package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
  218. package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
  219. package/build/server/platform/supervision/runtimeBoundary.js +2 -2
  220. package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
  221. package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
  222. package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
  223. package/build/server/platform/transports/telegram/bridge.js +176 -0
  224. package/build/server/platform/transports/telegram/bridge.js.map +1 -1
  225. package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
  226. package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
  227. package/build/server/platform/transports/telegram/commandPort.js +17 -0
  228. package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
  229. package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
  230. package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
  231. package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
  232. package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
  233. package/build/server/platform/transports/telegram/commands/index.js +38 -0
  234. package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
  235. package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
  236. package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
  237. package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
  238. package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
  239. package/build/server/platform/transports/telegram/polling.d.ts +34 -0
  240. package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
  241. package/build/server/platform/transports/telegram/polling.js +86 -9
  242. package/build/server/platform/transports/telegram/polling.js.map +1 -1
  243. package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
  244. package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
  245. package/build/server/platform/transports/telegram/relay/index.js +5 -1
  246. package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
  247. package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
  248. package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
  249. package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
  250. package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
  251. package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
  252. package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
  253. package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
  254. package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
  255. package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
  256. package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
  257. package/build/server/platform/transports/work-delivery/contracts.js +26 -0
  258. package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
  259. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
  260. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
  261. package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
  262. package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
  263. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
  264. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
  265. package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
  266. package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
  267. package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
  268. package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
  269. package/build/server/platform/transports/work-delivery/outbox.js +270 -0
  270. package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
  271. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
  272. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
  273. package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
  274. package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
  275. package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
  276. package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
  277. package/build/server/platform/transports/work-delivery/port.js +15 -0
  278. package/build/server/platform/transports/work-delivery/port.js.map +1 -0
  279. package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
  280. package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
  281. package/build/server/platform/transports/work-delivery/proposal.js +59 -0
  282. package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
  283. package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
  284. package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
  285. package/build/server/platform/transports/work-delivery/readiness.js +123 -0
  286. package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
  287. package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
  288. package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
  289. package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
  290. package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
  291. package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
  292. package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
  293. package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
  294. package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
  295. package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
  296. package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
  297. package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
  298. package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
  299. package/build/server/products/chat/api/contracts.d.ts +10 -8
  300. package/build/server/products/chat/api/contracts.d.ts.map +1 -1
  301. package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
  302. package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
  303. package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
  304. package/build/server/products/chat/api/routeSupport.d.ts +8 -0
  305. package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
  306. package/build/server/products/chat/api/routeSupport.js +5 -4
  307. package/build/server/products/chat/api/routeSupport.js.map +1 -1
  308. package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
  309. package/build/server/products/chat/api/setupRoutes.js +24 -91
  310. package/build/server/products/chat/api/setupRoutes.js.map +1 -1
  311. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
  312. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
  313. package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
  314. package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
  315. package/build/server/products/chat/state/model/index.d.ts +1 -1
  316. package/build/server/products/chat/state/model/index.d.ts.map +1 -1
  317. package/build/server/products/chat/state/model/index.js +1 -1
  318. package/build/server/products/chat/state/model/index.js.map +1 -1
  319. package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
  320. package/build/server/products/code/api/relayRoutes.js +36 -7
  321. package/build/server/products/code/api/relayRoutes.js.map +1 -1
  322. package/build/server/products/code/state/relayState.d.ts +2 -1
  323. package/build/server/products/code/state/relayState.d.ts.map +1 -1
  324. package/build/server/products/code/state/relayState.js +7 -7
  325. package/build/server/products/code/state/relayState.js.map +1 -1
  326. package/build/server/products/shared/api/workspaceContracts.d.ts +5 -8
  327. package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
  328. package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
  329. package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
  330. package/build/server/products/work/api/goldenPathProjection.js +252 -0
  331. package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
  332. package/build/server/products/work/api/index.d.ts +54 -1
  333. package/build/server/products/work/api/index.d.ts.map +1 -1
  334. package/build/server/products/work/api/index.js +182 -4
  335. package/build/server/products/work/api/index.js.map +1 -1
  336. package/build/server/products/work/api/projection.d.ts +7 -1
  337. package/build/server/products/work/api/projection.d.ts.map +1 -1
  338. package/build/server/products/work/api/projection.js +7 -1
  339. package/build/server/products/work/api/projection.js.map +1 -1
  340. package/build/server/products/work/shared/apiPaths.d.ts +8 -0
  341. package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
  342. package/build/server/products/work/shared/apiPaths.js +8 -0
  343. package/build/server/products/work/shared/apiPaths.js.map +1 -1
  344. package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
  345. package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
  346. package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
  347. package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
  348. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
  349. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
  350. package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
  351. package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
  352. package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
  353. package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
  354. package/build/server/products/work/state/workCompletionEvidence.js +59 -0
  355. package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
  356. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
  357. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
  358. package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
  359. package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
  360. package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
  361. package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
  362. package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
  363. package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
  364. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
  365. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
  366. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
  367. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
  368. package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
  369. package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
  370. package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
  371. package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
  372. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
  373. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
  374. package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
  375. package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
  376. package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
  377. package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
  378. package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
  379. package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
  380. package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
  381. package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
  382. package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
  383. package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
  384. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
  385. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
  386. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
  387. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
  388. package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
  389. package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
  390. package/build/server/products/work/state/workGoldenPathService.js +1057 -0
  391. package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
  392. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
  393. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
  394. package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
  395. package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
  396. package/build/server/runtime/client.d.ts +24 -0
  397. package/build/server/runtime/client.d.ts.map +1 -1
  398. package/build/server/runtime/client.js +62 -1
  399. package/build/server/runtime/client.js.map +1 -1
  400. package/build/server/runtime/setup.d.ts +10 -4
  401. package/build/server/runtime/setup.d.ts.map +1 -1
  402. package/build/server/runtime/setup.js +14 -18
  403. package/build/server/runtime/setup.js.map +1 -1
  404. package/build/server/runtime/usageSnapshot.d.ts +3 -0
  405. package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
  406. package/build/server/runtime/usageSnapshot.js +69 -0
  407. package/build/server/runtime/usageSnapshot.js.map +1 -0
  408. package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
  409. package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
  410. package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
  411. package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
  412. package/build/server/server/routes/providers.d.ts.map +1 -1
  413. package/build/server/server/routes/providers.js +112 -81
  414. package/build/server/server/routes/providers.js.map +1 -1
  415. package/build/server/server/routes/telegram.d.ts +9 -0
  416. package/build/server/server/routes/telegram.d.ts.map +1 -1
  417. package/build/server/server/routes/telegram.js +79 -72
  418. package/build/server/server/routes/telegram.js.map +1 -1
  419. package/build/server/shared/catsAppManifest.d.ts +3 -1
  420. package/build/server/shared/catsAppManifest.d.ts.map +1 -1
  421. package/build/server/shared/catsAppManifest.js +2 -0
  422. package/build/server/shared/catsAppManifest.js.map +1 -1
  423. package/build/server/shared/executionLabel.d.ts.map +1 -1
  424. package/build/server/shared/executionLabel.js +8 -1
  425. package/build/server/shared/executionLabel.js.map +1 -1
  426. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  427. package/build/server/shared/i18n/catalogs/en.js +238 -3
  428. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  429. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  430. package/build/server/shared/i18n/catalogs/zh-TW.js +236 -3
  431. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  432. package/build/server/shared/i18n/index.d.ts +231 -0
  433. package/build/server/shared/i18n/index.d.ts.map +1 -1
  434. package/build/server/shared/i18n/messageKeys.d.ts +231 -0
  435. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  436. package/build/server/shared/i18n/messageKeys.js +231 -0
  437. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  438. package/build/server/shared/platformSetupOperation.d.ts +2 -0
  439. package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
  440. package/build/server/shared/platformSetupOperation.js +9 -0
  441. package/build/server/shared/platformSetupOperation.js.map +1 -0
  442. package/build/server/shared/providerCatalog.d.ts +6 -2
  443. package/build/server/shared/providerCatalog.d.ts.map +1 -1
  444. package/build/server/shared/providerCatalog.js +15 -1
  445. package/build/server/shared/providerCatalog.js.map +1 -1
  446. package/build/server/shared/providerCatalogData.d.ts +38 -22
  447. package/build/server/shared/providerCatalogData.d.ts.map +1 -1
  448. package/build/server/shared/providerCatalogData.js +31 -10
  449. package/build/server/shared/providerCatalogData.js.map +1 -1
  450. package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
  451. package/build/server/shared/providerCatalogInstances.js +6 -0
  452. package/build/server/shared/providerCatalogInstances.js.map +1 -1
  453. package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
  454. package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
  455. package/build/server/shared/providerModelLabelRegistry.js +49 -0
  456. package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
  457. package/build/server/shared/providerSelection.d.ts.map +1 -1
  458. package/build/server/shared/providerSelection.js +10 -13
  459. package/build/server/shared/providerSelection.js.map +1 -1
  460. package/build/server/shared/runtimeSetup.d.ts +17 -4
  461. package/build/server/shared/runtimeSetup.d.ts.map +1 -1
  462. package/build/server/shared/runtimeStatusPresentation.js +1 -1
  463. package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
  464. package/package.json +23 -1
  465. package/packages/app-sdk/browser.d.ts +51 -0
  466. package/packages/app-sdk/browser.js +48 -0
  467. package/packages/app-sdk/package.d.ts +14 -0
  468. package/packages/app-sdk/package.js +131 -0
  469. package/packages/app-sdk/package.json +7 -0
  470. package/scripts/README.md +73 -26
  471. package/scripts/build-desktop-installer.mjs +15 -0
  472. package/scripts/build-test-ui.mjs +1 -1
  473. package/scripts/bundle-server.mjs +23 -10
  474. package/scripts/linux/build-desktop-package.sh +6 -6
  475. package/scripts/linux/install-antigravity.sh +0 -0
  476. package/scripts/linux/install-devin.sh +0 -0
  477. package/scripts/linux/install-meta-cli.sh +8 -0
  478. package/scripts/linux/node-cli-common.sh +2 -75
  479. package/scripts/linux/provider-cli-common.sh +103 -30
  480. package/scripts/linux/sync-agent-skills.sh +27 -5
  481. package/scripts/linux/test-linux-package-smoke.sh +4 -3
  482. package/scripts/linux/upgrade-cli-tools.sh +1 -1
  483. package/scripts/macos/build-desktop-package.sh +5 -5
  484. package/scripts/macos/install-antigravity.sh +0 -0
  485. package/scripts/macos/install-devin.sh +0 -0
  486. package/scripts/macos/install-meta-cli.sh +8 -0
  487. package/scripts/macos/node-cli-common.sh +2 -75
  488. package/scripts/macos/provider-cli-common.sh +103 -30
  489. package/scripts/macos/sync-agent-skills.sh +27 -5
  490. package/scripts/macos/test-macos-package-smoke.sh +4 -3
  491. package/scripts/macos/upgrade-cli-tools.sh +1 -1
  492. package/scripts/package-desktop.mjs +15 -2
  493. package/scripts/testing/check-usage-app.mts +266 -0
  494. package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
  495. package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
  496. package/scripts/verify-desktop-app-bundle.mjs +108 -0
  497. package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
  498. package/scripts/windows/Check-WindowsSetupReadiness.ps1 +14 -443
  499. package/scripts/windows/{Install-Aider.ps1 → Install-MetaCli.ps1} +180 -92
  500. package/scripts/windows/Install-Ollama.ps1 +4 -1
  501. package/scripts/windows/Remove-MergedBranches.ps1 +229 -0
  502. package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
  503. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +2 -1
  504. package/build/desktop/updateNotifications.d.ts +0 -64
  505. package/build/desktop/updateNotifications.d.ts.map +0 -1
  506. package/build/desktop/updateNotifications.js +0 -143
  507. package/build/desktop/updateNotifications.js.map +0 -1
  508. package/build/renderer/assets/App-C57f4p8k.js +0 -2
  509. package/build/renderer/assets/App-CPqGDXVi.js +0 -1
  510. package/build/renderer/assets/App-DGwkRFZl.css +0 -1
  511. package/build/renderer/assets/WorkspaceAppRoutes-DYg2vnjz.js +0 -1
  512. package/build/renderer/assets/app-DVN9Ghrk.js +0 -43
  513. package/build/renderer/assets/app-XnXwkcD2.css +0 -1
  514. package/build/renderer/assets/conversationSidebarRecentEntries-XZVCnMLw.js +0 -6
  515. package/scripts/linux/install-aider.sh +0 -8
  516. package/scripts/macos/install-aider.sh +0 -8
@@ -1,5 +1,5 @@
1
1
  import { dirname, join } from 'node:path';
2
- import { app, BrowserWindow, 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,12 @@ 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 { resolveDefaultSetupAuditAction } from './setupAudit.js';
18
- import { buildDesktopCliInventoryFromRuntime, } from './cliInventoryProbe.js';
17
+ import { runDesktopUpdateDialog } from './updateDialog.js';
18
+ import { resolveSelectedSetupAuditActions } from './setupAudit.js';
19
+ import { pauseSelectedSetupHelpers, retryPendingSetupOperationReleases, targetsForSetupHelper, withSelectedSetupTargets } from './providerSelection.js';
20
+ import { buildDesktopCliInventoryFromRuntime, probeContradictsCachedBootstrapState, } from './cliInventoryProbe.js';
19
21
  import { createDesktopTrayController, } from './tray.js';
20
22
  import { buildDesktopTrayMenuState as buildElectronTrayMenuState, buildDesktopTrayQuittingMenuState, } from './trayMenu.js';
21
23
  import { applyDesktopHostPlatformShellUpdate, normalizePlatformShellSetupState, parseDesktopHostPlatformShellUpdate, } from './platformShellUpdate.js';
@@ -26,7 +28,6 @@ import { createDesktopUpdateCapability, createDesktopUpdateManager, createUnavai
26
28
  import { configureElectronUpdater, createElectronUpdaterAdapter, resolveAutoUpdaterExport, } from './updaterAdapter.js';
27
29
  import { createDesktopUpdateIpcHandlers, createDesktopUpdateSnapshotBroadcast, } from './updateIpc.js';
28
30
  import { withDesktopInstallHandoff } from './updateInstallHandoff.js';
29
- import { DESKTOP_UPDATE_SETTINGS_PATH, resolveDesktopUpdateAnnouncement, } from './updateNotifications.js';
30
31
  import { applyDesktopWindowChrome, resolveDesktopWindowChromeOptions, } from './windowChrome.js';
31
32
  import { resolveDesktopWindowIconPath } from './windowIcon.js';
32
33
  import { readDesktopStartupPreferences, resolveDesktopStartupLaunchContext, syncDesktopStartupPreferences, updateDesktopStartupPreferences, DESKTOP_LAUNCH_AT_LOGIN_ARG, } from './desktopStartup.js';
@@ -72,6 +73,7 @@ let runtimeCliInventoryPollTimer = null;
72
73
  let runtimeCliInventoryScanPending = false;
73
74
  let shuttingDown = false;
74
75
  let shutdownPromise = null;
76
+ let setupHelperDrain = null;
75
77
  let exitingAfterShutdown = false;
76
78
  let trayController = null;
77
79
  let stateStore = null;
@@ -118,12 +120,25 @@ function isRuntimeCliInventoryScanActive(probe) {
118
120
  function isRuntimeCliInventoryScanErrored(probe) {
119
121
  return probe?.state?.status === 'error';
120
122
  }
123
+ // Refreshing only when the probe and the cached health payload disagree keeps
124
+ // this off the steady-state path: it fires once, on the transition that
125
+ // actually happened, rather than putting GET /health on a timer.
126
+ function probeContradictsCachedRuntimeHealth(probe) {
127
+ if (!latestRuntimeHealthPayload) {
128
+ return false;
129
+ }
130
+ const cached = normalizeRuntimeHealthPayload(latestRuntimeHealthPayload);
131
+ return probeContradictsCachedBootstrapState(probe, cached.readiness?.bootstrapRequired === true || cached.startup?.bootstrapRequired === true);
132
+ }
121
133
  function rememberRuntimeCliInventoryProbe(probe) {
122
134
  if (!probe) {
123
135
  return false;
124
136
  }
125
- if (probe.scan) {
126
- latestCliInventoryProbe = probe;
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))) {
127
142
  runtimeCliInventoryScanPending = false;
128
143
  clearCliInventoryError();
129
144
  return true;
@@ -736,13 +751,31 @@ function buildTrayControllerOptions() {
736
751
  void shutdownHost();
737
752
  },
738
753
  canInteract: () => !shuttingDown,
739
- onCheckForUpdates: async () => {
740
- if (shuttingDown) {
754
+ // One item, one handler, whatever state the host is in. The tray closes on
755
+ // click, so the dialog is where every answer lives -- progress included.
756
+ onOpenUpdateDialog: async () => {
757
+ if (shuttingDown || !updateManager) {
741
758
  return;
742
759
  }
743
- // The menu closes on click, so this result has to reach the user through
744
- // a notification or by opening Settings.
745
- await refreshUpdateState('tray');
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
+ });
746
779
  },
747
780
  };
748
781
  }
@@ -797,11 +830,26 @@ async function getSetupSnapshot() {
797
830
  if (!hostConfig) {
798
831
  throw new Error('Desktop host is not initialized.');
799
832
  }
800
- return await buildDesktopSetupSnapshot({
833
+ const snapshot = await buildDesktopSetupSnapshot({
801
834
  config: hostConfig,
802
835
  packaging: resolveCurrentPackagingPlan(hostConfig),
803
836
  state: setupState ?? createEmptyDesktopSetupState(),
804
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;
805
853
  }
806
854
  async function fetchWithTimeout(url, init, timeoutMs) {
807
855
  const controller = new AbortController();
@@ -831,80 +879,39 @@ async function fetchJsonWithTimeout(url, init, timeoutMs) {
831
879
  }
832
880
  return await response.json();
833
881
  }
834
- function shouldRefreshRuntimeCliInventoryProbe(probe, options) {
835
- if (options.triggerScanIfMissing !== true) {
836
- return false;
837
- }
838
- if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe)) {
839
- return false;
840
- }
841
- if (!probe?.scan) {
842
- return true;
843
- }
844
- return !probe.scan.providers.some((provider) => provider.available === true);
845
- }
846
882
  async function fetchRuntimeCliInventoryProbe(baseUrl, options = {}) {
847
- const setupStateTimeoutMs = options.setupStateTimeoutMs ?? RUNTIME_SETUP_STATE_TIMEOUT_MS;
848
- const scanTimeoutMs = options.scanTimeoutMs ?? RUNTIME_SETUP_SCAN_TIMEOUT_MS;
849
- let probe = null;
850
- const shouldReadSetupStateFirst = !options.forceRescan || runtimeCliInventoryScanPending;
851
- if (shouldReadSetupStateFirst) {
852
- try {
853
- probe = await fetchJsonWithTimeout(`${baseUrl}/setup-state`, {
854
- method: 'GET',
855
- }, setupStateTimeoutMs);
856
- }
857
- catch {
858
- if (options.triggerScanIfMissing !== true) {
859
- return null;
860
- }
861
- }
862
- if (probe?.scan || isRuntimeCliInventoryScanActive(probe)) {
863
- return probe;
864
- }
865
- if (runtimeCliInventoryScanPending) {
866
- return probe;
867
- }
868
- if (!options.forceRescan && !shouldRefreshRuntimeCliInventoryProbe(probe, options)) {
869
- return probe;
870
- }
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);
888
+ }
889
+ catch {
890
+ return null;
871
891
  }
872
- // Trigger a fresh scan (none cached before setup, cached zero CLIs, or caller
873
- // forced rescan after install/uninstall). The runtime exposes scan progress
874
- // through /setup-state, so a host-side HTTP timeout means "poll later", not
875
- // "startup failed".
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;
876
899
  try {
877
900
  runtimeCliInventoryScanPending = true;
878
- const scanResponse = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
901
+ const response = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
879
902
  method: 'POST',
880
903
  headers: { 'content-type': 'application/json', accept: 'application/json' },
881
- body: JSON.stringify({ manual: false }),
882
- }, scanTimeoutMs);
883
- if (!scanResponse.ok) {
904
+ body: JSON.stringify({ manual: options.forceRescan === true, targets: probe.selection.targets }),
905
+ }, options.scanTimeoutMs ?? RUNTIME_SETUP_SCAN_TIMEOUT_MS);
906
+ if (!response.ok)
884
907
  runtimeCliInventoryScanPending = false;
885
- return probe;
886
- }
887
- }
888
- catch {
889
- return probe;
890
- }
891
- try {
892
- return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, {
893
- method: 'GET',
894
- }, setupStateTimeoutMs);
908
+ return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
895
909
  }
896
910
  catch {
911
+ runtimeCliInventoryScanPending = false;
897
912
  return probe;
898
913
  }
899
914
  }
900
- function isCliMissingBootstrapSnapshot(snapshot) {
901
- if (hostConfig?.bootstrap.onboardingMode !== 'cli_inventory_gate') {
902
- return false;
903
- }
904
- return Boolean(snapshot.phase === 'needs_prerequisites'
905
- && snapshot.prerequisites?.cliInventory?.source === 'runtime'
906
- && snapshot.prerequisites.cliInventory.total === 0);
907
- }
908
915
  function buildSnapshot(lastError) {
909
916
  if (!hostConfig || !supervisor) {
910
917
  throw new Error('Desktop host is not initialized.');
@@ -927,6 +934,8 @@ function buildSnapshot(lastError) {
927
934
  packaging: packagingState ?? undefined,
928
935
  setup: setupState ?? undefined,
929
936
  hostStatePath: hostConfig.paths.hostStatePath,
937
+ providerSelection: latestCliInventoryProbe?.selection ?? null,
938
+ providerCatalog: latestCliInventoryProbe?.universe ?? [],
930
939
  cliInventory: resolveSnapshotCliInventory(),
931
940
  cliInventoryError: latestCliInventoryError,
932
941
  });
@@ -951,7 +960,7 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
951
960
  ?? await readPersistedSetupCompletionState(hostConfig.paths.appStatePath);
952
961
  latestPersistedSetupState = effectivePersistedSetup;
953
962
  const setupCompleted = Boolean(effectivePersistedSetup.setupCompleteAt || effectivePersistedSetup.productSetupCompleted);
954
- const shouldReadCliInventory = setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate';
963
+ const shouldReadCliInventory = true;
955
964
  // /diagnostics/providers is intentionally NOT fetched on the boot critical
956
965
  // path — it's not authoritative for any phase decision before setup, and
957
966
  // for setup-complete users we kick it off in the background (see
@@ -1006,6 +1015,8 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
1006
1015
  packaging: packagingState ?? undefined,
1007
1016
  setup: setupState ?? undefined,
1008
1017
  hostStatePath: hostConfig.paths.hostStatePath,
1018
+ providerSelection: latestCliInventoryProbe?.selection ?? null,
1019
+ providerCatalog: latestCliInventoryProbe?.universe ?? [],
1009
1020
  cliInventory: resolveSnapshotCliInventory(),
1010
1021
  cliInventoryError: latestCliInventoryError,
1011
1022
  });
@@ -1017,28 +1028,20 @@ function hasPersistedProductSetupCompletion(persistedSetup = null) {
1017
1028
  const productEvents = diagnosticsState?.product?.events ?? [];
1018
1029
  return productEvents.some((event) => event.kind === 'setup_completed' && event.status === 'ok');
1019
1030
  }
1020
- async function maybePrimeSetupAudit(snapshot, persistedSetup = null) {
1021
- if (!hostConfig) {
1022
- return;
1023
- }
1024
- if (!shouldAutoRunSetupAudit(setupState, {
1025
- setupCompleteAt: snapshot.app.setupCompleteAt ?? persistedSetup?.setupCompleteAt ?? null,
1026
- productSetupCompleted: hasPersistedProductSetupCompletion(persistedSetup),
1027
- })) {
1028
- return;
1029
- }
1030
- const setupAuditAction = resolveDefaultSetupAuditAction(hostConfig);
1031
- if (!setupAuditAction) {
1031
+ const auditedSetupHelpers = new Set();
1032
+ async function maybePrimeSetupAudit(_snapshot, _persistedSetup = null) {
1033
+ if (!hostConfig)
1032
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
+ });
1033
1044
  }
1034
- await runSetupAction({
1035
- helperId: setupAuditAction.helperId,
1036
- mode: 'check',
1037
- extraArguments: setupAuditAction.extraArguments,
1038
- }, {
1039
- publishMode: 'bootstrap-only',
1040
- refreshBootstrap: false,
1041
- });
1042
1045
  }
1043
1046
  function scheduleBackgroundSetupAudit(snapshot, persistedSetup = null) {
1044
1047
  if (isDesktopBootstrapLoadingPhase(snapshot.phase) || backgroundSetupAuditPromise) {
@@ -1074,8 +1077,9 @@ async function pollRuntimeCliInventory(options) {
1074
1077
  ? RUNTIME_SETUP_SCAN_TIMEOUT_MS
1075
1078
  : RUNTIME_BOOTSTRAP_SETUP_SCAN_TIMEOUT_MS,
1076
1079
  });
1080
+ const staleRuntimeHealth = probeContradictsCachedRuntimeHealth(probe);
1077
1081
  if (rememberRuntimeCliInventoryProbe(probe)) {
1078
- const snapshot = publishSnapshot(buildSnapshot());
1082
+ const snapshot = publishSnapshot(staleRuntimeHealth ? await refreshBootstrapSnapshot() : buildSnapshot());
1079
1083
  scheduleBackgroundSetupAudit(snapshot, latestPersistedSetupState);
1080
1084
  await maybeOpenApp(snapshot);
1081
1085
  return;
@@ -1086,6 +1090,13 @@ async function pollRuntimeCliInventory(options) {
1086
1090
  scheduleBackgroundSetupAudit(snapshot, latestPersistedSetupState);
1087
1091
  return;
1088
1092
  }
1093
+ if (staleRuntimeHealth) {
1094
+ // No scan snapshot to publish, but the runtime has still moved on. Pick the
1095
+ // change up rather than republishing a phase built from the stale payload.
1096
+ // Deliberately falls through to the reschedule below: this branch is the
1097
+ // one that keeps waiting for a scan, and it must not stop doing that.
1098
+ publishSnapshot(await refreshBootstrapSnapshot());
1099
+ }
1089
1100
  scheduleRuntimeCliInventoryPoll(options);
1090
1101
  }
1091
1102
  async function retryCliInventoryScanInBackground(options) {
@@ -1107,9 +1118,12 @@ async function retryCliInventoryScanInBackground(options) {
1107
1118
  catch {
1108
1119
  probe = null;
1109
1120
  }
1121
+ const staleRuntimeHealth = probeContradictsCachedRuntimeHealth(probe);
1110
1122
  if (rememberRuntimeCliInventoryProbe(probe)) {
1111
1123
  try {
1112
- const snapshot = publishSnapshot(buildSnapshot());
1124
+ // This path returns without scheduling a poll, so a stale cached health
1125
+ // payload would survive here until the app restarts.
1126
+ const snapshot = publishSnapshot(staleRuntimeHealth ? await refreshBootstrapSnapshot() : buildSnapshot());
1113
1127
  scheduleBackgroundSetupAudit(snapshot, latestPersistedSetupState);
1114
1128
  await maybeOpenApp(snapshot);
1115
1129
  }
@@ -1123,7 +1137,7 @@ async function retryCliInventoryScanInBackground(options) {
1123
1137
  await new Promise((resolve) => setTimeout(resolve, wait));
1124
1138
  }
1125
1139
  }
1126
- if (!options.setupCompleted && latestSnapshot && isDesktopBootstrapLoadingPhase(latestSnapshot.phase)) {
1140
+ if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(latestCliInventoryProbe)) {
1127
1141
  scheduleRuntimeCliInventoryPoll({
1128
1142
  setupCompleted: options.setupCompleted,
1129
1143
  });
@@ -1152,21 +1166,16 @@ function scheduleBackgroundBootstrapWork(snapshot, persistedSetup) {
1152
1166
  const setupCompleted = Boolean(snapshot.app.setupCompleteAt
1153
1167
  ?? persistedSetup?.setupCompleteAt
1154
1168
  ?? persistedSetup?.productSetupCompleted);
1155
- // Prerequisite audit Node / GitHub CLI / npm prefix detection lives in
1156
- // the packaged readiness audit, not in cats-runtime's CLI inventory probe.
1157
- // Fresh users without Node need this signal so the recovery panel can
1158
- // surface install_node_lts before they fail an Install action.
1169
+ // Run shared Node and local-model checks only for eligible selected targets.
1159
1170
  scheduleBackgroundSetupAudit(snapshot, persistedSetup);
1160
- // CLI inventory is not part of the default first-run gate. We only probe it
1161
- // before setup when the legacy env policy explicitly asks for that gate.
1162
- if (setupCompleted || hostConfig?.bootstrap.onboardingMode === 'cli_inventory_gate') {
1163
- void retryCliInventoryScanInBackground({
1164
- forceRescan: setupCompleted,
1165
- setupCompleted,
1166
- }).catch((error) => {
1167
- process.stderr.write(`Background CLI inventory rescan failed: ${error instanceof Error ? error.message : String(error)}\n`);
1168
- });
1169
- }
1171
+ // Inventory observes the saved selection; missing/invalid/empty selections
1172
+ // never launch a provider scan. Availability does not gate product onboarding.
1173
+ void retryCliInventoryScanInBackground({
1174
+ forceRescan: false,
1175
+ setupCompleted,
1176
+ }).catch((error) => {
1177
+ process.stderr.write(`Background CLI inventory rescan failed: ${error instanceof Error ? error.message : String(error)}\n`);
1178
+ });
1170
1179
  // Provider diagnostics — only meaningful after setup is applied. Best
1171
1180
  // effort, single-shot; failures fall back to "Cats can still open".
1172
1181
  if (setupCompleted) {
@@ -1297,7 +1306,17 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
1297
1306
  // supervisor-lifetime environment snapshot populated during the first
1298
1307
  // bootstrap, including the Desktop-provisioned platform auth secret.
1299
1308
  exitingAfterShutdown = false;
1300
- await supervisor?.startAll();
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
+ }
1301
1320
  await syncTrayController();
1302
1321
  },
1303
1322
  exitAfterUncertainHandoff: async () => {
@@ -1328,77 +1347,6 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
1328
1347
  },
1329
1348
  });
1330
1349
  }
1331
- async function openDesktopUpdateSettings() {
1332
- if (shuttingDown || !hostConfig) {
1333
- return;
1334
- }
1335
- await showMainWindow(`${hostConfig.appBaseUrl}${DESKTOP_UPDATE_SETTINGS_PATH}`);
1336
- }
1337
- /**
1338
- * Shows a native notification, reporting whether the user will actually see it.
1339
- *
1340
- * A false return sends the caller to the navigation fallback. Notifying is not
1341
- * worth failing a check over, so a throwing platform is treated the same as one
1342
- * without notification support.
1343
- */
1344
- function showDesktopUpdateNotification(notification) {
1345
- try {
1346
- const native = new Notification({
1347
- title: notification.title,
1348
- body: notification.body,
1349
- });
1350
- native.on('click', () => {
1351
- void openDesktopUpdateSettings();
1352
- });
1353
- native.show();
1354
- return true;
1355
- }
1356
- catch (error) {
1357
- process.stderr.write('[desktop-update] native notification unavailable: '
1358
- + `${error instanceof Error ? error.message : String(error)}\n`);
1359
- return false;
1360
- }
1361
- }
1362
- function areNativeNotificationsSupported() {
1363
- try {
1364
- return Notification.isSupported();
1365
- }
1366
- catch {
1367
- return false;
1368
- }
1369
- }
1370
- async function announceDesktopUpdateResult(origin, snapshot) {
1371
- if (!snapshot || shuttingDown) {
1372
- return;
1373
- }
1374
- const announcement = resolveDesktopUpdateAnnouncement({
1375
- origin,
1376
- snapshot,
1377
- locale: app.getLocale(),
1378
- notificationsSupported: areNativeNotificationsSupported(),
1379
- });
1380
- if (announcement.notification && showDesktopUpdateNotification(announcement.notification)) {
1381
- return;
1382
- }
1383
- if (announcement.fallbackNavigatePath) {
1384
- await openDesktopUpdateSettings();
1385
- }
1386
- }
1387
- /**
1388
- * Runs a check and reports its result to whoever asked for it.
1389
- *
1390
- * The origin is required rather than defaulted: it decides whether the result
1391
- * is announced at all, and a new caller silently inheriting another surface's
1392
- * policy is the failure this signature exists to prevent.
1393
- */
1394
- async function refreshUpdateState(origin) {
1395
- if (!updateManager) {
1396
- return null;
1397
- }
1398
- updateState = await updateManager.checkForUpdates();
1399
- await announceDesktopUpdateResult(origin, updateState);
1400
- return updateState;
1401
- }
1402
1350
  async function bootstrapDesktopHost(restartServices = false) {
1403
1351
  if (!hostConfig || !supervisor) {
1404
1352
  throw new Error('Desktop host is not initialized.');
@@ -1406,7 +1354,9 @@ async function bootstrapDesktopHost(restartServices = false) {
1406
1354
  if (bootstrapPromise) {
1407
1355
  return bootstrapPromise;
1408
1356
  }
1357
+ const helperPause = restartServices ? pauseSelectedSetupHelpers() : null;
1409
1358
  bootstrapPromise = (async () => {
1359
+ await helperPause?.drained;
1410
1360
  latestBootstrapError = null;
1411
1361
  latestCliInventoryError = null;
1412
1362
  runtimeCliInventoryScanPending = false;
@@ -1442,6 +1392,7 @@ async function bootstrapDesktopHost(restartServices = false) {
1442
1392
  const snapshot = publishSnapshot(buildSnapshot());
1443
1393
  return maybeOpenApp(snapshot).then(() => snapshot);
1444
1394
  }).finally(() => {
1395
+ helperPause?.resume();
1445
1396
  bootstrapPromise = null;
1446
1397
  });
1447
1398
  return bootstrapPromise;
@@ -1472,17 +1423,15 @@ async function runHostAction(actionId) {
1472
1423
  }
1473
1424
  if (actionId === 'open_setup') {
1474
1425
  const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
1475
- if (isCliMissingBootstrapSnapshot(snapshot)) {
1426
+ if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
1476
1427
  return snapshot;
1477
- }
1478
1428
  await showMainWindow(`${hostConfig.appBaseUrl}/setup`);
1479
1429
  return snapshot;
1480
1430
  }
1481
1431
  if (actionId === 'open_chat') {
1482
1432
  const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
1483
- if (isCliMissingBootstrapSnapshot(snapshot)) {
1433
+ if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
1484
1434
  return snapshot;
1485
- }
1486
1435
  await showMainWindow(`${hostConfig.appBaseUrl}${snapshot.app.entryPath}`);
1487
1436
  return snapshot;
1488
1437
  }
@@ -1497,10 +1446,9 @@ async function runSetupAction(action, options = {}) {
1497
1446
  throw new Error('Desktop host is not initialized.');
1498
1447
  }
1499
1448
  const packaging = resolveCurrentPackagingPlan(hostConfig);
1500
- const result = await runDesktopSetupHelper({
1501
- config: hostConfig,
1502
- packaging,
1503
- action,
1449
+ const result = await withSelectedSetupTargets({
1450
+ baseUrl: hostConfig.runtimeBaseUrl, helperId: action.helperId,
1451
+ run: () => runDesktopSetupHelper({ config: hostConfig, packaging, action }),
1504
1452
  });
1505
1453
  packagingState = packaging;
1506
1454
  setupState = {
@@ -1539,8 +1487,7 @@ async function runSetupAction(action, options = {}) {
1539
1487
  // depend on the helper's runState — the rescan itself is authoritative.
1540
1488
  const setupCompleted = hasPersistedSetupCompletion();
1541
1489
  const shouldRefreshCliInventory = action.mode !== 'check'
1542
- && shouldRefreshCliInventoryAfterSetupAction(action.helperId)
1543
- && (setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate');
1490
+ && shouldRefreshCliInventoryAfterSetupAction(action.helperId);
1544
1491
  if (shouldRefreshCliInventory) {
1545
1492
  const refreshedProbe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl, {
1546
1493
  forceRescan: true,
@@ -1669,6 +1616,9 @@ function waitForShutdownDeadline(ms) {
1669
1616
  * surviving sidecar may still hold.
1670
1617
  */
1671
1618
  async function drainManagedServices() {
1619
+ setupHelperDrain ??= pauseSelectedSetupHelpers();
1620
+ // Installer completion is outside the sidecar shutdown watchdog budget.
1621
+ await setupHelperDrain.drained;
1672
1622
  const drain = supervisor?.stopAll() ?? Promise.resolve();
1673
1623
  const shutdownWatchdogMs = hostConfig
1674
1624
  ? resolveShutdownWatchdogMs(hostConfig, supervisor?.getManagedServiceCount() ?? 0)
@@ -1692,8 +1642,10 @@ async function shutdownHost() {
1692
1642
  return shutdownPromise;
1693
1643
  }
1694
1644
  shuttingDown = true;
1645
+ setupHelperDrain ??= pauseSelectedSetupHelpers();
1695
1646
  clearRuntimeCliInventoryPoll();
1696
1647
  shutdownPromise = (async () => {
1648
+ await setupHelperDrain.drained;
1697
1649
  let shutdownExitCode = 0;
1698
1650
  let forcedStopAttempted = false;
1699
1651
  const activeTrayController = trayController;
@@ -1738,11 +1690,8 @@ async function main() {
1738
1690
  return;
1739
1691
  }
1740
1692
  app.setPath('userData', resolveDesktopUserDataDir(app.getPath('appData')));
1741
- // Windows routes a notification through the Start Menu shortcut whose
1742
- // Application User Model ID matches the running process. The installer writes
1743
- // that shortcut with the electron-builder appId, so claiming it here is what
1744
- // makes update notifications visible at all. Unpackaged runs have no such
1745
- // shortcut, so the claim would buy nothing.
1693
+ // Keep the packaged process identity aligned with the installer-created
1694
+ // Windows shortcuts and taskbar grouping.
1746
1695
  if (process.platform === 'win32' && app.isPackaged && DESKTOP_APP_USER_MODEL_ID) {
1747
1696
  app.setAppUserModelId(DESKTOP_APP_USER_MODEL_ID);
1748
1697
  }
@@ -1858,6 +1807,33 @@ async function main() {
1858
1807
  }
1859
1808
  return await runHostAction(actionId);
1860
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
+ });
1861
1837
  ipcMain.handle('cats-host:run-setup-helper', async (_event, payload) => {
1862
1838
  if (typeof payload !== 'object'
1863
1839
  || payload === null
@@ -2054,7 +2030,7 @@ async function main() {
2054
2030
  // SPEC-111 section 6: at most one silent check per launch, and only when the
2055
2031
  // build actually has update capability.
2056
2032
  if (hostConfig.update.checkOnStartup && updateManager?.getSnapshot().capability.canCheck) {
2057
- void refreshUpdateState('startup');
2033
+ void updateManager.checkForUpdates();
2058
2034
  }
2059
2035
  }
2060
2036
  void main().catch((error) => {