@openhands/agent-canvas 1.13.0 → 1.15.0

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 (1688) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/acp-providers-BKvmTf82.js +1 -0
  4. package/build/assets/active-backend-context-DKFSMbn3.js +2 -0
  5. package/build/assets/agent-context-settings-D3PjSTU1.js +1 -0
  6. package/build/assets/agent-profiles-settings-D4cY5U2T.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +86 -0
  8. package/build/assets/agent-settings-351vXWc9.js +2 -0
  9. package/build/assets/agent-settings-Ce7BDZ6I.js +1 -0
  10. package/build/assets/alert-banner-Kyy1YWZU.js +1 -0
  11. package/build/assets/api-error-message-BJyfWp6p.js +1 -0
  12. package/build/assets/api-key-entry-screen-INIxqAMs.js +1 -0
  13. package/build/assets/app-settings-CbHqzQus.js +1 -0
  14. package/build/assets/automation-detail-DXDhUwPq.js +3 -0
  15. package/build/assets/automation-export-BRopEHMu.js +2 -0
  16. package/build/assets/automation-git-sync-CzyS4cn1.js +1 -0
  17. package/build/assets/automation-setup-route-FRr05f_g.js +1 -0
  18. package/build/assets/automation-templates-C_0FZgLG.js +1 -0
  19. package/build/assets/automations-list-CERuQWE6.js +1 -0
  20. package/build/assets/back-nav-button-Dm9tIjVf.js +1 -0
  21. package/build/assets/backend-form-modal-DK78-jn1.js +1 -0
  22. package/build/assets/backend-synced-settings-badge-3fOwg6Bd.js +1 -0
  23. package/build/assets/badge-D4SqUCsR.js +1 -0
  24. package/build/assets/base-modal-C7_BDl_U.js +1 -0
  25. package/build/assets/bot-C-0Wu7vQ.js +1 -0
  26. package/build/assets/brand-button-Dxv6PDeN.js +1 -0
  27. package/build/assets/browser-11etCQ04.js +7 -0
  28. package/build/assets/browser-tab-BAl4ckJE.js +1 -0
  29. package/build/assets/chat-send-button-DWwR2cgI.js +1 -0
  30. package/build/assets/check-Cf2YoT90.js +1 -0
  31. package/build/assets/chevron-down-C3OQ-ehx.js +1 -0
  32. package/build/assets/chevron-right-CN1uUiJ1.js +1 -0
  33. package/build/assets/circle-check-g5yeGMd-.js +1 -0
  34. package/build/assets/circle-plus-check-toggle-CBh_qomE.js +1 -0
  35. package/build/assets/cloud-funnel-analytics-287iIERo.js +1 -0
  36. package/build/assets/cog-C4rrw-ZK.js +1 -0
  37. package/build/assets/command-menu-BZQ8S3Ke.js +1 -0
  38. package/build/assets/commits-tab-DZtJgaDM.js +1 -0
  39. package/build/assets/condenser-settings-BcNmYR4s.js +1 -0
  40. package/build/assets/confirmation-modal-Bk4JRcCM.js +1 -0
  41. package/build/assets/context-menu-list-item-lVYETtY5.js +1 -0
  42. package/build/assets/conversation-CchMzpGl.js +1 -0
  43. package/build/assets/conversation-Dpzftz57.js +93 -0
  44. package/build/assets/conversation-panel-CchMzpGl.js +1 -0
  45. package/build/assets/conversation-state-store-a9d2fxRc.js +1 -0
  46. package/build/assets/conversation-store-Ca3ghXap.js +6 -0
  47. package/build/assets/conversation-tab-empty-state-HJtkmHZj.js +1 -0
  48. package/build/assets/copy-to-clipboard-button-Cjkswvnj.js +1 -0
  49. package/build/assets/device-verify-EZhHhBT7.js +1 -0
  50. package/build/assets/dropdown-classes-DJe-E6MC.js +1 -0
  51. package/build/assets/edit-automation-modal-D-urtv8n.js +1 -0
  52. package/build/assets/empty-state-CvaVahVr.js +1 -0
  53. package/build/assets/entry.client-C7Bi2tkU.js +2 -0
  54. package/build/assets/enum-filter-dropdown-DliX_Lo0.js +1 -0
  55. package/build/assets/environment-switch-overlay-CEKrFiMw.js +1 -0
  56. package/build/assets/error-state-BALXiBNy.js +1 -0
  57. package/build/assets/extension-module-card-classes-DpeaYhYo.js +1 -0
  58. package/build/assets/extensions-hub-CFduxBnk.js +1 -0
  59. package/build/assets/extensions-navigation-BeC224yX.js +1 -0
  60. package/build/assets/external-link-DFpYunfj.js +1 -0
  61. package/build/assets/files-tab-CL3J9b3p.js +1 -0
  62. package/build/assets/form-control-classes-CGw40z5h.js +1 -0
  63. package/build/assets/format-model-name-BNPKVsIq.js +1 -0
  64. package/build/assets/get-git-path-DlAJa_i6.js +1 -0
  65. package/build/assets/git-repo-dropdown-DGMEhz7d.js +1 -0
  66. package/build/assets/git-repo-dropdown-ai8qaNkD.js +1 -0
  67. package/build/assets/highlighted-source-view-C3sxykQi.js +1 -0
  68. package/build/assets/home-BCGlNJCA.js +1 -0
  69. package/build/assets/home-DB1pRqTC.js +1 -0
  70. package/build/assets/home-automation-run-tooltip-CooFQRIG.js +1 -0
  71. package/build/assets/home-store-Dl1dPE58.js +1 -0
  72. package/build/assets/index-home-DB1pRqTC.js +1 -0
  73. package/build/assets/info-uYSVzX86.js +1 -0
  74. package/build/assets/install-server-modal-BbJdhzet.js +1 -0
  75. package/build/assets/kebab-menu-item-content-BYokkRHi.js +1 -0
  76. package/build/assets/key-Cn5za3rg.js +1 -0
  77. package/build/assets/launch-C1ieiOGe.js +1 -0
  78. package/build/assets/list-filter-OFkpRrmi.js +1 -0
  79. package/build/assets/list-todo-Cuu-STFc.js +1 -0
  80. package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +27 -0
  81. package/build/assets/llm-settings-CnDbbmVW.js +1 -0
  82. package/build/assets/llm-settings-S8Yjg__1.js +1 -0
  83. package/build/assets/llm-subscription-service-BpPfzW4x.js +1 -0
  84. package/build/assets/loader-circle-nvrwthvj.js +1 -0
  85. package/build/assets/loading-spinner-0L3ZTToZ.js +1 -0
  86. package/build/assets/manage-backends-modal-BCUPswyl.js +1 -0
  87. package/build/assets/manifest-58597dde.js +1 -0
  88. package/build/assets/manifest-subpage-layout-BGhiUQbA.js +1 -0
  89. package/build/assets/map-provider-B9LTm23I.js +1 -0
  90. package/build/assets/markdown-renderer-Cb2sBWtV.js +8 -0
  91. package/build/assets/mcp-CKbR4Vft.js +1 -0
  92. package/build/assets/mcp-marketplace-utils-C13fFccR.js +1 -0
  93. package/build/assets/mcp-page-Bm4K2NQq.js +9 -0
  94. package/build/assets/messages-BTN5thLe.js +40 -0
  95. package/build/assets/modal-body-CMOc2tLl.js +1 -0
  96. package/build/assets/modal-classes-BAb4Y_BG.js +1 -0
  97. package/build/assets/modal-close-button-CkJ0Ktjj.js +1 -0
  98. package/build/assets/mouse-pointer-click-CsgRs_-r.js +1 -0
  99. package/build/assets/onboarding-Cx_kaiD1.js +1 -0
  100. package/build/assets/onboarding-modal-vMwn7ihv.js +1 -0
  101. package/build/assets/organization-service.api-C8XpQ0pM.js +1 -0
  102. package/build/assets/parse-git-remote-url-DpDM9bK6.js +1 -0
  103. package/build/assets/pencil-Clh1Wjvh.js +1 -0
  104. package/build/assets/planner-tab-DQvDU3ap.js +1 -0
  105. package/build/assets/plug-BuQhHSSG.js +1 -0
  106. package/build/assets/plugins-management-service-BjYeF0b0.js +1 -0
  107. package/build/assets/plus-CEKne-Yp.js +1 -0
  108. package/build/assets/profiles-service.api-QB-T_u-g.js +1 -0
  109. package/build/assets/providers-FfSZ5TXP.js +1 -0
  110. package/build/assets/proxy-tcFL2yTQ.js +1 -0
  111. package/build/assets/puzzle-A9pGxxai.js +1 -0
  112. package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +1 -0
  113. package/build/assets/refresh-cw-Bh69DyYO.js +1 -0
  114. package/build/assets/root-BLeQfBEq.css +1 -0
  115. package/build/assets/root-ZKKYPR1Z.js +2 -0
  116. package/build/assets/root-layout-luJoE9IG.js +2 -0
  117. package/build/assets/schema-field-Csw5fhtN.js +1 -0
  118. package/build/assets/scroll-fade-state-Dw-i4SGq.js +1 -0
  119. package/build/assets/sdk-section-page-HTffvm7Q.js +1 -0
  120. package/build/assets/secret-form-HTUbYw5o.js +1 -0
  121. package/build/assets/secrets-service-BTor9uAU.js +1 -0
  122. package/build/assets/secrets-settings-BizaTEr1.js +1 -0
  123. package/build/assets/server-process-C9RKzd1x.js +1 -0
  124. package/build/assets/settings-BlmrkwRi.js +1 -0
  125. package/build/assets/settings-DcNPxz0v.js +1 -0
  126. package/build/assets/settings-dropdown-input-tM0A0ipy.js +1 -0
  127. package/build/assets/settings-index-CKq0b0Vg.js +1 -0
  128. package/build/assets/settings-input-C03KUoSC.js +1 -0
  129. package/build/assets/settings-list-classes-BJ0g8rWj.js +1 -0
  130. package/build/assets/settings-modal-AzEF1QPP.js +1 -0
  131. package/build/assets/settings-service.api-B2agVfjL.js +1 -0
  132. package/build/assets/settings-switch-CQE0EGC-.js +1 -0
  133. package/build/assets/settings-utils-ClYOkbbI.js +1 -0
  134. package/build/assets/shared-conversation-B55pCyBG.js +1 -0
  135. package/build/assets/shield-check-CFDViW82.js +1 -0
  136. package/build/assets/sidebar-layout-D3hE08wK.js +1 -0
  137. package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +1 -0
  138. package/build/assets/sidebar-nav-link-CPzhyHQg.js +1 -0
  139. package/build/assets/sidebar-onboarding-checklist-storage-3qYflszY.js +1 -0
  140. package/build/assets/sidebar-store-DtpU7zaI.js +1 -0
  141. package/build/assets/skill-card-pill-row-CFxjoqxn.js +1 -0
  142. package/build/assets/skill-filter-CWZ5kjcg.js +2 -0
  143. package/build/assets/skill-icon-badge-CPQJ6A-I.js +1 -0
  144. package/build/assets/skill-scope-CV1dkAbW.js +1 -0
  145. package/build/assets/skills-plugins-DGHULTq6.js +1 -0
  146. package/build/assets/skills-settings-CM1lFv3e.js +1 -0
  147. package/build/assets/styled-tooltip-Dl06rkpY.js +1 -0
  148. package/build/assets/task-list-tab-04GNQuii.js +1 -0
  149. package/build/assets/terminal-Cj0iHIW7.js +3 -0
  150. package/build/assets/toggle-switch-Fd_QGz0r.js +1 -0
  151. package/build/assets/trash-2-Dl8_RGz0.js +1 -0
  152. package/build/assets/trash-_RMt7Ayc.js +1 -0
  153. package/build/assets/triangle-alert-SM-q4NU_.js +1 -0
  154. package/build/assets/typography-SgFy466J.js +1 -0
  155. package/build/assets/usage-tab-BcfWV6db.js +1 -0
  156. package/build/assets/use-acp-credential-form-BsSW5NHG.js +1 -0
  157. package/build/assets/use-activate-agent-profile-B2NS8nA5.js +1 -0
  158. package/build/assets/use-agent-profiles-DWBPC0Si.js +1 -0
  159. package/build/assets/use-automation-health-BxXdzZMP.js +1 -0
  160. package/build/assets/use-automations-zYb0dUny.js +1 -0
  161. package/build/assets/use-can-manage-org-profiles-BWMahtUh.js +1 -0
  162. package/build/assets/use-cloud-current-user-id-CPHMDG-C.js +1 -0
  163. package/build/assets/use-config-Bft35DOK.js +1 -0
  164. package/build/assets/use-create-conversation-DwN5vv2f.js +1 -0
  165. package/build/assets/use-create-secret-BSxJMxHp.js +1 -0
  166. package/build/assets/use-get-secrets-BT4ihRwj.js +1 -0
  167. package/build/assets/use-has-permission-B3C8rQmR.js +1 -0
  168. package/build/assets/use-is-authed-CFGkY3-Z.js +1 -0
  169. package/build/assets/use-launch-skill-in-chat-BYjYihBP.js +1 -0
  170. package/build/assets/use-llm-configured-BI6obxsc.js +1 -0
  171. package/build/assets/use-llm-profiles-djGAhTWL.js +1 -0
  172. package/build/assets/use-manifest-capabilities-3z0-1G59.js +1 -0
  173. package/build/assets/use-onboarding-completion-BXpyUSsJ.js +1 -0
  174. package/build/assets/use-plugins-marketplace-DI4_pK56.js +1 -0
  175. package/build/assets/use-save-agent-profile-DdBSTdpN.js +1 -0
  176. package/build/assets/use-save-settings-CUZW6yXP.js +1 -0
  177. package/build/assets/use-settings-C5VhGpqd.js +1 -0
  178. package/build/assets/use-settings-nav-items-DHaUu1Dg.js +16 -0
  179. package/build/assets/use-tracking-D5t9otIF.js +3 -0
  180. package/build/assets/use-user-conversation-DT0_QCnL.js +1 -0
  181. package/build/assets/useInfiniteQuery-CgeUQPfs.js +1 -0
  182. package/build/assets/useMutation-DFnzkf6f.js +1 -0
  183. package/build/assets/useQueries-BhbrGEf1.js +1 -0
  184. package/build/assets/useQuery-BXWbZBZl.js +1 -0
  185. package/build/assets/utils-DaCIEEQP.js +1 -0
  186. package/build/assets/vendor~browser-hbU4u2Ag.js +47 -0
  187. package/build/assets/vendor~commits-tab-BaO2Ce3e.js +11 -0
  188. package/build/assets/vendor~conversation-panel~conversation-CTvDDiXg.js +1 -0
  189. package/build/assets/vendor~entry.client-BFE7Llz9.js +1 -0
  190. package/build/assets/vendor~entry.client-BaKt_PIp.js +9 -0
  191. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +186 -0
  192. package/build/assets/vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js +13 -0
  193. package/build/assets/vendor~root-layout-BlUaZ18v.js +1 -0
  194. package/build/assets/vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js +1 -0
  195. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js +1 -0
  196. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +1 -0
  197. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DXqM7vqB.js +1 -0
  198. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js +48 -0
  199. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +1 -0
  200. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js +4949 -0
  201. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js +8420 -0
  202. package/build/assets/verification-settings-Bj6bo097.js +1 -0
  203. package/build/assets/wrench-hi7Q13dF.js +1 -0
  204. package/build/assets/x-DkgltWa0.js +1 -0
  205. package/build/index.html +4 -4
  206. package/build/locales/ar/openhands.json +183 -44
  207. package/build/locales/ca/openhands.json +183 -44
  208. package/build/locales/de/openhands.json +183 -44
  209. package/build/locales/en/openhands.json +183 -44
  210. package/build/locales/es/openhands.json +183 -44
  211. package/build/locales/fr/openhands.json +183 -44
  212. package/build/locales/it/openhands.json +183 -44
  213. package/build/locales/ja/openhands.json +183 -44
  214. package/build/locales/ko-KR/openhands.json +183 -44
  215. package/build/locales/no/openhands.json +183 -44
  216. package/build/locales/pt/openhands.json +183 -44
  217. package/build/locales/tr/openhands.json +183 -44
  218. package/build/locales/uk/openhands.json +183 -44
  219. package/build/locales/zh-CN/openhands.json +183 -44
  220. package/build/locales/zh-TW/openhands.json +183 -44
  221. package/config/defaults.json +2 -2
  222. package/dist/api/agent-server-adapter.cjs +3 -3
  223. package/dist/api/agent-server-adapter.cjs.map +1 -1
  224. package/dist/api/agent-server-adapter.d.ts +10 -1
  225. package/dist/api/agent-server-adapter.js +115 -110
  226. package/dist/api/agent-server-adapter.js.map +1 -1
  227. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  228. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  229. package/dist/api/automation-service/automation-service.api.d.ts +23 -2
  230. package/dist/api/automation-service/automation-service.api.js +130 -73
  231. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  232. package/dist/api/backend-registry/url-selection.cjs +1 -1
  233. package/dist/api/backend-registry/url-selection.cjs.map +1 -1
  234. package/dist/api/backend-registry/url-selection.d.ts +2 -1
  235. package/dist/api/backend-registry/url-selection.js +2 -2
  236. package/dist/api/backend-registry/url-selection.js.map +1 -1
  237. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  238. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  239. package/dist/api/cloud/conversation-service.api.d.ts +9 -0
  240. package/dist/api/cloud/conversation-service.api.js +11 -1
  241. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  242. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  243. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  244. package/dist/api/conversation-service/agent-server-conversation-service.api.js +29 -24
  245. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  246. package/dist/api/git-provider-items-service.cjs +2 -0
  247. package/dist/api/git-provider-items-service.cjs.map +1 -0
  248. package/dist/api/git-provider-items-service.d.ts +25 -0
  249. package/dist/api/git-provider-items-service.js +127 -0
  250. package/dist/api/git-provider-items-service.js.map +1 -0
  251. package/dist/api/mcp-health/probe-mcp-server-health.cjs +1 -1
  252. package/dist/api/mcp-health/probe-mcp-server-health.js +31 -31
  253. package/dist/api/open-hands.types.d.ts +0 -19
  254. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  255. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  256. package/dist/api/profiles-service/profiles-service.api.d.ts +29 -2
  257. package/dist/api/profiles-service/profiles-service.api.js +25 -2
  258. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  259. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +2 -0
  260. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -0
  261. package/dist/api/provider-connections-service/provider-connections-service.api.d.ts +34 -0
  262. package/dist/api/provider-connections-service/provider-connections-service.api.js +50 -0
  263. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -0
  264. package/dist/api/secrets-service.cjs +1 -1
  265. package/dist/api/secrets-service.cjs.map +1 -1
  266. package/dist/api/secrets-service.d.ts +5 -0
  267. package/dist/api/secrets-service.js +12 -6
  268. package/dist/api/secrets-service.js.map +1 -1
  269. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs +1 -1
  270. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs.map +1 -1
  271. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js +1 -1
  272. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js.map +1 -1
  273. package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
  274. package/dist/components/conversation-events/chat/event-message.cjs +1 -1
  275. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  276. package/dist/components/conversation-events/chat/event-message.js +1 -1
  277. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  278. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  279. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  280. package/dist/components/features/automations/add-automation-menu.d.ts +7 -0
  281. package/dist/components/features/automations/add-automation-modal.cjs +2 -0
  282. package/dist/components/features/automations/add-automation-modal.cjs.map +1 -0
  283. package/dist/components/features/automations/add-automation-modal.js +42 -0
  284. package/dist/components/features/automations/add-automation-modal.js.map +1 -0
  285. package/dist/components/features/automations/automation-action-button-classes.cjs +2 -0
  286. package/dist/components/features/automations/automation-action-button-classes.cjs.map +1 -0
  287. package/dist/components/features/automations/automation-action-button-classes.d.ts +0 -2
  288. package/dist/components/features/automations/automation-action-button-classes.js +8 -0
  289. package/dist/components/features/automations/automation-action-button-classes.js.map +1 -0
  290. package/dist/components/features/automations/automation-card-skeleton.cjs +2 -0
  291. package/dist/components/features/automations/automation-card-skeleton.cjs.map +1 -0
  292. package/dist/components/features/automations/automation-card-skeleton.js +33 -0
  293. package/dist/components/features/automations/automation-card-skeleton.js.map +1 -0
  294. package/dist/components/features/automations/automation-card.cjs +2 -0
  295. package/dist/components/features/automations/automation-card.cjs.map +1 -0
  296. package/dist/components/features/automations/automation-card.d.ts +1 -1
  297. package/dist/components/features/automations/automation-card.js +160 -0
  298. package/dist/components/features/automations/automation-card.js.map +1 -0
  299. package/dist/components/features/automations/automation-group.cjs +2 -0
  300. package/dist/components/features/automations/automation-group.cjs.map +1 -0
  301. package/dist/components/features/automations/automation-group.js +54 -0
  302. package/dist/components/features/automations/automation-group.js.map +1 -0
  303. package/dist/components/features/automations/automation-list-row.cjs +2 -0
  304. package/dist/components/features/automations/automation-list-row.cjs.map +1 -0
  305. package/dist/components/features/automations/automation-list-row.js +152 -0
  306. package/dist/components/features/automations/automation-list-row.js.map +1 -0
  307. package/dist/components/features/automations/automation-run-insights.cjs +2 -0
  308. package/dist/components/features/automations/automation-run-insights.cjs.map +1 -0
  309. package/dist/components/features/automations/automation-run-insights.js +46 -0
  310. package/dist/components/features/automations/automation-run-insights.js.map +1 -0
  311. package/dist/components/features/automations/automation-view-mode.cjs +2 -0
  312. package/dist/components/features/automations/automation-view-mode.cjs.map +1 -0
  313. package/dist/components/features/automations/automation-view-mode.d.ts +5 -1
  314. package/dist/components/features/automations/automation-view-mode.js +6 -0
  315. package/dist/components/features/automations/automation-view-mode.js.map +1 -0
  316. package/dist/components/features/automations/backend-not-configured.cjs +2 -0
  317. package/dist/components/features/automations/backend-not-configured.cjs.map +1 -0
  318. package/dist/components/features/automations/backend-not-configured.js +34 -0
  319. package/dist/components/features/automations/backend-not-configured.js.map +1 -0
  320. package/dist/components/features/automations/build-automation-menu-items.cjs +2 -0
  321. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -0
  322. package/dist/components/features/automations/build-automation-menu-items.js +53 -0
  323. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -0
  324. package/dist/components/features/automations/build-automation-pills.cjs +2 -0
  325. package/dist/components/features/automations/build-automation-pills.cjs.map +1 -0
  326. package/dist/components/features/automations/build-automation-pills.js +71 -0
  327. package/dist/components/features/automations/build-automation-pills.js.map +1 -0
  328. package/dist/components/features/automations/create-instructions.cjs +2 -0
  329. package/dist/components/features/automations/create-instructions.cjs.map +1 -0
  330. package/dist/components/features/automations/create-instructions.js +102 -0
  331. package/dist/components/features/automations/create-instructions.js.map +1 -0
  332. package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +4 -3
  333. package/dist/components/features/automations/detail/run-status-badge.cjs +2 -0
  334. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -0
  335. package/dist/components/features/automations/detail/run-status-badge.js +102 -0
  336. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -0
  337. package/dist/components/features/automations/empty-state.cjs +2 -0
  338. package/dist/components/features/automations/empty-state.cjs.map +1 -0
  339. package/dist/components/features/automations/empty-state.js +35 -0
  340. package/dist/components/features/automations/empty-state.js.map +1 -0
  341. package/dist/components/features/automations/error-state.cjs +2 -0
  342. package/dist/components/features/automations/error-state.cjs.map +1 -0
  343. package/dist/components/features/automations/error-state.js +28 -0
  344. package/dist/components/features/automations/error-state.js.map +1 -0
  345. package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
  346. package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
  347. package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
  348. package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
  349. package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
  350. package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
  351. package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
  352. package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
  353. package/dist/components/features/automations/import-automation-modal.d.ts +2 -1
  354. package/dist/components/features/automations/kebab-menu-item-content.cjs +2 -0
  355. package/dist/components/features/automations/kebab-menu-item-content.cjs.map +1 -0
  356. package/dist/components/features/automations/kebab-menu-item-content.js +21 -0
  357. package/dist/components/features/automations/kebab-menu-item-content.js.map +1 -0
  358. package/dist/components/features/automations/kebab-menu.cjs +2 -0
  359. package/dist/components/features/automations/kebab-menu.cjs.map +1 -0
  360. package/dist/components/features/automations/kebab-menu.d.ts +2 -1
  361. package/dist/components/features/automations/kebab-menu.js +76 -0
  362. package/dist/components/features/automations/kebab-menu.js.map +1 -0
  363. package/dist/components/features/automations/recommended-automations-launcher.cjs +2 -0
  364. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -0
  365. package/dist/components/features/automations/recommended-automations-launcher.d.ts +7 -1
  366. package/dist/components/features/automations/recommended-automations-launcher.js +134 -0
  367. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -0
  368. package/dist/components/features/automations/recommended-automations-rail.cjs +2 -0
  369. package/dist/components/features/automations/recommended-automations-rail.cjs.map +1 -0
  370. package/dist/components/features/automations/recommended-automations-rail.d.ts +9 -0
  371. package/dist/components/features/automations/recommended-automations-rail.js +127 -0
  372. package/dist/components/features/automations/recommended-automations-rail.js.map +1 -0
  373. package/dist/components/features/automations/recommended-automations-section.cjs +2 -0
  374. package/dist/components/features/automations/recommended-automations-section.cjs.map +1 -0
  375. package/dist/components/features/automations/recommended-automations-section.d.ts +2 -2
  376. package/dist/components/features/automations/recommended-automations-section.js +198 -0
  377. package/dist/components/features/automations/recommended-automations-section.js.map +1 -0
  378. package/dist/components/features/automations/responder-deployment-modal.cjs +2 -0
  379. package/dist/components/features/automations/responder-deployment-modal.cjs.map +1 -0
  380. package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
  381. package/dist/components/features/automations/responder-deployment-modal.js +75 -0
  382. package/dist/components/features/automations/responder-deployment-modal.js.map +1 -0
  383. package/dist/components/features/automations/status-badge.cjs +2 -0
  384. package/dist/components/features/automations/status-badge.cjs.map +1 -0
  385. package/dist/components/features/automations/status-badge.js +12 -0
  386. package/dist/components/features/automations/status-badge.js.map +1 -0
  387. package/dist/components/features/automations/to-latest-run-state.cjs +2 -0
  388. package/dist/components/features/automations/to-latest-run-state.cjs.map +1 -0
  389. package/dist/components/features/automations/to-latest-run-state.d.ts +6 -0
  390. package/dist/components/features/automations/to-latest-run-state.js +21 -0
  391. package/dist/components/features/automations/to-latest-run-state.js.map +1 -0
  392. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  393. package/dist/components/features/backends/backend-form-modal.js +10 -10
  394. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  395. package/dist/components/features/backends/manage-backends-modal.js +5 -5
  396. package/dist/components/features/chat/chat-interface.cjs +2 -2
  397. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  398. package/dist/components/features/chat/chat-interface.js +151 -148
  399. package/dist/components/features/chat/chat-interface.js.map +1 -1
  400. package/dist/components/features/chat/error-message-banner.cjs +1 -1
  401. package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
  402. package/dist/components/features/chat/error-message-banner.d.ts +3 -1
  403. package/dist/components/features/chat/error-message-banner.js +64 -58
  404. package/dist/components/features/chat/error-message-banner.js.map +1 -1
  405. package/dist/components/features/command-menu/command-menu-items.d.ts +10 -4
  406. package/dist/components/features/conversation/conversation-git-actions-menu.cjs +2 -0
  407. package/dist/components/features/conversation/conversation-git-actions-menu.cjs.map +1 -0
  408. package/dist/components/features/conversation/conversation-git-actions-menu.d.ts +15 -0
  409. package/dist/components/features/conversation/conversation-git-actions-menu.js +123 -0
  410. package/dist/components/features/conversation/conversation-git-actions-menu.js.map +1 -0
  411. package/dist/components/features/conversation/conversation-git-actions-toggle.cjs +2 -0
  412. package/dist/components/features/conversation/conversation-git-actions-toggle.cjs.map +1 -0
  413. package/dist/components/features/conversation/conversation-git-actions-toggle.d.ts +10 -0
  414. package/dist/components/features/conversation/conversation-git-actions-toggle.js +60 -0
  415. package/dist/components/features/conversation/conversation-git-actions-toggle.js.map +1 -0
  416. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs +1 -1
  417. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs.map +1 -1
  418. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js +46 -10
  419. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js.map +1 -1
  420. package/dist/components/features/conversation/conversation-main/conversation-main.cjs +1 -1
  421. package/dist/components/features/conversation/conversation-main/conversation-main.cjs.map +1 -1
  422. package/dist/components/features/conversation/conversation-main/conversation-main.js +49 -43
  423. package/dist/components/features/conversation/conversation-main/conversation-main.js.map +1 -1
  424. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  425. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  426. package/dist/components/features/conversation/conversation-name-with-status.js +49 -40
  427. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  428. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  429. package/dist/components/features/conversation/conversation-name.js +4 -4
  430. package/dist/components/features/conversation/conversation-overview-automations-panel.cjs +2 -0
  431. package/dist/components/features/conversation/conversation-overview-automations-panel.cjs.map +1 -0
  432. package/dist/components/features/conversation/conversation-overview-automations-panel.d.ts +6 -0
  433. package/dist/components/features/conversation/conversation-overview-automations-panel.js +48 -0
  434. package/dist/components/features/conversation/conversation-overview-automations-panel.js.map +1 -0
  435. package/dist/components/features/conversation/conversation-overview-context-menu.cjs +2 -0
  436. package/dist/components/features/conversation/conversation-overview-context-menu.cjs.map +1 -0
  437. package/dist/components/features/conversation/conversation-overview-context-menu.d.ts +10 -0
  438. package/dist/components/features/conversation/conversation-overview-context-menu.js +221 -0
  439. package/dist/components/features/conversation/conversation-overview-context-menu.js.map +1 -0
  440. package/dist/components/features/conversation/conversation-overview-diffs-row.cjs +2 -0
  441. package/dist/components/features/conversation/conversation-overview-diffs-row.cjs.map +1 -0
  442. package/dist/components/features/conversation/conversation-overview-diffs-row.d.ts +2 -0
  443. package/dist/components/features/conversation/conversation-overview-diffs-row.js +88 -0
  444. package/dist/components/features/conversation/conversation-overview-diffs-row.js.map +1 -0
  445. package/dist/components/features/conversation/conversation-overview-drawer-content.cjs +2 -0
  446. package/dist/components/features/conversation/conversation-overview-drawer-content.cjs.map +1 -0
  447. package/dist/components/features/conversation/conversation-overview-drawer-content.d.ts +6 -0
  448. package/dist/components/features/conversation/conversation-overview-drawer-content.js +138 -0
  449. package/dist/components/features/conversation/conversation-overview-drawer-content.js.map +1 -0
  450. package/dist/components/features/conversation/conversation-overview-drawer-context.cjs +2 -0
  451. package/dist/components/features/conversation/conversation-overview-drawer-context.cjs.map +1 -0
  452. package/dist/components/features/conversation/conversation-overview-drawer-context.d.ts +17 -0
  453. package/dist/components/features/conversation/conversation-overview-drawer-context.js +43 -0
  454. package/dist/components/features/conversation/conversation-overview-drawer-context.js.map +1 -0
  455. package/dist/components/features/conversation/conversation-overview-drawer.cjs +2 -0
  456. package/dist/components/features/conversation/conversation-overview-drawer.cjs.map +1 -0
  457. package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs +2 -0
  458. package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs.map +1 -0
  459. package/dist/components/features/conversation/conversation-overview-drawer.constants.d.ts +6 -0
  460. package/dist/components/features/conversation/conversation-overview-drawer.constants.js +6 -0
  461. package/dist/components/features/conversation/conversation-overview-drawer.constants.js.map +1 -0
  462. package/dist/components/features/conversation/conversation-overview-drawer.d.ts +7 -0
  463. package/dist/components/features/conversation/conversation-overview-drawer.js +45 -0
  464. package/dist/components/features/conversation/conversation-overview-drawer.js.map +1 -0
  465. package/dist/components/features/conversation/conversation-overview-drawer.types.cjs +2 -0
  466. package/dist/components/features/conversation/conversation-overview-drawer.types.cjs.map +1 -0
  467. package/dist/components/features/conversation/conversation-overview-drawer.types.d.ts +12 -0
  468. package/dist/components/features/conversation/conversation-overview-drawer.types.js +13 -0
  469. package/dist/components/features/conversation/conversation-overview-drawer.types.js.map +1 -0
  470. package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs +2 -0
  471. package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs.map +1 -0
  472. package/dist/components/features/conversation/conversation-overview-git-items-panel.d.ts +7 -0
  473. package/dist/components/features/conversation/conversation-overview-git-items-panel.js +81 -0
  474. package/dist/components/features/conversation/conversation-overview-git-items-panel.js.map +1 -0
  475. package/dist/components/features/conversation/conversation-overview-git-section.cjs +2 -0
  476. package/dist/components/features/conversation/conversation-overview-git-section.cjs.map +1 -0
  477. package/dist/components/features/conversation/conversation-overview-git-section.d.ts +6 -0
  478. package/dist/components/features/conversation/conversation-overview-git-section.js +143 -0
  479. package/dist/components/features/conversation/conversation-overview-git-section.js.map +1 -0
  480. package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs +2 -0
  481. package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs.map +1 -0
  482. package/dist/components/features/conversation/conversation-overview-mcp-panel.d.ts +6 -0
  483. package/dist/components/features/conversation/conversation-overview-mcp-panel.js +108 -0
  484. package/dist/components/features/conversation/conversation-overview-mcp-panel.js.map +1 -0
  485. package/dist/components/features/conversation/conversation-overview-panel.cjs +2 -0
  486. package/dist/components/features/conversation/conversation-overview-panel.cjs.map +1 -0
  487. package/dist/components/features/conversation/conversation-overview-panel.constants.cjs +2 -0
  488. package/dist/components/features/conversation/conversation-overview-panel.constants.cjs.map +1 -0
  489. package/dist/components/features/conversation/conversation-overview-panel.constants.d.ts +24 -0
  490. package/dist/components/features/conversation/conversation-overview-panel.constants.js +12 -0
  491. package/dist/components/features/conversation/conversation-overview-panel.constants.js.map +1 -0
  492. package/dist/components/features/conversation/conversation-overview-panel.d.ts +2 -0
  493. package/dist/components/features/conversation/conversation-overview-panel.js +102 -0
  494. package/dist/components/features/conversation/conversation-overview-panel.js.map +1 -0
  495. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs +2 -0
  496. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs.map +1 -0
  497. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.d.ts +8 -0
  498. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js +29 -0
  499. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js.map +1 -0
  500. package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs +2 -0
  501. package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs.map +1 -0
  502. package/dist/components/features/conversation/conversation-overview-secrets-panel.d.ts +6 -0
  503. package/dist/components/features/conversation/conversation-overview-secrets-panel.js +89 -0
  504. package/dist/components/features/conversation/conversation-overview-secrets-panel.js.map +1 -0
  505. package/dist/components/features/conversation/conversation-overview-sections.cjs +2 -0
  506. package/dist/components/features/conversation/conversation-overview-sections.cjs.map +1 -0
  507. package/dist/components/features/conversation/conversation-overview-sections.d.ts +43 -0
  508. package/dist/components/features/conversation/conversation-overview-sections.js +27 -0
  509. package/dist/components/features/conversation/conversation-overview-sections.js.map +1 -0
  510. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +2 -0
  511. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -0
  512. package/dist/components/features/conversation/conversation-overview-skills-panel.d.ts +6 -0
  513. package/dist/components/features/conversation/conversation-overview-skills-panel.js +138 -0
  514. package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -0
  515. package/dist/components/features/conversation/conversation-overview-toggle.cjs +2 -0
  516. package/dist/components/features/conversation/conversation-overview-toggle.cjs.map +1 -0
  517. package/dist/components/features/conversation/conversation-overview-toggle.d.ts +11 -0
  518. package/dist/components/features/conversation/conversation-overview-toggle.js +99 -0
  519. package/dist/components/features/conversation/conversation-overview-toggle.js.map +1 -0
  520. package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs +2 -0
  521. package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs.map +1 -0
  522. package/dist/components/features/conversation/conversation-secondary-drawer.classes.d.ts +4 -0
  523. package/dist/components/features/conversation/conversation-secondary-drawer.classes.js +7 -0
  524. package/dist/components/features/conversation/conversation-secondary-drawer.classes.js.map +1 -0
  525. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  526. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  527. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +10 -9
  528. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  529. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  530. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  531. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +68 -62
  532. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  533. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  534. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  535. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +98 -88
  536. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  537. package/dist/components/features/conversation/right-panel-toggle.cjs +1 -1
  538. package/dist/components/features/conversation/right-panel-toggle.cjs.map +1 -1
  539. package/dist/components/features/conversation/right-panel-toggle.d.ts +3 -2
  540. package/dist/components/features/conversation/right-panel-toggle.js +34 -33
  541. package/dist/components/features/conversation/right-panel-toggle.js.map +1 -1
  542. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  543. package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
  544. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  545. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  546. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +2 -1
  547. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +14 -7
  548. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  549. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  550. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  551. package/dist/components/features/conversation-panel/conversation-panel.js +263 -236
  552. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  553. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  554. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  555. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -4
  556. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  557. package/dist/components/features/diff-viewer/accordion-panel.cjs +2 -0
  558. package/dist/components/features/diff-viewer/accordion-panel.cjs.map +1 -0
  559. package/dist/components/features/diff-viewer/accordion-panel.d.ts +13 -0
  560. package/dist/components/features/diff-viewer/accordion-panel.js +41 -0
  561. package/dist/components/features/diff-viewer/accordion-panel.js.map +1 -0
  562. package/dist/components/features/diff-viewer/commit-list.cjs +1 -1
  563. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -1
  564. package/dist/components/features/diff-viewer/commit-list.d.ts +5 -1
  565. package/dist/components/features/diff-viewer/commit-list.js +30 -16
  566. package/dist/components/features/diff-viewer/commit-list.js.map +1 -1
  567. package/dist/components/features/diff-viewer/commit-row.cjs +1 -1
  568. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -1
  569. package/dist/components/features/diff-viewer/commit-row.d.ts +1 -2
  570. package/dist/components/features/diff-viewer/commit-row.js +38 -34
  571. package/dist/components/features/diff-viewer/commit-row.js.map +1 -1
  572. package/dist/components/features/diff-viewer/diff-change-list.cjs +2 -0
  573. package/dist/components/features/diff-viewer/diff-change-list.cjs.map +1 -0
  574. package/dist/components/features/diff-viewer/diff-change-list.d.ts +18 -0
  575. package/dist/components/features/diff-viewer/diff-change-list.js +22 -0
  576. package/dist/components/features/diff-viewer/diff-change-list.js.map +1 -0
  577. package/dist/components/features/diff-viewer/editor-container.cjs +1 -1
  578. package/dist/components/features/diff-viewer/editor-container.cjs.map +1 -1
  579. package/dist/components/features/diff-viewer/editor-container.d.ts +2 -1
  580. package/dist/components/features/diff-viewer/editor-container.js +8 -7
  581. package/dist/components/features/diff-viewer/editor-container.js.map +1 -1
  582. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  583. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  584. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +10 -1
  585. package/dist/components/features/diff-viewer/file-diff-viewer.js +138 -112
  586. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  587. package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs +2 -0
  588. package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs.map +1 -0
  589. package/dist/components/features/diff-viewer/uncommitted-changes-row.d.ts +12 -0
  590. package/dist/components/features/diff-viewer/uncommitted-changes-row.js +51 -0
  591. package/dist/components/features/diff-viewer/uncommitted-changes-row.js.map +1 -0
  592. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  593. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  594. package/dist/components/features/files-tab/file-content-viewer.js +0 -1
  595. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  596. package/dist/components/features/files-tab/file-quick-row.cjs +1 -1
  597. package/dist/components/features/files-tab/file-quick-row.cjs.map +1 -1
  598. package/dist/components/features/files-tab/file-quick-row.d.ts +9 -7
  599. package/dist/components/features/files-tab/file-quick-row.js +63 -34
  600. package/dist/components/features/files-tab/file-quick-row.js.map +1 -1
  601. package/dist/components/features/files-tab/files-tab-tree.constants.cjs +2 -0
  602. package/dist/components/features/files-tab/files-tab-tree.constants.cjs.map +1 -0
  603. package/dist/components/features/files-tab/files-tab-tree.constants.d.ts +7 -0
  604. package/dist/components/features/files-tab/files-tab-tree.constants.js +6 -0
  605. package/dist/components/features/files-tab/files-tab-tree.constants.js.map +1 -0
  606. package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
  607. package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
  608. package/dist/components/features/files-tab/segmented-toggle.d.ts +5 -3
  609. package/dist/components/features/files-tab/segmented-toggle.js +10 -13
  610. package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
  611. package/dist/components/features/files-tab/tree-node.cjs +1 -1
  612. package/dist/components/features/files-tab/tree-node.cjs.map +1 -1
  613. package/dist/components/features/files-tab/tree-node.js +34 -32
  614. package/dist/components/features/files-tab/tree-node.js.map +1 -1
  615. package/dist/components/features/files-tab/workspace-path.cjs +2 -0
  616. package/dist/components/features/files-tab/workspace-path.cjs.map +1 -0
  617. package/dist/components/features/files-tab/workspace-path.d.ts +6 -0
  618. package/dist/components/features/files-tab/workspace-path.js +41 -0
  619. package/dist/components/features/files-tab/workspace-path.js.map +1 -0
  620. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +2 -0
  621. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -0
  622. package/dist/components/features/home/featured-automations/automation-health-indicator.js +22 -0
  623. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -0
  624. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +2 -0
  625. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -0
  626. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +45 -0
  627. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -0
  628. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +2 -0
  629. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -0
  630. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +108 -0
  631. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -0
  632. package/dist/components/features/home/featured-automations/automation-run-health.cjs +2 -0
  633. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -0
  634. package/dist/components/features/home/featured-automations/automation-run-health.js +75 -0
  635. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -0
  636. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +2 -0
  637. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -0
  638. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +74 -0
  639. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -0
  640. package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +3 -3
  641. package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs +1 -1
  642. package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs.map +1 -1
  643. package/dist/components/features/home/git-repo-dropdown/use-url-search.js +1 -1
  644. package/dist/components/features/home/git-repo-dropdown/use-url-search.js.map +1 -1
  645. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  646. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +6 -6
  647. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  648. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +6 -6
  649. package/dist/components/features/manifest/manifest-form-field.d.ts +4 -3
  650. package/dist/components/features/manifest/manifest-icons.cjs +2 -0
  651. package/dist/components/features/manifest/manifest-icons.cjs.map +1 -0
  652. package/dist/components/features/manifest/manifest-icons.d.ts +1 -0
  653. package/dist/components/features/manifest/manifest-icons.js +21 -0
  654. package/dist/components/features/manifest/manifest-icons.js.map +1 -0
  655. package/dist/components/features/manifest/manifest-repository-list.d.ts +25 -0
  656. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  657. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  658. package/dist/components/features/markdown/markdown-table-scroll.d.ts +2 -6
  659. package/dist/components/features/markdown/markdown-table-scroll.js +15 -21
  660. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  661. package/dist/components/features/mcp-logo-badge.cjs +1 -1
  662. package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
  663. package/dist/components/features/mcp-logo-badge.d.ts +1 -1
  664. package/dist/components/features/mcp-logo-badge.js +1 -0
  665. package/dist/components/features/mcp-logo-badge.js.map +1 -1
  666. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  667. package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
  668. package/dist/components/features/mcp-page/index.cjs +1 -1
  669. package/dist/components/features/mcp-page/index.js +2 -2
  670. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  671. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  672. package/dist/components/features/mcp-page/install-server-modal.js +25 -25
  673. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  674. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  675. package/dist/components/features/mcp-page/installed-server-card.js +5 -5
  676. package/dist/components/features/mcp-page/marketplace-card.cjs +1 -1
  677. package/dist/components/features/mcp-page/marketplace-card.js +4 -4
  678. package/dist/components/features/mcp-page/marketplace-section.cjs +1 -1
  679. package/dist/components/features/mcp-page/marketplace-section.js +3 -3
  680. package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs +2 -0
  681. package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs.map +1 -0
  682. package/dist/components/features/mcp-page/mcp-logo-stack-badge.js +60 -0
  683. package/dist/components/features/mcp-page/mcp-logo-stack-badge.js.map +1 -0
  684. package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
  685. package/dist/components/features/mcp-page/mcp-server-health.js +18 -18
  686. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
  687. package/dist/components/features/onboarding/use-onboarding-completion.cjs +2 -0
  688. package/dist/components/features/onboarding/use-onboarding-completion.cjs.map +1 -0
  689. package/dist/components/features/onboarding/use-onboarding-completion.js +32 -0
  690. package/dist/components/features/onboarding/use-onboarding-completion.js.map +1 -0
  691. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs +2 -0
  692. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs.map +1 -0
  693. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.d.ts +1 -0
  694. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js +22 -0
  695. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js.map +1 -0
  696. package/dist/components/features/settings/brand-button.cjs +1 -1
  697. package/dist/components/features/settings/brand-button.cjs.map +1 -1
  698. package/dist/components/features/settings/brand-button.d.ts +2 -0
  699. package/dist/components/features/settings/brand-button.js +4 -2
  700. package/dist/components/features/settings/brand-button.js.map +1 -1
  701. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.cjs +1 -0
  702. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.d.ts +7 -0
  703. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.js +7 -0
  704. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
  705. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +3 -0
  706. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  707. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -0
  708. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +20 -1
  709. package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -0
  710. package/dist/components/features/settings/llm-profiles/provider-connection-modal.d.ts +19 -0
  711. package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +10 -0
  712. package/dist/components/features/settings/llm-profiles/provider-connection-row.cjs +1 -0
  713. package/dist/components/features/settings/llm-profiles/provider-connection-row.d.ts +10 -0
  714. package/dist/components/features/settings/llm-profiles/provider-connection-row.js +6 -0
  715. package/dist/components/features/settings/llm-profiles/provider-connections-manager.cjs +1 -0
  716. package/dist/components/features/settings/llm-profiles/provider-connections-manager.d.ts +15 -0
  717. package/dist/components/features/settings/llm-profiles/provider-connections-manager.js +8 -0
  718. package/dist/components/features/settings/sdk-settings/schema-field.cjs +1 -1
  719. package/dist/components/features/settings/sdk-settings/schema-field.js +6 -6
  720. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  721. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +7 -7
  722. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  723. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  724. package/dist/components/features/settings/secrets-settings/secret-form.js +7 -7
  725. package/dist/components/features/settings/settings-input.cjs +1 -1
  726. package/dist/components/features/settings/settings-input.cjs.map +1 -1
  727. package/dist/components/features/settings/settings-input.d.ts +6 -0
  728. package/dist/components/features/settings/settings-input.js +14 -13
  729. package/dist/components/features/settings/settings-input.js.map +1 -1
  730. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs +2 -0
  731. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs.map +1 -0
  732. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.d.ts +7 -0
  733. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js +102 -0
  734. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js.map +1 -0
  735. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs +2 -0
  736. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs.map +1 -0
  737. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.d.ts +8 -0
  738. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js +66 -0
  739. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js.map +1 -0
  740. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs +2 -0
  741. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs.map +1 -0
  742. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.d.ts +3 -0
  743. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js +15 -0
  744. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js.map +1 -0
  745. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs +2 -0
  746. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs.map +1 -0
  747. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.d.ts +10 -0
  748. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js +39 -0
  749. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js.map +1 -0
  750. package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs +2 -0
  751. package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs.map +1 -0
  752. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs +2 -0
  753. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs.map +1 -0
  754. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.d.ts +26 -0
  755. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js +78 -0
  756. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js.map +1 -0
  757. package/dist/components/features/sidebar/sidebar-onboarding-checklist.d.ts +5 -0
  758. package/dist/components/features/sidebar/sidebar-onboarding-checklist.js +127 -0
  759. package/dist/components/features/sidebar/sidebar-onboarding-checklist.js.map +1 -0
  760. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  761. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  762. package/dist/components/features/sidebar/sidebar-rail-body.js +115 -111
  763. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  764. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs +2 -0
  765. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs.map +1 -0
  766. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.d.ts +1 -0
  767. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js +10 -0
  768. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js.map +1 -0
  769. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +2 -0
  770. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs.map +1 -0
  771. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.d.ts +15 -0
  772. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +75 -0
  773. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js.map +1 -0
  774. package/dist/components/features/skills/add-skill-modal.cjs +2 -0
  775. package/dist/components/features/skills/add-skill-modal.cjs.map +1 -0
  776. package/dist/components/features/skills/add-skill-modal.js +164 -0
  777. package/dist/components/features/skills/add-skill-modal.js.map +1 -0
  778. package/dist/components/features/skills/build-skill-pills.cjs +2 -0
  779. package/dist/components/features/skills/build-skill-pills.cjs.map +1 -0
  780. package/dist/components/features/skills/build-skill-pills.js +88 -0
  781. package/dist/components/features/skills/build-skill-pills.js.map +1 -0
  782. package/dist/components/features/skills/get-skill-card-description.cjs +2 -0
  783. package/dist/components/features/skills/get-skill-card-description.cjs.map +1 -0
  784. package/dist/components/features/skills/get-skill-card-description.js +34 -0
  785. package/dist/components/features/skills/get-skill-card-description.js.map +1 -0
  786. package/dist/components/features/skills/get-skill-chat-launch-message.cjs +2 -0
  787. package/dist/components/features/skills/get-skill-chat-launch-message.cjs.map +1 -0
  788. package/dist/components/features/skills/get-skill-chat-launch-message.js +9 -0
  789. package/dist/components/features/skills/get-skill-chat-launch-message.js.map +1 -0
  790. package/dist/components/features/skills/is-copyable-skill-source.cjs +2 -0
  791. package/dist/components/features/skills/is-copyable-skill-source.cjs.map +1 -0
  792. package/dist/components/features/skills/is-copyable-skill-source.js +9 -0
  793. package/dist/components/features/skills/is-copyable-skill-source.js.map +1 -0
  794. package/dist/components/features/skills/skill-card-pill-row.cjs +2 -0
  795. package/dist/components/features/skills/skill-card-pill-row.cjs.map +1 -0
  796. package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
  797. package/dist/components/features/skills/skill-card-pill-row.js +137 -0
  798. package/dist/components/features/skills/skill-card-pill-row.js.map +1 -0
  799. package/dist/components/features/skills/skill-card.cjs +2 -0
  800. package/dist/components/features/skills/skill-card.cjs.map +1 -0
  801. package/dist/components/features/skills/skill-card.js +93 -0
  802. package/dist/components/features/skills/skill-card.js.map +1 -0
  803. package/dist/components/features/skills/skill-detail-modal.cjs +3 -0
  804. package/dist/components/features/skills/skill-detail-modal.cjs.map +1 -0
  805. package/dist/components/features/skills/skill-detail-modal.js +150 -0
  806. package/dist/components/features/skills/skill-detail-modal.js.map +1 -0
  807. package/dist/components/features/skills/skill-facet-rail.cjs +2 -0
  808. package/dist/components/features/skills/skill-facet-rail.cjs.map +1 -0
  809. package/dist/components/features/skills/skill-facet-rail.js +42 -0
  810. package/dist/components/features/skills/skill-facet-rail.js.map +1 -0
  811. package/dist/components/features/skills/skill-facet-row.cjs +2 -0
  812. package/dist/components/features/skills/skill-facet-row.cjs.map +1 -0
  813. package/dist/components/features/skills/skill-facet-row.js +44 -0
  814. package/dist/components/features/skills/skill-facet-row.js.map +1 -0
  815. package/dist/components/features/skills/skill-filter.cjs +2 -0
  816. package/dist/components/features/skills/skill-filter.cjs.map +1 -0
  817. package/dist/components/features/skills/skill-filter.js +166 -0
  818. package/dist/components/features/skills/skill-filter.js.map +1 -0
  819. package/dist/components/features/skills/skill-filters-modal.cjs +2 -0
  820. package/dist/components/features/skills/skill-filters-modal.cjs.map +1 -0
  821. package/dist/components/features/skills/skill-filters-modal.js +53 -0
  822. package/dist/components/features/skills/skill-filters-modal.js.map +1 -0
  823. package/dist/components/features/skills/skill-icon-badge.cjs +2 -0
  824. package/dist/components/features/skills/skill-icon-badge.cjs.map +1 -0
  825. package/dist/components/features/skills/skill-icon-badge.js +17 -0
  826. package/dist/components/features/skills/skill-icon-badge.js.map +1 -0
  827. package/dist/components/features/skills/skill-type-badge.cjs +2 -0
  828. package/dist/components/features/skills/skill-type-badge.cjs.map +1 -0
  829. package/dist/components/features/skills/skill-type-badge.js +21 -0
  830. package/dist/components/features/skills/skill-type-badge.js.map +1 -0
  831. package/dist/components/features/skills/skills-toolbar.cjs +2 -0
  832. package/dist/components/features/skills/skills-toolbar.cjs.map +1 -0
  833. package/dist/components/features/skills/skills-toolbar.js +63 -0
  834. package/dist/components/features/skills/skills-toolbar.js.map +1 -0
  835. package/dist/components/shared/buttons/circle-plus-check-toggle.cjs +1 -1
  836. package/dist/components/shared/buttons/circle-plus-check-toggle.cjs.map +1 -1
  837. package/dist/components/shared/buttons/circle-plus-check-toggle.js +19 -6
  838. package/dist/components/shared/buttons/circle-plus-check-toggle.js.map +1 -1
  839. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  840. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  841. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +1 -1
  842. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  843. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  844. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  845. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +4 -1
  846. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  847. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  848. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  849. package/dist/components/shared/modals/settings/settings-form.js +4 -4
  850. package/dist/components/ui/resize-handle.cjs +1 -1
  851. package/dist/components/ui/resize-handle.cjs.map +1 -1
  852. package/dist/components/ui/resize-handle.d.ts +2 -1
  853. package/dist/components/ui/resize-handle.js +6 -5
  854. package/dist/components/ui/resize-handle.js.map +1 -1
  855. package/dist/config/defaults.cjs +1 -1
  856. package/dist/config/defaults.cjs.map +1 -1
  857. package/dist/config/defaults.js +2 -2
  858. package/dist/config/defaults.js.map +1 -1
  859. package/dist/constants/skills-docs.cjs +2 -0
  860. package/dist/constants/skills-docs.cjs.map +1 -0
  861. package/dist/constants/skills-docs.js +6 -0
  862. package/dist/constants/skills-docs.js.map +1 -0
  863. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  864. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  865. package/dist/contexts/conversation-websocket-context.js +184 -159
  866. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  867. package/dist/fixtures/home-automations-demo.cjs +2 -0
  868. package/dist/fixtures/home-automations-demo.cjs.map +1 -0
  869. package/dist/fixtures/home-automations-demo.d.ts +1 -3
  870. package/dist/fixtures/home-automations-demo.js +384 -0
  871. package/dist/fixtures/home-automations-demo.js.map +1 -0
  872. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  873. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  874. package/dist/hooks/chat/use-slash-command.d.ts +1 -2
  875. package/dist/hooks/chat/use-slash-command.js +1 -0
  876. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  877. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  878. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  879. package/dist/hooks/mutation/use-create-conversation.js +27 -30
  880. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  881. package/dist/hooks/mutation/use-create-provider-connection.cjs +1 -0
  882. package/dist/hooks/mutation/use-create-provider-connection.d.ts +2 -0
  883. package/dist/hooks/mutation/use-create-provider-connection.js +1 -0
  884. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  885. package/dist/hooks/mutation/use-delete-mcp-server.js +3 -3
  886. package/dist/hooks/mutation/use-delete-provider-connection.cjs +1 -0
  887. package/dist/hooks/mutation/use-delete-provider-connection.d.ts +1 -0
  888. package/dist/hooks/mutation/use-delete-provider-connection.js +1 -0
  889. package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
  890. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  891. package/dist/hooks/mutation/use-switch-acp-model.d.ts +5 -3
  892. package/dist/hooks/mutation/use-switch-acp-model.js +9 -13
  893. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  894. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  895. package/dist/hooks/mutation/use-update-mcp-server.js +6 -6
  896. package/dist/hooks/mutation/use-update-provider-connection.cjs +1 -0
  897. package/dist/hooks/mutation/use-update-provider-connection.d.ts +7 -0
  898. package/dist/hooks/mutation/use-update-provider-connection.js +1 -0
  899. package/dist/hooks/query/query-keys.cjs +1 -1
  900. package/dist/hooks/query/query-keys.cjs.map +1 -1
  901. package/dist/hooks/query/query-keys.d.ts +3 -0
  902. package/dist/hooks/query/query-keys.js +4 -4
  903. package/dist/hooks/query/query-keys.js.map +1 -1
  904. package/dist/hooks/query/use-automation-detail.cjs +1 -0
  905. package/dist/hooks/query/use-automation-detail.js +2 -0
  906. package/dist/hooks/query/use-automation-health.cjs +2 -0
  907. package/dist/hooks/query/use-automation-health.cjs.map +1 -0
  908. package/dist/hooks/query/use-automation-health.js +22 -0
  909. package/dist/hooks/query/use-automation-health.js.map +1 -0
  910. package/dist/hooks/query/use-automations.cjs +2 -0
  911. package/dist/hooks/query/use-automations.cjs.map +1 -0
  912. package/dist/hooks/query/use-automations.js +28 -0
  913. package/dist/hooks/query/use-automations.js.map +1 -0
  914. package/dist/hooks/query/use-backends-health.cjs +1 -1
  915. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  916. package/dist/hooks/query/use-backends-health.js +1 -1
  917. package/dist/hooks/query/use-backends-health.js.map +1 -1
  918. package/dist/hooks/query/use-conversation-history.cjs +1 -1
  919. package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
  920. package/dist/hooks/query/use-conversation-history.js +3 -1
  921. package/dist/hooks/query/use-conversation-history.js.map +1 -1
  922. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  923. package/dist/hooks/query/use-conversation-metrics.js +3 -3
  924. package/dist/hooks/query/use-git-sync.d.ts +19 -0
  925. package/dist/hooks/query/use-latest-automation-runs.cjs +1 -0
  926. package/dist/hooks/query/use-latest-automation-runs.d.ts +2 -0
  927. package/dist/hooks/query/use-latest-automation-runs.js +3 -0
  928. package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
  929. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  930. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  931. package/dist/hooks/query/use-paginated-conversations.js +1 -1
  932. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  933. package/dist/hooks/query/use-provider-connections.cjs +2 -0
  934. package/dist/hooks/query/use-provider-connections.cjs.map +1 -0
  935. package/dist/hooks/query/use-provider-connections.d.ts +8 -0
  936. package/dist/hooks/query/use-provider-connections.js +19 -0
  937. package/dist/hooks/query/use-provider-connections.js.map +1 -0
  938. package/dist/hooks/query/use-repository-git-items.cjs +2 -0
  939. package/dist/hooks/query/use-repository-git-items.cjs.map +1 -0
  940. package/dist/hooks/query/use-repository-git-items.d.ts +3 -0
  941. package/dist/hooks/query/use-repository-git-items.js +33 -0
  942. package/dist/hooks/query/use-repository-git-items.js.map +1 -0
  943. package/dist/hooks/query/use-task-polling.cjs +1 -1
  944. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  945. package/dist/hooks/query/use-task-polling.js +12 -10
  946. package/dist/hooks/query/use-task-polling.js.map +1 -1
  947. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  948. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  949. package/dist/hooks/query/use-workspace-files.d.ts +14 -4
  950. package/dist/hooks/query/use-workspace-files.js +46 -33
  951. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  952. package/dist/hooks/use-bash-command-runner.cjs +1 -1
  953. package/dist/hooks/use-bash-command-runner.cjs.map +1 -1
  954. package/dist/hooks/use-bash-command-runner.js +45 -42
  955. package/dist/hooks/use-bash-command-runner.js.map +1 -1
  956. package/dist/hooks/use-conversation-overview-column-space.cjs +2 -0
  957. package/dist/hooks/use-conversation-overview-column-space.cjs.map +1 -0
  958. package/dist/hooks/use-conversation-overview-column-space.d.ts +2 -0
  959. package/dist/hooks/use-conversation-overview-column-space.js +25 -0
  960. package/dist/hooks/use-conversation-overview-column-space.js.map +1 -0
  961. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +2 -0
  962. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs.map +1 -0
  963. package/dist/hooks/use-conversation-overview-git-diff-stats.d.ts +7 -0
  964. package/dist/hooks/use-conversation-overview-git-diff-stats.js +37 -0
  965. package/dist/hooks/use-conversation-overview-git-diff-stats.js.map +1 -0
  966. package/dist/hooks/use-conversation-overview-panel-peek.cjs +2 -0
  967. package/dist/hooks/use-conversation-overview-panel-peek.cjs.map +1 -0
  968. package/dist/hooks/use-conversation-overview-panel-peek.d.ts +9 -0
  969. package/dist/hooks/use-conversation-overview-panel-peek.js +32 -0
  970. package/dist/hooks/use-conversation-overview-panel-peek.js.map +1 -0
  971. package/dist/hooks/use-conversation-overview-stats.cjs +2 -0
  972. package/dist/hooks/use-conversation-overview-stats.cjs.map +1 -0
  973. package/dist/hooks/use-conversation-overview-stats.d.ts +4 -0
  974. package/dist/hooks/use-conversation-overview-stats.js +15 -0
  975. package/dist/hooks/use-conversation-overview-stats.js.map +1 -0
  976. package/dist/hooks/use-conversation-primary-repository.cjs +2 -0
  977. package/dist/hooks/use-conversation-primary-repository.cjs.map +1 -0
  978. package/dist/hooks/use-conversation-primary-repository.d.ts +11 -0
  979. package/dist/hooks/use-conversation-primary-repository.js +17 -0
  980. package/dist/hooks/use-conversation-primary-repository.js.map +1 -0
  981. package/dist/hooks/use-drag-scroll.cjs +2 -0
  982. package/dist/hooks/use-drag-scroll.cjs.map +1 -0
  983. package/dist/hooks/use-drag-scroll.d.ts +12 -0
  984. package/dist/hooks/use-drag-scroll.js +41 -0
  985. package/dist/hooks/use-drag-scroll.js.map +1 -0
  986. package/dist/hooks/use-has-permission.cjs +2 -0
  987. package/dist/hooks/use-has-permission.cjs.map +1 -0
  988. package/dist/hooks/use-has-permission.js +8 -0
  989. package/dist/hooks/use-has-permission.js.map +1 -0
  990. package/dist/hooks/use-home-automation-actions.cjs +2 -0
  991. package/dist/hooks/use-home-automation-actions.cjs.map +1 -0
  992. package/dist/hooks/use-home-automation-actions.js +15 -0
  993. package/dist/hooks/use-home-automation-actions.js.map +1 -0
  994. package/dist/hooks/use-launch-skill-in-chat.cjs +2 -0
  995. package/dist/hooks/use-launch-skill-in-chat.cjs.map +1 -0
  996. package/dist/hooks/use-launch-skill-in-chat.js +16 -0
  997. package/dist/hooks/use-launch-skill-in-chat.js.map +1 -0
  998. package/dist/hooks/use-mcp-server-health.cjs +1 -1
  999. package/dist/hooks/use-mcp-server-health.js +3 -3
  1000. package/dist/hooks/use-resizable-drawer-width.cjs +2 -0
  1001. package/dist/hooks/use-resizable-drawer-width.cjs.map +1 -0
  1002. package/dist/hooks/use-resizable-drawer-width.d.ts +22 -0
  1003. package/dist/hooks/use-resizable-drawer-width.js +46 -0
  1004. package/dist/hooks/use-resizable-drawer-width.js.map +1 -0
  1005. package/dist/hooks/use-responder-url-secret.cjs +2 -0
  1006. package/dist/hooks/use-responder-url-secret.cjs.map +1 -0
  1007. package/dist/hooks/use-responder-url-secret.d.ts +5 -0
  1008. package/dist/hooks/use-responder-url-secret.js +51 -0
  1009. package/dist/hooks/use-responder-url-secret.js.map +1 -0
  1010. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  1011. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  1012. package/dist/hooks/use-select-conversation-tab.d.ts +2 -0
  1013. package/dist/hooks/use-select-conversation-tab.js +15 -7
  1014. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  1015. package/dist/hooks/use-tracking.cjs +1 -1
  1016. package/dist/hooks/use-tracking.cjs.map +1 -1
  1017. package/dist/hooks/use-tracking.d.ts +23 -0
  1018. package/dist/hooks/use-tracking.js +16 -0
  1019. package/dist/hooks/use-tracking.js.map +1 -1
  1020. package/dist/hooks/use-websocket.cjs +1 -1
  1021. package/dist/hooks/use-websocket.cjs.map +1 -1
  1022. package/dist/hooks/use-websocket.d.ts +1 -2
  1023. package/dist/hooks/use-websocket.js +58 -51
  1024. package/dist/hooks/use-websocket.js.map +1 -1
  1025. package/dist/i18n/declaration.cjs +1 -1
  1026. package/dist/i18n/declaration.cjs.map +1 -1
  1027. package/dist/i18n/declaration.d.ts +182 -43
  1028. package/dist/i18n/declaration.js +1 -1
  1029. package/dist/i18n/declaration.js.map +1 -1
  1030. package/dist/i18n/translation.cjs +3 -3
  1031. package/dist/i18n/translation.cjs.map +1 -1
  1032. package/dist/i18n/translation.js +3092 -729
  1033. package/dist/i18n/translation.js.map +1 -1
  1034. package/dist/icons/check-circle.cjs +2 -0
  1035. package/dist/icons/check-circle.cjs.map +1 -0
  1036. package/dist/icons/check-circle.js +20 -0
  1037. package/dist/icons/check-circle.js.map +1 -0
  1038. package/dist/icons/chevron-down.cjs +2 -0
  1039. package/dist/icons/chevron-down.cjs.map +1 -0
  1040. package/dist/icons/chevron-down.js +20 -0
  1041. package/dist/icons/chevron-down.js.map +1 -0
  1042. package/dist/icons/clock.cjs +2 -0
  1043. package/dist/icons/clock.cjs.map +1 -0
  1044. package/dist/icons/clock.js +20 -0
  1045. package/dist/icons/clock.js.map +1 -0
  1046. package/dist/icons/exclamation-circle.cjs +2 -0
  1047. package/dist/icons/exclamation-circle.cjs.map +1 -0
  1048. package/dist/icons/exclamation-circle.js +20 -0
  1049. package/dist/icons/exclamation-circle.js.map +1 -0
  1050. package/dist/icons/kebab-vertical.cjs +2 -0
  1051. package/dist/icons/kebab-vertical.cjs.map +1 -0
  1052. package/dist/icons/kebab-vertical.js +14 -0
  1053. package/dist/icons/kebab-vertical.js.map +1 -0
  1054. package/dist/icons/key.cjs +2 -0
  1055. package/dist/icons/key.cjs.map +1 -0
  1056. package/dist/icons/key.js +21 -0
  1057. package/dist/icons/key.js.map +1 -0
  1058. package/dist/icons/message-square-share.cjs +2 -0
  1059. package/dist/icons/message-square-share.cjs.map +1 -0
  1060. package/dist/icons/message-square-share.js +22 -0
  1061. package/dist/icons/message-square-share.js.map +1 -0
  1062. package/dist/icons/play.cjs +2 -0
  1063. package/dist/icons/play.cjs.map +1 -0
  1064. package/dist/icons/play.js +19 -0
  1065. package/dist/icons/play.js.map +1 -0
  1066. package/dist/icons/power.cjs +2 -0
  1067. package/dist/icons/power.cjs.map +1 -0
  1068. package/dist/icons/power.js +20 -0
  1069. package/dist/icons/power.js.map +1 -0
  1070. package/dist/icons/sparkle.cjs +2 -0
  1071. package/dist/icons/sparkle.cjs.map +1 -0
  1072. package/dist/icons/sparkle.js +20 -0
  1073. package/dist/icons/sparkle.js.map +1 -0
  1074. package/dist/icons/trash.cjs +2 -0
  1075. package/dist/icons/trash.cjs.map +1 -0
  1076. package/dist/icons/trash.js +20 -0
  1077. package/dist/icons/trash.js.map +1 -0
  1078. package/dist/icons/x-circle.cjs +2 -0
  1079. package/dist/icons/x-circle.cjs.map +1 -0
  1080. package/dist/icons/x-circle.js +20 -0
  1081. package/dist/icons/x-circle.js.map +1 -0
  1082. package/dist/locales/ar/openhands.json +183 -44
  1083. package/dist/locales/ca/openhands.json +183 -44
  1084. package/dist/locales/de/openhands.json +183 -44
  1085. package/dist/locales/en/openhands.json +183 -44
  1086. package/dist/locales/es/openhands.json +183 -44
  1087. package/dist/locales/fr/openhands.json +183 -44
  1088. package/dist/locales/it/openhands.json +183 -44
  1089. package/dist/locales/ja/openhands.json +183 -44
  1090. package/dist/locales/ko-KR/openhands.json +183 -44
  1091. package/dist/locales/no/openhands.json +183 -44
  1092. package/dist/locales/pt/openhands.json +183 -44
  1093. package/dist/locales/tr/openhands.json +183 -44
  1094. package/dist/locales/uk/openhands.json +183 -44
  1095. package/dist/locales/zh-CN/openhands.json +183 -44
  1096. package/dist/locales/zh-TW/openhands.json +183 -44
  1097. package/dist/manifests/automation-insights.cjs +2 -0
  1098. package/dist/manifests/automation-insights.cjs.map +1 -0
  1099. package/dist/manifests/automation-insights.d.ts +2 -0
  1100. package/dist/manifests/automation-insights.js +9 -0
  1101. package/dist/manifests/automation-insights.js.map +1 -0
  1102. package/dist/manifests/automation-interface.cjs +1 -1
  1103. package/dist/manifests/automation-interface.cjs.map +1 -1
  1104. package/dist/manifests/automation-interface.d.ts +47 -31
  1105. package/dist/manifests/automation-interface.js +48 -54
  1106. package/dist/manifests/automation-interface.js.map +1 -1
  1107. package/dist/manifests/automation-setup.cjs +1 -1
  1108. package/dist/manifests/automation-setup.cjs.map +1 -1
  1109. package/dist/manifests/automation-setup.d.ts +37 -3
  1110. package/dist/manifests/automation-setup.js +16 -2
  1111. package/dist/manifests/automation-setup.js.map +1 -1
  1112. package/dist/manifests/interface-validation.cjs +1 -1
  1113. package/dist/manifests/interface-validation.cjs.map +1 -1
  1114. package/dist/manifests/interface-validation.js +56 -52
  1115. package/dist/manifests/interface-validation.js.map +1 -1
  1116. package/dist/manifests/manifest-actions.d.ts +5 -0
  1117. package/dist/manifests/manifest-bundle.d.ts +30 -0
  1118. package/dist/manifests/manifest-local-validation.d.ts +10 -1
  1119. package/dist/manifests/manifest-sources.cjs +1 -1
  1120. package/dist/manifests/manifest-sources.cjs.map +1 -1
  1121. package/dist/manifests/manifest-sources.js +3 -3
  1122. package/dist/manifests/manifest-sources.js.map +1 -1
  1123. package/dist/manifests/manifest-template.d.ts +14 -0
  1124. package/dist/manifests/manifest-validation.cjs +1 -1
  1125. package/dist/manifests/manifest-validation.cjs.map +1 -1
  1126. package/dist/manifests/manifest-validation.js +78 -45
  1127. package/dist/manifests/manifest-validation.js.map +1 -1
  1128. package/dist/manifests/types.cjs +1 -1
  1129. package/dist/manifests/types.cjs.map +1 -1
  1130. package/dist/manifests/types.d.ts +64 -3
  1131. package/dist/manifests/types.js +7 -6
  1132. package/dist/manifests/types.js.map +1 -1
  1133. package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.cjs +1 -1
  1134. package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.js +10 -10
  1135. package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.cjs +1 -1
  1136. package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.js +8 -8
  1137. package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs +1 -1
  1138. package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.js +9 -9
  1139. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +4843 -0
  1140. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -0
  1141. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +11 -0
  1142. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -0
  1143. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +13 -0
  1144. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -0
  1145. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +87 -0
  1146. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -0
  1147. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +12 -0
  1148. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -0
  1149. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +98 -0
  1150. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -0
  1151. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -7
  1152. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  1153. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +32 -13
  1154. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  1155. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +2 -2
  1156. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
  1157. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +29 -34
  1158. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
  1159. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +3 -3
  1160. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -1
  1161. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +2 -2
  1162. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -1
  1163. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +14 -0
  1164. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -0
  1165. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +72 -0
  1166. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -0
  1167. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  1168. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  1169. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +16 -10
  1170. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  1171. package/dist/node_modules/@openhands/extensions/automations/index.cjs +1 -1
  1172. package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -1
  1173. package/dist/node_modules/@openhands/extensions/automations/index.js +18 -13
  1174. package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -1
  1175. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  1176. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  1177. package/dist/node_modules/@openhands/extensions/automations/interface.js +6 -2
  1178. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  1179. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
  1180. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
  1181. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +36 -3
  1182. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
  1183. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs +2 -0
  1184. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs.map +1 -0
  1185. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js +75 -0
  1186. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js.map +1 -0
  1187. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  1188. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  1189. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +68 -66
  1190. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  1191. package/dist/node_modules/@openhands/extensions/skills/index.cjs +1002 -47
  1192. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  1193. package/dist/node_modules/@openhands/extensions/skills/index.js +59 -17
  1194. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  1195. package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs +2 -0
  1196. package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs.map +1 -0
  1197. package/dist/node_modules/lucide-react/dist/esm/icons/activity.js +9 -0
  1198. package/dist/node_modules/lucide-react/dist/esm/icons/activity.js.map +1 -0
  1199. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs +2 -0
  1200. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs.map +1 -0
  1201. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js +12 -0
  1202. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js.map +1 -0
  1203. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
  1204. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
  1205. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
  1206. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  1207. package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs +2 -0
  1208. package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs.map +1 -0
  1209. package/dist/node_modules/lucide-react/dist/esm/icons/download.js +19 -0
  1210. package/dist/node_modules/lucide-react/dist/esm/icons/download.js.map +1 -0
  1211. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs +2 -0
  1212. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs.map +1 -0
  1213. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +27 -0
  1214. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +1 -0
  1215. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs +2 -0
  1216. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs.map +1 -0
  1217. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js +27 -0
  1218. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js.map +1 -0
  1219. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs +2 -0
  1220. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs.map +1 -0
  1221. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js +12 -0
  1222. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js.map +1 -0
  1223. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs +2 -0
  1224. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs.map +1 -0
  1225. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js +39 -0
  1226. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js.map +1 -0
  1227. package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs +2 -0
  1228. package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs.map +1 -0
  1229. package/dist/node_modules/lucide-react/dist/esm/icons/library.js +23 -0
  1230. package/dist/node_modules/lucide-react/dist/esm/icons/library.js.map +1 -0
  1231. package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs +2 -0
  1232. package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs.map +1 -0
  1233. package/dist/node_modules/lucide-react/dist/esm/icons/package.js +23 -0
  1234. package/dist/node_modules/lucide-react/dist/esm/icons/package.js.map +1 -0
  1235. package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs +2 -0
  1236. package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs.map +1 -0
  1237. package/dist/node_modules/lucide-react/dist/esm/icons/palette.js +39 -0
  1238. package/dist/node_modules/lucide-react/dist/esm/icons/palette.js.map +1 -0
  1239. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs +2 -0
  1240. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs.map +1 -0
  1241. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js +12 -0
  1242. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js.map +1 -0
  1243. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs +2 -0
  1244. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs.map +1 -0
  1245. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js +12 -0
  1246. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js.map +1 -0
  1247. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs +2 -0
  1248. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs.map +1 -0
  1249. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js +25 -0
  1250. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js.map +1 -0
  1251. package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs +2 -0
  1252. package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs.map +1 -0
  1253. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +27 -0
  1254. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js.map +1 -0
  1255. package/dist/package.cjs +1 -1
  1256. package/dist/package.cjs.map +1 -1
  1257. package/dist/package.js +3 -3
  1258. package/dist/package.js.map +1 -1
  1259. package/dist/routes/app-settings.cjs +1 -1
  1260. package/dist/routes/app-settings.cjs.map +1 -1
  1261. package/dist/routes/app-settings.js +87 -85
  1262. package/dist/routes/app-settings.js.map +1 -1
  1263. package/dist/routes/commits-tab.cjs +1 -1
  1264. package/dist/routes/commits-tab.cjs.map +1 -1
  1265. package/dist/routes/commits-tab.js +27 -21
  1266. package/dist/routes/commits-tab.js.map +1 -1
  1267. package/dist/routes/conversation.cjs +1 -1
  1268. package/dist/routes/conversation.cjs.map +1 -1
  1269. package/dist/routes/conversation.js +56 -55
  1270. package/dist/routes/conversation.js.map +1 -1
  1271. package/dist/routes/files-tab.cjs +1 -1
  1272. package/dist/routes/files-tab.cjs.map +1 -1
  1273. package/dist/routes/files-tab.d.ts +4 -0
  1274. package/dist/routes/files-tab.js +121 -151
  1275. package/dist/routes/files-tab.js.map +1 -1
  1276. package/dist/routes/llm-settings.cjs +1 -1
  1277. package/dist/routes/llm-settings.cjs.map +1 -1
  1278. package/dist/routes/llm-settings.d.ts +9 -1
  1279. package/dist/routes/llm-settings.js +137 -107
  1280. package/dist/routes/llm-settings.js.map +1 -1
  1281. package/dist/routes/mcp.cjs +1 -1
  1282. package/dist/routes/mcp.cjs.map +1 -1
  1283. package/dist/routes/mcp.js +20 -20
  1284. package/dist/routes/secrets-settings.cjs +1 -1
  1285. package/dist/routes/secrets-settings.js +15 -15
  1286. package/dist/services/settings.cjs +1 -1
  1287. package/dist/services/settings.cjs.map +1 -1
  1288. package/dist/services/settings.js +2 -2
  1289. package/dist/services/settings.js.map +1 -1
  1290. package/dist/services/telemetry.cjs +1 -1
  1291. package/dist/services/telemetry.cjs.map +1 -1
  1292. package/dist/services/telemetry.js +47 -51
  1293. package/dist/services/telemetry.js.map +1 -1
  1294. package/dist/stores/conversation-store.cjs +1 -1
  1295. package/dist/stores/conversation-store.cjs.map +1 -1
  1296. package/dist/stores/conversation-store.d.ts +8 -1
  1297. package/dist/stores/conversation-store.js +9 -0
  1298. package/dist/stores/conversation-store.js.map +1 -1
  1299. package/dist/stores/error-message-store.cjs +1 -1
  1300. package/dist/stores/error-message-store.cjs.map +1 -1
  1301. package/dist/stores/error-message-store.d.ts +3 -1
  1302. package/dist/stores/error-message-store.js +5 -3
  1303. package/dist/stores/error-message-store.js.map +1 -1
  1304. package/dist/stores/files-tab-store.cjs +1 -1
  1305. package/dist/stores/files-tab-store.cjs.map +1 -1
  1306. package/dist/stores/files-tab-store.d.ts +13 -0
  1307. package/dist/stores/files-tab-store.js +49 -5
  1308. package/dist/stores/files-tab-store.js.map +1 -1
  1309. package/dist/stores/use-event-store.cjs +1 -1
  1310. package/dist/stores/use-event-store.cjs.map +1 -1
  1311. package/dist/stores/use-event-store.js +11 -11
  1312. package/dist/stores/use-event-store.js.map +1 -1
  1313. package/dist/types/agent-server/core/events/message-event.d.ts +2 -2
  1314. package/dist/types/automation.cjs +2 -0
  1315. package/dist/types/automation.cjs.map +1 -0
  1316. package/dist/types/automation.js +8 -0
  1317. package/dist/types/automation.js.map +1 -0
  1318. package/dist/types/git-sync.d.ts +51 -0
  1319. package/dist/utils/automation-catalog.cjs +1 -1
  1320. package/dist/utils/automation-catalog.cjs.map +1 -1
  1321. package/dist/utils/automation-catalog.d.ts +12 -0
  1322. package/dist/utils/automation-catalog.js +20 -1
  1323. package/dist/utils/automation-catalog.js.map +1 -1
  1324. package/dist/utils/automation-schedule.cjs +2 -0
  1325. package/dist/utils/automation-schedule.cjs.map +1 -0
  1326. package/dist/utils/automation-schedule.js +8 -0
  1327. package/dist/utils/automation-schedule.js.map +1 -0
  1328. package/dist/utils/automation-stack-section.cjs +2 -0
  1329. package/dist/utils/automation-stack-section.cjs.map +1 -0
  1330. package/dist/utils/automation-stack-section.d.ts +2 -0
  1331. package/dist/utils/automation-stack-section.js +6 -0
  1332. package/dist/utils/automation-stack-section.js.map +1 -0
  1333. package/dist/utils/constants.cjs +1 -1
  1334. package/dist/utils/constants.cjs.map +1 -1
  1335. package/dist/utils/constants.js +4 -0
  1336. package/dist/utils/constants.js.map +1 -1
  1337. package/dist/utils/conversation-local-storage.cjs +1 -1
  1338. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  1339. package/dist/utils/conversation-local-storage.d.ts +17 -4
  1340. package/dist/utils/conversation-local-storage.js +111 -63
  1341. package/dist/utils/conversation-local-storage.js.map +1 -1
  1342. package/dist/utils/conversation-metrics.cjs +1 -1
  1343. package/dist/utils/conversation-metrics.cjs.map +1 -1
  1344. package/dist/utils/conversation-metrics.d.ts +3 -2
  1345. package/dist/utils/conversation-metrics.js +16 -14
  1346. package/dist/utils/conversation-metrics.js.map +1 -1
  1347. package/dist/utils/conversation-overview-project-scope.cjs +2 -0
  1348. package/dist/utils/conversation-overview-project-scope.cjs.map +1 -0
  1349. package/dist/utils/conversation-overview-project-scope.d.ts +16 -0
  1350. package/dist/utils/conversation-overview-project-scope.js +22 -0
  1351. package/dist/utils/conversation-overview-project-scope.js.map +1 -0
  1352. package/dist/utils/error-handler.cjs +1 -1
  1353. package/dist/utils/error-handler.cjs.map +1 -1
  1354. package/dist/utils/error-handler.d.ts +3 -2
  1355. package/dist/utils/error-handler.js +18 -5
  1356. package/dist/utils/error-handler.js.map +1 -1
  1357. package/dist/utils/extension-module-card-classes.cjs +1 -1
  1358. package/dist/utils/extension-module-card-classes.cjs.map +1 -1
  1359. package/dist/utils/extension-module-card-classes.d.ts +1 -1
  1360. package/dist/utils/extension-module-card-classes.js +2 -2
  1361. package/dist/utils/extension-module-card-classes.js.map +1 -1
  1362. package/dist/utils/format-model-name.cjs +1 -1
  1363. package/dist/utils/format-model-name.cjs.map +1 -1
  1364. package/dist/utils/format-model-name.d.ts +1 -0
  1365. package/dist/utils/format-model-name.js +1 -0
  1366. package/dist/utils/format-model-name.js.map +1 -1
  1367. package/dist/utils/format-relative-time.cjs +2 -0
  1368. package/dist/utils/format-relative-time.cjs.map +1 -0
  1369. package/dist/utils/format-relative-time.js +17 -0
  1370. package/dist/utils/format-relative-time.js.map +1 -0
  1371. package/dist/utils/git-diff-stats.cjs +5 -0
  1372. package/dist/utils/git-diff-stats.cjs.map +1 -0
  1373. package/dist/utils/git-diff-stats.d.ts +9 -0
  1374. package/dist/utils/git-diff-stats.js +53 -0
  1375. package/dist/utils/git-diff-stats.js.map +1 -0
  1376. package/dist/utils/handle-event-for-ui.cjs +1 -1
  1377. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  1378. package/dist/utils/handle-event-for-ui.js +13 -11
  1379. package/dist/utils/handle-event-for-ui.js.map +1 -1
  1380. package/dist/utils/mcp-credential-validation.cjs +1 -1
  1381. package/dist/utils/mcp-credential-validation.js +3 -3
  1382. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  1383. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  1384. package/dist/utils/mcp-marketplace-utils.js +22 -9
  1385. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  1386. package/dist/utils/parse-git-remote-url.cjs +1 -1
  1387. package/dist/utils/parse-git-remote-url.cjs.map +1 -1
  1388. package/dist/utils/parse-git-remote-url.js +6 -7
  1389. package/dist/utils/parse-git-remote-url.js.map +1 -1
  1390. package/dist/utils/recommended-automation-rail.cjs +2 -0
  1391. package/dist/utils/recommended-automation-rail.cjs.map +1 -0
  1392. package/dist/utils/recommended-automation-rail.d.ts +22 -0
  1393. package/dist/utils/recommended-automation-rail.js +44 -0
  1394. package/dist/utils/recommended-automation-rail.js.map +1 -0
  1395. package/dist/utils/responder-deployment.cjs +2 -0
  1396. package/dist/utils/responder-deployment.cjs.map +1 -0
  1397. package/dist/utils/responder-deployment.js +42 -0
  1398. package/dist/utils/responder-deployment.js.map +1 -0
  1399. package/dist/utils/scroll-fade-state.cjs +2 -0
  1400. package/dist/utils/scroll-fade-state.cjs.map +1 -0
  1401. package/dist/utils/scroll-fade-state.d.ts +6 -0
  1402. package/dist/utils/scroll-fade-state.js +13 -0
  1403. package/dist/utils/scroll-fade-state.js.map +1 -0
  1404. package/dist/utils/skill-category.cjs +2 -0
  1405. package/dist/utils/skill-category.cjs.map +1 -0
  1406. package/dist/utils/skill-category.js +51 -0
  1407. package/dist/utils/skill-category.js.map +1 -0
  1408. package/dist/utils/skill-scope.cjs +1 -1
  1409. package/dist/utils/skill-scope.cjs.map +1 -1
  1410. package/dist/utils/skill-scope.js +1 -1
  1411. package/dist/utils/skill-scope.js.map +1 -1
  1412. package/dist/utils/streaming-delta-batcher.cjs +2 -0
  1413. package/dist/utils/streaming-delta-batcher.cjs.map +1 -0
  1414. package/dist/utils/streaming-delta-batcher.d.ts +21 -0
  1415. package/dist/utils/streaming-delta-batcher.js +31 -0
  1416. package/dist/utils/streaming-delta-batcher.js.map +1 -0
  1417. package/dist/utils/tar-gzip.d.ts +26 -0
  1418. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  1419. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  1420. package/dist/utils/transcript-export/load-complete-events.js +24 -16
  1421. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  1422. package/dist/utils/utils.cjs +1 -1
  1423. package/dist/utils/utils.cjs.map +1 -1
  1424. package/dist/utils/utils.d.ts +1 -41
  1425. package/dist/utils/utils.js +27 -6
  1426. package/dist/utils/utils.js.map +1 -1
  1427. package/dist/utils/websocket-handshake.cjs +2 -0
  1428. package/dist/utils/websocket-handshake.cjs.map +1 -0
  1429. package/dist/utils/websocket-handshake.d.ts +11 -0
  1430. package/dist/utils/websocket-handshake.js +12 -0
  1431. package/dist/utils/websocket-handshake.js.map +1 -0
  1432. package/package.json +3 -3
  1433. package/scripts/check-translation-completeness.cjs +7 -0
  1434. package/scripts/dev-static.mjs +49 -43
  1435. package/scripts/dev-with-automation.mjs +111 -14
  1436. package/scripts/seed-automation-ux-data.mjs +810 -0
  1437. package/build/assets/acp-providers-D1PORKc0.js +0 -1
  1438. package/build/assets/active-backend-context-IqOjobNK.js +0 -2
  1439. package/build/assets/agent-context-settings-DMrObcIS.js +0 -1
  1440. package/build/assets/agent-profiles-settings-DororXN5.js +0 -1
  1441. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +0 -86
  1442. package/build/assets/agent-settings-BJVk92PU.js +0 -2
  1443. package/build/assets/agent-settings-COfJsQ1d.js +0 -1
  1444. package/build/assets/alert-banner-CzZsm7ms.js +0 -1
  1445. package/build/assets/api-key-entry-screen-D8Fade_-.js +0 -1
  1446. package/build/assets/app-settings-CpyGB3AT.js +0 -1
  1447. package/build/assets/automation-detail-B-jQ39Mm.js +0 -3
  1448. package/build/assets/automation-export-B1dywoqk.js +0 -2
  1449. package/build/assets/automation-setup-route-C-bWUZBi.js +0 -1
  1450. package/build/assets/automation-templates-DgpCGOJV.js +0 -1
  1451. package/build/assets/automations-list-DnMxlxsL.js +0 -1
  1452. package/build/assets/back-nav-button-HHEneWMw.js +0 -1
  1453. package/build/assets/backend-form-modal-DiVrD4Cm.js +0 -1
  1454. package/build/assets/backend-synced-settings-badge-7MIjpr8M.js +0 -1
  1455. package/build/assets/badge-CpYmcVZV.js +0 -1
  1456. package/build/assets/base-modal-Fnh6Uln9.js +0 -1
  1457. package/build/assets/bot-BQZx8e2i.js +0 -1
  1458. package/build/assets/brand-button-swT1RyO0.js +0 -1
  1459. package/build/assets/browser-B9AbV6kG.js +0 -7
  1460. package/build/assets/browser-tab-zAY12m_i.js +0 -1
  1461. package/build/assets/chat-send-button-DsJtivmL.js +0 -1
  1462. package/build/assets/check-WAFXrrs_.js +0 -1
  1463. package/build/assets/chevron-down-CifNWzme.js +0 -1
  1464. package/build/assets/circle-check-CtnimJa8.js +0 -1
  1465. package/build/assets/circle-plus-check-toggle-Cuzx55bo.js +0 -1
  1466. package/build/assets/cloud-funnel-analytics-86CwNdSh.js +0 -1
  1467. package/build/assets/combobox-caret-D0fRotFi.js +0 -1
  1468. package/build/assets/command-menu-BXy03FBl.js +0 -1
  1469. package/build/assets/condenser-settings-BmZa0ui_.js +0 -1
  1470. package/build/assets/confirmation-modal-BgoN6lbN.js +0 -1
  1471. package/build/assets/context-menu-list-item-Bq02tc-P.js +0 -1
  1472. package/build/assets/conversation-BPo8SvLN.js +0 -1
  1473. package/build/assets/conversation-CPCVsCUY.js +0 -90
  1474. package/build/assets/conversation-panel-BPo8SvLN.js +0 -1
  1475. package/build/assets/conversation-state-store-C5YpjMNy.js +0 -1
  1476. package/build/assets/conversation-store-Blc5xysY.js +0 -6
  1477. package/build/assets/conversation-tab-empty-state-CMqo_0Bd.js +0 -1
  1478. package/build/assets/copy-to-clipboard-button-Cg1pF0xn.js +0 -1
  1479. package/build/assets/device-verify-BfQLgNyq.js +0 -1
  1480. package/build/assets/dropdown-classes-BIqQr5mx.js +0 -1
  1481. package/build/assets/entry.client-CxFjRYqH.js +0 -2
  1482. package/build/assets/enum-filter-dropdown-C_yV4_bo.js +0 -1
  1483. package/build/assets/environment-switch-overlay-Bi4qbh2g.js +0 -1
  1484. package/build/assets/extension-module-card-classes-Bo43vY5V.js +0 -1
  1485. package/build/assets/extensions-hub-BqUINAhp.js +0 -1
  1486. package/build/assets/extensions-navigation-lraj88Wk.js +0 -1
  1487. package/build/assets/external-link-CgtpA_a1.js +0 -1
  1488. package/build/assets/file-text-DEK4LSVw.js +0 -1
  1489. package/build/assets/files-tab-DV0L-lFE.js +0 -1
  1490. package/build/assets/form-control-classes-7yFSQJq_.js +0 -1
  1491. package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
  1492. package/build/assets/format-relative-time-DSErAuVr.js +0 -1
  1493. package/build/assets/git-provider-icon-BvlLAche.js +0 -1
  1494. package/build/assets/git-repo-dropdown-ByMzpNko.js +0 -1
  1495. package/build/assets/git-repo-dropdown-C6R7hgM8.js +0 -1
  1496. package/build/assets/highlighted-source-view-C_sfncLZ.js +0 -1
  1497. package/build/assets/home-BOrlwLqG.js +0 -1
  1498. package/build/assets/home-BvMNC6E-.js +0 -1
  1499. package/build/assets/home-store-CxqsY9Fi.js +0 -1
  1500. package/build/assets/index-home-BvMNC6E-.js +0 -1
  1501. package/build/assets/info-BRVcJAUg.js +0 -1
  1502. package/build/assets/install-server-modal-Bl4G1zF4.js +0 -1
  1503. package/build/assets/kebab-menu-item-content-BGoGFEAg.js +0 -1
  1504. package/build/assets/launch-CkqiSCqi.js +0 -1
  1505. package/build/assets/list-todo-DNWlzfaM.js +0 -1
  1506. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +0 -27
  1507. package/build/assets/llm-settings-B-pkVCrt.js +0 -1
  1508. package/build/assets/llm-settings-DSC0-IQ7.js +0 -1
  1509. package/build/assets/llm-subscription-service-BAdOl5Xx.js +0 -1
  1510. package/build/assets/loader-circle-B47W9XqT.js +0 -1
  1511. package/build/assets/loading-spinner-xhnrGP4Y.js +0 -1
  1512. package/build/assets/manage-backends-modal-DhGk5mJt.js +0 -1
  1513. package/build/assets/manifest-653b89aa.js +0 -1
  1514. package/build/assets/manifest-subpage-layout-CKWvL2ig.js +0 -1
  1515. package/build/assets/map-provider-Mx8mZuE-.js +0 -1
  1516. package/build/assets/markdown-renderer-DUmk7pFc.js +0 -8
  1517. package/build/assets/mcp-DCkvl6K0.js +0 -9
  1518. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +0 -1
  1519. package/build/assets/messages-DSXvyc21.js +0 -40
  1520. package/build/assets/modal-body-gIe21fDv.js +0 -1
  1521. package/build/assets/modal-classes-D66dlgZ7.js +0 -1
  1522. package/build/assets/modal-close-button-B6iOGYpI.js +0 -1
  1523. package/build/assets/mouse-pointer-click-BYX1Pw5W.js +0 -1
  1524. package/build/assets/npm-DLckoeJc.js +0 -1
  1525. package/build/assets/onboarding-D7WDG66N.js +0 -1
  1526. package/build/assets/onboarding-modal-C_xVrFNv.js +0 -1
  1527. package/build/assets/organization-service.api-D-s9z18a.js +0 -1
  1528. package/build/assets/pencil-BGOCPRyu.js +0 -1
  1529. package/build/assets/planner-tab-AKaXIIfg.js +0 -1
  1530. package/build/assets/plugins-management-service-wtmY4QQw.js +0 -1
  1531. package/build/assets/plus-zNEL8rcX.js +0 -1
  1532. package/build/assets/profiles-service.api-DCMYxHMi.js +0 -1
  1533. package/build/assets/providers-BjrtjX4L.js +0 -1
  1534. package/build/assets/proxy-9Z_WZggZ.js +0 -1
  1535. package/build/assets/puzzle-BWLmN8z4.js +0 -1
  1536. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +0 -1
  1537. package/build/assets/refresh-cw-CXtFWpwv.js +0 -1
  1538. package/build/assets/root-CanxKlNV.css +0 -1
  1539. package/build/assets/root-DkfG_UWR.js +0 -2
  1540. package/build/assets/root-layout-D75LHYhh.js +0 -2
  1541. package/build/assets/schema-field-OnM5Uob_.js +0 -1
  1542. package/build/assets/sdk-section-page-m5WQm2sy.js +0 -1
  1543. package/build/assets/search-CycosyjN.js +0 -1
  1544. package/build/assets/secrets-service-B26R61C1.js +0 -1
  1545. package/build/assets/secrets-settings-CbLYCKOX.js +0 -1
  1546. package/build/assets/segmented-toggle-DCspm2U5.js +0 -1
  1547. package/build/assets/settings-BJQI_iBM.js +0 -1
  1548. package/build/assets/settings-CWFxymAf.js +0 -1
  1549. package/build/assets/settings-dropdown-input-BI8V_Nov.js +0 -1
  1550. package/build/assets/settings-index-BiTqJoH7.js +0 -1
  1551. package/build/assets/settings-input-Cz62hWVW.js +0 -1
  1552. package/build/assets/settings-list-classes-z_3FW5H3.js +0 -1
  1553. package/build/assets/settings-modal-BIrIVn97.js +0 -1
  1554. package/build/assets/settings-service.api--rJmnuLa.js +0 -1
  1555. package/build/assets/settings-switch-BRsSI8Vs.js +0 -1
  1556. package/build/assets/settings-utils-Ba7vel6T.js +0 -1
  1557. package/build/assets/shared-conversation-CQK_PqHx.js +0 -1
  1558. package/build/assets/shield-check-T3JsDJiM.js +0 -1
  1559. package/build/assets/sidebar-layout-Bhi3hVcu.js +0 -1
  1560. package/build/assets/sidebar-mobile-menu-toggle-YWJNRN4p.js +0 -1
  1561. package/build/assets/sidebar-nav-link-BSUlY5Ml.js +0 -1
  1562. package/build/assets/sidebar-store-Cl1cUv_F.js +0 -1
  1563. package/build/assets/skill-card-pill-row-BXz8L8Rn.js +0 -1
  1564. package/build/assets/skill-icon-badge-QgfKv31M.js +0 -1
  1565. package/build/assets/skill-scope-Dc3JPW-8.js +0 -1
  1566. package/build/assets/skills-plugins-CpTV27n3.js +0 -1
  1567. package/build/assets/skills-settings-CSW__IW4.js +0 -2
  1568. package/build/assets/sparkles-TJ0mdECe.js +0 -1
  1569. package/build/assets/styled-tooltip-BUMSbgrF.js +0 -1
  1570. package/build/assets/task-list-tab-mAHMOkUz.js +0 -1
  1571. package/build/assets/terminal-BzxBaHx2.js +0 -3
  1572. package/build/assets/toggle-switch-O5v1FgxW.js +0 -1
  1573. package/build/assets/trash-2-C0xNVp9c.js +0 -1
  1574. package/build/assets/typography-NOKSk9_R.js +0 -1
  1575. package/build/assets/usage-tab-tEmVN0KD.js +0 -1
  1576. package/build/assets/use-acp-credential-form-BPNi0Zbm.js +0 -1
  1577. package/build/assets/use-activate-agent-profile-D9YRQPTF.js +0 -1
  1578. package/build/assets/use-agent-profiles-Cb2zUW3l.js +0 -1
  1579. package/build/assets/use-can-manage-org-profiles-Dxzq2AEd.js +0 -1
  1580. package/build/assets/use-cloud-current-user-id-Co2eJk2A.js +0 -1
  1581. package/build/assets/use-config-DKAMiI5R.js +0 -1
  1582. package/build/assets/use-create-conversation-CoHTiCbI.js +0 -1
  1583. package/build/assets/use-create-secret-2zBlCDsF.js +0 -1
  1584. package/build/assets/use-is-authed-C52-ivnB.js +0 -1
  1585. package/build/assets/use-is-creating-conversation-DdaAE6jV.js +0 -1
  1586. package/build/assets/use-launch-skill-in-chat-COnDpxCQ.js +0 -1
  1587. package/build/assets/use-llm-profiles-C_BHue65.js +0 -1
  1588. package/build/assets/use-manifest-capabilities-DPrQsaPP.js +0 -1
  1589. package/build/assets/use-onboarding-completion-CCE8OQgV.js +0 -1
  1590. package/build/assets/use-plugins-marketplace-CEiak69h.js +0 -1
  1591. package/build/assets/use-save-agent-profile-DK9idD6a.js +0 -1
  1592. package/build/assets/use-save-settings-DNmnbG6f.js +0 -1
  1593. package/build/assets/use-settings-nav-items-BlFL7YhM.js +0 -16
  1594. package/build/assets/use-settings-wCwPaSIv.js +0 -1
  1595. package/build/assets/use-tracking-CVwPmhlX.js +0 -3
  1596. package/build/assets/use-user-conversation-DVtfg0B_.js +0 -1
  1597. package/build/assets/useInfiniteQuery-p1xq35r2.js +0 -1
  1598. package/build/assets/useMutation-BFDQmgk9.js +0 -1
  1599. package/build/assets/useQueries-DF1NAAeC.js +0 -1
  1600. package/build/assets/useQuery-DRv--6bK.js +0 -1
  1601. package/build/assets/utils-zxEjKE70.js +0 -1
  1602. package/build/assets/vendor~browser-B-fae1JU.js +0 -47
  1603. package/build/assets/vendor~entry.client-CgNUwtQL.js +0 -1
  1604. package/build/assets/vendor~entry.client-zSIea5EO.js +0 -9
  1605. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js +0 -186
  1606. package/build/assets/vendor~files-tab-D9wR9yM2.js +0 -11
  1607. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +0 -13
  1608. package/build/assets/vendor~root-layout-C-IgVx6e.js +0 -1
  1609. package/build/assets/vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js +0 -1
  1610. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js +0 -1
  1611. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js +0 -1
  1612. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js +0 -1
  1613. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js +0 -1
  1614. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js +0 -48
  1615. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +0 -73
  1616. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js +0 -7465
  1617. package/build/assets/verification-settings-B8UMQ7MG.js +0 -1
  1618. package/build/assets/wrench-DIka3hCq.js +0 -1
  1619. package/build/assets/x-BWKA2Ver.js +0 -1
  1620. package/build/assets/zap-DHddTPc0.js +0 -1
  1621. package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
  1622. package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
  1623. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
  1624. package/dist/components/conversation-events/index.d.ts +0 -1
  1625. package/dist/components/features/automations/metadata-chip.d.ts +0 -6
  1626. package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
  1627. package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
  1628. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
  1629. package/dist/components/features/controls/tools.d.ts +0 -2
  1630. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
  1631. package/dist/components/features/diff-viewer/empty-changes-message.cjs +0 -2
  1632. package/dist/components/features/diff-viewer/empty-changes-message.cjs.map +0 -1
  1633. package/dist/components/features/diff-viewer/empty-changes-message.js +0 -17
  1634. package/dist/components/features/diff-viewer/empty-changes-message.js.map +0 -1
  1635. package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
  1636. package/dist/components/features/home/home-header/home-header.d.ts +0 -1
  1637. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
  1638. package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
  1639. package/dist/components/features/home/new-conversation.d.ts +0 -1
  1640. package/dist/components/features/home/tasks/task-card.d.ts +0 -6
  1641. package/dist/components/features/home/tasks/task-group.d.ts +0 -7
  1642. package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
  1643. package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
  1644. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
  1645. package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
  1646. package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
  1647. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
  1648. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
  1649. package/dist/components/features/tips/random-tip.cjs +0 -2
  1650. package/dist/components/features/tips/random-tip.cjs.map +0 -1
  1651. package/dist/components/features/tips/random-tip.js +0 -41
  1652. package/dist/components/features/tips/random-tip.js.map +0 -1
  1653. package/dist/hooks/query/use-has-git-commits.cjs +0 -2
  1654. package/dist/hooks/query/use-has-git-commits.cjs.map +0 -1
  1655. package/dist/hooks/query/use-has-git-commits.d.ts +0 -25
  1656. package/dist/hooks/query/use-has-git-commits.js +0 -31
  1657. package/dist/hooks/query/use-has-git-commits.js.map +0 -1
  1658. package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
  1659. package/dist/hooks/use-has-attached-source.cjs +0 -2
  1660. package/dist/hooks/use-has-attached-source.cjs.map +0 -1
  1661. package/dist/hooks/use-has-attached-source.d.ts +0 -18
  1662. package/dist/hooks/use-has-attached-source.js +0 -14
  1663. package/dist/hooks/use-has-attached-source.js.map +0 -1
  1664. package/dist/hooks/use-should-show-user-features.d.ts +0 -1
  1665. package/dist/icons/chveron-up.cjs +0 -2
  1666. package/dist/icons/chveron-up.cjs.map +0 -1
  1667. package/dist/icons/chveron-up.js +0 -21
  1668. package/dist/icons/chveron-up.js.map +0 -1
  1669. package/dist/routes/changes-tab.cjs +0 -2
  1670. package/dist/routes/changes-tab.cjs.map +0 -1
  1671. package/dist/routes/changes-tab.d.ts +0 -3
  1672. package/dist/routes/changes-tab.js +0 -64
  1673. package/dist/routes/changes-tab.js.map +0 -1
  1674. package/dist/ui/card-title.d.ts +0 -16
  1675. package/dist/ui/card.d.ts +0 -14
  1676. package/dist/utils/file-priority.cjs +0 -2
  1677. package/dist/utils/file-priority.cjs.map +0 -1
  1678. package/dist/utils/file-priority.d.ts +0 -27
  1679. package/dist/utils/file-priority.js +0 -61
  1680. package/dist/utils/file-priority.js.map +0 -1
  1681. package/dist/utils/group-suggested-tasks.d.ts +0 -7
  1682. package/dist/utils/table-row-classes.d.ts +0 -9
  1683. package/dist/utils/tips.cjs +0 -2
  1684. package/dist/utils/tips.cjs.map +0 -1
  1685. package/dist/utils/tips.js +0 -45
  1686. package/dist/utils/tips.js.map +0 -1
  1687. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js} +0 -0
  1688. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");var e={WEB_CLIENT_CONFIG:[`web-client-config`],MAIN_APP_COOKIE_AUTH:[`main-app-cookie-auth`]},t={all:[`settings`],byScope:e=>[`settings`,e],personal:()=>[`settings`,`personal`]},n={all:[`llm-profiles`]},r={all:[`agent-profiles`]},i={retry:!1},a={all:[`llm-subscription`],openaiStatus:[`llm-subscription`,`openai`,`status`],openaiModels:[`llm-subscription`,`openai`,`models`]},o={all:[`local-workspaces`]},s={marketplace:[`plugins-marketplace`],installed:[`plugins-installed`],local:[`plugins-local`]},c={latestVersion:[`agent-canvas-latest-version`]},l={staleTime:1e3*60*5,gcTime:1e3*60*15};exports.AGENT_PROFILES_QUERY_KEYS=r,exports.AGENT_PROFILES_RETRY_OPTIONS=i,exports.APP_UPDATE_QUERY_KEYS=c,exports.CONFIG_CACHE_OPTIONS=l,exports.LLM_PROFILES_QUERY_KEYS=n,exports.LLM_SUBSCRIPTION_QUERY_KEYS=a,exports.LOCAL_WORKSPACES_QUERY_KEYS=o,exports.PLUGINS_QUERY_KEYS=s,exports.QUERY_KEYS=e,exports.SETTINGS_QUERY_KEYS=t;
