@cats-inc/cats-platform 0.1.21 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/.env.example +3 -7
  2. package/README.md +35 -0
  3. package/build/desktop/bootstrapNavigation.d.ts.map +1 -1
  4. package/build/desktop/bootstrapNavigation.js +6 -13
  5. package/build/desktop/bootstrapNavigation.js.map +1 -1
  6. package/build/desktop/bootstrapPage.d.ts.map +1 -1
  7. package/build/desktop/bootstrapPage.js +63 -86
  8. package/build/desktop/bootstrapPage.js.map +1 -1
  9. package/build/desktop/cliInventoryProbe.d.ts +11 -2
  10. package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
  11. package/build/desktop/cliInventoryProbe.js +19 -13
  12. package/build/desktop/cliInventoryProbe.js.map +1 -1
  13. package/build/desktop/config.d.ts +0 -4
  14. package/build/desktop/config.d.ts.map +1 -1
  15. package/build/desktop/config.js +1 -6
  16. package/build/desktop/config.js.map +1 -1
  17. package/build/desktop/contracts.d.ts +12 -2
  18. package/build/desktop/contracts.d.ts.map +1 -1
  19. package/build/desktop/contracts.js +1 -2
  20. package/build/desktop/contracts.js.map +1 -1
  21. package/build/desktop/hostVersion.d.ts.map +1 -1
  22. package/build/desktop/hostVersion.js +3 -5
  23. package/build/desktop/hostVersion.js.map +1 -1
  24. package/build/desktop/main.js +205 -256
  25. package/build/desktop/main.js.map +1 -1
  26. package/build/desktop/packaging.d.ts +2 -0
  27. package/build/desktop/packaging.d.ts.map +1 -1
  28. package/build/desktop/packaging.js +34 -14
  29. package/build/desktop/packaging.js.map +1 -1
  30. package/build/desktop/preload.cjs +9 -0
  31. package/build/desktop/preload.cjs.map +1 -1
  32. package/build/desktop/processSupervisor.d.ts.map +1 -1
  33. package/build/desktop/processSupervisor.js +3 -0
  34. package/build/desktop/processSupervisor.js.map +1 -1
  35. package/build/desktop/providerManager.d.ts +46 -0
  36. package/build/desktop/providerManager.d.ts.map +1 -0
  37. package/build/desktop/providerManager.js +220 -0
  38. package/build/desktop/providerManager.js.map +1 -0
  39. package/build/desktop/providerSelection.d.ts +38 -0
  40. package/build/desktop/providerSelection.d.ts.map +1 -0
  41. package/build/desktop/providerSelection.js +118 -0
  42. package/build/desktop/providerSelection.js.map +1 -0
  43. package/build/desktop/readiness.d.ts +2 -0
  44. package/build/desktop/readiness.d.ts.map +1 -1
  45. package/build/desktop/readiness.js +14 -33
  46. package/build/desktop/readiness.js.map +1 -1
  47. package/build/desktop/setupAssets.d.ts.map +1 -1
  48. package/build/desktop/setupAssets.js +28 -14
  49. package/build/desktop/setupAssets.js.map +1 -1
  50. package/build/desktop/setupAudit.d.ts +4 -3
  51. package/build/desktop/setupAudit.d.ts.map +1 -1
  52. package/build/desktop/setupAudit.js +18 -34
  53. package/build/desktop/setupAudit.js.map +1 -1
  54. package/build/desktop/setupBridge.js +1 -1
  55. package/build/desktop/setupBridge.js.map +1 -1
  56. package/build/desktop/setupPrerequisites.d.ts +11 -0
  57. package/build/desktop/setupPrerequisites.d.ts.map +1 -0
  58. package/build/desktop/setupPrerequisites.js +47 -0
  59. package/build/desktop/setupPrerequisites.js.map +1 -0
  60. package/build/desktop/updateDialog.d.ts +27 -1
  61. package/build/desktop/updateDialog.d.ts.map +1 -1
  62. package/build/desktop/updateDialog.js +85 -5
  63. package/build/desktop/updateDialog.js.map +1 -1
  64. package/build/renderer/assets/ActiveSessionPermissionChip-B49WcZBJ.js +1 -0
  65. package/build/renderer/assets/App-BpxZB5ym.js +2 -0
  66. package/build/renderer/assets/App-DYTUfAl6.js +1 -0
  67. package/build/renderer/assets/App-DxsV-tKS.css +1 -0
  68. package/build/renderer/assets/{App-DKOSn0o_.js → App-boB4WrmU.js} +1 -1
  69. package/build/renderer/assets/WorkspaceAppRoutes-CPqz85iw.js +1 -0
  70. package/build/renderer/assets/app-C52wwCGz.js +85 -0
  71. package/build/renderer/assets/app-CqnsY5ed.css +1 -0
  72. package/build/renderer/assets/{client-BdGHAUoK.js → client-DREGSZqQ.js} +1 -1
  73. package/build/renderer/assets/conversationSidebarRecentEntries-DK0iWS73.js +6 -0
  74. package/build/renderer/assets/{screenshotOverlay-DfBcolX-.js → screenshotOverlay-EF07cXvw.js} +1 -1
  75. package/build/renderer/assets/{useDraftSessionChips-DCIId0eY.js → useDraftSessionChips-BdZ_B1gy.js} +1 -1
  76. package/build/renderer/desktop/overlay/index.html +2 -2
  77. package/build/renderer/index.html +3 -3
  78. package/build/server/app/renderer/auth/api.d.ts.map +1 -1
  79. package/build/server/app/renderer/auth/api.js +4 -1
  80. package/build/server/app/renderer/auth/api.js.map +1 -1
  81. package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
  82. package/build/server/app/renderer/providerCatalogClient.js +34 -12
  83. package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
  84. package/build/server/app/renderer/providerClientInvalidation.d.ts +6 -0
  85. package/build/server/app/renderer/providerClientInvalidation.d.ts.map +1 -0
  86. package/build/server/app/renderer/providerClientInvalidation.js +12 -0
  87. package/build/server/app/renderer/providerClientInvalidation.js.map +1 -0
  88. package/build/server/app/renderer/providerReadLoop.d.ts +5 -0
  89. package/build/server/app/renderer/providerReadLoop.d.ts.map +1 -0
  90. package/build/server/app/renderer/providerReadLoop.js +52 -0
  91. package/build/server/app/renderer/providerReadLoop.js.map +1 -0
  92. package/build/server/app/renderer/providerRegistryClient.d.ts +3 -2
  93. package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
  94. package/build/server/app/renderer/providerRegistryClient.js +51 -53
  95. package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
  96. package/build/server/app/server/appPackageRoutes.d.ts +2 -0
  97. package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
  98. package/build/server/app/server/appPackageRoutes.js +105 -0
  99. package/build/server/app/server/appPackageRoutes.js.map +1 -1
  100. package/build/server/app/server/authGatePolicy.js +14 -1
  101. package/build/server/app/server/authGatePolicy.js.map +1 -1
  102. package/build/server/app/server/contracts.d.ts +15 -0
  103. package/build/server/app/server/contracts.d.ts.map +1 -1
  104. package/build/server/app/server/dependencies.d.ts.map +1 -1
  105. package/build/server/app/server/dependencies.js +42 -1
  106. package/build/server/app/server/dependencies.js.map +1 -1
  107. package/build/server/app/server/goldenPathStartupResume.d.ts +55 -0
  108. package/build/server/app/server/goldenPathStartupResume.d.ts.map +1 -0
  109. package/build/server/app/server/goldenPathStartupResume.js +109 -0
  110. package/build/server/app/server/goldenPathStartupResume.js.map +1 -0
  111. package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
  112. package/build/server/app/server/platformSetupRoutes.js +1 -13
  113. package/build/server/app/server/platformSetupRoutes.js.map +1 -1
  114. package/build/server/app/server/polling.d.ts.map +1 -1
  115. package/build/server/app/server/polling.js +2 -0
  116. package/build/server/app/server/polling.js.map +1 -1
  117. package/build/server/app/server/requestRouter.d.ts.map +1 -1
  118. package/build/server/app/server/requestRouter.js +30 -0
  119. package/build/server/app/server/requestRouter.js.map +1 -1
  120. package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
  121. package/build/server/app/server/runtimeSurfaceProxy.js +4 -2
  122. package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
  123. package/build/server/app/server/startupRecovery.d.ts.map +1 -1
  124. package/build/server/app/server/startupRecovery.js +5 -0
  125. package/build/server/app/server/startupRecovery.js.map +1 -1
  126. package/build/server/app/server/subscribeRoutes.d.ts.map +1 -1
  127. package/build/server/app/server/subscribeRoutes.js +5 -3
  128. package/build/server/app/server/subscribeRoutes.js.map +1 -1
  129. package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
  130. package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
  131. package/build/server/app/server/telegramCommandSurface.js +123 -0
  132. package/build/server/app/server/telegramCommandSurface.js.map +1 -0
  133. package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
  134. package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
  135. package/build/server/app/server/transportWorkGoldenPath.js +307 -0
  136. package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
  137. package/build/server/config.d.ts +21 -0
  138. package/build/server/config.d.ts.map +1 -1
  139. package/build/server/config.js +12 -0
  140. package/build/server/config.js.map +1 -1
  141. package/build/server/design/components/providerModelFieldsSupport.d.ts +5 -24
  142. package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
  143. package/build/server/design/components/providerModelFieldsSupport.js +65 -70
  144. package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
  145. package/build/server/design/components/useProviderCatalogState.d.ts +2 -2
  146. package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
  147. package/build/server/design/components/useProviderCatalogState.js +71 -151
  148. package/build/server/design/components/useProviderCatalogState.js.map +1 -1
  149. package/build/server/design/components/useProviderModelFieldActions.js +2 -2
  150. package/build/server/design/components/useProviderModelFieldActions.js.map +1 -1
  151. package/build/server/design/components/useProviderRegistryState.d.ts +1 -7
  152. package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
  153. package/build/server/design/components/useProviderRegistryState.js +41 -104
  154. package/build/server/design/components/useProviderRegistryState.js.map +1 -1
  155. package/build/server/design/components/useProviderTargetReconciliation.d.ts +1 -0
  156. package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
  157. package/build/server/design/components/useProviderTargetReconciliation.js +3 -2
  158. package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
  159. package/build/server/index.js +4 -0
  160. package/build/server/index.js.map +1 -1
  161. package/build/server/platform/apps/packageInstaller.d.ts +19 -0
  162. package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
  163. package/build/server/platform/apps/packageInstaller.js +92 -0
  164. package/build/server/platform/apps/packageInstaller.js.map +1 -0
  165. package/build/server/platform/apps/registry.d.ts +6 -0
  166. package/build/server/platform/apps/registry.d.ts.map +1 -1
  167. package/build/server/platform/apps/registry.js +24 -0
  168. package/build/server/platform/apps/registry.js.map +1 -1
  169. package/build/server/platform/apps/renderer.d.ts +6 -0
  170. package/build/server/platform/apps/renderer.d.ts.map +1 -0
  171. package/build/server/platform/apps/renderer.js +18 -0
  172. package/build/server/platform/apps/renderer.js.map +1 -0
  173. package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts +2 -1
  174. package/build/server/platform/orchestration/entitySubscriptions/channel.d.ts.map +1 -1
  175. package/build/server/platform/orchestration/entitySubscriptions/channel.js +3 -18
  176. package/build/server/platform/orchestration/entitySubscriptions/channel.js.map +1 -1
  177. package/build/server/platform/orchestration/entitySubscriptions/index.d.ts +1 -0
  178. package/build/server/platform/orchestration/entitySubscriptions/index.d.ts.map +1 -1
  179. package/build/server/platform/orchestration/entitySubscriptions/index.js.map +1 -1
  180. package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
  181. package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
  182. package/build/server/platform/runtime/deliveryClient.js +289 -0
  183. package/build/server/platform/runtime/deliveryClient.js.map +1 -0
  184. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
  185. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
  186. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
  187. package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
  188. package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
  189. package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
  190. package/build/server/platform/supervision/runtimeBoundary.js +2 -2
  191. package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
  192. package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
  193. package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
  194. package/build/server/platform/transports/telegram/bridge.js +176 -0
  195. package/build/server/platform/transports/telegram/bridge.js.map +1 -1
  196. package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
  197. package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
  198. package/build/server/platform/transports/telegram/commandPort.js +17 -0
  199. package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
  200. package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
  201. package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
  202. package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
  203. package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
  204. package/build/server/platform/transports/telegram/commands/index.js +38 -0
  205. package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
  206. package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
  207. package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
  208. package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
  209. package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
  210. package/build/server/platform/transports/telegram/polling.d.ts +34 -0
  211. package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
  212. package/build/server/platform/transports/telegram/polling.js +86 -9
  213. package/build/server/platform/transports/telegram/polling.js.map +1 -1
  214. package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
  215. package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
  216. package/build/server/platform/transports/telegram/relay/index.js +5 -1
  217. package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
  218. package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
  219. package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
  220. package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
  221. package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
  222. package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
  223. package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
  224. package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
  225. package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
  226. package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
  227. package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
  228. package/build/server/platform/transports/work-delivery/contracts.js +26 -0
  229. package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
  230. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
  231. package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
  232. package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
  233. package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
  234. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
  235. package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
  236. package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
  237. package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
  238. package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
  239. package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
  240. package/build/server/platform/transports/work-delivery/outbox.js +270 -0
  241. package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
  242. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
  243. package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
  244. package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
  245. package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
  246. package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
  247. package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
  248. package/build/server/platform/transports/work-delivery/port.js +15 -0
  249. package/build/server/platform/transports/work-delivery/port.js.map +1 -0
  250. package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
  251. package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
  252. package/build/server/platform/transports/work-delivery/proposal.js +59 -0
  253. package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
  254. package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
  255. package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
  256. package/build/server/platform/transports/work-delivery/readiness.js +123 -0
  257. package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
  258. package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
  259. package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
  260. package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
  261. package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
  262. package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
  263. package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
  264. package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
  265. package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
  266. package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
  267. package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
  268. package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
  269. package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
  270. package/build/server/products/chat/api/contracts.d.ts +10 -0
  271. package/build/server/products/chat/api/contracts.d.ts.map +1 -1
  272. package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
  273. package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
  274. package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
  275. package/build/server/products/chat/api/routeSupport.d.ts +17 -1
  276. package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
  277. package/build/server/products/chat/api/routeSupport.js +27 -4
  278. package/build/server/products/chat/api/routeSupport.js.map +1 -1
  279. package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
  280. package/build/server/products/chat/api/setupRoutes.js +23 -8
  281. package/build/server/products/chat/api/setupRoutes.js.map +1 -1
  282. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
  283. package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
  284. package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
  285. package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
  286. package/build/server/products/chat/state/model/index.d.ts +1 -1
  287. package/build/server/products/chat/state/model/index.d.ts.map +1 -1
  288. package/build/server/products/chat/state/model/index.js +1 -1
  289. package/build/server/products/chat/state/model/index.js.map +1 -1
  290. package/build/server/products/chat/state/model/readModels.d.ts +1 -0
  291. package/build/server/products/chat/state/model/readModels.d.ts.map +1 -1
  292. package/build/server/products/chat/state/model/readModels.js +2 -1
  293. package/build/server/products/chat/state/model/readModels.js.map +1 -1
  294. package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
  295. package/build/server/products/code/api/relayRoutes.js +36 -7
  296. package/build/server/products/code/api/relayRoutes.js.map +1 -1
  297. package/build/server/products/code/state/relayState.d.ts +2 -1
  298. package/build/server/products/code/state/relayState.d.ts.map +1 -1
  299. package/build/server/products/code/state/relayState.js +7 -7
  300. package/build/server/products/code/state/relayState.js.map +1 -1
  301. package/build/server/products/shared/api/workspaceContracts.d.ts +5 -0
  302. package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
  303. package/build/server/products/shared/renderer/api/appShell.d.ts +1 -0
  304. package/build/server/products/shared/renderer/api/appShell.d.ts.map +1 -1
  305. package/build/server/products/shared/renderer/api/appShell.js +9 -0
  306. package/build/server/products/shared/renderer/api/appShell.js.map +1 -1
  307. package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
  308. package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
  309. package/build/server/products/work/api/goldenPathProjection.js +252 -0
  310. package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
  311. package/build/server/products/work/api/index.d.ts +54 -1
  312. package/build/server/products/work/api/index.d.ts.map +1 -1
  313. package/build/server/products/work/api/index.js +182 -4
  314. package/build/server/products/work/api/index.js.map +1 -1
  315. package/build/server/products/work/api/projection.d.ts +7 -1
  316. package/build/server/products/work/api/projection.d.ts.map +1 -1
  317. package/build/server/products/work/api/projection.js +7 -1
  318. package/build/server/products/work/api/projection.js.map +1 -1
  319. package/build/server/products/work/shared/apiPaths.d.ts +8 -0
  320. package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
  321. package/build/server/products/work/shared/apiPaths.js +8 -0
  322. package/build/server/products/work/shared/apiPaths.js.map +1 -1
  323. package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
  324. package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
  325. package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
  326. package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
  327. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
  328. package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
  329. package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
  330. package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
  331. package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
  332. package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
  333. package/build/server/products/work/state/workCompletionEvidence.js +59 -0
  334. package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
  335. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
  336. package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
  337. package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
  338. package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
  339. package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
  340. package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
  341. package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
  342. package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
  343. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
  344. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
  345. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
  346. package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
  347. package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
  348. package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
  349. package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
  350. package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
  351. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
  352. package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
  353. package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
  354. package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
  355. package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
  356. package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
  357. package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
  358. package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
  359. package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
  360. package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
  361. package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
  362. package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
  363. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
  364. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
  365. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
  366. package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
  367. package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
  368. package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
  369. package/build/server/products/work/state/workGoldenPathService.js +1057 -0
  370. package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
  371. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
  372. package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
  373. package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
  374. package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
  375. package/build/server/runtime/client.d.ts +13 -0
  376. package/build/server/runtime/client.d.ts.map +1 -1
  377. package/build/server/runtime/client.js +44 -1
  378. package/build/server/runtime/client.js.map +1 -1
  379. package/build/server/runtime/setup.d.ts +14 -4
  380. package/build/server/runtime/setup.d.ts.map +1 -1
  381. package/build/server/runtime/setup.js +17 -19
  382. package/build/server/runtime/setup.js.map +1 -1
  383. package/build/server/runtime/usageSnapshot.d.ts +3 -0
  384. package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
  385. package/build/server/runtime/usageSnapshot.js +69 -0
  386. package/build/server/runtime/usageSnapshot.js.map +1 -0
  387. package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
  388. package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
  389. package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
  390. package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
  391. package/build/server/server/routes/providers.d.ts.map +1 -1
  392. package/build/server/server/routes/providers.js +133 -131
  393. package/build/server/server/routes/providers.js.map +1 -1
  394. package/build/server/server/routes/telegram.d.ts +9 -0
  395. package/build/server/server/routes/telegram.d.ts.map +1 -1
  396. package/build/server/server/routes/telegram.js +79 -72
  397. package/build/server/server/routes/telegram.js.map +1 -1
  398. package/build/server/shared/catsAppManifest.d.ts +3 -1
  399. package/build/server/shared/catsAppManifest.d.ts.map +1 -1
  400. package/build/server/shared/catsAppManifest.js +2 -0
  401. package/build/server/shared/catsAppManifest.js.map +1 -1
  402. package/build/server/shared/desktopRecoveryBridge.d.ts +2 -1
  403. package/build/server/shared/desktopRecoveryBridge.d.ts.map +1 -1
  404. package/build/server/shared/desktopRecoveryBridge.js.map +1 -1
  405. package/build/server/shared/executionLabel.d.ts.map +1 -1
  406. package/build/server/shared/executionLabel.js +8 -1
  407. package/build/server/shared/executionLabel.js.map +1 -1
  408. package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
  409. package/build/server/shared/i18n/catalogs/en.js +198 -3
  410. package/build/server/shared/i18n/catalogs/en.js.map +1 -1
  411. package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
  412. package/build/server/shared/i18n/catalogs/zh-TW.js +197 -3
  413. package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
  414. package/build/server/shared/i18n/index.d.ts +192 -0
  415. package/build/server/shared/i18n/index.d.ts.map +1 -1
  416. package/build/server/shared/i18n/messageKeys.d.ts +192 -0
  417. package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
  418. package/build/server/shared/i18n/messageKeys.js +192 -0
  419. package/build/server/shared/i18n/messageKeys.js.map +1 -1
  420. package/build/server/shared/platformSetupOperation.d.ts +2 -0
  421. package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
  422. package/build/server/shared/platformSetupOperation.js +9 -0
  423. package/build/server/shared/platformSetupOperation.js.map +1 -0
  424. package/build/server/shared/providerCatalog.d.ts +5 -2
  425. package/build/server/shared/providerCatalog.d.ts.map +1 -1
  426. package/build/server/shared/providerCatalog.js +6 -0
  427. package/build/server/shared/providerCatalog.js.map +1 -1
  428. package/build/server/shared/providerCatalogData.d.ts +154 -77
  429. package/build/server/shared/providerCatalogData.d.ts.map +1 -1
  430. package/build/server/shared/providerCatalogData.js +73 -36
  431. package/build/server/shared/providerCatalogData.js.map +1 -1
  432. package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
  433. package/build/server/shared/providerCatalogInstances.js +3 -0
  434. package/build/server/shared/providerCatalogInstances.js.map +1 -1
  435. package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
  436. package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
  437. package/build/server/shared/providerModelLabelRegistry.js +49 -0
  438. package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
  439. package/build/server/shared/providerRegistryWarnings.d.ts +4 -0
  440. package/build/server/shared/providerRegistryWarnings.d.ts.map +1 -1
  441. package/build/server/shared/providerRegistryWarnings.js +7 -0
  442. package/build/server/shared/providerRegistryWarnings.js.map +1 -1
  443. package/build/server/shared/providerSelection.d.ts.map +1 -1
  444. package/build/server/shared/providerSelection.js +10 -13
  445. package/build/server/shared/providerSelection.js.map +1 -1
  446. package/build/server/shared/runtimeSetup.d.ts +17 -4
  447. package/build/server/shared/runtimeSetup.d.ts.map +1 -1
  448. package/build/server/shared/runtimeStatusPresentation.js +1 -1
  449. package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
  450. package/package.json +32 -3
  451. package/packages/app-sdk/browser.d.ts +51 -0
  452. package/packages/app-sdk/browser.js +48 -0
  453. package/packages/app-sdk/package.d.ts +14 -0
  454. package/packages/app-sdk/package.js +131 -0
  455. package/packages/app-sdk/package.json +7 -0
  456. package/packages/provider-setup/manager.d.ts +79 -0
  457. package/packages/provider-setup/manager.js +441 -0
  458. package/scripts/README.md +66 -26
  459. package/scripts/build-desktop-installer.mjs +139 -16
  460. package/scripts/build-test-ui.mjs +1 -1
  461. package/scripts/bundle-server.mjs +23 -10
  462. package/scripts/linux/build-desktop-package.sh +6 -6
  463. package/scripts/linux/install-antigravity.sh +0 -0
  464. package/scripts/linux/install-devin.sh +0 -0
  465. package/scripts/linux/install-github-cli.sh +5 -0
  466. package/scripts/linux/install-meta-cli.sh +8 -0
  467. package/scripts/linux/install-node.sh +9 -3
  468. package/scripts/linux/node-cli-common.sh +87 -48
  469. package/scripts/linux/provider-cli-common.sh +178 -130
  470. package/scripts/linux/provider-version-common.sh +247 -0
  471. package/scripts/linux/sync-agent-skills.sh +27 -5
  472. package/scripts/linux/test-linux-package-smoke.sh +6 -3
  473. package/scripts/linux/upgrade-cli-tools.sh +1 -1
  474. package/scripts/linux/verified-npm-update.sh +20 -0
  475. package/scripts/macos/build-desktop-package.sh +5 -5
  476. package/scripts/macos/install-antigravity.sh +0 -0
  477. package/scripts/macos/install-devin.sh +0 -0
  478. package/scripts/macos/install-github-cli.sh +5 -0
  479. package/scripts/macos/install-meta-cli.sh +8 -0
  480. package/scripts/macos/install-node.sh +9 -3
  481. package/scripts/macos/node-cli-common.sh +87 -48
  482. package/scripts/macos/provider-cli-common.sh +178 -130
  483. package/scripts/macos/provider-version-common.sh +247 -0
  484. package/scripts/macos/sync-agent-skills.sh +27 -5
  485. package/scripts/macos/test-macos-package-smoke.sh +6 -3
  486. package/scripts/macos/upgrade-cli-tools.sh +1 -1
  487. package/scripts/macos/verified-npm-update.sh +20 -0
  488. package/scripts/package-desktop.mjs +15 -2
  489. package/scripts/testing/check-usage-app.mts +266 -0
  490. package/scripts/testing/conversation-navigation-smoke-electron.cjs +134 -0
  491. package/scripts/testing/conversation-navigation-smoke-renderer.tsx +102 -0
  492. package/scripts/testing/conversation-navigation-smoke.mjs +67 -0
  493. package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
  494. package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
  495. package/scripts/validate-release-assets.mjs +4 -1
  496. package/scripts/verify-desktop-app-bundle.mjs +108 -0
  497. package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
  498. package/scripts/windows/Install-Antigravity.ps1 +26 -3
  499. package/scripts/windows/Install-ClaudeCode.ps1 +25 -7
  500. package/scripts/windows/Install-CursorAgent.ps1 +45 -30
  501. package/scripts/windows/Install-Devin.ps1 +16 -47
  502. package/scripts/windows/Install-GitHubCli.ps1 +4 -0
  503. package/scripts/windows/Install-Goose.ps1 +18 -1
  504. package/scripts/windows/Install-Grok.ps1 +14 -1
  505. package/scripts/windows/Install-Junie.ps1 +32 -11
  506. package/scripts/windows/Install-KiroCli.ps1 +37 -13
  507. package/scripts/windows/Install-MetaCli.ps1 +463 -0
  508. package/scripts/windows/Install-Node.ps1 +6 -1
  509. package/scripts/windows/Install-Ollama.ps1 +4 -1
  510. package/scripts/windows/Setup-NodeGlobalPrefix.ps1 +10 -0
  511. package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
  512. package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +4 -1
  513. package/scripts/windows/_HiddenProcess.ps1 +14 -3
  514. package/scripts/windows/_NativeInstallerSupport.ps1 +308 -0
  515. package/scripts/windows/_NpmCliInstaller.ps1 +35 -14
  516. package/scripts/windows/_PackagedUninstall.ps1 +9 -1
  517. package/scripts/windows/_VerifiedNpmUpdate.ps1 +25 -0
  518. package/build/desktop/updateNotifications.d.ts +0 -64
  519. package/build/desktop/updateNotifications.d.ts.map +0 -1
  520. package/build/desktop/updateNotifications.js +0 -143
  521. package/build/desktop/updateNotifications.js.map +0 -1
  522. package/build/renderer/assets/ActiveSessionPermissionChip-DImsuR9T.js +0 -1
  523. package/build/renderer/assets/App-BfOvMP2m.js +0 -1
  524. package/build/renderer/assets/App-DGwkRFZl.css +0 -1
  525. package/build/renderer/assets/App-DWd7I3Z2.js +0 -2
  526. package/build/renderer/assets/WorkspaceAppRoutes-CrbTA9En.js +0 -1
  527. package/build/renderer/assets/app-BTww3Hl4.js +0 -43
  528. package/build/renderer/assets/app-CPxWQwLA.css +0 -1
  529. package/build/renderer/assets/conversationSidebarRecentEntries-QuaOPxCb.js +0 -6
  530. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts +0 -48
  531. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.d.ts.map +0 -1
  532. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js +0 -535
  533. package/build/server/app/renderer/settings/runtimeLifecycleHelpers.js.map +0 -1
  534. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts +0 -13
  535. package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +0 -1
  536. package/build/server/design/components/useProviderRegistryAutoRecheck.js +0 -63
  537. package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +0 -1
  538. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts +0 -19
  539. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.d.ts.map +0 -1
  540. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js +0 -53
  541. package/build/server/products/shared/renderer/api/providerCatalogRefreshStore.js.map +0 -1
  542. package/build/server/products/shared/renderer/api/providers.d.ts +0 -17
  543. package/build/server/products/shared/renderer/api/providers.d.ts.map +0 -1
  544. package/build/server/products/shared/renderer/api/providers.js +0 -50
  545. package/build/server/products/shared/renderer/api/providers.js.map +0 -1
  546. package/scripts/linux/install-aider.sh +0 -8
  547. package/scripts/macos/install-aider.sh +0 -8
  548. package/scripts/windows/Install-Aider.ps1 +0 -368
