@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
@@ -0,0 +1,308 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Shared native installer version gates, isolated child execution and observed results.
4
+ .DESCRIPTION
5
+ Dot-source from the packaged native helpers. Metadata parsing is adapted from
6
+ environment-bootstrap at 752dc13; no query occurs during check-only actions.
7
+ Vendor scripts execute in a hidden child so an upstream exit cannot end our JSON response.
8
+ .EXAMPLE
9
+ . "$PSScriptRoot\_NativeInstallerSupport.ps1"
10
+ Test-CatsNativeUpgrade -Provider grok -InstalledVersion '1.0.0'
11
+ #>
12
+ . (Join-Path $PSScriptRoot '_HiddenProcess.ps1')
13
+
14
+ function Get-CatsNativeLatestVersion {
15
+ param([string]$Provider)
16
+ try {
17
+ switch ($Provider) {
18
+ antigravity { return Get-AntigravityLatestVersion }
19
+ cursor { return Get-CursorAgentLatestVersion -InstallerText (Invoke-RestMethod 'https://cursor.com/install?win32=true' -TimeoutSec 20 -UseBasicParsing) }
20
+ junie { return Get-JunieLatestBuild }
21
+ devin { return Get-DevinLatestVersion }
22
+ grok { return Get-GrokLatestVersion }
23
+ kiro { return [string](Invoke-RestMethod 'https://prod.download.cli.kiro.dev/stable/latest/manifest.json' -TimeoutSec 20 -UseBasicParsing).version }
24
+ goose { return [string](Invoke-RestMethod 'https://api.github.com/repos/aaif-goose/goose/releases/latest' -TimeoutSec 20 -UseBasicParsing -Headers @{ 'User-Agent' = 'Cats-Desktop'; Accept = 'application/vnd.github+json' }).tag_name }
25
+ default { return $null }
26
+ }
27
+ } catch { return $null }
28
+ }
29
+
30
+ function Get-CatsNativeVersionToken {
31
+ param([string]$Provider, [string]$Version)
32
+ if ($Provider -eq 'junie') {
33
+ $match = [regex]::Match($Version, '\((\d+(?:\.\d+)+)\)')
34
+ if ($match.Success) { return $match.Groups[1].Value }
35
+ return ''
36
+ }
37
+ return [regex]::Match($Version, '\d+(?:\.\d+)+(?:-[a-zA-Z0-9.]+)?').Value
38
+ }
39
+
40
+ function Test-CatsNativeUpgrade {
41
+ param([string]$Provider, [string]$InstalledVersion, [AllowNull()][string]$LatestVersion = $null)
42
+ if (-not $PSBoundParameters.ContainsKey('LatestVersion')) { $LatestVersion = Get-CatsNativeLatestVersion $Provider }
43
+ $current = Get-CatsNativeVersionToken $Provider $InstalledVersion
44
+ $comparison = Compare-ToolVersion -Installed $current -Latest $LatestVersion
45
+ $known = $null -ne $comparison
46
+ $currentRelease = $known -and ($comparison -ge 0)
47
+ if ($Provider -eq 'cursor' -and $comparison -eq 0 -and $current -ne $LatestVersion) { $currentRelease = $false }
48
+ return [pscustomobject]@{ shouldInstall = -not $currentRelease; latestVersion = $LatestVersion; known = $known }
49
+ }
50
+
51
+ function Invoke-CatsRemoteInstaller {
52
+ param([Parameter(Mandatory)][string]$ScriptText, [switch]$RetrySharingViolation)
53
+ $temporary = Join-Path ([System.IO.Path]::GetTempPath()) ('cats-native-' + [guid]::NewGuid().ToString('N') + '.ps1')
54
+ try {
55
+ if ([string]::IsNullOrWhiteSpace($ScriptText)) { throw 'Vendor returned an empty installer.' }
56
+ $ast = [System.Management.Automation.Language.Parser]::ParseInput($ScriptText, [ref]$null, [ref]$null)
57
+ $offsets = @(0)
58
+ if ($ast.ParamBlock) { $offsets += $ast.ParamBlock.Extent.EndOffset }
59
+ foreach ($usingStatement in $ast.UsingStatements) { $offsets += $usingStatement.Extent.EndOffset }
60
+ $offset = ($offsets | Measure-Object -Maximum).Maximum
61
+ $prologue = '$env:PSModulePath = (@([System.Environment]::GetEnvironmentVariable(''PSModulePath'',''User''), [System.Environment]::GetEnvironmentVariable(''PSModulePath'',''Machine''), (Join-Path $PSHOME ''Modules'')) | Where-Object { $_ }) -join '';'''
62
+ $body = $ScriptText.Insert($offset, "`n$prologue`n")
63
+ if ($RetrySharingViolation) {
64
+ $encoded = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($body))
65
+ $body = @'
66
+ $ErrorActionPreference = 'Stop'
67
+ $installer = [scriptblock]::Create([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('__SOURCE__')))
68
+ for ($attempt = 1; $attempt -le 3; $attempt++) {
69
+ try { & $installer; exit 0 }
70
+ catch {
71
+ $exception = $_.Exception
72
+ while ($exception.InnerException) { $exception = $exception.InnerException }
73
+ if ($attempt -eq 3 -or -not ($exception -is [IO.IOException]) -or ($exception.HResult -band 0xffff) -ne 32) { throw }
74
+ Start-Sleep -Seconds 5
75
+ }
76
+ }
77
+ '@
78
+ $body = $body.Replace('__SOURCE__', $encoded)
79
+ }
80
+ [IO.File]::WriteAllText($temporary, $body, [Text.UTF8Encoding]::new($true))
81
+ $hostExe = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
82
+ $result = Invoke-HiddenCommand -FileName $hostExe -ArgumentList @('-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', $temporary)
83
+ return [pscustomobject]@{ skipped = $false; success = $result.ExitCode -eq 0; exitCode = $result.ExitCode; stderr = $result.ErrorOutput; stdout = $result.Output }
84
+ } catch {
85
+ return [pscustomobject]@{ skipped = $false; success = $false; exitCode = -1; stderr = [string]$_.Exception.Message }
86
+ } finally {
87
+ # This is one uniquely-created file; never recursively remove a computed directory.
88
+ Remove-Item -LiteralPath $temporary -Force -ErrorAction SilentlyContinue
89
+ }
90
+ }
91
+
92
+ function Add-CatsNativeObservation {
93
+ param([pscustomobject]$Result, [AllowNull()]$Before, [bool]$Attempted, [bool]$Skipped)
94
+ if ($Result.mode -in @('check', 'uninstall') -or $null -eq $Before) { return }
95
+ $change = if ($Result.status -eq 'failed') { 'failed' }
96
+ elseif ($Skipped -or $Result.status -eq 'preview' -or -not $Attempted) { 'unchanged' }
97
+ elseif (-not $Result.installed) { 'failed' }
98
+ elseif (-not $Before.installed) { 'installed' }
99
+ elseif ($Before.detectedVersion -and $Result.detectedVersion -and $Before.detectedVersion -ne $Result.detectedVersion) {
100
+ $comparison = Compare-ToolVersion -Installed $Result.detectedVersion -Latest $Before.detectedVersion
101
+ if ($comparison -gt 0) { 'upgraded' } elseif ($comparison -lt 0) { 'downgraded' } else { 'version_changed' }
102
+ }
103
+ else { 'unchanged' }
104
+ if ($Result.mode -in @('upgrade', 'force') -and -not $Skipped -and $Result.status -ne 'preview' -and $change -ne 'failed' -and $Result.installed -and $Result.detectedVersion) {
105
+ $provider = $Result.helper -replace '^windows-', '' -replace '-native-installer$', ''
106
+ if ($provider -in @('cursor', 'devin', 'junie')) {
107
+ try { Remove-CatsStaleNativeVersions -Provider $provider -Version $Result.detectedVersion } catch { Write-Warning 'Old-version cleanup was skipped.' }
108
+ }
109
+ }
110
+ $Result | Add-Member -NotePropertyName observedChange -NotePropertyValue $change -Force
111
+ $Result | Add-Member -NotePropertyName previousVersion -NotePropertyValue $Before.detectedVersion -Force
112
+ $description = "$change"
113
+ if ($change -in @('upgraded', 'downgraded', 'version_changed')) { $description += ": $($Before.detectedVersion) -> $($Result.detectedVersion)" }
114
+ elseif ($Result.detectedVersion) { $description += ": $($Result.detectedVersion)" }
115
+ $Result | Add-Member -NotePropertyName summary -NotePropertyValue $description -Force
116
+ if ($change -in @('failed', 'unchanged')) { $Result.appliedChanges = @() }
117
+ else { $Result.appliedChanges = @("${change}_native_installation") }
118
+ }
119
+
120
+ function Write-CatsNativePreview {
121
+ param([string]$Helper, [string]$Mode, $Detected, [string[]]$Actions, [bool]$EmitJson)
122
+ $result = [pscustomobject]@{
123
+ helper = $Helper; mode = $Mode; status = 'preview'; installed = [bool]$Detected.installed
124
+ detectedVersion = $Detected.detectedVersion; commandPath = $Detected.commandPath
125
+ restartRequired = $false; plannedActions = @($Actions); appliedChanges = @()
126
+ warnings = @(); manualSteps = @(); interruptions = @(); observedChange = 'unchanged'
127
+ }
128
+ if ($EmitJson) { $result | ConvertTo-Json -Depth 10 } else { Write-Host "Preview: $($Actions -join ', ')" }
129
+ exit 0
130
+ }
131
+
132
+ function Get-CatsShimVersionText {
133
+ param([string]$Path)
134
+ if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) { return '' }
135
+ $literal = "'" + $Path.Replace("'", "''") + "'"
136
+ $script = "& $literal --version; exit " + '$LASTEXITCODE'
137
+ $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($script))
138
+ $hostExe = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
139
+ $result = Invoke-HiddenCommand -FileName $hostExe -ArgumentList @('-NoProfile', '-NonInteractive', '-EncodedCommand', $encoded) -TimeoutMs 15000
140
+ if ($result.ExitCode -ne 0) { return '' }
141
+ return $result.Output.Trim()
142
+ }
143
+
144
+ function Remove-CatsStaleNativeVersions {
145
+ param([string]$Provider, [string]$Version)
146
+ $keep = Get-CatsNativeVersionToken $Provider $Version
147
+ if (-not $keep) { return }
148
+ $data = switch ($Provider) {
149
+ cursor { Join-Path $env:LOCALAPPDATA 'cursor-agent' }
150
+ devin { Join-Path $env:LOCALAPPDATA 'devin\cli' }
151
+ junie {
152
+ if ($env:JUNIE_DATA_DIR) { $env:JUNIE_DATA_DIR } else { Join-Path $env:USERPROFILE '.local\share\junie' }
153
+ }
154
+ default { return }
155
+ }
156
+ $versions = [IO.Path]::GetFullPath((Join-Path $data $(if ($Provider -eq 'devin') { '_versions' } else { 'versions' })))
157
+ if ($Provider -eq 'junie') {
158
+ if (Test-Path -LiteralPath (Join-Path $data 'updates\pending-update.json')) { return }
159
+ $currentFile = Join-Path $data 'current'
160
+ if (-not (Test-Path -LiteralPath $currentFile -PathType Leaf)) { return }
161
+ if ((Get-Content -LiteralPath $currentFile -Raw).Trim() -ne $keep) { return }
162
+ }
163
+ # Only known user roots; do not follow a junction in any ancestor or delete
164
+ # current/newer/pending builds. A custom directory outside those roots is kept.
165
+ if (-not (Test-PackagedProviderPathRemovable $versions)) { return }
166
+ $ancestor = Get-Item -LiteralPath $versions
167
+ while ($ancestor) {
168
+ if ($ancestor.Attributes -band [IO.FileAttributes]::ReparsePoint) { return }
169
+ $ancestor = $ancestor.Parent
170
+ }
171
+ foreach ($directory in (Get-ChildItem -LiteralPath $versions -Directory)) {
172
+ if ($directory.Attributes -band [IO.FileAttributes]::ReparsePoint) { continue }
173
+ if ($directory.Name -notmatch '^\d+(\.\d+)+(-[a-zA-Z0-9]+)?$') { continue }
174
+ if ((Compare-ToolVersion -Installed $directory.Name -Latest $keep) -ne -1) { continue }
175
+ $resolved = [IO.Path]::GetFullPath($directory.FullName)
176
+ if (-not $resolved.StartsWith($versions.TrimEnd('\') + '\', [StringComparison]::OrdinalIgnoreCase)) { continue }
177
+ if (Get-ChildItem -LiteralPath $resolved -Recurse -Force | Where-Object { $_.Attributes -band [IO.FileAttributes]::ReparsePoint } | Select-Object -First 1) { continue }
178
+ try { Remove-Item -LiteralPath $resolved -Recurse -Force -ErrorAction Stop } catch { Write-Warning "Could not remove old $Provider version $($directory.Name)." }
179
+ }
180
+ }
181
+ function ConvertTo-ComparableVersion {
182
+ param([string]$Version)
183
+
184
+ if ([string]::IsNullOrWhiteSpace($Version)) { return $null }
185
+
186
+ # 第一個版本樣式的 token;額外吃下 Git for Windows 的 .windows.N 尾段
187
+ $match = [regex]::Match($Version, '\d+(?:\.\d+)+(?:\.windows\.\d+)?')
188
+ if (-not $match.Success) { return $null }
189
+
190
+ $parts = ($match.Value -replace '\.windows\.', '.') -split '\.' |
191
+ Select-Object -First 4
192
+
193
+ while ($parts.Count -lt 4) { $parts += '0' }
194
+
195
+ try {
196
+ return [version]($parts -join '.')
197
+ } catch {
198
+ return $null
199
+ }
200
+ }
201
+
202
+ function Compare-ToolVersion {
203
+ param(
204
+ [string]$Installed,
205
+ [string]$Latest
206
+ )
207
+
208
+ $installedVersion = ConvertTo-ComparableVersion $Installed
209
+ $latestVersion = ConvertTo-ComparableVersion $Latest
210
+
211
+ if (-not $installedVersion -or -not $latestVersion) { return $null }
212
+
213
+ return $installedVersion.CompareTo($latestVersion)
214
+ }
215
+
216
+ function Get-AntigravityLatestVersion {
217
+ param([string]$InstallerText)
218
+
219
+ $baseUrl = 'https://antigravity-cli-auto-updater-974169037036.us-central1.run.app'
220
+ if ($InstallerText) {
221
+ $m = [regex]::Match($InstallerText, '\$DOWNLOAD_BASE_URL\s*=\s*"(https://[^"]+)"')
222
+ if ($m.Success) { $baseUrl = $m.Groups[1].Value }
223
+ }
224
+
225
+ $arch = if ($env:PROCESSOR_ARCHITEW6432) { $env:PROCESSOR_ARCHITEW6432 } else { $env:PROCESSOR_ARCHITECTURE }
226
+ $platform = if ($arch -eq 'ARM64') { 'windows_arm64' } else { 'windows_amd64' }
227
+
228
+ try {
229
+ $manifest = Invoke-RestMethod -Uri "$baseUrl/manifests/$platform.json" -TimeoutSec 20 -UseBasicParsing -ErrorAction Stop
230
+ if (-not $manifest.version) { return $null }
231
+ return "$($manifest.version)"
232
+ } catch {
233
+ return $null
234
+ }
235
+ }
236
+
237
+ function Get-CursorAgentLatestVersion {
238
+ param(
239
+ [Parameter(Mandatory=$true)]
240
+ [string]$InstallerText
241
+ )
242
+
243
+ $m = [regex]::Match($InstallerText, "(?m)^\s*\`$version\s*=\s*'([^']+)'")
244
+ if (-not $m.Success) { return $null }
245
+ return $m.Groups[1].Value
246
+ }
247
+
248
+ function Get-JunieLatestBuild {
249
+ $archName = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64' -or $env:PROCESSOR_ARCHITEW6432 -eq 'ARM64') { 'aarch64' } else { 'amd64' }
250
+ $platform = "windows-$archName"
251
+
252
+ try {
253
+ $jsonl = Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/jetbrains-junie/junie/main/update-info.jsonl' `
254
+ -TimeoutSec 20 -UseBasicParsing -ErrorAction Stop
255
+ } catch {
256
+ return $null
257
+ }
258
+
259
+ $best = $null
260
+ foreach ($line in ("$jsonl" -split "`n")) {
261
+ if ($line -notmatch "`"platform`":`"$platform`"") { continue }
262
+ try { $entry = $line | ConvertFrom-Json } catch { continue }
263
+ if (-not $entry.version) { continue }
264
+ $candidate = ConvertTo-ComparableVersion "$($entry.version)"
265
+ if (-not $candidate) { continue }
266
+ if ($null -eq $best -or $candidate -gt $best.Comparable) {
267
+ $best = @{ Build = "$($entry.version)"; Comparable = $candidate }
268
+ }
269
+ }
270
+
271
+ if ($null -eq $best) { return $null }
272
+ return $best.Build
273
+ }
274
+
275
+ function Get-DevinLatestVersion {
276
+ try {
277
+ $manifest = Invoke-RestMethod -Uri 'https://static.devin.ai/cli/current/manifest.json' -TimeoutSec 20 -UseBasicParsing -ErrorAction Stop
278
+ if (-not $manifest.version) { return $null }
279
+ return "$($manifest.version)"
280
+ } catch {
281
+ return $null
282
+ }
283
+ }
284
+
285
+ function Get-GrokLatestVersion {
286
+ param([string]$Channel)
287
+
288
+ if (-not $Channel) {
289
+ $Channel = if ($env:GROK_CHANNEL) { $env:GROK_CHANNEL } else { 'stable' }
290
+ }
291
+
292
+ $urls = @(
293
+ "https://x.ai/cli/$Channel",
294
+ "https://storage.googleapis.com/grok-build-public-artifacts/cli/$Channel"
295
+ )
296
+ foreach ($url in $urls) {
297
+ try {
298
+ $text = Invoke-RestMethod -Uri $url -TimeoutSec 20 -UseBasicParsing -ErrorAction Stop
299
+ } catch {
300
+ continue
301
+ }
302
+ $line = @("$text" -split "`r?`n")[0]
303
+ if ($null -eq $line) { continue }
304
+ $line = $line.Trim()
305
+ if ($line -match '^\d+\.\d+\.\d+(-[A-Za-z0-9._]+)?$') { return $line }
306
+ }
307
+ return $null
308
+ }
@@ -23,6 +23,8 @@
23
23
  can run it explicitly when needed.
24
24
  #>
25
25
 
26
+ . (Join-Path $PSScriptRoot '_VerifiedNpmUpdate.ps1')
27
+
26
28
  function Test-NpmCliInstallerAdminGuard {
27
29
  param(
28
30
  [Parameter(Mandatory = $true)]
@@ -163,11 +165,16 @@ function Test-NpmCliPackageOutdated {
163
165
  [string]$PackageName
164
166
  )
165
167
 
166
- $outdatedRaw = (& npm outdated -g --json $PackageName 2>$null) | Out-String
167
- if ([string]::IsNullOrWhiteSpace($outdatedRaw)) {
168
- return $false
169
- }
170
- return $outdatedRaw.Contains("`"$PackageName`"")
168
+ $latest = ((& npm view "$PackageName@latest" version --fetch-retries=0 --fetch-timeout=10000 --loglevel=error) | Out-String).Trim()
169
+ if ($LASTEXITCODE -ne 0 -or $latest -notmatch '^\d+\.\d+\.\d+(-[a-zA-Z0-9._-]+)?$') { throw 'Provider version query failed; update status is unknown.' }
170
+ $installed = Get-NpmCliPackageVersion -PackageName $PackageName
171
+ if (-not $installed) { return $true }
172
+ $currentBase = [version]($installed -split '-')[0]
173
+ $latestBase = [version]($latest -split '-')[0]
174
+ # Preserve a newer local/pre-release build. Equal numeric prerelease advances
175
+ # to the stable release; Repair remains the explicit reinstall action.
176
+ return $currentBase -lt $latestBase -or ($currentBase -eq $latestBase -and $installed.Contains('-') -and -not $latest.Contains('-'))
177
+
171
178
  }
172
179
 
173
180
  function Resolve-NpmCliCommandPath {
@@ -216,6 +223,7 @@ function Remove-SupersededNpmPackages {
216
223
 
217
224
  Write-Host "Removing superseded package $legacy (replaced by $PackageName)."
218
225
  & npm uninstall -g $legacy 2>$null | Out-Null
226
+ if ($LASTEXITCODE -ne 0) { throw "Could not remove superseded package $legacy." }
219
227
  if ($AppliedChanges) {
220
228
  $AppliedChanges.Add("${legacy}:removed-superseded") | Out-Null
221
229
  }
@@ -315,6 +323,12 @@ function Invoke-PackagedNpmCliInstall {
315
323
  $null
316
324
  }
317
325
  $commandPath = if ($installed) { Resolve-NpmCliCommandPath -CommandName $CommandName } else { $null }
326
+ if ($installed -and -not $detectedVersion -and -not $SkipNpmInvocation) {
327
+ foreach ($legacy in (Get-SupersededNpmPackages -PackageName $PackageName)) {
328
+ & npm list -g --depth=0 $legacy 2>$null | Out-Null
329
+ if ($LASTEXITCODE -eq 0) { $installed = $false; break }
330
+ }
331
+ }
318
332
 
319
333
  $plannedActions = [System.Collections.Generic.List[string]]::new()
320
334
  $appliedChanges = [System.Collections.Generic.List[string]]::new()
@@ -444,6 +458,17 @@ function Invoke-PackagedNpmCliInstall {
444
458
  exit 0
445
459
  }
446
460
 
461
+ if ($DryRun -and -not $CheckOnly) {
462
+ $preview = [pscustomobject]@{
463
+ helper = $HelperId; mode = $mode; status = 'preview'; installed = [bool]$installed
464
+ detectedVersion = $detectedVersion; commandPath = $commandPath; restartRequired = $false
465
+ plannedActions = @("${PackageName}:${mode}"); appliedChanges = @(); warnings = @(); manualSteps = @(); interruptions = @()
466
+ }
467
+ if ($Json) { $preview | ConvertTo-Json -Depth 10 } else { Write-Host "Preview: ${PackageName}:${mode}" }
468
+ exit 0
469
+ }
470
+ if ($Upgrade -and -not $CheckOnly -and -not $SkipNpmInvocation) { Update-CatsNpm }
471
+
447
472
  $isOutdated = if (-not $Upgrade -and -not $Force) {
448
473
  $false
449
474
  } else {
@@ -565,15 +590,9 @@ function Invoke-PackagedNpmCliInstall {
565
590
  # Without it, packages like @openai/codex skip their platform-specific
566
591
  # binaries (codex-win32-x64, codex-darwin-arm64, ...), leaving a shim that
567
592
  # silently exits when invoked. Pure-JS CLIs such as copilot don't notice.
568
- $arguments = @('install', '-g', '--include=optional')
569
- if ($plannedAction -eq 'upgrade') {
570
- $arguments += "$PackageName@latest"
571
- } else {
572
- $arguments += $PackageName
573
- }
574
- if ($plannedAction -eq 'reinstall') {
575
- $arguments += '--force'
576
- }
593
+ $expectedVersion = ((& npm view "$PackageName@latest" version --fetch-retries=0 --fetch-timeout=10000 --loglevel=error) | Out-String).Trim()
594
+ if ($LASTEXITCODE -ne 0 -or $expectedVersion -notmatch '^\d+\.\d+\.\d+(-[a-zA-Z0-9._-]+)?$') { throw 'Could not resolve the provider version before installing.' }
595
+ $arguments = @('install', '-g', '--include=optional', '--engine-strict', '--fetch-retries=0', '--fetch-timeout=30000', "$PackageName@$expectedVersion")
577
596
 
578
597
  & npm @arguments | Out-Null
579
598
  if ($LASTEXITCODE -ne 0) {
@@ -585,6 +604,8 @@ function Invoke-PackagedNpmCliInstall {
585
604
  $finalCommandPath = if ($finalInstalled) { Resolve-NpmCliCommandPath -CommandName $CommandName } else { $null }
586
605
  $finalVersion = if ($finalInstalled) { Get-NpmCliPackageVersion -PackageName $PackageName } else { $null }
587
606
 
607
+ if (-not $finalInstalled -or -not $finalCommandPath -or $finalVersion -ne $expectedVersion) { throw 'Provider installation verification failed. Check npm prefix and command PATH.' }
608
+
588
609
  $result = [pscustomobject]@{
589
610
  helper = $HelperId
590
611
  mode = $mode
@@ -24,7 +24,15 @@ if (-not (Get-Module -ListAvailable -Name Microsoft.PowerShell.Utility)) {
24
24
  function Test-PackagedProviderPathRemovable {
25
25
  param([string]$Path)
26
26
  if ([string]::IsNullOrWhiteSpace($Path)) { return $false }
27
- return (Test-Path -LiteralPath $Path)
27
+ $fullPath = [IO.Path]::GetFullPath($Path).TrimEnd('\', '/')
28
+ $withinUserRoot = $false
29
+ foreach ($base in @($env:USERPROFILE, $env:LOCALAPPDATA)) {
30
+ if (-not $base) { continue }
31
+ $root = [IO.Path]::GetFullPath($base).TrimEnd('\', '/') + '\'
32
+ if ($fullPath.StartsWith($root, [StringComparison]::OrdinalIgnoreCase)) { $withinUserRoot = $true }
33
+ }
34
+ if (-not $withinUserRoot) { return $false }
35
+ return (Test-Path -LiteralPath $fullPath)
28
36
  }
29
37
 
30
38
  function Test-DetectedPathInPlannedRemovals {
@@ -0,0 +1,25 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Update npm in its current prefix with bounded queries and post-install verification.
4
+ .DESCRIPTION
5
+ Dot-source and invoke Update-CatsNpm only for an explicit upgrade action.
6
+ Adapted from environment-bootstrap 4690075. Never changes prefix or bypasses engines.
7
+ .EXAMPLE
8
+ Update-CatsNpm
9
+ #>
10
+ function Update-CatsNpm {
11
+ $current = ((& npm --version) | Out-String).Trim()
12
+ if ($LASTEXITCODE -ne 0) { throw 'Could not read npm version.' }
13
+ $latest = ((& npm view npm@latest version --fetch-retries=0 --fetch-timeout=10000 --loglevel=error) | Out-String).Trim()
14
+ if ($LASTEXITCODE -ne 0 -or $latest -notmatch '^\d+\.\d+\.\d+$') { throw 'npm version query failed or returned an invalid version.' }
15
+ if ($current -eq $latest) { return }
16
+ if ([version]$current -gt [version]$latest) { return }
17
+ & npm install -g "npm@$latest" --engine-strict --fetch-retries=0 --fetch-timeout=30000 | Out-Null
18
+ if ($LASTEXITCODE -ne 0) { throw 'npm update failed. Check network, permissions and Node.js compatibility.' }
19
+ $installed = ((& npm --version) | Out-String).Trim()
20
+ if ($LASTEXITCODE -ne 0 -or $installed -ne $latest) { throw 'npm command version verification failed. Check PATH and prefix.' }
21
+ $root = ((& npm root -g) | Out-String).Trim()
22
+ if ($LASTEXITCODE -ne 0 -or -not $root) { throw 'Could not verify the npm installation prefix.' }
23
+ $package = Get-Content -LiteralPath (Join-Path $root 'npm/package.json') -Raw -Encoding UTF8 | ConvertFrom-Json
24
+ if ($package.version -ne $latest) { throw 'npm package version does not match its active command.' }
25
+ }
@@ -1,64 +0,0 @@
1
- import type { DesktopUpdateErrorCode, DesktopUpdateSnapshot } from './contracts.js';
2
- import { type DesktopTrayLocale } from './trayMenu.js';
3
- /**
4
- * Native update notifications.
5
- *
6
- * SPEC-111 section 5 requires a check started outside Settings to report its
7
- * result somewhere the user is actually looking. This module owns that policy;
8
- * `main.ts` only constructs the native notification the policy asks for, so the
9
- * rules stay testable without Electron.
10
- */
11
- /** Where the check that produced the result came from. */
12
- export declare const DESKTOP_UPDATE_NOTIFICATION_ORIGINS: readonly ["tray", "settings", "startup"];
13
- export type DesktopUpdateNotificationOrigin = typeof DESKTOP_UPDATE_NOTIFICATION_ORIGINS[number];
14
- export declare const DESKTOP_UPDATE_SETTINGS_PATH = "/settings/desktop";
15
- export interface DesktopUpdateNotification {
16
- title: string;
17
- body: string;
18
- /** Where activating the notification shall land the user. */
19
- navigatePath: typeof DESKTOP_UPDATE_SETTINGS_PATH;
20
- }
21
- export interface DesktopUpdateAnnouncement {
22
- notification: DesktopUpdateNotification | null;
23
- /**
24
- * Where to open the main window when no notification reaches the user —
25
- * either because the platform has none or because showing it failed.
26
- *
27
- * Null when the result does not justify pulling a window forward. Set
28
- * independently of `notification` so the caller never has to re-derive the
29
- * policy after a failed `show()`.
30
- */
31
- fallbackNavigatePath: typeof DESKTOP_UPDATE_SETTINGS_PATH | null;
32
- }
33
- /**
34
- * Error copy for notifications, in the same two locales the tray uses.
35
- *
36
- * These strings are duplicated from the renderer i18n catalogs because the
37
- * main process has no translator. `settings-desktop-update-labels.test.tsx`
38
- * asserts they stay identical to the catalog entries, so the duplication cannot
39
- * drift silently.
40
- */
41
- export declare const DESKTOP_UPDATE_NOTIFICATION_ERROR_COPY: Record<DesktopTrayLocale, Record<DesktopUpdateErrorCode, string>>;
42
- export interface ResolveDesktopUpdateAnnouncementInput {
43
- origin: DesktopUpdateNotificationOrigin;
44
- snapshot: DesktopUpdateSnapshot;
45
- locale?: string | null;
46
- /** `Notification.isSupported()`, resolved by the caller. */
47
- notificationsSupported: boolean;
48
- }
49
- /**
50
- * Decides what a finished check should tell the user, and how.
51
- *
52
- * A result is announced only when the user cannot already see it:
53
- *
54
- * - `settings` never announces. The section shows the state directly and
55
- * routes manual results through the shared toast system, so a native
56
- * notification would report the same check twice.
57
- * - `tray` announces up-to-date, available, and failed. The menu closes on
58
- * click, so without this the command looks like it did nothing.
59
- * - `startup` announces only an available update. The user did not ask for
60
- * that check, so an up-to-date or offline result has nothing to say and
61
- * would nag on every launch.
62
- */
63
- export declare function resolveDesktopUpdateAnnouncement(input: ResolveDesktopUpdateAnnouncementInput): DesktopUpdateAnnouncement;
64
- //# sourceMappingURL=updateNotifications.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"updateNotifications.d.ts","sourceRoot":"","sources":["../../desktop/host/updateNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB;;;;;;;GAOG;AAEH,0DAA0D;AAC1D,eAAO,MAAM,mCAAmC,0CAA2C,CAAC;AAC5F,MAAM,MAAM,+BAA+B,GACzC,OAAO,mCAAmC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,EAAE,OAAO,4BAA4B,CAAC;CACnD;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC/C;;;;;;;OAOG;IACH,oBAAoB,EAAE,OAAO,4BAA4B,GAAG,IAAI,CAAC;CAClE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,EAAE,MAAM,CACzD,iBAAiB,EACjB,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CA0BvC,CAAC;AAmCF,MAAM,WAAW,qCAAqC;IACpD,MAAM,EAAE,+BAA+B,CAAC;IACxC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4DAA4D;IAC5D,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,qCAAqC,GAC3C,yBAAyB,CA2B3B"}
@@ -1,143 +0,0 @@
1
- // Locale normalization is shared with the tray rather than duplicated. The
2
- // main process has no i18n runtime, so both surfaces resolve their own copy
3
- // from the same two-locale rule.
4
- import { normalizeDesktopTrayLocale, } from './trayMenu.js';
5
- /**
6
- * Native update notifications.
7
- *
8
- * SPEC-111 section 5 requires a check started outside Settings to report its
9
- * result somewhere the user is actually looking. This module owns that policy;
10
- * `main.ts` only constructs the native notification the policy asks for, so the
11
- * rules stay testable without Electron.
12
- */
13
- /** Where the check that produced the result came from. */
14
- export const DESKTOP_UPDATE_NOTIFICATION_ORIGINS = ['tray', 'settings', 'startup'];
15
- export const DESKTOP_UPDATE_SETTINGS_PATH = '/settings/desktop';
16
- /**
17
- * Error copy for notifications, in the same two locales the tray uses.
18
- *
19
- * These strings are duplicated from the renderer i18n catalogs because the
20
- * main process has no translator. `settings-desktop-update-labels.test.tsx`
21
- * asserts they stay identical to the catalog entries, so the duplication cannot
22
- * drift silently.
23
- */
24
- export const DESKTOP_UPDATE_NOTIFICATION_ERROR_COPY = {
25
- en: {
26
- offline: 'Cats could not reach the update service.',
27
- timeout: 'The update service did not respond in time.',
28
- provider_rejected: 'The update service rejected the request.',
29
- metadata_invalid: 'The update information could not be read.',
30
- checksum_mismatch: 'The downloaded update failed its integrity check.',
31
- signature_rejected: 'The downloaded update failed its signature check.',
32
- unsupported_package: 'This installation cannot update itself.',
33
- download_cancelled: 'The update download was cancelled.',
34
- install_handoff_failed: 'Cats could not open the installer.',
35
- unknown: 'The update could not be completed.',
36
- },
37
- 'zh-TW': {
38
- offline: 'Cats 無法連線到更新服務。',
39
- timeout: '更新服務未在時限內回應。',
40
- provider_rejected: '更新服務拒絕了這次請求。',
41
- metadata_invalid: '無法讀取更新資訊。',
42
- checksum_mismatch: '下載的更新未通過完整性檢查。',
43
- signature_rejected: '下載的更新未通過簽章檢查。',
44
- unsupported_package: '這個安裝方式無法自我更新。',
45
- download_cancelled: '更新下載已取消。',
46
- install_handoff_failed: 'Cats 無法開啟安裝程式。',
47
- unknown: '更新無法完成。',
48
- },
49
- };
50
- const NOTIFICATION_COPY = {
51
- en: {
52
- upToDateTitle: 'Cats is up to date',
53
- upToDateBody: (version) => `Cats ${version} is the latest version.`,
54
- availableTitle: 'Update available',
55
- availableBody: (version) => `Cats ${version} is available to download.`,
56
- failedTitle: 'Update check failed',
57
- previewSuffix: ' (preview)',
58
- },
59
- 'zh-TW': {
60
- upToDateTitle: 'Cats 已是最新版本',
61
- upToDateBody: (version) => `Cats ${version} 已是最新版本。`,
62
- availableTitle: '有可用更新',
63
- availableBody: (version) => `Cats ${version} 已可下載。`,
64
- failedTitle: '更新檢查失敗',
65
- previewSuffix: '(預覽)',
66
- },
67
- };
68
- const NOTHING_TO_ANNOUNCE = {
69
- notification: null,
70
- fallbackNavigatePath: null,
71
- };
72
- /**
73
- * Decides what a finished check should tell the user, and how.
74
- *
75
- * A result is announced only when the user cannot already see it:
76
- *
77
- * - `settings` never announces. The section shows the state directly and
78
- * routes manual results through the shared toast system, so a native
79
- * notification would report the same check twice.
80
- * - `tray` announces up-to-date, available, and failed. The menu closes on
81
- * click, so without this the command looks like it did nothing.
82
- * - `startup` announces only an available update. The user did not ask for
83
- * that check, so an up-to-date or offline result has nothing to say and
84
- * would nag on every launch.
85
- */
86
- export function resolveDesktopUpdateAnnouncement(input) {
87
- const { origin, snapshot, notificationsSupported } = input;
88
- if (origin === 'settings') {
89
- return NOTHING_TO_ANNOUNCE;
90
- }
91
- // A build that cannot check cannot have produced a result worth reporting,
92
- // and must never imply that an update path exists.
93
- if (!snapshot.capability.canCheck) {
94
- return NOTHING_TO_ANNOUNCE;
95
- }
96
- const locale = normalizeDesktopTrayLocale(input.locale);
97
- const notification = resolveNotification(origin, snapshot, locale);
98
- if (notification === null) {
99
- return NOTHING_TO_ANNOUNCE;
100
- }
101
- // SPEC-111 section 5.5: a tray-originated result always becomes visible, so
102
- // it falls back to opening Settings. A startup check was never requested, so
103
- // pulling a window forward unasked would be worse than staying quiet.
104
- const fallbackNavigatePath = origin === 'tray' ? DESKTOP_UPDATE_SETTINGS_PATH : null;
105
- return {
106
- notification: notificationsSupported ? notification : null,
107
- fallbackNavigatePath,
108
- };
109
- }
110
- function resolveNotification(origin, snapshot, locale) {
111
- const copy = NOTIFICATION_COPY[locale];
112
- // A preview self-updates from an unsigned prerelease feed. A tester who
113
- // cannot tell that apart from a supported release cannot report usefully.
114
- const suffix = snapshot.capability.distribution === 'preview_packaged'
115
- ? copy.previewSuffix
116
- : '';
117
- const announce = (title, body) => ({
118
- title: `${title}${suffix}`,
119
- body,
120
- navigatePath: DESKTOP_UPDATE_SETTINGS_PATH,
121
- });
122
- switch (snapshot.status) {
123
- case 'up_to_date':
124
- return origin === 'tray'
125
- ? announce(copy.upToDateTitle, copy.upToDateBody(snapshot.currentVersion))
126
- : null;
127
- case 'update_available':
128
- // The manager rejects an available update without a version, so this
129
- // guard is only here to keep a version-less body unreachable.
130
- return snapshot.availableVersion === null
131
- ? null
132
- : announce(copy.availableTitle, copy.availableBody(snapshot.availableVersion));
133
- case 'failed':
134
- return origin === 'tray' && snapshot.error !== null
135
- ? announce(copy.failedTitle, DESKTOP_UPDATE_NOTIFICATION_ERROR_COPY[locale][snapshot.error.code])
136
- : null;
137
- default:
138
- // Every other status is either in flight or the result of an action the
139
- // user took in Settings, where the surface already reports it.
140
- return null;
141
- }
142
- }
143
- //# sourceMappingURL=updateNotifications.js.map