1
+ require("../../_virtual/_rolldown/runtime.cjs");var e={WEB_CLIENT_CONFIG:[`web-client-config`],MAIN_APP_COOKIE_AUTH:[`main-app-cookie-auth`]},t={all:[`settings`],byScope:e=>[`settings`,e],personal:()=>[`settings`,`personal`]},n={all:[`llm-profiles`]},r={all:[`agent-profiles`]},i={all:[`provider-connections`]},a={retry:!1},o={all:[`llm-subscription`],openaiStatus:[`llm-subscription`,`openai`,`status`],openaiModels:[`llm-subscription`,`openai`,`models`]},s={all:[`local-workspaces`]},c={marketplace:[`plugins-marketplace`],installed:[`plugins-installed`],local:[`plugins-local`]},l={latestVersion:[`agent-canvas-latest-version`]},u={staleTime:1e3*60*5,gcTime:1e3*60*15};exports.AGENT_PROFILES_QUERY_KEYS=r,exports.AGENT_PROFILES_RETRY_OPTIONS=a,exports.APP_UPDATE_QUERY_KEYS=l,exports.CONFIG_CACHE_OPTIONS=u,exports.LLM_PROFILES_QUERY_KEYS=n,exports.LLM_SUBSCRIPTION_QUERY_KEYS=o,exports.LOCAL_WORKSPACES_QUERY_KEYS=s,exports.PLUGINS_QUERY_KEYS=c,exports.PROVIDER_CONNECTIONS_QUERY_KEYS=i,exports.QUERY_KEYS=e,exports.SETTINGS_QUERY_KEYS=t;
2
2
  //# sourceMappingURL=query-keys.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-keys.cjs","names":[],"sources":["../../../src/hooks/query/query-keys.ts"],"sourcesContent":["/**\n * Centralized query keys and cache configuration for TanStack Query.\n * Using constants ensures type safety and prevents typos.\n */\n\nimport { SettingsScope } from \"#/types/settings\";\n\nexport const QUERY_KEYS = {\n /** Web client configuration from the server */\n WEB_CLIENT_CONFIG: [\"web-client-config\"] as const,\n /** Same-origin OpenHands app cookie authentication status */\n MAIN_APP_COOKIE_AUTH: [\"main-app-cookie-auth\"] as const,\n} as const;\n\nexport const SETTINGS_QUERY_KEYS = {\n all: [\"settings\"] as const,\n byScope: (scope: SettingsScope) => [\"settings\", scope] as const,\n personal: () => [\"settings\", \"personal\"] as const,\n} as const;\n\nexport const LLM_PROFILES_QUERY_KEYS = {\n all: [\"llm-profiles\"] as const,\n} as const;\n\nexport const AGENT_PROFILES_QUERY_KEYS = {\n all: [\"agent-profiles\"] as const,\n} as const;\n\n/** Fail fast when older backends lack the profile endpoint. */\nexport const AGENT_PROFILES_RETRY_OPTIONS = {\n retry: false,\n} as const;\n\nexport const LLM_SUBSCRIPTION_QUERY_KEYS = {\n all: [\"llm-subscription\"] as const,\n openaiStatus: [\"llm-subscription\", \"openai\", \"status\"] as const,\n openaiModels: [\"llm-subscription\", \"openai\", \"models\"] as const,\n} as const;\n\nexport const LOCAL_WORKSPACES_QUERY_KEYS = {\n all: [\"local-workspaces\"] as const,\n} as const;\n\nexport const PLUGINS_QUERY_KEYS = {\n /** Dynamic marketplace catalog (used by `use-plugins-marketplace`). */\n marketplace: [\"plugins-marketplace\"] as const,\n /** Installed plugins from the local agent-server. */\n installed: [\"plugins-installed\"] as const,\n /** Locally-discovered ambient plugins (used by `use-local-plugins`). */\n local: [\"plugins-local\"] as const,\n} as const;\n\nexport const SETUP_QUERY_KEYS = {\n /** What the deployment supports. The same answer for every setup entry. */\n capabilities: () => [\"setup-capabilities\"] as const,\n} as const;\n\nexport const APP_UPDATE_QUERY_KEYS = {\n /** Latest published @openhands/agent-canvas version (npm `latest` dist-tag). */\n latestVersion: [\"agent-canvas-latest-version\"] as const,\n} as const;\n\n/** Cache configuration shared across all config-related queries */\nexport const CONFIG_CACHE_OPTIONS = {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 15, // 15 minutes\n} as const;\n\nexport type QueryKeys = (typeof QUERY_KEYS)[keyof typeof QUERY_KEYS];\n"],"mappings":"gDAOA,IAAa,EAAa,CAExB,kBAAmB,CAAC,mBAAmB,EAEvC,qBAAsB,CAAC,sBAAsB,CAC/C,EAEa,EAAsB,CACjC,IAAK,CAAC,UAAU,EAChB,QAAU,GAAyB,CAAC,WAAY,CAAK,EACrD,aAAgB,CAAC,WAAY,UAAU,CACzC,EAEa,EAA0B,CACrC,IAAK,CAAC,cAAc,CACtB,EAEa,EAA4B,CACvC,IAAK,CAAC,gBAAgB,CACxB,EAGa,EAA+B,CAC1C,MAAO,EACT,EAEa,EAA8B,CACzC,IAAK,CAAC,kBAAkB,EACxB,aAAc,CAAC,mBAAoB,SAAU,QAAQ,EACrD,aAAc,CAAC,mBAAoB,SAAU,QAAQ,CACvD,EAEa,EAA8B,CACzC,IAAK,CAAC,kBAAkB,CAC1B,EAEa,EAAqB,CAEhC,YAAa,CAAC,qBAAqB,EAEnC,UAAW,CAAC,mBAAmB,EAE/B,MAAO,CAAC,eAAe,CACzB,EAOa,EAAwB,CAEnC,cAAe,CAAC,6BAA6B,CAC/C,EAGa,EAAuB,CAClC,UAAW,IAAO,GAAK,EACvB,OAAQ,IAAO,GAAK,EACtB"}
