@cats-inc/cats-platform 0.1.21 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/.env.example +3 -7
  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 +114 -34
  8. package/build/desktop/bootstrapPage.js.map +1 -1
  9. package/build/desktop/cliInventoryProbe.d.ts +5 -2
  10. package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
  11. package/build/desktop/cliInventoryProbe.js +14 -11
  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 +10 -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 +144 -249
  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 +14 -33
  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/updateDialog.d.ts +27 -1
  51. package/build/desktop/updateDialog.d.ts.map +1 -1
  52. package/build/desktop/updateDialog.js +85 -5
  53. package/build/desktop/updateDialog.js.map +1 -1
  54. package/build/renderer/assets/{ActiveSessionPermissionChip-DImsuR9T.js → ActiveSessionPermissionChip-CAgN-tXv.js} +1 -1
  55. package/build/renderer/assets/App-BZA23O2J.js +2 -0
  56. package/build/renderer/assets/App-DxsV-tKS.css +1 -0
  57. package/build/renderer/assets/{App-DKOSn0o_.js → App-YqprEL2n.js} +1 -1
  58. package/build/renderer/assets/App-rGw9J8PZ.js +1 -0
  59. package/build/renderer/assets/WorkspaceAppRoutes-BCHCikmJ.js +1 -0
  60. package/build/renderer/assets/app-BV3UAQkR.css +1 -0
  61. package/build/renderer/assets/app-CVPqqfZo.js +45 -0
  62. package/build/renderer/assets/conversationSidebarRecentEntries-iqaLqA1n.js +6 -0
  63. package/build/renderer/assets/{useDraftSessionChips-DCIId0eY.js → useDraftSessionChips-D9BX6X92.js} +1 -1
  64. package/build/renderer/index.html +2 -2
  65. package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
  66. package/build/server/app/renderer/providerCatalogClient.js +15 -6
  67. package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
  68. package/build/server/app/renderer/providerRegistryClient.d.ts +1 -1
  69. package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
  70. package/build/server/app/renderer/providerRegistryClient.js +23 -41
  71. package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
  72. package/build/server/app/server/appPackageRoutes.d.ts +2 -0
  73. package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
  74. package/build/server/app/server/appPackageRoutes.js +105 -0
  75. package/build/server/app/server/appPackageRoutes.js.map +1 -1
  76. package/build/server/app/server/authGatePolicy.js +7 -1
  77. package/build/server/app/server/authGatePolicy.js.map +1 -1
  78. package/build/server/app/server/contracts.d.ts +15 -0
  79. package/build/server/app/server/contracts.d.ts.map +1 -1
  80. package/build/server/app/server/dependencies.d.ts.map +1 -1
  81. package/build/server/app/server/dependencies.js +42 -1
  82. package/build/server/app/server/dependencies.js.map +1 -1
  83. package/build/server/app/server/goldenPathStartupResume.d.ts +55 -0
  84. package/build/server/app/server/goldenPathStartupResume.d.ts.map +1 -0
  85. package/build/server/app/server/goldenPathStartupResume.js +109 -0
  86. package/build/server/app/server/goldenPathStartupResume.js.map +1 -0
  87. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  88. package/build/server/app/server/platformSetupRoutes.js +1 -13
  89. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  90. package/build/server/app/server/polling.d.ts.map +1 -1
  91. package/build/server/app/server/polling.js +2 -0
  92. package/build/server/app/server/polling.js.map +1 -1
  93. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  94. package/build/server/app/server/requestRouter.js +30 -0
  95. package/build/server/app/server/requestRouter.js.map +1 -1
  96. package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
  97. package/build/server/app/server/runtimeSurfaceProxy.js +4 -2
  98. package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
  99. package/build/server/app/server/startupRecovery.d.ts.map +1 -1
  100. package/build/server/app/server/startupRecovery.js +5 -0
  101. package/build/server/app/server/startupRecovery.js.map +1 -1
  102. package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
  103. package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
  104. package/build/server/app/server/telegramCommandSurface.js +123 -0
  105. package/build/server/app/server/telegramCommandSurface.js.map +1 -0
  106. package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
  107. package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
  108. package/build/server/app/server/transportWorkGoldenPath.js +307 -0
  109. package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
  110. package/build/server/config.d.ts +21 -0
  111. package/build/server/config.d.ts.map +1 -1
  112. package/build/server/config.js +12 -0
  113. package/build/server/config.js.map +1 -1
  114. package/build/server/design/components/providerModelFieldsSupport.d.ts +3 -3
  115. package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
  116. package/build/server/design/components/providerModelFieldsSupport.js +37 -38
  117. package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
  118. package/build/server/design/components/useProviderCatalogState.d.ts +1 -0
  119. package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
  120. package/build/server/design/components/useProviderCatalogState.js +1 -0
  121. package/build/server/design/components/useProviderCatalogState.js.map +1 -1
  122. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +1 -1
  123. package/build/server/design/components/useProviderRegistryAutoRecheck.js +20 -13
  124. package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +1 -1
  125. package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
  126. package/build/server/design/components/useProviderRegistryState.js +12 -25
  127. package/build/server/design/components/useProviderRegistryState.js.map +1 -1
  128. package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
  129. package/build/server/design/components/useProviderTargetReconciliation.js +2 -1
  130. package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
  131. package/build/server/index.js +4 -0
  132. package/build/server/index.js.map +1 -1
  133. package/build/server/platform/apps/packageInstaller.d.ts +19 -0
  134. package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
  135. package/build/server/platform/apps/packageInstaller.js +92 -0
  136. package/build/server/platform/apps/packageInstaller.js.map +1 -0
  137. package/build/server/platform/apps/registry.d.ts +6 -0
  138. package/build/server/platform/apps/registry.d.ts.map +1 -1
  139. package/build/server/platform/apps/registry.js +24 -0
  140. package/build/server/platform/apps/registry.js.map +1 -1
  141. package/build/server/platform/apps/renderer.d.ts +6 -0
  142. package/build/server/platform/apps/renderer.d.ts.map +1 -0
  143. package/build/server/platform/apps/renderer.js +18 -0
  144. package/build/server/platform/apps/renderer.js.map +1 -0
  145. package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
  146. package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
  147. package/build/server/platform/runtime/deliveryClient.js +289 -0
  148. package/build/server/platform/runtime/deliveryClient.js.map +1 -0
  149. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
  150. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
  151. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
  152. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
  153. package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
  154. package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
  155. package/build/server/platform/supervision/runtimeBoundary.js +2 -2
  156. package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
  157. package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
  158. package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
  159. package/build/server/platform/transports/telegram/bridge.js +176 -0
  160. package/build/server/platform/transports/telegram/bridge.js.map +1 -1
  161. package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
  162. package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
  163. package/build/server/platform/transports/telegram/commandPort.js +17 -0
  164. package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
  165. package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
  166. package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
  167. package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
  168. package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
  169. package/build/server/platform/transports/telegram/commands/index.js +38 -0
  170. package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
  171. package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
  172. package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
  173. package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
  174. package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
  175. package/build/server/platform/transports/telegram/polling.d.ts +34 -0
  176. package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
  177. package/build/server/platform/transports/telegram/polling.js +86 -9
  178. package/build/server/platform/transports/telegram/polling.js.map +1 -1
  179. package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
  180. package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
  181. package/build/server/platform/transports/telegram/relay/index.js +5 -1
  182. package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
  183. package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
  184. package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
  185. package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
  186. package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
  187. package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
  188. package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
  189. package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
  190. package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
  191. package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
  192. package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
  193. package/build/server/platform/transports/work-delivery/contracts.js +26 -0
  194. package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
  195. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
  196. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
  197. package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
  198. package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
  199. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
  200. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
  201. package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
  202. package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
  203. package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
  204. package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
  205. package/build/server/platform/transports/work-delivery/outbox.js +270 -0
  206. package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
  207. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
  208. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
  209. package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
  210. package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
  211. package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
  212. package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
  213. package/build/server/platform/transports/work-delivery/port.js +15 -0
  214. package/build/server/platform/transports/work-delivery/port.js.map +1 -0
  215. package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
  216. package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
  217. package/build/server/platform/transports/work-delivery/proposal.js +59 -0
  218. package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
  219. package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
  220. package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
  221. package/build/server/platform/transports/work-delivery/readiness.js +123 -0
  222. package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
  223. package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
  224. package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
  225. package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
  226. package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
  227. package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
  228. package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
  229. package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
  230. package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
  231. package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
  232. package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
  233. package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
  234. package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
  235. package/build/server/products/chat/api/contracts.d.ts +10 -0
  236. package/build/server/products/chat/api/contracts.d.ts.map +1 -1
  237. package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
  238. package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
  239. package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
  240. package/build/server/products/chat/api/routeSupport.d.ts +8 -0
  241. package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
  242. package/build/server/products/chat/api/routeSupport.js +5 -4
  243. package/build/server/products/chat/api/routeSupport.js.map +1 -1
  244. package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
  245. package/build/server/products/chat/api/setupRoutes.js +23 -8
  246. package/build/server/products/chat/api/setupRoutes.js.map +1 -1
  247. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
  248. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
  249. package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
  250. package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
  251. package/build/server/products/chat/state/model/index.d.ts +1 -1
  252. package/build/server/products/chat/state/model/index.d.ts.map +1 -1
  253. package/build/server/products/chat/state/model/index.js +1 -1
  254. package/build/server/products/chat/state/model/index.js.map +1 -1
  255. package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
  256. package/build/server/products/code/api/relayRoutes.js +36 -7
  257. package/build/server/products/code/api/relayRoutes.js.map +1 -1
  258. package/build/server/products/code/state/relayState.d.ts +2 -1
  259. package/build/server/products/code/state/relayState.d.ts.map +1 -1
  260. package/build/server/products/code/state/relayState.js +7 -7
  261. package/build/server/products/code/state/relayState.js.map +1 -1
  262. package/build/server/products/shared/api/workspaceContracts.d.ts +5 -0
  263. package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
  264. package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
  265. package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
  266. package/build/server/products/work/api/goldenPathProjection.js +252 -0
  267. package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
  268. package/build/server/products/work/api/index.d.ts +54 -1
  269. package/build/server/products/work/api/index.d.ts.map +1 -1
  270. package/build/server/products/work/api/index.js +182 -4
  271. package/build/server/products/work/api/index.js.map +1 -1
  272. package/build/server/products/work/api/projection.d.ts +7 -1
  273. package/build/server/products/work/api/projection.d.ts.map +1 -1
  274. package/build/server/products/work/api/projection.js +7 -1
  275. package/build/server/products/work/api/projection.js.map +1 -1
  276. package/build/server/products/work/shared/apiPaths.d.ts +8 -0
  277. package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
  278. package/build/server/products/work/shared/apiPaths.js +8 -0
  279. package/build/server/products/work/shared/apiPaths.js.map +1 -1
  280. package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
  281. package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
  282. package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
  283. package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
  284. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
  285. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
  286. package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
  287. package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
  288. package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
  289. package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
  290. package/build/server/products/work/state/workCompletionEvidence.js +59 -0
  291. package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
  292. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
  293. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
  294. package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
  295. package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
  296. package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
  297. package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
  298. package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
  299. package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
  300. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
  301. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
  302. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
  303. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
  304. package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
  305. package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
  306. package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
  307. package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
  308. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
  309. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
  310. package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
  311. package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
  312. package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
  313. package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
  314. package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
  315. package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
  316. package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
  317. package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
  318. package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
  319. package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
  320. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
  321. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
  322. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
  323. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
  324. package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
  325. package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
  326. package/build/server/products/work/state/workGoldenPathService.js +1057 -0
  327. package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
  328. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
  329. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
  330. package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
  331. package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
  332. package/build/server/runtime/client.d.ts +13 -0
  333. package/build/server/runtime/client.d.ts.map +1 -1
  334. package/build/server/runtime/client.js +39 -0
  335. package/build/server/runtime/client.js.map +1 -1
  336. package/build/server/runtime/setup.d.ts +10 -4
  337. package/build/server/runtime/setup.d.ts.map +1 -1
  338. package/build/server/runtime/setup.js +14 -18
  339. package/build/server/runtime/setup.js.map +1 -1
  340. package/build/server/runtime/usageSnapshot.d.ts +3 -0
  341. package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
  342. package/build/server/runtime/usageSnapshot.js +69 -0
  343. package/build/server/runtime/usageSnapshot.js.map +1 -0
  344. package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
  345. package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
  346. package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
  347. package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
  348. package/build/server/server/routes/providers.d.ts.map +1 -1
  349. package/build/server/server/routes/providers.js +112 -81
  350. package/build/server/server/routes/providers.js.map +1 -1
  351. package/build/server/server/routes/telegram.d.ts +9 -0
  352. package/build/server/server/routes/telegram.d.ts.map +1 -1
  353. package/build/server/server/routes/telegram.js +79 -72
  354. package/build/server/server/routes/telegram.js.map +1 -1
  355. package/build/server/shared/catsAppManifest.d.ts +3 -1
  356. package/build/server/shared/catsAppManifest.d.ts.map +1 -1
  357. package/build/server/shared/catsAppManifest.js +2 -0
  358. package/build/server/shared/catsAppManifest.js.map +1 -1
  359. package/build/server/shared/executionLabel.d.ts.map +1 -1
  360. package/build/server/shared/executionLabel.js +8 -1
  361. package/build/server/shared/executionLabel.js.map +1 -1
  362. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  363. package/build/server/shared/i18n/catalogs/en.js +198 -3
  364. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  365. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  366. package/build/server/shared/i18n/catalogs/zh-TW.js +197 -3
  367. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  368. package/build/server/shared/i18n/index.d.ts +192 -0
  369. package/build/server/shared/i18n/index.d.ts.map +1 -1
  370. package/build/server/shared/i18n/messageKeys.d.ts +192 -0
  371. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  372. package/build/server/shared/i18n/messageKeys.js +192 -0
  373. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  374. package/build/server/shared/platformSetupOperation.d.ts +2 -0
  375. package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
  376. package/build/server/shared/platformSetupOperation.js +9 -0
  377. package/build/server/shared/platformSetupOperation.js.map +1 -0
  378. package/build/server/shared/providerCatalog.d.ts +5 -2
  379. package/build/server/shared/providerCatalog.d.ts.map +1 -1
  380. package/build/server/shared/providerCatalog.js +6 -0
  381. package/build/server/shared/providerCatalog.js.map +1 -1
  382. package/build/server/shared/providerCatalogData.d.ts +28 -22
  383. package/build/server/shared/providerCatalogData.d.ts.map +1 -1
  384. package/build/server/shared/providerCatalogData.js +22 -10
  385. package/build/server/shared/providerCatalogData.js.map +1 -1
  386. package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
  387. package/build/server/shared/providerCatalogInstances.js +3 -0
  388. package/build/server/shared/providerCatalogInstances.js.map +1 -1
  389. package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
  390. package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
  391. package/build/server/shared/providerModelLabelRegistry.js +49 -0
  392. package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
  393. package/build/server/shared/providerSelection.d.ts.map +1 -1
  394. package/build/server/shared/providerSelection.js +10 -13
  395. package/build/server/shared/providerSelection.js.map +1 -1
  396. package/build/server/shared/runtimeSetup.d.ts +17 -4
  397. package/build/server/shared/runtimeSetup.d.ts.map +1 -1
  398. package/build/server/shared/runtimeStatusPresentation.js +1 -1
  399. package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
  400. package/package.json +23 -1
  401. package/packages/app-sdk/browser.d.ts +51 -0
  402. package/packages/app-sdk/browser.js +48 -0
  403. package/packages/app-sdk/package.d.ts +14 -0
  404. package/packages/app-sdk/package.js +131 -0
  405. package/packages/app-sdk/package.json +7 -0
  406. package/scripts/README.md +43 -26
  407. package/scripts/build-desktop-installer.mjs +15 -0
  408. package/scripts/build-test-ui.mjs +1 -1
  409. package/scripts/bundle-server.mjs +23 -10
  410. package/scripts/linux/build-desktop-package.sh +6 -6
  411. package/scripts/linux/install-antigravity.sh +0 -0
  412. package/scripts/linux/install-devin.sh +0 -0
  413. package/scripts/linux/install-meta-cli.sh +8 -0
  414. package/scripts/linux/provider-cli-common.sh +103 -30
  415. package/scripts/linux/sync-agent-skills.sh +27 -5
  416. package/scripts/linux/test-linux-package-smoke.sh +4 -3
  417. package/scripts/linux/upgrade-cli-tools.sh +1 -1
  418. package/scripts/macos/build-desktop-package.sh +5 -5
  419. package/scripts/macos/install-antigravity.sh +0 -0
  420. package/scripts/macos/install-devin.sh +0 -0
  421. package/scripts/macos/install-meta-cli.sh +8 -0
  422. package/scripts/macos/provider-cli-common.sh +103 -30
  423. package/scripts/macos/sync-agent-skills.sh +27 -5
  424. package/scripts/macos/test-macos-package-smoke.sh +4 -3
  425. package/scripts/macos/upgrade-cli-tools.sh +1 -1
  426. package/scripts/package-desktop.mjs +15 -2
  427. package/scripts/testing/check-usage-app.mts +266 -0
  428. package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
  429. package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
  430. package/scripts/verify-desktop-app-bundle.mjs +108 -0
  431. package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
  432. package/scripts/windows/{Install-Aider.ps1 → Install-MetaCli.ps1} +180 -92
  433. package/scripts/windows/Install-Ollama.ps1 +4 -1
  434. package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
  435. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +2 -1
  436. package/build/desktop/updateNotifications.d.ts +0 -64
  437. package/build/desktop/updateNotifications.d.ts.map +0 -1
  438. package/build/desktop/updateNotifications.js +0 -143
  439. package/build/desktop/updateNotifications.js.map +0 -1
  440. package/build/renderer/assets/App-BfOvMP2m.js +0 -1
  441. package/build/renderer/assets/App-DGwkRFZl.css +0 -1
  442. package/build/renderer/assets/App-DWd7I3Z2.js +0 -2
  443. package/build/renderer/assets/WorkspaceAppRoutes-CrbTA9En.js +0 -1
  444. package/build/renderer/assets/app-BTww3Hl4.js +0 -43
  445. package/build/renderer/assets/app-CPxWQwLA.css +0 -1
  446. package/build/renderer/assets/conversationSidebarRecentEntries-QuaOPxCb.js +0 -6
  447. package/scripts/linux/install-aider.sh +0 -8
  448. package/scripts/macos/install-aider.sh +0 -8