@@ -1,12 +1,11 @@
1
- import { isKnownProvider, listProductProviders, } from '../../shared/providerCatalog.js';
1
+ import { isKnownProvider, providerInstanceTarget, listProductProviders, } from '../../shared/providerCatalog.js';
2
+ import { resolveSelectedProviderInstance } from '../../shared/providerSelection.js';
2
3
  import { createEmptyProviderSnapshot, loadProviderSnapshot, writeProviderSnapshot, } from './providerSnapshotStore.js';
3
4
  const PROVIDER_SNAPSHOT_DEBOUNCE_MS = 1_000;
4
5
  const PROVIDER_SNAPSHOT_FLUSH_INFLIGHT_TIMEOUT_MS = 2_000;
5
- const PROVIDER_CACHE_STALE_IF_ERROR_MS = 10 * 60_000;
6
6
  const PROVIDER_CACHE_ERROR_BACKOFF_MS = 30_000;
7
7
  const TRUTHFUL_SELECTOR_CACHE_TTL_MS = 30_000;
8
8
  const TRUTHFUL_SELECTOR_STALE_WINDOW_MS = 15_000;
9
- const TRUTHFUL_SELECTOR_CONFIG_ENRICHMENT_BUDGET_MS = 500;
10
9
  const PROVIDER_MODEL_CATALOG_CACHE_TTL_MS = 60_000;
