@openhands/agent-canvas 1.1.0 → 1.2.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 (1373) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/Trans-De9RwQhA.js +1 -0
  4. package/build/assets/__vite-browser-external-4xJsU2-u.js +1 -0
  5. package/build/assets/{acp-providers-B_ZxlEbx.js → acp-providers-D_D8VUpP.js} +1 -1
  6. package/build/assets/active-backend-context-DRFevVIj.js +1 -0
  7. package/build/assets/add-backend-modal-DzuB9zlG.js +1 -0
  8. package/build/assets/agent-profiles-settings-BfAwTshW.js +1 -0
  9. package/build/assets/{agent-server-client-options-CxnCYyIW.js → agent-server-client-options-DVLRd9sw.js} +1 -1
  10. package/build/assets/agent-server-conversation-service.api-DfH2k6Sx.js +5 -0
  11. package/build/assets/agent-settings-CMMms-0q.js +1 -0
  12. package/build/assets/agent-settings-DjVlKgaP.js +2 -0
  13. package/build/assets/alert-banner-BW0wRYw6.js +1 -0
  14. package/build/assets/api-key-entry-screen-O8gS-fnF.js +1 -0
  15. package/build/assets/app-settings-SlZvaXlk.js +1 -0
  16. package/build/assets/automation-detail-CwsNJ9AM.js +2 -0
  17. package/build/assets/automations-list-B9cPtugh.js +1 -0
  18. package/build/assets/back-nav-button-BYmxFxGt.js +1 -0
  19. package/build/assets/backend-form-modal-D2EDGVAc.js +1 -0
  20. package/build/assets/backend-synced-settings-badge-6OCwIuLY.js +1 -0
  21. package/build/assets/base-modal-CC5Pp8CF.js +1 -0
  22. package/build/assets/bot-D7eUAuSB.js +1 -0
  23. package/build/assets/brand-button-DKPMEKcW.js +1 -0
  24. package/build/assets/{browser-CCwPzPsD.js → browser-B39N74jU.js} +2 -2
  25. package/build/assets/browser-store-BI6uklCG.js +1 -0
  26. package/build/assets/browser-tab-aiDg7aEn.js +1 -0
  27. package/build/assets/chat-send-button-DxuZIoW8.js +1 -0
  28. package/build/assets/check-Bvi71siz.js +1 -0
  29. package/build/assets/checkmark-h7udgXMM.js +1 -0
  30. package/build/assets/{chevron-down-BxZEAIv4.js → chevron-down-CI8A6tet.js} +1 -1
  31. package/build/assets/circle-plus-check-toggle-T3eAIuPQ.js +1 -0
  32. package/build/assets/close-p3Op5lxI.js +1 -0
  33. package/build/assets/code-tag-DYlAhEQY.js +1 -0
  34. package/build/assets/{color-themes-CTNRQd1a.js → color-themes-Dd1sO5U6.js} +1 -1
  35. package/build/assets/combobox-caret-CLGvOs32.js +1 -0
  36. package/build/assets/command-menu-DKrLCRla.js +1 -0
  37. package/build/assets/{command-store-C-57Heey.js → command-store-D8J5LMW1.js} +1 -1
  38. package/build/assets/condenser-settings-BhxvlfoY.js +1 -0
  39. package/build/assets/confirmation-modal-BK1F0A68.js +1 -0
  40. package/build/assets/context-menu-list-item-DBFzplWW.js +1 -0
  41. package/build/assets/conversation-B8prFAZF.js +19 -0
  42. package/build/assets/conversation-DGVDwGn8.js +1 -0
  43. package/build/assets/conversation-local-storage-F6zVMM--.js +1 -0
  44. package/build/assets/conversation-panel-C7DC4Cxx.js +1 -0
  45. package/build/assets/conversation-service.api-Ch9kR9aE.js +1 -0
  46. package/build/assets/conversation-state-store-B2Bp32XI.js +1 -0
  47. package/build/assets/conversation-store-LptbOvKa.js +1 -0
  48. package/build/assets/conversation-tab-empty-state-m8IUkfMj.js +1 -0
  49. package/build/assets/copy-3JCw_XFB.js +1 -0
  50. package/build/assets/copy-BLmGeJcd.js +1 -0
  51. package/build/assets/copy-to-clipboard-button-Aj9wFmt2.js +1 -0
  52. package/build/assets/createLucideIcon-CVAsW2Yo.js +1 -0
  53. package/build/assets/declaration-B9kpCaYl.js +1 -0
  54. package/build/assets/device-verify-B5YCrvSu.js +1 -0
  55. package/build/assets/dist-CodhvuAP.js +1 -0
  56. package/build/assets/dropdown-classes-CgQ45JmQ.js +1 -0
  57. package/build/assets/edit-automation-modal-BoibW8cd.js +1 -0
  58. package/build/assets/ellipsis-button-1BV9Sga8.js +1 -0
  59. package/build/assets/entry.client-BgWj9jL_.js +2 -0
  60. package/build/assets/enum-filter-dropdown-DCITiYVi.js +1 -0
  61. package/build/assets/environment-switch-overlay-DUnKILNH.js +1 -0
  62. package/build/assets/extensions-hub-MtC8lK3A.js +1 -0
  63. package/build/assets/{extensions-navigation-DfLHdTUC.js → extensions-navigation-BtV14oQL.js} +1 -1
  64. package/build/assets/{external-link-D8njjDTk.js → external-link-D2zJjE9G.js} +1 -1
  65. package/build/assets/files-tab-DHqtsKLy.js +1 -0
  66. package/build/assets/files-tab-store-DJsPxYdg.js +1 -0
  67. package/build/assets/folder-mMWFvaw0.js +1 -0
  68. package/build/assets/form-control-classes-9rkU4usZ.js +1 -0
  69. package/build/assets/get-language-from-path-CPNnuVhI.js +1 -0
  70. package/build/assets/git-provider-icon-CGU7_KiU.js +1 -0
  71. package/build/assets/home-BgjWP_UN.js +1 -0
  72. package/build/assets/iconBase-DaTRRUjy.js +1 -0
  73. package/build/assets/index-redirect-CUUJiNki.js +1 -0
  74. package/build/assets/install-server-modal-J_eQ6lhG.js +1 -0
  75. package/build/assets/launch-DamfAY5L.js +1 -0
  76. package/build/assets/lesson-plan-HD886V64.js +4 -0
  77. package/build/assets/link-external-DfKQroKX.js +1 -0
  78. package/build/assets/{list-todo-B_Ts2JmZ.js → list-todo-BfH6yYUK.js} +1 -1
  79. package/build/assets/llm-not-configured-banner-DTrLsVr_.js +27 -0
  80. package/build/assets/llm-settings-BgSFkbHC.js +1 -0
  81. package/build/assets/llm-settings-Bkc8C5Bi.js +1 -0
  82. package/build/assets/{llm-subscription-service-BX_AtNlO.js → llm-subscription-service-CKyaV24y.js} +1 -1
  83. package/build/assets/loader-circle-BEykUKYG.js +1 -0
  84. package/build/assets/loading-spinner-DHAIPZkP.js +1 -0
  85. package/build/assets/manage-backends-modal-BUzj5_Lq.js +1 -0
  86. package/build/assets/manifest-4d6a1552.js +1 -0
  87. package/build/assets/{markdown-renderer-DWy7Np7u.js → markdown-renderer-D8mayGjI.js} +1 -1
  88. package/build/assets/mcp-DvqJYDbz.js +9 -0
  89. package/build/assets/messages-C4KEFkPk.js +40 -0
  90. package/build/assets/middleware-DYHYNAnP.js +6 -0
  91. package/build/assets/modal-backdrop-zVwfOJZr.js +1 -0
  92. package/build/assets/modal-body-Dcu5McCa.js +1 -0
  93. package/build/assets/{modal-classes-C4kS6ib_.js → modal-classes-DPqxSyuP.js} +1 -1
  94. package/build/assets/modal-close-button-CTCX4nCH.js +1 -0
  95. package/build/assets/model-selector-VDHBytb6.js +1 -0
  96. package/build/assets/{mouse-pointer-click-CXAx4FyM.js → mouse-pointer-click-PdEQPL6v.js} +1 -1
  97. package/build/assets/navigation-context-DPs2G0X8.js +1 -0
  98. package/build/assets/navigation-link-D8hfwvxI.js +1 -0
  99. package/build/assets/onboarding-gGIqoxvA.js +1 -0
  100. package/build/assets/onboarding-modal-CGHPoMp7.js +1 -0
  101. package/build/assets/openhands-logo-bcNw5bkY.js +1 -0
  102. package/build/assets/option-service.api-Dz7Eomnx.js +1 -0
  103. package/build/assets/organization-service.api-CnynNoT-.js +1 -0
  104. package/build/assets/path-utils-CBaRYg35.js +1 -0
  105. package/build/assets/{pencil-CsL0ns9y.js → pencil-Dj2XjKmI.js} +1 -1
  106. package/build/assets/plan-components-j9X4AxYM.js +1 -0
  107. package/build/assets/planner-tab-G4j36bJk.js +1 -0
  108. package/build/assets/plugins-management-service-BAp70KN7.js +1 -0
  109. package/build/assets/profiles-service.api-CeYEmSM3.js +1 -0
  110. package/build/assets/providers-CPoq0VXm.js +1 -0
  111. package/build/assets/{proxy-TeteRRW5.js → proxy-CHmFkV16.js} +1 -1
  112. package/build/assets/react-DPDgL6du.js +1 -0
  113. package/build/assets/recommended-automations-launcher-CXaEK1rW.js +50 -0
  114. package/build/assets/{refresh-cw-GkGYXsU-.js → refresh-cw-DM82EIyx.js} +1 -1
  115. package/build/assets/root-CxWZUXTQ.css +1 -0
  116. package/build/assets/root-S6CfVoNm.js +2 -0
  117. package/build/assets/root-layout-CvxdHJ6j.js +2 -0
  118. package/build/assets/runtime-waiting-state-DkzLgvMn.js +1 -0
  119. package/build/assets/schema-field-DwUzlw6b.js +1 -0
  120. package/build/assets/sdk-section-page-BUXONTx6.js +1 -0
  121. package/build/assets/sdk-settings-schema-BjBkMHzZ.js +1 -0
  122. package/build/assets/search-4DHskuhE.js +1 -0
  123. package/build/assets/search-BsjCEFNf.js +1 -0
  124. package/build/assets/secrets-service-CZYjNxFw.js +1 -0
  125. package/build/assets/secrets-settings-ZxyfRBgx.js +1 -0
  126. package/build/assets/segmented-toggle-Cen5AMUc.js +1 -0
  127. package/build/assets/settings-Bx6vn-g8.js +1 -0
  128. package/build/assets/settings-dropdown-input-xzoZwgUe.js +1 -0
  129. package/build/assets/settings-gear-MXCyZW0x.js +1 -0
  130. package/build/assets/settings-index-D4SM26d5.js +1 -0
  131. package/build/assets/settings-input-DYs7t3oK.js +1 -0
  132. package/build/assets/settings-list-classes-DvQr5jVS.js +1 -0
  133. package/build/assets/{settings-CN_HaPjH.js → settings-mQUckT0g.js} +1 -1
  134. package/build/assets/settings-modal-BoC8oMlg.js +1 -0
  135. package/build/assets/settings-section-header-context-COMOIaxV.js +1 -0
  136. package/build/assets/settings-service.api-DldkFI1x.js +1 -0
  137. package/build/assets/settings-switch-C2N2xqEb.js +1 -0
  138. package/build/assets/{settings-utils-9-_6iVIn.js → settings-utils-BMdG65By.js} +1 -1
  139. package/build/assets/shared-conversation-DMiaQFsj.js +1 -0
  140. package/build/assets/sidebar-layout-BtpUSN3j.js +1 -0
  141. package/build/assets/sidebar-mobile-menu-toggle-CaV3tQFF.js +1 -0
  142. package/build/assets/sidebar-nav-link-CIB3NBRW.js +1 -0
  143. package/build/assets/sidebar-store-CZuE8AH5.js +1 -0
  144. package/build/assets/skill-card-pill-row-D2bUe2kB.js +1 -0
  145. package/build/assets/skills-9cDZONKh.js +1 -0
  146. package/build/assets/skills-plugins-D2WkrXkr.js +1 -0
  147. package/build/assets/skills-settings-CZGVOp_t.js +2 -0
  148. package/build/assets/{square-chevron-right-Cfi-SUY0.js → square-chevron-right-Czw3FFWc.js} +1 -1
  149. package/build/assets/styled-tooltip-DsKsFjuq.js +1 -0
  150. package/build/assets/suspense-X5dBsJzn.js +1 -0
  151. package/build/assets/switch-skeleton-DqQwalyu.js +1 -0
  152. package/build/assets/task-list-tab-BAThr9Ex.js +1 -0
  153. package/build/assets/{terminal-HakoMrQX.js → terminal-B0aL_iDZ.js} +2 -2
  154. package/build/assets/terminal-BuLtIrb9.js +1 -0
  155. package/build/assets/toggle-switch-DBlOOzBr.js +1 -0
  156. package/build/assets/{trash-2-Bq4hqiRH.js → trash-2-Be_7y3Mn.js} +1 -1
  157. package/build/assets/typography-YGPBGzOG.js +1 -0
  158. package/build/assets/u-check-circle-BqoIxNz_.js +1 -0
  159. package/build/assets/u-check-circle-half-LiwZkuFe.js +1 -0
  160. package/build/assets/u-edit-DJ90xc8Z.js +1 -0
  161. package/build/assets/use-acp-credential-form-rzaqkJ1n.js +1 -0
  162. package/build/assets/use-activate-agent-profile-DY0txItX.js +1 -0
  163. package/build/assets/use-active-agent-profile-Cp5AFONR.js +1 -0
  164. package/build/assets/use-active-conversation-DvcFBqFe.js +1 -0
  165. package/build/assets/use-agent-profiles-DnH16_Vm.js +1 -0
  166. package/build/assets/use-agent-state-BvRcEzY4.js +1 -0
  167. package/build/assets/use-backends-health-e-Ull4wz.js +1 -0
  168. package/build/assets/use-breakpoint-B-O0lQ84.js +1 -0
  169. package/build/assets/use-can-manage-org-profiles-OIhplvQ0.js +1 -0
  170. package/build/assets/use-click-outside-element-Bf4Omzot.js +1 -0
  171. package/build/assets/use-cloud-current-user-id-ekU7UXDT.js +1 -0
  172. package/build/assets/use-config-Dwf5gla-.js +1 -0
  173. package/build/assets/use-create-conversation-CvAXfA3T.js +1 -0
  174. package/build/assets/use-create-secret-BKeXCo__.js +1 -0
  175. package/build/assets/use-event-store-YSOxy9FC.js +4 -0
  176. package/build/assets/use-handle-plan-click-cAXS-Hft.js +1 -0
  177. package/build/assets/use-is-authed-_dhQ2Xuj.js +1 -0
  178. package/build/assets/use-launch-skill-in-chat-BnoDgvAy.js +1 -0
  179. package/build/assets/use-llm-profiles-BcLibtGb.js +1 -0
  180. package/build/assets/use-onboarding-completion-C_Swglzp.js +1 -0
  181. package/build/assets/use-plugins-marketplace-BGb-KgfD.js +1 -0
  182. package/build/assets/use-runtime-is-ready-CBFe69Ew.js +1 -0
  183. package/build/assets/use-save-agent-profile-DFjxHhNx.js +1 -0
  184. package/build/assets/{use-save-settings-DErJDIDL.js → use-save-settings-5xPYpSQM.js} +1 -1
  185. package/build/assets/use-settings-B07msZ2Z.js +1 -0
  186. package/build/assets/use-settings-nav-items-CswsOEyw.js +16 -0
  187. package/build/assets/use-skills-Aoaoq_ei.js +1 -0
  188. package/build/assets/use-task-list-CmWGElgb.js +1 -0
  189. package/build/assets/use-tracking-CqODdfO4.js +1 -0
  190. package/build/assets/use-user-conversation-BPHQ-dm-.js +1 -0
  191. package/build/assets/useMutation-DCE9RcgK.js +1 -0
  192. package/build/assets/useMutationState-BUab8Kxr.js +1 -0
  193. package/build/assets/useQueries-CRzaAqzH.js +1 -0
  194. package/build/assets/useQuery-CpjHYtZc.js +1 -0
  195. package/build/assets/useTranslation-Cgy4JA_g.js +1 -0
  196. package/build/assets/utils-CE0lDWtb.js +1 -0
  197. package/build/assets/vendor-styling-CI0PQ3ab.js +22 -0
  198. package/build/assets/{vendor~browser-BQU4C3CQ.js → vendor~browser-Cvg7jXCP.js} +1 -1
  199. package/build/assets/{vendor~browser-tab-Cim6xN2k.js → vendor~browser-tab-Di0kh5Zw.js} +1 -1
  200. package/build/assets/vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js +1 -0
  201. package/build/assets/vendor~entry.client-9tWQ_Ugw.js +1 -0
  202. package/build/assets/{vendor~entry.client-lAMyAlBD.js → vendor~entry.client-D6BtSOtn.js} +1 -1
  203. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +177 -0
  204. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js +1 -0
  205. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +10 -0
  206. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~t35o0b0f-Bss49YXv.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js} +1 -1
  207. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js +1 -0
  208. package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~fpbtwbmk-DDSPtjxR.js → vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js} +1 -1
  209. package/build/assets/{vendor~files-tab-BvQLon-P.js → vendor~files-tab-B02k3xvx.js} +1 -1
  210. package/build/assets/{vendor~home~conversation-panel~conversation-DBPRU26Z.js → vendor~home~conversation-panel~conversation-CYMF9JYB.js} +1 -1
  211. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnEBAp2W.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js} +1 -1
  212. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CzI-A-Gz.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js} +1 -1
  213. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-ByET2Quf.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js} +1 -1
  214. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DCYBrned.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js} +1 -1
  215. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnctfFZL.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js} +1 -1
  216. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-pSG7lnvH.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js} +1 -1
  217. package/build/assets/{vendor~launch-DqoOsAhA.js → vendor~launch-CHXA9cJu.js} +1 -1
  218. package/build/assets/vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js +1 -0
  219. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-BJl81v7J.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js} +1 -1
  220. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js +1 -0
  221. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js +48 -0
  222. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DRld6s9c.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js} +236 -17
  223. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-9d2kA26V.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js} +1 -1
  224. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +1 -0
  225. package/build/assets/verification-settings-DZQ-JvKH.js +1 -0
  226. package/build/assets/x-Cb0WAtak.js +1 -0
  227. package/build/assets/x-mark-Batp6gXa.js +1 -0
  228. package/build/index.html +4 -4
  229. package/build/locales/ar/openhands.json +138 -1
  230. package/build/locales/ca/openhands.json +138 -1
  231. package/build/locales/de/openhands.json +138 -1
  232. package/build/locales/en/openhands.json +138 -1
  233. package/build/locales/es/openhands.json +138 -1
  234. package/build/locales/fr/openhands.json +138 -1
  235. package/build/locales/it/openhands.json +138 -1
  236. package/build/locales/ja/openhands.json +138 -1
  237. package/build/locales/ko-KR/openhands.json +138 -1
  238. package/build/locales/no/openhands.json +138 -1
  239. package/build/locales/pt/openhands.json +138 -1
  240. package/build/locales/tr/openhands.json +138 -1
  241. package/build/locales/uk/openhands.json +138 -1
  242. package/build/locales/zh-CN/openhands.json +138 -1
  243. package/build/locales/zh-TW/openhands.json +138 -1
  244. package/config/defaults.json +7 -9
  245. package/dist/_virtual/__vite-browser-external.cjs +2 -0
  246. package/dist/_virtual/__vite-browser-external.cjs.map +1 -0
  247. package/dist/_virtual/__vite-browser-external.js +9 -0
  248. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  249. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs +2 -0
  250. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs.map +1 -0
  251. package/dist/api/agent-profiles-service/agent-profiles-service.api.d.ts +22 -0
  252. package/dist/api/agent-profiles-service/agent-profiles-service.api.js +35 -0
  253. package/dist/api/agent-profiles-service/agent-profiles-service.api.js.map +1 -0
  254. package/dist/api/agent-server-adapter.cjs +2 -2
  255. package/dist/api/agent-server-adapter.cjs.map +1 -1
  256. package/dist/api/agent-server-adapter.d.ts +11 -1
  257. package/dist/api/agent-server-adapter.js +60 -60
  258. package/dist/api/agent-server-adapter.js.map +1 -1
  259. package/dist/api/agent-server-compatibility.cjs +1 -1
  260. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  261. package/dist/api/agent-server-compatibility.js +1 -0
  262. package/dist/api/agent-server-compatibility.js.map +1 -1
  263. package/dist/api/agent-server-home.cjs +1 -1
  264. package/dist/api/agent-server-home.cjs.map +1 -1
  265. package/dist/api/agent-server-home.js +1 -0
  266. package/dist/api/agent-server-home.js.map +1 -1
  267. package/dist/api/cloud/agent-profiles-service.api.cjs +2 -0
  268. package/dist/api/cloud/agent-profiles-service.api.cjs.map +1 -0
  269. package/dist/api/cloud/agent-profiles-service.api.d.ts +7 -0
  270. package/dist/api/cloud/agent-profiles-service.api.js +58 -0
  271. package/dist/api/cloud/agent-profiles-service.api.js.map +1 -0
  272. package/dist/api/cloud/organization-service.api.cjs +1 -1
  273. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  274. package/dist/api/cloud/organization-service.api.d.ts +8 -0
  275. package/dist/api/cloud/organization-service.api.js +3 -1
  276. package/dist/api/cloud/organization-service.api.js.map +1 -1
  277. package/dist/api/cloud/profiles-service.api.cjs +2 -0
  278. package/dist/api/cloud/profiles-service.api.cjs.map +1 -0
  279. package/dist/api/cloud/profiles-service.api.d.ts +7 -0
  280. package/dist/api/cloud/profiles-service.api.js +75 -0
  281. package/dist/api/cloud/profiles-service.api.js.map +1 -0
  282. package/dist/api/cloud/settings-service.api.cjs +1 -1
  283. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  284. package/dist/api/cloud/settings-service.api.js +1 -1
  285. package/dist/api/cloud/settings-service.api.js.map +1 -1
  286. package/dist/api/config-service/config-service.api.cjs +1 -1
  287. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  288. package/dist/api/config-service/config-service.api.js +1 -0
  289. package/dist/api/config-service/config-service.api.js.map +1 -1
  290. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  291. package/dist/api/conversation-metadata-store.d.ts +11 -0
  292. package/dist/api/conversation-metadata-store.js.map +1 -1
  293. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  294. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  295. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -1
  296. package/dist/api/conversation-service/agent-server-conversation-service.api.js +134 -105
  297. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  298. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +2 -0
  299. package/dist/api/conversation-service/conversation-service.api.cjs +1 -1
  300. package/dist/api/conversation-service/conversation-service.api.cjs.map +1 -1
  301. package/dist/api/conversation-service/conversation-service.api.d.ts +1 -0
  302. package/dist/api/conversation-service/conversation-service.api.js +4 -0
  303. package/dist/api/conversation-service/conversation-service.api.js.map +1 -1
  304. package/dist/api/device-flow-client.cjs +1 -1
  305. package/dist/api/device-flow-client.cjs.map +1 -1
  306. package/dist/api/device-flow-client.js +33 -25
  307. package/dist/api/device-flow-client.js.map +1 -1
  308. package/dist/api/event-service/event-service.api.cjs +1 -1
  309. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  310. package/dist/api/event-service/event-service.api.js +1 -0
  311. package/dist/api/event-service/event-service.api.js.map +1 -1
  312. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  313. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  314. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -3
  315. package/dist/api/mcp-service/mcp-redacted-credentials.js +29 -30
  316. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  317. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  318. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  319. package/dist/api/mcp-service/mcp-service.api.d.ts +8 -1
  320. package/dist/api/mcp-service/mcp-service.api.js +129 -23
  321. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  322. package/dist/api/option-service/option-service.api.cjs +1 -1
  323. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  324. package/dist/api/option-service/option-service.api.js +1 -0
  325. package/dist/api/option-service/option-service.api.js.map +1 -1
  326. package/dist/api/plugins-management-service.cjs +2 -0
  327. package/dist/api/plugins-management-service.cjs.map +1 -0
  328. package/dist/api/plugins-management-service.d.ts +50 -0
  329. package/dist/api/plugins-management-service.js +41 -0
  330. package/dist/api/plugins-management-service.js.map +1 -0
  331. package/dist/api/plugins-service.d.ts +49 -0
  332. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  333. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  334. package/dist/api/profiles-service/profiles-service.api.js +21 -14
  335. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  336. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  337. package/dist/api/runtime-service/agent-server-runtime-service.cjs.map +1 -1
  338. package/dist/api/runtime-service/agent-server-runtime-service.js +1 -0
  339. package/dist/api/runtime-service/agent-server-runtime-service.js.map +1 -1
  340. package/dist/api/secrets-service.cjs +1 -1
  341. package/dist/api/secrets-service.cjs.map +1 -1
  342. package/dist/api/secrets-service.js +1 -0
  343. package/dist/api/secrets-service.js.map +1 -1
  344. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  345. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  346. package/dist/api/settings-service/settings-service.api.js +92 -50
  347. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  348. package/dist/api/skills-service.cjs +1 -1
  349. package/dist/api/skills-service.cjs.map +1 -1
  350. package/dist/api/skills-service.js +1 -0
  351. package/dist/api/skills-service.js.map +1 -1
  352. package/dist/api/workspaces-service/workspaces-service.api.cjs +1 -1
  353. package/dist/api/workspaces-service/workspaces-service.api.cjs.map +1 -1
  354. package/dist/api/workspaces-service/workspaces-service.api.js +1 -0
  355. package/dist/api/workspaces-service/workspaces-service.api.js.map +1 -1
  356. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  357. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  358. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +57 -38
  359. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  360. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -1
  361. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  362. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +13 -9
  363. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  364. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  365. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  366. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +65 -26
  367. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  368. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  369. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  370. package/dist/components/conversation-events/chat/event-message.js +78 -76
  371. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  372. package/dist/components/features/analytics/telemetry-consent-banner.cjs +1 -1
  373. package/dist/components/features/analytics/telemetry-consent-banner.cjs.map +1 -1
  374. package/dist/components/features/analytics/telemetry-consent-banner.js +1 -0
  375. package/dist/components/features/analytics/telemetry-consent-banner.js.map +1 -1
  376. package/dist/components/features/automations/detail/activity-log-item.d.ts +3 -2
  377. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -2
  378. package/dist/components/features/automations/detail/debug-automation-button.d.ts +17 -0
  379. package/dist/components/features/automations/detail/run-logs-modal.d.ts +6 -1
  380. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  381. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  382. package/dist/components/features/backends/backend-form-modal.d.ts +6 -2
  383. package/dist/components/features/backends/backend-form-modal.js +198 -161
  384. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  385. package/dist/components/features/backends/backend-row.cjs +1 -1
  386. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  387. package/dist/components/features/backends/backend-row.d.ts +2 -1
  388. package/dist/components/features/backends/backend-row.js +60 -54
  389. package/dist/components/features/backends/backend-row.js.map +1 -1
  390. package/dist/components/features/backends/backend-selector.cjs +1 -1
  391. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  392. package/dist/components/features/backends/backend-selector.js +4 -4
  393. package/dist/components/features/backends/backend-version.cjs +1 -1
  394. package/dist/components/features/backends/backend-version.cjs.map +1 -1
  395. package/dist/components/features/backends/backend-version.js +1 -0
  396. package/dist/components/features/backends/backend-version.js.map +1 -1
  397. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  398. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  399. package/dist/components/features/backends/manage-backends-modal.js +72 -61
  400. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  401. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  402. package/dist/components/features/chat/change-agent-button.js +9 -9
  403. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  404. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  405. package/dist/components/features/chat/chat-add-file-button.js +38 -34
  406. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  407. package/dist/components/features/chat/chat-interface.cjs +2 -2
  408. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  409. package/dist/components/features/chat/chat-interface.js +136 -129
  410. package/dist/components/features/chat/chat-interface.js.map +1 -1
  411. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  412. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  413. package/dist/components/features/chat/components/chat-input-actions.js +100 -87
  414. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  415. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +2 -0
  416. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -0
  417. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +15 -0
  418. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +118 -0
  419. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -0
  420. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  421. package/dist/components/features/chat/components/chat-input-model.js +17 -17
  422. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +2 -0
  423. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -0
  424. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +9 -0
  425. package/dist/components/features/chat/components/chat-input-profile-picker.js +112 -0
  426. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -0
  427. package/dist/components/features/chat/components/resolve-picker-kind.cjs +2 -0
  428. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -0
  429. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +29 -0
  430. package/dist/components/features/chat/components/resolve-picker-kind.js +8 -0
  431. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -0
  432. package/dist/components/features/chat/goal-status-banner.cjs +2 -0
  433. package/dist/components/features/chat/goal-status-banner.cjs.map +1 -0
  434. package/dist/components/features/chat/goal-status-banner.d.ts +11 -0
  435. package/dist/components/features/chat/goal-status-banner.js +12 -0
  436. package/dist/components/features/chat/goal-status-banner.js.map +1 -0
  437. package/dist/components/features/chat/goal-status-content.cjs +2 -0
  438. package/dist/components/features/chat/goal-status-content.cjs.map +1 -0
  439. package/dist/components/features/chat/goal-status-content.d.ts +21 -0
  440. package/dist/components/features/chat/goal-status-content.js +98 -0
  441. package/dist/components/features/chat/goal-status-content.js.map +1 -0
  442. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  443. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  444. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  445. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  446. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs +1 -1
  447. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs.map +1 -1
  448. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +10 -3
  449. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js +29 -16
  450. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js.map +1 -1
  451. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs +1 -1
  452. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs.map +1 -1
  453. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -2
  454. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js +16 -16
  455. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js.map +1 -1
  456. package/dist/components/features/chat/user-message-body.cjs +1 -1
  457. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  458. package/dist/components/features/chat/user-message-body.js +20 -20
  459. package/dist/components/features/chat/user-message-body.js.map +1 -1
  460. package/dist/components/features/command-menu/command-menu-items.d.ts +32 -0
  461. package/dist/components/features/command-menu/command-menu-trigger.cjs +2 -0
  462. package/dist/components/features/command-menu/command-menu-trigger.cjs.map +1 -0
  463. package/dist/components/features/command-menu/command-menu-trigger.d.ts +5 -0
  464. package/dist/components/features/command-menu/command-menu-trigger.js +53 -0
  465. package/dist/components/features/command-menu/command-menu-trigger.js.map +1 -0
  466. package/dist/components/features/command-menu/command-menu.d.ts +2 -0
  467. package/dist/components/features/command-menu/index.d.ts +2 -0
  468. package/dist/components/features/controls/tools-context-menu.cjs +1 -1
  469. package/dist/components/features/controls/tools-context-menu.cjs.map +1 -1
  470. package/dist/components/features/controls/tools-context-menu.d.ts +3 -1
  471. package/dist/components/features/controls/tools-context-menu.js +94 -77
  472. package/dist/components/features/controls/tools-context-menu.js.map +1 -1
  473. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  474. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  475. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +8 -5
  476. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  477. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  478. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +1 -1
  479. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  480. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  481. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  482. package/dist/components/features/conversation-panel/conversation-panel.js +2 -1
  483. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  484. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  485. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  486. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -1
  487. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  488. package/dist/components/features/conversation-panel/plugins-modal.cjs +2 -0
  489. package/dist/components/features/conversation-panel/plugins-modal.cjs.map +1 -0
  490. package/dist/components/features/conversation-panel/plugins-modal.d.ts +12 -0
  491. package/dist/components/features/conversation-panel/plugins-modal.js +62 -0
  492. package/dist/components/features/conversation-panel/plugins-modal.js.map +1 -0
  493. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
  494. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
  495. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +4 -4
  496. package/dist/components/features/mcp-logo-badge.cjs +1 -1
  497. package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
  498. package/dist/components/features/mcp-logo-badge.js +17 -15
  499. package/dist/components/features/mcp-logo-badge.js.map +1 -1
  500. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  501. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  502. package/dist/components/features/mcp-page/custom-server-editor.js +102 -59
  503. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  504. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  505. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  506. package/dist/components/features/mcp-page/install-server-modal.js +284 -169
  507. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  508. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  509. package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
  510. package/dist/components/features/mcp-page/installed-server-card.js +16 -18
  511. package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
  512. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -13
  513. package/dist/components/features/plugins/add-plugin-modal.d.ts +6 -0
  514. package/dist/components/features/plugins/build-plugins-view-model.d.ts +39 -0
  515. package/dist/components/features/plugins/plugin-card.d.ts +13 -0
  516. package/dist/components/features/plugins/plugin-detail-modal.d.ts +13 -0
  517. package/dist/components/features/plugins/plugin-picker-card.d.ts +10 -0
  518. package/dist/components/features/plugins/plugin-picker-modal.d.ts +9 -0
  519. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +9 -0
  520. package/dist/components/features/plugins/plugin-picker.d.ts +18 -0
  521. package/dist/components/features/plugins/plugin-spec-identity.d.ts +28 -0
  522. package/dist/components/features/plugins/plugins-toolbar.d.ts +9 -0
  523. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +16 -0
  524. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +13 -0
  525. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +15 -0
  526. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +7 -0
  527. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +7 -0
  528. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +7 -0
  529. package/dist/components/features/settings/agent-profiles/index.d.ts +6 -0
  530. package/dist/components/features/settings/agent-profiles/merge-agent-profile-save-input.d.ts +18 -0
  531. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
  532. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +1 -0
  533. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  534. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  535. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +3 -1
  536. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +3 -1
  537. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs +1 -1
  538. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs.map +1 -1
  539. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js +3 -2
  540. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js.map +1 -1
  541. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +7 -7
  542. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  543. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +279 -130
  544. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  545. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -12
  546. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -11
  547. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  548. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  549. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  550. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  551. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -2
  552. package/dist/components/features/sidebar/sidebar-rail-body.js +81 -82
  553. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  554. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  555. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  556. package/dist/components/features/sidebar/sidebar.js +45 -46
  557. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  558. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  559. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  560. package/dist/components/features/skills/extensions-navigation.js +1 -2
  561. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  562. package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
  563. package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
  564. package/dist/components/shared/modals/modal-backdrop.d.ts +5 -1
  565. package/dist/components/shared/modals/modal-backdrop.js +3 -3
  566. package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
  567. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  568. package/dist/components/shared/modals/settings/model-selector.js +16 -16
  569. package/dist/config/defaults.cjs +1 -1
  570. package/dist/config/defaults.cjs.map +1 -1
  571. package/dist/config/defaults.js +7 -3
  572. package/dist/config/defaults.js.map +1 -1
  573. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  574. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  575. package/dist/contexts/conversation-websocket-context.js +200 -197
  576. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  577. package/dist/hooks/chat/use-goal-interceptor.cjs +2 -0
  578. package/dist/hooks/chat/use-goal-interceptor.cjs.map +1 -0
  579. package/dist/hooks/chat/use-goal-interceptor.d.ts +8 -0
  580. package/dist/hooks/chat/use-goal-interceptor.js +37 -0
  581. package/dist/hooks/chat/use-goal-interceptor.js.map +1 -0
  582. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  583. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  584. package/dist/hooks/chat/use-grip-resize.js +17 -16
  585. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  586. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  587. package/dist/hooks/chat/use-model-interceptor.cjs.map +1 -1
  588. package/dist/hooks/chat/use-model-interceptor.d.ts +3 -3
  589. package/dist/hooks/chat/use-model-interceptor.js +8 -9
  590. package/dist/hooks/chat/use-model-interceptor.js.map +1 -1
  591. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  592. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  593. package/dist/hooks/chat/use-slash-command.js +4 -4
  594. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  595. package/dist/hooks/mutation/conversation-mutation-utils.cjs +1 -1
  596. package/dist/hooks/mutation/conversation-mutation-utils.cjs.map +1 -1
  597. package/dist/hooks/mutation/conversation-mutation-utils.d.ts +17 -0
  598. package/dist/hooks/mutation/conversation-mutation-utils.js +23 -4
  599. package/dist/hooks/mutation/conversation-mutation-utils.js.map +1 -1
  600. package/dist/hooks/mutation/use-activate-agent-profile.cjs +2 -0
  601. package/dist/hooks/mutation/use-activate-agent-profile.cjs.map +1 -0
  602. package/dist/hooks/mutation/use-activate-agent-profile.d.ts +23 -0
  603. package/dist/hooks/mutation/use-activate-agent-profile.js +34 -0
  604. package/dist/hooks/mutation/use-activate-agent-profile.js.map +1 -0
  605. package/dist/hooks/mutation/use-activate-llm-profile.cjs +1 -1
  606. package/dist/hooks/mutation/use-activate-llm-profile.js +1 -1
  607. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  608. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  609. package/dist/hooks/mutation/use-add-mcp-server.d.ts +1 -12
  610. package/dist/hooks/mutation/use-add-mcp-server.js +10 -34
  611. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  612. package/dist/hooks/mutation/use-apply-onboarding-agent-profile.d.ts +20 -0
  613. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  614. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  615. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -0
  616. package/dist/hooks/mutation/use-create-conversation.js +94 -25
  617. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  618. package/dist/hooks/mutation/use-delete-agent-profile.d.ts +1 -0
  619. package/dist/hooks/mutation/use-delete-llm-profile.cjs +1 -1
  620. package/dist/hooks/mutation/use-delete-llm-profile.js +1 -1
  621. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  622. package/dist/hooks/mutation/use-delete-mcp-server.js +4 -4
  623. package/dist/hooks/mutation/use-fork-conversation.cjs +2 -0
  624. package/dist/hooks/mutation/use-fork-conversation.cjs.map +1 -0
  625. package/dist/hooks/mutation/use-fork-conversation.d.ts +24 -0
  626. package/dist/hooks/mutation/use-fork-conversation.js +29 -0
  627. package/dist/hooks/mutation/use-fork-conversation.js.map +1 -0
  628. package/dist/hooks/mutation/use-install-plugin.d.ts +7 -0
  629. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  630. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  631. package/dist/hooks/mutation/use-new-conversation-command.d.ts +1 -0
  632. package/dist/hooks/mutation/use-new-conversation-command.js +20 -10
  633. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  634. package/dist/hooks/mutation/use-rename-agent-profile.d.ts +6 -0
  635. package/dist/hooks/mutation/use-rename-llm-profile.cjs +1 -1
  636. package/dist/hooks/mutation/use-rename-llm-profile.js +1 -1
  637. package/dist/hooks/mutation/use-save-agent-profile.d.ts +5 -0
  638. package/dist/hooks/mutation/use-save-llm-profile.cjs +1 -1
  639. package/dist/hooks/mutation/use-save-llm-profile.js +1 -1
  640. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  641. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  642. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs +1 -1
  643. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs.map +1 -1
  644. package/dist/hooks/mutation/use-switch-llm-profile-and-log.d.ts +3 -4
  645. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js +10 -35
  646. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js.map +1 -1
  647. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  648. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  649. package/dist/hooks/mutation/use-switch-llm-profile.d.ts +20 -5
  650. package/dist/hooks/mutation/use-switch-llm-profile.js +38 -14
  651. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  652. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  653. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  654. package/dist/hooks/mutation/use-update-mcp-server.js +11 -37
  655. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  656. package/dist/hooks/query/query-keys.cjs +1 -1
  657. package/dist/hooks/query/query-keys.cjs.map +1 -1
  658. package/dist/hooks/query/query-keys.d.ts +21 -0
  659. package/dist/hooks/query/query-keys.js +7 -3
  660. package/dist/hooks/query/query-keys.js.map +1 -1
  661. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  662. package/dist/hooks/query/use-active-conversation.cjs.map +1 -1
  663. package/dist/hooks/query/use-active-conversation.js +17 -16
  664. package/dist/hooks/query/use-active-conversation.js.map +1 -1
  665. package/dist/hooks/query/use-agent-profiles.cjs +2 -0
  666. package/dist/hooks/query/use-agent-profiles.cjs.map +1 -0
  667. package/dist/hooks/query/use-agent-profiles.d.ts +13 -0
  668. package/dist/hooks/query/use-agent-profiles.js +24 -0
  669. package/dist/hooks/query/use-agent-profiles.js.map +1 -0
  670. package/dist/hooks/query/use-backends-health.cjs +1 -1
  671. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  672. package/dist/hooks/query/use-backends-health.js +18 -3
  673. package/dist/hooks/query/use-backends-health.js.map +1 -1
  674. package/dist/hooks/query/use-conversation-history.cjs +1 -1
  675. package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
  676. package/dist/hooks/query/use-conversation-history.js +4 -2
  677. package/dist/hooks/query/use-conversation-history.js.map +1 -1
  678. package/dist/hooks/query/use-local-workspaces.cjs +1 -1
  679. package/dist/hooks/query/use-local-workspaces.cjs.map +1 -1
  680. package/dist/hooks/query/use-local-workspaces.js +1 -0
  681. package/dist/hooks/query/use-local-workspaces.js.map +1 -1
  682. package/dist/hooks/query/use-plugins-marketplace.d.ts +7 -0
  683. package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
  684. package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
  685. package/dist/hooks/query/use-resolved-workspaces.js +7 -6
  686. package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
  687. package/dist/hooks/query/use-search-subdirs.cjs +1 -1
  688. package/dist/hooks/query/use-search-subdirs.cjs.map +1 -1
  689. package/dist/hooks/query/use-search-subdirs.js +1 -0
  690. package/dist/hooks/query/use-search-subdirs.js.map +1 -1
  691. package/dist/hooks/query/use-settings.cjs +1 -1
  692. package/dist/hooks/query/use-settings.cjs.map +1 -1
  693. package/dist/hooks/query/use-settings.js +11 -11
  694. package/dist/hooks/query/use-settings.js.map +1 -1
  695. package/dist/hooks/query/use-verified-models.cjs +1 -1
  696. package/dist/hooks/query/use-verified-models.cjs.map +1 -1
  697. package/dist/hooks/query/use-verified-models.js +1 -0
  698. package/dist/hooks/query/use-verified-models.js.map +1 -1
  699. package/dist/hooks/use-acp-model-context.cjs +1 -1
  700. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  701. package/dist/hooks/use-acp-model-context.d.ts +1 -1
  702. package/dist/hooks/use-acp-model-context.js +9 -8
  703. package/dist/hooks/use-acp-model-context.js.map +1 -1
  704. package/dist/hooks/use-active-agent-profile.cjs +2 -0
  705. package/dist/hooks/use-active-agent-profile.cjs.map +1 -0
  706. package/dist/hooks/use-active-agent-profile.d.ts +20 -0
  707. package/dist/hooks/use-active-agent-profile.js +17 -0
  708. package/dist/hooks/use-active-agent-profile.js.map +1 -0
  709. package/dist/hooks/use-auto-resize.cjs +1 -1
  710. package/dist/hooks/use-auto-resize.cjs.map +1 -1
  711. package/dist/hooks/use-auto-resize.d.ts +2 -0
  712. package/dist/hooks/use-auto-resize.js +49 -45
  713. package/dist/hooks/use-auto-resize.js.map +1 -1
  714. package/dist/hooks/use-can-manage-org-profiles.cjs +1 -0
  715. package/dist/hooks/use-can-manage-org-profiles.d.ts +18 -0
  716. package/dist/hooks/use-can-manage-org-profiles.js +2 -0
  717. package/dist/hooks/use-chat-input-llm-profile-state.cjs +2 -0
  718. package/dist/hooks/use-chat-input-llm-profile-state.cjs.map +1 -0
  719. package/dist/hooks/use-chat-input-llm-profile-state.d.ts +23 -0
  720. package/dist/hooks/use-chat-input-llm-profile-state.js +30 -0
  721. package/dist/hooks/use-chat-input-llm-profile-state.js.map +1 -0
  722. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  723. package/dist/hooks/use-chat-input-model-state.d.ts +1 -1
  724. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  725. package/dist/hooks/use-chat-input-profile-state.cjs +2 -0
  726. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -0
  727. package/dist/hooks/use-chat-input-profile-state.d.ts +20 -0
  728. package/dist/hooks/use-chat-input-profile-state.js +22 -0
  729. package/dist/hooks/use-chat-input-profile-state.js.map +1 -0
  730. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  731. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  732. package/dist/hooks/use-conversation-name-context-menu.d.ts +4 -0
  733. package/dist/hooks/use-conversation-name-context-menu.js +44 -37
  734. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  735. package/dist/hooks/use-conversation-plugins.cjs +2 -0
  736. package/dist/hooks/use-conversation-plugins.cjs.map +1 -0
  737. package/dist/hooks/use-conversation-plugins.d.ts +9 -0
  738. package/dist/hooks/use-conversation-plugins.js +12 -0
  739. package/dist/hooks/use-conversation-plugins.js.map +1 -0
  740. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  741. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  742. package/dist/hooks/use-handle-plan-click.js +2 -1
  743. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  744. package/dist/hooks/use-llm-configured.cjs +1 -1
  745. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  746. package/dist/hooks/use-llm-configured.js +17 -16
  747. package/dist/hooks/use-llm-configured.js.map +1 -1
  748. package/dist/hooks/use-tracking.cjs +1 -1
  749. package/dist/hooks/use-tracking.cjs.map +1 -1
  750. package/dist/hooks/use-tracking.d.ts +51 -1
  751. package/dist/hooks/use-tracking.js +61 -2
  752. package/dist/hooks/use-tracking.js.map +1 -1
  753. package/dist/i18n/declaration.cjs +1 -1
  754. package/dist/i18n/declaration.cjs.map +1 -1
  755. package/dist/i18n/declaration.d.ts +138 -1
  756. package/dist/i18n/declaration.js +1 -1
  757. package/dist/i18n/declaration.js.map +1 -1
  758. package/dist/i18n/translation.cjs +18 -3
  759. package/dist/i18n/translation.cjs.map +1 -1
  760. package/dist/i18n/translation.js +2329 -0
  761. package/dist/i18n/translation.js.map +1 -1
  762. package/dist/icons/slack.cjs +2 -0
  763. package/dist/icons/slack.cjs.map +1 -0
  764. package/dist/icons/slack.js +19 -0
  765. package/dist/icons/slack.js.map +1 -0
  766. package/dist/icons/u-puzzle-piece.cjs +2 -0
  767. package/dist/icons/u-puzzle-piece.cjs.map +1 -0
  768. package/dist/icons/u-puzzle-piece.js +19 -0
  769. package/dist/icons/u-puzzle-piece.js.map +1 -0
  770. package/dist/icons/x-circle-solid.cjs +2 -0
  771. package/dist/icons/x-circle-solid.cjs.map +1 -0
  772. package/dist/icons/x-circle-solid.js +13 -0
  773. package/dist/icons/x-circle-solid.js.map +1 -0
  774. package/dist/locales/ar/openhands.json +138 -1
  775. package/dist/locales/ca/openhands.json +138 -1
  776. package/dist/locales/de/openhands.json +138 -1
  777. package/dist/locales/en/openhands.json +138 -1
  778. package/dist/locales/es/openhands.json +138 -1
  779. package/dist/locales/fr/openhands.json +138 -1
  780. package/dist/locales/it/openhands.json +138 -1
  781. package/dist/locales/ja/openhands.json +138 -1
  782. package/dist/locales/ko-KR/openhands.json +138 -1
  783. package/dist/locales/no/openhands.json +138 -1
  784. package/dist/locales/pt/openhands.json +138 -1
  785. package/dist/locales/tr/openhands.json +138 -1
  786. package/dist/locales/uk/openhands.json +138 -1
  787. package/dist/locales/zh-CN/openhands.json +138 -1
  788. package/dist/locales/zh-TW/openhands.json +138 -1
  789. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
  790. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
  791. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +0 -20
  792. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
  793. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs +1 -1
  794. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs.map +1 -1
  795. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js +1 -6
  796. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js.map +1 -1
  797. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs +1 -1
  798. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs.map +1 -1
  799. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js +1 -6
  800. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js.map +1 -1
  801. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs +1 -1
  802. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs.map +1 -1
  803. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js +1 -6
  804. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js.map +1 -1
  805. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs +1 -1
  806. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs.map +1 -1
  807. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js +3 -7
  808. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js.map +1 -1
  809. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs +1 -1
  810. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs.map +1 -1
  811. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js +1 -6
  812. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js.map +1 -1
  813. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs +1 -1
  814. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs.map +1 -1
  815. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js +1 -6
  816. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js.map +1 -1
  817. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
  818. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
  819. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +20 -26
  820. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
  821. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  822. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  823. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +0 -9
  824. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  825. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs +1 -1
  826. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs.map +1 -1
  827. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js +1 -6
  828. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js.map +1 -1
  829. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs +1 -1
  830. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs.map +1 -1
  831. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js +1 -6
  832. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js.map +1 -1
  833. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs +1 -1
  834. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs.map +1 -1
  835. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js +1 -6
  836. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js.map +1 -1
  837. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs +1 -1
  838. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs.map +1 -1
  839. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js +1 -6
  840. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js.map +1 -1
  841. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs +1 -1
  842. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs.map +1 -1
  843. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js +1 -6
  844. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js.map +1 -1
  845. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs +1 -1
  846. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs.map +1 -1
  847. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js +1 -6
  848. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js.map +1 -1
  849. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs +1 -1
  850. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs.map +1 -1
  851. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js +1 -6
  852. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js.map +1 -1
  853. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs +1 -1
  854. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -1
  855. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js +13 -13
  856. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -1
  857. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs +1 -1
  858. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs.map +1 -1
  859. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js +1 -6
  860. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js.map +1 -1
  861. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs +1 -1
  862. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs.map +1 -1
  863. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js +1 -6
  864. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js.map +1 -1
  865. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs +1 -1
  866. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs.map +1 -1
  867. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js +14 -10
  868. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js.map +1 -1
  869. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs +1 -1
  870. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs.map +1 -1
  871. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js +13 -10
  872. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js.map +1 -1
  873. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs +1 -1
  874. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs.map +1 -1
  875. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js +1 -6
  876. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js.map +1 -1
  877. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  878. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  879. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -8
  880. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  881. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs +1 -1
  882. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs.map +1 -1
  883. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js +1 -6
  884. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js.map +1 -1
  885. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs +1 -1
  886. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs.map +1 -1
  887. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js +1 -6
  888. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js.map +1 -1
  889. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
  890. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
  891. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +20 -18
  892. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
  893. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs +1 -1
  894. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs.map +1 -1
  895. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js +66 -21
  896. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js.map +1 -1
  897. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs +1 -1
  898. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs.map +1 -1
  899. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js +17 -11
  900. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js.map +1 -1
  901. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs +1 -1
  902. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs.map +1 -1
  903. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js +12 -17
  904. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js.map +1 -1
  905. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs +1 -1
  906. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs.map +1 -1
  907. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js +1 -6
  908. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js.map +1 -1
  909. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  910. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  911. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +1 -1
  912. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  913. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs +1 -1
  914. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs.map +1 -1
  915. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js +14 -19
  916. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js.map +1 -1
  917. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
  918. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
  919. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +15 -20
  920. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
  921. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs +1 -1
  922. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs.map +1 -1
  923. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js +10 -8
  924. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js.map +1 -1
  925. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs +1 -1
  926. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs.map +1 -1
  927. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js +1 -6
  928. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js.map +1 -1
  929. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs +1 -1
  930. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs.map +1 -1
  931. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js +1 -6
  932. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js.map +1 -1
  933. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs +1 -1
  934. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs.map +1 -1
  935. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js +1 -6
  936. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js.map +1 -1
  937. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  938. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  939. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +67 -87
  940. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  941. package/dist/node_modules/@openhands/extensions/integrations/index.cjs +1 -1
  942. package/dist/node_modules/@openhands/extensions/integrations/index.cjs.map +1 -1
  943. package/dist/node_modules/@openhands/extensions/integrations/index.js +4 -4
  944. package/dist/node_modules/@openhands/extensions/integrations/index.js.map +1 -1
  945. package/dist/node_modules/@openhands/extensions/skills/index.cjs +236 -17
  946. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  947. package/dist/node_modules/@openhands/extensions/skills/index.js +24 -5
  948. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  949. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs +2 -0
  950. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs.map +1 -0
  951. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js +40 -0
  952. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js.map +1 -0
  953. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
  954. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
  955. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +4 -4
  956. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
  957. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
  958. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
  959. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +3 -0
  960. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
  961. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
  962. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
  963. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +3 -0
  964. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
  965. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +1 -0
  966. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +1 -0
  967. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +1 -0
  968. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +1 -0
  969. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs +1 -1
  970. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs.map +1 -1
  971. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js +84 -27
  972. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js.map +1 -1
  973. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs +1 -1
  974. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs.map +1 -1
  975. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js +9 -0
  976. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js.map +1 -1
  977. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +1 -0
  978. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +1 -0
  979. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs +2 -0
  980. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs.map +1 -0
  981. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js +42 -0
  982. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js.map +1 -0
  983. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +1 -0
  984. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +1 -0
  985. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs +1 -1
  986. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs.map +1 -1
  987. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js +1 -1
  988. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js.map +1 -1
  989. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +1 -0
  990. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +1 -0
  991. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +1 -0
  992. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +1 -0
  993. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -0
  994. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +20 -0
  995. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
  996. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +18 -0
  997. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.cjs +1 -1
  998. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.js +1 -0
  999. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  1000. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +2 -0
  1001. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  1002. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  1003. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +15 -17
  1004. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  1005. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  1006. package/dist/node_modules/@openhands/typescript-client/dist/index.js +3 -0
  1007. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.cjs +1 -0
  1008. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.js +1 -0
  1009. package/dist/package.cjs +1 -1
  1010. package/dist/package.cjs.map +1 -1
  1011. package/dist/package.js +7 -4
  1012. package/dist/package.js.map +1 -1
  1013. package/dist/routes/agent-settings.d.ts +106 -0
  1014. package/dist/routes/files-tab.cjs +1 -1
  1015. package/dist/routes/files-tab.js +23 -23
  1016. package/dist/routes/llm-settings.cjs +1 -1
  1017. package/dist/routes/llm-settings.cjs.map +1 -1
  1018. package/dist/routes/llm-settings.d.ts +6 -4
  1019. package/dist/routes/llm-settings.js +0 -1
  1020. package/dist/routes/llm-settings.js.map +1 -1
  1021. package/dist/routes/mcp.cjs.map +1 -1
  1022. package/dist/routes/mcp.js.map +1 -1
  1023. package/dist/services/settings.cjs +1 -1
  1024. package/dist/services/settings.cjs.map +1 -1
  1025. package/dist/services/settings.js +2 -6
  1026. package/dist/services/settings.js.map +1 -1
  1027. package/dist/stores/command-menu-store.cjs +2 -0
  1028. package/dist/stores/command-menu-store.cjs.map +1 -0
  1029. package/dist/stores/command-menu-store.d.ts +8 -0
  1030. package/dist/stores/command-menu-store.js +12 -0
  1031. package/dist/stores/command-menu-store.js.map +1 -0
  1032. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1033. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1034. package/dist/stores/conversation-panel-preferences-store.js +1 -1
  1035. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1036. package/dist/stores/conversation-store.cjs +1 -1
  1037. package/dist/stores/conversation-store.cjs.map +1 -1
  1038. package/dist/stores/conversation-store.d.ts +1 -0
  1039. package/dist/stores/conversation-store.js +1 -0
  1040. package/dist/stores/conversation-store.js.map +1 -1
  1041. package/dist/stores/goal-store.cjs +2 -0
  1042. package/dist/stores/goal-store.cjs.map +1 -0
  1043. package/dist/stores/goal-store.d.ts +28 -0
  1044. package/dist/stores/goal-store.js +14 -0
  1045. package/dist/stores/goal-store.js.map +1 -0
  1046. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +39 -3
  1047. package/dist/types/agent-server/type-guards.cjs +1 -1
  1048. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  1049. package/dist/types/agent-server/type-guards.d.ts +2 -1
  1050. package/dist/types/agent-server/type-guards.js +3 -3
  1051. package/dist/types/agent-server/type-guards.js.map +1 -1
  1052. package/dist/types/mcp-auth.cjs +2 -0
  1053. package/dist/types/mcp-auth.cjs.map +1 -0
  1054. package/dist/types/mcp-auth.d.ts +43 -0
  1055. package/dist/types/mcp-auth.js +13 -0
  1056. package/dist/types/mcp-auth.js.map +1 -0
  1057. package/dist/types/mcp-server.d.ts +22 -1
  1058. package/dist/types/settings.d.ts +6 -4
  1059. package/dist/ui/context-menu.d.ts +1 -1
  1060. package/dist/utils/acp-command.d.ts +64 -0
  1061. package/dist/utils/automation-debug-prompt.d.ts +18 -0
  1062. package/dist/utils/constants.cjs +1 -1
  1063. package/dist/utils/constants.cjs.map +1 -1
  1064. package/dist/utils/constants.d.ts +2 -0
  1065. package/dist/utils/constants.js +12 -3
  1066. package/dist/utils/constants.js.map +1 -1
  1067. package/dist/utils/dropdown-classes.cjs +1 -1
  1068. package/dist/utils/dropdown-classes.cjs.map +1 -1
  1069. package/dist/utils/dropdown-classes.js +4 -2
  1070. package/dist/utils/dropdown-classes.js.map +1 -1
  1071. package/dist/utils/form-control-classes.cjs +1 -1
  1072. package/dist/utils/form-control-classes.js +1 -1
  1073. package/dist/utils/handle-event-for-ui.cjs +1 -1
  1074. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  1075. package/dist/utils/handle-event-for-ui.js +72 -37
  1076. package/dist/utils/handle-event-for-ui.js.map +1 -1
  1077. package/dist/utils/mcp-config.cjs +1 -1
  1078. package/dist/utils/mcp-config.cjs.map +1 -1
  1079. package/dist/utils/mcp-config.d.ts +15 -9
  1080. package/dist/utils/mcp-config.js +124 -53
  1081. package/dist/utils/mcp-config.js.map +1 -1
  1082. package/dist/utils/mcp-installed-server-display.cjs +2 -0
  1083. package/dist/utils/mcp-installed-server-display.cjs.map +1 -0
  1084. package/dist/utils/mcp-installed-server-display.d.ts +8 -0
  1085. package/dist/utils/mcp-installed-server-display.js +12 -0
  1086. package/dist/utils/mcp-installed-server-display.js.map +1 -0
  1087. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1088. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1089. package/dist/utils/mcp-installed-servers.js +4 -4
  1090. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1091. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  1092. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  1093. package/dist/utils/mcp-marketplace-utils.d.ts +2 -0
  1094. package/dist/utils/mcp-marketplace-utils.js +31 -16
  1095. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  1096. package/dist/utils/mcp-server-name.cjs +2 -0
  1097. package/dist/utils/mcp-server-name.cjs.map +1 -0
  1098. package/dist/utils/mcp-server-name.d.ts +3 -0
  1099. package/dist/utils/mcp-server-name.js +12 -0
  1100. package/dist/utils/mcp-server-name.js.map +1 -0
  1101. package/dist/utils/plugin-display.cjs +2 -0
  1102. package/dist/utils/plugin-display.cjs.map +1 -0
  1103. package/dist/utils/plugin-display.d.ts +20 -0
  1104. package/dist/utils/plugin-display.js +29 -0
  1105. package/dist/utils/plugin-display.js.map +1 -0
  1106. package/dist/utils/settings-utils.cjs.map +1 -1
  1107. package/dist/utils/settings-utils.js.map +1 -1
  1108. package/dist/utils/workspaces-compatibility.cjs +1 -1
  1109. package/dist/utils/workspaces-compatibility.cjs.map +1 -1
  1110. package/dist/utils/workspaces-compatibility.js +1 -0
  1111. package/dist/utils/workspaces-compatibility.js.map +1 -1
  1112. package/package.json +7 -4
  1113. package/scripts/check-sdk-version-sync.mjs +6 -6
  1114. package/scripts/check-translation-completeness.cjs +6 -0
  1115. package/scripts/dev-safe.mjs +14 -3
  1116. package/scripts/dev-with-automation.mjs +4 -0
  1117. package/scripts/gen-acp-docker-env.mjs +107 -0
  1118. package/scripts/ingress.mjs +66 -226
  1119. package/scripts/proxy-utils.mjs +171 -0
  1120. package/scripts/static-server.mjs +127 -283
  1121. package/build/assets/Trans-CiZR6eVI.js +0 -1
  1122. package/build/assets/active-backend-context-CEuva6ZJ.js +0 -1
  1123. package/build/assets/add-backend-modal-b_eiVk3A.js +0 -1
  1124. package/build/assets/agent-server-conversation-service.api-D_uJ7BKc.js +0 -5
  1125. package/build/assets/agent-settings-DyfziYyM.js +0 -2
  1126. package/build/assets/alert-banner-BFayS5vM.js +0 -1
  1127. package/build/assets/analytics-consent-form-modal-CQ22qlFF.js +0 -1
  1128. package/build/assets/api-key-entry-screen-KnIwP0vN.js +0 -1
  1129. package/build/assets/app-settings-CBaHJ5vJ.js +0 -1
  1130. package/build/assets/automation-detail-DgQswnXg.js +0 -1
  1131. package/build/assets/automations-list-D99p6CoQ.js +0 -1
  1132. package/build/assets/back-nav-button-Cp9z-wsG.js +0 -1
  1133. package/build/assets/backend-form-modal-BABAz-zH.js +0 -1
  1134. package/build/assets/backend-synced-settings-badge-DzwWQC4T.js +0 -1
  1135. package/build/assets/base-modal-1bHiB5Wf.js +0 -1
  1136. package/build/assets/brand-button-FHWgEb4Q.js +0 -1
  1137. package/build/assets/browser-store-B9h0eW79.js +0 -1
  1138. package/build/assets/browser-tab-JiCXo0Nc.js +0 -1
  1139. package/build/assets/chat-send-button-QtyofqFt.js +0 -1
  1140. package/build/assets/check-6ieIiPhW.js +0 -1
  1141. package/build/assets/checkmark-BfgRVMHK.js +0 -1
  1142. package/build/assets/circle-plus-check-toggle-CmINKfZj.js +0 -1
  1143. package/build/assets/close-DhH0uMa7.js +0 -1
  1144. package/build/assets/code-tag-CnORXDJj.js +0 -1
  1145. package/build/assets/combobox-caret-BB15S7zY.js +0 -1
  1146. package/build/assets/condenser-settings-BOKNShD9.js +0 -1
  1147. package/build/assets/confirmation-modal-CofmThy4.js +0 -1
  1148. package/build/assets/context-menu-list-item-DO12IEaK.js +0 -1
  1149. package/build/assets/conversation-DIzv-jq8.js +0 -1
  1150. package/build/assets/conversation-DV3odvMe.js +0 -19
  1151. package/build/assets/conversation-local-storage-DK7yJr5N.js +0 -1
  1152. package/build/assets/conversation-panel-CgCarTAn.js +0 -1
  1153. package/build/assets/conversation-service.api-RV_bOKNz.js +0 -1
  1154. package/build/assets/conversation-state-store-4obo4ZMf.js +0 -1
  1155. package/build/assets/conversation-store-CXrL0v-X.js +0 -6
  1156. package/build/assets/conversation-tab-empty-state-CqT5ur_H.js +0 -1
  1157. package/build/assets/copy-C5tBqfWu.js +0 -1
  1158. package/build/assets/copy-to-clipboard-button-BVFYcsg_.js +0 -1
  1159. package/build/assets/createLucideIcon-D3nkdIAN.js +0 -1
  1160. package/build/assets/declaration-B0yY_dkQ.js +0 -1
  1161. package/build/assets/device-verify-DRupI_hz.js +0 -1
  1162. package/build/assets/dist-D5d5zm8o.js +0 -1
  1163. package/build/assets/dist-fV7trlfb.js +0 -1
  1164. package/build/assets/dropdown-classes-5IsMjYYw.js +0 -1
  1165. package/build/assets/edit-automation-modal-BG-gd82b.js +0 -1
  1166. package/build/assets/ellipsis-button-DWvVZO_r.js +0 -1
  1167. package/build/assets/entry.client-uhbVfCtd.js +0 -2
  1168. package/build/assets/enum-filter-dropdown-CB2fqz_e.js +0 -1
  1169. package/build/assets/environment-switch-overlay-Oeal5TVq.js +0 -1
  1170. package/build/assets/extensions-hub-DxiE0AZR.js +0 -1
  1171. package/build/assets/files-tab-1F2OlNeH.js +0 -1
  1172. package/build/assets/files-tab-store-C1q5Rbx3.js +0 -1
  1173. package/build/assets/folder-C5tr7xyN.js +0 -1
  1174. package/build/assets/get-language-from-path-E1JKsbeE.js +0 -1
  1175. package/build/assets/git-provider-icon-CKs-22Ts.js +0 -1
  1176. package/build/assets/home-B3E0le0g.js +0 -1
  1177. package/build/assets/iconBase-DMoh3FEg.js +0 -1
  1178. package/build/assets/index-redirect-DhuK5mhS.js +0 -1
  1179. package/build/assets/install-server-modal-DjintV14.js +0 -1
  1180. package/build/assets/is-backend-llm-ready-Bj44pekN.js +0 -1
  1181. package/build/assets/launch-DCU3S84p.js +0 -1
  1182. package/build/assets/lesson-plan-BUUPKVsa.js +0 -3
  1183. package/build/assets/link-external-CF4KHxx-.js +0 -1
  1184. package/build/assets/llm-client-BakM_czF.js +0 -1
  1185. package/build/assets/llm-not-configured-banner-BV-NIjfR.js +0 -27
  1186. package/build/assets/llm-settings-B5d7PHzz.js +0 -1
  1187. package/build/assets/llm-settings-C5whb-0p.js +0 -1
  1188. package/build/assets/loader-circle-DyX8DmLg.js +0 -1
  1189. package/build/assets/loading-spinner-BvOAco8a.js +0 -1
  1190. package/build/assets/manage-backends-modal-D9ClxVpM.js +0 -1
  1191. package/build/assets/manifest-38a873aa.js +0 -1
  1192. package/build/assets/mcp-7rk44GRS.js +0 -9
  1193. package/build/assets/mcp-client-DxHXYNOw.js +0 -1
  1194. package/build/assets/messages-DgBEaXil.js +0 -43
  1195. package/build/assets/modal-backdrop-DjAC2zOZ.js +0 -1
  1196. package/build/assets/modal-body-OJdIUJ68.js +0 -1
  1197. package/build/assets/modal-close-button-BNjGesHc.js +0 -1
  1198. package/build/assets/model-selector-w2uGPM5y.js +0 -1
  1199. package/build/assets/navigation-context-CUJ60pLI.js +0 -1
  1200. package/build/assets/navigation-link-BiPKTOHF.js +0 -1
  1201. package/build/assets/onboarding-Cit87z8g.js +0 -1
  1202. package/build/assets/onboarding-modal-JPrzvr8W.js +0 -1
  1203. package/build/assets/openhands-logo-uNs9g6LY.js +0 -1
  1204. package/build/assets/option-service.api-BLYUhnCF.js +0 -1
  1205. package/build/assets/organization-service.api-DpSSwlZu.js +0 -1
  1206. package/build/assets/path-utils-B4WAVqvK.js +0 -1
  1207. package/build/assets/plan-components-DSOTFW2D.js +0 -1
  1208. package/build/assets/planner-tab-LmoxgKKe.js +0 -1
  1209. package/build/assets/preload-helper-D_sPnjeL.js +0 -1
  1210. package/build/assets/profiles-client-B4SJ4ZAf.js +0 -1
  1211. package/build/assets/providers-BGUAB8kf.js +0 -1
  1212. package/build/assets/react-Dn-iWFF5.js +0 -1
  1213. package/build/assets/react-dom-BBXlXOZX.js +0 -1
  1214. package/build/assets/react-uQK8du1l.js +0 -1
  1215. package/build/assets/recommended-automations-launcher-Df9MXUpX.js +0 -50
  1216. package/build/assets/root-BShAdYGY.css +0 -1
  1217. package/build/assets/root-C99reK-P.js +0 -2
  1218. package/build/assets/root-layout-BtH64XeC.js +0 -2
  1219. package/build/assets/runtime-waiting-state-C7MjXDeW.js +0 -1
  1220. package/build/assets/schema-field-BCDuEMrl.js +0 -1
  1221. package/build/assets/sdk-section-page-XJN9mGju.js +0 -1
  1222. package/build/assets/sdk-settings-schema-B15AE1GH.js +0 -1
  1223. package/build/assets/search-rob4u9f8.js +0 -1
  1224. package/build/assets/secrets-service-CrPyCR8u.js +0 -1
  1225. package/build/assets/secrets-settings-UJn15N7E.js +0 -1
  1226. package/build/assets/settings-C5aUD_sQ.js +0 -1
  1227. package/build/assets/settings-dropdown-input-DQRt2_RA.js +0 -1
  1228. package/build/assets/settings-gear-B7bZDo_8.js +0 -1
  1229. package/build/assets/settings-index-zP_rYIW1.js +0 -1
  1230. package/build/assets/settings-input-n8FzVso3.js +0 -1
  1231. package/build/assets/settings-list-classes-DquY3fwm.js +0 -1
  1232. package/build/assets/settings-modal-szlQ6LpE.js +0 -1
  1233. package/build/assets/settings-section-header-context-DrXgyNC-.js +0 -1
  1234. package/build/assets/settings-service.api-B4G8NzCM.js +0 -1
  1235. package/build/assets/settings-switch-DsbEm3ie.js +0 -1
  1236. package/build/assets/shared-conversation-BrAvqeaI.js +0 -1
  1237. package/build/assets/sidebar-mobile-menu-toggle-BRZGCe-l.js +0 -1
  1238. package/build/assets/sidebar-nav-link-B_EygIce.js +0 -1
  1239. package/build/assets/skill-card-pill-row-Bq9Imkdh.js +0 -1
  1240. package/build/assets/skills-Wg6i0kbu.js +0 -1
  1241. package/build/assets/skills-client-DNd444Bm.js +0 -1
  1242. package/build/assets/skills-plugins-DaGkVI7-.js +0 -1
  1243. package/build/assets/skills-settings-Dlp0WFaT.js +0 -2
  1244. package/build/assets/styled-tooltip-ulgpZDga.js +0 -1
  1245. package/build/assets/suspense-BqBQEuKs.js +0 -1
  1246. package/build/assets/switch-skeleton-C49gVWOQ.js +0 -1
  1247. package/build/assets/task-list-tab-Bz-UlCm2.js +0 -1
  1248. package/build/assets/telemetry-DD3HKMgf.js +0 -2
  1249. package/build/assets/terminal-BwLvVzyJ.js +0 -1
  1250. package/build/assets/toggle-switch-CxW8-lBI.js +0 -1
  1251. package/build/assets/typography-BLf_mRKH.js +0 -1
  1252. package/build/assets/u-check-circle-CxTAJuY9.js +0 -1
  1253. package/build/assets/u-check-circle-half-Bj73jfUG.js +0 -1
  1254. package/build/assets/u-circuit-C-6V9H9C.js +0 -1
  1255. package/build/assets/u-edit-C7OnK2sa.js +0 -1
  1256. package/build/assets/use-acp-credential-form-oehc057O.js +0 -1
  1257. package/build/assets/use-active-conversation-CFXVX2on.js +0 -1
  1258. package/build/assets/use-agent-state-D6xfZA4-.js +0 -1
  1259. package/build/assets/use-backends-health-93yRIOWs.js +0 -1
  1260. package/build/assets/use-breakpoint-Xdy_aZHE.js +0 -1
  1261. package/build/assets/use-click-outside-element-CADb_gCP.js +0 -1
  1262. package/build/assets/use-cloud-current-user-id-CzOXsy04.js +0 -1
  1263. package/build/assets/use-config-oXjEWyb6.js +0 -1
  1264. package/build/assets/use-create-conversation-D-YkgrxS.js +0 -1
  1265. package/build/assets/use-create-secret-CX7Ij7W4.js +0 -1
  1266. package/build/assets/use-event-store-DMRAQQi8.js +0 -1
  1267. package/build/assets/use-handle-plan-click-CwW2Ijc2.js +0 -1
  1268. package/build/assets/use-is-authed-CNbX1KMm.js +0 -1
  1269. package/build/assets/use-launch-skill-in-chat-xI9byRUw.js +0 -1
  1270. package/build/assets/use-llm-profiles-BXRZ2rBh.js +0 -1
  1271. package/build/assets/use-runtime-is-ready-Dwzs9_vp.js +0 -1
  1272. package/build/assets/use-settings-_usWr_qn.js +0 -1
  1273. package/build/assets/use-settings-nav-items-DoB5iH-7.js +0 -16
  1274. package/build/assets/use-skills-BtorhoCN.js +0 -1
  1275. package/build/assets/use-task-list-u46BhYBC.js +0 -1
  1276. package/build/assets/use-tracking-Ca7p71hH.js +0 -1
  1277. package/build/assets/use-user-conversation-U-16WF6G.js +0 -1
  1278. package/build/assets/useMutation-CseCrRRO.js +0 -1
  1279. package/build/assets/useQuery-bowvACed.js +0 -1
  1280. package/build/assets/useTranslation-KhTtKmnv.js +0 -1
  1281. package/build/assets/utils-cRyMoFbz.js +0 -1
  1282. package/build/assets/vendor~conversation-panel~conversation~alert-banner-CjfR7T3x.js +0 -1
  1283. package/build/assets/vendor~entry.client-_zl82x5T.js +0 -1
  1284. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dj9x5fm9-CgCGB-3J.js +0 -177
  1285. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfvr34cq-BJdsUTJG.js +0 -1
  1286. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~m3df9r20-BynFAJ_S.js +0 -1
  1287. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nk00xiud-MfCRtPrK.js +0 -9
  1288. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ghtfhmuy-BHDILMe2.js +0 -1
  1289. package/build/assets/vendor~root-layout~conversation-panel~conversation-BFZmbXpq.js +0 -1
  1290. package/build/assets/vendor~root-layout~conversation-panel~conversation~index-BPY-kNjK.js +0 -1
  1291. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-BhWqQNmF.js +0 -1
  1292. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~cfyi58ut-CnnEa0dP.js +0 -1
  1293. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~clac83qc-DMX6XUwI.js +0 -2
  1294. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-Cqp6k3RG.js +0 -1
  1295. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-DS4GWhCz.js +0 -9
  1296. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~ji28rqgb-DVffa9Ks.js +0 -48
  1297. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-BzR6ypP3.js +0 -1
  1298. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-BcvHZmEZ.js +0 -2
  1299. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-Cuvp6wqR.js +0 -14
  1300. package/build/assets/verification-settings-DKZnUHD6.js +0 -1
  1301. package/build/assets/x-DpnGZyVW.js +0 -1
  1302. package/build/assets/x-mark-x3tvCZzc.js +0 -1
  1303. package/dist/components/features/analytics/analytics-consent-form-modal.d.ts +0 -5
  1304. package/dist/components/features/chat/switch-profile-button.cjs +0 -2
  1305. package/dist/components/features/chat/switch-profile-button.cjs.map +0 -1
  1306. package/dist/components/features/chat/switch-profile-button.d.ts +0 -1
  1307. package/dist/components/features/chat/switch-profile-button.js +0 -48
  1308. package/dist/components/features/chat/switch-profile-button.js.map +0 -1
  1309. package/dist/components/features/chat/switch-profile-context-menu.cjs +0 -2
  1310. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +0 -1
  1311. package/dist/components/features/chat/switch-profile-context-menu.d.ts +0 -9
  1312. package/dist/components/features/chat/switch-profile-context-menu.js +0 -106
  1313. package/dist/components/features/chat/switch-profile-context-menu.js.map +0 -1
  1314. package/dist/components/features/onboarding/is-backend-llm-ready.d.ts +0 -30
  1315. package/dist/icons/u-circuit.cjs +0 -2
  1316. package/dist/icons/u-circuit.cjs.map +0 -1
  1317. package/dist/icons/u-circuit.js +0 -19
  1318. package/dist/icons/u-circuit.js.map +0 -1
  1319. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs +0 -2
  1320. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs.map +0 -1
  1321. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js +0 -35
  1322. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js.map +0 -1
  1323. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs +0 -2
  1324. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs.map +0 -1
  1325. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js +0 -35
  1326. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js.map +0 -1
  1327. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs +0 -2
  1328. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs.map +0 -1
  1329. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js +0 -35
  1330. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js.map +0 -1
  1331. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +0 -2
  1332. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +0 -1
  1333. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +0 -35
  1334. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +0 -1
  1335. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs +0 -2
  1336. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs.map +0 -1
  1337. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js +0 -35
  1338. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js.map +0 -1
  1339. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs +0 -2
  1340. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs.map +0 -1
  1341. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js +0 -35
  1342. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js.map +0 -1
  1343. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs +0 -2
  1344. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs.map +0 -1
  1345. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js +0 -28
  1346. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js.map +0 -1
  1347. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs +0 -2
  1348. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs.map +0 -1
  1349. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js +0 -35
  1350. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js.map +0 -1
  1351. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs +0 -2
  1352. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs.map +0 -1
  1353. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js +0 -35
  1354. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js.map +0 -1
  1355. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs +0 -2
  1356. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs.map +0 -1
  1357. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js +0 -35
  1358. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js.map +0 -1
  1359. /package/build/assets/{agent-server-ui-style-scope-CIDFDeQb.js → agent-server-ui-style-scope-COnDHTm5.js} +0 -0
  1360. /package/build/assets/{automation-DNgDxqtq.js → automation-BU8zu-FP.js} +0 -0
  1361. /package/build/assets/{common-KeiA2Rod.js → common-Dh7OqABE.js} +0 -0
  1362. /package/build/assets/{environment-switch-store-BpKxp6Xq.js → environment-switch-store-DkjlKWzN.js} +0 -0
  1363. /package/build/assets/{extension-module-card-classes-DvvyImGv.js → extension-module-card-classes-9V3J9J_b.js} +0 -0
  1364. /package/build/assets/{git-status-mapper-B3_HbzUT.js → git-status-mapper-BI8FyUVp.js} +0 -0
  1365. /package/build/assets/{handle-capture-consent-BChvj6mt.js → handle-capture-consent-CPMXU29K.js} +0 -0
  1366. /package/build/assets/{llm-subscription-C1xDoa3K.js → llm-subscription-DtsX5Lhg.js} +0 -0
  1367. /package/build/assets/{map-provider-MonJL5SS.js → map-provider-BM2SJarp.js} +0 -0
  1368. /package/build/assets/{objectWithoutPropertiesLoose-BRYudkUn.js → objectWithoutPropertiesLoose-BgYIAs2y.js} +0 -0
  1369. /package/build/assets/{rolldown-runtime-wFmyQBCi.js → rolldown-runtime-BFRubm34.js} +0 -0
  1370. /package/build/assets/{settings-like-page-layout-classes-DNg2vKSM.js → settings-like-page-layout-classes-DENKlZpD.js} +0 -0
  1371. /package/build/assets/{v4-BMWDcIWQ.js → v4-DbCkTSoU.js} +0 -0
  1372. /package/build/assets/{vendor~browser-yZEspfT9.js → vendor~browser-Dqd33JyP.js} +0 -0
  1373. /package/build/assets/{vendor~terminal-CcUoOdAH.js → vendor~terminal-aeP3PnKf.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"backend-selector.cjs","names":[],"sources":["../../../../src/components/features/backends/backend-selector.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useMatch, useNavigate } from \"react-router\";\nimport { Plus, Settings } from \"lucide-react\";\nimport { Dropdown } from \"#/ui/dropdown/dropdown\";\nimport { DropdownOption } from \"#/ui/dropdown/types\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useAllCloudOrganizations } from \"#/hooks/query/use-cloud-organizations\";\nimport { useCloudCurrentUserId } from \"#/hooks/query/use-cloud-current-user-id\";\nimport {\n useBackendsHealth,\n type BackendHealth,\n} from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { Backend } from \"#/api/backend-registry/types\";\n// Import the trigger helpers from the lightweight store, not the overlay\n// component, so the eagerly-mounted sidebar/backend-selector graph does not\n// pull in the overlay's render code (the overlay is lazy-loaded from\n// `routes/root-layout.tsx`).\nimport {\n ENVIRONMENT_SWITCH_SETACTIVE_DELAY_MS,\n triggerEnvironmentSwitch,\n} from \"#/components/features/backends/environment-switch-store\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { AddBackendModal } from \"./add-backend-modal\";\nimport { BackendStatusDot } from \"./backend-status-dot\";\nimport { ManageBackendsModal } from \"./manage-backends-modal\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlTransitionClassName } from \"#/utils/form-control-classes\";\nimport {\n dropdownFooterActionClassName,\n dropdownMenuListClassName,\n dropdownMenuRowIconWrapperClassName,\n} from \"#/utils/dropdown-classes\";\n\nconst VALUE_SEPARATOR = \"::\";\n\nfunction makeOptionValue(backendId: string, orgId: string | null): string {\n return orgId ? `${backendId}${VALUE_SEPARATOR}${orgId}` : backendId;\n}\n\nfunction parseOptionValue(value: string): {\n backendId: string;\n orgId: string | null;\n} {\n const [backendId, orgId] = value.split(VALUE_SEPARATOR);\n return { backendId, orgId: orgId ?? null };\n}\n\nfunction buildStatusPrefix(health: BackendHealth | undefined) {\n return <BackendStatusDot isConnected={health?.isConnected ?? null} />;\n}\n\nfunction buildNoBackendPrefix() {\n return <BackendStatusDot isConnected=\"unavailable\" />;\n}\n\nfunction buildOptions(\n registered: Backend[],\n personalWorkspaceLabel: string,\n cloudOrgs: ReturnType<typeof useAllCloudOrganizations>,\n currentUserIds: ReturnType<typeof useCloudCurrentUserId>,\n healthByBackendId: Record<string, BackendHealth>,\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n const locals = registered.filter((b) => b.kind === \"local\");\n const clouds = registered.filter((b) => b.kind === \"cloud\");\n\n for (const b of locals) {\n options.push({\n value: makeOptionValue(b.id, null),\n label: b.name,\n prefix: buildStatusPrefix(healthByBackendId[b.id]),\n });\n }\n\n for (const b of clouds) {\n const entry = cloudOrgs[b.id];\n const prefix = buildStatusPrefix(healthByBackendId[b.id]);\n if (!entry || entry.orgs.length === 0) {\n options.push({\n value: makeOptionValue(b.id, null),\n label: b.name,\n prefix,\n });\n } else {\n // Personal-workspace rule (per the cloud contract): the org whose\n // id matches the calling user's id is the user's personal\n // workspace. We resolve `user_id` once per backend (via /me on any\n // one org) and apply it across all orgs of that backend.\n const userIdForBackend = currentUserIds[b.id]?.userId ?? null;\n\n for (const org of entry.orgs) {\n const isPersonal = !!userIdForBackend && userIdForBackend === org.id;\n const orgLabel = isPersonal ? personalWorkspaceLabel : org.name;\n options.push({\n value: makeOptionValue(b.id, org.id),\n label: `${b.name} – ${orgLabel}`,\n // All org rows for the same cloud backend share that backend's\n // single connectivity verdict — there is no per-org probe.\n prefix,\n });\n }\n }\n }\n\n return options;\n}\n\ninterface BackendSelectorProps {\n /** Render the menu above the trigger (e.g. when pinned to bottom of sidebar). */\n openUpward?: boolean;\n /** Hide the selector input trigger and only render the dropdown menu. */\n hideTrigger?: boolean;\n /** Whether the dropdown menu should start open on mount. */\n defaultOpen?: boolean;\n /** Callback fired after selecting a backend/org option. */\n onSelectOption?: () => void;\n /**\n * Override the internal Add Backend modal handling. When provided,\n * clicking \"Add Backend\" calls this instead of opening BackendSelector's\n * own modal. Useful when the selector is mounted inside an ephemeral\n * container (e.g. the collapsed-sidebar popover) and the modal must\n * survive the parent unmounting.\n */\n onOpenAddBackend?: () => void;\n /** Same as onOpenAddBackend but for the Manage Backends modal. */\n onOpenManageBackends?: () => void;\n /**\n * Whether the surrounding sidebar rail is in its collapsed variant. Passed\n * down from `SidebarRailBody` so the mobile drawer (which always renders\n * the expanded rail) can override the persisted desktop value.\n */\n sidebarCollapsed?: boolean;\n}\n\nexport function BackendSelector({\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n onSelectOption,\n onOpenAddBackend,\n onOpenManageBackends,\n sidebarCollapsed = false,\n}: BackendSelectorProps = {}) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, setActive } = useActiveBackendContext();\n const cloudOrgs = useAllCloudOrganizations();\n const currentUserIds = useCloudCurrentUserId();\n // Probe each registered backend every 10s.\n const healthByBackendId = useBackendsHealth(backends);\n const navigate = useNavigate();\n const settingsMatch = useMatch(\"/settings\");\n const settingsSubrouteMatch = useMatch(\"/settings/*\");\n const conversationMatch = useMatch(\"/conversations/:conversationId\");\n const automationDetailMatch = useMatch(\"/automations/:automationId\");\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n\n const personalWorkspaceLabel = t(I18nKey.BACKEND$PERSONAL_WORKSPACE);\n\n const options = React.useMemo(\n () =>\n buildOptions(\n backends,\n personalWorkspaceLabel,\n cloudOrgs,\n currentUserIds,\n healthByBackendId,\n ),\n [\n backends,\n personalWorkspaceLabel,\n cloudOrgs,\n currentUserIds,\n healthByBackendId,\n ],\n );\n\n const noBackendSelected = isNoBackend(active.backend);\n const noBackendLabel = t(I18nKey.BACKEND$NO_BACKEND_AVAILABLE);\n const activeValue = makeOptionValue(active.backend.id, active.orgId);\n const activeOption = noBackendSelected\n ? undefined\n : options.find((o) => o.value === activeValue);\n const isSettingsActive = Boolean(settingsMatch || settingsSubrouteMatch);\n const settingsLabel = t(I18nKey.SIDEBAR$SETTINGS);\n const isRightPanelShown = useConversationStore(\n (state) => state.isRightPanelShown,\n );\n // When the sidebar rail is expanded, `placement=\"left\"` hugs the main\n // canvas and reads awkwardly; prefer above the control. When the rail is\n // collapsed, keep left except on active conversation + open right drawer.\n const settingsTooltipPlacement =\n !sidebarCollapsed || (conversationMatch && isRightPanelShown)\n ? \"top\"\n : \"left\";\n\n const someCloudLoading = Object.values(cloudOrgs).some((c) => c.isLoading);\n\n // Self-heal a malformed `(cloudBackendId, null)` selection.\n //\n // Once a cloud backend's orgs resolve, the dropdown only renders\n // per-org rows for it — the `(backendId, null)` row disappears, so\n // selecting that shape would drift from what the dropdown can render\n // (UI says \"Local\", APIs hit cloud). When we detect the drift, snap\n // the selection onto the personal-workspace org (or, lacking a /me\n // result, the first org). The selection is recorded locally only;\n // the cloud request scope follows from the API key's bound org and the\n // X-Org-Id header sent by `callCloudProxy`, so the cloud UI's\n // org choice is never mutated as a side effect.\n React.useEffect(() => {\n if (noBackendSelected || active.backend.kind !== \"cloud\" || active.orgId)\n return;\n const { backend } = active;\n const entry = cloudOrgs[backend.id];\n if (!entry || entry.orgs.length === 0) return;\n\n const userId = currentUserIds[backend.id]?.userId ?? null;\n const personal = userId\n ? entry.orgs.find((o) => o.id === userId)\n : undefined;\n const target = personal ?? entry.orgs[0];\n if (target) {\n setActive(backend.id, target.id);\n }\n }, [active, cloudOrgs, currentUserIds, setActive, noBackendSelected]);\n\n const openAddBackendModal = React.useCallback(() => {\n if (onOpenAddBackend) {\n onOpenAddBackend();\n onSelectOption?.();\n return;\n }\n setAddBackendModalOpen(true);\n }, [onOpenAddBackend, onSelectOption]);\n\n const openManageBackendsModal = React.useCallback(() => {\n if (onOpenManageBackends) {\n onOpenManageBackends();\n onSelectOption?.();\n return;\n }\n setManageBackendsModalOpen(true);\n }, [onOpenManageBackends, onSelectOption]);\n\n const preventDropdownMenuClose = React.useCallback(\n (event: React.SyntheticEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n },\n [],\n );\n\n const handleAddBackendClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openAddBackendModal();\n },\n [openAddBackendModal, preventDropdownMenuClose],\n );\n\n const handleAddBackendTouchEnd = React.useCallback(\n (event: React.TouchEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openAddBackendModal();\n },\n [openAddBackendModal, preventDropdownMenuClose],\n );\n\n const handleManageBackendsClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openManageBackendsModal();\n },\n [openManageBackendsModal, preventDropdownMenuClose],\n );\n\n const handleManageBackendsTouchEnd = React.useCallback(\n (event: React.TouchEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openManageBackendsModal();\n },\n [openManageBackendsModal, preventDropdownMenuClose],\n );\n\n const addBackendFooter = (\n <div className={dropdownMenuListClassName}>\n <button\n type=\"button\"\n data-testid=\"add-backend-menu-item\"\n onMouseDown={preventDropdownMenuClose}\n onTouchStart={preventDropdownMenuClose}\n onTouchEnd={handleAddBackendTouchEnd}\n onClick={handleAddBackendClick}\n className={cn(\n dropdownFooterActionClassName,\n \"cursor-pointer rounded-md\",\n )}\n >\n <span className={dropdownMenuRowIconWrapperClassName} aria-hidden>\n <Plus width={16} height={16} />\n </span>\n {t(I18nKey.BACKEND$ADD)}\n </button>\n <button\n type=\"button\"\n data-testid=\"manage-backends-menu-item\"\n onMouseDown={preventDropdownMenuClose}\n onTouchStart={preventDropdownMenuClose}\n onTouchEnd={handleManageBackendsTouchEnd}\n onClick={handleManageBackendsClick}\n className={cn(\n dropdownFooterActionClassName,\n \"cursor-pointer rounded-md\",\n )}\n >\n <span className={dropdownMenuRowIconWrapperClassName} aria-hidden>\n <Settings width={16} height={16} />\n </span>\n {t(I18nKey.BACKEND$MANAGE)}\n </button>\n </div>\n );\n\n const handleSelectBackend = React.useCallback(\n async (value: string) => {\n if (value === activeValue) return;\n\n const { backendId, orgId } = parseOptionValue(value);\n const target = backends.find((b) => b.id === backendId);\n if (!target) return;\n\n triggerEnvironmentSwitch(\n options.find((option) => option.value === value)?.label ?? target.name,\n );\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ENVIRONMENT_SWITCH_SETACTIVE_DELAY_MS);\n });\n\n // @spec BM-002 — Switching backends keeps the user on the same page\n if (conversationMatch) navigate(\"/conversations\");\n else if (automationDetailMatch) navigate(\"/automations\");\n\n setActive(target.id, orgId);\n onSelectOption?.();\n },\n [\n activeValue,\n backends,\n conversationMatch,\n automationDetailMatch,\n navigate,\n options,\n setActive,\n t,\n onSelectOption,\n ],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-2 w-full\">\n <div className=\"flex-1 min-w-0\">\n <Dropdown\n testId=\"backend-selector\"\n key={`${activeValue}-${activeOption?.label ?? \"\"}`}\n defaultValue={\n activeOption ?? {\n value: activeValue,\n label: noBackendSelected ? noBackendLabel : active.backend.name,\n prefix: noBackendSelected\n ? buildNoBackendPrefix()\n : buildStatusPrefix(healthByBackendId[active.backend.id]),\n }\n }\n footer={addBackendFooter}\n openUpward={openUpward}\n hideTrigger={hideTrigger}\n defaultOpen={defaultOpen}\n openOnHover={!hideTrigger}\n onChange={(item) => {\n if (!item) return;\n void handleSelectBackend(item.value);\n }}\n placeholder={\n noBackendSelected ? noBackendLabel : active.backend.name\n }\n loading={someCloudLoading}\n options={options}\n className=\"h-10 px-2 py-0 bg-transparent border-transparent hover:bg-[var(--oh-surface-raised)] focus-within:bg-[var(--oh-surface-raised)] focus-within:border-transparent focus-within:ring-0\"\n />\n </div>\n {!hideTrigger ? (\n <StyledTooltip\n content={settingsLabel}\n placement={settingsTooltipPlacement}\n offset={10}\n >\n <NavigationLink\n to=\"/settings\"\n data-testid=\"backend-selector-settings-link\"\n data-active={isSettingsActive}\n aria-label={settingsLabel}\n className={\n isSettingsActive\n ? cn(\n \"inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md bg-tertiary text-white font-normal cursor-pointer\",\n formControlTransitionClassName,\n )\n : cn(\n \"inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)] cursor-pointer\",\n formControlTransitionClassName,\n )\n }\n >\n <Settings width={16} height={16} />\n </NavigationLink>\n </StyledTooltip>\n ) : null}\n </div>\n {addBackendModalOpen ? (\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n ) : null}\n {manageBackendsModalOpen ? (\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"backend-selector.cjs","names":[],"sources":["../../../../src/components/features/backends/backend-selector.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useMatch, useNavigate } from \"react-router\";\nimport { Plus, Settings } from \"lucide-react\";\nimport { Dropdown } from \"#/ui/dropdown/dropdown\";\nimport { DropdownOption } from \"#/ui/dropdown/types\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useAllCloudOrganizations } from \"#/hooks/query/use-cloud-organizations\";\nimport { useCloudCurrentUserId } from \"#/hooks/query/use-cloud-current-user-id\";\nimport {\n useBackendsHealth,\n type BackendHealth,\n} from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { Backend } from \"#/api/backend-registry/types\";\n// Import the trigger helpers from the lightweight store, not the overlay\n// component, so the eagerly-mounted sidebar/backend-selector graph does not\n// pull in the overlay's render code (the overlay is lazy-loaded from\n// `routes/root-layout.tsx`).\nimport {\n ENVIRONMENT_SWITCH_SETACTIVE_DELAY_MS,\n triggerEnvironmentSwitch,\n} from \"#/components/features/backends/environment-switch-store\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { AddBackendModal } from \"./add-backend-modal\";\nimport { BackendStatusDot } from \"./backend-status-dot\";\nimport { ManageBackendsModal } from \"./manage-backends-modal\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlTransitionClassName } from \"#/utils/form-control-classes\";\nimport {\n dropdownFooterActionClassName,\n dropdownMenuListClassName,\n dropdownMenuRowIconWrapperClassName,\n} from \"#/utils/dropdown-classes\";\n\nconst VALUE_SEPARATOR = \"::\";\n\nfunction makeOptionValue(backendId: string, orgId: string | null): string {\n return orgId ? `${backendId}${VALUE_SEPARATOR}${orgId}` : backendId;\n}\n\nfunction parseOptionValue(value: string): {\n backendId: string;\n orgId: string | null;\n} {\n const [backendId, orgId] = value.split(VALUE_SEPARATOR);\n return { backendId, orgId: orgId ?? null };\n}\n\nfunction buildStatusPrefix(health: BackendHealth | undefined) {\n return <BackendStatusDot isConnected={health?.isConnected ?? null} />;\n}\n\nfunction buildNoBackendPrefix() {\n return <BackendStatusDot isConnected=\"unavailable\" />;\n}\n\nfunction buildOptions(\n registered: Backend[],\n personalWorkspaceLabel: string,\n cloudOrgs: ReturnType<typeof useAllCloudOrganizations>,\n currentUserIds: ReturnType<typeof useCloudCurrentUserId>,\n healthByBackendId: Record<string, BackendHealth>,\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n const locals = registered.filter((b) => b.kind === \"local\");\n const clouds = registered.filter((b) => b.kind === \"cloud\");\n\n for (const b of locals) {\n options.push({\n value: makeOptionValue(b.id, null),\n label: b.name,\n prefix: buildStatusPrefix(healthByBackendId[b.id]),\n });\n }\n\n for (const b of clouds) {\n const entry = cloudOrgs[b.id];\n const prefix = buildStatusPrefix(healthByBackendId[b.id]);\n if (!entry || entry.orgs.length === 0) {\n options.push({\n value: makeOptionValue(b.id, null),\n label: b.name,\n prefix,\n });\n } else {\n // Personal-workspace rule (per the cloud contract): the org whose\n // id matches the calling user's id is the user's personal\n // workspace. We resolve `user_id` once per backend (via /me on any\n // one org) and apply it across all orgs of that backend.\n const userIdForBackend = currentUserIds[b.id]?.userId ?? null;\n\n for (const org of entry.orgs) {\n const isPersonal = !!userIdForBackend && userIdForBackend === org.id;\n const orgLabel = isPersonal ? personalWorkspaceLabel : org.name;\n options.push({\n value: makeOptionValue(b.id, org.id),\n label: `${b.name} – ${orgLabel}`,\n // All org rows for the same cloud backend share that backend's\n // single connectivity verdict — there is no per-org probe.\n prefix,\n });\n }\n }\n }\n\n return options;\n}\n\ninterface BackendSelectorProps {\n /** Render the menu above the trigger (e.g. when pinned to bottom of sidebar). */\n openUpward?: boolean;\n /** Hide the selector input trigger and only render the dropdown menu. */\n hideTrigger?: boolean;\n /** Whether the dropdown menu should start open on mount. */\n defaultOpen?: boolean;\n /** Callback fired after selecting a backend/org option. */\n onSelectOption?: () => void;\n /**\n * Override the internal Add Backend modal handling. When provided,\n * clicking \"Add Backend\" calls this instead of opening BackendSelector's\n * own modal. Useful when the selector is mounted inside an ephemeral\n * container (e.g. the collapsed-sidebar popover) and the modal must\n * survive the parent unmounting.\n */\n onOpenAddBackend?: () => void;\n /** Same as onOpenAddBackend but for the Manage Backends modal. */\n onOpenManageBackends?: () => void;\n /**\n * Whether the surrounding sidebar rail is in its collapsed variant. Passed\n * down from `SidebarRailBody` so the mobile drawer (which always renders\n * the expanded rail) can override the persisted desktop value.\n */\n sidebarCollapsed?: boolean;\n}\n\nexport function BackendSelector({\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n onSelectOption,\n onOpenAddBackend,\n onOpenManageBackends,\n sidebarCollapsed = false,\n}: BackendSelectorProps = {}) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, setActive } = useActiveBackendContext();\n const cloudOrgs = useAllCloudOrganizations();\n const currentUserIds = useCloudCurrentUserId();\n // Probe each registered backend every 10s.\n const healthByBackendId = useBackendsHealth(backends);\n const navigate = useNavigate();\n const settingsMatch = useMatch(\"/settings\");\n const settingsSubrouteMatch = useMatch(\"/settings/*\");\n const conversationMatch = useMatch(\"/conversations/:conversationId\");\n const automationDetailMatch = useMatch(\"/automations/:automationId\");\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n\n const personalWorkspaceLabel = t(I18nKey.BACKEND$PERSONAL_WORKSPACE);\n\n const options = React.useMemo(\n () =>\n buildOptions(\n backends,\n personalWorkspaceLabel,\n cloudOrgs,\n currentUserIds,\n healthByBackendId,\n ),\n [\n backends,\n personalWorkspaceLabel,\n cloudOrgs,\n currentUserIds,\n healthByBackendId,\n ],\n );\n\n const noBackendSelected = isNoBackend(active.backend);\n const noBackendLabel = t(I18nKey.BACKEND$NO_BACKEND_AVAILABLE);\n const activeValue = makeOptionValue(active.backend.id, active.orgId);\n const activeOption = noBackendSelected\n ? undefined\n : options.find((o) => o.value === activeValue);\n const isSettingsActive = Boolean(settingsMatch || settingsSubrouteMatch);\n const settingsLabel = t(I18nKey.SIDEBAR$SETTINGS);\n const isRightPanelShown = useConversationStore(\n (state) => state.isRightPanelShown,\n );\n // When the sidebar rail is expanded, `placement=\"left\"` hugs the main\n // canvas and reads awkwardly; prefer above the control. When the rail is\n // collapsed, keep left except on active conversation + open right drawer.\n const settingsTooltipPlacement =\n !sidebarCollapsed || (conversationMatch && isRightPanelShown)\n ? \"top\"\n : \"left\";\n\n const someCloudLoading = Object.values(cloudOrgs).some((c) => c.isLoading);\n\n // Self-heal a malformed `(cloudBackendId, null)` selection.\n //\n // Once a cloud backend's orgs resolve, the dropdown only renders\n // per-org rows for it — the `(backendId, null)` row disappears, so\n // selecting that shape would drift from what the dropdown can render\n // (UI says \"Local\", APIs hit cloud). When we detect the drift, snap\n // the selection onto the personal-workspace org (or, lacking a /me\n // result, the first org). The selection is recorded locally only;\n // the cloud request scope follows from the API key's bound org and the\n // X-Org-Id header sent by `callCloudProxy`, so the cloud UI's\n // org choice is never mutated as a side effect.\n React.useEffect(() => {\n if (noBackendSelected || active.backend.kind !== \"cloud\" || active.orgId)\n return;\n const { backend } = active;\n const entry = cloudOrgs[backend.id];\n if (!entry || entry.orgs.length === 0) return;\n\n const userId = currentUserIds[backend.id]?.userId ?? null;\n const personal = userId\n ? entry.orgs.find((o) => o.id === userId)\n : undefined;\n const target = personal ?? entry.orgs[0];\n if (target) {\n setActive(backend.id, target.id);\n }\n }, [active, cloudOrgs, currentUserIds, setActive, noBackendSelected]);\n\n const openAddBackendModal = React.useCallback(() => {\n if (onOpenAddBackend) {\n onOpenAddBackend();\n onSelectOption?.();\n return;\n }\n setAddBackendModalOpen(true);\n }, [onOpenAddBackend, onSelectOption]);\n\n const openManageBackendsModal = React.useCallback(() => {\n if (onOpenManageBackends) {\n onOpenManageBackends();\n onSelectOption?.();\n return;\n }\n setManageBackendsModalOpen(true);\n }, [onOpenManageBackends, onSelectOption]);\n\n const preventDropdownMenuClose = React.useCallback(\n (event: React.SyntheticEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n },\n [],\n );\n\n const handleAddBackendClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openAddBackendModal();\n },\n [openAddBackendModal, preventDropdownMenuClose],\n );\n\n const handleAddBackendTouchEnd = React.useCallback(\n (event: React.TouchEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openAddBackendModal();\n },\n [openAddBackendModal, preventDropdownMenuClose],\n );\n\n const handleManageBackendsClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openManageBackendsModal();\n },\n [openManageBackendsModal, preventDropdownMenuClose],\n );\n\n const handleManageBackendsTouchEnd = React.useCallback(\n (event: React.TouchEvent<HTMLButtonElement>) => {\n preventDropdownMenuClose(event);\n openManageBackendsModal();\n },\n [openManageBackendsModal, preventDropdownMenuClose],\n );\n\n const addBackendFooter = (\n <div className={dropdownMenuListClassName}>\n <button\n type=\"button\"\n data-testid=\"add-backend-menu-item\"\n onMouseDown={preventDropdownMenuClose}\n onTouchStart={preventDropdownMenuClose}\n onTouchEnd={handleAddBackendTouchEnd}\n onClick={handleAddBackendClick}\n className={cn(\n dropdownFooterActionClassName,\n \"cursor-pointer rounded-md\",\n )}\n >\n <span className={dropdownMenuRowIconWrapperClassName} aria-hidden>\n <Plus width={16} height={16} />\n </span>\n {t(I18nKey.BACKEND$ADD)}\n </button>\n <button\n type=\"button\"\n data-testid=\"manage-backends-menu-item\"\n onMouseDown={preventDropdownMenuClose}\n onTouchStart={preventDropdownMenuClose}\n onTouchEnd={handleManageBackendsTouchEnd}\n onClick={handleManageBackendsClick}\n className={cn(\n dropdownFooterActionClassName,\n \"cursor-pointer rounded-md\",\n )}\n >\n <span className={dropdownMenuRowIconWrapperClassName} aria-hidden>\n <Settings width={16} height={16} />\n </span>\n {t(I18nKey.BACKEND$MANAGE)}\n </button>\n </div>\n );\n\n const handleSelectBackend = React.useCallback(\n async (value: string) => {\n if (value === activeValue) return;\n\n const { backendId, orgId } = parseOptionValue(value);\n const target = backends.find((b) => b.id === backendId);\n if (!target) return;\n\n triggerEnvironmentSwitch(\n options.find((option) => option.value === value)?.label ?? target.name,\n );\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ENVIRONMENT_SWITCH_SETACTIVE_DELAY_MS);\n });\n\n // @spec BM-002 — Switching backends keeps the user on the same page\n if (conversationMatch) navigate(\"/conversations\");\n else if (automationDetailMatch) navigate(\"/automations\");\n\n setActive(target.id, orgId);\n onSelectOption?.();\n },\n [\n activeValue,\n backends,\n conversationMatch,\n automationDetailMatch,\n navigate,\n options,\n setActive,\n t,\n onSelectOption,\n ],\n );\n\n return (\n <>\n <div className=\"flex items-center gap-2 w-full\">\n <div className=\"flex-1 min-w-0\">\n <Dropdown\n testId=\"backend-selector\"\n key={`${activeValue}-${activeOption?.label ?? \"\"}`}\n defaultValue={\n activeOption ?? {\n value: activeValue,\n label: noBackendSelected ? noBackendLabel : active.backend.name,\n prefix: noBackendSelected\n ? buildNoBackendPrefix()\n : buildStatusPrefix(healthByBackendId[active.backend.id]),\n }\n }\n footer={addBackendFooter}\n openUpward={openUpward}\n hideTrigger={hideTrigger}\n defaultOpen={defaultOpen}\n openOnHover={!hideTrigger}\n onChange={(item) => {\n if (!item) return;\n void handleSelectBackend(item.value);\n }}\n placeholder={\n noBackendSelected ? noBackendLabel : active.backend.name\n }\n loading={someCloudLoading}\n options={options}\n className=\"h-10 px-2 py-0 bg-transparent border-transparent hover:bg-[var(--oh-surface-raised)] focus-within:bg-[var(--oh-surface-raised)] focus-within:border-transparent focus-within:ring-0\"\n />\n </div>\n {!hideTrigger ? (\n <StyledTooltip\n content={settingsLabel}\n placement={settingsTooltipPlacement}\n offset={10}\n >\n <NavigationLink\n to=\"/settings\"\n data-testid=\"backend-selector-settings-link\"\n data-active={isSettingsActive}\n aria-label={settingsLabel}\n className={\n isSettingsActive\n ? cn(\n \"inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md bg-tertiary text-white font-normal cursor-pointer\",\n formControlTransitionClassName,\n )\n : cn(\n \"inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)] cursor-pointer\",\n formControlTransitionClassName,\n )\n }\n >\n <Settings width={16} height={16} />\n </NavigationLink>\n </StyledTooltip>\n ) : null}\n </div>\n {addBackendModalOpen ? (\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n ) : null}\n {manageBackendsModalOpen ? (\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
@@ -6,8 +6,8 @@ import { cn as i } from "../../../utils/utils.js";
6
6
  import { useConversationStore as a } from "../../../stores/conversation-store.js";
7
7
  import { isNoBackend as o } from "../../../api/backend-registry/active-store.js";
8
8
  import { useActiveBackendContext as s } from "../../../contexts/active-backend-context.js";
9
- import { StyledTooltip as ee } from "../../shared/buttons/styled-tooltip.js";
10
- import { formControlTransitionClassName as te } from "../../../utils/form-control-classes.js";
9
+ import { formControlTransitionClassName as ee } from "../../../utils/form-control-classes.js";
10
+ import { StyledTooltip as te } from "../../shared/buttons/styled-tooltip.js";
11
11
  import { dropdownFooterActionClassName as c, dropdownMenuListClassName as ne, dropdownMenuRowIconWrapperClassName as l } from "../../../utils/dropdown-classes.js";
12
12
  import { NavigationLink as re } from "../../shared/navigation-link.js";
13
13
  import { useAllCloudOrganizations as ie } from "../../../hooks/query/use-cloud-organizations.js";
@@ -187,7 +187,7 @@ function x({ openUpward: p = !1, hideTrigger: v = !1, defaultOpen: x = !1, onSel
187
187
  options: U,
188
188
  className: "h-10 px-2 py-0 bg-transparent border-transparent hover:bg-[var(--oh-surface-raised)] focus-within:bg-[var(--oh-surface-raised)] focus-within:border-transparent focus-within:ring-0"
189
189
  }, `${K}-${q?.label ?? ""}`)
190
- }), v ? null : /* @__PURE__ */ h(ee, {
190
+ }), v ? null : /* @__PURE__ */ h(te, {
191
191
  content: Y,
192
192
  placement: me,
193
193
  offset: 10,
@@ -196,7 +196,7 @@ function x({ openUpward: p = !1, hideTrigger: v = !1, defaultOpen: x = !1, onSel
196
196
  "data-testid": "backend-selector-settings-link",
197
197
  "data-active": J,
198
198
  "aria-label": Y,
199
- className: i(J ? "inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md bg-tertiary text-white font-normal cursor-pointer" : "inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)] cursor-pointer", te),
199
+ className: i(J ? "inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md bg-tertiary text-white font-normal cursor-pointer" : "inline-flex items-center justify-center shrink-0 w-9 h-9 rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)] cursor-pointer", ee),
200
200
  children: /* @__PURE__ */ h(r, {
201
201
  width: 16,
202
202
  height: 16
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs`),r=require(`../../../api/agent-server-client-options.cjs`),i=require(`../../../api/agent-server-compatibility.cjs`),a=require(`../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs`);let o=require(`react/jsx-runtime`);function s({backend:s}){let{t:c}=e.useTranslation(`openhands`),{data:l}=a.useQuery({queryKey:[`backend-version`,s.host,s.apiKey],queryFn:async()=>i.getDisplayAgentServerVersion(await new n.ServerClient(r.getAgentServerClientOptions({host:s.host,sessionApiKey:s.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:s.kind===`local`});return l?(0,o.jsx)(`span`,{className:`inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]`,"data-testid":`manage-backends-version-${s.name}`,children:c(t.I18nKey.BACKEND$VERSION_LABEL,{version:l})}):null}exports.BackendVersion=s;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs`);require(`../../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const r=require(`../../../api/agent-server-client-options.cjs`),i=require(`../../../api/agent-server-compatibility.cjs`),a=require(`../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs`);let o=require(`react/jsx-runtime`);function s({backend:s}){let{t:c}=e.useTranslation(`openhands`),{data:l}=a.useQuery({queryKey:[`backend-version`,s.host,s.apiKey],queryFn:async()=>i.getDisplayAgentServerVersion(await new n.ServerClient(r.getAgentServerClientOptions({host:s.host,sessionApiKey:s.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:s.kind===`local`});return l?(0,o.jsx)(`span`,{className:`inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]`,"data-testid":`manage-backends-version-${s.name}`,children:c(t.I18nKey.BACKEND$VERSION_LABEL,{version:l})}):null}exports.BackendVersion=s;
2
2
  //# sourceMappingURL=backend-version.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend-version.cjs","names":[],"sources":["../../../../src/components/features/backends/backend-version.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getDisplayAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return getDisplayAgentServerVersion(info);\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n"],"mappings":"ufASA,SAAgB,EAAe,CAAE,WAAiC,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,KAAM,GAAY,EAAA,SAAS,CACjC,SAAU,CAAC,kBAAmB,EAAQ,KAAM,EAAQ,OAAO,CAC3D,QAAS,SAQA,EAAA,6BAA6B,MAPjB,IAAI,EAAA,aACrB,EAAA,4BAA4B,CAC1B,KAAM,EAAQ,KACd,cAAe,EAAQ,QAAU,KACjC,QAAS,IACV,CAAC,CACH,CAAC,eAAe,CACwB,CAE3C,MAAO,GACP,UAAW,IACX,QAAS,EAAQ,OAAS,QAC3B,CAAC,CAIF,OAFK,GAGH,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,sLACV,cAAa,2BAA2B,EAAQ,gBAE/C,EAAE,EAAA,QAAQ,sBAAuB,CAAE,UAAS,CAAC,CACzC,CAAA,CARY"}
1
+ {"version":3,"file":"backend-version.cjs","names":[],"sources":["../../../../src/components/features/backends/backend-version.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getDisplayAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return getDisplayAgentServerVersion(info);\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n"],"mappings":"4kBASA,SAAgB,EAAe,CAAE,WAAiC,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,KAAM,GAAY,EAAA,SAAS,CACjC,SAAU,CAAC,kBAAmB,EAAQ,KAAM,EAAQ,OAAO,CAC3D,QAAS,SAQA,EAAA,6BAA6B,MAPjB,IAAI,EAAA,aACrB,EAAA,4BAA4B,CAC1B,KAAM,EAAQ,KACd,cAAe,EAAQ,QAAU,KACjC,QAAS,IACV,CAAC,CACH,CAAC,eAAe,CACwB,CAE3C,MAAO,GACP,UAAW,IACX,QAAS,EAAQ,OAAS,QAC3B,CAAC,CAIF,OAFK,GAGH,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,sLACV,cAAa,2BAA2B,EAAQ,gBAE/C,EAAE,EAAA,QAAQ,sBAAuB,CAAE,UAAS,CAAC,CACzC,CAAA,CARY"}
@@ -1,6 +1,7 @@
1
1
  import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { ServerClient as n } from "../../../node_modules/@openhands/typescript-client/dist/client/server-client.js";
4
+ import "../../../node_modules/@openhands/typescript-client/dist/clients.js";
4
5
  import { getAgentServerClientOptions as r } from "../../../api/agent-server-client-options.js";
5
6
  import { getDisplayAgentServerVersion as i } from "../../../api/agent-server-compatibility.js";
6
7
  import { useQuery as a } from "../../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
@@ -1 +1 @@
1
- {"version":3,"file":"backend-version.js","names":[],"sources":["../../../../src/components/features/backends/backend-version.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getDisplayAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return getDisplayAgentServerVersion(info);\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,EAAe,EAAE,cAAiC;CAChE,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,MAAM,MAAY,EAAS;EACjC,UAAU;GAAC;GAAmB,EAAQ;GAAM,EAAQ;GAAO;EAC3D,SAAS,YAQA,EAA6B,MAPjB,IAAI,EACrB,EAA4B;GAC1B,MAAM,EAAQ;GACd,eAAe,EAAQ,UAAU;GACjC,SAAS;GACV,CAAC,CACH,CAAC,eAAe,CACwB;EAE3C,OAAO;EACP,WAAW;EACX,SAAS,EAAQ,SAAS;EAC3B,CAAC;AAIF,QAFK,IAGH,kBAAC,QAAD;EACE,WAAU;EACV,eAAa,2BAA2B,EAAQ;YAE/C,EAAE,EAAQ,uBAAuB,EAAE,YAAS,CAAC;EACzC,CAAA,GARY"}
1
+ {"version":3,"file":"backend-version.js","names":[],"sources":["../../../../src/components/features/backends/backend-version.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getDisplayAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return getDisplayAgentServerVersion(info);\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,EAAe,EAAE,cAAiC;CAChE,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,MAAM,MAAY,EAAS;EACjC,UAAU;GAAC;GAAmB,EAAQ;GAAM,EAAQ;GAAO;EAC3D,SAAS,YAQA,EAA6B,MAPjB,IAAI,EACrB,EAA4B;GAC1B,MAAM,EAAQ;GACd,eAAe,EAAQ,UAAU;GACjC,SAAS;GACV,CAAC,CACH,CAAC,eAAe,CACwB;EAE3C,OAAO;EACP,WAAW;EACX,SAAS,EAAQ,SAAS;EAC3B,CAAC;AAIF,QAFK,IAGH,kBAAC,QAAD;EACE,WAAU;EACV,eAAa,2BAA2B,EAAQ;YAE/C,EAAE,EAAQ,uBAAuB,EAAE,YAAS,CAAC;EACzC,CAAA,GARY"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../node_modules/lucide-react/dist/esm/icons/plus.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../contexts/active-backend-context.cjs`),o=require(`../../shared/modals/modal-backdrop.cjs`),s=require(`../../shared/modals/modal-body.cjs`),c=require(`../../../utils/modal-classes.cjs`),l=require(`../../shared/modals/modal-close-button.cjs`),u=require(`../settings/brand-button.cjs`),d=require(`../../shared/modals/confirmation-modal.cjs`),f=require(`../../../hooks/query/use-backends-health.cjs`),p=require(`./backend-form-modal.cjs`),m=require(`./backend-row.cjs`);let h=require(`react`);h=e.__toESM(h,1);let g=require(`react/jsx-runtime`);function _({onClose:e,recoveryMode:_=!1}){let{t:v}=t.useTranslation(`openhands`),{backends:y,active:b,removeBackend:x,setActive:S,updateBackend:C}=a.useActiveBackendContext(),w=f.useBackendsHealth(y,{probeDisabledOnce:!0}),[T,E]=h.default.useState(null),[D,O]=h.default.useState(null),[k,A]=h.default.useState(!1),j=()=>{T&&(x(T.id),E(null))},M=h.default.useCallback(t=>{(b.backend.id!==t.id||b.orgId!==null)&&S(t.id),e()},[b.backend.id,b.orgId,e,S]),N=h.default.useCallback((e,t)=>{C(e.id,{apiKey:t})},[C]);return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(o.ModalBackdrop,{onClose:_?void 0:e,closeOnEscape:!_,closeOnBackdropClick:!_,"aria-label":v(n.I18nKey.BACKEND$MANAGE_TITLE),children:(0,g.jsxs)(`div`,{"data-testid":`manage-backends-modal`,className:i.cn(`relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl`,s.modalWidthClassName(`lg`),s.MODAL_MAX_WIDTH_VIEWPORT,`max-h-[70vh]`),children:[_?null:(0,g.jsx)(l.ModalCloseButton,{onClose:e,testId:`close-manage-backends-modal`}),(0,g.jsx)(`div`,{className:i.cn(`p-5`,!_&&`pr-12`),children:(0,g.jsx)(`h2`,{className:c.modalTitleLgClassName,children:v(n.I18nKey.BACKEND$MANAGE_TITLE)})}),(0,g.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col px-5`,children:(0,g.jsx)(`div`,{className:`flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always`,"data-testid":`manage-backends-list`,children:y.length===0?(0,g.jsx)(`p`,{className:`px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]`,children:v(n.I18nKey.BACKEND$MANAGE_EMPTY)}):(0,g.jsx)(`ul`,{className:`divide-y divide-[var(--oh-border)]`,children:y.map(e=>(0,g.jsx)(m.BackendRow,{backend:e,health:w[e.id],onSelect:()=>M(e),onEdit:()=>O(e),onRemove:()=>E({id:e.id,name:e.name}),onLogin:t=>N(e,t)},e.id))})})}),(0,g.jsxs)(`div`,{className:`flex justify-end gap-2 p-5`,children:[(0,g.jsx)(u.BrandButton,{type:`button`,variant:_?`primary`:`secondary`,onClick:()=>A(!0),testId:`manage-backends-add`,startContent:(0,g.jsx)(r.Plus,{width:14,height:14}),children:v(n.I18nKey.BACKEND$ADD)}),_?null:(0,g.jsx)(u.BrandButton,{type:`button`,variant:`primary`,onClick:e,testId:`manage-backends-done`,children:v(n.I18nKey.HOME$DONE)})]})]})}),k?(0,g.jsx)(p.BackendFormModal,{mode:`add`,onClose:()=>A(!1)}):null,D?(0,g.jsx)(p.BackendFormModal,{mode:`edit`,backend:D,onClose:()=>O(null)}):null,T?(0,g.jsx)(d.ConfirmationModal,{text:v(n.I18nKey.BACKEND$REMOVE_CONFIRMATION,{name:T.name}),onConfirm:j,onCancel:()=>E(null)}):null]})}exports.ManageBackendsModal=_;
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../node_modules/lucide-react/dist/esm/icons/plus.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../contexts/active-backend-context.cjs`),o=require(`../../shared/modals/modal-backdrop.cjs`),s=require(`../../shared/modals/modal-body.cjs`),c=require(`../../../utils/modal-classes.cjs`),l=require(`../../shared/modals/modal-close-button.cjs`),u=require(`../settings/brand-button.cjs`),d=require(`../../../hooks/query/use-cloud-organizations.cjs`),f=require(`../../../hooks/query/use-cloud-current-user-id.cjs`),p=require(`../../shared/modals/confirmation-modal.cjs`),m=require(`../../../hooks/query/use-backends-health.cjs`),h=require(`./backend-form-modal.cjs`),g=require(`./backend-row.cjs`);let _=require(`react`);_=e.__toESM(_,1);let v=require(`react/jsx-runtime`);function y(e,t,n,r){if(e.kind!==`cloud`)return;let i=t[e.id];if(!i||i.orgs.length===0)return;let a=n[e.id]?.userId??null;return i.orgs.map(e=>a&&a===e.id?r:e.name).join(`, `)}function b({onClose:e,recoveryMode:b=!1}){let{t:x}=t.useTranslation(`openhands`),{backends:S,active:C,removeBackend:w,setActive:T,updateBackend:E}=a.useActiveBackendContext(),D=m.useBackendsHealth(S,{probeDisabledOnce:!0}),O=d.useAllCloudOrganizations(),k=f.useCloudCurrentUserId(),A=x(n.I18nKey.BACKEND$PERSONAL_WORKSPACE),[j,M]=_.default.useState(null),[N,P]=_.default.useState(null),[F,I]=_.default.useState(!1),L=()=>{j&&(w(j.id),M(null))},R=_.default.useCallback(t=>{(C.backend.id!==t.id||C.orgId!==null)&&T(t.id),e()},[C.backend.id,C.orgId,e,T]),z=_.default.useCallback((e,t)=>{E(e.id,{apiKey:t})},[E]);return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(o.ModalBackdrop,{onClose:b?void 0:e,closeOnEscape:!b,closeOnBackdropClick:!b,"aria-label":x(n.I18nKey.BACKEND$MANAGE_TITLE),children:(0,v.jsxs)(`div`,{"data-testid":`manage-backends-modal`,className:i.cn(`relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl`,s.modalWidthClassName(`lg`),s.MODAL_MAX_WIDTH_VIEWPORT,`max-h-[70vh]`),children:[b?null:(0,v.jsx)(l.ModalCloseButton,{onClose:e,testId:`close-manage-backends-modal`}),(0,v.jsx)(`div`,{className:i.cn(`p-5`,!b&&`pr-12`),children:(0,v.jsx)(`h2`,{className:c.modalTitleLgClassName,children:x(n.I18nKey.BACKEND$MANAGE_TITLE)})}),(0,v.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col px-5`,children:(0,v.jsx)(`div`,{className:`flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always`,"data-testid":`manage-backends-list`,children:S.length===0?(0,v.jsx)(`p`,{className:`px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]`,children:x(n.I18nKey.BACKEND$MANAGE_EMPTY)}):(0,v.jsx)(`ul`,{className:`divide-y divide-[var(--oh-border)]`,children:S.map(e=>(0,v.jsx)(g.BackendRow,{backend:e,health:D[e.id],orgLabel:y(e,O,k,A),onSelect:()=>R(e),onEdit:()=>P(e),onRemove:()=>M({id:e.id,name:e.name}),onLogin:t=>z(e,t)},e.id))})})}),(0,v.jsxs)(`div`,{className:`flex justify-end gap-2 p-5`,children:[(0,v.jsx)(u.BrandButton,{type:`button`,variant:b?`primary`:`secondary`,onClick:()=>I(!0),testId:`manage-backends-add`,startContent:(0,v.jsx)(r.Plus,{width:14,height:14}),children:x(n.I18nKey.BACKEND$ADD)}),b?null:(0,v.jsx)(u.BrandButton,{type:`button`,variant:`primary`,onClick:e,testId:`manage-backends-done`,children:x(n.I18nKey.HOME$DONE)})]})]})}),F?(0,v.jsx)(h.BackendFormModal,{mode:`add`,source:`manage_backends_modal`,onClose:()=>I(!1)}):null,N?(0,v.jsx)(h.BackendFormModal,{mode:`edit`,backend:N,onClose:()=>P(null)}):null,j?(0,v.jsx)(p.ConfirmationModal,{text:x(n.I18nKey.BACKEND$REMOVE_CONFIRMATION,{name:j.name}),onConfirm:L,onCancel:()=>M(null)}):null]})}exports.ManageBackendsModal=b;
2
2
  //# sourceMappingURL=manage-backends-modal.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"manage-backends-modal.cjs","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Plus } from \"lucide-react\";\n\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { modalTitleLgClassName } from \"#/utils/modal-classes\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendRow } from \"./backend-row\";\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n /**\n * Recovery mode is used by the root unavailable-backend gate. There is no\n * app shell behind the modal, so dismiss controls would be misleading.\n */\n recoveryMode?: boolean;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\nexport function ManageBackendsModal({\n onClose,\n recoveryMode = false,\n}: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, removeBackend, setActive, updateBackend } =\n useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n const handleSelectBackend = React.useCallback(\n (backend: Backend) => {\n if (active.backend.id !== backend.id || active.orgId !== null) {\n setActive(backend.id);\n }\n onClose();\n },\n [active.backend.id, active.orgId, onClose, setActive],\n );\n\n const handleCloudLogin = React.useCallback(\n (backend: Backend, apiKey: string) => {\n updateBackend(backend.id, { apiKey });\n },\n [updateBackend],\n );\n\n return (\n <>\n <ModalBackdrop\n onClose={recoveryMode ? undefined : onClose}\n closeOnEscape={!recoveryMode}\n closeOnBackdropClick={!recoveryMode}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n {recoveryMode ? null : (\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n )}\n <div className={cn(\"p-5\", !recoveryMode && \"pr-12\")}>\n <h2 className={modalTitleLgClassName}>\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n onSelect={() => handleSelectBackend(backend)}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n onLogin={(apiKey) => handleCloudLogin(backend, apiKey)}\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant={recoveryMode ? \"primary\" : \"secondary\"}\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n {recoveryMode ? null : (\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n )}\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal mode=\"add\" onClose={() => setShowAddForm(false)} />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manage-backends-modal.cjs","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Plus } from \"lucide-react\";\n\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\nimport { useAllCloudOrganizations } from \"#/hooks/query/use-cloud-organizations\";\nimport { useCloudCurrentUserId } from \"#/hooks/query/use-cloud-current-user-id\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { modalTitleLgClassName } from \"#/utils/modal-classes\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendRow } from \"./backend-row\";\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n /**\n * Recovery mode is used by the root unavailable-backend gate. There is no\n * app shell behind the modal, so dismiss controls would be misleading.\n */\n recoveryMode?: boolean;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\n/**\n * Resolve the connected organization label for a backend row, mirroring the\n * per-org labelling used by the backend selector. Cloud API keys are bound to\n * a single org (legacy keys may expose several, joined here); local backends\n * and unresolved/errored lookups yield no label.\n */\nfunction resolveBackendOrgLabel(\n backend: Backend,\n cloudOrgs: ReturnType<typeof useAllCloudOrganizations>,\n currentUserIds: ReturnType<typeof useCloudCurrentUserId>,\n personalWorkspaceLabel: string,\n): string | undefined {\n if (backend.kind !== \"cloud\") return undefined;\n const entry = cloudOrgs[backend.id];\n if (!entry || entry.orgs.length === 0) return undefined;\n const userId = currentUserIds[backend.id]?.userId ?? null;\n return entry.orgs\n .map((org) =>\n !!userId && userId === org.id ? personalWorkspaceLabel : org.name,\n )\n .join(\", \");\n}\n\nexport function ManageBackendsModal({\n onClose,\n recoveryMode = false,\n}: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, removeBackend, setActive, updateBackend } =\n useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const cloudOrgs = useAllCloudOrganizations();\n const currentUserIds = useCloudCurrentUserId();\n const personalWorkspaceLabel = t(I18nKey.BACKEND$PERSONAL_WORKSPACE);\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n const handleSelectBackend = React.useCallback(\n (backend: Backend) => {\n if (active.backend.id !== backend.id || active.orgId !== null) {\n setActive(backend.id);\n }\n onClose();\n },\n [active.backend.id, active.orgId, onClose, setActive],\n );\n\n const handleCloudLogin = React.useCallback(\n (backend: Backend, apiKey: string) => {\n updateBackend(backend.id, { apiKey });\n },\n [updateBackend],\n );\n\n return (\n <>\n <ModalBackdrop\n onClose={recoveryMode ? undefined : onClose}\n closeOnEscape={!recoveryMode}\n closeOnBackdropClick={!recoveryMode}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n {recoveryMode ? null : (\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n )}\n <div className={cn(\"p-5\", !recoveryMode && \"pr-12\")}>\n <h2 className={modalTitleLgClassName}>\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n orgLabel={resolveBackendOrgLabel(\n backend,\n cloudOrgs,\n currentUserIds,\n personalWorkspaceLabel,\n )}\n onSelect={() => handleSelectBackend(backend)}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n onLogin={(apiKey) => handleCloudLogin(backend, apiKey)}\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant={recoveryMode ? \"primary\" : \"secondary\"}\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n {recoveryMode ? null : (\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n )}\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal\n mode=\"add\"\n source=\"manage_backends_modal\"\n onClose={() => setShowAddForm(false)}\n />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
@@ -8,111 +8,122 @@ import { MODAL_MAX_WIDTH_VIEWPORT as o, modalWidthClassName as s } from "../../s
8
8
  import { modalTitleLgClassName as c } from "../../../utils/modal-classes.js";
9
9
  import { ModalCloseButton as l } from "../../shared/modals/modal-close-button.js";
10
10
  import { BrandButton as u } from "../settings/brand-button.js";
11
- import { ConfirmationModal as d } from "../../shared/modals/confirmation-modal.js";
12
- import { useBackendsHealth as f } from "../../../hooks/query/use-backends-health.js";
13
- import { BackendFormModal as p } from "./backend-form-modal.js";
14
- import { BackendRow as m } from "./backend-row.js";
15
- import h from "react";
16
- import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
11
+ import { useAllCloudOrganizations as d } from "../../../hooks/query/use-cloud-organizations.js";
12
+ import { useCloudCurrentUserId as f } from "../../../hooks/query/use-cloud-current-user-id.js";
13
+ import { ConfirmationModal as p } from "../../shared/modals/confirmation-modal.js";
14
+ import { useBackendsHealth as m } from "../../../hooks/query/use-backends-health.js";
15
+ import { BackendFormModal as h } from "./backend-form-modal.js";
16
+ import { BackendRow as g } from "./backend-row.js";
17
+ import _ from "react";
18
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
17
19
  //#region src/components/features/backends/manage-backends-modal.tsx
18
- function y({ onClose: y, recoveryMode: b = !1 }) {
19
- let { t: x } = e("openhands"), { backends: S, active: C, removeBackend: w, setActive: T, updateBackend: E } = i(), D = f(S, { probeDisabledOnce: !0 }), [O, k] = h.useState(null), [A, j] = h.useState(null), [M, N] = h.useState(!1), P = () => {
20
- O && (w(O.id), k(null));
21
- }, F = h.useCallback((e) => {
22
- (C.backend.id !== e.id || C.orgId !== null) && T(e.id), y();
20
+ function x(e, t, n, r) {
21
+ if (e.kind !== "cloud") return;
22
+ let i = t[e.id];
23
+ if (!i || i.orgs.length === 0) return;
24
+ let a = n[e.id]?.userId ?? null;
25
+ return i.orgs.map((e) => a && a === e.id ? r : e.name).join(", ");
26
+ }
27
+ function S({ onClose: S, recoveryMode: C = !1 }) {
28
+ let { t: w } = e("openhands"), { backends: T, active: E, removeBackend: D, setActive: O, updateBackend: k } = i(), A = m(T, { probeDisabledOnce: !0 }), j = d(), M = f(), N = w(t.BACKEND$PERSONAL_WORKSPACE), [P, F] = _.useState(null), [I, L] = _.useState(null), [R, z] = _.useState(!1), B = () => {
29
+ P && (D(P.id), F(null));
30
+ }, V = _.useCallback((e) => {
31
+ (E.backend.id !== e.id || E.orgId !== null) && O(e.id), S();
23
32
  }, [
24
- C.backend.id,
25
- C.orgId,
26
- y,
27
- T
28
- ]), I = h.useCallback((e, t) => {
29
- E(e.id, { apiKey: t });
30
- }, [E]);
31
- return /* @__PURE__ */ v(g, { children: [
32
- /* @__PURE__ */ _(a, {
33
- onClose: b ? void 0 : y,
34
- closeOnEscape: !b,
35
- closeOnBackdropClick: !b,
36
- "aria-label": x(t.BACKEND$MANAGE_TITLE),
37
- children: /* @__PURE__ */ v("div", {
33
+ E.backend.id,
34
+ E.orgId,
35
+ S,
36
+ O
37
+ ]), H = _.useCallback((e, t) => {
38
+ k(e.id, { apiKey: t });
39
+ }, [k]);
40
+ return /* @__PURE__ */ b(v, { children: [
41
+ /* @__PURE__ */ y(a, {
42
+ onClose: C ? void 0 : S,
43
+ closeOnEscape: !C,
44
+ closeOnBackdropClick: !C,
45
+ "aria-label": w(t.BACKEND$MANAGE_TITLE),
46
+ children: /* @__PURE__ */ b("div", {
38
47
  "data-testid": "manage-backends-modal",
39
48
  className: r("relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl", s("lg"), o, "max-h-[70vh]"),
40
49
  children: [
41
- b ? null : /* @__PURE__ */ _(l, {
42
- onClose: y,
50
+ C ? null : /* @__PURE__ */ y(l, {
51
+ onClose: S,
43
52
  testId: "close-manage-backends-modal"
44
53
  }),
45
- /* @__PURE__ */ _("div", {
46
- className: r("p-5", !b && "pr-12"),
47
- children: /* @__PURE__ */ _("h2", {
54
+ /* @__PURE__ */ y("div", {
55
+ className: r("p-5", !C && "pr-12"),
56
+ children: /* @__PURE__ */ y("h2", {
48
57
  className: c,
49
- children: x(t.BACKEND$MANAGE_TITLE)
58
+ children: w(t.BACKEND$MANAGE_TITLE)
50
59
  })
51
60
  }),
52
- /* @__PURE__ */ _("div", {
61
+ /* @__PURE__ */ y("div", {
53
62
  className: "flex min-h-0 flex-1 flex-col px-5",
54
- children: /* @__PURE__ */ _("div", {
63
+ children: /* @__PURE__ */ y("div", {
55
64
  className: "flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always",
56
65
  "data-testid": "manage-backends-list",
57
- children: S.length === 0 ? /* @__PURE__ */ _("p", {
66
+ children: T.length === 0 ? /* @__PURE__ */ y("p", {
58
67
  className: "px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]",
59
- children: x(t.BACKEND$MANAGE_EMPTY)
60
- }) : /* @__PURE__ */ _("ul", {
68
+ children: w(t.BACKEND$MANAGE_EMPTY)
69
+ }) : /* @__PURE__ */ y("ul", {
61
70
  className: "divide-y divide-[var(--oh-border)]",
62
- children: S.map((e) => /* @__PURE__ */ _(m, {
71
+ children: T.map((e) => /* @__PURE__ */ y(g, {
63
72
  backend: e,
64
- health: D[e.id],
65
- onSelect: () => F(e),
66
- onEdit: () => j(e),
67
- onRemove: () => k({
73
+ health: A[e.id],
74
+ orgLabel: x(e, j, M, N),
75
+ onSelect: () => V(e),
76
+ onEdit: () => L(e),
77
+ onRemove: () => F({
68
78
  id: e.id,
69
79
  name: e.name
70
80
  }),
71
- onLogin: (t) => I(e, t)
81
+ onLogin: (t) => H(e, t)
72
82
  }, e.id))
73
83
  })
74
84
  })
75
85
  }),
76
- /* @__PURE__ */ v("div", {
86
+ /* @__PURE__ */ b("div", {
77
87
  className: "flex justify-end gap-2 p-5",
78
- children: [/* @__PURE__ */ _(u, {
88
+ children: [/* @__PURE__ */ y(u, {
79
89
  type: "button",
80
- variant: b ? "primary" : "secondary",
81
- onClick: () => N(!0),
90
+ variant: C ? "primary" : "secondary",
91
+ onClick: () => z(!0),
82
92
  testId: "manage-backends-add",
83
- startContent: /* @__PURE__ */ _(n, {
93
+ startContent: /* @__PURE__ */ y(n, {
84
94
  width: 14,
85
95
  height: 14
86
96
  }),
87
- children: x(t.BACKEND$ADD)
88
- }), b ? null : /* @__PURE__ */ _(u, {
97
+ children: w(t.BACKEND$ADD)
98
+ }), C ? null : /* @__PURE__ */ y(u, {
89
99
  type: "button",
90
100
  variant: "primary",
91
- onClick: y,
101
+ onClick: S,
92
102
  testId: "manage-backends-done",
93
- children: x(t.HOME$DONE)
103
+ children: w(t.HOME$DONE)
94
104
  })]
95
105
  })
96
106
  ]
97
107
  })
98
108
  }),
99
- M ? /* @__PURE__ */ _(p, {
109
+ R ? /* @__PURE__ */ y(h, {
100
110
  mode: "add",
101
- onClose: () => N(!1)
111
+ source: "manage_backends_modal",
112
+ onClose: () => z(!1)
102
113
  }) : null,
103
- A ? /* @__PURE__ */ _(p, {
114
+ I ? /* @__PURE__ */ y(h, {
104
115
  mode: "edit",
105
- backend: A,
106
- onClose: () => j(null)
116
+ backend: I,
117
+ onClose: () => L(null)
107
118
  }) : null,
108
- O ? /* @__PURE__ */ _(d, {
109
- text: x(t.BACKEND$REMOVE_CONFIRMATION, { name: O.name }),
110
- onConfirm: P,
111
- onCancel: () => k(null)
119
+ P ? /* @__PURE__ */ y(p, {
120
+ text: w(t.BACKEND$REMOVE_CONFIRMATION, { name: P.name }),
121
+ onConfirm: B,
122
+ onCancel: () => F(null)
112
123
  }) : null
113
124
  ] });
114
125
  }
115
126
  //#endregion
116
- export { y as ManageBackendsModal };
127
+ export { S as ManageBackendsModal };
117
128
 
118
129
  //# sourceMappingURL=manage-backends-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manage-backends-modal.js","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Plus } from \"lucide-react\";\n\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { modalTitleLgClassName } from \"#/utils/modal-classes\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendRow } from \"./backend-row\";\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n /**\n * Recovery mode is used by the root unavailable-backend gate. There is no\n * app shell behind the modal, so dismiss controls would be misleading.\n */\n recoveryMode?: boolean;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\nexport function ManageBackendsModal({\n onClose,\n recoveryMode = false,\n}: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, removeBackend, setActive, updateBackend } =\n useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n const handleSelectBackend = React.useCallback(\n (backend: Backend) => {\n if (active.backend.id !== backend.id || active.orgId !== null) {\n setActive(backend.id);\n }\n onClose();\n },\n [active.backend.id, active.orgId, onClose, setActive],\n );\n\n const handleCloudLogin = React.useCallback(\n (backend: Backend, apiKey: string) => {\n updateBackend(backend.id, { apiKey });\n },\n [updateBackend],\n );\n\n return (\n <>\n <ModalBackdrop\n onClose={recoveryMode ? undefined : onClose}\n closeOnEscape={!recoveryMode}\n closeOnBackdropClick={!recoveryMode}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n {recoveryMode ? null : (\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n )}\n <div className={cn(\"p-5\", !recoveryMode && \"pr-12\")}>\n <h2 className={modalTitleLgClassName}>\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n onSelect={() => handleSelectBackend(backend)}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n onLogin={(apiKey) => handleCloudLogin(backend, apiKey)}\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant={recoveryMode ? \"primary\" : \"secondary\"}\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n {recoveryMode ? null : (\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n )}\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal mode=\"add\" onClose={() => setShowAddForm(false)} />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmCA,SAAgB,EAAoB,EAClC,YACA,kBAAe,MACY;CAC3B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,aAAU,WAAQ,kBAAe,cAAW,qBAClD,GAAyB,EACrB,IAAoB,EAAkB,GAAU,EACpD,mBAAmB,IACpB,CAAC,EACI,CAAC,GAAgB,KACrB,EAAM,SAAgC,KAAK,EACvC,CAAC,GAAgB,KAAqB,EAAM,SAChD,KACD,EACK,CAAC,GAAa,KAAkB,EAAM,SAAS,GAAM,EAErD,UAA6B;AAC5B,QACL,EAAc,EAAe,GAAG,EAChC,EAAkB,KAAK;IAGnB,IAAsB,EAAM,aAC/B,MAAqB;AAIpB,GAHI,EAAO,QAAQ,OAAO,EAAQ,MAAM,EAAO,UAAU,SACvD,EAAU,EAAQ,GAAG,EAEvB,GAAS;IAEX;EAAC,EAAO,QAAQ;EAAI,EAAO;EAAO;EAAS;EAAU,CACtD,EAEK,IAAmB,EAAM,aAC5B,GAAkB,MAAmB;AACpC,IAAc,EAAQ,IAAI,EAAE,WAAQ,CAAC;IAEvC,CAAC,EAAc,CAChB;AAED,QACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAS,IAAe,KAAA,IAAY;GACpC,eAAe,CAAC;GAChB,sBAAsB,CAAC;GACvB,cAAY,EAAE,EAAQ,qBAAqB;aAE3C,kBAAC,OAAD;IACE,eAAY;IACZ,WAAW,EACT,6FACA,EAAoB,KAAK,EACzB,GACA,eACD;cAPH;KASG,IAAe,OACd,kBAAC,GAAD;MACW;MACT,QAAO;MACP,CAAA;KAEJ,kBAAC,OAAD;MAAK,WAAW,EAAG,OAAO,CAAC,KAAgB,QAAQ;gBACjD,kBAAC,MAAD;OAAI,WAAW;iBACZ,EAAE,EAAQ,qBAAqB;OAC7B,CAAA;MACD,CAAA;KAEN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OACE,WAAU;OACV,eAAY;iBAEX,EAAS,WAAW,IACnB,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAE,EAAQ,qBAAqB;QAC9B,CAAA,GAEJ,kBAAC,MAAD;QAAI,WAAU;kBACX,EAAS,KAAK,MACb,kBAAC,GAAD;SAEW;SACT,QAAQ,EAAkB,EAAQ;SAClC,gBAAgB,EAAoB,EAAQ;SAC5C,cAAc,EAAkB,EAAQ;SACxC,gBACE,EAAkB;UAChB,IAAI,EAAQ;UACZ,MAAM,EAAQ;UACf,CAAC;SAEJ,UAAU,MAAW,EAAiB,GAAS,EAAO;SACtD,EAZK,EAAQ,GAYb,CACF;QACC,CAAA;OAEH,CAAA;MACF,CAAA;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAK;OACL,SAAS,IAAe,YAAY;OACpC,eAAe,EAAe,GAAK;OACnC,QAAO;OACP,cAAc,kBAAC,GAAD;QAAM,OAAO;QAAI,QAAQ;QAAM,CAAA;iBAE5C,EAAE,EAAQ,YAAY;OACX,CAAA,EACb,IAAe,OACd,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,SAAS;OACT,QAAO;iBAEN,EAAE,EAAQ,UAAU;OACT,CAAA,CAEZ;;KACF;;GACQ,CAAA;EAEf,IACC,kBAAC,GAAD;GAAkB,MAAK;GAAM,eAAe,EAAe,GAAM;GAAI,CAAA,GACnE;EAEH,IACC,kBAAC,GAAD;GACE,MAAK;GACL,SAAS;GACT,eAAe,EAAkB,KAAK;GACtC,CAAA,GACA;EAEH,IACC,kBAAC,GAAD;GACE,MAAM,EAAE,EAAQ,6BAA6B,EAC3C,MAAM,EAAe,MACtB,CAAC;GACF,WAAW;GACX,gBAAgB,EAAkB,KAAK;GACvC,CAAA,GACA;EACH,EAAA,CAAA"}
1
+ {"version":3,"file":"manage-backends-modal.js","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Plus } from \"lucide-react\";\n\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\nimport { useAllCloudOrganizations } from \"#/hooks/query/use-cloud-organizations\";\nimport { useCloudCurrentUserId } from \"#/hooks/query/use-cloud-current-user-id\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { modalTitleLgClassName } from \"#/utils/modal-classes\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendRow } from \"./backend-row\";\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n /**\n * Recovery mode is used by the root unavailable-backend gate. There is no\n * app shell behind the modal, so dismiss controls would be misleading.\n */\n recoveryMode?: boolean;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\n/**\n * Resolve the connected organization label for a backend row, mirroring the\n * per-org labelling used by the backend selector. Cloud API keys are bound to\n * a single org (legacy keys may expose several, joined here); local backends\n * and unresolved/errored lookups yield no label.\n */\nfunction resolveBackendOrgLabel(\n backend: Backend,\n cloudOrgs: ReturnType<typeof useAllCloudOrganizations>,\n currentUserIds: ReturnType<typeof useCloudCurrentUserId>,\n personalWorkspaceLabel: string,\n): string | undefined {\n if (backend.kind !== \"cloud\") return undefined;\n const entry = cloudOrgs[backend.id];\n if (!entry || entry.orgs.length === 0) return undefined;\n const userId = currentUserIds[backend.id]?.userId ?? null;\n return entry.orgs\n .map((org) =>\n !!userId && userId === org.id ? personalWorkspaceLabel : org.name,\n )\n .join(\", \");\n}\n\nexport function ManageBackendsModal({\n onClose,\n recoveryMode = false,\n}: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, active, removeBackend, setActive, updateBackend } =\n useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const cloudOrgs = useAllCloudOrganizations();\n const currentUserIds = useCloudCurrentUserId();\n const personalWorkspaceLabel = t(I18nKey.BACKEND$PERSONAL_WORKSPACE);\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n const handleSelectBackend = React.useCallback(\n (backend: Backend) => {\n if (active.backend.id !== backend.id || active.orgId !== null) {\n setActive(backend.id);\n }\n onClose();\n },\n [active.backend.id, active.orgId, onClose, setActive],\n );\n\n const handleCloudLogin = React.useCallback(\n (backend: Backend, apiKey: string) => {\n updateBackend(backend.id, { apiKey });\n },\n [updateBackend],\n );\n\n return (\n <>\n <ModalBackdrop\n onClose={recoveryMode ? undefined : onClose}\n closeOnEscape={!recoveryMode}\n closeOnBackdropClick={!recoveryMode}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n {recoveryMode ? null : (\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n )}\n <div className={cn(\"p-5\", !recoveryMode && \"pr-12\")}>\n <h2 className={modalTitleLgClassName}>\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n orgLabel={resolveBackendOrgLabel(\n backend,\n cloudOrgs,\n currentUserIds,\n personalWorkspaceLabel,\n )}\n onSelect={() => handleSelectBackend(backend)}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n onLogin={(apiKey) => handleCloudLogin(backend, apiKey)}\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant={recoveryMode ? \"primary\" : \"secondary\"}\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n {recoveryMode ? null : (\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n )}\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal\n mode=\"add\"\n source=\"manage_backends_modal\"\n onClose={() => setShowAddForm(false)}\n />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../types/agent-state.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../hooks/use-conversation-id.cjs`),o=require(`../../../stores/conversation-store.cjs`),s=require(`../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),c=require(`../../../hooks/query/use-active-conversation.cjs`),l=require(`../../../hooks/use-agent-state.cjs`),u=require(`../../shared/buttons/styled-tooltip.cjs`),d=require(`../../../hooks/use-unified-websocket-status.cjs`),f=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),p=require(`../../../ui/typography.cjs`),m=require(`../../../utils/form-control-classes.cjs`),h=require(`../../../ui/combobox-caret.cjs`),g=require(`../../../icons/lesson-plan.cjs`),_=require(`../../../icons/code-pill.cjs`),v=require(`./change-agent-context-menu.cjs`),y=require(`../../../hooks/use-handle-plan-click.cjs`);let b=require(`react`);b=e.__toESM(b,1);let x=require(`react/jsx-runtime`);function S(){let[e,S]=(0,b.useState)(!1),{conversationMode:C,setConversationMode:w,subConversationTaskId:T}=o.useConversationStore(),{conversationId:E}=a.useOptionalConversationId(),D=!E,O=d.useUnifiedWebSocketStatus()===`OPEN`,{curAgentState:k}=l.useAgentState(),{t:A}=t.useTranslation(`openhands`),j=k===r.AgentState.RUNNING,{data:M}=c.useActiveConversation(),N=s.useQueryClient(),P=(0,b.useRef)(null),{taskStatus:F,subConversationId:I}=f.useSubConversationTaskPolling(T,M?.id||null);(0,b.useEffect)(()=>{F===`READY`&&I&&M?.id&&T&&P.current!==T&&(P.current=T,N.invalidateQueries({queryKey:[`user`,`conversation`,M.id]}))},[F,I,M?.id,T,N]);let{handlePlanClick:L,isCreatingConversation:R}=y.useHandlePlanClick();(0,b.useEffect)(()=>{(j||!O)&&e&&S(!1)},[j,e,O]);let z=D||j||R||!O;(0,b.useEffect)(()=>{if(z)return;let e=e=>{if(e.shiftKey&&e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=C===`code`?`plan`:`code`;t===`plan`?L(e):w(t)}};return document.addEventListener(`keydown`,e),()=>{document.removeEventListener(`keydown`,e)}},[z,C,w,L]);let B=t=>{t.preventDefault(),t.stopPropagation(),S(!e)},V=e=>{e.preventDefault(),e.stopPropagation(),w(`code`)},H=C===`code`,U=(0,b.useMemo)(()=>A(H?n.I18nKey.COMMON$CODE:n.I18nKey.COMMON$PLAN),[H,A]),W=(0,b.useMemo)(()=>H?(0,x.jsx)(_.CodePillIcon,{className:`h-[11px] w-[11px] shrink-0`}):(0,x.jsx)(g.default,{width:18,height:18,color:`currentColor`}),[H]),G=(0,x.jsxs)(`div`,{className:`relative`,children:[(0,x.jsxs)(`button`,{type:`button`,onClick:B,disabled:z,className:i.cn(`flex items-center rounded-[100px]`,m.formControlTransitionClassName,H?`border border-transparent text-[var(--oh-muted)]`:`border border-[#597FF4] bg-[#4A67BD]`,!z&&H&&i.cn(`cursor-pointer`,`hover:text-white hover:bg-white/10`),!z&&!H&&`cursor-pointer text-white hover:bg-[#597FF4]`,z&&i.cn(`opacity-50 cursor-not-allowed`,H&&`border-transparent`)),children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-1 pl-1.5`,children:[W,(0,x.jsx)(p.Typography.Text,{className:`text-2.75 not-italic font-normal leading-5`,children:U})]}),(0,x.jsx)(h.ComboboxCaretInline,{isOpen:e})]}),e&&(0,x.jsx)(v.ChangeAgentContextMenu,{activeMode:C,onClose:()=>S(!1),onCodeClick:V,onPlanClick:L})]});return D?(0,x.jsx)(u.StyledTooltip,{content:A(n.I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),placement:`top`,children:G}):G}exports.ChangeAgentButton=S;
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../types/agent-state.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../hooks/use-conversation-id.cjs`),o=require(`../../../stores/conversation-store.cjs`),s=require(`../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),c=require(`../../../hooks/query/use-active-conversation.cjs`),l=require(`../../../hooks/use-agent-state.cjs`),u=require(`../../../utils/form-control-classes.cjs`),d=require(`../../shared/buttons/styled-tooltip.cjs`),f=require(`../../../hooks/use-unified-websocket-status.cjs`),p=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),m=require(`../../../ui/typography.cjs`),h=require(`../../../ui/combobox-caret.cjs`),g=require(`../../../icons/lesson-plan.cjs`),_=require(`../../../icons/code-pill.cjs`),v=require(`./change-agent-context-menu.cjs`),y=require(`../../../hooks/use-handle-plan-click.cjs`);let b=require(`react`);b=e.__toESM(b,1);let x=require(`react/jsx-runtime`);function S(){let[e,S]=(0,b.useState)(!1),{conversationMode:C,setConversationMode:w,subConversationTaskId:T}=o.useConversationStore(),{conversationId:E}=a.useOptionalConversationId(),D=!E,O=f.useUnifiedWebSocketStatus()===`OPEN`,{curAgentState:k}=l.useAgentState(),{t:A}=t.useTranslation(`openhands`),j=k===r.AgentState.RUNNING,{data:M}=c.useActiveConversation(),N=s.useQueryClient(),P=(0,b.useRef)(null),{taskStatus:F,subConversationId:I}=p.useSubConversationTaskPolling(T,M?.id||null);(0,b.useEffect)(()=>{F===`READY`&&I&&M?.id&&T&&P.current!==T&&(P.current=T,N.invalidateQueries({queryKey:[`user`,`conversation`,M.id]}))},[F,I,M?.id,T,N]);let{handlePlanClick:L,isCreatingConversation:R}=y.useHandlePlanClick();(0,b.useEffect)(()=>{(j||!O)&&e&&S(!1)},[j,e,O]);let z=D||j||R||!O;(0,b.useEffect)(()=>{if(z)return;let e=e=>{if(e.shiftKey&&e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=C===`code`?`plan`:`code`;t===`plan`?L(e):w(t)}};return document.addEventListener(`keydown`,e),()=>{document.removeEventListener(`keydown`,e)}},[z,C,w,L]);let B=t=>{t.preventDefault(),t.stopPropagation(),S(!e)},V=e=>{e.preventDefault(),e.stopPropagation(),w(`code`)},H=C===`code`,U=(0,b.useMemo)(()=>A(H?n.I18nKey.COMMON$CODE:n.I18nKey.COMMON$PLAN),[H,A]),W=(0,b.useMemo)(()=>H?(0,x.jsx)(_.CodePillIcon,{className:`h-[11px] w-[11px] shrink-0`}):(0,x.jsx)(g.default,{width:18,height:18,color:`currentColor`}),[H]),G=(0,x.jsxs)(`div`,{className:`relative`,children:[(0,x.jsxs)(`button`,{type:`button`,onClick:B,disabled:z,className:i.cn(`flex items-center rounded-[100px]`,u.formControlTransitionClassName,H?`border border-transparent text-[var(--oh-muted)]`:`border border-[#597FF4] bg-[#4A67BD]`,!z&&H&&i.cn(`cursor-pointer`,`hover:text-white hover:bg-white/10`),!z&&!H&&`cursor-pointer text-white hover:bg-[#597FF4]`,z&&i.cn(`opacity-50 cursor-not-allowed`,H&&`border-transparent`)),children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-1 pl-1.5`,children:[W,(0,x.jsx)(m.Typography.Text,{className:`text-2.75 not-italic font-normal leading-5`,children:U})]}),(0,x.jsx)(h.ComboboxCaretInline,{isOpen:e})]}),e&&(0,x.jsx)(v.ChangeAgentContextMenu,{activeMode:C,onClose:()=>S(!1),onCodeClick:V,onPlanClick:L})]});return D?(0,x.jsx)(d.StyledTooltip,{content:A(n.I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),placement:`top`,children:G}):G}exports.ChangeAgentButton=S;
2
2
  //# sourceMappingURL=change-agent-button.cjs.map
@@ -7,11 +7,11 @@ import { useConversationStore as a } from "../../../stores/conversation-store.js
7
7
  import { useQueryClient as o } from "../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
8
8
  import { useActiveConversation as s } from "../../../hooks/query/use-active-conversation.js";
9
9
  import { useAgentState as c } from "../../../hooks/use-agent-state.js";
10
- import { StyledTooltip as l } from "../../shared/buttons/styled-tooltip.js";
11
- import { useUnifiedWebSocketStatus as u } from "../../../hooks/use-unified-websocket-status.js";
12
- import { useSubConversationTaskPolling as d } from "../../../hooks/query/use-sub-conversation-task-polling.js";
13
- import { Typography as f } from "../../../ui/typography.js";
14
- import { formControlTransitionClassName as p } from "../../../utils/form-control-classes.js";
10
+ import { formControlTransitionClassName as l } from "../../../utils/form-control-classes.js";
11
+ import { StyledTooltip as u } from "../../shared/buttons/styled-tooltip.js";
12
+ import { useUnifiedWebSocketStatus as d } from "../../../hooks/use-unified-websocket-status.js";
13
+ import { useSubConversationTaskPolling as f } from "../../../hooks/query/use-sub-conversation-task-polling.js";
14
+ import { Typography as p } from "../../../ui/typography.js";
15
15
  import { ComboboxCaretInline as m } from "../../../ui/combobox-caret.js";
16
16
  import h from "../../../icons/lesson-plan.js";
17
17
  import { CodePillIcon as g } from "../../../icons/code-pill.js";
@@ -21,7 +21,7 @@ import { useEffect as y, useMemo as b, useRef as x, useState as S } from "react"
21
21
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
22
22
  //#region src/components/features/chat/change-agent-button.tsx
23
23
  function T() {
24
- let [T, E] = S(!1), { conversationMode: D, setConversationMode: O, subConversationTaskId: k } = a(), { conversationId: A } = i(), j = !A, M = u() === "OPEN", { curAgentState: N } = c(), { t: P } = e("openhands"), F = N === n.RUNNING, { data: I } = s(), L = o(), R = x(null), { taskStatus: z, subConversationId: B } = d(k, I?.id || null);
24
+ let [T, E] = S(!1), { conversationMode: D, setConversationMode: O, subConversationTaskId: k } = a(), { conversationId: A } = i(), j = !A, M = d() === "OPEN", { curAgentState: N } = c(), { t: P } = e("openhands"), F = N === n.RUNNING, { data: I } = s(), L = o(), R = x(null), { taskStatus: z, subConversationId: B } = f(k, I?.id || null);
25
25
  y(() => {
26
26
  z === "READY" && B && I?.id && k && R.current !== k && (R.current = k, L.invalidateQueries({ queryKey: [
27
27
  "user",
@@ -76,10 +76,10 @@ function T() {
76
76
  type: "button",
77
77
  onClick: W,
78
78
  disabled: U,
79
- className: r("flex items-center rounded-[100px]", p, K ? "border border-transparent text-[var(--oh-muted)]" : "border border-[#597FF4] bg-[#4A67BD]", !U && K && r("cursor-pointer", "hover:text-white hover:bg-white/10"), !U && !K && "cursor-pointer text-white hover:bg-[#597FF4]", U && r("opacity-50 cursor-not-allowed", K && "border-transparent")),
79
+ className: r("flex items-center rounded-[100px]", l, K ? "border border-transparent text-[var(--oh-muted)]" : "border border-[#597FF4] bg-[#4A67BD]", !U && K && r("cursor-pointer", "hover:text-white hover:bg-white/10"), !U && !K && "cursor-pointer text-white hover:bg-[#597FF4]", U && r("opacity-50 cursor-not-allowed", K && "border-transparent")),
80
80
  children: [/* @__PURE__ */ w("div", {
81
81
  className: "flex items-center gap-1 pl-1.5",
82
- children: [J, /* @__PURE__ */ C(f.Text, {
82
+ children: [J, /* @__PURE__ */ C(p.Text, {
83
83
  className: "text-2.75 not-italic font-normal leading-5",
84
84
  children: q
85
85
  })]
@@ -91,7 +91,7 @@ function T() {
91
91
  onPlanClick: V
92
92
  })]
93
93
  });
94
- return j ? /* @__PURE__ */ C(l, {
94
+ return j ? /* @__PURE__ */ C(u, {
95
95
  content: P(t.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),
96
96
  placement: "top",
97
97
  children: Y