@@ -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,11 @@ import { buildDesktopBootstrapSnapshot, fetchJson, } from './readiness.js';
12
12
  import { isDesktopAppOriginUrl, isDesktopHostActionId, resolveDesktopBrowserHandoffUrl, validateDesktopUrl, } from './security.js';
13
13
  import { assertMainWindowIpcSender } from './ipcSecurity.js';
14
14
  import { readPersistedSetupCompletionState, } from './persistedSetupState.js';
15
- import { buildDesktopSetupSnapshot, createEmptyDesktopSetupState, runDesktopSetupHelper, 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 { resolveSelectedSetupAuditActions } from './setupAudit.js';
19
+ import { pauseSelectedSetupHelpers, retryPendingSetupOperationReleases, targetsForSetupHelper, withSelectedSetupTargets } from './providerSelection.js';
19
20
  import { buildDesktopCliInventoryFromRuntime, probeContradictsCachedBootstrapState, } from './cliInventoryProbe.js';
20
21
  import { createDesktopTrayController, } from './tray.js';
21
22
  import { buildDesktopTrayMenuState as buildElectronTrayMenuState, buildDesktopTrayQuittingMenuState, } from './trayMenu.js';
@@ -27,7 +28,6 @@ import { createDesktopUpdateCapability, createDesktopUpdateManager, createUnavai
27
28
  import { configureElectronUpdater, createElectronUpdaterAdapter, resolveAutoUpdaterExport, } from './updaterAdapter.js';
28
29
  import { createDesktopUpdateIpcHandlers, createDesktopUpdateSnapshotBroadcast, } from './updateIpc.js';
29
30
  import { withDesktopInstallHandoff } from './updateInstallHandoff.js';
30
- import { DESKTOP_UPDATE_SETTINGS_PATH, resolveDesktopUpdateAnnouncement, } from './updateNotifications.js';
31
31
  import { applyDesktopWindowChrome, resolveDesktopWindowChromeOptions, } from './windowChrome.js';
32
32
  import { resolveDesktopWindowIconPath } from './windowIcon.js';
33
33
  import { readDesktopStartupPreferences, resolveDesktopStartupLaunchContext, syncDesktopStartupPreferences, updateDesktopStartupPreferences, DESKTOP_LAUNCH_AT_LOGIN_ARG, } from './desktopStartup.js';
@@ -73,6 +73,7 @@ let runtimeCliInventoryPollTimer = null;
73
73
  let runtimeCliInventoryScanPending = false;
74
74
  let shuttingDown = false;
75
75
  let shutdownPromise = null;
76
+ let setupHelperDrain = null;
76
77
  let exitingAfterShutdown = false;
77
78
  let trayController = null;
78
79
  let stateStore = null;
@@ -133,8 +134,11 @@ function rememberRuntimeCliInventoryProbe(probe) {
133
134
  if (!probe) {
134
135
  return false;
135
136
  }
136
- if (probe.scan) {
137
- 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))) {
138
142
  runtimeCliInventoryScanPending = false;
139
143
  clearCliInventoryError();
140
144
  return true;
@@ -753,58 +757,28 @@ function buildTrayControllerOptions() {
753
757
  if (shuttingDown || !updateManager) {
754
758
  return;
755
759
  }
756
- await runDesktopUpdateDialog(updateManager.getSnapshot());
760
+ await runDesktopUpdateDialog({
761
+ manager: updateManager,
762
+ platform: process.platform,
763
+ locale: app.getLocale(),
764
+ isShuttingDown: () => shuttingDown,
765
+ showDialog: async (dialogSpec) => {
766
+ const choice = await dialog.showMessageBox({
767
+ type: dialogSpec.action === 'none' ? 'info' : 'question',
768
+ title: dialogSpec.title,
769
+ message: dialogSpec.message,
770
+ detail: dialogSpec.detail,
771
+ buttons: dialogSpec.buttons,
772
+ defaultId: 0,
773
+ cancelId: dialogSpec.buttons.length - 1,
774
+ noLink: true,
775
+ });
776
+ return choice.response;
777
+ },
778
+ });
757
779
  },
758
780
  };
759
781
  }