1
+ {"version":3,"file":"query-keys.cjs","names":[],"sources":["../../../src/hooks/query/query-keys.ts"],"sourcesContent":["/**\n * Centralized query keys and cache configuration for TanStack Query.\n * Using constants ensures type safety and prevents typos.\n */\n\nimport { SettingsScope } from \"#/types/settings\";\n\nexport const QUERY_KEYS = {\n /** Web client configuration from the server */\n WEB_CLIENT_CONFIG: [\"web-client-config\"] as const,\n /** Same-origin OpenHands app cookie authentication status */\n MAIN_APP_COOKIE_AUTH: [\"main-app-cookie-auth\"] as const,\n} as const;\n\nexport const SETTINGS_QUERY_KEYS = {\n all: [\"settings\"] as const,\n byScope: (scope: SettingsScope) => [\"settings\", scope] as const,\n personal: () => [\"settings\", \"personal\"] as const,\n} as const;\n\nexport const LLM_PROFILES_QUERY_KEYS = {\n all: [\"llm-profiles\"] as const,\n} as const;\n\nexport const AGENT_PROFILES_QUERY_KEYS = {\n all: [\"agent-profiles\"] as const,\n} as const;\n\nexport const PROVIDER_CONNECTIONS_QUERY_KEYS = {\n all: [\"provider-connections\"] as const,\n} as const;\n\n/** Fail fast when older backends lack the profile endpoint. */\nexport const AGENT_PROFILES_RETRY_OPTIONS = {\n retry: false,\n} as const;\n\nexport const LLM_SUBSCRIPTION_QUERY_KEYS = {\n all: [\"llm-subscription\"] as const,\n openaiStatus: [\"llm-subscription\", \"openai\", \"status\"] as const,\n openaiModels: [\"llm-subscription\", \"openai\", \"models\"] as const,\n} as const;\n\nexport const LOCAL_WORKSPACES_QUERY_KEYS = {\n all: [\"local-workspaces\"] as const,\n} as const;\n\nexport const PLUGINS_QUERY_KEYS = {\n /** Dynamic marketplace catalog (used by `use-plugins-marketplace`). */\n marketplace: [\"plugins-marketplace\"] as const,\n /** Installed plugins from the local agent-server. */\n installed: [\"plugins-installed\"] as const,\n /** Locally-discovered ambient plugins (used by `use-local-plugins`). */\n local: [\"plugins-local\"] as const,\n} as const;\n\nexport const SETUP_QUERY_KEYS = {\n /** What the deployment supports. The same answer for every setup entry. */\n capabilities: () => [\"setup-capabilities\"] as const,\n} as const;\n\nexport const APP_UPDATE_QUERY_KEYS = {\n /** Latest published @openhands/agent-canvas version (npm `latest` dist-tag). */\n latestVersion: [\"agent-canvas-latest-version\"] as const,\n} as const;\n\n/** Cache configuration shared across all config-related queries */\nexport const CONFIG_CACHE_OPTIONS = {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 15, // 15 minutes\n} as const;\n\nexport type QueryKeys = (typeof QUERY_KEYS)[keyof typeof QUERY_KEYS];\n"],"mappings":"gDAOA,IAAa,EAAa,CAExB,kBAAmB,CAAC,mBAAmB,EAEvC,qBAAsB,CAAC,sBAAsB,CAC/C,EAEa,EAAsB,CACjC,IAAK,CAAC,UAAU,EAChB,QAAU,GAAyB,CAAC,WAAY,CAAK,EACrD,aAAgB,CAAC,WAAY,UAAU,CACzC,EAEa,EAA0B,CACrC,IAAK,CAAC,cAAc,CACtB,EAEa,EAA4B,CACvC,IAAK,CAAC,gBAAgB,CACxB,EAEa,EAAkC,CAC7C,IAAK,CAAC,sBAAsB,CAC9B,EAGa,EAA+B,CAC1C,MAAO,EACT,EAEa,EAA8B,CACzC,IAAK,CAAC,kBAAkB,EACxB,aAAc,CAAC,mBAAoB,SAAU,QAAQ,EACrD,aAAc,CAAC,mBAAoB,SAAU,QAAQ,CACvD,EAEa,EAA8B,CACzC,IAAK,CAAC,kBAAkB,CAC1B,EAEa,EAAqB,CAEhC,YAAa,CAAC,qBAAqB,EAEnC,UAAW,CAAC,mBAAmB,EAE/B,MAAO,CAAC,eAAe,CACzB,EAOa,EAAwB,CAEnC,cAAe,CAAC,6BAA6B,CAC/C,EAGa,EAAuB,CAClC,UAAW,IAAO,GAAK,EACvB,OAAQ,IAAO,GAAK,EACtB"}
@@ -20,6 +20,9 @@ export declare const LLM_PROFILES_QUERY_KEYS: {
20
20
  export declare const AGENT_PROFILES_QUERY_KEYS: {
21
21
  readonly all: readonly ["agent-profiles"];
22
22
  };
23
+ export declare const PROVIDER_CONNECTIONS_QUERY_KEYS: {
24
+ readonly all: readonly ["provider-connections"];
25
+ };
23
26
  /** Fail fast when older backends lack the profile endpoint. */
24
27
  export declare const AGENT_PROFILES_RETRY_OPTIONS: {
25
28
  readonly retry: false;
@@ -6,7 +6,7 @@ var e = {
6
6
  all: ["settings"],
7
7
  byScope: (e) => ["settings", e],
8
8
  personal: () => ["settings", "personal"]
9
- }, n = { all: ["llm-profiles"] }, r = { all: ["agent-profiles"] }, i = { retry: !1 }, a = {
9
+ }, n = { all: ["llm-profiles"] }, r = { all: ["agent-profiles"] }, i = { all: ["provider-connections"] }, a = { retry: !1 }, o = {
10
10
  all: ["llm-subscription"],
11
11
  openaiStatus: [
12
12
  "llm-subscription",
@@ -18,15 +18,15 @@ var e = {
18
18
  "openai",
19
19
  "models"
20
20
  ]
21
- }, o = { all: ["local-workspaces"] }, s = {
21
+ }, s = { all: ["local-workspaces"] }, c = {
22
22
  marketplace: ["plugins-marketplace"],
23
23
  installed: ["plugins-installed"],
24
24
  local: ["plugins-local"]
25
- }, c = { latestVersion: ["agent-canvas-latest-version"] }, l = {
25
+ }, l = { latestVersion: ["agent-canvas-latest-version"] }, u = {
26
26
  staleTime: 1e3 * 60 * 5,
27
27
  gcTime: 1e3 * 60 * 15
28
28
  };
29
29
  //#endregion
30
- export { r as AGENT_PROFILES_QUERY_KEYS, i as AGENT_PROFILES_RETRY_OPTIONS, c as APP_UPDATE_QUERY_KEYS, l as CONFIG_CACHE_OPTIONS, n as LLM_PROFILES_QUERY_KEYS, a as LLM_SUBSCRIPTION_QUERY_KEYS, o as LOCAL_WORKSPACES_QUERY_KEYS, s as PLUGINS_QUERY_KEYS, e as QUERY_KEYS, t as SETTINGS_QUERY_KEYS };
30
+ export { r as AGENT_PROFILES_QUERY_KEYS, a as AGENT_PROFILES_RETRY_OPTIONS, l as APP_UPDATE_QUERY_KEYS, u as CONFIG_CACHE_OPTIONS, n as LLM_PROFILES_QUERY_KEYS, o as LLM_SUBSCRIPTION_QUERY_KEYS, s as LOCAL_WORKSPACES_QUERY_KEYS, c as PLUGINS_QUERY_KEYS, i as PROVIDER_CONNECTIONS_QUERY_KEYS, e as QUERY_KEYS, t as SETTINGS_QUERY_KEYS };
31
31
 
32
32
  //# sourceMappingURL=query-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-keys.js","names":[],"sources":["../../../src/hooks/query/query-keys.ts"],"sourcesContent":["/**\n * Centralized query keys and cache configuration for TanStack Query.\n * Using constants ensures type safety and prevents typos.\n */\n\nimport { SettingsScope } from \"#/types/settings\";\n\nexport const QUERY_KEYS = {\n /** Web client configuration from the server */\n WEB_CLIENT_CONFIG: [\"web-client-config\"] as const,\n /** Same-origin OpenHands app cookie authentication status */\n MAIN_APP_COOKIE_AUTH: [\"main-app-cookie-auth\"] as const,\n} as const;\n\nexport const SETTINGS_QUERY_KEYS = {\n all: [\"settings\"] as const,\n byScope: (scope: SettingsScope) => [\"settings\", scope] as const,\n personal: () => [\"settings\", \"personal\"] as const,\n} as const;\n\nexport const LLM_PROFILES_QUERY_KEYS = {\n all: [\"llm-profiles\"] as const,\n} as const;\n\nexport const AGENT_PROFILES_QUERY_KEYS = {\n all: [\"agent-profiles\"] as const,\n} as const;\n\n/** Fail fast when older backends lack the profile endpoint. */\nexport const AGENT_PROFILES_RETRY_OPTIONS = {\n retry: false,\n} as const;\n\nexport const LLM_SUBSCRIPTION_QUERY_KEYS = {\n all: [\"llm-subscription\"] as const,\n openaiStatus: [\"llm-subscription\", \"openai\", \"status\"] as const,\n openaiModels: [\"llm-subscription\", \"openai\", \"models\"] as const,\n} as const;\n\nexport const LOCAL_WORKSPACES_QUERY_KEYS = {\n all: [\"local-workspaces\"] as const,\n} as const;\n\nexport const PLUGINS_QUERY_KEYS = {\n /** Dynamic marketplace catalog (used by `use-plugins-marketplace`). */\n marketplace: [\"plugins-marketplace\"] as const,\n /** Installed plugins from the local agent-server. */\n installed: [\"plugins-installed\"] as const,\n /** Locally-discovered ambient plugins (used by `use-local-plugins`). */\n local: [\"plugins-local\"] as const,\n} as const;\n\nexport const SETUP_QUERY_KEYS = {\n /** What the deployment supports. The same answer for every setup entry. */\n capabilities: () => [\"setup-capabilities\"] as const,\n} as const;\n\nexport const APP_UPDATE_QUERY_KEYS = {\n /** Latest published @openhands/agent-canvas version (npm `latest` dist-tag). */\n latestVersion: [\"agent-canvas-latest-version\"] as const,\n} as const;\n\n/** Cache configuration shared across all config-related queries */\nexport const CONFIG_CACHE_OPTIONS = {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 15, // 15 minutes\n} as const;\n\nexport type QueryKeys = (typeof QUERY_KEYS)[keyof typeof QUERY_KEYS];\n"],"mappings":";AAOA,IAAa,IAAa;CAExB,mBAAmB,CAAC,mBAAmB;CAEvC,sBAAsB,CAAC,sBAAsB;AAC/C,GAEa,IAAsB;CACjC,KAAK,CAAC,UAAU;CAChB,UAAU,MAAyB,CAAC,YAAY,CAAK;CACrD,gBAAgB,CAAC,YAAY,UAAU;AACzC,GAEa,IAA0B,EACrC,KAAK,CAAC,cAAc,EACtB,GAEa,IAA4B,EACvC,KAAK,CAAC,gBAAgB,EACxB,GAGa,IAA+B,EAC1C,OAAO,GACT,GAEa,IAA8B;CACzC,KAAK,CAAC,kBAAkB;CACxB,cAAc;EAAC;EAAoB;EAAU;CAAQ;CACrD,cAAc;EAAC;EAAoB;EAAU;CAAQ;AACvD,GAEa,IAA8B,EACzC,KAAK,CAAC,kBAAkB,EAC1B,GAEa,IAAqB;CAEhC,aAAa,CAAC,qBAAqB;CAEnC,WAAW,CAAC,mBAAmB;CAE/B,OAAO,CAAC,eAAe;AACzB,GAOa,IAAwB,EAEnC,eAAe,CAAC,6BAA6B,EAC/C,GAGa,IAAuB;CAClC,WAAW,MAAO,KAAK;CACvB,QAAQ,MAAO,KAAK;AACtB"}
1
+ {"version":3,"file":"query-keys.js","names":[],"sources":["../../../src/hooks/query/query-keys.ts"],"sourcesContent":["/**\n * Centralized query keys and cache configuration for TanStack Query.\n * Using constants ensures type safety and prevents typos.\n */\n\nimport { SettingsScope } from \"#/types/settings\";\n\nexport const QUERY_KEYS = {\n /** Web client configuration from the server */\n WEB_CLIENT_CONFIG: [\"web-client-config\"] as const,\n /** Same-origin OpenHands app cookie authentication status */\n MAIN_APP_COOKIE_AUTH: [\"main-app-cookie-auth\"] as const,\n} as const;\n\nexport const SETTINGS_QUERY_KEYS = {\n all: [\"settings\"] as const,\n byScope: (scope: SettingsScope) => [\"settings\", scope] as const,\n personal: () => [\"settings\", \"personal\"] as const,\n} as const;\n\nexport const LLM_PROFILES_QUERY_KEYS = {\n all: [\"llm-profiles\"] as const,\n} as const;\n\nexport const AGENT_PROFILES_QUERY_KEYS = {\n all: [\"agent-profiles\"] as const,\n} as const;\n\nexport const PROVIDER_CONNECTIONS_QUERY_KEYS = {\n all: [\"provider-connections\"] as const,\n} as const;\n\n/** Fail fast when older backends lack the profile endpoint. */\nexport const AGENT_PROFILES_RETRY_OPTIONS = {\n retry: false,\n} as const;\n\nexport const LLM_SUBSCRIPTION_QUERY_KEYS = {\n all: [\"llm-subscription\"] as const,\n openaiStatus: [\"llm-subscription\", \"openai\", \"status\"] as const,\n openaiModels: [\"llm-subscription\", \"openai\", \"models\"] as const,\n} as const;\n\nexport const LOCAL_WORKSPACES_QUERY_KEYS = {\n all: [\"local-workspaces\"] as const,\n} as const;\n\nexport const PLUGINS_QUERY_KEYS = {\n /** Dynamic marketplace catalog (used by `use-plugins-marketplace`). */\n marketplace: [\"plugins-marketplace\"] as const,\n /** Installed plugins from the local agent-server. */\n installed: [\"plugins-installed\"] as const,\n /** Locally-discovered ambient plugins (used by `use-local-plugins`). */\n local: [\"plugins-local\"] as const,\n} as const;\n\nexport const SETUP_QUERY_KEYS = {\n /** What the deployment supports. The same answer for every setup entry. */\n capabilities: () => [\"setup-capabilities\"] as const,\n} as const;\n\nexport const APP_UPDATE_QUERY_KEYS = {\n /** Latest published @openhands/agent-canvas version (npm `latest` dist-tag). */\n latestVersion: [\"agent-canvas-latest-version\"] as const,\n} as const;\n\n/** Cache configuration shared across all config-related queries */\nexport const CONFIG_CACHE_OPTIONS = {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 15, // 15 minutes\n} as const;\n\nexport type QueryKeys = (typeof QUERY_KEYS)[keyof typeof QUERY_KEYS];\n"],"mappings":";AAOA,IAAa,IAAa;CAExB,mBAAmB,CAAC,mBAAmB;CAEvC,sBAAsB,CAAC,sBAAsB;AAC/C,GAEa,IAAsB;CACjC,KAAK,CAAC,UAAU;CAChB,UAAU,MAAyB,CAAC,YAAY,CAAK;CACrD,gBAAgB,CAAC,YAAY,UAAU;AACzC,GAEa,IAA0B,EACrC,KAAK,CAAC,cAAc,EACtB,GAEa,IAA4B,EACvC,KAAK,CAAC,gBAAgB,EACxB,GAEa,IAAkC,EAC7C,KAAK,CAAC,sBAAsB,EAC9B,GAGa,IAA+B,EAC1C,OAAO,GACT,GAEa,IAA8B;CACzC,KAAK,CAAC,kBAAkB;CACxB,cAAc;EAAC;EAAoB;EAAU;CAAQ;CACrD,cAAc;EAAC;EAAoB;EAAU;CAAQ;AACvD,GAEa,IAA8B,EACzC,KAAK,CAAC,kBAAkB,EAC1B,GAEa,IAAqB;CAEhC,aAAa,CAAC,qBAAqB;CAEnC,WAAW,CAAC,mBAAmB;CAE/B,OAAO,CAAC,eAAe;AACzB,GAOa,IAAwB,EAEnC,eAAe,CAAC,6BAA6B,EAC/C,GAGa,IAAuB;CAClC,WAAW,MAAO,KAAK;CACvB,QAAQ,MAAO,KAAK;AACtB"}
@@ -0,0 +1 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs"),require("../../contexts/active-backend-context.cjs"),require("../../api/automation-service/automation-service.api.cjs");
@@ -0,0 +1,2 @@
1
+ import "../../contexts/active-backend-context.js";
2
+ import "../../api/automation-service/automation-service.api.js";
@@ -0,0 +1,2 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../contexts/active-backend-context.cjs"),n=require("../../api/automation-service/automation-service.api.cjs");var r=[`automation-health`];function i(){let i=t.useActiveBackend();return e.useQuery({queryKey:[...r,i.backend.id,i.orgId],queryFn:()=>n.default.checkHealth(),staleTime:30*1e3,retry:!1})}exports.useAutomationHealth=i;
2
+ //# sourceMappingURL=use-automation-health.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automation-health.cjs","names":[],"sources":["../../../src/hooks/query/use-automation-health.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport AutomationService from \"#/api/automation-service/automation-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\n\nexport const AUTOMATION_HEALTH_QUERY_KEY = [\"automation-health\"] as const;\n\nexport function useAutomationHealth() {\n const active = useActiveBackend();\n return useQuery({\n queryKey: [...AUTOMATION_HEALTH_QUERY_KEY, active.backend.id, active.orgId],\n queryFn: () => AutomationService.checkHealth(),\n staleTime: 30 * 1000, // 30 seconds\n retry: false, // Don't retry on failure - we want to show the error state immediately\n });\n}\n"],"mappings":"kQAIA,IAAa,EAA8B,CAAC,mBAAmB,EAE/D,SAAgB,GAAsB,CACpC,IAAM,EAAS,EAAA,iBAAiB,EAChC,OAAO,EAAA,SAAS,CACd,SAAU,CAAC,GAAG,EAA6B,EAAO,QAAQ,GAAI,EAAO,KAAK,EAC1E,YAAe,EAAA,QAAkB,YAAY,EAC7C,UAAW,GAAK,IAChB,MAAO,EACT,CAAC,CACH"}
@@ -0,0 +1,22 @@
1
+ import { useQuery as e } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
2
+ import { useActiveBackend as t } from "../../contexts/active-backend-context.js";
3
+ import n from "../../api/automation-service/automation-service.api.js";
4
+ //#region src/hooks/query/use-automation-health.ts
5
+ var r = ["automation-health"];
6
+ function i() {
7
+ let i = t();
8
+ return e({
9
+ queryKey: [
10
+ ...r,
11
+ i.backend.id,
12
+ i.orgId
13
+ ],
14
+ queryFn: () => n.checkHealth(),
15
+ staleTime: 30 * 1e3,
16
+ retry: !1
17
+ });
18
+ }
19
+ //#endregion
20
+ export { i as useAutomationHealth };
21
+
22
+ //# sourceMappingURL=use-automation-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automation-health.js","names":[],"sources":["../../../src/hooks/query/use-automation-health.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport AutomationService from \"#/api/automation-service/automation-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\n\nexport const AUTOMATION_HEALTH_QUERY_KEY = [\"automation-health\"] as const;\n\nexport function useAutomationHealth() {\n const active = useActiveBackend();\n return useQuery({\n queryKey: [...AUTOMATION_HEALTH_QUERY_KEY, active.backend.id, active.orgId],\n queryFn: () => AutomationService.checkHealth(),\n staleTime: 30 * 1000, // 30 seconds\n retry: false, // Don't retry on failure - we want to show the error state immediately\n });\n}\n"],"mappings":";;;;AAIA,IAAa,IAA8B,CAAC,mBAAmB;AAE/D,SAAgB,IAAsB;CACpC,IAAM,IAAS,EAAiB;CAChC,OAAO,EAAS;EACd,UAAU;GAAC,GAAG;GAA6B,EAAO,QAAQ;GAAI,EAAO;EAAK;EAC1E,eAAe,EAAkB,YAAY;EAC7C,WAAW,KAAK;EAChB,OAAO;CACT,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../contexts/active-backend-context.cjs"),n=require("../../api/automation-service/automation-service.api.cjs");require("../use-tracking.cjs"),require("./use-automation-detail.cjs");var r=[`automations`];function i(i={}){let{limit:a=50,offset:o=0,enabled:s=!0}=i,c=t.useActiveBackend();return e.useQuery({queryKey:[...r,{limit:a,offset:o},c.backend.id,c.orgId],queryFn:()=>n.default.getAutomations(a,o),staleTime:0,enabled:s})}exports.useAutomations=i;
2
+ //# sourceMappingURL=use-automations.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automations.cjs","names":[],"sources":["../../../src/hooks/query/use-automations.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AutomationService from \"#/api/automation-service/automation-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport type { Automation, AutomationSpec } from \"#/types/automation\";\nimport {\n AUTOMATION_DETAIL_QUERY_KEY,\n AUTOMATION_RUNS_QUERY_KEY,\n} from \"./use-automation-detail\";\n\nexport const AUTOMATIONS_QUERY_KEY = [\"automations\"] as const;\n\ninterface UseAutomationsOptions {\n limit?: number;\n offset?: number;\n enabled?: boolean;\n}\n\nexport function useAutomations(options: UseAutomationsOptions = {}) {\n const { limit = 50, offset = 0, enabled = true } = options;\n const active = useActiveBackend();\n return useQuery({\n queryKey: [\n ...AUTOMATIONS_QUERY_KEY,\n { limit, offset },\n active.backend.id,\n active.orgId,\n ],\n queryFn: () => AutomationService.getAutomations(limit, offset),\n staleTime: 0,\n enabled,\n });\n}\n\nexport function useToggleAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationDisableButton } = useTracking();\n return useMutation({\n mutationFn: ({ id, enabled }: { id: string; enabled: boolean }) =>\n AutomationService.toggleAutomation(id, enabled),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n if (!variables.enabled) {\n trackAutomationDisableButton({ backendKind: active.backend.kind });\n }\n },\n });\n}\n\nexport function useImportAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationImported } = useTracking();\n return useMutation({\n mutationFn: (spec: AutomationSpec) =>\n AutomationService.createAutomation({ ...spec, enabled: false }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n trackAutomationImported({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useUpdateAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationEdited } = useTracking();\n return useMutation({\n mutationFn: ({ id, body }: { id: string; body: Partial<Automation> }) =>\n AutomationService.updateAutomation(id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n trackAutomationEdited({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useDeleteAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationDeleted } = useTracking();\n return useMutation({\n mutationFn: (id: string) => AutomationService.deleteAutomation(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n trackAutomationDeleted({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useDispatchAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationExecuted } = useTracking();\n return useMutation({\n mutationFn: (id: string) => AutomationService.dispatchAutomation(id),\n onSuccess: (_run, id) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n queryClient.invalidateQueries({\n queryKey: [...AUTOMATION_RUNS_QUERY_KEY, id],\n });\n trackAutomationExecuted({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useCancelAutomationRun() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ runId }: { automationId: string; runId: string }) =>\n AutomationService.cancelAutomationRun(runId),\n onSuccess: (_run, { automationId }) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n queryClient.invalidateQueries({\n queryKey: [...AUTOMATION_RUNS_QUERY_KEY, automationId],\n });\n },\n });\n}\n"],"mappings":"wUAUA,IAAa,EAAwB,CAAC,aAAa,EAQnD,SAAgB,EAAe,EAAiC,CAAC,EAAG,CAClE,GAAM,CAAE,QAAQ,GAAI,SAAS,EAAG,UAAU,IAAS,EAC7C,EAAS,EAAA,iBAAiB,EAChC,OAAO,EAAA,SAAS,CACd,SAAU,CACR,GAAG,EACH,CAAE,QAAO,QAAO,EAChB,EAAO,QAAQ,GACf,EAAO,KACT,EACA,YAAe,EAAA,QAAkB,eAAe,EAAO,CAAM,EAC7D,UAAW,EACX,SACF,CAAC,CACH"}
@@ -0,0 +1,28 @@
1
+ import { useQuery as e } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
2
+ import { useActiveBackend as t } from "../../contexts/active-backend-context.js";
3
+ import n from "../../api/automation-service/automation-service.api.js";
4
+ import "../use-tracking.js";
5
+ import "./use-automation-detail.js";
6
+ //#region src/hooks/query/use-automations.ts
7
+ var r = ["automations"];
8
+ function i(i = {}) {
9
+ let { limit: a = 50, offset: o = 0, enabled: s = !0 } = i, c = t();
10
+ return e({
11
+ queryKey: [
12
+ ...r,
13
+ {
14
+ limit: a,
15
+ offset: o
16
+ },
17
+ c.backend.id,
18
+ c.orgId
19
+ ],
20
+ queryFn: () => n.getAutomations(a, o),
21
+ staleTime: 0,
22
+ enabled: s
23
+ });
24
+ }
25
+ //#endregion
26
+ export { i as useAutomations };
27
+
28
+ //# sourceMappingURL=use-automations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automations.js","names":[],"sources":["../../../src/hooks/query/use-automations.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AutomationService from \"#/api/automation-service/automation-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport type { Automation, AutomationSpec } from \"#/types/automation\";\nimport {\n AUTOMATION_DETAIL_QUERY_KEY,\n AUTOMATION_RUNS_QUERY_KEY,\n} from \"./use-automation-detail\";\n\nexport const AUTOMATIONS_QUERY_KEY = [\"automations\"] as const;\n\ninterface UseAutomationsOptions {\n limit?: number;\n offset?: number;\n enabled?: boolean;\n}\n\nexport function useAutomations(options: UseAutomationsOptions = {}) {\n const { limit = 50, offset = 0, enabled = true } = options;\n const active = useActiveBackend();\n return useQuery({\n queryKey: [\n ...AUTOMATIONS_QUERY_KEY,\n { limit, offset },\n active.backend.id,\n active.orgId,\n ],\n queryFn: () => AutomationService.getAutomations(limit, offset),\n staleTime: 0,\n enabled,\n });\n}\n\nexport function useToggleAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationDisableButton } = useTracking();\n return useMutation({\n mutationFn: ({ id, enabled }: { id: string; enabled: boolean }) =>\n AutomationService.toggleAutomation(id, enabled),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n if (!variables.enabled) {\n trackAutomationDisableButton({ backendKind: active.backend.kind });\n }\n },\n });\n}\n\nexport function useImportAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationImported } = useTracking();\n return useMutation({\n mutationFn: (spec: AutomationSpec) =>\n AutomationService.createAutomation({ ...spec, enabled: false }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n trackAutomationImported({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useUpdateAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationEdited } = useTracking();\n return useMutation({\n mutationFn: ({ id, body }: { id: string; body: Partial<Automation> }) =>\n AutomationService.updateAutomation(id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n trackAutomationEdited({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useDeleteAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationDeleted } = useTracking();\n return useMutation({\n mutationFn: (id: string) => AutomationService.deleteAutomation(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n trackAutomationDeleted({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useDispatchAutomation() {\n const queryClient = useQueryClient();\n const active = useActiveBackend();\n const { trackAutomationExecuted } = useTracking();\n return useMutation({\n mutationFn: (id: string) => AutomationService.dispatchAutomation(id),\n onSuccess: (_run, id) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n queryClient.invalidateQueries({\n queryKey: [...AUTOMATION_RUNS_QUERY_KEY, id],\n });\n trackAutomationExecuted({ backendKind: active.backend.kind });\n },\n });\n}\n\nexport function useCancelAutomationRun() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ runId }: { automationId: string; runId: string }) =>\n AutomationService.cancelAutomationRun(runId),\n onSuccess: (_run, { automationId }) => {\n queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n queryClient.invalidateQueries({ queryKey: AUTOMATION_DETAIL_QUERY_KEY });\n queryClient.invalidateQueries({\n queryKey: [...AUTOMATION_RUNS_QUERY_KEY, automationId],\n });\n },\n });\n}\n"],"mappings":";;;;;;AAUA,IAAa,IAAwB,CAAC,aAAa;AAQnD,SAAgB,EAAe,IAAiC,CAAC,GAAG;CAClE,IAAM,EAAE,WAAQ,IAAI,YAAS,GAAG,aAAU,OAAS,GAC7C,IAAS,EAAiB;CAChC,OAAO,EAAS;EACd,UAAU;GACR,GAAG;GACH;IAAE;IAAO;GAAO;GAChB,EAAO,QAAQ;GACf,EAAO;EACT;EACA,eAAe,EAAkB,eAAe,GAAO,CAAM;EAC7D,WAAW;EACX;CACF,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../node_modules/@openhands/typescript-client/dist/client/http-client.cjs"),n=require("../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs"),r=require("../../node_modules/@openhands/typescript-client/dist/client/settings-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const i=require("../../utils/user-facing-error.cjs"),a=require("../../api/backend-registry/health-store.cjs"),o=require("../../api/agent-server-client-options.cjs"),s=require("../../api/agent-server-compatibility.cjs"),c=require("../../node_modules/@tanstack/react-query/build/modern/useQueries.cjs"),l=require("../../node_modules/axios/lib/axios.cjs");require("../../node_modules/@openhands/typescript-client/dist/index.cjs");const u=require("../../api/cloud/organization-service.api.cjs");let d=require("react");d=e.__toESM(d,1);var f=1e4,p=4e3,m=`Invalid API key`,h=`API key required`,g=`Cloud API key or network issue`,_=`Logged out`;function v(e){return e===m}function y(e){return e===h}function b(e){return e===g}function x(e){return e.kind===`cloud`&&e.authMode!==`cookie`&&!e.apiKey.trim()}function S(e){return e===_}async function C(e){if(e.kind===`cloud`){if(e.authMode!==`cookie`&&!e.apiKey?.trim())throw Error(h);try{e.authMode===`cookie`?await u.getCloudOrganizations(e):await u.getCurrentCloudApiKey(e)}catch(e){throw l.default.isAxiosError(e)&&e.response?.status===401||e instanceof t.HttpError&&e.status===401?Error(_):i.isCorsOrNetworkError(e)?Error(g):e}return!0}try{let t=o.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:p});await new r.SettingsClient(t).getSettings(),s.assertAgentServerVersionIsSupported(await new n.ServerClient(t).getServerInfo())}catch(e){throw s.isSdkHttpStatusError(e,401)?Error(m):e}return!0}var w=2,T=300;function E(e){return e instanceof Error?e.message!==`Invalid API key`&&e.message!==`API key required`&&e.message!==`Logged out`:!0}async function D(e){for(let t=0;;t+=1)try{return await C(e)}catch(e){if(t>=w||!E(e))throw e;await new Promise(e=>{setTimeout(e,T)})}}function O(e,t={}){let{probeDisabledOnce:n=!1}=t,r=d.default.useSyncExternalStore(a.subscribeBackendHealth,a.getHealthSnapshot,a.getHealthSnapshot),o=c.useQueries({queries:e.map(e=>{let t=r[e.id],o=x(e),s=t?.disabled===!0,c=s&&e.kind===`cloud`&&i.isCorsOrNetworkErrorMessage(t?.lastError),l=!o&&(!s||n||c);return{queryKey:[`backend-health`,e.id,e.kind,e.host,e.apiKey??``],queryFn:async()=>{try{let t=await D(e);return a.recordBackendSuccess(e.id),t}catch(t){throw a.recordBackendFailure(e.id,t),t}},enabled:l,refetchInterval:s||o?!1:f,refetchIntervalInBackground:!1,refetchOnMount:s&&n?`always`:!0,refetchOnReconnect:!s&&!o,refetchOnWindowFocus:!s&&!o,retry:!1,staleTime:s?0:f,meta:{disableToast:!0}}})}),s={};return e.forEach((e,t)=>{let n=o[t],i=r[e.id],a=x(e),c=a?!1:i?.disabled===!0,l=a?0:i?.consecutiveFailures??0,u=a?h:i?.lastError??null,d;d=a||c?!1:n.isSuccess?!0:n.isError?!1:null,s[e.id]={isConnected:d,consecutiveFailures:l,lastError:u,disabled:c}}),s}exports.isCloudBackendApiKeyOrNetworkHealthError=b,exports.isCloudBackendLoggedOutHealthError=S,exports.isInvalidBackendApiKeyHealthError=v,exports.isMissingBackendApiKeyHealthError=y,exports.useBackendsHealth=O;
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../node_modules/@openhands/typescript-client/dist/client/http-client.cjs"),n=require("../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs"),r=require("../../node_modules/@openhands/typescript-client/dist/client/settings-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const i=require("../../utils/user-facing-error.cjs"),a=require("../../api/backend-registry/health-store.cjs"),o=require("../../api/agent-server-client-options.cjs"),s=require("../../api/agent-server-compatibility.cjs"),c=require("../../node_modules/@tanstack/react-query/build/modern/useQueries.cjs"),l=require("../../node_modules/axios/lib/axios.cjs");require("../../node_modules/@openhands/typescript-client/dist/index.cjs");const u=require("../../api/cloud/organization-service.api.cjs");let d=require("react");d=e.__toESM(d,1);var f=3e4,p=4e3,m=`Invalid API key`,h=`API key required`,g=`Cloud API key or network issue`,_=`Logged out`;function v(e){return e===m}function y(e){return e===h}function b(e){return e===g}function x(e){return e.kind===`cloud`&&e.authMode!==`cookie`&&!e.apiKey.trim()}function S(e){return e===_}async function C(e){if(e.kind===`cloud`){if(e.authMode!==`cookie`&&!e.apiKey?.trim())throw Error(h);try{e.authMode===`cookie`?await u.getCloudOrganizations(e):await u.getCurrentCloudApiKey(e)}catch(e){throw l.default.isAxiosError(e)&&e.response?.status===401||e instanceof t.HttpError&&e.status===401?Error(_):i.isCorsOrNetworkError(e)?Error(g):e}return!0}try{let t=o.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:p});await new r.SettingsClient(t).getSettings(),s.assertAgentServerVersionIsSupported(await new n.ServerClient(t).getServerInfo())}catch(e){throw s.isSdkHttpStatusError(e,401)?Error(m):e}return!0}var w=2,T=300;function E(e){return e instanceof Error?e.message!==`Invalid API key`&&e.message!==`API key required`&&e.message!==`Logged out`:!0}async function D(e){for(let t=0;;t+=1)try{return await C(e)}catch(e){if(t>=w||!E(e))throw e;await new Promise(e=>{setTimeout(e,T)})}}function O(e,t={}){let{probeDisabledOnce:n=!1}=t,r=d.default.useSyncExternalStore(a.subscribeBackendHealth,a.getHealthSnapshot,a.getHealthSnapshot),o=c.useQueries({queries:e.map(e=>{let t=r[e.id],o=x(e),s=t?.disabled===!0,c=s&&e.kind===`cloud`&&i.isCorsOrNetworkErrorMessage(t?.lastError),l=!o&&(!s||n||c);return{queryKey:[`backend-health`,e.id,e.kind,e.host,e.apiKey??``],queryFn:async()=>{try{let t=await D(e);return a.recordBackendSuccess(e.id),t}catch(t){throw a.recordBackendFailure(e.id,t),t}},enabled:l,refetchInterval:s||o?!1:f,refetchIntervalInBackground:!1,refetchOnMount:s&&n?`always`:!0,refetchOnReconnect:!s&&!o,refetchOnWindowFocus:!s&&!o,retry:!1,staleTime:s?0:f,meta:{disableToast:!0}}})}),s={};return e.forEach((e,t)=>{let n=o[t],i=r[e.id],a=x(e),c=a?!1:i?.disabled===!0,l=a?0:i?.consecutiveFailures??0,u=a?h:i?.lastError??null,d;d=a||c?!1:n.isSuccess?!0:n.isError?!1:null,s[e.id]={isConnected:d,consecutiveFailures:l,lastError:u,disabled:c}}),s}exports.isCloudBackendApiKeyOrNetworkHealthError=b,exports.isCloudBackendLoggedOutHealthError=S,exports.isInvalidBackendApiKeyHealthError=v,exports.isMissingBackendApiKeyHealthError=y,exports.useBackendsHealth=O;
2
2
  //# sourceMappingURL=use-backends-health.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-backends-health.cjs","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\nconst REFRESH_INTERVAL_MS = 10000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (10s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck for\n * a full 10s until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"w6BA8BA,IAAM,EAAsB,IACtB,EAAmB,IACZ,EAAgC,kBAChC,EAAgC,mBAChC,EACX,iCACW,EAAiC,aAE9C,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAS,EAAwB,EAA2B,CAC1D,OACE,EAAQ,OAAS,SACjB,EAAQ,WAAa,UACrB,CAAC,EAAQ,OAAO,KAAK,CAEzB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAkBA,eAAe,EAAa,EAAiC,CAC3D,GAAI,EAAQ,OAAS,QAAS,CAC5B,GAAI,EAAQ,WAAa,UAAY,CAAC,EAAQ,QAAQ,KAAK,EACzD,MAAU,MAAM,CAA6B,EAG/C,GAAI,CACE,EAAQ,WAAa,SACvB,MAAM,EAAA,sBAAsB,CAAO,EAEnC,MAAM,EAAA,sBAAsB,CAAO,CAEvC,OAAS,EAAO,CAUd,MARG,EAAA,QAAM,aAAa,CAAK,GAAK,EAAM,UAAU,SAAW,KACxD,aAAiB,EAAA,WAAa,EAAM,SAAW,IAEtC,MAAM,CAA8B,EAE5C,EAAA,qBAAqB,CAAK,EAClB,MAAM,CAAsC,EAElD,CACR,CACA,MAAO,EACT,CAEA,GAAI,CACF,IAAM,EAAgB,EAAA,4BAA4B,CAChD,KAAM,EAAQ,KACd,cAAe,EAAQ,QAAU,KACjC,QAAS,CACX,CAAC,EAED,MAAM,IAAI,EAAA,eAAe,CAAa,EAAE,YAAY,EAEpD,EAAA,oCAAoC,MADX,IAAI,EAAA,aAAa,CAAa,EAAE,cAAc,CACzB,CAChD,OAAS,EAAO,CAId,MAHI,EAAA,qBAAqB,EAAO,GAAG,EACvB,MAAM,CAA6B,EAEzC,CACR,CACA,MAAO,EACT,CAMA,IAAM,EAAuB,EACvB,EAAuB,IAuB7B,SAAS,EAAsB,EAAyB,CAEtD,OADM,aAAiB,MAErB,EAAM,UAAA,mBACN,EAAM,UAAA,oBACN,EAAM,UAAA,aAJ8B,EAMxC,CAEA,eAAe,EAA2B,EAAiC,CACzE,IAAK,IAAI,EAAU,GAAK,GAAW,EACjC,GAAI,CACF,OAAO,MAAM,EAAa,CAAO,CACnC,OAAS,EAAO,CACd,GAAI,GAAW,GAAwB,CAAC,EAAsB,CAAK,EACjE,MAAM,EAER,MAAM,IAAI,QAAS,GAAY,CAC7B,WAAW,EAAS,CAAoB,CAC1C,CAAC,CACH,CAEJ,CA0CA,SAAgB,EACd,EACA,EAAoC,CAAC,EACN,CAC/B,GAAM,CAAE,oBAAoB,IAAU,EAChC,EAAY,EAAA,QAAM,qBACtB,EAAA,uBACA,EAAA,kBACA,EAAA,iBACF,EAEM,EAAU,EAAA,WAAW,CACzB,QAAS,EAAS,IAAK,GAAM,CAC3B,IAAM,EAAQ,EAAU,EAAE,IACpB,EAAwB,EAAwB,CAAC,EACjD,EAAa,GAAO,WAAa,GACjC,EACJ,GACA,EAAE,OAAS,SACX,EAAA,4BAA4B,GAAO,SAAS,EACxC,EACJ,CAAC,IACA,CAAC,GACA,GACA,GACJ,MAAO,CACL,SAAU,CACR,iBACA,EAAE,GACF,EAAE,KACF,EAAE,KACF,EAAE,QAAU,EACd,EACA,QAAS,SAAY,CACnB,GAAI,CACF,IAAM,EAAS,MAAM,EAA2B,CAAC,EAEjD,OADA,EAAA,qBAAqB,EAAE,EAAE,EAClB,CACT,OAAS,EAAK,CAEZ,MADA,EAAA,qBAAqB,EAAE,GAAI,CAAG,EACxB,CACR,CACF,EACA,QAAS,EACT,gBACE,GAAc,EACT,GACD,EACN,4BAA6B,GAC7B,eAAgB,GAAc,EAAoB,SAAW,GAC7D,mBAAoB,CAAC,GAAc,CAAC,EACpC,qBAAsB,CAAC,GAAc,CAAC,EACtC,MAAO,GAGP,UAAW,EAAa,EAAI,EAC5B,KAAM,CAAE,aAAc,EAAK,CAC7B,CACF,CAAC,CACH,CAAC,EAEK,EAAqC,CAAC,EA2B5C,OA1BA,EAAS,SAAS,EAAG,IAAM,CACzB,IAAM,EAAI,EAAQ,GACZ,EAAQ,EAAU,EAAE,IACpB,EAAwB,EAAwB,CAAC,EACjD,EAAW,EAAwB,GAAQ,GAAO,WAAa,GAC/D,EAAsB,EACxB,EACC,GAAO,qBAAuB,EAC7B,EAAY,EACd,EACC,GAAO,WAAa,KAErB,EACJ,AASK,EATD,GAEO,EADK,GAML,EAAE,UAAyB,GAC7B,EAAE,QAAuB,GACf,KAEnB,EAAI,EAAE,IAAM,CAAE,cAAa,sBAAqB,YAAW,UAAS,CACtE,CAAC,EACM,CACT"}
1
+ {"version":3,"file":"use-backends-health.cjs","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"w6BAiCA,IAAM,EAAsB,IACtB,EAAmB,IACZ,EAAgC,kBAChC,EAAgC,mBAChC,EACX,iCACW,EAAiC,aAE9C,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAEA,SAAS,EAAwB,EAA2B,CAC1D,OACE,EAAQ,OAAS,SACjB,EAAQ,WAAa,UACrB,CAAC,EAAQ,OAAO,KAAK,CAEzB,CAEA,SAAgB,EACd,EACS,CACT,OAAO,IAAU,CACnB,CAkBA,eAAe,EAAa,EAAiC,CAC3D,GAAI,EAAQ,OAAS,QAAS,CAC5B,GAAI,EAAQ,WAAa,UAAY,CAAC,EAAQ,QAAQ,KAAK,EACzD,MAAU,MAAM,CAA6B,EAG/C,GAAI,CACE,EAAQ,WAAa,SACvB,MAAM,EAAA,sBAAsB,CAAO,EAEnC,MAAM,EAAA,sBAAsB,CAAO,CAEvC,OAAS,EAAO,CAUd,MARG,EAAA,QAAM,aAAa,CAAK,GAAK,EAAM,UAAU,SAAW,KACxD,aAAiB,EAAA,WAAa,EAAM,SAAW,IAEtC,MAAM,CAA8B,EAE5C,EAAA,qBAAqB,CAAK,EAClB,MAAM,CAAsC,EAElD,CACR,CACA,MAAO,EACT,CAEA,GAAI,CACF,IAAM,EAAgB,EAAA,4BAA4B,CAChD,KAAM,EAAQ,KACd,cAAe,EAAQ,QAAU,KACjC,QAAS,CACX,CAAC,EAED,MAAM,IAAI,EAAA,eAAe,CAAa,EAAE,YAAY,EAEpD,EAAA,oCAAoC,MADX,IAAI,EAAA,aAAa,CAAa,EAAE,cAAc,CACzB,CAChD,OAAS,EAAO,CAId,MAHI,EAAA,qBAAqB,EAAO,GAAG,EACvB,MAAM,CAA6B,EAEzC,CACR,CACA,MAAO,EACT,CAMA,IAAM,EAAuB,EACvB,EAAuB,IAuB7B,SAAS,EAAsB,EAAyB,CAEtD,OADM,aAAiB,MAErB,EAAM,UAAA,mBACN,EAAM,UAAA,oBACN,EAAM,UAAA,aAJ8B,EAMxC,CAEA,eAAe,EAA2B,EAAiC,CACzE,IAAK,IAAI,EAAU,GAAK,GAAW,EACjC,GAAI,CACF,OAAO,MAAM,EAAa,CAAO,CACnC,OAAS,EAAO,CACd,GAAI,GAAW,GAAwB,CAAC,EAAsB,CAAK,EACjE,MAAM,EAER,MAAM,IAAI,QAAS,GAAY,CAC7B,WAAW,EAAS,CAAoB,CAC1C,CAAC,CACH,CAEJ,CA0CA,SAAgB,EACd,EACA,EAAoC,CAAC,EACN,CAC/B,GAAM,CAAE,oBAAoB,IAAU,EAChC,EAAY,EAAA,QAAM,qBACtB,EAAA,uBACA,EAAA,kBACA,EAAA,iBACF,EAEM,EAAU,EAAA,WAAW,CACzB,QAAS,EAAS,IAAK,GAAM,CAC3B,IAAM,EAAQ,EAAU,EAAE,IACpB,EAAwB,EAAwB,CAAC,EACjD,EAAa,GAAO,WAAa,GACjC,EACJ,GACA,EAAE,OAAS,SACX,EAAA,4BAA4B,GAAO,SAAS,EACxC,EACJ,CAAC,IACA,CAAC,GACA,GACA,GACJ,MAAO,CACL,SAAU,CACR,iBACA,EAAE,GACF,EAAE,KACF,EAAE,KACF,EAAE,QAAU,EACd,EACA,QAAS,SAAY,CACnB,GAAI,CACF,IAAM,EAAS,MAAM,EAA2B,CAAC,EAEjD,OADA,EAAA,qBAAqB,EAAE,EAAE,EAClB,CACT,OAAS,EAAK,CAEZ,MADA,EAAA,qBAAqB,EAAE,GAAI,CAAG,EACxB,CACR,CACF,EACA,QAAS,EACT,gBACE,GAAc,EACT,GACD,EACN,4BAA6B,GAC7B,eAAgB,GAAc,EAAoB,SAAW,GAC7D,mBAAoB,CAAC,GAAc,CAAC,EACpC,qBAAsB,CAAC,GAAc,CAAC,EACtC,MAAO,GAGP,UAAW,EAAa,EAAI,EAC5B,KAAM,CAAE,aAAc,EAAK,CAC7B,CACF,CAAC,CACH,CAAC,EAEK,EAAqC,CAAC,EA2B5C,OA1BA,EAAS,SAAS,EAAG,IAAM,CACzB,IAAM,EAAI,EAAQ,GACZ,EAAQ,EAAU,EAAE,IACpB,EAAwB,EAAwB,CAAC,EACjD,EAAW,EAAwB,GAAQ,GAAO,WAAa,GAC/D,EAAsB,EACxB,EACC,GAAO,qBAAuB,EAC7B,EAAY,EACd,EACC,GAAO,WAAa,KAErB,EACJ,AASK,EATD,GAEO,EADK,GAML,EAAE,UAAyB,GAC7B,EAAE,QAAuB,GACf,KAEnB,EAAI,EAAE,IAAM,CAAE,cAAa,sBAAqB,YAAW,UAAS,CACtE,CAAC,EACM,CACT"}
@@ -12,7 +12,7 @@ import "../../node_modules/@openhands/typescript-client/dist/index.js";
12
12
  import { getCloudOrganizations as m, getCurrentCloudApiKey as h } from "../../api/cloud/organization-service.api.js";
13
13
  import g from "react";
14
14
  //#region src/hooks/query/use-backends-health.ts
15
- var _ = 1e4, v = 4e3, y = "Invalid API key", b = "API key required", x = "Cloud API key or network issue", S = "Logged out";
15
+ var _ = 3e4, v = 4e3, y = "Invalid API key", b = "API key required", x = "Cloud API key or network issue", S = "Logged out";
16
16
  function C(e) {
17
17
  return e === y;
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-backends-health.js","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\nconst REFRESH_INTERVAL_MS = 10000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (10s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck for\n * a full 10s until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":";;;;;;;;;;;;;;AA8BA,IAAM,IAAsB,KACtB,IAAmB,KACZ,IAAgC,mBAChC,IAAgC,oBAChC,IACX,kCACW,IAAiC;AAE9C,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAS,EAAwB,GAA2B;CAC1D,OACE,EAAQ,SAAS,WACjB,EAAQ,aAAa,YACrB,CAAC,EAAQ,OAAO,KAAK;AAEzB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAkBA,eAAe,EAAa,GAAiC;CAC3D,IAAI,EAAQ,SAAS,SAAS;EAC5B,IAAI,EAAQ,aAAa,YAAY,CAAC,EAAQ,QAAQ,KAAK,GACzD,MAAU,MAAM,CAA6B;EAG/C,IAAI;GACF,AAAI,EAAQ,aAAa,WACvB,MAAM,EAAsB,CAAO,IAEnC,MAAM,EAAsB,CAAO;EAEvC,SAAS,GAAO;GAUd,MARG,EAAM,aAAa,CAAK,KAAK,EAAM,UAAU,WAAW,OACxD,aAAiB,KAAa,EAAM,WAAW,MAEtC,MAAM,CAA8B,IAE5C,EAAqB,CAAK,IAClB,MAAM,CAAsC,IAElD;EACR;EACA,OAAO;CACT;CAEA,IAAI;EACF,IAAM,IAAgB,EAA4B;GAChD,MAAM,EAAQ;GACd,eAAe,EAAQ,UAAU;GACjC,SAAS;EACX,CAAC;EAID,AAFA,MAAM,IAAI,EAAe,CAAa,EAAE,YAAY,GAEpD,EAAoC,MADX,IAAI,EAAa,CAAa,EAAE,cAAc,CACzB;CAChD,SAAS,GAAO;EAId,MAHI,EAAqB,GAAO,GAAG,IACvB,MAAM,CAA6B,IAEzC;CACR;CACA,OAAO;AACT;AAMA,IAAM,IAAuB,GACvB,IAAuB;AAuB7B,SAAS,EAAsB,GAAyB;CAEtD,OADM,aAAiB,QAErB,EAAM,YAAA,qBACN,EAAM,YAAA,sBACN,EAAM,YAAA,eAJ8B;AAMxC;AAEA,eAAe,EAA2B,GAAiC;CACzE,KAAK,IAAI,IAAU,IAAK,KAAW,GACjC,IAAI;EACF,OAAO,MAAM,EAAa,CAAO;CACnC,SAAS,GAAO;EACd,IAAI,KAAW,KAAwB,CAAC,EAAsB,CAAK,GACjE,MAAM;EAER,MAAM,IAAI,SAAS,MAAY;GAC7B,WAAW,GAAS,CAAoB;EAC1C,CAAC;CACH;AAEJ;AA0CA,SAAgB,EACd,GACA,IAAoC,CAAC,GACN;CAC/B,IAAM,EAAE,uBAAoB,OAAU,GAChC,IAAY,EAAM,qBACtB,GACA,GACA,CACF,GAEM,IAAU,EAAW,EACzB,SAAS,EAAS,KAAK,MAAM;EAC3B,IAAM,IAAQ,EAAU,EAAE,KACpB,IAAwB,EAAwB,CAAC,GACjD,IAAa,GAAO,aAAa,IACjC,IACJ,KACA,EAAE,SAAS,WACX,EAA4B,GAAO,SAAS,GACxC,IACJ,CAAC,MACA,CAAC,KACA,KACA;EACJ,OAAO;GACL,UAAU;IACR;IACA,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE,UAAU;GACd;GACA,SAAS,YAAY;IACnB,IAAI;KACF,IAAM,IAAS,MAAM,EAA2B,CAAC;KAEjD,OADA,EAAqB,EAAE,EAAE,GAClB;IACT,SAAS,GAAK;KAEZ,MADA,EAAqB,EAAE,IAAI,CAAG,GACxB;IACR;GACF;GACA,SAAS;GACT,iBACE,KAAc,IACT,KACD;GACN,6BAA6B;GAC7B,gBAAgB,KAAc,IAAoB,WAAW;GAC7D,oBAAoB,CAAC,KAAc,CAAC;GACpC,sBAAsB,CAAC,KAAc,CAAC;GACtC,OAAO;GAGP,WAAW,IAAa,IAAI;GAC5B,MAAM,EAAE,cAAc,GAAK;EAC7B;CACF,CAAC,EACH,CAAC,GAEK,IAAqC,CAAC;CA2B5C,OA1BA,EAAS,SAAS,GAAG,MAAM;EACzB,IAAM,IAAI,EAAQ,IACZ,IAAQ,EAAU,EAAE,KACpB,IAAwB,EAAwB,CAAC,GACjD,IAAW,IAAwB,KAAQ,GAAO,aAAa,IAC/D,IAAsB,IACxB,IACC,GAAO,uBAAuB,GAC7B,IAAY,IACd,IACC,GAAO,aAAa,MAErB;EAYJ,AAXA,AASK,IATD,KAEO,IADK,KAML,EAAE,YAAyB,KAC7B,EAAE,UAAuB,KACf,MAEnB,EAAI,EAAE,MAAM;GAAE;GAAa;GAAqB;GAAW;EAAS;CACtE,CAAC,GACM;AACT"}
1
+ {"version":3,"file":"use-backends-health.js","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAM,IAAsB,KACtB,IAAmB,KACZ,IAAgC,mBAChC,IAAgC,oBAChC,IACX,kCACW,IAAiC;AAE9C,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAEA,SAAS,EAAwB,GAA2B;CAC1D,OACE,EAAQ,SAAS,WACjB,EAAQ,aAAa,YACrB,CAAC,EAAQ,OAAO,KAAK;AAEzB;AAEA,SAAgB,EACd,GACS;CACT,OAAO,MAAU;AACnB;AAkBA,eAAe,EAAa,GAAiC;CAC3D,IAAI,EAAQ,SAAS,SAAS;EAC5B,IAAI,EAAQ,aAAa,YAAY,CAAC,EAAQ,QAAQ,KAAK,GACzD,MAAU,MAAM,CAA6B;EAG/C,IAAI;GACF,AAAI,EAAQ,aAAa,WACvB,MAAM,EAAsB,CAAO,IAEnC,MAAM,EAAsB,CAAO;EAEvC,SAAS,GAAO;GAUd,MARG,EAAM,aAAa,CAAK,KAAK,EAAM,UAAU,WAAW,OACxD,aAAiB,KAAa,EAAM,WAAW,MAEtC,MAAM,CAA8B,IAE5C,EAAqB,CAAK,IAClB,MAAM,CAAsC,IAElD;EACR;EACA,OAAO;CACT;CAEA,IAAI;EACF,IAAM,IAAgB,EAA4B;GAChD,MAAM,EAAQ;GACd,eAAe,EAAQ,UAAU;GACjC,SAAS;EACX,CAAC;EAID,AAFA,MAAM,IAAI,EAAe,CAAa,EAAE,YAAY,GAEpD,EAAoC,MADX,IAAI,EAAa,CAAa,EAAE,cAAc,CACzB;CAChD,SAAS,GAAO;EAId,MAHI,EAAqB,GAAO,GAAG,IACvB,MAAM,CAA6B,IAEzC;CACR;CACA,OAAO;AACT;AAMA,IAAM,IAAuB,GACvB,IAAuB;AAuB7B,SAAS,EAAsB,GAAyB;CAEtD,OADM,aAAiB,QAErB,EAAM,YAAA,qBACN,EAAM,YAAA,sBACN,EAAM,YAAA,eAJ8B;AAMxC;AAEA,eAAe,EAA2B,GAAiC;CACzE,KAAK,IAAI,IAAU,IAAK,KAAW,GACjC,IAAI;EACF,OAAO,MAAM,EAAa,CAAO;CACnC,SAAS,GAAO;EACd,IAAI,KAAW,KAAwB,CAAC,EAAsB,CAAK,GACjE,MAAM;EAER,MAAM,IAAI,SAAS,MAAY;GAC7B,WAAW,GAAS,CAAoB;EAC1C,CAAC;CACH;AAEJ;AA0CA,SAAgB,EACd,GACA,IAAoC,CAAC,GACN;CAC/B,IAAM,EAAE,uBAAoB,OAAU,GAChC,IAAY,EAAM,qBACtB,GACA,GACA,CACF,GAEM,IAAU,EAAW,EACzB,SAAS,EAAS,KAAK,MAAM;EAC3B,IAAM,IAAQ,EAAU,EAAE,KACpB,IAAwB,EAAwB,CAAC,GACjD,IAAa,GAAO,aAAa,IACjC,IACJ,KACA,EAAE,SAAS,WACX,EAA4B,GAAO,SAAS,GACxC,IACJ,CAAC,MACA,CAAC,KACA,KACA;EACJ,OAAO;GACL,UAAU;IACR;IACA,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE,UAAU;GACd;GACA,SAAS,YAAY;IACnB,IAAI;KACF,IAAM,IAAS,MAAM,EAA2B,CAAC;KAEjD,OADA,EAAqB,EAAE,EAAE,GAClB;IACT,SAAS,GAAK;KAEZ,MADA,EAAqB,EAAE,IAAI,CAAG,GACxB;IACR;GACF;GACA,SAAS;GACT,iBACE,KAAc,IACT,KACD;GACN,6BAA6B;GAC7B,gBAAgB,KAAc,IAAoB,WAAW;GAC7D,oBAAoB,CAAC,KAAc,CAAC;GACpC,sBAAsB,CAAC,KAAc,CAAC;GACtC,OAAO;GAGP,WAAW,IAAa,IAAI;GAC5B,MAAM,EAAE,cAAc,GAAK;EAC7B;CACF,CAAC,EACH,CAAC,GAEK,IAAqC,CAAC;CA2B5C,OA1BA,EAAS,SAAS,GAAG,MAAM;EACzB,IAAM,IAAI,EAAQ,IACZ,IAAQ,EAAU,EAAE,KACpB,IAAwB,EAAwB,CAAC,GACjD,IAAW,IAAwB,KAAQ,GAAO,aAAa,IAC/D,IAAsB,IACxB,IACC,GAAO,uBAAuB,GAC7B,IAAY,IACd,IACC,GAAO,aAAa,MAErB;EAYJ,AAXA,AASK,IATD,KAEO,IADK,KAML,EAAE,YAAyB,KAC7B,EAAE,UAAuB,KACf,MAEnB,EAAI,EAAE,MAAM;GAAE;GAAa;GAAqB;GAAW;EAAS;CACtE,CAAC,GACM;AACT"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../api/event-service/event-service.api.cjs"),n=require("./use-user-conversation.cjs");var r=r=>{let{data:i}=n.useUserConversation(r??null);return e.useQuery({queryKey:[`conversation-history`,r,i?.conversation_url??null,i?.session_api_key??null],enabled:!!r&&!!i,queryFn:async()=>{if(!r)return{events:[],hasMore:!1,nextPageId:null};let e=await t.default.searchEvents(r,i?.conversation_url??null,i?.session_api_key??null,{limit:50,sortOrder:`TIMESTAMP_DESC`});if(!Array.isArray(e.items))throw Error(`Invalid conversation history response: expected page.items to be an array.`);return{events:[...e.items].reverse(),hasMore:!!e.next_page_id||e.items.length>=50,nextPageId:e.next_page_id??null}},staleTime:0,gcTime:1800*1e3,refetchOnMount:`always`,refetchOnWindowFocus:!1})};exports.useConversationHistory=r;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../api/event-service/event-service.api.cjs"),n=require("./use-user-conversation.cjs");var r=r=>{let{data:i}=n.useUserConversation(r??null);return e.useQuery({queryKey:[`conversation-history`,r,i?.conversation_url??null,i?.session_api_key??null],enabled:!!r&&!!i,queryFn:async()=>{if(!r)return{events:[],hasMore:!1,nextPageId:null};let e=await t.default.searchEvents(r,i?.conversation_url??null,i?.session_api_key??null,{limit:50,sortOrder:`TIMESTAMP_DESC`});if(!Array.isArray(e.items))throw Error(`Invalid conversation history response: expected page.items to be an array.`);return{events:[...e.items].reverse(),hasMore:!!e.next_page_id||e.items.length>=50,nextPageId:e.next_page_id??null}},staleTime:0,gcTime:1800*1e3,refetchOnMount:`always`,refetchOnWindowFocus:!1,refetchOnReconnect:!1,retry:1})};exports.useConversationHistory=r;
2
2
  //# sourceMappingURL=use-conversation-history.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-conversation-history.cjs","names":[],"sources":["../../../src/hooks/query/use-conversation-history.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport EventService from \"#/api/event-service/event-service.api\";\nimport { useUserConversation } from \"#/hooks/query/use-user-conversation\";\nimport type { OpenHandsEvent } from \"#/types/agent-server/core\";\n\n/**\n * Number of events to load on the initial REST history fetch and on each\n * subsequent \"scroll-up\" page. The agent server caps `limit` at 100.\n */\nexport const INITIAL_HISTORY_PAGE_SIZE = 50;\n\nexport interface ConversationHistoryPage {\n /** Events in chronological (oldest → newest) order. */\n events: OpenHandsEvent[];\n /** True when the server has more events older than this page. */\n hasMore: boolean;\n /** Optional `next_page_id` from the server for keyset pagination. */\n nextPageId: string | null;\n}\n\n/**\n * Loads the most recent conversation events via REST. The server query is\n * sorted `TIMESTAMP_DESC` so we can request just the tail of the conversation;\n * we reverse the result to chronological order before handing it to callers.\n *\n * Older events are loaded on demand by `useLoadOlderEvents` once the user\n * scrolls up. The WebSocket then connects with `resend_mode='since'` using\n * the latest event's timestamp so we don't re-receive history we already have.\n */\nexport const useConversationHistory = (conversationId?: string) => {\n const { data: conversation } = useUserConversation(conversationId ?? null);\n\n return useQuery<ConversationHistoryPage>({\n queryKey: [\n \"conversation-history\",\n conversationId,\n // Include the conversation's host + key so a backend swap (or a\n // re-provisioned cloud sandbox with a new URL) re-fetches.\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n ],\n enabled: !!conversationId && !!conversation,\n queryFn: async () => {\n if (!conversationId) {\n return { events: [], hasMore: false, nextPageId: null };\n }\n\n const page = await EventService.searchEvents(\n conversationId,\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n {\n limit: INITIAL_HISTORY_PAGE_SIZE,\n sortOrder: \"TIMESTAMP_DESC\",\n },\n );\n\n if (!Array.isArray(page.items)) {\n throw new Error(\n \"Invalid conversation history response: expected page.items to be an array.\",\n );\n }\n\n // Reverse so callers can append in chronological order.\n const events = [...page.items].reverse();\n return {\n events,\n hasMore:\n !!page.next_page_id || page.items.length >= INITIAL_HISTORY_PAGE_SIZE,\n nextPageId: page.next_page_id ?? null,\n };\n },\n // Keep the cached page so returning to a conversation renders the\n // last-known discussion instantly (no skeleton). But refetch the tail on\n // mount so events produced while we were away — e.g. an active /goal loop\n // that keeps emitting user + agent turns while we're on another\n // conversation — arrive in one batched REST page instead of being\n // back-filled one event at a time over the WebSocket `since` replay. The\n // cached tail's newest timestamp never advances on its own, so without this\n // refetch every return replays the entire post-first-load history over the\n // socket (and it gets worse the longer the goal has been running).\n //\n // refetchOnWindowFocus is disabled because the WebSocket connection is\n // gated on this query settling (see conversation-websocket-context.tsx); a\n // focus-driven refetch would otherwise needlessly drop and reconnect it.\n staleTime: 0,\n gcTime: 30 * 60 * 1000, // 30 minutes — keep cached data to render instantly on return\n refetchOnMount: \"always\",\n refetchOnWindowFocus: false,\n });\n};\n"],"mappings":"0OA6BA,IAAa,EAA0B,GAA4B,CACjE,GAAM,CAAE,KAAM,GAAiB,EAAA,oBAAoB,GAAkB,IAAI,EAEzE,OAAO,EAAA,SAAkC,CACvC,SAAU,CACR,uBACA,EAGA,GAAc,kBAAoB,KAClC,GAAc,iBAAmB,IACnC,EACA,QAAS,CAAC,CAAC,GAAkB,CAAC,CAAC,EAC/B,QAAS,SAAY,CACnB,GAAI,CAAC,EACH,MAAO,CAAE,OAAQ,CAAC,EAAG,QAAS,GAAO,WAAY,IAAK,EAGxD,IAAM,EAAO,MAAM,EAAA,QAAa,aAC9B,EACA,GAAc,kBAAoB,KAClC,GAAc,iBAAmB,KACjC,CACE,MAAA,GACA,UAAW,gBACb,CACF,EAEA,GAAI,CAAC,MAAM,QAAQ,EAAK,KAAK,EAC3B,MAAU,MACR,4EACF,EAKF,MAAO,CACL,OAFa,CAAC,GAAG,EAAK,KAAK,EAAE,QAE7B,EACA,QACE,CAAC,CAAC,EAAK,cAAgB,EAAK,MAAM,QAAA,GACpC,WAAY,EAAK,cAAgB,IACnC,CACF,EAcA,UAAW,EACX,OAAQ,KAAU,IAClB,eAAgB,SAChB,qBAAsB,EACxB,CAAC,CACH"}
1
+ {"version":3,"file":"use-conversation-history.cjs","names":[],"sources":["../../../src/hooks/query/use-conversation-history.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport EventService from \"#/api/event-service/event-service.api\";\nimport { useUserConversation } from \"#/hooks/query/use-user-conversation\";\nimport type { OpenHandsEvent } from \"#/types/agent-server/core\";\n\n/**\n * Number of events to load on the initial REST history fetch and on each\n * subsequent \"scroll-up\" page. The agent server caps `limit` at 100.\n */\nexport const INITIAL_HISTORY_PAGE_SIZE = 50;\n\nexport interface ConversationHistoryPage {\n /** Events in chronological (oldest → newest) order. */\n events: OpenHandsEvent[];\n /** True when the server has more events older than this page. */\n hasMore: boolean;\n /** Optional `next_page_id` from the server for keyset pagination. */\n nextPageId: string | null;\n}\n\n/**\n * Loads the most recent conversation events via REST. The server query is\n * sorted `TIMESTAMP_DESC` so we can request just the tail of the conversation;\n * we reverse the result to chronological order before handing it to callers.\n *\n * Older events are loaded on demand by `useLoadOlderEvents` once the user\n * scrolls up. The WebSocket then connects with `resend_mode='since'` using\n * the latest event's timestamp so we don't re-receive history we already have.\n */\nexport const useConversationHistory = (conversationId?: string) => {\n const { data: conversation } = useUserConversation(conversationId ?? null);\n\n return useQuery<ConversationHistoryPage>({\n queryKey: [\n \"conversation-history\",\n conversationId,\n // Include the conversation's host + key so a backend swap (or a\n // re-provisioned cloud sandbox with a new URL) re-fetches.\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n ],\n enabled: !!conversationId && !!conversation,\n queryFn: async () => {\n if (!conversationId) {\n return { events: [], hasMore: false, nextPageId: null };\n }\n\n const page = await EventService.searchEvents(\n conversationId,\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n {\n limit: INITIAL_HISTORY_PAGE_SIZE,\n sortOrder: \"TIMESTAMP_DESC\",\n },\n );\n\n if (!Array.isArray(page.items)) {\n throw new Error(\n \"Invalid conversation history response: expected page.items to be an array.\",\n );\n }\n\n // Reverse so callers can append in chronological order.\n const events = [...page.items].reverse();\n return {\n events,\n hasMore:\n !!page.next_page_id || page.items.length >= INITIAL_HISTORY_PAGE_SIZE,\n nextPageId: page.next_page_id ?? null,\n };\n },\n // Keep the cached page so returning to a conversation renders the\n // last-known discussion instantly (no skeleton). But refetch the tail on\n // mount so events produced while we were away — e.g. an active /goal loop\n // that keeps emitting user + agent turns while we're on another\n // conversation — arrive in one batched REST page instead of being\n // back-filled one event at a time over the WebSocket `since` replay. The\n // cached tail's newest timestamp never advances on its own, so without this\n // refetch every return replays the entire post-first-load history over the\n // socket (and it gets worse the longer the goal has been running).\n //\n // refetchOnWindowFocus and refetchOnReconnect are disabled: focus changes\n // and online/offline flapping (frequent on flaky links) would refetch this\n // query in a loop, and events missed while offline arrive over the\n // WebSocket `since` replay on reconnect anyway. retry is capped at 1 so a\n // slow or failing initial load (60s HTTP timeout per attempt) can't hold\n // the initial WebSocket gate (see conversation-websocket-context.tsx)\n // closed for minutes on failure the socket connects with\n // `resend_mode='all'` instead.\n staleTime: 0,\n gcTime: 30 * 60 * 1000, // 30 minutes — keep cached data to render instantly on return\n refetchOnMount: \"always\",\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: 1,\n });\n};\n"],"mappings":"0OA6BA,IAAa,EAA0B,GAA4B,CACjE,GAAM,CAAE,KAAM,GAAiB,EAAA,oBAAoB,GAAkB,IAAI,EAEzE,OAAO,EAAA,SAAkC,CACvC,SAAU,CACR,uBACA,EAGA,GAAc,kBAAoB,KAClC,GAAc,iBAAmB,IACnC,EACA,QAAS,CAAC,CAAC,GAAkB,CAAC,CAAC,EAC/B,QAAS,SAAY,CACnB,GAAI,CAAC,EACH,MAAO,CAAE,OAAQ,CAAC,EAAG,QAAS,GAAO,WAAY,IAAK,EAGxD,IAAM,EAAO,MAAM,EAAA,QAAa,aAC9B,EACA,GAAc,kBAAoB,KAClC,GAAc,iBAAmB,KACjC,CACE,MAAA,GACA,UAAW,gBACb,CACF,EAEA,GAAI,CAAC,MAAM,QAAQ,EAAK,KAAK,EAC3B,MAAU,MACR,4EACF,EAKF,MAAO,CACL,OAFa,CAAC,GAAG,EAAK,KAAK,EAAE,QAE7B,EACA,QACE,CAAC,CAAC,EAAK,cAAgB,EAAK,MAAM,QAAA,GACpC,WAAY,EAAK,cAAgB,IACnC,CACF,EAmBA,UAAW,EACX,OAAQ,KAAU,IAClB,eAAgB,SAChB,qBAAsB,GACtB,mBAAoB,GACpB,MAAO,CACT,CAAC,CACH"}
@@ -31,7 +31,9 @@ var r = (r) => {
31
31
  staleTime: 0,
32
32
  gcTime: 1800 * 1e3,
33
33
  refetchOnMount: "always",
34
- refetchOnWindowFocus: !1
34
+ refetchOnWindowFocus: !1,
35
+ refetchOnReconnect: !1,
36
+ retry: 1
35
37
  });
36
38
  };
37
39
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-conversation-history.js","names":[],"sources":["../../../src/hooks/query/use-conversation-history.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport EventService from \"#/api/event-service/event-service.api\";\nimport { useUserConversation } from \"#/hooks/query/use-user-conversation\";\nimport type { OpenHandsEvent } from \"#/types/agent-server/core\";\n\n/**\n * Number of events to load on the initial REST history fetch and on each\n * subsequent \"scroll-up\" page. The agent server caps `limit` at 100.\n */\nexport const INITIAL_HISTORY_PAGE_SIZE = 50;\n\nexport interface ConversationHistoryPage {\n /** Events in chronological (oldest → newest) order. */\n events: OpenHandsEvent[];\n /** True when the server has more events older than this page. */\n hasMore: boolean;\n /** Optional `next_page_id` from the server for keyset pagination. */\n nextPageId: string | null;\n}\n\n/**\n * Loads the most recent conversation events via REST. The server query is\n * sorted `TIMESTAMP_DESC` so we can request just the tail of the conversation;\n * we reverse the result to chronological order before handing it to callers.\n *\n * Older events are loaded on demand by `useLoadOlderEvents` once the user\n * scrolls up. The WebSocket then connects with `resend_mode='since'` using\n * the latest event's timestamp so we don't re-receive history we already have.\n */\nexport const useConversationHistory = (conversationId?: string) => {\n const { data: conversation } = useUserConversation(conversationId ?? null);\n\n return useQuery<ConversationHistoryPage>({\n queryKey: [\n \"conversation-history\",\n conversationId,\n // Include the conversation's host + key so a backend swap (or a\n // re-provisioned cloud sandbox with a new URL) re-fetches.\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n ],\n enabled: !!conversationId && !!conversation,\n queryFn: async () => {\n if (!conversationId) {\n return { events: [], hasMore: false, nextPageId: null };\n }\n\n const page = await EventService.searchEvents(\n conversationId,\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n {\n limit: INITIAL_HISTORY_PAGE_SIZE,\n sortOrder: \"TIMESTAMP_DESC\",\n },\n );\n\n if (!Array.isArray(page.items)) {\n throw new Error(\n \"Invalid conversation history response: expected page.items to be an array.\",\n );\n }\n\n // Reverse so callers can append in chronological order.\n const events = [...page.items].reverse();\n return {\n events,\n hasMore:\n !!page.next_page_id || page.items.length >= INITIAL_HISTORY_PAGE_SIZE,\n nextPageId: page.next_page_id ?? null,\n };\n },\n // Keep the cached page so returning to a conversation renders the\n // last-known discussion instantly (no skeleton). But refetch the tail on\n // mount so events produced while we were away — e.g. an active /goal loop\n // that keeps emitting user + agent turns while we're on another\n // conversation — arrive in one batched REST page instead of being\n // back-filled one event at a time over the WebSocket `since` replay. The\n // cached tail's newest timestamp never advances on its own, so without this\n // refetch every return replays the entire post-first-load history over the\n // socket (and it gets worse the longer the goal has been running).\n //\n // refetchOnWindowFocus is disabled because the WebSocket connection is\n // gated on this query settling (see conversation-websocket-context.tsx); a\n // focus-driven refetch would otherwise needlessly drop and reconnect it.\n staleTime: 0,\n gcTime: 30 * 60 * 1000, // 30 minutes — keep cached data to render instantly on return\n refetchOnMount: \"always\",\n refetchOnWindowFocus: false,\n });\n};\n"],"mappings":";;;AA6BA,IAAa,KAA0B,MAA4B;CACjE,IAAM,EAAE,MAAM,MAAiB,EAAoB,KAAkB,IAAI;CAEzE,OAAO,EAAkC;EACvC,UAAU;GACR;GACA;GAGA,GAAc,oBAAoB;GAClC,GAAc,mBAAmB;EACnC;EACA,SAAS,CAAC,CAAC,KAAkB,CAAC,CAAC;EAC/B,SAAS,YAAY;GACnB,IAAI,CAAC,GACH,OAAO;IAAE,QAAQ,CAAC;IAAG,SAAS;IAAO,YAAY;GAAK;GAGxD,IAAM,IAAO,MAAM,EAAa,aAC9B,GACA,GAAc,oBAAoB,MAClC,GAAc,mBAAmB,MACjC;IACE,OAAA;IACA,WAAW;GACb,CACF;GAEA,IAAI,CAAC,MAAM,QAAQ,EAAK,KAAK,GAC3B,MAAU,MACR,4EACF;GAKF,OAAO;IACL,QAFa,CAAC,GAAG,EAAK,KAAK,EAAE,QAE7B;IACA,SACE,CAAC,CAAC,EAAK,gBAAgB,EAAK,MAAM,UAAA;IACpC,YAAY,EAAK,gBAAgB;GACnC;EACF;EAcA,WAAW;EACX,QAAQ,OAAU;EAClB,gBAAgB;EAChB,sBAAsB;CACxB,CAAC;AACH"}
1
+ {"version":3,"file":"use-conversation-history.js","names":[],"sources":["../../../src/hooks/query/use-conversation-history.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport EventService from \"#/api/event-service/event-service.api\";\nimport { useUserConversation } from \"#/hooks/query/use-user-conversation\";\nimport type { OpenHandsEvent } from \"#/types/agent-server/core\";\n\n/**\n * Number of events to load on the initial REST history fetch and on each\n * subsequent \"scroll-up\" page. The agent server caps `limit` at 100.\n */\nexport const INITIAL_HISTORY_PAGE_SIZE = 50;\n\nexport interface ConversationHistoryPage {\n /** Events in chronological (oldest → newest) order. */\n events: OpenHandsEvent[];\n /** True when the server has more events older than this page. */\n hasMore: boolean;\n /** Optional `next_page_id` from the server for keyset pagination. */\n nextPageId: string | null;\n}\n\n/**\n * Loads the most recent conversation events via REST. The server query is\n * sorted `TIMESTAMP_DESC` so we can request just the tail of the conversation;\n * we reverse the result to chronological order before handing it to callers.\n *\n * Older events are loaded on demand by `useLoadOlderEvents` once the user\n * scrolls up. The WebSocket then connects with `resend_mode='since'` using\n * the latest event's timestamp so we don't re-receive history we already have.\n */\nexport const useConversationHistory = (conversationId?: string) => {\n const { data: conversation } = useUserConversation(conversationId ?? null);\n\n return useQuery<ConversationHistoryPage>({\n queryKey: [\n \"conversation-history\",\n conversationId,\n // Include the conversation's host + key so a backend swap (or a\n // re-provisioned cloud sandbox with a new URL) re-fetches.\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n ],\n enabled: !!conversationId && !!conversation,\n queryFn: async () => {\n if (!conversationId) {\n return { events: [], hasMore: false, nextPageId: null };\n }\n\n const page = await EventService.searchEvents(\n conversationId,\n conversation?.conversation_url ?? null,\n conversation?.session_api_key ?? null,\n {\n limit: INITIAL_HISTORY_PAGE_SIZE,\n sortOrder: \"TIMESTAMP_DESC\",\n },\n );\n\n if (!Array.isArray(page.items)) {\n throw new Error(\n \"Invalid conversation history response: expected page.items to be an array.\",\n );\n }\n\n // Reverse so callers can append in chronological order.\n const events = [...page.items].reverse();\n return {\n events,\n hasMore:\n !!page.next_page_id || page.items.length >= INITIAL_HISTORY_PAGE_SIZE,\n nextPageId: page.next_page_id ?? null,\n };\n },\n // Keep the cached page so returning to a conversation renders the\n // last-known discussion instantly (no skeleton). But refetch the tail on\n // mount so events produced while we were away — e.g. an active /goal loop\n // that keeps emitting user + agent turns while we're on another\n // conversation — arrive in one batched REST page instead of being\n // back-filled one event at a time over the WebSocket `since` replay. The\n // cached tail's newest timestamp never advances on its own, so without this\n // refetch every return replays the entire post-first-load history over the\n // socket (and it gets worse the longer the goal has been running).\n //\n // refetchOnWindowFocus and refetchOnReconnect are disabled: focus changes\n // and online/offline flapping (frequent on flaky links) would refetch this\n // query in a loop, and events missed while offline arrive over the\n // WebSocket `since` replay on reconnect anyway. retry is capped at 1 so a\n // slow or failing initial load (60s HTTP timeout per attempt) can't hold\n // the initial WebSocket gate (see conversation-websocket-context.tsx)\n // closed for minutes on failure the socket connects with\n // `resend_mode='all'` instead.\n staleTime: 0,\n gcTime: 30 * 60 * 1000, // 30 minutes — keep cached data to render instantly on return\n refetchOnMount: \"always\",\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: 1,\n });\n};\n"],"mappings":";;;AA6BA,IAAa,KAA0B,MAA4B;CACjE,IAAM,EAAE,MAAM,MAAiB,EAAoB,KAAkB,IAAI;CAEzE,OAAO,EAAkC;EACvC,UAAU;GACR;GACA;GAGA,GAAc,oBAAoB;GAClC,GAAc,mBAAmB;EACnC;EACA,SAAS,CAAC,CAAC,KAAkB,CAAC,CAAC;EAC/B,SAAS,YAAY;GACnB,IAAI,CAAC,GACH,OAAO;IAAE,QAAQ,CAAC;IAAG,SAAS;IAAO,YAAY;GAAK;GAGxD,IAAM,IAAO,MAAM,EAAa,aAC9B,GACA,GAAc,oBAAoB,MAClC,GAAc,mBAAmB,MACjC;IACE,OAAA;IACA,WAAW;GACb,CACF;GAEA,IAAI,CAAC,MAAM,QAAQ,EAAK,KAAK,GAC3B,MAAU,MACR,4EACF;GAKF,OAAO;IACL,QAFa,CAAC,GAAG,EAAK,KAAK,EAAE,QAE7B;IACA,SACE,CAAC,CAAC,EAAK,gBAAgB,EAAK,MAAM,UAAA;IACpC,YAAY,EAAK,gBAAgB;GACnC;EACF;EAmBA,WAAW;EACX,QAAQ,OAAU;EAClB,gBAAgB;EAChB,sBAAsB;EACtB,oBAAoB;EACpB,OAAO;CACT,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../api/conversation-service/agent-server-conversation-service.api.cjs"),n=require("../../utils/conversation-metrics.cjs");var r=(r,i,a,o=!0)=>{let s=e.useQuery({queryKey:[`conversation-metrics`,r,i,a],queryFn:async()=>{if(!r)throw Error(`Conversation ID is required`);return n.getCombinedMetrics(await t.default.getRuntimeConversation(r,i,a))},enabled:o&&!!r,staleTime:1e3*30,gcTime:1e3*60*5,refetchInterval:1e3*30,retry:!1});return{data:s.data,isLoading:s.isLoading,error:s.error}};exports.useConversationMetrics=r;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../../utils/conversation-metrics.cjs"),n=require("../../api/conversation-service/agent-server-conversation-service.api.cjs");var r=(r,i,a,o=!0)=>{let s=e.useQuery({queryKey:[`conversation-metrics`,r,i,a],queryFn:async()=>{if(!r)throw Error(`Conversation ID is required`);return t.getCombinedMetrics(await n.default.getRuntimeConversation(r,i,a))},enabled:o&&!!r,staleTime:1e3*30,gcTime:1e3*60*5,refetchInterval:1e3*30,retry:!1});return{data:s.data,isLoading:s.isLoading,error:s.error}};exports.useConversationMetrics=r;
2
2
  //# sourceMappingURL=use-conversation-metrics.cjs.map