11
10
  const PROVIDER_MODEL_CATALOG_STALE_WINDOW_MS = 5 * 60_000;
12
11
  export const PROVIDER_TARGETS_CACHE_REFRESH_WARNING_PREFIX = 'Using cached provider targets because runtime refresh failed:';
@@ -190,13 +189,11 @@ function seedTruthfulProviderRegistryFromSnapshot(runtimeClient, snapshot) {
190
189
  if (cacheState.entries.has(cacheKey)) {
191
190
  return;
192
191
  }
193
- const now = Date.now();
194
192
  cacheState.entries.set(cacheKey, {
195
193
  lifecycle: 'error_backoff',
196
194
  value: snapshot.registry,
197
195
  freshUntilMs: 0,
198
196
  staleUntilMs: 0,
199
- staleIfErrorUntilMs: now + PROVIDER_CACHE_STALE_IF_ERROR_MS,
200
197
  cacheRefreshWarning: {
201
198
  kind: 'provider-targets',
202
199
  message: 'Using last saved provider targets while cats-runtime reconnects.',
@@ -208,7 +205,6 @@ function seedProviderCatalogsFromSnapshot(runtimeClient, snapshot) {
208
205
  return;
209
206
  }
210
207
  const cacheState = getProviderCatalogCacheState(runtimeClient);
211
- const now = Date.now();
212
208
  for (const entry of snapshot.catalogs) {
213
209
  const cacheKey = buildProviderCatalogCacheKey({
214
210
  provider: entry.provider,
@@ -220,7 +216,6 @@ function seedProviderCatalogsFromSnapshot(runtimeClient, snapshot) {
220
216
  value: entry.models,
221
217
  freshUntilMs: 0,
222
218
  staleUntilMs: 0,
223
- staleIfErrorUntilMs: now + PROVIDER_CACHE_STALE_IF_ERROR_MS,
224
219
  cacheRefreshWarning: {
225
220
  kind: 'model-catalog',
226
221
  message: 'Using last saved model catalog while cats-runtime reconnects.',
@@ -233,7 +228,6 @@ function seedProviderCatalogsFromSnapshot(runtimeClient, snapshot) {
233
228
  value: entry.advanced,
234
229
  freshUntilMs: 0,
235
230
  staleUntilMs: 0,
236
- staleIfErrorUntilMs: now + PROVIDER_CACHE_STALE_IF_ERROR_MS,
237
231
  cacheRefreshWarning: {
238
232
  kind: 'model-catalog',
239
233
  message: 'Using last saved model catalog while cats-runtime reconnects.',
@@ -266,10 +260,7 @@ export async function warmProviderSelectorCache(runtimeClient) {
266
260
  }
267
261
  const catalogCacheState = getProviderCatalogCacheState(runtimeClient);
268
262
  await Promise.allSettled(registry.providers.map(async (provider) => {
269
- const defaultInstanceId = provider.defaultInstance
270
- ?? provider.instances.find((candidate) => candidate.default)?.id
271
- ?? provider.instances[0]?.id
272
- ?? null;
263
+ const defaultInstanceId = resolveSelectedProviderInstance(provider, '') || null;
273
264
  if (!defaultInstanceId) {
274
265
  return;
275
266
  }
@@ -311,7 +302,7 @@ function listSelectableDiagnosticsForProvider(payload, providerId) {
311
302
  .filter((entry) => isSelectableAvailabilityStatus(entry.availability.status));
312
303
  }
313
304
  function findInstanceDiagnostic(entries, instanceId, backend) {
314
- return entries.find((entry) => entry.instance === instanceId)
305
+ return entries.find((entry) => entry.instance === instanceId && entry.backend === backend)
315
306
  ?? entries.find((entry) => entry.instance === null
316
307
  && backend !== null
317
308
  && entry.backend === backend)
@@ -332,7 +323,7 @@ function mergeTruthfulProviderRegistryFromRuntimeConfig(provider, runtimeConfig,
332
323
  label: instance.target ?? instance.id,
333
324
  target: instance.target,
334
325
  backend: instance.backend,
335
- default: runtimeProvider.defaultInstance === instance.id,
326
+ default: runtimeProvider.defaultInstance === instance.id && runtimeProvider.defaultBackend === instance.backend,
336
327
  eventCapabilities: instance.eventCapabilities,
337
328
  }));
338
329
  if (instances.length === 0) {
@@ -352,65 +343,6 @@ function mergeTruthfulProviderRegistryFromRuntimeConfig(provider, runtimeConfig,
352
343
  instances,
353
344
  };
354
345
  }
355
- function resolveDiagnosticsInstanceId(entry) {
356
- return entry.instance?.trim()
357
- || entry.backend?.trim()
358
- || 'default';
359
- }
360
- function resolveDiagnosticsInstanceTarget(entry) {
361
- const instanceId = entry.instance?.trim() || '';
362
- const backend = entry.backend?.trim() || '';
363
- if (instanceId) {
364
- if (instanceId.includes('/')) {
365
- return instanceId;
366
- }
367
- return backend ? `${backend}/${instanceId}` : instanceId;
368
- }
369
- return backend ? `${backend}/default` : null;
370
- }
371
- function resolveDiagnosticsInstanceLabel(entry) {
372
- return resolveDiagnosticsInstanceTarget(entry)
373
- ?? entry.backend?.trim()
374
- ?? 'default';
375
- }
376
- function buildDiagnosticsOnlyProviderDescriptor(provider, diagnosticsEntries) {
377
- const instancesById = new Map();
378
- for (const entry of diagnosticsEntries) {
379
- const instanceId = resolveDiagnosticsInstanceId(entry);
380
- const staticInstance = provider.instances.find((candidate) => candidate.id === instanceId
381
- || (candidate.target !== null
382
- && candidate.target === resolveDiagnosticsInstanceTarget(entry)));
383
- const target = staticInstance?.target ?? resolveDiagnosticsInstanceTarget(entry);
384
- instancesById.set(instanceId, {
385
- id: instanceId,
386
- label: staticInstance?.label ?? resolveDiagnosticsInstanceLabel(entry),
387
- target,
388
- backend: staticInstance?.backend ?? entry.backend,
389
- default: entry.defaultTarget,
390
- eventCapabilities: staticInstance?.eventCapabilities ?? null,
391
- });
392
- }
393
- const instances = [...instancesById.values()];
394
- if (instances.length === 0) {
395
- return null;
396
- }
397
- const defaultInstance = instances.find((instance) => instance.default)?.id
398
- ?? instances.find((instance) => instance.id === provider.defaultInstance)?.id
399
- ?? instances[0]?.id
400
- ?? null;
401
- const defaultBackend = instances.find((instance) => instance.id === defaultInstance)?.backend
402
- ?? instances[0]?.backend
403
- ?? provider.defaultBackend;
404
- return {
405
- ...provider,
406
- defaultInstance,
407
- defaultBackend,
408
- instances: instances.map((instance) => ({
409
- ...instance,
410
- default: instance.id === defaultInstance,
411
- })),
412
- };
413
- }
414
346
  function mergeTruthfulProviderRegistry(productProviders, runtimeConfig, diagnostics) {
415
347
  return productProviders.flatMap((provider) => {
416
348
  const diagnosticsEntries = listSelectableDiagnosticsForProvider(diagnostics, provider.id);
@@ -423,8 +355,7 @@ function mergeTruthfulProviderRegistry(productProviders, runtimeConfig, diagnost
423
355
  if (merged) {
424
356
  return [merged];
425
357
  }
426
- const diagnosticsOnly = buildDiagnosticsOnlyProviderDescriptor(provider, diagnosticsEntries);
427
- return diagnosticsOnly ? [diagnosticsOnly] : [];
358
+ return [];
428
359
  });
429
360
  }
430
361
  function getTruthfulProviderRegistryCacheState(runtimeClient) {
@@ -440,12 +371,9 @@ function getTruthfulProviderRegistryCacheState(runtimeClient) {
440
371
  }
441
372
  const TRUTHFUL_PROVIDER_REGISTRY_CACHE_KEY = '*';
442
373
  function shouldCacheTruthfulProviderRegistry(value) {
443
- // Only 'ready' is authoritative enough for the full TTL+stale window.
444
- // 'no_usable_targets' might be transient (e.g. runtime config reload mid-
445
- // probe) we don't want it to displace a recently-good baseline for 30s.
446
- // 'runtime_unreachable' is the explicit failure state. Both fall through
447
- // to the stale-fallback / short-backoff path below.
448
- return value.state === 'ready';
374
+ // A successful empty read is authoritative too. Only transport failure
375
+ // retains the previous observation; elapsed time does not authorize it.
376
+ return value.state !== 'runtime_unreachable';
449
377
  }
450
378
  function appendProviderCacheWarning(warnings, warning) {
451
379
  const existing = Array.isArray(warnings) ? warnings : [];
@@ -475,7 +403,6 @@ function writeProviderCacheErrorBackoff(cached, cacheRefreshWarning, appendWarni
475
403
  lifecycle: 'error_backoff',
476
404
  freshUntilMs: now + PROVIDER_CACHE_ERROR_BACKOFF_MS,
477
405
  staleUntilMs: Math.max(cached.staleUntilMs, now + PROVIDER_CACHE_ERROR_BACKOFF_MS),
478
- staleIfErrorUntilMs: cached.staleIfErrorUntilMs,
479
406
  cacheRefreshWarning,
480
407
  });
481
408
  return appendWarning(cached.value, cacheRefreshWarning.message);
@@ -512,6 +439,7 @@ function deriveTruthfulProviderRegistryForProvider(source, providerId) {
512
439
  const provider = source.providers.find((entry) => entry.id === providerId);
513
440
  if (!provider) {
514
441
  return {
442
+ revision: source.revision,
515
443
  state: 'no_usable_targets',
516
444
  providers: [],
517
445
  recovery: {
@@ -523,12 +451,10 @@ function deriveTruthfulProviderRegistryForProvider(source, providerId) {
523
451
  return {
524
452
  state: 'ready',
525
453
  providers: [provider],
454
+ revision: source.revision,
526
455
  ...(source.warnings ? { warnings: [...source.warnings] } : {}),
527
456
  };
528
457
  }
529
- async function readProviderConfig(dependencies) {
530
- return dependencies.runtimeClient.getProviderConfig({ selector: true });
531
- }
532
458
  async function readProviderDiagnostics(dependencies, options = {}) {
533
459
  return dependencies.runtimeClient.getProviderDiagnostics({
534
460
  ...(options.provider?.trim() ? { provider: options.provider.trim() } : {}),
@@ -536,25 +462,15 @@ async function readProviderDiagnostics(dependencies, options = {}) {
536
462
  });
537
463
  }
538
464
  async function readProviderConfigBestEffort(dependencies) {
539
- const task = readProviderConfig(dependencies)
540
- .then((value) => ({
541
- status: 'fulfilled',
542
- value,
543
- }))
544
- .catch(() => ({
545
- status: 'rejected',
546
- }));
547
- const timeoutToken = Symbol('selector-config-timeout');
548
- const winner = await Promise.race([
549
- task,
550
- new Promise((resolve) => {
551
- setTimeout(() => resolve(timeoutToken), TRUTHFUL_SELECTOR_CONFIG_ENRICHMENT_BUDGET_MS);
552
- }),
553
- ]);
554
- if (winner === timeoutToken) {
465
+ try {
466
+ // Topology is required to establish the first usable selector snapshot.
467
+ // Let the Runtime client's request deadline bound this read; a shorter
468
+ // enrichment race discards healthy slow responses on every cold retry.
469
+ return await dependencies.runtimeClient.getProviderConfig({ selector: true });
470
+ }
471
+ catch {
555
472
  return null;
556
473
  }
557
- return winner.status === 'fulfilled' ? winner.value : null;
558
474
  }
559
475
  async function loadTruthfulProviderRegistryFromRuntime(dependencies, options = {}) {
560
476
  const requestedProvider = options.provider?.trim() || null;
@@ -589,7 +505,11 @@ async function loadTruthfulProviderRegistryFromRuntime(dependencies, options = {
589
505
  };
590
506
  }
591
507
  const runtimeConfig = await configTask;
592
- const providers = mergeTruthfulProviderRegistry(configuredProductProviders, runtimeConfig ?? null, diagnostics);
508
+ if (!runtimeConfig) {
509
+ return { state: 'runtime_unreachable', providers: [], recovery: { retryable: true },
510
+ warnings: ['Runtime provider configuration is unavailable.'] };
511
+ }
512
+ const providers = mergeTruthfulProviderRegistry(configuredProductProviders, runtimeConfig, diagnostics);
593
513
  if (providers.length === 0) {
594
514
  return {
595
515
  state: 'no_usable_targets',
@@ -604,7 +524,52 @@ async function loadTruthfulProviderRegistryFromRuntime(dependencies, options = {
604
524
  providers,
605
525
  };
606
526
  }
527
+ function syncProviderSelectionCache(client, selection) {
528
+ const state = getTruthfulProviderRegistryCacheState(client);
529
+ if (state.revision !== selection.revision) {
530
+ state.entries.clear();
531
+ state.inflight.clear();
532
+ providerCatalogCache.delete(client);
533
+ state.revision = selection.revision;
534
+ }
535
+ return state;
536
+ }
537
+ function projectSelectedProviders(value, selection) {
538
+ const selected = new Set(selection.targets.map((target) => JSON.stringify([target.provider, target.backend, target.instance])));
539
+ const providers = value.providers.flatMap((provider) => {
540
+ const instances = provider.instances.filter((instance) => selected.has(JSON.stringify([provider.id, instance.backend, instance.id])));
541
+ if (!instances.length)
542
+ return [];
543
+ const defaultTarget = instances.find((instance) => instance.default) ?? instances[0];
544
+ return [{ ...provider, instances: instances.map((instance) => ({ ...instance, default: instance === defaultTarget })),
545
+ defaultInstance: defaultTarget.id, defaultBackend: defaultTarget.backend }];
546
+ });
547
+ return { ...value, revision: selection.revision, providers,
548
+ state: providers.length ? 'ready' : value.state === 'runtime_unreachable' ? value.state : 'no_usable_targets',
549
+ ...(providers.length ? {} : { recovery: { openRuntimeSetupPath: '/runtime/setup' } }) };
550
+ }
551
+ async function currentSelection(dependencies) {
552
+ const { selection } = await dependencies.runtimeClient.getSetupState();
553
+ if (!selection || !Array.isArray(selection.targets))
554
+ throw new Error('Runtime provider selection is unavailable.');
555
+ syncProviderSelectionCache(dependencies.runtimeClient, selection);
556
+ return selection;
557
+ }
558
+ function unavailableSelection() {
559
+ return { state: 'runtime_unreachable', providers: [], recovery: { retryable: true },
560
+ warnings: ['Cannot verify the connected Runtime provider selection.'] };
561
+ }
607
562
  async function refreshTruthfulProviderRegistry(dependencies, cacheState, options = {}) {
563
+ let selection;
564
+ try {
565
+ selection = await currentSelection(dependencies);
566
+ }
567
+ catch {
568
+ return unavailableSelection();
569
+ }
570
+ if (selection.state !== 'selected') {
571
+ return projectSelectedProviders({ state: 'no_usable_targets', providers: [] }, selection);
572
+ }
608
573
  const cacheKey = TRUTHFUL_PROVIDER_REGISTRY_CACHE_KEY;
609
574
  if (!options.force) {
610
575
  const inflight = cacheState.inflight.get(cacheKey);
@@ -614,7 +579,18 @@ async function refreshTruthfulProviderRegistry(dependencies, cacheState, options
614
579
  }
615
580
  let refreshPromise;
616
581
  refreshPromise = loadTruthfulProviderRegistryFromRuntime(dependencies)
617
- .then((value) => {
582
+ .then(async (loaded) => {
583
+ let latest;
584
+ try {
585
+ latest = await currentSelection(dependencies);
586
+ }
587
+ catch {
588
+ return unavailableSelection();
589
+ }
590
+ if (latest.revision !== selection.revision) {
591
+ return projectSelectedProviders({ state: 'no_usable_targets', providers: [] }, latest);
592
+ }
593
+ const value = projectSelectedProviders(loaded, latest);
618
594
  // Stale-probe guard: if a parallel forced refresh has replaced us as
619
595
  // the current inflight probe (or already finished and cleaned up), our
620
596
  // value is stale by definition. Don't write it to the cache — that
@@ -634,13 +610,12 @@ async function refreshTruthfulProviderRegistry(dependencies, cacheState, options
634
610
  value,
635
611
  freshUntilMs: now + TRUTHFUL_SELECTOR_CACHE_TTL_MS,
636
612
  staleUntilMs: now + TRUTHFUL_SELECTOR_CACHE_TTL_MS + TRUTHFUL_SELECTOR_STALE_WINDOW_MS,
637
- staleIfErrorUntilMs: now + PROVIDER_CACHE_STALE_IF_ERROR_MS,
638
613
  });
639
614
  notifyProviderCacheUpdated(dependencies.runtimeClient);
640
615
  return value;
641
616
  }
642
617
  const cached = cacheState.entries.get(cacheKey);
643
- if (cached && cached.staleIfErrorUntilMs > now) {
618
+ if (cached) {
644
619
  return writeTruthfulProviderRegistryErrorBackoff(cacheState, cacheKey, cached, value);
645
620
  }
646
621
  // With no prior ready baseline, do not turn a cold runtime failure into
@@ -660,14 +635,24 @@ async function refreshTruthfulProviderRegistry(dependencies, cacheState, options
660
635
  return refreshPromise;
661
636
  }
662
637
  async function readTruthfulProviderRegistry(dependencies, options = {}) {
638
+ let selection;
639
+ try {
640
+ selection = await currentSelection(dependencies);
641
+ }
642
+ catch {
643
+ return unavailableSelection();
644
+ }
645
+ if (selection.state !== 'selected') {
646
+ return projectSelectedProviders({ state: 'no_usable_targets', providers: [] }, selection);
647
+ }
663
648
  const cacheState = getTruthfulProviderRegistryCacheState(dependencies.runtimeClient);
664
649
  const cacheKey = TRUTHFUL_PROVIDER_REGISTRY_CACHE_KEY;
665
650
  const now = Date.now();
666
651
  const cached = cacheState.entries.get(cacheKey);
667
652
  const requestedProvider = options.provider?.trim() || null;
668
653
  const project = (value) => requestedProvider
669
- ? deriveTruthfulProviderRegistryForProvider(value, requestedProvider)
670
- : value;
654
+ ? deriveTruthfulProviderRegistryForProvider(projectSelectedProviders(value, selection), requestedProvider)
655
+ : projectSelectedProviders(value, selection);
671
656
  if (cached && cached.freshUntilMs > now) {
672
657
  return project(readProviderCacheValue(cached, appendTruthfulProviderRegistryWarning));
673
658
  }
@@ -675,7 +660,9 @@ async function readTruthfulProviderRegistry(dependencies, options = {}) {
675
660
  void refreshTruthfulProviderRegistry(dependencies, cacheState).catch(() => { });
676
661
  return project(readProviderCacheValue(cached, appendTruthfulProviderRegistryWarning));
677
662
  }
678
- if (cached && cached.staleIfErrorUntilMs > now) {
663
+ // Expiry triggers refresh, not loss of the last successful result. The
664
+ // selection check above invalidates all entries when intent changes.
665
+ if (cached) {
679
666
  void refreshTruthfulProviderRegistry(dependencies, cacheState).catch(() => { });
680
667
  return project(appendTruthfulProviderRegistryWarning(readProviderCacheValue(cached, appendTruthfulProviderRegistryWarning), PROVIDER_TARGETS_CACHE_REVALIDATION_WARNING));
681
668
  }
@@ -687,7 +674,12 @@ async function readTruthfulProviderRegistry(dependencies, options = {}) {
687
674
  // slots ahead of the scoped request and recreate the 8s timeout risk.
688
675
  const scopedRegistry = await loadTruthfulProviderRegistryFromRuntime(dependencies, { provider: requestedProvider });
689
676
  void refreshTruthfulProviderRegistry(dependencies, cacheState).catch(() => { });
690
- return scopedRegistry;
677
+ const latest = await currentSelection(dependencies).catch(() => null);
678
+ if (!latest)
679
+ return unavailableSelection();
680
+ return latest.revision === selection.revision
681
+ ? project(scopedRegistry)
682
+ : projectSelectedProviders({ state: 'no_usable_targets', providers: [] }, latest);
691
683
  }
692
684
  return project(await refreshTruthfulProviderRegistry(dependencies, cacheState));
693
685
  }
@@ -732,7 +724,6 @@ function writeProviderCatalogCacheEntry(cacheState, cacheKey, value) {
732
724
  staleUntilMs: now
733
725
  + PROVIDER_MODEL_CATALOG_CACHE_TTL_MS
734
726
  + PROVIDER_MODEL_CATALOG_STALE_WINDOW_MS,
735
- staleIfErrorUntilMs: now + PROVIDER_CACHE_STALE_IF_ERROR_MS,
736
727
  });
737
728
  }
738
729
  function writeProviderCatalogErrorBackoff(cacheState, cacheKey, cached, error) {
@@ -741,13 +732,6 @@ function writeProviderCatalogErrorBackoff(cacheState, cacheKey, cached, error) {
741
732
  message: `${MODEL_CATALOG_CACHE_REFRESH_WARNING_PREFIX} ${readRuntimeFailureMessage(error, 'Runtime catalog unavailable.')}`,
742
733
  }, appendProviderCatalogWarning, (entry) => cacheState.entries.set(cacheKey, entry));
743
734
  }
744
- function pruneExpiredProviderCatalogCacheEntries(cacheState, now) {
745
- for (const [cacheKey, cached] of cacheState.entries) {
746
- if (cached.staleIfErrorUntilMs <= now && !cacheState.inflight.has(cacheKey)) {
747
- cacheState.entries.delete(cacheKey);
748
- }
749
- }
750
- }
751
735
  function refreshProviderCatalogCacheEntry(cacheState, cacheKey, load, runtimeClient) {
752
736
  const inflight = cacheState.inflight.get(cacheKey);
753
737
  if (inflight) {
@@ -764,8 +748,7 @@ function refreshProviderCatalogCacheEntry(cacheState, cacheKey, load, runtimeCli
764
748
  .catch((error) => {
765
749
  const cached = readProviderCatalogCacheEntry(cacheState, cacheKey);
766
750
  if (shouldServeStaleProviderCatalogForError(error)
767
- && cached
768
- && cached.staleIfErrorUntilMs > Date.now()) {
751
+ && cached) {
769
752
  return writeProviderCatalogErrorBackoff(cacheState, cacheKey, cached, error);
770
753
  }
771
754
  throw error;
@@ -779,7 +762,6 @@ function refreshProviderCatalogCacheEntry(cacheState, cacheKey, load, runtimeCli
779
762
  async function readProviderCatalogCached(input) {
780
763
  const cacheKey = buildProviderCatalogCacheKey(input);
781
764
  const now = Date.now();
782
- pruneExpiredProviderCatalogCacheEntries(input.cacheState, now);
783
765
  const cached = readProviderCatalogCacheEntry(input.cacheState, cacheKey);
784
766
  if (cached && cached.freshUntilMs > now) {
785
767
  return readProviderCacheValue(cached, appendProviderCatalogWarning);
@@ -788,7 +770,7 @@ async function readProviderCatalogCached(input) {
788
770
  void refreshProviderCatalogCacheEntry(input.cacheState, cacheKey, input.load, input.runtimeClient).catch(() => { });
789
771
  return readProviderCacheValue(cached, appendProviderCatalogWarning);
790
772
  }
791
- if (cached && cached.staleIfErrorUntilMs > now) {
773
+ if (cached) {
792
774
  void refreshProviderCatalogCacheEntry(input.cacheState, cacheKey, input.load, input.runtimeClient).catch(() => { });
793
775
  return appendProviderCatalogWarning(readProviderCacheValue(cached, appendProviderCatalogWarning), MODEL_CATALOG_CACHE_REVALIDATION_WARNING);
794
776
  }
@@ -834,8 +816,8 @@ export async function handleProviderModels(response, dependencies, provider, ins
834
816
  sendRestError(response, 409, 'provider_target_unavailable', `No usable ${provider} target is currently available in cats-runtime.`, { provider, instance: instance ?? null });
835
817
  return;
836
818
  }
837
- const normalizedInstance = instance?.trim() || null;
838
- if (normalizedInstance && !providerDescriptor.instances.some((entry) => entry.id === normalizedInstance)) {
819
+ const normalizedInstance = resolveRequestedInstance(providerDescriptor, instance);
820
+ if (!normalizedInstance) {
839
821
  sendRestError(response, 409, 'provider_target_unavailable', `${provider} instance "${normalizedInstance}" is not currently usable in cats-runtime.`, { provider, instance: normalizedInstance });
840
822
  return;
841
823
  }
@@ -848,7 +830,12 @@ export async function handleProviderModels(response, dependencies, provider, ins
848
830
  load: () => dependencies.runtimeClient.getProviderModels(provider, normalizedInstance),
849
831
  runtimeClient: dependencies.runtimeClient,
850
832
  });
851
- sendJson(response, 200, { catalog });
833
+ const latest = await currentSelection(dependencies);
834
+ if (latest.revision !== registry.revision) {
835
+ sendRestError(response, 409, 'provider_selection_changed', 'Provider selection changed. Refresh the provider list.');
836
+ return;
837
+ }
838
+ sendJson(response, 200, { catalog: { ...catalog, instance: normalizedInstance } });
852
839
  }
853
840
  catch (error) {
854
841
  const runtimeError = error;
@@ -859,6 +846,13 @@ export async function handleProviderModels(response, dependencies, provider, ins
859
846
  sendRestError(response, 503, 'provider_catalog_unavailable', error instanceof Error ? error.message : 'Runtime catalog unavailable.', { provider, instance: normalizedInstance });
860
847
  }
861
848
  }
849
+ function resolveRequestedInstance(provider, instance) {
850
+ const requested = instance?.trim();
851
+ if (!requested)
852
+ return resolveSelectedProviderInstance(provider, '') || null;
853
+ const matches = provider.instances.filter((target) => providerInstanceTarget(target) === requested || target.id === requested);
854
+ return matches.length === 1 ? providerInstanceTarget(matches[0]) : null;
855
+ }
862
856
  export async function handleAdvancedProviderModels(response, dependencies, provider, instance) {
863
857
  if (!isKnownProvider(provider)) {
864
858
  sendRestError(response, 404, 'provider_not_found', `Provider not found: ${provider}`);
@@ -874,8 +868,8 @@ export async function handleAdvancedProviderModels(response, dependencies, provi
874
868
  sendRestError(response, 409, 'provider_target_unavailable', `No usable ${provider} target is currently available in cats-runtime.`, { provider, instance: instance ?? null });
875
869
  return;
876
870
  }
877
- const normalizedInstance = instance?.trim() || null;
878
- if (normalizedInstance && !providerDescriptor.instances.some((entry) => entry.id === normalizedInstance)) {
871
+ const normalizedInstance = resolveRequestedInstance(providerDescriptor, instance);
872
+ if (!normalizedInstance) {
879
873
  sendRestError(response, 409, 'provider_target_unavailable', `${provider} instance "${normalizedInstance}" is not currently usable in cats-runtime.`, { provider, instance: normalizedInstance });
880
874
  return;
881
875
  }
@@ -888,7 +882,12 @@ export async function handleAdvancedProviderModels(response, dependencies, provi
888
882
  load: () => dependencies.runtimeClient.getAdvancedProviderModels(provider, normalizedInstance),
889
883
  runtimeClient: dependencies.runtimeClient,
890
884
  });
891
- sendJson(response, 200, { catalog });
885
+ const latest = await currentSelection(dependencies);
886
+ if (latest.revision !== registry.revision) {
887
+ sendRestError(response, 409, 'provider_selection_changed', 'Provider selection changed. Refresh the provider list.');
888
+ return;
889
+ }
890
+ sendJson(response, 200, { catalog: { ...catalog, instance: normalizedInstance } });
892
891
  }
893
892
  catch (error) {
894
893
  const runtimeError = error;
@@ -913,10 +912,13 @@ async function refreshProviderCatalogsInternal(dependencies) {
913
912
  const task = (async () => {
914
913
  try {
915
914
  const [models, advanced] = await Promise.all([
916
- dependencies.runtimeClient.getProviderModels(provider.id, instance.id, { forceRefresh: true }),
917
- dependencies.runtimeClient.getAdvancedProviderModels(provider.id, instance.id, { forceRefresh: true }),
915
+ dependencies.runtimeClient.getProviderModels(provider.id, providerInstanceTarget(instance), { forceRefresh: true }),
916
+ dependencies.runtimeClient.getAdvancedProviderModels(provider.id, providerInstanceTarget(instance), { forceRefresh: true }),
918
917
  ]);
919
- const cacheKey = buildProviderCatalogCacheKey({ provider: provider.id, instance: instance.id });
918
+ const latest = await currentSelection(dependencies);
919
+ if (latest.revision !== registry.revision)
920
+ throw new Error('Provider selection changed during catalog refresh.');
921
+ const cacheKey = buildProviderCatalogCacheKey({ provider: provider.id, instance: providerInstanceTarget(instance) });
920
922
  writeProviderCatalogCacheEntry(cacheState.models, cacheKey, models);
921
923
  writeProviderCatalogCacheEntry(cacheState.advanced, cacheKey, advanced);
922
924
  notifyProviderCacheUpdated(dependencies.runtimeClient);