@openhands/agent-canvas 1.17.0 → 1.18.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 (507) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DrjNsPOH.js → acp-providers-DcY_mKYa.js} +1 -1
  4. package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
  5. package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D3peZkjX.js} +1 -1
  6. package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-DkeZaqIl.js} +1 -1
  7. package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
  8. package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
  9. package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
  10. package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
  11. package/build/assets/{agent-settings-CpY3zObk.js → agent-settings-BF8hM6wb.js} +1 -1
  12. package/build/assets/agent-settings-YPutBAeR.js +1 -0
  13. package/build/assets/alert-banner-eYyqvHL3.js +1 -0
  14. package/build/assets/{api-error-message-Ve79qDcN.js → api-error-message-BXo0lCI5.js} +1 -1
  15. package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
  16. package/build/assets/app-settings-BtYDs-Be.js +1 -0
  17. package/build/assets/automation-detail-BxXhb_m2.js +3 -0
  18. package/build/assets/{automation-export-DxY47m3T.js → automation-export-BJsfi7n2.js} +1 -1
  19. package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
  20. package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
  21. package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Bb98r-kx.js} +1 -1
  22. package/build/assets/automations-list-DEPVNud3.js +1 -0
  23. package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-B2yBiVMB.js} +1 -1
  24. package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
  25. package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
  26. package/build/assets/badge-ehL-kgeO.js +1 -0
  27. package/build/assets/{base-modal-DTULovNc.js → base-modal-C1a0TsSx.js} +1 -1
  28. package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
  29. package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-CUMfjb99.js} +1 -1
  30. package/build/assets/{browser-C-_qBasq.js → browser-SE24Tk8g.js} +6 -6
  31. package/build/assets/browser-tab-HjJxHA0V.js +1 -0
  32. package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
  33. package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
  34. package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
  35. package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-CGvc2wpE.js} +1 -1
  36. package/build/assets/check-Bo8s5Ylg.js +1 -0
  37. package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
  38. package/build/assets/chevron-right-CfdfRn-8.js +1 -0
  39. package/build/assets/circle-check-5pH3qCji.js +1 -0
  40. package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
  41. package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
  42. package/build/assets/{cog-VBlRo6iw.js → cog-CAEugqtV.js} +1 -1
  43. package/build/assets/command-menu-CQxs4mtX.js +1 -0
  44. package/build/assets/commits-tab-D0xgjipP.js +1 -0
  45. package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-D63NJRBT.js} +1 -1
  46. package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
  47. package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
  48. package/build/assets/{conversation-BnjJSFf5.js → conversation-B_nweu5p.js} +8 -8
  49. package/build/assets/conversation-edjzrv5w.js +1 -0
  50. package/build/assets/conversation-panel-edjzrv5w.js +1 -0
  51. package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
  52. package/build/assets/conversation-store-DC-JlJuq.js +6 -0
  53. package/build/assets/{conversation-tab-empty-state-DKlzAz5c.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
  54. package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
  55. package/build/assets/device-verify-D5QRIS_x.js +1 -0
  56. package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-BGvOvW2_.js} +1 -1
  57. package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
  58. package/build/assets/empty-state-FK_s1B60.js +1 -0
  59. package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-BMafTpjO.js} +2 -2
  60. package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
  61. package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
  62. package/build/assets/error-state-Cf8LRuuY.js +1 -0
  63. package/build/assets/extensions-hub-C_6ahIua.js +1 -0
  64. package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
  65. package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
  66. package/build/assets/files-tab-D5PPIWI1.js +1 -0
  67. package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-Dbq-7YP_.js} +1 -1
  68. package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
  69. package/build/assets/get-git-path-jU2zjqIB.js +1 -0
  70. package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
  71. package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
  72. package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
  73. package/build/assets/home-BM5_Wz_R.js +1 -0
  74. package/build/assets/home-Ivfm7KC4.js +1 -0
  75. package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
  76. package/build/assets/home-store-DCbei3DX.js +1 -0
  77. package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
  78. package/build/assets/index-home-td9BN2T3.js +1 -0
  79. package/build/assets/info-BcajzHn1.js +1 -0
  80. package/build/assets/install-server-modal-B81I-5OE.js +1 -0
  81. package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
  82. package/build/assets/{key-CfXbJa8w.js → key-O84CMFHb.js} +1 -1
  83. package/build/assets/launch-ZLxI4opd.js +1 -0
  84. package/build/assets/list-filter-B8PQk3RA.js +1 -0
  85. package/build/assets/{list-todo-ByXMdY4W.js → list-todo-Caa8E1X_.js} +1 -1
  86. package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
  87. package/build/assets/llm-settings-CODhjQzy.js +1 -0
  88. package/build/assets/llm-settings-CZaXYgtw.js +1 -0
  89. package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-CgIDc38n.js} +1 -1
  90. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  91. package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-BeLV0IXf.js} +1 -1
  92. package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
  93. package/build/assets/manifest-bfeccb98.js +1 -0
  94. package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
  95. package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
  96. package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
  97. package/build/assets/mcp-CraxoXQv.js +1 -0
  98. package/build/assets/{mcp-marketplace-utils-Cn_NIMWM.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
  99. package/build/assets/mcp-page-CteH_K0N.js +9 -0
  100. package/build/assets/messages-Bk1xhbU2.js +41 -0
  101. package/build/assets/{modal-body-DJw4xBki.js → modal-body-C24WsdFb.js} +1 -1
  102. package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-B0b9eiL8.js} +1 -1
  103. package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
  104. package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
  105. package/build/assets/onboarding-DXFBRqEy.js +1 -0
  106. package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
  107. package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-B5CvmnYQ.js} +1 -1
  108. package/build/assets/{pencil-D5c47kyN.js → pencil-q-ihqDYv.js} +1 -1
  109. package/build/assets/{pin-C7vMagvf.js → pin-BdroVQdN.js} +1 -1
  110. package/build/assets/planner-tab-CstoOlAB.js +1 -0
  111. package/build/assets/{plug-CeaqeF6u.js → plug-7ACOEbMs.js} +1 -1
  112. package/build/assets/{plugins-management-service-Bh_pBuf-.js → plugins-management-service-5rqVPEGN.js} +1 -1
  113. package/build/assets/plus-C2e21TFC.js +1 -0
  114. package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-D1XKMgr0.js} +1 -1
  115. package/build/assets/providers-XmZ9HM4Q.js +1 -0
  116. package/build/assets/proxy-XP6U1Dhv.js +1 -0
  117. package/build/assets/{puzzle-DdAqbUrb.js → puzzle-LJYnuxKe.js} +1 -1
  118. package/build/assets/react-BX7IV650.js +1 -0
  119. package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
  120. package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
  121. package/build/assets/root-CM6IZHlg.css +1 -0
  122. package/build/assets/root-DdFkodKW.js +2 -0
  123. package/build/assets/root-layout-DUquNZTU.js +2 -0
  124. package/build/assets/schema-field-Y3F8JvXd.js +1 -0
  125. package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
  126. package/build/assets/secret-form-9-BoGA40.js +1 -0
  127. package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-BOIsfD9j.js} +1 -1
  128. package/build/assets/secrets-settings-CBJgFr42.js +1 -0
  129. package/build/assets/settings-D4hdToD4.js +1 -0
  130. package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
  131. package/build/assets/settings-index-DeQphyBK.js +1 -0
  132. package/build/assets/settings-input-dVuzapBA.js +1 -0
  133. package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-DhAPuXm6.js} +1 -1
  134. package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
  135. package/build/assets/settings-nav-GAQjW1a-.js +16 -0
  136. package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-C1vZH9Vh.js} +1 -1
  137. package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
  138. package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
  139. package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
  140. package/build/assets/{shield-check-DO7wa_eu.js → shield-check-C3Rl0NF8.js} +1 -1
  141. package/build/assets/{sidebar-layout-EPfWxk11.js → sidebar-layout-DH0E-5KW.js} +1 -1
  142. package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
  143. package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
  144. package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
  145. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  146. package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
  147. package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-DsNLmn76.js} +2 -2
  148. package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-0MK_68Nc.js} +1 -1
  149. package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
  150. package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
  151. package/build/assets/skills-settings-BiPOH9H9.js +1 -0
  152. package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-CejG0rqv.js} +1 -1
  153. package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
  154. package/build/assets/{terminal-onXx0_Qz.js → terminal-Dph60VFZ.js} +1 -1
  155. package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-B2uXaAUS.js} +1 -1
  156. package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
  157. package/build/assets/trash-Ckh7yCaB.js +1 -0
  158. package/build/assets/{triangle-alert-BajLPpQg.js → triangle-alert-DEdu-b_L.js} +1 -1
  159. package/build/assets/{typography-HLLg_FAn.js → typography-DgcLGdHk.js} +1 -1
  160. package/build/assets/usage-tab-MCmNRAnR.js +1 -0
  161. package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
  162. package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-8L8Xdghy.js} +1 -1
  163. package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
  164. package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-U99vvHxx.js} +1 -1
  165. package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-Buus0R6h.js} +1 -1
  166. package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-Bq5hVuv0.js} +1 -1
  167. package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
  168. package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-Ca9KoVEm.js} +1 -1
  169. package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
  170. package/build/assets/{use-config-DpafU_QP.js → use-config-l5tkDHyD.js} +1 -1
  171. package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-i_PdFdIs.js} +1 -1
  172. package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
  173. package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
  174. package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-CMTuWEp_.js} +1 -1
  175. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  176. package/build/assets/{use-launch-skill-in-chat-DeYa1tFM.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  177. package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
  178. package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
  179. package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-CdqYfUAC.js} +1 -1
  180. package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-Xl63ZvzQ.js} +1 -1
  181. package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-BXDIUaxQ.js} +1 -1
  182. package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-BIIaPiaB.js} +1 -1
  183. package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
  184. package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-Dapkf4cC.js} +1 -1
  185. package/build/assets/{use-settings-Dn00UISA.js → use-settings-C2KKQKVC.js} +1 -1
  186. package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
  187. package/build/assets/{use-tracking-B9prBsrq.js → use-tracking-j4uo9VEW.js} +1 -1
  188. package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-5UFqMoO4.js} +1 -1
  189. package/build/assets/{useInfiniteQuery-BzrRqjLg.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  190. package/build/assets/{useMutation-CJuK90oc.js → useMutation-Cszf8mKy.js} +1 -1
  191. package/build/assets/useQueries-pUohFMSP.js +1 -0
  192. package/build/assets/useQuery-DAAacS7O.js +1 -0
  193. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  194. package/build/assets/utils-BgLSZdyy.js +1 -0
  195. package/build/assets/{vendor~conversation-panel~conversation-4eJ0tml3.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  198. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  199. package/build/assets/{vendor~root-layout-n8XCEXG8.js → vendor~root-layout-CcdIqs-C.js} +1 -1
  200. package/build/assets/{vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  201. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  202. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  203. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +1 -1
  204. package/build/assets/{verification-settings-u2POabjH.js → verification-settings-DdBpaVPz.js} +1 -1
  205. package/build/assets/{wrench-CkgI4rxA.js → wrench-B8Wg_nbp.js} +1 -1
  206. package/build/assets/{x-By6qCmtY.js → x-CX8lVGwm.js} +1 -1
  207. package/build/index.html +4 -4
  208. package/build/locales/ar/openhands.json +6 -2
  209. package/build/locales/ca/openhands.json +6 -2
  210. package/build/locales/de/openhands.json +6 -2
  211. package/build/locales/en/openhands.json +6 -2
  212. package/build/locales/es/openhands.json +6 -2
  213. package/build/locales/fr/openhands.json +6 -2
  214. package/build/locales/it/openhands.json +6 -2
  215. package/build/locales/ja/openhands.json +6 -2
  216. package/build/locales/ko-KR/openhands.json +6 -2
  217. package/build/locales/no/openhands.json +6 -2
  218. package/build/locales/pt/openhands.json +6 -2
  219. package/build/locales/tr/openhands.json +6 -2
  220. package/build/locales/uk/openhands.json +6 -2
  221. package/build/locales/zh-CN/openhands.json +6 -2
  222. package/build/locales/zh-TW/openhands.json +6 -2
  223. package/config/defaults.json +1 -1
  224. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  225. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  226. package/dist/api/cloud/organization-service.api.js.map +1 -1
  227. package/dist/api/config-service/config-service.api.cjs +1 -1
  228. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  229. package/dist/api/config-service/config-service.api.js +6 -2
  230. package/dist/api/config-service/config-service.api.js.map +1 -1
  231. package/dist/api/config-service/config-service.types.d.ts +13 -0
  232. package/dist/components/features/automations/automation-card.cjs +1 -1
  233. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  234. package/dist/components/features/automations/automation-card.js +39 -38
  235. package/dist/components/features/automations/automation-card.js.map +1 -1
  236. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  237. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  238. package/dist/components/features/automations/automation-list-row.js +73 -72
  239. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  240. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  241. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  242. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  243. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  244. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  245. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  246. package/dist/components/features/automations/detail/detail-header.d.ts +8 -5
  247. package/dist/components/features/backends/backend-selector.cjs +1 -1
  248. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  249. package/dist/components/features/backends/backend-selector.js +112 -112
  250. package/dist/components/features/backends/backend-selector.js.map +1 -1
  251. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  252. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  253. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  254. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  255. package/dist/components/features/chat/model-messages.cjs +1 -1
  256. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  257. package/dist/components/features/chat/model-messages.js +27 -26
  258. package/dist/components/features/chat/model-messages.js.map +1 -1
  259. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  260. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  261. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  262. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  263. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  264. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  265. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  266. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  267. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  268. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  269. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  270. package/dist/components/features/images/image-lightbox.cjs +2 -0
  271. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  272. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  273. package/dist/components/features/images/image-lightbox.js +37 -0
  274. package/dist/components/features/images/image-lightbox.js.map +1 -0
  275. package/dist/components/features/images/image-preview.cjs +1 -1
  276. package/dist/components/features/images/image-preview.cjs.map +1 -1
  277. package/dist/components/features/images/image-preview.d.ts +2 -1
  278. package/dist/components/features/images/image-preview.js +33 -13
  279. package/dist/components/features/images/image-preview.js.map +1 -1
  280. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  281. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  282. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  283. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  284. package/dist/components/features/settings/cloud-settings-link.js +22 -21
  285. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  286. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  287. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  288. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  289. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  290. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  291. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  292. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +2 -1
  293. package/dist/components/features/sidebar/sidebar-rail-body.js +143 -142
  294. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  295. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  296. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  297. package/dist/components/features/sidebar/sidebar.js +28 -27
  298. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  299. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  300. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  301. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  302. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  303. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  304. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  305. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  306. package/dist/components/shared/buttons/remove-button.js +2 -1
  307. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  308. package/dist/components/shared/free-models-note.cjs +2 -0
  309. package/dist/components/shared/free-models-note.cjs.map +1 -0
  310. package/dist/components/shared/free-models-note.d.ts +3 -0
  311. package/dist/components/shared/free-models-note.js +20 -0
  312. package/dist/components/shared/free-models-note.js.map +1 -0
  313. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  314. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  315. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  316. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  317. package/dist/config/defaults.cjs +1 -1
  318. package/dist/config/defaults.cjs.map +1 -1
  319. package/dist/config/defaults.js +1 -1
  320. package/dist/config/defaults.js.map +1 -1
  321. package/dist/constants/acp-providers.cjs.map +1 -1
  322. package/dist/constants/acp-providers.d.ts +12 -0
  323. package/dist/constants/acp-providers.js.map +1 -1
  324. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  325. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  326. package/dist/hooks/chat/use-slash-command.js +63 -62
  327. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  328. package/dist/hooks/query/use-free-models.cjs +2 -0
  329. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  330. package/dist/hooks/query/use-free-models.d.ts +23 -0
  331. package/dist/hooks/query/use-free-models.js +67 -0
  332. package/dist/hooks/query/use-free-models.js.map +1 -0
  333. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  334. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  335. package/dist/hooks/query/use-provider-models.cjs +1 -1
  336. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  337. package/dist/hooks/query/use-provider-models.js +34 -25
  338. package/dist/hooks/query/use-provider-models.js.map +1 -1
  339. package/dist/hooks/query/use-search-providers.cjs +1 -1
  340. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  341. package/dist/hooks/query/use-search-providers.js +31 -19
  342. package/dist/hooks/query/use-search-providers.js.map +1 -1
  343. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  344. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  345. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  346. package/dist/hooks/use-home-automation-actions.js +0 -1
  347. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  348. package/dist/i18n/declaration.cjs +1 -1
  349. package/dist/i18n/declaration.cjs.map +1 -1
  350. package/dist/i18n/declaration.d.ts +6 -2
  351. package/dist/i18n/declaration.js +1 -1
  352. package/dist/i18n/declaration.js.map +1 -1
  353. package/dist/i18n/translation.cjs +2 -2
  354. package/dist/i18n/translation.cjs.map +1 -1
  355. package/dist/i18n/translation.js +85 -17
  356. package/dist/i18n/translation.js.map +1 -1
  357. package/dist/locales/ar/openhands.json +6 -2
  358. package/dist/locales/ca/openhands.json +6 -2
  359. package/dist/locales/de/openhands.json +6 -2
  360. package/dist/locales/en/openhands.json +6 -2
  361. package/dist/locales/es/openhands.json +6 -2
  362. package/dist/locales/fr/openhands.json +6 -2
  363. package/dist/locales/it/openhands.json +6 -2
  364. package/dist/locales/ja/openhands.json +6 -2
  365. package/dist/locales/ko-KR/openhands.json +6 -2
  366. package/dist/locales/no/openhands.json +6 -2
  367. package/dist/locales/pt/openhands.json +6 -2
  368. package/dist/locales/tr/openhands.json +6 -2
  369. package/dist/locales/uk/openhands.json +6 -2
  370. package/dist/locales/zh-CN/openhands.json +6 -2
  371. package/dist/locales/zh-TW/openhands.json +6 -2
  372. package/dist/package.cjs +1 -1
  373. package/dist/package.cjs.map +1 -1
  374. package/dist/package.js +1 -1
  375. package/dist/package.js.map +1 -1
  376. package/dist/routes/app-settings.cjs +1 -1
  377. package/dist/routes/app-settings.cjs.map +1 -1
  378. package/dist/routes/app-settings.js +52 -47
  379. package/dist/routes/app-settings.js.map +1 -1
  380. package/dist/routes/llm-settings.cjs +1 -1
  381. package/dist/routes/llm-settings.cjs.map +1 -1
  382. package/dist/routes/llm-settings.js +137 -145
  383. package/dist/routes/llm-settings.js.map +1 -1
  384. package/dist/stores/free-models-store.cjs +2 -0
  385. package/dist/stores/free-models-store.cjs.map +1 -0
  386. package/dist/stores/free-models-store.d.ts +30 -0
  387. package/dist/stores/free-models-store.js +22 -0
  388. package/dist/stores/free-models-store.js.map +1 -0
  389. package/dist/utils/format-model-name.cjs +1 -1
  390. package/dist/utils/format-model-name.cjs.map +1 -1
  391. package/dist/utils/format-model-name.d.ts +27 -6
  392. package/dist/utils/format-model-name.js +14 -6
  393. package/dist/utils/format-model-name.js.map +1 -1
  394. package/package.json +1 -1
  395. package/build/assets/active-backend-context-rZiLJRUc.js +0 -2
  396. package/build/assets/agent-profiles-settings-x6RvPsq7.js +0 -1
  397. package/build/assets/agent-server-client-options-BikiNwTa.js +0 -1
  398. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +0 -88
  399. package/build/assets/agent-settings-BJyovpJ_.js +0 -1
  400. package/build/assets/alert-banner-vARz1idS.js +0 -1
  401. package/build/assets/api-key-entry-screen-CsMuBhoP.js +0 -1
  402. package/build/assets/app-settings-BaJ7nfHt.js +0 -1
  403. package/build/assets/automation-detail-CVoGDrKq.js +0 -3
  404. package/build/assets/automation-git-sync-CRMP9Bbm.js +0 -1
  405. package/build/assets/automation-setup-route-072beLz1.js +0 -3
  406. package/build/assets/automations-list-xuqTSQL4.js +0 -1
  407. package/build/assets/backend-form-modal-0aJmWdsa.js +0 -1
  408. package/build/assets/backend-synced-settings-badge-B7rKWBir.js +0 -1
  409. package/build/assets/badge-CcGx2TaV.js +0 -1
  410. package/build/assets/browser-tab-DZanIw5m.js +0 -1
  411. package/build/assets/canvas-extension-page-o_cWgE9B.js +0 -1
  412. package/build/assets/canvas-extensions-DSgNlCha.js +0 -1
  413. package/build/assets/check-fDEfgSzj.js +0 -1
  414. package/build/assets/chevron-down-CFrWHqu8.js +0 -1
  415. package/build/assets/chevron-right-C5roOrJu.js +0 -1
  416. package/build/assets/circle-check-ClTzJTdb.js +0 -1
  417. package/build/assets/circle-plus-check-toggle-Fr-h-mbL.js +0 -1
  418. package/build/assets/command-menu-BT3Ia5Ru.js +0 -1
  419. package/build/assets/commits-tab-2jhtaohl.js +0 -1
  420. package/build/assets/confirmation-modal-gIFHeZt6.js +0 -1
  421. package/build/assets/conversation-DZ578rOX.js +0 -1
  422. package/build/assets/conversation-panel-DZ578rOX.js +0 -1
  423. package/build/assets/conversation-state-store-D1_G_9I-.js +0 -1
  424. package/build/assets/conversation-store-DVVfkCsk.js +0 -6
  425. package/build/assets/copy-to-clipboard-button-B3w0X7WH.js +0 -1
  426. package/build/assets/device-verify-BfkCzyFB.js +0 -1
  427. package/build/assets/edit-automation-modal-BwhJ39JT.js +0 -1
  428. package/build/assets/empty-state-RZz0OfnY.js +0 -1
  429. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +0 -1
  430. package/build/assets/environment-switch-overlay-P2ZAuzov.js +0 -1
  431. package/build/assets/error-state-B_5cgNPJ.js +0 -1
  432. package/build/assets/extensions-hub-DsaUr4ca.js +0 -1
  433. package/build/assets/extensions-navigation-CRMZd-FE.js +0 -1
  434. package/build/assets/files-tab-CCgAcVdc.js +0 -1
  435. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  436. package/build/assets/get-git-path-EHrSDxTM.js +0 -1
  437. package/build/assets/git-repo-dropdown-D2WEQ97X.js +0 -1
  438. package/build/assets/git-repo-dropdown-DVeCUUXG.js +0 -1
  439. package/build/assets/highlighted-source-view-DjHO3SdW.js +0 -1
  440. package/build/assets/home-BorS_vdS.js +0 -1
  441. package/build/assets/home-aIMbHw5M.js +0 -1
  442. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +0 -1
  443. package/build/assets/home-store-DyXz0w6d.js +0 -1
  444. package/build/assets/hooks-service-C6dpRtZM.js +0 -1
  445. package/build/assets/index-home-zKFuKK2B.js +0 -1
  446. package/build/assets/info-CTIdjttz.js +0 -1
  447. package/build/assets/install-server-modal-DUiZMc8u.js +0 -1
  448. package/build/assets/kebab-menu-item-content-mm04SBD3.js +0 -1
  449. package/build/assets/launch-BSIf9KEg.js +0 -1
  450. package/build/assets/list-filter-CNpqTWVY.js +0 -1
  451. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +0 -27
  452. package/build/assets/llm-settings-B-5AHMiX.js +0 -1
  453. package/build/assets/llm-settings-B3SjHDmA.js +0 -1
  454. package/build/assets/loader-circle-Dex47vVW.js +0 -1
  455. package/build/assets/manage-backends-modal-q1NdFisr.js +0 -1
  456. package/build/assets/manifest-8920b615.js +0 -1
  457. package/build/assets/manifest-subpage-layout-BQQy5ipR.js +0 -1
  458. package/build/assets/markdown-renderer-rivLvYh-.js +0 -8
  459. package/build/assets/mcp-CEXDhQWn.js +0 -1
  460. package/build/assets/mcp-page-LGYIICMG.js +0 -9
  461. package/build/assets/messages-DUSeANAh.js +0 -41
  462. package/build/assets/modal-close-button-B9j4nasm.js +0 -1
  463. package/build/assets/onboarding-BjFebfs5.js +0 -1
  464. package/build/assets/onboarding-modal-DDTjOpyd.js +0 -1
  465. package/build/assets/planner-tab-D8f2Y3rn.js +0 -1
  466. package/build/assets/plus-B3wvU06-.js +0 -1
  467. package/build/assets/providers-2gIIkz2N.js +0 -1
  468. package/build/assets/proxy-CBgMd2zf.js +0 -1
  469. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +0 -1
  470. package/build/assets/root-Bye_XmEL.js +0 -2
  471. package/build/assets/root-Cnwwzgo0.css +0 -1
  472. package/build/assets/root-layout-CSAwxBGM.js +0 -2
  473. package/build/assets/schema-field-CK0xYNbO.js +0 -1
  474. package/build/assets/sdk-section-page-Da73Rs_o.js +0 -1
  475. package/build/assets/secret-form-CB2VwYYg.js +0 -1
  476. package/build/assets/secrets-settings-Bh0udeKv.js +0 -1
  477. package/build/assets/settings-DmyIgRxO.js +0 -1
  478. package/build/assets/settings-dropdown-input-DVpyD87C.js +0 -1
  479. package/build/assets/settings-index-BSJUFmjE.js +0 -1
  480. package/build/assets/settings-input-C0dd8Utu.js +0 -1
  481. package/build/assets/settings-modal-yStgEh2o.js +0 -1
  482. package/build/assets/settings-switch-B78Khmyz.js +0 -1
  483. package/build/assets/shared-conversation-DM96X4KV.js +0 -1
  484. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +0 -1
  485. package/build/assets/sidebar-store-CSDFK0W5.js +0 -1
  486. package/build/assets/skill-card-pill-row-989y15jV.js +0 -1
  487. package/build/assets/skill-scope-Dz3kPH3P.js +0 -1
  488. package/build/assets/skills-plugins-e3CYGdUJ.js +0 -1
  489. package/build/assets/skills-settings-3e-FuHw_.js +0 -1
  490. package/build/assets/task-list-tab-3Jg8ywch.js +0 -1
  491. package/build/assets/trash-B6OIe4yX.js +0 -1
  492. package/build/assets/usage-tab-Cm-9j3UK.js +0 -1
  493. package/build/assets/use-acp-credential-form-BARcvjYE.js +0 -1
  494. package/build/assets/use-agent-profiles-1P91KSXz.js +0 -1
  495. package/build/assets/use-create-secret-D8p9ybQj.js +0 -1
  496. package/build/assets/use-is-authed-BRPjCRKM.js +0 -1
  497. package/build/assets/use-llm-configured-DGm8FiRR.js +0 -1
  498. package/build/assets/use-llm-profiles-BTTtpW4z.js +0 -1
  499. package/build/assets/use-save-agent-profile-CxyO9YG-.js +0 -1
  500. package/build/assets/use-settings-nav-items-vrjxTqcu.js +0 -16
  501. package/build/assets/useQueries-CykmpT-a.js +0 -1
  502. package/build/assets/useQuery-S6j94er1.js +0 -1
  503. package/build/assets/utils-BOco8mxR.js +0 -1
  504. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +0 -185
  505. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js +0 -1
  506. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js +0 -1
  507. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.cjs","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebar.cjs","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeOrgId: active.orgId,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
@@ -6,20 +6,20 @@ import { displayErrorToast as i } from "../../../utils/custom-toast-handlers.js"
6
6
  import { useActiveBackendContext as a } from "../../../contexts/active-backend-context.js";
7
7
  import { getErrorStatus as o, useSettings as s } from "../../../hooks/query/use-settings.js";
8
8
  import { useClickOutsideElement as c } from "../../../hooks/use-click-outside-element.js";
9
- import { useConfig as ee } from "../../../hooks/query/use-config.js";
10
- import { useSidebarMobileNav as te } from "./sidebar-mobile-nav-context.js";
11
- import { useBackendsHealth as l } from "../../../hooks/query/use-backends-health.js";
12
- import { SidebarRailBody as u } from "./sidebar-rail-body.js";
13
- import { useSidebarStore as d } from "../../../stores/sidebar-store.js";
14
- import f from "react";
15
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
9
+ import { useConfig as l } from "../../../hooks/query/use-config.js";
10
+ import { useSidebarMobileNav as ee } from "./sidebar-mobile-nav-context.js";
11
+ import { useBackendsHealth as u } from "../../../hooks/query/use-backends-health.js";
12
+ import { SidebarRailBody as d } from "./sidebar-rail-body.js";
13
+ import { useSidebarStore as f } from "../../../stores/sidebar-store.js";
14
+ import p from "react";
15
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
16
16
  //#region src/components/features/sidebar/sidebar.tsx
17
- var g = f.lazy(() => import("../../shared/modals/settings/settings-modal.js").then((e) => ({ default: e.SettingsModal }))), _ = f.lazy(() => import("../backends/add-backend-modal.js").then((e) => ({ default: e.AddBackendModal }))), v = f.lazy(() => import("../backends/manage-backends-modal.js").then((e) => ({ default: e.ManageBackendsModal }))), y = 250;
17
+ var te = p.lazy(() => import("../../shared/modals/settings/settings-modal.js").then((e) => ({ default: e.SettingsModal }))), _ = p.lazy(() => import("../backends/add-backend-modal.js").then((e) => ({ default: e.AddBackendModal }))), v = p.lazy(() => import("../backends/manage-backends-modal.js").then((e) => ({ default: e.ManageBackendsModal }))), y = 250;
18
18
  function b() {
19
- let { t: b } = e("openhands"), { currentPath: x } = r(), { data: S } = ee(), { data: C, error: w, isError: T, isFetching: E } = s(), { backends: D, active: O } = a(), k = l(D)[O.backend.id], A = d((e) => e.collapsed), j = d((e) => e.setCollapsed), [M, N] = f.useState(!1), [P, F] = f.useState(!1), I = f.useRef(null), [L, R] = f.useState(!1), [z, B] = f.useState(!1), [V, H] = f.useState(!1), U = f.useRef(!1), [, W] = f.useReducer((e) => e + 1, 0), { isOpen: G, close: K } = te(), [q, J] = f.useState(!1), [Y, X] = f.useState(!1), Z = c(() => F(!1)), Q = o(w);
20
- f.useEffect(() => {
19
+ let { t: b } = e("openhands"), { currentPath: x } = r(), { data: S } = l(), { data: C, error: w, isError: T, isFetching: E } = s(), { backends: D, active: O } = a(), k = u(D)[O.backend.id], A = f((e) => e.collapsed), j = f((e) => e.setCollapsed), [M, N] = p.useState(!1), [P, F] = p.useState(!1), I = p.useRef(null), [L, R] = p.useState(!1), [z, B] = p.useState(!1), [V, H] = p.useState(!1), U = p.useRef(!1), [, W] = p.useReducer((e) => e + 1, 0), { isOpen: G, close: K } = ee(), [q, J] = p.useState(!1), [Y, X] = p.useState(!1), Z = c(() => F(!1)), Q = o(w);
20
+ p.useEffect(() => {
21
21
  K();
22
- }, [x, K]), f.useEffect(() => {
22
+ }, [x, K]), p.useEffect(() => {
23
23
  if (G) {
24
24
  J(!0);
25
25
  let e = requestAnimationFrame(() => {
@@ -32,13 +32,13 @@ function b() {
32
32
  J(!1);
33
33
  }, y);
34
34
  return () => window.clearTimeout(e);
35
- }, [G]), f.useEffect(() => {
35
+ }, [G]), p.useEffect(() => {
36
36
  if (!G) return;
37
37
  let e = (e) => {
38
38
  e.key === "Escape" && K();
39
39
  };
40
40
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
41
- }, [G, K]), f.useEffect(() => {
41
+ }, [G, K]), p.useEffect(() => {
42
42
  x === "/settings" ? N(!1) : !E && T && Q !== 404 ? i(b(t.SETTINGS$FETCH_ERROR)) : Q === 404 && !S?.feature_flags?.hide_llm_settings && N(!0);
43
43
  }, [
44
44
  x,
@@ -48,13 +48,13 @@ function b() {
48
48
  S?.feature_flags?.hide_llm_settings,
49
49
  b
50
50
  ]);
51
- let ne = b(A ? t.SIDEBAR$EXPAND : t.SIDEBAR$COLLAPSE), re = f.useCallback((e) => {
51
+ let ne = b(A ? t.SIDEBAR$EXPAND : t.SIDEBAR$COLLAPSE), re = p.useCallback((e) => {
52
52
  if (!A) return;
53
53
  let t = e.target;
54
54
  t instanceof HTMLElement && (t.closest("a,button,input,textarea,select,[role='button'],[role='link']") || j(!1));
55
55
  }, [A, j]), $ = {
56
56
  collapseToggleLabel: ne,
57
- onCollapse: f.useCallback(() => {
57
+ onCollapse: p.useCallback(() => {
58
58
  H(!1), U.current = !0, W(), j(!0), window.setTimeout(() => {
59
59
  U.current = !1, W();
60
60
  }, 250);
@@ -64,6 +64,7 @@ function b() {
64
64
  isExtensionsActive: x === "/customize" || x.startsWith("/skills") || x === "/plugins" || x === "/apps" || x === "/mcp",
65
65
  currentPath: x,
66
66
  activeBackend: O.backend,
67
+ activeOrgId: O.orgId,
67
68
  activeBackendHealth: k,
68
69
  collapsedBackendPopoverOpen: P,
69
70
  setCollapsedBackendPopoverOpen: F,
@@ -72,8 +73,8 @@ function b() {
72
73
  onOpenAddBackend: () => R(!0),
73
74
  onOpenManageBackends: () => B(!0)
74
75
  };
75
- return /* @__PURE__ */ h(p, { children: [
76
- /* @__PURE__ */ m("aside", {
76
+ return /* @__PURE__ */ g(m, { children: [
77
+ /* @__PURE__ */ h("aside", {
77
78
  "aria-label": b(t.SIDEBAR$NAVIGATION_LABEL),
78
79
  "data-collapsed": A ? "true" : "false",
79
80
  onClick: re,
@@ -84,24 +85,24 @@ function b() {
84
85
  H(!1);
85
86
  },
86
87
  className: n("max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200", "md:border-r md:border-[var(--oh-border)] md:h-full", A ? "md:w-[60px] md:min-w-[60px] md:px-2.5" : "md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0", x === "/" && "md:pb-3"),
87
- children: /* @__PURE__ */ m(u, {
88
+ children: /* @__PURE__ */ h(d, {
88
89
  collapsed: A,
89
90
  showCollapseToggle: !0,
90
91
  ...$
91
92
  })
92
93
  }),
93
- q ? /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
94
+ q ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
94
95
  className: n("fixed inset-0 z-40 bg-black/50 md:hidden", "transition-opacity ease-in-out motion-reduce:transition-none", Y ? "opacity-100" : "pointer-events-none opacity-0"),
95
96
  style: { transitionDuration: `${y}ms` },
96
97
  onClick: K,
97
98
  "aria-hidden": !Y
98
- }), /* @__PURE__ */ m("aside", {
99
+ }), /* @__PURE__ */ h("aside", {
99
100
  "aria-label": b(t.SIDEBAR$NAVIGATION_LABEL),
100
101
  "data-testid": "sidebar-mobile-drawer",
101
102
  "aria-hidden": !Y,
102
103
  className: n("fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base", "border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden", "transition-transform ease-in-out motion-reduce:transition-none", Y ? "translate-x-0" : "-translate-x-full"),
103
104
  style: { transitionDuration: `${y}ms` },
104
- children: /* @__PURE__ */ m(u, {
105
+ children: /* @__PURE__ */ h(d, {
105
106
  collapsed: !1,
106
107
  showCollapseToggle: !1,
107
108
  showMobileCloseButton: !0,
@@ -109,20 +110,20 @@ function b() {
109
110
  ...$
110
111
  })
111
112
  })] }) : null,
112
- M && /* @__PURE__ */ m(f.Suspense, {
113
+ M && /* @__PURE__ */ h(p.Suspense, {
113
114
  fallback: null,
114
- children: /* @__PURE__ */ m(g, {
115
+ children: /* @__PURE__ */ h(te, {
115
116
  settings: C,
116
117
  onClose: () => N(!1)
117
118
  })
118
119
  }),
119
- L && /* @__PURE__ */ m(f.Suspense, {
120
+ L && /* @__PURE__ */ h(p.Suspense, {
120
121
  fallback: null,
121
- children: /* @__PURE__ */ m(_, { onClose: () => R(!1) })
122
+ children: /* @__PURE__ */ h(_, { onClose: () => R(!1) })
122
123
  }),
123
- z && /* @__PURE__ */ m(f.Suspense, {
124
+ z && /* @__PURE__ */ h(p.Suspense, {
124
125
  fallback: null,
125
- children: /* @__PURE__ */ m(v, { onClose: () => B(!1) })
126
+ children: /* @__PURE__ */ h(v, { onClose: () => B(!1) })
126
127
  })
127
128
  ] });
128
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.js","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebar.js","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeOrgId: active.orgId,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\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/I18nextProvider.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),r=require("../../i18n/index.cjs"),i=require("../../query-client-config.cjs"),a=require("../../contexts/active-backend-context.cjs"),o=require("./telemetry-provider.cjs"),s=require("./agent-server-ui-root.cjs");let c=require("react");c=e.__toESM(c,1);let l=require("react/jsx-runtime");var u={provider:`posthog`};function d({children:e,queryClient:u,analytics:d,i18n:f,className:p,contentClassName:m,style:h,styleOverrides:g,theme:_,withStyleRoot:v=!0}){let y=c.default.useMemo(()=>u??i.getDefaultQueryClient(),[u]),b=c.default.useMemo(()=>f??r.getDefaultI18n(),[f]),x=c.default.useRef(null);x.current||={queryClient:i.getQueryClient(),i18n:r.getI18n()},i.setQueryClient(y),r.setI18n(b),c.default.useEffect(()=>()=>{x.current&&(i.setQueryClient(x.current.queryClient),r.setI18n(x.current.i18n))},[]);let S=(0,l.jsx)(o.TelemetryProvider,{config:d&&d.provider===`posthog`?{apiKey:d.apiKey,apiHost:d.apiHost,uiHost:d.uiHost}:!1,children:e});return(0,l.jsx)(t.I18nextProvider,{i18n:b,defaultNS:r.OPENHANDS_I18N_NAMESPACE,children:(0,l.jsx)(n.QueryClientProvider,{client:y,children:(0,l.jsx)(a.ActiveBackendProvider,{children:v?(0,l.jsx)(s.AgentServerUIRoot,{className:p,contentClassName:m,style:h,styleOverrides:g,theme:_,children:S}):S})})})}exports.AgentServerUIProviders=d,exports.DEFAULT_AGENT_SERVER_ANALYTICS=u;
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../node_modules/react-i18next/dist/es/I18nextProvider.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),r=require("../../i18n/index.cjs"),i=require("../../query-client-config.cjs"),a=require("../../contexts/active-backend-context.cjs"),o=require("../../hooks/query/use-free-models.cjs"),s=require("./telemetry-provider.cjs"),c=require("./agent-server-ui-root.cjs");let l=require("react");l=e.__toESM(l,1);let u=require("react/jsx-runtime");var d={provider:`posthog`};function f(){return o.useHydrateFreeModels(),null}function p({children:e,queryClient:o,analytics:d,i18n:p,className:m,contentClassName:h,style:g,styleOverrides:_,theme:v,withStyleRoot:y=!0}){let b=l.default.useMemo(()=>o??i.getDefaultQueryClient(),[o]),x=l.default.useMemo(()=>p??r.getDefaultI18n(),[p]),S=l.default.useRef(null);S.current||={queryClient:i.getQueryClient(),i18n:r.getI18n()},i.setQueryClient(b),r.setI18n(x),l.default.useEffect(()=>()=>{S.current&&(i.setQueryClient(S.current.queryClient),r.setI18n(S.current.i18n))},[]);let C=(0,u.jsxs)(s.TelemetryProvider,{config:d&&d.provider===`posthog`?{apiKey:d.apiKey,apiHost:d.apiHost,uiHost:d.uiHost}:!1,children:[(0,u.jsx)(f,{}),e]});return(0,u.jsx)(t.I18nextProvider,{i18n:x,defaultNS:r.OPENHANDS_I18N_NAMESPACE,children:(0,u.jsx)(n.QueryClientProvider,{client:b,children:(0,u.jsx)(a.ActiveBackendProvider,{children:y?(0,u.jsx)(c.AgentServerUIRoot,{className:m,contentClassName:h,style:g,styleOverrides:_,theme:v,children:C}):C})})})}exports.AgentServerUIProviders=p,exports.DEFAULT_AGENT_SERVER_ANALYTICS=d;
2
2
  //# sourceMappingURL=agent-server-ui-providers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-ui-providers.cjs","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>{children}</TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":"0fAgCA,IAAa,EAA+D,CAC1E,SAAU,SACZ,EAaA,SAAgB,EAAuB,CACrC,WACA,cACA,YACA,OACA,YACA,mBACA,QACA,iBACA,QACA,gBAAgB,IACc,CAC9B,IAAM,EAAsB,EAAA,QAAM,YAC1B,GAAe,EAAA,sBAAsB,EAC3C,CAAC,CAAW,CACd,EACM,EAAe,EAAA,QAAM,YAAc,GAAQ,EAAA,eAAe,EAAG,CAAC,CAAI,CAAC,EACnE,EAAuB,EAAA,QAAM,OAGzB,IAAI,EAEd,AACE,EAAqB,UAAU,CAC7B,YAAa,EAAA,eAAe,EAC5B,KAAM,EAAA,QAAQ,CAChB,EAGF,EAAA,eAAe,CAAmB,EAClC,EAAA,QAAQ,CAAY,EAEpB,EAAA,QAAM,kBACQ,CACN,EAAqB,UACvB,EAAA,eAAe,EAAqB,QAAQ,WAAW,EACvD,EAAA,QAAQ,EAAqB,QAAQ,IAAI,EAE7C,EACA,CAAC,CACH,EAUA,IAAM,GACJ,EAAA,EAAA,KAAC,EAAA,kBAAD,CAAmB,OARnB,GAAa,EAAU,WAAa,UAChC,CACE,OAAQ,EAAU,OAClB,QAAS,EAAU,QACnB,OAAQ,EAAU,MACpB,EACA,GAEuC,UAA4B,CAAA,EAiBzE,OACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CAAiB,KAAM,EAAc,UAAW,EAAA,mCAC9C,EAAA,EAAA,KAAC,EAAA,oBAAD,CAAqB,OAAQ,YAC3B,EAAA,EAAA,KAAC,EAAA,sBAAD,CAAA,SAjBiB,GACrB,EAAA,EAAA,KAAC,EAAA,kBAAD,CACa,YACO,mBACX,QACS,iBACT,iBAEN,CACgB,CAAA,EAEnB,CAMkE,CAAA,CAC3C,CAAA,CACN,CAAA,CAErB"}
1
+ {"version":3,"file":"agent-server-ui-providers.cjs","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport { useHydrateFreeModels } from \"#/hooks/query/use-free-models\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\n/**\n * Fetches the DB-driven free / default model flags once and mirrors them into\n * the free-models store. Rendered inside the query provider so leaf components\n * can read the flags synchronously without a QueryClientProvider in scope.\n */\nfunction FreeModelsHydrator() {\n useHydrateFreeModels();\n return null;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>\n <FreeModelsHydrator />\n {children}\n </TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":"6iBAiCA,IAAa,EAA+D,CAC1E,SAAU,SACZ,EAkBA,SAAS,GAAqB,CAE5B,OADA,EAAA,qBAAqB,EACd,IACT,CAEA,SAAgB,EAAuB,CACrC,WACA,cACA,YACA,OACA,YACA,mBACA,QACA,iBACA,QACA,gBAAgB,IACc,CAC9B,IAAM,EAAsB,EAAA,QAAM,YAC1B,GAAe,EAAA,sBAAsB,EAC3C,CAAC,CAAW,CACd,EACM,EAAe,EAAA,QAAM,YAAc,GAAQ,EAAA,eAAe,EAAG,CAAC,CAAI,CAAC,EACnE,EAAuB,EAAA,QAAM,OAGzB,IAAI,EAEd,AACE,EAAqB,UAAU,CAC7B,YAAa,EAAA,eAAe,EAC5B,KAAM,EAAA,QAAQ,CAChB,EAGF,EAAA,eAAe,CAAmB,EAClC,EAAA,QAAQ,CAAY,EAEpB,EAAA,QAAM,kBACQ,CACN,EAAqB,UACvB,EAAA,eAAe,EAAqB,QAAQ,WAAW,EACvD,EAAA,QAAQ,EAAqB,QAAQ,IAAI,EAE7C,EACA,CAAC,CACH,EAUA,IAAM,GACJ,EAAA,EAAA,MAAC,EAAA,kBAAD,CAAmB,OARnB,GAAa,EAAU,WAAa,UAChC,CACE,OAAQ,EAAU,OAClB,QAAS,EAAU,QACnB,OAAQ,EAAU,MACpB,EACA,YAEJ,EACE,EAAA,EAAA,KAAC,EAAD,CAAqB,CAAA,EACpB,CACgB,IAiBrB,OACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CAAiB,KAAM,EAAc,UAAW,EAAA,mCAC9C,EAAA,EAAA,KAAC,EAAA,oBAAD,CAAqB,OAAQ,YAC3B,EAAA,EAAA,KAAC,EAAA,sBAAD,CAAA,SAjBiB,GACrB,EAAA,EAAA,KAAC,EAAA,kBAAD,CACa,YACO,mBACX,QACS,iBACT,iBAEN,CACgB,CAAA,EAEnB,CAMkE,CAAA,CAC3C,CAAA,CACN,CAAA,CAErB"}
@@ -3,45 +3,49 @@ import { QueryClientProvider as t } from "../../node_modules/@tanstack/react-que
3
3
  import { OPENHANDS_I18N_NAMESPACE as n, getDefaultI18n as r, getI18n as i, setI18n as a } from "../../i18n/index.js";
4
4
  import { getDefaultQueryClient as o, getQueryClient as s, setQueryClient as c } from "../../query-client-config.js";
5
5
  import { ActiveBackendProvider as l } from "../../contexts/active-backend-context.js";
6
- import { TelemetryProvider as u } from "./telemetry-provider.js";
7
- import { AgentServerUIRoot as d } from "./agent-server-ui-root.js";
8
- import f from "react";
9
- import { jsx as p } from "react/jsx-runtime";
6
+ import { useHydrateFreeModels as u } from "../../hooks/query/use-free-models.js";
7
+ import { TelemetryProvider as d } from "./telemetry-provider.js";
8
+ import { AgentServerUIRoot as f } from "./agent-server-ui-root.js";
9
+ import p from "react";
10
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
10
11
  //#region src/components/providers/agent-server-ui-providers.tsx
11
- var m = { provider: "posthog" };
12
- function h({ children: m, queryClient: h, analytics: g, i18n: _, className: v, contentClassName: y, style: b, styleOverrides: x, theme: S, withStyleRoot: C = !0 }) {
13
- let w = f.useMemo(() => h ?? o(), [h]), T = f.useMemo(() => _ ?? r(), [_]), E = f.useRef(null);
14
- E.current ||= {
12
+ var g = { provider: "posthog" };
13
+ function _() {
14
+ return u(), null;
15
+ }
16
+ function v({ children: u, queryClient: g, analytics: v, i18n: y, className: b, contentClassName: x, style: S, styleOverrides: C, theme: w, withStyleRoot: T = !0 }) {
17
+ let E = p.useMemo(() => g ?? o(), [g]), D = p.useMemo(() => y ?? r(), [y]), O = p.useRef(null);
18
+ O.current ||= {
15
19
  queryClient: s(),
16
20
  i18n: i()
17
- }, c(w), a(T), f.useEffect(() => () => {
18
- E.current && (c(E.current.queryClient), a(E.current.i18n));
21
+ }, c(E), a(D), p.useEffect(() => () => {
22
+ O.current && (c(O.current.queryClient), a(O.current.i18n));
19
23
  }, []);
20
- let D = /* @__PURE__ */ p(u, {
21
- config: g && g.provider === "posthog" ? {
22
- apiKey: g.apiKey,
23
- apiHost: g.apiHost,
24
- uiHost: g.uiHost
24
+ let k = /* @__PURE__ */ h(d, {
25
+ config: v && v.provider === "posthog" ? {
26
+ apiKey: v.apiKey,
27
+ apiHost: v.apiHost,
28
+ uiHost: v.uiHost
25
29
  } : !1,
26
- children: m
30
+ children: [/* @__PURE__ */ m(_, {}), u]
27
31
  });
28
- return /* @__PURE__ */ p(e, {
29
- i18n: T,
32
+ return /* @__PURE__ */ m(e, {
33
+ i18n: D,
30
34
  defaultNS: n,
31
- children: /* @__PURE__ */ p(t, {
32
- client: w,
33
- children: /* @__PURE__ */ p(l, { children: C ? /* @__PURE__ */ p(d, {
34
- className: v,
35
- contentClassName: y,
36
- style: b,
37
- styleOverrides: x,
38
- theme: S,
39
- children: D
40
- }) : D })
35
+ children: /* @__PURE__ */ m(t, {
36
+ client: E,
37
+ children: /* @__PURE__ */ m(l, { children: T ? /* @__PURE__ */ m(f, {
38
+ className: b,
39
+ contentClassName: x,
40
+ style: S,
41
+ styleOverrides: C,
42
+ theme: w,
43
+ children: k
44
+ }) : k })
41
45
  })
42
46
  });
43
47
  }
44
48
  //#endregion
45
- export { h as AgentServerUIProviders, m as DEFAULT_AGENT_SERVER_ANALYTICS };
49
+ export { v as AgentServerUIProviders, g as DEFAULT_AGENT_SERVER_ANALYTICS };
46
50
 
47
51
  //# sourceMappingURL=agent-server-ui-providers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-ui-providers.js","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>{children}</TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":";;;;;;;;;;AAgCA,IAAa,IAA+D,EAC1E,UAAU,UACZ;AAaA,SAAgB,EAAuB,EACrC,aACA,gBACA,cACA,SACA,cACA,qBACA,UACA,mBACA,UACA,mBAAgB,MACc;CAC9B,IAAM,IAAsB,EAAM,cAC1B,KAAe,EAAsB,GAC3C,CAAC,CAAW,CACd,GACM,IAAe,EAAM,cAAc,KAAQ,EAAe,GAAG,CAAC,CAAI,CAAC,GACnE,IAAuB,EAAM,OAGzB,IAAI;CAYd,AAVA,AACE,EAAqB,YAAU;EAC7B,aAAa,EAAe;EAC5B,MAAM,EAAQ;CAChB,GAGF,EAAe,CAAmB,GAClC,EAAQ,CAAY,GAEpB,EAAM,sBACQ;EACV,AAAI,EAAqB,YACvB,EAAe,EAAqB,QAAQ,WAAW,GACvD,EAAQ,EAAqB,QAAQ,IAAI;CAE7C,GACA,CAAC,CACH;CAUA,IAAM,IACJ,kBAAC,GAAD;EAAmB,QARnB,KAAa,EAAU,aAAa,YAChC;GACE,QAAQ,EAAU;GAClB,SAAS,EAAU;GACnB,QAAQ,EAAU;EACpB,IACA;EAEuC;CAA4B,CAAA;CAiBzE,OACE,kBAAC,GAAD;EAAiB,MAAM;EAAc,WAAW;YAC9C,kBAAC,GAAD;GAAqB,QAAQ;aAC3B,kBAAC,GAAD,EAAA,UAjBiB,IACrB,kBAAC,GAAD;IACa;IACO;IACX;IACS;IACT;cAEN;GACgB,CAAA,IAEnB,EAMkE,CAAA;EAC3C,CAAA;CACN,CAAA;AAErB"}
1
+ {"version":3,"file":"agent-server-ui-providers.js","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport { useHydrateFreeModels } from \"#/hooks/query/use-free-models\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\n/**\n * Fetches the DB-driven free / default model flags once and mirrors them into\n * the free-models store. Rendered inside the query provider so leaf components\n * can read the flags synchronously without a QueryClientProvider in scope.\n */\nfunction FreeModelsHydrator() {\n useHydrateFreeModels();\n return null;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>\n <FreeModelsHydrator />\n {children}\n </TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;AAiCA,IAAa,IAA+D,EAC1E,UAAU,UACZ;AAkBA,SAAS,IAAqB;CAE5B,OADA,EAAqB,GACd;AACT;AAEA,SAAgB,EAAuB,EACrC,aACA,gBACA,cACA,SACA,cACA,qBACA,UACA,mBACA,UACA,mBAAgB,MACc;CAC9B,IAAM,IAAsB,EAAM,cAC1B,KAAe,EAAsB,GAC3C,CAAC,CAAW,CACd,GACM,IAAe,EAAM,cAAc,KAAQ,EAAe,GAAG,CAAC,CAAI,CAAC,GACnE,IAAuB,EAAM,OAGzB,IAAI;CAYd,AAVA,AACE,EAAqB,YAAU;EAC7B,aAAa,EAAe;EAC5B,MAAM,EAAQ;CAChB,GAGF,EAAe,CAAmB,GAClC,EAAQ,CAAY,GAEpB,EAAM,sBACQ;EACV,AAAI,EAAqB,YACvB,EAAe,EAAqB,QAAQ,WAAW,GACvD,EAAQ,EAAqB,QAAQ,IAAI;CAE7C,GACA,CAAC,CACH;CAUA,IAAM,IACJ,kBAAC,GAAD;EAAmB,QARnB,KAAa,EAAU,aAAa,YAChC;GACE,QAAQ,EAAU;GAClB,SAAS,EAAU;GACnB,QAAQ,EAAU;EACpB,IACA;YAEJ,CACE,kBAAC,GAAD,CAAqB,CAAA,GACpB,CACgB;;CAiBrB,OACE,kBAAC,GAAD;EAAiB,MAAM;EAAc,WAAW;YAC9C,kBAAC,GAAD;GAAqB,QAAQ;aAC3B,kBAAC,GAAD,EAAA,UAjBiB,IACrB,kBAAC,GAAD;IACa;IACO;IACX;IACS;IACT;cAEN;GACgB,CAAA,IAEnB,EAMkE,CAAA;EAC3C,CAAA;CACN,CAAA;AAErB"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../utils/utils.cjs"),t=require("../../../icons/close.cjs");let n=require("react/jsx-runtime");function r({onClick:r,className:i}){return(0,n.jsx)(`button`,{type:`button`,onClick:r,className:e.cn(`bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer`,i),children:(0,n.jsx)(t.default,{width:18,height:18})})}exports.RemoveButton=r;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../utils/utils.cjs"),t=require("../../../icons/close.cjs");let n=require("react/jsx-runtime");function r({onClick:r,className:i,"aria-label":a}){return(0,n.jsx)(`button`,{type:`button`,onClick:r,"aria-label":a,className:e.cn(`bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer`,i),children:(0,n.jsx)(t.default,{width:18,height:18})})}exports.RemoveButton=r;
2
2
  //# sourceMappingURL=remove-button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"remove-button.cjs","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n}\n\nexport function RemoveButton({ onClick, className }: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":"wKAQA,SAAgB,EAAa,CAAE,UAAS,aAAgC,CACtE,OACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACI,UACT,UAAW,EAAA,GACT,4FACA,CACF,YAEA,EAAA,EAAA,KAAC,EAAA,QAAD,CAAW,MAAO,GAAI,OAAQ,EAAK,CAAA,CAC7B,CAAA,CAEZ"}
1
+ {"version":3,"file":"remove-button.cjs","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n \"aria-label\"?: string;\n}\n\nexport function RemoveButton({\n onClick,\n className,\n \"aria-label\": ariaLabel,\n}: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":"wKASA,SAAgB,EAAa,CAC3B,UACA,YACA,aAAc,GACM,CACpB,OACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACI,UACT,aAAY,EACZ,UAAW,EAAA,GACT,4FACA,CACF,YAEA,EAAA,EAAA,KAAC,EAAA,QAAD,CAAW,MAAO,GAAI,OAAQ,EAAK,CAAA,CAC7B,CAAA,CAEZ"}
@@ -1,6 +1,7 @@
1
1
  interface RemoveButtonProps {
2
2
  onClick: () => void;
3
3
  className?: React.HTMLAttributes<HTMLDivElement>["className"];
4
+ "aria-label"?: string;
4
5
  }
5
- export declare function RemoveButton({ onClick, className }: RemoveButtonProps): import("react").JSX.Element;
6
+ export declare function RemoveButton({ onClick, className, "aria-label": ariaLabel, }: RemoveButtonProps): import("react").JSX.Element;
6
7
  export {};
@@ -2,10 +2,11 @@ import { cn as e } from "../../../utils/utils.js";
2
2
  import t from "../../../icons/close.js";
3
3
  import { jsx as n } from "react/jsx-runtime";
4
4
  //#region src/components/shared/buttons/remove-button.tsx
5
- function r({ onClick: r, className: i }) {
5
+ function r({ onClick: r, className: i, "aria-label": a }) {
6
6
  return /* @__PURE__ */ n("button", {
7
7
  type: "button",
8
8
  onClick: r,
9
+ "aria-label": a,
9
10
  className: e("bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer", i),
10
11
  children: /* @__PURE__ */ n(t, {
11
12
  width: 18,
@@ -1 +1 @@
1
- {"version":3,"file":"remove-button.js","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n}\n\nexport function RemoveButton({ onClick, className }: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":";;;;AAQA,SAAgB,EAAa,EAAE,YAAS,gBAAgC;CACtE,OACE,kBAAC,UAAD;EACE,MAAK;EACI;EACT,WAAW,EACT,6FACA,CACF;YAEA,kBAAC,GAAD;GAAW,OAAO;GAAI,QAAQ;EAAK,CAAA;CAC7B,CAAA;AAEZ"}
1
+ {"version":3,"file":"remove-button.js","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n \"aria-label\"?: string;\n}\n\nexport function RemoveButton({\n onClick,\n className,\n \"aria-label\": ariaLabel,\n}: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":";;;;AASA,SAAgB,EAAa,EAC3B,YACA,cACA,cAAc,KACM;CACpB,OACE,kBAAC,UAAD;EACE,MAAK;EACI;EACT,cAAY;EACZ,WAAW,EACT,6FACA,CACF;YAEA,kBAAC,GAAD;GAAW,OAAO;GAAI,QAAQ;EAAK,CAAA;CAC7B,CAAA;AAEZ"}
@@ -0,0 +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/lucide-react/dist/esm/icons/info.cjs");let r=require("react/jsx-runtime");function i({modelIds:i}){let{t:a}=e.useTranslation(`openhands`);return(0,r.jsxs)(`p`,{"data-testid":`openhands-free-models-note`,className:`flex items-start gap-2 text-xs text-warning`,children:[(0,r.jsx)(n.Info,{className:`mt-0.5 size-4 shrink-0 text-warning`,"aria-hidden":!0}),(0,r.jsx)(`span`,{children:a(t.I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE,{ids:[...i].join(`, `)})})]})}exports.FreeOpenHandsModelsNote=i;
2
+ //# sourceMappingURL=free-models-note.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-models-note.cjs","names":[],"sources":["../../../src/components/shared/free-models-note.tsx"],"sourcesContent":["import { Info } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function FreeOpenHandsModelsNote({\n modelIds,\n}: {\n modelIds: Iterable<string>;\n}) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <p\n data-testid=\"openhands-free-models-note\"\n className=\"flex items-start gap-2 text-xs text-warning\"\n >\n <Info className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, {\n ids: [...modelIds].join(\", \"),\n })}\n </span>\n </p>\n );\n}\n"],"mappings":"+QAIA,SAAgB,EAAwB,CACtC,YAGC,CACD,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAExC,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,6BACZ,UAAU,uDAFZ,EAIE,EAAA,EAAA,KAAC,EAAA,KAAD,CAAM,UAAU,sCAAsC,cAAA,EAAa,CAAA,GACnE,EAAA,EAAA,KAAC,OAAD,CAAA,SACG,EAAE,EAAA,QAAQ,oCAAqC,CAC9C,IAAK,CAAC,GAAG,CAAQ,EAAE,KAAK,IAAI,CAC9B,CAAC,CACG,CAAA,CACL,GAEP"}
@@ -0,0 +1,3 @@
1
+ export declare function FreeOpenHandsModelsNote({ modelIds, }: {
2
+ modelIds: Iterable<string>;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import { useTranslation as e } from "../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../i18n/declaration.js";
3
+ import { Info as n } from "../../node_modules/lucide-react/dist/esm/icons/info.js";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/components/shared/free-models-note.tsx
6
+ function a({ modelIds: a }) {
7
+ let { t: o } = e("openhands");
8
+ return /* @__PURE__ */ i("p", {
9
+ "data-testid": "openhands-free-models-note",
10
+ className: "flex items-start gap-2 text-xs text-warning",
11
+ children: [/* @__PURE__ */ r(n, {
12
+ className: "mt-0.5 size-4 shrink-0 text-warning",
13
+ "aria-hidden": !0
14
+ }), /* @__PURE__ */ r("span", { children: o(t.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, { ids: [...a].join(", ") }) })]
15
+ });
16
+ }
17
+ //#endregion
18
+ export { a as FreeOpenHandsModelsNote };
19
+
20
+ //# sourceMappingURL=free-models-note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-models-note.js","names":[],"sources":["../../../src/components/shared/free-models-note.tsx"],"sourcesContent":["import { Info } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function FreeOpenHandsModelsNote({\n modelIds,\n}: {\n modelIds: Iterable<string>;\n}) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <p\n data-testid=\"openhands-free-models-note\"\n className=\"flex items-start gap-2 text-xs text-warning\"\n >\n <Info className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, {\n ids: [...modelIds].join(\", \"),\n })}\n </span>\n </p>\n );\n}\n"],"mappings":";;;;;AAIA,SAAgB,EAAwB,EACtC,eAGC;CACD,IAAM,EAAE,SAAM,EAAe,WAAW;CAExC,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,WAAU;YAFZ,CAIE,kBAAC,GAAD;GAAM,WAAU;GAAsC,eAAA;EAAa,CAAA,GACnE,kBAAC,QAAD,EAAA,UACG,EAAE,EAAQ,qCAAqC,EAC9C,KAAK,CAAC,GAAG,CAAQ,EAAE,KAAK,IAAI,EAC9B,CAAC,EACG,CAAA,CACL;;AAEP"}
@@ -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/info.cjs"),i=require("../../../../utils/constants.cjs"),a=require("../../../../utils/utils.cjs"),o=require("../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.cjs"),s=require("../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.cjs"),c=require("../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.cjs"),l=require("../../../../utils/form-control-classes.cjs"),u=require("../../../../utils/format-model-name.cjs"),d=require("../../../../ui/combobox-caret.cjs"),f=require("../../../../utils/map-provider.cjs"),p=require("../../../../utils/extract-model-and-provider.cjs"),m=require("../../../../ui/help-link.cjs"),h=require("../../../../hooks/query/use-search-providers.cjs"),g=require("../../../../hooks/query/use-provider-models.cjs");let _=require("react");_=e.__toESM(_,1);let v=require("react/jsx-runtime");var y=`shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning`;function b(){return(0,v.jsxs)(`p`,{"data-testid":`openhands-free-models-note`,className:`flex items-start gap-2 text-xs text-warning`,children:[(0,v.jsx)(r.Info,{className:`mt-0.5 size-4 shrink-0 text-warning`,"aria-hidden":!0}),(0,v.jsx)(`span`,{children:u.FREE_OPENHANDS_MODEL_NOTE})]})}function x({isDisabled:e,currentModel:r,onChange:x,onDefaultValuesChanged:S,wrapperClassName:C,labelClassName:w}){let[,T]=_.default.useState(null),[E,D]=_.default.useState(null),[O,k]=_.default.useState(null),{data:A=[]}=h.useSearchProviders(),{data:j=[],isLoading:M,error:N}=g.useProviderModels(E),P=_.default.useMemo(()=>A.filter(e=>e.verified),[A]),F=_.default.useMemo(()=>A.filter(e=>!e.verified),[A]),I=_.default.useMemo(()=>j.filter(e=>e.verified),[j]),L=_.default.useMemo(()=>j.filter(e=>!e.verified),[j]);_.default.useEffect(()=>{if(r){let{provider:e,model:t}=p.extractModelAndProvider(r);T(r),D(e||null),k(t),S?.(e||null,t)}},[r]);let R=e=>{D(e),k(null),T(`${e}/`),x?.(e,null)},z=e=>{let t=`${E}/${e}`;E===`openai`&&(t=e),T(t),k(e),x?.(E,e)},B=()=>{D(null),T(null)},V=u.isFreeOpenHandsModel(E&&O?`${E}/${O}`:null),H=_.default.useRef(null),[U,W]=_.default.useState(0);_.default.useLayoutEffect(()=>{if(!V||!H.current){W(0);return}let e=()=>{W(Math.ceil(H.current?.getBoundingClientRect().width??0))};if(e(),typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e);return t.observe(H.current),()=>t.disconnect()},[V,O]);let{t:G}=t.useTranslation(`openhands`);return(0,v.jsxs)(`div`,{className:a.cn(`flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]`,C),children:[(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:a.cn(`text-sm`,w),children:G(n.I18nKey.LLM$PROVIDER)}),(0,v.jsxs)(c.autocomplete_default,{"data-testid":`llm-provider-input`,isRequired:!0,isVirtualized:!1,name:`llm-provider-input`,isDisabled:e,"aria-label":G(n.I18nKey.LLM$PROVIDER),isClearable:!1,onSelectionChange:e=>{e?.toString()&&R(e.toString())},onInputChange:e=>!e&&B(),defaultSelectedKey:E??void 0,selectedKey:E,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:d.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:l.formControlSettingsFieldClassName}},children:[(0,v.jsx)(s.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:P.map(e=>(0,v.jsx)(o.listbox_item_base_default,{"data-testid":`provider-item-${e.name}`,children:f.mapProvider(e.name)},e.name))}),F.length>0?(0,v.jsx)(s.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:F.map(e=>(0,v.jsx)(o.listbox_item_base_default,{children:f.mapProvider(e.name)},e.name))}):null]})]}),E===`openhands`&&(0,v.jsx)(`div`,{className:`flex flex-col gap-2`,children:(0,v.jsx)(m.HelpLink,{testId:`openhands-account-help`,text:G(n.I18nKey.SETTINGS$NEED_OPENHANDS_ACCOUNT),linkText:G(n.I18nKey.SETTINGS$CLICK_HERE),href:i.PRODUCT_URL.PRODUCTION,size:`settings`,linkColor:`white`})}),(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:a.cn(`text-sm`,w),children:G(n.I18nKey.LLM$MODEL)}),(0,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsxs)(c.autocomplete_default,{"data-testid":`llm-model-input`,isRequired:!0,isVirtualized:!1,isLoading:M,name:`llm-model-input`,"aria-label":G(n.I18nKey.LLM$MODEL),isClearable:!1,onSelectionChange:e=>{e?.toString()&&z(e.toString())},isDisabled:e||!E,selectedKey:O,defaultSelectedKey:O??void 0,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:d.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:l.formControlSettingsFieldClassName}},children:[(0,v.jsx)(s.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:I.map(e=>(0,v.jsx)(o.listbox_item_base_default,{textValue:e.name,children:(0,v.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`truncate`,children:e.name}),u.isFreeOpenHandsModel(`${E}/${e.name}`)?(0,v.jsx)(`span`,{className:y,children:u.FREE_MODEL_BADGE_LABEL}):null]})},e.name))}),L.length>0?(0,v.jsx)(s.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:L.map(e=>(0,v.jsx)(o.listbox_item_base_default,{"data-testid":`model-item-${e.name}`,textValue:e.name,children:e.name},e.name))}):null]}),V&&O?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`span`,{ref:H,className:`pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0`,"aria-hidden":!0,children:O}),(0,v.jsx)(`span`,{"data-testid":`selected-free-model-badge`,className:a.cn(y,`pointer-events-none absolute top-1/2 z-10 -translate-y-1/2`),style:{left:`calc(0.75rem + ${U}px + 0.5rem)`},children:u.FREE_MODEL_BADGE_LABEL})]}):null]}),N&&(0,v.jsx)(`p`,{"data-testid":`models-error`,className:`text-danger text-xs`,children:G(n.I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}),E===`openhands`?(0,v.jsx)(b,{}):null]})]})}exports.ModelSelector=x;
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("../../../../utils/constants.cjs"),i=require("../../../../utils/utils.cjs"),a=require("../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.cjs"),o=require("../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.cjs"),s=require("../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.cjs"),c=require("../../../../utils/form-control-classes.cjs"),l=require("../../../../utils/format-model-name.cjs"),u=require("../../../../ui/combobox-caret.cjs"),d=require("../../../../utils/map-provider.cjs"),f=require("../../../../utils/extract-model-and-provider.cjs"),p=require("../../../../ui/help-link.cjs"),m=require("../../../../hooks/query/use-search-providers.cjs"),h=require("../../../../hooks/query/use-provider-models.cjs"),g=require("../../free-models-note.cjs");let _=require("react");_=e.__toESM(_,1);let v=require("react/jsx-runtime");var y=`shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning`;function b({isDisabled:e,currentModel:b,onChange:x,onDefaultValuesChanged:S,wrapperClassName:C,labelClassName:w}){let[,T]=_.default.useState(null),[E,D]=_.default.useState(null),[O,k]=_.default.useState(null),{data:A=[]}=m.useSearchProviders(),{data:j=[],isLoading:M,error:N}=h.useProviderModels(E),P=_.default.useMemo(()=>A.filter(e=>e.verified),[A]),F=_.default.useMemo(()=>A.filter(e=>!e.verified),[A]),I=_.default.useMemo(()=>j.filter(e=>e.verified),[j]),L=_.default.useMemo(()=>j.filter(e=>!e.verified),[j]),R=_.default.useMemo(()=>j.filter(e=>e.free).map(e=>e.name),[j]),z=_.default.useMemo(()=>new Set(R),[R]);_.default.useEffect(()=>{if(b){let{provider:e,model:t}=f.extractModelAndProvider(b);T(b),D(e||null),k(t),S?.(e||null,t)}},[b]);let B=e=>{D(e),k(null),T(`${e}/`),x?.(e,null)},V=e=>{let t=`${E}/${e}`;E===`openai`&&(t=e),T(t),k(e),x?.(E,e)},H=()=>{D(null),T(null)},U=!!(O&&z.has(O)),W=_.default.useRef(null),[G,K]=_.default.useState(0);_.default.useLayoutEffect(()=>{if(!U||!W.current){K(0);return}let e=()=>{K(Math.ceil(W.current?.getBoundingClientRect().width??0))};if(e(),typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e);return t.observe(W.current),()=>t.disconnect()},[U,O]);let{t:q}=t.useTranslation(`openhands`);return(0,v.jsxs)(`div`,{className:i.cn(`flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]`,C),children:[(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:i.cn(`text-sm`,w),children:q(n.I18nKey.LLM$PROVIDER)}),(0,v.jsxs)(s.autocomplete_default,{"data-testid":`llm-provider-input`,isRequired:!0,isVirtualized:!1,name:`llm-provider-input`,isDisabled:e,"aria-label":q(n.I18nKey.LLM$PROVIDER),isClearable:!1,onSelectionChange:e=>{e?.toString()&&B(e.toString())},onInputChange:e=>!e&&H(),defaultSelectedKey:E??void 0,selectedKey:E,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:u.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:c.formControlSettingsFieldClassName}},children:[(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:P.map(e=>(0,v.jsx)(a.listbox_item_base_default,{"data-testid":`provider-item-${e.name}`,children:d.mapProvider(e.name)},e.name))}),F.length>0?(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:F.map(e=>(0,v.jsx)(a.listbox_item_base_default,{children:d.mapProvider(e.name)},e.name))}):null]})]}),E===`openhands`&&(0,v.jsx)(`div`,{className:`flex flex-col gap-2`,children:(0,v.jsx)(p.HelpLink,{testId:`openhands-account-help`,text:q(n.I18nKey.SETTINGS$NEED_OPENHANDS_ACCOUNT),linkText:q(n.I18nKey.SETTINGS$CLICK_HERE),href:r.PRODUCT_URL.PRODUCTION,size:`settings`,linkColor:`white`})}),(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:i.cn(`text-sm`,w),children:q(n.I18nKey.LLM$MODEL)}),(0,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsxs)(s.autocomplete_default,{"data-testid":`llm-model-input`,isRequired:!0,isVirtualized:!1,isLoading:M,name:`llm-model-input`,"aria-label":q(n.I18nKey.LLM$MODEL),isClearable:!1,onSelectionChange:e=>{e?.toString()&&V(e.toString())},isDisabled:e||!E,selectedKey:O,defaultSelectedKey:O??void 0,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:u.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:c.formControlSettingsFieldClassName}},children:[(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:I.map(e=>(0,v.jsx)(a.listbox_item_base_default,{textValue:e.name,children:(0,v.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`truncate`,children:e.name}),e.free?(0,v.jsx)(`span`,{className:y,children:l.FREE_MODEL_BADGE_LABEL}):null]})},e.name))}),L.length>0?(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:L.map(e=>(0,v.jsx)(a.listbox_item_base_default,{"data-testid":`model-item-${e.name}`,textValue:e.name,children:e.name},e.name))}):null]}),U&&O?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`span`,{ref:W,className:`pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0`,"aria-hidden":!0,children:O}),(0,v.jsx)(`span`,{"data-testid":`selected-free-model-badge`,className:i.cn(y,`pointer-events-none absolute top-1/2 z-10 -translate-y-1/2`),style:{left:`calc(0.75rem + ${G}px + 0.5rem)`},children:l.FREE_MODEL_BADGE_LABEL})]}):null]}),N&&(0,v.jsx)(`p`,{"data-testid":`models-error`,className:`text-danger text-xs`,children:q(n.I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}),E===`openhands`&&R.length>0?(0,v.jsx)(g.FreeOpenHandsModelsNote,{modelIds:R.map(e=>`${E}/${e}`)}):null]})]})}exports.ModelSelector=b;
2
2
  //# sourceMappingURL=model-selector.cjs.map