@@ -1,6 +1,6 @@
1
1
  import { useQuery as e } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
2
- import t from "../../api/conversation-service/agent-server-conversation-service.api.js";
3
- import { getCombinedMetrics as n } from "../../utils/conversation-metrics.js";
2
+ import { getCombinedMetrics as t } from "../../utils/conversation-metrics.js";
3
+ import n from "../../api/conversation-service/agent-server-conversation-service.api.js";
4
4
  //#region src/hooks/query/use-conversation-metrics.ts
5
5
  var r = (r, i, a, o = !0) => {
6
6
  let s = e({
@@ -12,7 +12,7 @@ var r = (r, i, a, o = !0) => {
12
12
  ],
13
13
  queryFn: async () => {
14
14
  if (!r) throw Error("Conversation ID is required");
15
- return n(await t.getRuntimeConversation(r, i, a));
15
+ return t(await n.getRuntimeConversation(r, i, a));
16
16
  },
17
17
  enabled: o && !!r,
18
18
  staleTime: 1e3 * 30,
@@ -0,0 +1,19 @@
1
+ import type { GitSyncConfigUpdateRequest } from "#/types/git-sync";
2
+ export declare const GIT_SYNC_STATUS_QUERY_KEY: readonly ["git-sync-status"];
3
+ interface UseGitSyncStatusOptions {
4
+ enabled?: boolean;
5
+ refetchInterval?: number | false;
6
+ }
7
+ export declare function useGitSyncStatus(options?: UseGitSyncStatusOptions): import("@tanstack/react-query").UseQueryResult<NoInfer<import("#/types/git-sync").GitSyncStatus>, import("axios").AxiosError<unknown, any>>;
8
+ export declare function useUpdateGitSyncConfig(): import("@tanstack/react-query").UseMutationResult<import("#/types/git-sync").GitSyncStatus, import("axios").AxiosError<unknown, any>, GitSyncConfigUpdateRequest, unknown>;
9
+ /**
10
+ * Test a configuration against its remote before saving it.
11
+ *
12
+ * Deliberately not retried and never surfaced as a toast: the form treats a
13
+ * check it cannot complete -- an older automation backend answering 404,
14
+ * a network failure -- as "no opinion" and saves anyway, so a check that is
15
+ * itself broken can never become the thing that blocks a save.
16
+ */
17
+ export declare function useCheckGitSyncConfig(): import("@tanstack/react-query").UseMutationResult<import("#/types/git-sync").GitSyncCheckResponse, import("axios").AxiosError<unknown, any>, GitSyncConfigUpdateRequest, unknown>;
18
+ export declare function useTriggerGitSync(): import("@tanstack/react-query").UseMutationResult<import("#/types/git-sync").GitSyncTriggerResponse, import("axios").AxiosError<unknown, any>, void, unknown>;
19
+ export {};
@@ -0,0 +1 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs"),require("../../contexts/active-backend-context.cjs"),require("../../api/automation-service/automation-service.api.cjs"),require("./use-automation-detail.cjs");
@@ -6,6 +6,8 @@ export interface LatestAutomationRunState {
6
6
  latestRun: AutomationRun | null;
7
7
  /** Newest-first recent runs for the activity sparkline (may be empty). */
8
8
  recentRuns: AutomationRun[];
9
+ /** Lifetime run count from the runs response, when known. */
10
+ total?: number;
9
11
  isLoading: boolean;
10
12
  isError: boolean;
11
13
  }
@@ -0,0 +1,3 @@
1
+ import "../../contexts/active-backend-context.js";
2
+ import "../../api/automation-service/automation-service.api.js";
3
+ import "./use-automation-detail.js";
@@ -3,4 +3,4 @@ export { LLM_PROFILES_QUERY_KEYS };
3
3
  interface UseLlmProfilesOptions {
4
4
  enabled?: boolean;
5
5
  }
6
- export declare function useLlmProfiles(options?: UseLlmProfilesOptions): import("@tanstack/react-query").UseQueryResult<NoInfer<import("@openhands/typescript-client").ProfileListResponse>, import("axios").AxiosError<unknown, any>>;
6
+ export declare function useLlmProfiles(options?: UseLlmProfilesOptions): import("@tanstack/react-query").UseQueryResult<NoInfer<import("#/api/profiles-service/profiles-service.api").ProfileListResponse>, import("axios").AxiosError<unknown, any>>;
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../api/backend-registry/active-store.cjs"),t=require("../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.cjs"),n=require("../../contexts/active-backend-context.cjs"),r=require("../../api/conversation-service/agent-server-conversation-service.api.cjs"),i=require("./use-is-authed.cjs");var a=(a=20)=>{let{data:o}=i.useIsAuthed(),s=n.useActiveBackend(),c=!e.isNoBackend(s.backend);return t.useInfiniteQuery({queryKey:[`user`,`conversations`,`paginated`,a,s.backend.id,s.orgId],queryFn:async({pageParam:e})=>await r.default.searchConversations(a,e),enabled:!!o&&c,getNextPageParam:e=>e.next_page_id,initialPageParam:void 0,refetchInterval:1e4,meta:{backendId:s.backend.id}})};exports.usePaginatedConversations=a;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../api/backend-registry/active-store.cjs"),t=require("../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.cjs"),n=require("../../contexts/active-backend-context.cjs"),r=require("../../api/conversation-service/agent-server-conversation-service.api.cjs"),i=require("./use-is-authed.cjs");var a=(a=20)=>{let{data:o}=i.useIsAuthed(),s=n.useActiveBackend(),c=!e.isNoBackend(s.backend);return t.useInfiniteQuery({queryKey:[`user`,`conversations`,`paginated`,a,s.backend.id,s.orgId],queryFn:async({pageParam:e})=>await r.default.searchConversations(a,e),enabled:!!o&&c,getNextPageParam:e=>e.next_page_id,initialPageParam:void 0,refetchInterval:3e4,meta:{backendId:s.backend.id}})};exports.usePaginatedConversations=a;
2
2
  //# sourceMappingURL=use-paginated-conversations.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-paginated-conversations.cjs","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 10s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Consumers must gate initial-load\n // UI (e.g. skeletons) on `isLoading`, not `isFetching` — `isFetching`\n // flips back to true on every background refetch, which would cause the\n // skeleton to flicker every 10s when the list is empty.\n refetchInterval: 10_000,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":"qXAOA,IAAa,GAA6B,EAAgB,KAAO,CAC/D,GAAM,CAAE,KAAM,GAAwB,EAAA,YAAY,EAC5C,EAAS,EAAA,iBAAiB,EAC1B,EAAa,CAAC,EAAA,YAAY,EAAO,OAAO,EAE9C,OAAO,EAAA,iBAAiB,CAKtB,SAAU,CACR,OACA,gBACA,YACA,EACA,EAAO,QAAQ,GACf,EAAO,KACT,EACA,QAAS,MAAO,CAAE,eAMT,MALc,EAAA,QAA+B,oBAClD,EACA,CACF,EAIF,QAAS,CAAC,CAAC,GAAuB,EAClC,iBAAmB,GAAkC,EAAS,aAC9D,iBAAkB,IAAA,GAMlB,gBAAiB,IAIjB,KAAM,CAAE,UAAW,EAAO,QAAQ,EAAG,CACvC,CAAC,CACH"}
1
+ {"version":3,"file":"use-paginated-conversations.cjs","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 30s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Each response carries the full\n // conversation objects, so on slow links a tighter interval degrades into\n // a continuous download that starves the rest of the app (including the\n // events WebSocket handshake). Consumers must gate initial-load UI (e.g.\n // skeletons) on `isLoading`, not `isFetching` — `isFetching` flips back to\n // true on every background refetch, which would cause the skeleton to\n // flicker on each poll when the list is empty.\n refetchInterval: 30_000,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":"qXAOA,IAAa,GAA6B,EAAgB,KAAO,CAC/D,GAAM,CAAE,KAAM,GAAwB,EAAA,YAAY,EAC5C,EAAS,EAAA,iBAAiB,EAC1B,EAAa,CAAC,EAAA,YAAY,EAAO,OAAO,EAE9C,OAAO,EAAA,iBAAiB,CAKtB,SAAU,CACR,OACA,gBACA,YACA,EACA,EAAO,QAAQ,GACf,EAAO,KACT,EACA,QAAS,MAAO,CAAE,eAMT,MALc,EAAA,QAA+B,oBAClD,EACA,CACF,EAIF,QAAS,CAAC,CAAC,GAAuB,EAClC,iBAAmB,GAAkC,EAAS,aAC9D,iBAAkB,IAAA,GASlB,gBAAiB,IAIjB,KAAM,CAAE,UAAW,EAAO,QAAQ,EAAG,CACvC,CAAC,CACH"}
@@ -19,7 +19,7 @@ var a = (a = 20) => {
19
19
  enabled: !!o && c,
20
20
  getNextPageParam: (e) => e.next_page_id,
21
21
  initialPageParam: void 0,
22
- refetchInterval: 1e4,
22
+ refetchInterval: 3e4,
23
23
  meta: { backendId: s.backend.id }
24
24
  });
25
25
  };