760
- /**
761
- * Shows the update dialog for the current state and carries out whatever the
762
- * user confirmed, re-entering once when the state it described was "nothing
763
- * asked yet" and the answer needed a check first.
764
- */
765
- async function runDesktopUpdateDialog(snapshot, allowRecheck = true) {
766
- if (!updateManager) {
767
- return;
768
- }
769
- const dialogSpec = resolveDesktopUpdateDialog({
770
- snapshot,
771
- platform: process.platform,
772
- locale: app.getLocale(),
773
- });
774
- // An idle host has nothing to report yet. Run the check first and answer
775
- // with its result, so one click produces one dialog rather than a dialog
776
- // saying "about to look" followed by silence.
777
- if (dialogSpec.action === 'check' && allowRecheck) {
778
- const checked = await refreshUpdateState('tray');
779
- if (checked && !shuttingDown) {
780
- await runDesktopUpdateDialog(checked, false);
781
- }
782
- return;
783
- }
784
- const choice = await dialog.showMessageBox({
785
- type: dialogSpec.action === 'none' ? 'info' : 'question',
786
- title: dialogSpec.title,
787
- message: dialogSpec.message,
788
- detail: dialogSpec.detail,
789
- buttons: dialogSpec.buttons,
790
- defaultId: 0,
791
- cancelId: dialogSpec.buttons.length - 1,
792
- noLink: true,
793
- });
794
- if (choice.response !== 0 || dialogSpec.action === 'none' || shuttingDown) {
795
- return;
796
- }
797
- if (dialogSpec.action === 'update') {
798
- const downloaded = await updateManager.downloadUpdate();
799
- if (downloaded.status !== 'downloaded' || shuttingDown) {
800
- // The dialog is closed and the tray never held the answer, so a failed
801
- // download has to be carried to the user rather than left to be found.
802
- await announceDesktopUpdateResult('tray', downloaded);
803
- return;
804
- }
805
- }
806
- await updateManager.restartAndInstall();
807
- }
808
782
  async function syncTrayController() {
809
783
  if (shuttingDown) {
810
784
  trayController?.updateMenu(buildDesktopTrayQuittingMenuState(app.getLocale()));
@@ -856,11 +830,26 @@ async function getSetupSnapshot() {
856
830
  if (!hostConfig) {
857
831
  throw new Error('Desktop host is not initialized.');
858
832
  }
859
- return await buildDesktopSetupSnapshot({
833
+ const snapshot = await buildDesktopSetupSnapshot({
860
834
  config: hostConfig,
861
835
  packaging: resolveCurrentPackagingPlan(hostConfig),
862
836
  state: setupState ?? createEmptyDesktopSetupState(),
863
837
  });
838
+ const probe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl);
839
+ snapshot.helpers = snapshot.helpers.filter((helper) => {
840
+ if (!probe?.selection)
841
+ return false;
842
+ try {
843
+ return targetsForSetupHelper(helper.id, probe.selection).length > 0;
844
+ }
845
+ catch {
846
+ return false;
847
+ }
848
+ });
849
+ if (snapshot.resumeAction && !snapshot.helpers.some((helper) => helper.id === snapshot.resumeAction.helperId)) {
850
+ snapshot.resumeAction = null;
851
+ }
852
+ return snapshot;
864
853
  }
865
854
  async function fetchWithTimeout(url, init, timeoutMs) {
866
855
  const controller = new AbortController();
@@ -890,86 +879,39 @@ async function fetchJsonWithTimeout(url, init, timeoutMs) {
890
879
  }
891
880
  return await response.json();
892
881
  }
893
- function shouldRefreshRuntimeCliInventoryProbe(probe, options) {
894
- if (options.triggerScanIfMissing !== true) {
895
- return false;
896
- }
897
- if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe)) {
898
- return false;
899
- }
900
- if (!probe?.scan) {
901
- return true;
902
- }
903
- return !probe.scan.providers.some((provider) => provider.available === true);
904
- }
905
882
  async function fetchRuntimeCliInventoryProbe(baseUrl, options = {}) {
906
- 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
- }
883
+ await retryPendingSetupOperationReleases();
884
+ const timeout = options.setupStateTimeoutMs ?? RUNTIME_SETUP_STATE_TIMEOUT_MS;
885
+ let probe;
886
+ try {
887
+ probe = await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
936
888
  }
937
- // 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".
889
+ catch {
890
+ return null;
891
+ }
892
+ // A forced scan still needs a current, nonempty declared selection.
893
+ if (probe.selection?.state !== 'selected')
894
+ return probe;
895
+ if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(probe))
896
+ return probe;
897
+ if (!options.forceRescan && (probe.scan || !options.triggerScanIfMissing))
898
+ return probe;
941
899
  try {
942
900
  runtimeCliInventoryScanPending = true;
943
- const scanResponse = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
901
+ const response = await fetchWithTimeout(`${baseUrl}/setup-scan`, {
944
902
  method: 'POST',
945
903
  headers: { 'content-type': 'application/json', accept: 'application/json' },
946
- body: JSON.stringify({ manual: false }),
947
- }, scanTimeoutMs);
948
- 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)
949
907
  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);
908
+ return await fetchJsonWithTimeout(`${baseUrl}/setup-state`, { method: 'GET' }, timeout);
960
909
  }
961
910
  catch {
911
+ runtimeCliInventoryScanPending = false;
962
912
  return probe;
963
913
  }
964
914
  }
965
- function isCliMissingBootstrapSnapshot(snapshot) {
966
- if (hostConfig?.bootstrap.onboardingMode !== 'cli_inventory_gate') {
967
- return false;
968
- }
969
- return Boolean(snapshot.phase === 'needs_prerequisites'
970
- && snapshot.prerequisites?.cliInventory?.source === 'runtime'
971
- && snapshot.prerequisites.cliInventory.total === 0);
972
- }
973
915
  function buildSnapshot(lastError) {
974
916
  if (!hostConfig || !supervisor) {
975
917
  throw new Error('Desktop host is not initialized.');
@@ -992,6 +934,8 @@ function buildSnapshot(lastError) {
992
934
  packaging: packagingState ?? undefined,
993
935
  setup: setupState ?? undefined,
994
936
  hostStatePath: hostConfig.paths.hostStatePath,
937
+ providerSelection: latestCliInventoryProbe?.selection ?? null,
938
+ providerCatalog: latestCliInventoryProbe?.universe ?? [],
995
939
  cliInventory: resolveSnapshotCliInventory(),
996
940
  cliInventoryError: latestCliInventoryError,
997
941
  });
@@ -1016,7 +960,7 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
1016
960
  ?? await readPersistedSetupCompletionState(hostConfig.paths.appStatePath);
1017
961
  latestPersistedSetupState = effectivePersistedSetup;
1018
962
  const setupCompleted = Boolean(effectivePersistedSetup.setupCompleteAt || effectivePersistedSetup.productSetupCompleted);
1019
- const shouldReadCliInventory = setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate';
963
+ const shouldReadCliInventory = true;
1020
964
  // /diagnostics/providers is intentionally NOT fetched on the boot critical
1021
965
  // path — it's not authoritative for any phase decision before setup, and
1022
966
  // for setup-complete users we kick it off in the background (see
@@ -1071,6 +1015,8 @@ async function refreshBootstrapSnapshot(persistedSetup = null) {
1071
1015
  packaging: packagingState ?? undefined,
1072
1016
  setup: setupState ?? undefined,
1073
1017
  hostStatePath: hostConfig.paths.hostStatePath,
1018
+ providerSelection: latestCliInventoryProbe?.selection ?? null,
1019
+ providerCatalog: latestCliInventoryProbe?.universe ?? [],
1074
1020
  cliInventory: resolveSnapshotCliInventory(),
1075
1021
  cliInventoryError: latestCliInventoryError,
1076
1022
  });
@@ -1082,28 +1028,20 @@ function hasPersistedProductSetupCompletion(persistedSetup = null) {
1082
1028
  const productEvents = diagnosticsState?.product?.events ?? [];
1083
1029
  return productEvents.some((event) => event.kind === 'setup_completed' && event.status === 'ok');
1084
1030
  }
1085
- 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) {
1031
+ const auditedSetupHelpers = new Set();
1032
+ async function maybePrimeSetupAudit(_snapshot, _persistedSetup = null) {
1033
+ if (!hostConfig)
1097
1034
  return;
1035
+ const selection = latestCliInventoryProbe?.selection ?? null;
1036
+ for (const action of resolveSelectedSetupAuditActions(selection)) {
1037
+ const key = `${selection.revision}:${action.helperId}`;
1038
+ if (auditedSetupHelpers.has(key))
1039
+ continue;
1040
+ auditedSetupHelpers.add(key);
1041
+ await runSetupAction({ helperId: action.helperId, mode: 'check' }, {
1042
+ publishMode: 'bootstrap-only', refreshBootstrap: false,
1043
+ });
1098
1044
  }
1099
- await runSetupAction({
1100
- helperId: setupAuditAction.helperId,
1101
- mode: 'check',
1102
- extraArguments: setupAuditAction.extraArguments,
1103
- }, {
1104
- publishMode: 'bootstrap-only',
1105
- refreshBootstrap: false,
1106
- });
1107
1045
  }
1108
1046
  function scheduleBackgroundSetupAudit(snapshot, persistedSetup = null) {
1109
1047
  if (isDesktopBootstrapLoadingPhase(snapshot.phase) || backgroundSetupAuditPromise) {
@@ -1199,7 +1137,7 @@ async function retryCliInventoryScanInBackground(options) {
1199
1137
  await new Promise((resolve) => setTimeout(resolve, wait));
1200
1138
  }
1201
1139
  }
1202
- if (!options.setupCompleted && latestSnapshot && isDesktopBootstrapLoadingPhase(latestSnapshot.phase)) {
1140
+ if (runtimeCliInventoryScanPending || isRuntimeCliInventoryScanActive(latestCliInventoryProbe)) {
1203
1141
  scheduleRuntimeCliInventoryPoll({
1204
1142
  setupCompleted: options.setupCompleted,
1205
1143
  });
@@ -1228,22 +1166,12 @@ function scheduleBackgroundBootstrapWork(snapshot, persistedSetup) {
1228
1166
  const setupCompleted = Boolean(snapshot.app.setupCompleteAt
1229
1167
  ?? persistedSetup?.setupCompleteAt
1230
1168
  ?? persistedSetup?.productSetupCompleted);
1231
- // 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.
1169
+ // Run shared Node and local-model checks only for eligible selected targets.
1235
1170
  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.
1171
+ // Inventory observes the saved selection; missing/invalid/empty selections
1172
+ // never launch a provider scan. Availability does not gate product onboarding.
1245
1173
  void retryCliInventoryScanInBackground({
1246
- forceRescan: setupCompleted,
1174
+ forceRescan: false,
1247
1175
  setupCompleted,
1248
1176
  }).catch((error) => {
1249
1177
  process.stderr.write(`Background CLI inventory rescan failed: ${error instanceof Error ? error.message : String(error)}\n`);
@@ -1378,7 +1306,17 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
1378
1306
  // supervisor-lifetime environment snapshot populated during the first
1379
1307
  // bootstrap, including the Desktop-provisioned platform auth secret.
1380
1308
  exitingAfterShutdown = false;
1381
- 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
+ }
1382
1320
  await syncTrayController();
1383
1321
  },
1384
1322
  exitAfterUncertainHandoff: async () => {
@@ -1409,77 +1347,6 @@ async function createUpdateManagerForLaunch(config, initialLastCheckedAt = null)
1409
1347
  },
1410
1348
  });
1411
1349
  }
1412
- async function openDesktopUpdateSettings() {
1413
- if (shuttingDown || !hostConfig) {
1414
- return;
1415
- }
1416
- await showMainWindow(`${hostConfig.appBaseUrl}${DESKTOP_UPDATE_SETTINGS_PATH}`);
1417
- }
1418
- /**
1419
- * Shows a native notification, reporting whether the user will actually see it.
1420
- *
1421
- * A false return sends the caller to the navigation fallback. Notifying is not
1422
- * worth failing a check over, so a throwing platform is treated the same as one
1423
- * without notification support.
1424
- */
1425
- function showDesktopUpdateNotification(notification) {
1426
- try {
1427
- const native = new Notification({
1428
- title: notification.title,
1429
- body: notification.body,
1430
- });
1431
- native.on('click', () => {
1432
- void openDesktopUpdateSettings();
1433
- });
1434
- native.show();
1435
- return true;
1436
- }
1437
- catch (error) {
1438
- process.stderr.write('[desktop-update] native notification unavailable: '
1439
- + `${error instanceof Error ? error.message : String(error)}\n`);
1440
- return false;
1441
- }
1442
- }
1443
- function areNativeNotificationsSupported() {
1444
- try {
1445
- return Notification.isSupported();
1446
- }
1447
- catch {
1448
- return false;
1449
- }
1450
- }
1451
- async function announceDesktopUpdateResult(origin, snapshot) {
1452
- if (!snapshot || shuttingDown) {
1453
- return;
1454
- }
1455
- const announcement = resolveDesktopUpdateAnnouncement({
1456
- origin,
1457
- snapshot,
1458
- locale: app.getLocale(),
1459
- notificationsSupported: areNativeNotificationsSupported(),
1460
- });
1461
- if (announcement.notification && showDesktopUpdateNotification(announcement.notification)) {
1462
- return;
1463
- }
1464
- if (announcement.fallbackNavigatePath) {
1465
- await openDesktopUpdateSettings();
1466
- }
1467
- }
1468
- /**
1469
- * Runs a check and reports its result to whoever asked for it.
1470
- *
1471
- * The origin is required rather than defaulted: it decides whether the result
1472
- * is announced at all, and a new caller silently inheriting another surface's
1473
- * policy is the failure this signature exists to prevent.
1474
- */
1475
- async function refreshUpdateState(origin) {
1476
- if (!updateManager) {
1477
- return null;
1478
- }
1479
- updateState = await updateManager.checkForUpdates();
1480
- await announceDesktopUpdateResult(origin, updateState);
1481
- return updateState;
1482
- }
1483
1350
  async function bootstrapDesktopHost(restartServices = false) {
1484
1351
  if (!hostConfig || !supervisor) {
1485
1352
  throw new Error('Desktop host is not initialized.');
@@ -1487,7 +1354,9 @@ async function bootstrapDesktopHost(restartServices = false) {
1487
1354
  if (bootstrapPromise) {
1488
1355
  return bootstrapPromise;
1489
1356
  }
1357
+ const helperPause = restartServices ? pauseSelectedSetupHelpers() : null;
1490
1358
  bootstrapPromise = (async () => {
1359
+ await helperPause?.drained;
1491
1360
  latestBootstrapError = null;
1492
1361
  latestCliInventoryError = null;
1493
1362
  runtimeCliInventoryScanPending = false;
@@ -1523,6 +1392,7 @@ async function bootstrapDesktopHost(restartServices = false) {
1523
1392
  const snapshot = publishSnapshot(buildSnapshot());
1524
1393
  return maybeOpenApp(snapshot).then(() => snapshot);
1525
1394
  }).finally(() => {
1395
+ helperPause?.resume();
1526
1396
  bootstrapPromise = null;
1527
1397
  });
1528
1398
  return bootstrapPromise;
@@ -1553,17 +1423,15 @@ async function runHostAction(actionId) {
1553
1423
  }
1554
1424
  if (actionId === 'open_setup') {
1555
1425
  const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
1556
- if (isCliMissingBootstrapSnapshot(snapshot)) {
1426
+ if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
1557
1427
  return snapshot;
1558
- }
1559
1428
  await showMainWindow(`${hostConfig.appBaseUrl}/setup`);
1560
1429
  return snapshot;
1561
1430
  }
1562
1431
  if (actionId === 'open_chat') {
1563
1432
  const snapshot = latestSnapshot ?? await refreshBootstrapSnapshot();
1564
- if (isCliMissingBootstrapSnapshot(snapshot)) {
1433
+ if (!latestCliInventoryProbe?.selection || ['missing', 'invalid'].includes(latestCliInventoryProbe.selection.state))
1565
1434
  return snapshot;
1566
- }
1567
1435
  await showMainWindow(`${hostConfig.appBaseUrl}${snapshot.app.entryPath}`);
1568
1436
  return snapshot;
1569
1437
  }
@@ -1578,10 +1446,9 @@ async function runSetupAction(action, options = {}) {
1578
1446
  throw new Error('Desktop host is not initialized.');
1579
1447
  }
1580
1448
  const packaging = resolveCurrentPackagingPlan(hostConfig);
1581
- const result = await runDesktopSetupHelper({
1582
- config: hostConfig,
1583
- packaging,
1584
- action,
1449
+ const result = await withSelectedSetupTargets({
1450
+ baseUrl: hostConfig.runtimeBaseUrl, helperId: action.helperId,
1451
+ run: () => runDesktopSetupHelper({ config: hostConfig, packaging, action }),
1585
1452
  });
1586
1453
  packagingState = packaging;
1587
1454
  setupState = {
@@ -1620,8 +1487,7 @@ async function runSetupAction(action, options = {}) {
1620
1487
  // depend on the helper's runState — the rescan itself is authoritative.
1621
1488
  const setupCompleted = hasPersistedSetupCompletion();
1622
1489
  const shouldRefreshCliInventory = action.mode !== 'check'
1623
- && shouldRefreshCliInventoryAfterSetupAction(action.helperId)
1624
- && (setupCompleted || hostConfig.bootstrap.onboardingMode === 'cli_inventory_gate');
1490
+ && shouldRefreshCliInventoryAfterSetupAction(action.helperId);
1625
1491
  if (shouldRefreshCliInventory) {
1626
1492
  const refreshedProbe = await fetchRuntimeCliInventoryProbe(hostConfig.runtimeBaseUrl, {
1627
1493
  forceRescan: true,
@@ -1750,6 +1616,9 @@ function waitForShutdownDeadline(ms) {
1750
1616
  * surviving sidecar may still hold.
1751
1617
  */
1752
1618
  async function drainManagedServices() {
1619
+ setupHelperDrain ??= pauseSelectedSetupHelpers();
1620
+ // Installer completion is outside the sidecar shutdown watchdog budget.
1621
+ await setupHelperDrain.drained;
1753
1622
  const drain = supervisor?.stopAll() ?? Promise.resolve();
1754
1623
  const shutdownWatchdogMs = hostConfig
1755
1624
  ? resolveShutdownWatchdogMs(hostConfig, supervisor?.getManagedServiceCount() ?? 0)
@@ -1773,8 +1642,10 @@ async function shutdownHost() {
1773
1642
  return shutdownPromise;
1774
1643
  }
1775
1644
  shuttingDown = true;
1645
+ setupHelperDrain ??= pauseSelectedSetupHelpers();
1776
1646
  clearRuntimeCliInventoryPoll();
1777
1647
  shutdownPromise = (async () => {
1648
+ await setupHelperDrain.drained;
1778
1649
  let shutdownExitCode = 0;
1779
1650
  let forcedStopAttempted = false;
1780
1651
  const activeTrayController = trayController;
@@ -1819,11 +1690,8 @@ async function main() {
1819
1690
  return;
1820
1691
  }
1821
1692
  app.setPath('userData', resolveDesktopUserDataDir(app.getPath('appData')));
1822
- // 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.
1693
+ // Keep the packaged process identity aligned with the installer-created
1694
+ // Windows shortcuts and taskbar grouping.
1827
1695
  if (process.platform === 'win32' && app.isPackaged && DESKTOP_APP_USER_MODEL_ID) {
1828
1696
  app.setAppUserModelId(DESKTOP_APP_USER_MODEL_ID);
1829
1697
  }
@@ -1939,6 +1807,33 @@ async function main() {
1939
1807
  }
1940
1808
  return await runHostAction(actionId);
1941
1809
  });
1810
+ ipcMain.handle('cats-host:save-provider-selection', async (event, payload) => {
1811
+ assertMainWindowIpcSender(event, mainWindow, 'Provider selection is only available to the main Cats window.');
1812
+ if (!hostConfig || !payload || typeof payload !== 'object')
1813
+ throw new Error('Invalid provider selection.');
1814
+ const body = payload;
1815
+ if ((!Array.isArray(body.targets) && body.reload !== true) || typeof body.expectedRevision !== 'string') {
1816
+ throw new Error('Invalid provider selection.');
1817
+ }
1818
+ await retryPendingSetupOperationReleases();
1819
+ const response = await fetchWithTimeout(`${hostConfig.runtimeBaseUrl}/setup-selection${body.reload === true ? '/reload' : ''}`, {
1820
+ method: body.reload === true ? 'POST' : 'PUT',
1821
+ headers: { 'content-type': 'application/json' },
1822
+ body: JSON.stringify({ targets: body.targets, expectedRevision: body.expectedRevision }),
1823
+ }, RUNTIME_SETUP_STATE_TIMEOUT_MS);
1824
+ if (!response.ok) {
1825
+ const result = await response.json();
1826
+ throw new Error(result.error || 'Could not save provider selection.');
1827
+ }
1828
+ latestProviderDiagnosticsPayload = null;
1829
+ latestCliInventoryError = null;
1830
+ runtimeCliInventoryScanPending = false;
1831
+ const snapshot = await refreshBootstrapSnapshot();
1832
+ publishSnapshot(snapshot);
1833
+ scheduleBackgroundBootstrapWork(snapshot, latestPersistedSetupState);
1834
+ await maybeOpenApp(snapshot);
1835
+ return snapshot;
1836
+ });
1942
1837
  ipcMain.handle('cats-host:run-setup-helper', async (_event, payload) => {
1943
1838
  if (typeof payload !== 'object'
1944
1839
  || payload === null
@@ -2135,7 +2030,7 @@ async function main() {
2135
2030
  // SPEC-111 section 6: at most one silent check per launch, and only when the
2136
2031
  // build actually has update capability.
2137
2032
  if (hostConfig.update.checkOnStartup && updateManager?.getSnapshot().capability.canCheck) {
2138
- void refreshUpdateState('startup');
2033
+ void updateManager.checkForUpdates();
2139
2034
  }
2140
2035
  }
2141
2036
  void main().catch((error) => {