@openhands/agent-canvas 1.16.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 (1093) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-CX3Lh9gj.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-DSZlXrLj.js → agent-context-settings-D3peZkjX.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-DkeZaqIl.js +1 -0
  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-BF8hM6wb.js +2 -0
  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-B-XdSk3b.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-D3a3of4G.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-BRppNh99.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-Cjl_hoxq.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-D_L0oEbG.js → base-modal-C1a0TsSx.js} +1 -1
  28. package/build/assets/bot-ByolqPEr.js +1 -0
  29. package/build/assets/{brand-button-BAfk4wGP.js → brand-button-CUMfjb99.js} +1 -1
  30. package/build/assets/browser-SE24Tk8g.js +46 -0
  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-2_x5Ezmi.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
  35. package/build/assets/{chat-send-button-MUQqCZCS.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-CztBCCPp.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
  42. package/build/assets/{cog-D-MPQW6G.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-DmEOje-7.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-I86vKcmM.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
  48. package/build/assets/conversation-B_nweu5p.js +93 -0
  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-FIbh_lc8.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-Bc1djN0-.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-CqyPPjOq.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-Bd7Tga-1.js +1 -0
  66. package/build/assets/files-tab-D5PPIWI1.js +1 -0
  67. package/build/assets/{form-control-classes-Bkh5FGrD.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-BmVyxs-2.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-apgLVjMw.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-CgIDc38n.js +1 -0
  90. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  91. package/build/assets/{loading-spinner-BY9N3pOe.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-Cu3Zgumb.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-AIBzzHTO.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-BxZjsju9.js → modal-body-C24WsdFb.js} +1 -1
  102. package/build/assets/{modal-classes-C8eycCwG.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-Co2uyaPA.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-B5CvmnYQ.js +1 -0
  108. package/build/assets/pencil-q-ihqDYv.js +1 -0
  109. package/build/assets/pin-BdroVQdN.js +1 -0
  110. package/build/assets/planner-tab-CstoOlAB.js +1 -0
  111. package/build/assets/plug-7ACOEbMs.js +1 -0
  112. package/build/assets/plugins-management-service-5rqVPEGN.js +1 -0
  113. package/build/assets/plus-C2e21TFC.js +1 -0
  114. package/build/assets/profiles-service.api-D1XKMgr0.js +1 -0
  115. package/build/assets/providers-XmZ9HM4Q.js +1 -0
  116. package/build/assets/proxy-XP6U1Dhv.js +1 -0
  117. package/build/assets/{puzzle-JM_QaRm0.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-BtdC3T8P.js +1 -0
  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/scroll-fade-state-Dt_fx2kf.js +1 -0
  126. package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
  127. package/build/assets/secret-form-9-BoGA40.js +1 -0
  128. package/build/assets/secrets-service-BOIsfD9j.js +1 -0
  129. package/build/assets/secrets-settings-CBJgFr42.js +1 -0
  130. package/build/assets/settings-D4hdToD4.js +1 -0
  131. package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
  132. package/build/assets/settings-index-DeQphyBK.js +1 -0
  133. package/build/assets/settings-input-dVuzapBA.js +1 -0
  134. package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-DhAPuXm6.js} +1 -1
  135. package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
  136. package/build/assets/settings-nav-GAQjW1a-.js +16 -0
  137. package/build/assets/settings-service.api-C1vZH9Vh.js +1 -0
  138. package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
  139. package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-BTaaRhLZ.js} +1 -1
  140. package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
  141. package/build/assets/shield-check-C3Rl0NF8.js +1 -0
  142. package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-DH0E-5KW.js} +1 -1
  143. package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
  144. package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
  145. package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
  146. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  147. package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
  148. package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-DsNLmn76.js} +2 -2
  149. package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-0MK_68Nc.js} +1 -1
  150. package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
  151. package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
  152. package/build/assets/skills-settings-BiPOH9H9.js +1 -0
  153. package/build/assets/styled-tooltip-CejG0rqv.js +1 -0
  154. package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
  155. package/build/assets/{terminal-CNElN42a.js → terminal-Dph60VFZ.js} +2 -2
  156. package/build/assets/toggle-switch-B2uXaAUS.js +1 -0
  157. package/build/assets/trash-2-Bb40zQzs.js +1 -0
  158. package/build/assets/trash-Ckh7yCaB.js +1 -0
  159. package/build/assets/triangle-alert-DEdu-b_L.js +1 -0
  160. package/build/assets/{typography-v1KN0tzi.js → typography-DgcLGdHk.js} +1 -1
  161. package/build/assets/usage-tab-MCmNRAnR.js +1 -0
  162. package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
  163. package/build/assets/use-activate-agent-profile-8L8Xdghy.js +1 -0
  164. package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
  165. package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-U99vvHxx.js} +1 -1
  166. package/build/assets/use-automation-permissions-Buus0R6h.js +1 -0
  167. package/build/assets/{use-automations-xijQKIl9.js → use-automations-Bq5hVuv0.js} +1 -1
  168. package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
  169. package/build/assets/use-canvas-extensions-Ca9KoVEm.js +1 -0
  170. package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
  171. package/build/assets/use-config-l5tkDHyD.js +1 -0
  172. package/build/assets/use-create-conversation-i_PdFdIs.js +1 -0
  173. package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
  174. package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
  175. package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CMTuWEp_.js} +1 -1
  176. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  177. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  178. package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
  179. package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
  180. package/build/assets/use-manifest-capabilities-CdqYfUAC.js +1 -0
  181. package/build/assets/use-onboarding-completion-Xl63ZvzQ.js +1 -0
  182. package/build/assets/use-pinned-home-route-BXDIUaxQ.js +1 -0
  183. package/build/assets/use-plugins-marketplace-BIIaPiaB.js +1 -0
  184. package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
  185. package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-Dapkf4cC.js} +1 -1
  186. package/build/assets/use-settings-C2KKQKVC.js +1 -0
  187. package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
  188. package/build/assets/use-tracking-j4uo9VEW.js +3 -0
  189. package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-5UFqMoO4.js} +1 -1
  190. package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  191. package/build/assets/{useMutation-B-qc391N.js → useMutation-Cszf8mKy.js} +1 -1
  192. package/build/assets/useQueries-pUohFMSP.js +1 -0
  193. package/build/assets/useQuery-DAAacS7O.js +1 -0
  194. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  195. package/build/assets/utils-BgLSZdyy.js +1 -0
  196. package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  198. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  199. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  200. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  201. package/build/assets/vendor~root-layout-CcdIqs-C.js +1 -0
  202. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  203. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  204. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  205. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  206. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
  207. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +12 -6
  208. package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-DdBpaVPz.js} +1 -1
  209. package/build/assets/{wrench-CUEI1krB.js → wrench-B8Wg_nbp.js} +1 -1
  210. package/build/assets/x-CX8lVGwm.js +1 -0
  211. package/build/index.html +4 -4
  212. package/build/locales/ar/openhands.json +79 -22
  213. package/build/locales/ca/openhands.json +79 -22
  214. package/build/locales/de/openhands.json +79 -22
  215. package/build/locales/en/openhands.json +79 -22
  216. package/build/locales/es/openhands.json +79 -22
  217. package/build/locales/fr/openhands.json +79 -22
  218. package/build/locales/it/openhands.json +79 -22
  219. package/build/locales/ja/openhands.json +79 -22
  220. package/build/locales/ko-KR/openhands.json +79 -22
  221. package/build/locales/no/openhands.json +79 -22
  222. package/build/locales/pt/openhands.json +79 -22
  223. package/build/locales/tr/openhands.json +79 -22
  224. package/build/locales/uk/openhands.json +79 -22
  225. package/build/locales/zh-CN/openhands.json +79 -22
  226. package/build/locales/zh-TW/openhands.json +79 -22
  227. package/config/defaults.json +3 -3
  228. package/dist/api/agent-server-adapter.cjs +3 -3
  229. package/dist/api/agent-server-adapter.cjs.map +1 -1
  230. package/dist/api/agent-server-adapter.d.ts +72 -12
  231. package/dist/api/agent-server-adapter.js +234 -132
  232. package/dist/api/agent-server-adapter.js.map +1 -1
  233. package/dist/api/agent-server-config.cjs +1 -1
  234. package/dist/api/agent-server-config.cjs.map +1 -1
  235. package/dist/api/agent-server-config.d.ts +6 -0
  236. package/dist/api/agent-server-config.js +6 -3
  237. package/dist/api/agent-server-config.js.map +1 -1
  238. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  239. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  240. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  241. package/dist/api/automation-service/automation-service.api.js +7 -7
  242. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  247. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  248. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  249. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  250. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  251. package/dist/api/cloud/skills-service.api.cjs +1 -1
  252. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  253. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  254. package/dist/api/cloud/skills-service.api.js +11 -1
  255. package/dist/api/cloud/skills-service.api.js.map +1 -1
  256. package/dist/api/config-service/config-service.api.cjs +1 -1
  257. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  258. package/dist/api/config-service/config-service.api.js +6 -2
  259. package/dist/api/config-service/config-service.api.js.map +1 -1
  260. package/dist/api/config-service/config-service.types.d.ts +13 -0
  261. package/dist/api/conversation-metadata-store.cjs +1 -1
  262. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  263. package/dist/api/conversation-metadata-store.d.ts +24 -0
  264. package/dist/api/conversation-metadata-store.js +10 -2
  265. package/dist/api/conversation-metadata-store.js.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  268. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
  269. package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
  270. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  271. package/dist/api/hooks-service.cjs +2 -0
  272. package/dist/api/hooks-service.cjs.map +1 -0
  273. package/dist/api/hooks-service.d.ts +13 -0
  274. package/dist/api/hooks-service.js +20 -0
  275. package/dist/api/hooks-service.js.map +1 -0
  276. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  277. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  278. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  279. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  280. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  281. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  282. package/dist/api/settings-service/settings-service.api.d.ts +2 -0
  283. package/dist/api/settings-service/settings-service.api.js +18 -10
  284. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  285. package/dist/api/skills-service.cjs +1 -1
  286. package/dist/api/skills-service.cjs.map +1 -1
  287. package/dist/api/skills-service.d.ts +7 -0
  288. package/dist/api/skills-service.js +11 -8
  289. package/dist/api/skills-service.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  291. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  292. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  293. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  295. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  296. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  297. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  298. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  299. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  300. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  301. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  302. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  303. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  304. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  305. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  306. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  307. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  309. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  310. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  311. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  312. package/dist/components/conversation-events/chat/event-message.js +79 -70
  313. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  314. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  315. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  316. package/dist/components/conversation-events/chat/messages.js +28 -27
  317. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  318. package/dist/components/features/automations/automation-card.cjs +1 -1
  319. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  320. package/dist/components/features/automations/automation-card.js +104 -97
  321. package/dist/components/features/automations/automation-card.js.map +1 -1
  322. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  323. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  324. package/dist/components/features/automations/automation-list-row.js +89 -77
  325. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  326. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  327. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  328. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  329. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  330. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  331. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  332. package/dist/components/features/automations/detail/detail-header.d.ts +10 -5
  333. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  334. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  335. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  336. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  337. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  338. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  339. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  340. package/dist/components/features/automations/kebab-menu.js +9 -5
  341. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  342. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  343. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  344. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  345. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  346. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  347. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  348. package/dist/components/features/backends/backend-selector.cjs +1 -1
  349. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  350. package/dist/components/features/backends/backend-selector.js +123 -112
  351. package/dist/components/features/backends/backend-selector.js.map +1 -1
  352. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  353. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  354. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  355. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  356. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  357. package/dist/components/features/chat/change-agent-button.js +4 -4
  358. package/dist/components/features/chat/chat-interface.cjs +2 -2
  359. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  360. package/dist/components/features/chat/chat-interface.js +137 -137
  361. package/dist/components/features/chat/chat-interface.js.map +1 -1
  362. package/dist/components/features/chat/chat-message.cjs +1 -1
  363. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  364. package/dist/components/features/chat/chat-message.d.ts +2 -1
  365. package/dist/components/features/chat/chat-message.js +88 -79
  366. package/dist/components/features/chat/chat-message.js.map +1 -1
  367. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  368. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  369. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  370. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  371. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  372. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  373. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  374. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  375. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  376. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  377. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  378. package/dist/components/features/chat/generic-event-message.js +41 -22
  379. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  380. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  381. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  382. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  383. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  384. package/dist/components/features/chat/model-messages.cjs +1 -1
  385. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  386. package/dist/components/features/chat/model-messages.js +27 -26
  387. package/dist/components/features/chat/model-messages.js.map +1 -1
  388. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  389. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  390. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  391. package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
  392. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  393. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  394. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  395. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  396. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  397. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  398. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
  399. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  400. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  401. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  402. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  403. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  404. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  405. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  406. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  407. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  408. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  409. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  410. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  411. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  412. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  413. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  414. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  415. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  416. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  417. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  423. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  424. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  425. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  426. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  427. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  428. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  429. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  430. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  431. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  432. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  433. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  434. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  435. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  436. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  437. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  438. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  439. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  441. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  442. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  443. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  444. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  445. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  446. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  447. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  448. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  449. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  450. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  451. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  452. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  453. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  454. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  455. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  456. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  457. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  458. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  459. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  460. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  461. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  462. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  463. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  464. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  465. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  466. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  467. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  468. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  469. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  470. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  471. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  472. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  473. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  474. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  475. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  476. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  477. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  478. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  479. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  480. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  481. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  482. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  483. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  484. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  485. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  486. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  487. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  488. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  489. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  490. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  491. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  492. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  493. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  494. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  495. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  496. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  497. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  498. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  499. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  500. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  501. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  502. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
  503. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  504. package/dist/components/features/images/image-lightbox.cjs +2 -0
  505. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  506. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  507. package/dist/components/features/images/image-lightbox.js +37 -0
  508. package/dist/components/features/images/image-lightbox.js.map +1 -0
  509. package/dist/components/features/images/image-preview.cjs +1 -1
  510. package/dist/components/features/images/image-preview.cjs.map +1 -1
  511. package/dist/components/features/images/image-preview.d.ts +2 -1
  512. package/dist/components/features/images/image-preview.js +33 -13
  513. package/dist/components/features/images/image-preview.js.map +1 -1
  514. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  515. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  516. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  517. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  518. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  519. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  520. package/dist/components/features/settings/cloud-settings-link.js +22 -19
  521. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  522. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  523. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  524. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  525. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  526. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  527. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  528. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +3 -2
  529. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  530. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  531. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  532. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  533. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  534. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  535. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  536. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  537. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  538. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  539. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  540. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  541. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  542. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  543. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  544. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  545. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +4 -1
  546. package/dist/components/features/sidebar/sidebar-rail-body.js +157 -139
  547. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  548. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  549. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  550. package/dist/components/features/sidebar/sidebar.js +28 -26
  551. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  552. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  553. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  554. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  555. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  556. package/dist/components/features/skills/extensions-navigation.js +3 -3
  557. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  558. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  559. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  560. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  561. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  562. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  563. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  564. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  565. package/dist/components/shared/buttons/remove-button.js +2 -1
  566. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  567. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  568. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  569. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  570. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  571. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  572. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  573. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  574. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  575. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  576. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  577. package/dist/components/shared/free-models-note.cjs +2 -0
  578. package/dist/components/shared/free-models-note.cjs.map +1 -0
  579. package/dist/components/shared/free-models-note.d.ts +3 -0
  580. package/dist/components/shared/free-models-note.js +20 -0
  581. package/dist/components/shared/free-models-note.js.map +1 -0
  582. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  583. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  584. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  585. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  586. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  587. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  588. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  589. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  590. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  591. package/dist/config/defaults.cjs +1 -1
  592. package/dist/config/defaults.cjs.map +1 -1
  593. package/dist/config/defaults.js +3 -3
  594. package/dist/config/defaults.js.map +1 -1
  595. package/dist/constants/acp-providers.cjs.map +1 -1
  596. package/dist/constants/acp-providers.d.ts +12 -0
  597. package/dist/constants/acp-providers.js.map +1 -1
  598. package/dist/constants/settings-nav.d.ts +8 -0
  599. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  600. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  601. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  602. package/dist/contexts/conversation-websocket-context.js +194 -198
  603. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  604. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  605. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  606. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  607. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  608. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  609. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  610. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  611. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  612. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  613. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  614. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  615. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  616. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  617. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  618. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  619. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  620. package/dist/hooks/chat/use-slash-command.js +63 -62
  621. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  622. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  623. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  624. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  625. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  626. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  627. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  628. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  629. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  630. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  631. package/dist/hooks/mutation/use-save-settings.js +3 -3
  632. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  633. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  634. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  635. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  636. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  637. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  638. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  639. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  640. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  641. package/dist/hooks/query/query-keys.cjs +1 -1
  642. package/dist/hooks/query/query-keys.cjs.map +1 -1
  643. package/dist/hooks/query/query-keys.d.ts +6 -0
  644. package/dist/hooks/query/query-keys.js +2 -2
  645. package/dist/hooks/query/query-keys.js.map +1 -1
  646. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  647. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  648. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  649. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  650. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  651. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  652. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  653. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  654. package/dist/hooks/query/use-conversation-skills.js +20 -4
  655. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  656. package/dist/hooks/query/use-free-models.cjs +2 -0
  657. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  658. package/dist/hooks/query/use-free-models.d.ts +23 -0
  659. package/dist/hooks/query/use-free-models.js +67 -0
  660. package/dist/hooks/query/use-free-models.js.map +1 -0
  661. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  662. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  663. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  664. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  665. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  666. package/dist/hooks/query/use-provider-connections.js +7 -3
  667. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  668. package/dist/hooks/query/use-provider-models.cjs +1 -1
  669. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  670. package/dist/hooks/query/use-provider-models.js +34 -25
  671. package/dist/hooks/query/use-provider-models.js.map +1 -1
  672. package/dist/hooks/query/use-search-providers.cjs +1 -1
  673. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  674. package/dist/hooks/query/use-search-providers.js +31 -19
  675. package/dist/hooks/query/use-search-providers.js.map +1 -1
  676. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  677. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  678. package/dist/hooks/query/use-sub-conversations.js +16 -16
  679. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  680. package/dist/hooks/use-acp-model-context.cjs +1 -1
  681. package/dist/hooks/use-acp-model-context.js +3 -3
  682. package/dist/hooks/use-agent-state.cjs +1 -1
  683. package/dist/hooks/use-agent-state.cjs.map +1 -1
  684. package/dist/hooks/use-agent-state.d.ts +17 -1
  685. package/dist/hooks/use-agent-state.js +19 -9
  686. package/dist/hooks/use-agent-state.js.map +1 -1
  687. package/dist/hooks/use-automation-permissions.cjs +2 -0
  688. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  689. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  690. package/dist/hooks/use-automation-permissions.js +52 -0
  691. package/dist/hooks/use-automation-permissions.js.map +1 -0
  692. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  693. package/dist/hooks/use-chat-input-model-state.js +3 -3
  694. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  695. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  696. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  697. package/dist/hooks/use-handle-plan-click.js +85 -26
  698. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  699. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  700. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  701. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  702. package/dist/hooks/use-home-automation-actions.js +1 -1
  703. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  704. package/dist/hooks/use-llm-configured.cjs +1 -1
  705. package/dist/hooks/use-llm-configured.js +3 -3
  706. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  707. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  708. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  709. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  710. package/dist/hooks/use-unified-websocket-status.js +5 -1
  711. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  712. package/dist/i18n/declaration.cjs +1 -1
  713. package/dist/i18n/declaration.cjs.map +1 -1
  714. package/dist/i18n/declaration.d.ts +71 -14
  715. package/dist/i18n/declaration.js +1 -1
  716. package/dist/i18n/declaration.js.map +1 -1
  717. package/dist/i18n/translation.cjs +2 -2
  718. package/dist/i18n/translation.cjs.map +1 -1
  719. package/dist/i18n/translation.js +1281 -312
  720. package/dist/i18n/translation.js.map +1 -1
  721. package/dist/locales/ar/openhands.json +79 -22
  722. package/dist/locales/ca/openhands.json +79 -22
  723. package/dist/locales/de/openhands.json +79 -22
  724. package/dist/locales/en/openhands.json +79 -22
  725. package/dist/locales/es/openhands.json +79 -22
  726. package/dist/locales/fr/openhands.json +79 -22
  727. package/dist/locales/it/openhands.json +79 -22
  728. package/dist/locales/ja/openhands.json +79 -22
  729. package/dist/locales/ko-KR/openhands.json +79 -22
  730. package/dist/locales/no/openhands.json +79 -22
  731. package/dist/locales/pt/openhands.json +79 -22
  732. package/dist/locales/tr/openhands.json +79 -22
  733. package/dist/locales/uk/openhands.json +79 -22
  734. package/dist/locales/zh-CN/openhands.json +79 -22
  735. package/dist/locales/zh-TW/openhands.json +79 -22
  736. package/dist/manifests/automation-insights.cjs.map +1 -1
  737. package/dist/manifests/automation-insights.d.ts +10 -2
  738. package/dist/manifests/automation-insights.js.map +1 -1
  739. package/dist/manifests/automation-setup.cjs +1 -1
  740. package/dist/manifests/automation-setup.cjs.map +1 -1
  741. package/dist/manifests/automation-setup.d.ts +9 -16
  742. package/dist/manifests/automation-setup.js +17 -7
  743. package/dist/manifests/automation-setup.js.map +1 -1
  744. package/dist/manifests/manifest-actions.d.ts +1 -1
  745. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  746. package/dist/manifests/manifest-local-validation.cjs +2 -0
  747. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  748. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  749. package/dist/manifests/manifest-local-validation.js +8 -0
  750. package/dist/manifests/manifest-local-validation.js.map +1 -0
  751. package/dist/manifests/manifest-template.cjs +2 -0
  752. package/dist/manifests/manifest-template.cjs.map +1 -0
  753. package/dist/manifests/manifest-template.d.ts +4 -4
  754. package/dist/manifests/manifest-template.js +12 -0
  755. package/dist/manifests/manifest-template.js.map +1 -0
  756. package/dist/manifests/manifest-validation.cjs +1 -1
  757. package/dist/manifests/manifest-validation.cjs.map +1 -1
  758. package/dist/manifests/manifest-validation.js +106 -28
  759. package/dist/manifests/manifest-validation.js.map +1 -1
  760. package/dist/manifests/types.cjs.map +1 -1
  761. package/dist/manifests/types.d.ts +39 -4
  762. package/dist/manifests/types.js.map +1 -1
  763. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  764. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  765. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  766. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  767. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  768. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  769. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
  770. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  771. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  772. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  773. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
  774. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  775. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
  776. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
  777. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
  778. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
  779. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  780. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  781. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
  782. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  783. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  784. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  785. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  786. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  787. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
  788. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
  789. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
  790. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
  791. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  792. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  793. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  794. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  795. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  796. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  797. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  798. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  799. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  800. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  801. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  802. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  803. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  804. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  805. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  806. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  807. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  808. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  809. package/dist/package.cjs +1 -1
  810. package/dist/package.cjs.map +1 -1
  811. package/dist/package.js +4 -4
  812. package/dist/package.js.map +1 -1
  813. package/dist/routes/agent-settings.d.ts +2 -0
  814. package/dist/routes/app-settings.cjs +1 -1
  815. package/dist/routes/app-settings.cjs.map +1 -1
  816. package/dist/routes/app-settings.js +53 -48
  817. package/dist/routes/app-settings.js.map +1 -1
  818. package/dist/routes/llm-settings.cjs +1 -1
  819. package/dist/routes/llm-settings.cjs.map +1 -1
  820. package/dist/routes/llm-settings.d.ts +3 -1
  821. package/dist/routes/llm-settings.js +120 -127
  822. package/dist/routes/llm-settings.js.map +1 -1
  823. package/dist/routes/planner-tab.cjs +1 -1
  824. package/dist/routes/planner-tab.cjs.map +1 -1
  825. package/dist/routes/planner-tab.js +44 -28
  826. package/dist/routes/planner-tab.js.map +1 -1
  827. package/dist/services/telemetry.cjs +1 -1
  828. package/dist/services/telemetry.cjs.map +1 -1
  829. package/dist/services/telemetry.d.ts +5 -0
  830. package/dist/services/telemetry.js +122 -115
  831. package/dist/services/telemetry.js.map +1 -1
  832. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  833. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  834. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  835. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  836. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  837. package/dist/stores/conversation-state-store.cjs +1 -1
  838. package/dist/stores/conversation-state-store.cjs.map +1 -1
  839. package/dist/stores/conversation-state-store.d.ts +9 -3
  840. package/dist/stores/conversation-state-store.js +6 -3
  841. package/dist/stores/conversation-state-store.js.map +1 -1
  842. package/dist/stores/conversation-store.cjs +1 -1
  843. package/dist/stores/conversation-store.cjs.map +1 -1
  844. package/dist/stores/conversation-store.d.ts +2 -0
  845. package/dist/stores/conversation-store.js +3 -0
  846. package/dist/stores/conversation-store.js.map +1 -1
  847. package/dist/stores/free-models-store.cjs +2 -0
  848. package/dist/stores/free-models-store.cjs.map +1 -0
  849. package/dist/stores/free-models-store.d.ts +30 -0
  850. package/dist/stores/free-models-store.js +22 -0
  851. package/dist/stores/free-models-store.js.map +1 -0
  852. package/dist/stores/model-store.cjs +1 -1
  853. package/dist/stores/model-store.cjs.map +1 -1
  854. package/dist/stores/model-store.d.ts +7 -0
  855. package/dist/stores/model-store.js +4 -0
  856. package/dist/stores/model-store.js.map +1 -1
  857. package/dist/types/automation.cjs.map +1 -1
  858. package/dist/types/automation.d.ts +46 -1
  859. package/dist/types/automation.js.map +1 -1
  860. package/dist/ui/context-menu.d.ts +1 -1
  861. package/dist/ui/toggle-switch.cjs +1 -1
  862. package/dist/ui/toggle-switch.cjs.map +1 -1
  863. package/dist/ui/toggle-switch.d.ts +4 -1
  864. package/dist/ui/toggle-switch.js +4 -3
  865. package/dist/ui/toggle-switch.js.map +1 -1
  866. package/dist/utils/automation-catalog.cjs +1 -1
  867. package/dist/utils/automation-catalog.cjs.map +1 -1
  868. package/dist/utils/automation-catalog.d.ts +12 -1
  869. package/dist/utils/automation-catalog.js +42 -12
  870. package/dist/utils/automation-catalog.js.map +1 -1
  871. package/dist/utils/automation-run-display.cjs +2 -0
  872. package/dist/utils/automation-run-display.cjs.map +1 -0
  873. package/dist/utils/automation-run-display.d.ts +20 -0
  874. package/dist/utils/automation-run-display.js +85 -0
  875. package/dist/utils/automation-run-display.js.map +1 -0
  876. package/dist/utils/automation-schedule.cjs +1 -1
  877. package/dist/utils/automation-schedule.cjs.map +1 -1
  878. package/dist/utils/automation-schedule.d.ts +16 -0
  879. package/dist/utils/automation-schedule.js +2 -0
  880. package/dist/utils/automation-schedule.js.map +1 -1
  881. package/dist/utils/constants.cjs +1 -1
  882. package/dist/utils/constants.cjs.map +1 -1
  883. package/dist/utils/constants.d.ts +4 -0
  884. package/dist/utils/constants.js +23 -3
  885. package/dist/utils/constants.js.map +1 -1
  886. package/dist/utils/format-event-timestamp.cjs +2 -0
  887. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  888. package/dist/utils/format-event-timestamp.d.ts +1 -0
  889. package/dist/utils/format-event-timestamp.js +13 -0
  890. package/dist/utils/format-event-timestamp.js.map +1 -0
  891. package/dist/utils/format-model-name.cjs +1 -1
  892. package/dist/utils/format-model-name.cjs.map +1 -1
  893. package/dist/utils/format-model-name.d.ts +27 -6
  894. package/dist/utils/format-model-name.js +14 -6
  895. package/dist/utils/format-model-name.js.map +1 -1
  896. package/dist/utils/git-diff-stats.cjs +2 -2
  897. package/dist/utils/git-diff-stats.cjs.map +1 -1
  898. package/dist/utils/git-diff-stats.d.ts +4 -0
  899. package/dist/utils/git-diff-stats.js +12 -2
  900. package/dist/utils/git-diff-stats.js.map +1 -1
  901. package/dist/utils/plan-file.cjs +4 -0
  902. package/dist/utils/plan-file.cjs.map +1 -0
  903. package/dist/utils/plan-file.d.ts +18 -0
  904. package/dist/utils/plan-file.js +58 -0
  905. package/dist/utils/plan-file.js.map +1 -0
  906. package/dist/utils/recommended-automation-rail.cjs +1 -1
  907. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  908. package/dist/utils/recommended-automation-rail.js +1 -0
  909. package/dist/utils/recommended-automation-rail.js.map +1 -1
  910. package/dist/utils/scroll-fade-state.cjs +1 -1
  911. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  912. package/dist/utils/scroll-fade-state.d.ts +6 -0
  913. package/dist/utils/scroll-fade-state.js +8 -1
  914. package/dist/utils/scroll-fade-state.js.map +1 -1
  915. package/dist/utils/sdk-settings-schema.cjs +1 -1
  916. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  917. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  918. package/dist/utils/sdk-settings-schema.js +25 -22
  919. package/dist/utils/sdk-settings-schema.js.map +1 -1
  920. package/dist/utils/utils.cjs +1 -1
  921. package/dist/utils/utils.cjs.map +1 -1
  922. package/dist/utils/utils.js +11 -11
  923. package/dist/utils/utils.js.map +1 -1
  924. package/package.json +4 -4
  925. package/scripts/check-sdk-version-sync.mjs +6 -6
  926. package/scripts/dev-safe.mjs +1 -1
  927. package/scripts/dev-with-automation.mjs +1 -1
  928. package/scripts/static-server.mjs +33 -1
  929. package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
  930. package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
  931. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
  932. package/build/assets/agent-settings-DLtsqaOs.js +0 -2
  933. package/build/assets/agent-settings-fFvR-XC2.js +0 -1
  934. package/build/assets/alert-banner-HP6mX-Vr.js +0 -1
  935. package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
  936. package/build/assets/app-settings-dbnneVaV.js +0 -1
  937. package/build/assets/automation-detail-BmwlCUAB.js +0 -3
  938. package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
  939. package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
  940. package/build/assets/automations-list-DuNcRawl.js +0 -1
  941. package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
  942. package/build/assets/backend-synced-settings-badge-DPkz30BE.js +0 -1
  943. package/build/assets/badge-BU3S0VtE.js +0 -1
  944. package/build/assets/bot-dMYHVfYM.js +0 -1
  945. package/build/assets/browser-DSAo0tz1.js +0 -46
  946. package/build/assets/browser-tab-C9vy56R5.js +0 -1
  947. package/build/assets/canvas-extension-page-dx1gFrfW.js +0 -1
  948. package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
  949. package/build/assets/check-CS0vmpQQ.js +0 -1
  950. package/build/assets/chevron-down-e1QBpjVy.js +0 -1
  951. package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
  952. package/build/assets/circle-check-DzWLNsbE.js +0 -1
  953. package/build/assets/circle-plus-check-toggle-BO_kFZt3.js +0 -1
  954. package/build/assets/command-menu--UIlGL72.js +0 -1
  955. package/build/assets/commits-tab-AnZwLvh-.js +0 -1
  956. package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
  957. package/build/assets/conversation-BbGrAO4Z.js +0 -93
  958. package/build/assets/conversation-mYT6NAoj.js +0 -1
  959. package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
  960. package/build/assets/conversation-state-store-B0ImPLHO.js +0 -1
  961. package/build/assets/conversation-store-Ca3ghXap.js +0 -6
  962. package/build/assets/copy-to-clipboard-button-Ca8iSkkA.js +0 -1
  963. package/build/assets/device-verify-Bhn2e_Ye.js +0 -1
  964. package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
  965. package/build/assets/empty-state-BoGVDecT.js +0 -1
  966. package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
  967. package/build/assets/environment-switch-overlay-BmBRT7gv.js +0 -1
  968. package/build/assets/error-state-Body8Ngd.js +0 -1
  969. package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
  970. package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
  971. package/build/assets/external-link-DKUlnCQV.js +0 -1
  972. package/build/assets/files-tab-D4o2VyE_.js +0 -1
  973. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  974. package/build/assets/get-git-path-ChKDVHZp.js +0 -1
  975. package/build/assets/git-repo-dropdown-4ROKl2cB.js +0 -1
  976. package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
  977. package/build/assets/highlighted-source-view-BFRxGT_Q.js +0 -1
  978. package/build/assets/home-ChpSuepX.js +0 -1
  979. package/build/assets/home-DIsB440S.js +0 -1
  980. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
  981. package/build/assets/home-store-CY9Ej0ux.js +0 -1
  982. package/build/assets/index-home-BdlrFIif.js +0 -1
  983. package/build/assets/info-B6RQawoW.js +0 -1
  984. package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
  985. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
  986. package/build/assets/launch-IrTDEFCs.js +0 -1
  987. package/build/assets/list-filter-DsEK7NFC.js +0 -1
  988. package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
  989. package/build/assets/llm-settings-B9juXhIa.js +0 -1
  990. package/build/assets/llm-settings-De1d5dfr.js +0 -1
  991. package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
  992. package/build/assets/loader-circle-CC1au6hc.js +0 -1
  993. package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
  994. package/build/assets/manifest-80fb1c29.js +0 -1
  995. package/build/assets/manifest-subpage-layout-CAOYzrYp.js +0 -1
  996. package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
  997. package/build/assets/mcp-BTs_SXfZ.js +0 -1
  998. package/build/assets/mcp-page-BEBYqH_K.js +0 -9
  999. package/build/assets/messages-DKV9cRc2.js +0 -41
  1000. package/build/assets/modal-close-button-DDzdRvCs.js +0 -1
  1001. package/build/assets/onboarding-DV_OXoeP.js +0 -1
  1002. package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
  1003. package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
  1004. package/build/assets/pencil-47jAZH_V.js +0 -1
  1005. package/build/assets/pin-By41Vl5J.js +0 -1
  1006. package/build/assets/planner-tab-C9uZmhme.js +0 -1
  1007. package/build/assets/plug-CG5HFcNG.js +0 -1
  1008. package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
  1009. package/build/assets/plus-C7Slq-0I.js +0 -1
  1010. package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
  1011. package/build/assets/providers-BhMcY5nv.js +0 -1
  1012. package/build/assets/proxy-9Fe1v5na.js +0 -1
  1013. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
  1014. package/build/assets/refresh-cw-3q3Frrii.js +0 -1
  1015. package/build/assets/root-Dc8YmC9F.js +0 -2
  1016. package/build/assets/root-VDaypvK4.css +0 -1
  1017. package/build/assets/root-layout-CXkhSPYh.js +0 -2
  1018. package/build/assets/schema-field-D-y9-LDb.js +0 -1
  1019. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  1020. package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
  1021. package/build/assets/secret-form-BB7the8W.js +0 -1
  1022. package/build/assets/secrets-service-ByZVENbp.js +0 -1
  1023. package/build/assets/secrets-settings-B_GpxKW2.js +0 -1
  1024. package/build/assets/settings-C0EWuBtA.js +0 -1
  1025. package/build/assets/settings-dropdown-input-BcwylHs2.js +0 -1
  1026. package/build/assets/settings-index-5w5UW2K3.js +0 -1
  1027. package/build/assets/settings-input-Db-1g8Ql.js +0 -1
  1028. package/build/assets/settings-modal-DfJ3tcJQ.js +0 -1
  1029. package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
  1030. package/build/assets/settings-switch-CS-dJDmA.js +0 -1
  1031. package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
  1032. package/build/assets/shield-check-D2aCRd16.js +0 -1
  1033. package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
  1034. package/build/assets/sidebar-store-DGqHkVLw.js +0 -1
  1035. package/build/assets/skill-card-pill-row-B27-xyig.js +0 -1
  1036. package/build/assets/skill-scope-B42H-XOc.js +0 -1
  1037. package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
  1038. package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
  1039. package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
  1040. package/build/assets/task-list-tab-C5zcaktH.js +0 -1
  1041. package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
  1042. package/build/assets/trash-2-D7K26eDO.js +0 -1
  1043. package/build/assets/trash-D-HYiVYM.js +0 -1
  1044. package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
  1045. package/build/assets/usage-tab-CVDffLPt.js +0 -1
  1046. package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
  1047. package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
  1048. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
  1049. package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
  1050. package/build/assets/use-config-A9QovgXO.js +0 -1
  1051. package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
  1052. package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
  1053. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  1054. package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
  1055. package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
  1056. package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
  1057. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
  1058. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
  1059. package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
  1060. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
  1061. package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
  1062. package/build/assets/use-settings-DSXLbvBl.js +0 -1
  1063. package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
  1064. package/build/assets/use-tracking-D53y3TH9.js +0 -3
  1065. package/build/assets/useQueries-DlbhlH9I.js +0 -1
  1066. package/build/assets/useQuery-BSTgq1rl.js +0 -1
  1067. package/build/assets/utils-CN5ZfZy1.js +0 -1
  1068. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
  1069. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js +0 -1
  1070. package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
  1071. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js +0 -1
  1072. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
  1073. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
  1074. package/build/assets/x-DJdhbdmt.js +0 -1
  1075. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  1076. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  1077. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  1078. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  1079. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  1080. package/dist/hooks/query/use-skills.cjs +0 -2
  1081. package/dist/hooks/query/use-skills.cjs.map +0 -1
  1082. package/dist/hooks/query/use-skills.d.ts +0 -7
  1083. package/dist/hooks/query/use-skills.js +0 -13
  1084. package/dist/hooks/query/use-skills.js.map +0 -1
  1085. package/dist/hooks/use-has-permission.cjs +0 -2
  1086. package/dist/hooks/use-has-permission.cjs.map +0 -1
  1087. package/dist/hooks/use-has-permission.d.ts +0 -1
  1088. package/dist/hooks/use-has-permission.js +0 -8
  1089. package/dist/hooks/use-has-permission.js.map +0 -1
  1090. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  1091. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  1092. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  1093. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
@@ -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"}
@@ -1,2 +1,2 @@
1
- const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../utils/utils.cjs"),n=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs");let r=require("react");r=e.__toESM(r,1);let i=require("react/jsx-runtime");function a(e){return r.default.Children.count(e)===1&&r.default.isValidElement(e)?e:(0,i.jsx)(`span`,{className:`inline-flex`,children:e})}function o({children:e,content:r,tooltipClassName:o,placement:s=`right`,showArrow:c=!1,closeDelay:l=100,shouldFlip:u,offset:d=7}){return(0,i.jsx)(n.tooltip_default,{content:r,closeDelay:l,placement:s,offset:d,shouldFlip:u,className:t.cn(`bg-white text-black`,o),showArrow:c,disableAnimation:!1,classNames:{content:t.cn(`z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md`,`!bg-white !text-black`,o)},children:a(e)})}exports.StyledTooltip=o;
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../utils/utils.cjs"),n=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs");let r=require("react");r=e.__toESM(r,1);let i=require("react/jsx-runtime");function a(e){return r.default.Children.count(e)===1&&r.default.isValidElement(e)?e:(0,i.jsx)(`span`,{className:`inline-flex`,children:e})}function o({children:e,content:r,tooltipClassName:o,placement:s=`right`,showArrow:c=!1,closeDelay:l=100,shouldFlip:u,offset:d=7,isOpen:f}){return(0,i.jsx)(n.tooltip_default,{content:r,closeDelay:l,placement:s,offset:d,shouldFlip:u,isOpen:f,className:t.cn(`bg-white text-black`,o),showArrow:c,disableAnimation:!1,classNames:{content:t.cn(`z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md`,`!bg-white !text-black`,o)},children:a(e)})}exports.StyledTooltip=o;
2
2
  //# sourceMappingURL=styled-tooltip.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"styled-tooltip.cjs","names":[],"sources":["../../../../src/components/shared/buttons/styled-tooltip.tsx"],"sourcesContent":["import { Tooltip, TooltipProps } from \"@heroui/react\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface StyledTooltipProps {\n children: ReactNode;\n content: string | ReactNode;\n tooltipClassName?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n placement?: TooltipProps[\"placement\"];\n showArrow?: boolean;\n closeDelay?: number;\n offset?: number;\n shouldFlip?: boolean;\n}\n\nfunction getTooltipTriggerChild(children: ReactNode) {\n if (React.Children.count(children) === 1 && React.isValidElement(children)) {\n return children;\n }\n return <span className=\"inline-flex\">{children}</span>;\n}\n\nexport function StyledTooltip({\n children,\n content,\n tooltipClassName,\n placement = \"right\",\n showArrow = false,\n closeDelay = 100,\n shouldFlip,\n offset = 7,\n}: StyledTooltipProps) {\n const disableAnimation = import.meta.env.MODE === \"test\";\n\n return (\n <Tooltip\n content={content}\n closeDelay={closeDelay}\n placement={placement}\n offset={offset}\n shouldFlip={shouldFlip}\n className={cn(\"bg-white text-black\", tooltipClassName)}\n showArrow={showArrow}\n disableAnimation={disableAnimation}\n classNames={{\n content: cn(\n \"z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md\",\n \"!bg-white !text-black\",\n tooltipClassName,\n ),\n }}\n >\n {getTooltipTriggerChild(children)}\n </Tooltip>\n );\n}\n"],"mappings":"uPAeA,SAAS,EAAuB,EAAqB,CAInD,OAHI,EAAA,QAAM,SAAS,MAAM,CAAQ,IAAM,GAAK,EAAA,QAAM,eAAe,CAAQ,EAChE,GAEF,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,cAAe,UAAe,CAAA,CACvD,CAEA,SAAgB,EAAc,CAC5B,WACA,UACA,mBACA,YAAY,QACZ,YAAY,GACZ,aAAa,IACb,aACA,SAAS,GACY,CAGrB,OACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CACW,UACG,aACD,YACH,SACI,aACZ,UAAW,EAAA,GAAG,sBAAuB,CAAgB,EAC1C,YACO,iBAAA,GAClB,WAAY,CACV,QAAS,EAAA,GACP,8DACA,wBACA,CACF,CACF,WAEC,EAAuB,CAAQ,CACzB,CAAA,CAEb"}
1
+ {"version":3,"file":"styled-tooltip.cjs","names":[],"sources":["../../../../src/components/shared/buttons/styled-tooltip.tsx"],"sourcesContent":["import { Tooltip, TooltipProps } from \"@heroui/react\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface StyledTooltipProps {\n children: ReactNode;\n content: string | ReactNode;\n tooltipClassName?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n placement?: TooltipProps[\"placement\"];\n showArrow?: boolean;\n closeDelay?: number;\n offset?: number;\n shouldFlip?: boolean;\n isOpen?: TooltipProps[\"isOpen\"];\n}\n\nfunction getTooltipTriggerChild(children: ReactNode) {\n if (React.Children.count(children) === 1 && React.isValidElement(children)) {\n return children;\n }\n return <span className=\"inline-flex\">{children}</span>;\n}\n\nexport function StyledTooltip({\n children,\n content,\n tooltipClassName,\n placement = \"right\",\n showArrow = false,\n closeDelay = 100,\n shouldFlip,\n offset = 7,\n isOpen,\n}: StyledTooltipProps) {\n const disableAnimation = import.meta.env.MODE === \"test\";\n\n return (\n <Tooltip\n content={content}\n closeDelay={closeDelay}\n placement={placement}\n offset={offset}\n shouldFlip={shouldFlip}\n isOpen={isOpen}\n className={cn(\"bg-white text-black\", tooltipClassName)}\n showArrow={showArrow}\n disableAnimation={disableAnimation}\n classNames={{\n content: cn(\n \"z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md\",\n \"!bg-white !text-black\",\n tooltipClassName,\n ),\n }}\n >\n {getTooltipTriggerChild(children)}\n </Tooltip>\n );\n}\n"],"mappings":"uPAgBA,SAAS,EAAuB,EAAqB,CAInD,OAHI,EAAA,QAAM,SAAS,MAAM,CAAQ,IAAM,GAAK,EAAA,QAAM,eAAe,CAAQ,EAChE,GAEF,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,cAAe,UAAe,CAAA,CACvD,CAEA,SAAgB,EAAc,CAC5B,WACA,UACA,mBACA,YAAY,QACZ,YAAY,GACZ,aAAa,IACb,aACA,SAAS,EACT,UACqB,CAGrB,OACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CACW,UACG,aACD,YACH,SACI,aACJ,SACR,UAAW,EAAA,GAAG,sBAAuB,CAAgB,EAC1C,YACO,iBAAA,GAClB,WAAY,CACV,QAAS,EAAA,GACP,8DACA,wBACA,CACF,CACF,WAEC,EAAuB,CAAQ,CACzB,CAAA,CAEb"}
@@ -9,5 +9,6 @@ export interface StyledTooltipProps {
9
9
  closeDelay?: number;
10
10
  offset?: number;
11
11
  shouldFlip?: boolean;
12
+ isOpen?: TooltipProps["isOpen"];
12
13
  }
13
- export declare function StyledTooltip({ children, content, tooltipClassName, placement, showArrow, closeDelay, shouldFlip, offset, }: StyledTooltipProps): React.JSX.Element;
14
+ export declare function StyledTooltip({ children, content, tooltipClassName, placement, showArrow, closeDelay, shouldFlip, offset, isOpen, }: StyledTooltipProps): React.JSX.Element;
@@ -9,13 +9,14 @@ function i(e) {
9
9
  children: e
10
10
  });
11
11
  }
12
- function a({ children: n, content: a, tooltipClassName: o, placement: s = "right", showArrow: c = !1, closeDelay: l = 100, shouldFlip: u, offset: d = 7 }) {
12
+ function a({ children: n, content: a, tooltipClassName: o, placement: s = "right", showArrow: c = !1, closeDelay: l = 100, shouldFlip: u, offset: d = 7, isOpen: f }) {
13
13
  return /* @__PURE__ */ r(t, {
14
14
  content: a,
15
15
  closeDelay: l,
16
16
  placement: s,
17
17
  offset: d,
18
18
  shouldFlip: u,
19
+ isOpen: f,
19
20
  className: e("bg-white text-black", o),
20
21
  showArrow: c,
21
22
  disableAnimation: !1,
@@ -1 +1 @@
1
- {"version":3,"file":"styled-tooltip.js","names":[],"sources":["../../../../src/components/shared/buttons/styled-tooltip.tsx"],"sourcesContent":["import { Tooltip, TooltipProps } from \"@heroui/react\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface StyledTooltipProps {\n children: ReactNode;\n content: string | ReactNode;\n tooltipClassName?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n placement?: TooltipProps[\"placement\"];\n showArrow?: boolean;\n closeDelay?: number;\n offset?: number;\n shouldFlip?: boolean;\n}\n\nfunction getTooltipTriggerChild(children: ReactNode) {\n if (React.Children.count(children) === 1 && React.isValidElement(children)) {\n return children;\n }\n return <span className=\"inline-flex\">{children}</span>;\n}\n\nexport function StyledTooltip({\n children,\n content,\n tooltipClassName,\n placement = \"right\",\n showArrow = false,\n closeDelay = 100,\n shouldFlip,\n offset = 7,\n}: StyledTooltipProps) {\n const disableAnimation = import.meta.env.MODE === \"test\";\n\n return (\n <Tooltip\n content={content}\n closeDelay={closeDelay}\n placement={placement}\n offset={offset}\n shouldFlip={shouldFlip}\n className={cn(\"bg-white text-black\", tooltipClassName)}\n showArrow={showArrow}\n disableAnimation={disableAnimation}\n classNames={{\n content: cn(\n \"z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md\",\n \"!bg-white !text-black\",\n tooltipClassName,\n ),\n }}\n >\n {getTooltipTriggerChild(children)}\n </Tooltip>\n );\n}\n"],"mappings":";;;;;AAeA,SAAS,EAAuB,GAAqB;CAInD,OAHI,EAAM,SAAS,MAAM,CAAQ,MAAM,KAAK,EAAM,eAAe,CAAQ,IAChE,IAEF,kBAAC,QAAD;EAAM,WAAU;EAAe;CAAe,CAAA;AACvD;AAEA,SAAgB,EAAc,EAC5B,aACA,YACA,qBACA,eAAY,SACZ,eAAY,IACZ,gBAAa,KACb,eACA,YAAS,KACY;CAGrB,OACE,kBAAC,GAAD;EACW;EACG;EACD;EACH;EACI;EACZ,WAAW,EAAG,uBAAuB,CAAgB;EAC1C;EACO,kBAAA;EAClB,YAAY,EACV,SAAS,EACP,+DACA,yBACA,CACF,EACF;YAEC,EAAuB,CAAQ;CACzB,CAAA;AAEb"}
1
+ {"version":3,"file":"styled-tooltip.js","names":[],"sources":["../../../../src/components/shared/buttons/styled-tooltip.tsx"],"sourcesContent":["import { Tooltip, TooltipProps } from \"@heroui/react\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface StyledTooltipProps {\n children: ReactNode;\n content: string | ReactNode;\n tooltipClassName?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n placement?: TooltipProps[\"placement\"];\n showArrow?: boolean;\n closeDelay?: number;\n offset?: number;\n shouldFlip?: boolean;\n isOpen?: TooltipProps[\"isOpen\"];\n}\n\nfunction getTooltipTriggerChild(children: ReactNode) {\n if (React.Children.count(children) === 1 && React.isValidElement(children)) {\n return children;\n }\n return <span className=\"inline-flex\">{children}</span>;\n}\n\nexport function StyledTooltip({\n children,\n content,\n tooltipClassName,\n placement = \"right\",\n showArrow = false,\n closeDelay = 100,\n shouldFlip,\n offset = 7,\n isOpen,\n}: StyledTooltipProps) {\n const disableAnimation = import.meta.env.MODE === \"test\";\n\n return (\n <Tooltip\n content={content}\n closeDelay={closeDelay}\n placement={placement}\n offset={offset}\n shouldFlip={shouldFlip}\n isOpen={isOpen}\n className={cn(\"bg-white text-black\", tooltipClassName)}\n showArrow={showArrow}\n disableAnimation={disableAnimation}\n classNames={{\n content: cn(\n \"z-[9999] rounded-md px-2 py-1 text-xs font-medium shadow-md\",\n \"!bg-white !text-black\",\n tooltipClassName,\n ),\n }}\n >\n {getTooltipTriggerChild(children)}\n </Tooltip>\n );\n}\n"],"mappings":";;;;;AAgBA,SAAS,EAAuB,GAAqB;CAInD,OAHI,EAAM,SAAS,MAAM,CAAQ,MAAM,KAAK,EAAM,eAAe,CAAQ,IAChE,IAEF,kBAAC,QAAD;EAAM,WAAU;EAAe;CAAe,CAAA;AACvD;AAEA,SAAgB,EAAc,EAC5B,aACA,YACA,qBACA,eAAY,SACZ,eAAY,IACZ,gBAAa,KACb,eACA,YAAS,GACT,aACqB;CAGrB,OACE,kBAAC,GAAD;EACW;EACG;EACD;EACH;EACI;EACJ;EACR,WAAW,EAAG,uBAAuB,CAAgB;EAC1C;EACO,kBAAA;EAClB,YAAY,EACV,SAAS,EACP,+DACA,yBACA,CACF,EACF;YAEC,EAAuB,CAAQ;CACzB,CAAA;AAEb"}
@@ -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/check.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../utils/dropdown-classes.cjs"),s=require("../../../hooks/use-click-outside-element.cjs");let c=require("react");c=e.__toESM(c,1);let l=require("react/jsx-runtime");function u({testId:e,value:u,onChange:d,options:f,labelKeyByValue:p,labelByValue:m,ariaLabel:h,className:g,fullWidth:_=!1}){let{t:v}=t.useTranslation(`openhands`),[y,b]=c.default.useState(!1),x=s.useClickOutsideElement(()=>b(!1)),S=e=>m?.[e]??(p?v(p[e]):e),C=h??v(n.I18nKey.CONVERSATION_PANEL$FILTER_LABEL),w=f[0],T=S(u);return(0,l.jsxs)(`div`,{ref:x,className:a.cn(`relative shrink-0`,_?`w-full`:`w-auto`,g),"data-testid":e,children:[(0,l.jsxs)(`button`,{type:`button`,"data-testid":`dropdown-trigger`,"aria-haspopup":`menu`,"aria-expanded":y,"aria-label":C,onClick:()=>b(e=>!e),className:a.cn(o.dropdownFilterTriggerClassName,_&&`w-full justify-between`,w&&u!==w&&`border-white/60 bg-white/10`),children:[(0,l.jsx)(`span`,{className:`whitespace-nowrap`,children:T}),(0,l.jsx)(i.ChevronDown,{className:a.cn(`h-4 w-4 shrink-0 text-tertiary-alt transition-transform`,y&&`rotate-180`),"aria-hidden":!0})]}),y?(0,l.jsx)(`div`,{role:`menu`,"data-testid":`${e}-menu`,"aria-label":C,className:a.cn(`absolute right-0 top-full z-50 mt-1 min-w-full w-max`,`max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow`,o.dropdownMenuListClassName),children:f.map(t=>{let n=t===u;return(0,l.jsxs)(`button`,{type:`button`,role:`menuitemradio`,"aria-checked":n,"data-testid":`${e}-${t}`,onClick:()=>{d(t),b(!1)},className:a.cn(o.dropdownMenuRowClassName,n&&`bg-[var(--oh-interactive-selected)]`),children:[(0,l.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:S(t)}),n?(0,l.jsx)(r.Check,{className:`h-4 w-4 shrink-0`,"aria-hidden":!0}):null]},t)})}):null]})}exports.EnumFilterDropdown=u;
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/check.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../utils/dropdown-classes.cjs"),s=require("../../../hooks/use-click-outside-element.cjs");let c=require("react");c=e.__toESM(c,1);let l=require("react/jsx-runtime");function u({testId:e,value:u,onChange:d,options:f,labelKeyByValue:p,labelByValue:m,ariaLabel:h,className:g,triggerClassName:_,fullWidth:v=!1,emphasizeNonDefault:y=!0}){let{t:b}=t.useTranslation(`openhands`),[x,S]=c.default.useState(!1),C=s.useClickOutsideElement(()=>S(!1)),w=e=>m?.[e]??(p?b(p[e]):e),T=h??b(n.I18nKey.CONVERSATION_PANEL$FILTER_LABEL),E=f[0],D=w(u);return(0,l.jsxs)(`div`,{ref:C,className:a.cn(`relative shrink-0`,v?`w-full`:`w-auto`,g),"data-testid":e,children:[(0,l.jsxs)(`button`,{type:`button`,"data-testid":`dropdown-trigger`,"aria-haspopup":`menu`,"aria-expanded":x,"aria-label":T,onClick:()=>S(e=>!e),className:a.cn(o.dropdownFilterTriggerClassName,v&&`w-full justify-between`,y&&E&&u!==E&&`border-white/60 bg-white/10`,_),children:[(0,l.jsx)(`span`,{className:`whitespace-nowrap`,children:D}),(0,l.jsx)(i.ChevronDown,{className:a.cn(`h-4 w-4 shrink-0 text-tertiary-alt transition-transform`,x&&`rotate-180`),"aria-hidden":!0})]}),x?(0,l.jsx)(`div`,{role:`menu`,"data-testid":`${e}-menu`,"aria-label":T,className:a.cn(`absolute right-0 top-full z-50 mt-1 min-w-full w-max`,`max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow`,o.dropdownMenuListClassName),children:f.map(t=>{let n=t===u;return(0,l.jsxs)(`button`,{type:`button`,role:`menuitemradio`,"aria-checked":n,"data-testid":`${e}-${t}`,onClick:()=>{d(t),S(!1)},className:a.cn(o.dropdownMenuRowClassName,n&&`bg-[var(--oh-interactive-selected)]`),children:[(0,l.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:w(t)}),n?(0,l.jsx)(r.Check,{className:`h-4 w-4 shrink-0`,"aria-hidden":!0}):null]},t)})}):null]})}exports.EnumFilterDropdown=u;
2
2
  //# sourceMappingURL=enum-filter-dropdown.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum-filter-dropdown.cjs","names":[],"sources":["../../../../src/components/shared/filters/enum-filter-dropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownFilterTriggerClassName,\n dropdownMenuListClassName,\n dropdownMenuRowClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface EnumFilterDropdownProps<T extends string> {\n testId: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n labelKeyByValue?: Record<T, I18nKey>;\n /** Plain-string labels, e.g. manifest-supplied copy. Wins over the keys. */\n labelByValue?: Record<T, string>;\n ariaLabel?: string;\n className?: string;\n /** Stretch the trigger to the container width, e.g. inside a parent menu. */\n fullWidth?: boolean;\n}\n\nexport function EnumFilterDropdown<T extends string>({\n testId,\n value,\n onChange,\n options,\n labelKeyByValue,\n labelByValue,\n ariaLabel,\n className,\n fullWidth = false,\n}: EnumFilterDropdownProps<T>) {\n const { t } = useTranslation(\"openhands\");\n const [open, setOpen] = React.useState(false);\n const containerRef = useClickOutsideElement<HTMLDivElement>(() =>\n setOpen(false),\n );\n\n const getOptionLabel = (option: T): string =>\n labelByValue?.[option] ??\n (labelKeyByValue ? t(labelKeyByValue[option]) : option);\n const resolvedAriaLabel =\n ariaLabel ?? t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL);\n\n const defaultOption = options[0];\n const selectedLabel = getOptionLabel(value);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative shrink-0\",\n fullWidth ? \"w-full\" : \"w-auto\",\n className,\n )}\n data-testid={testId}\n >\n <button\n type=\"button\"\n data-testid=\"dropdown-trigger\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={resolvedAriaLabel}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n dropdownFilterTriggerClassName,\n fullWidth && \"w-full justify-between\",\n defaultOption &&\n value !== defaultOption &&\n \"border-white/60 bg-white/10\",\n )}\n >\n <span className=\"whitespace-nowrap\">{selectedLabel}</span>\n <ChevronDown\n className={cn(\n \"h-4 w-4 shrink-0 text-tertiary-alt transition-transform\",\n open && \"rotate-180\",\n )}\n aria-hidden\n />\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n data-testid={`${testId}-menu`}\n aria-label={resolvedAriaLabel}\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-full w-max\",\n \"max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow\",\n dropdownMenuListClassName,\n )}\n >\n {options.map((option) => {\n const selected = option === value;\n return (\n <button\n key={option}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n data-testid={`${testId}-${option}`}\n onClick={() => {\n onChange(option);\n setOpen(false);\n }}\n className={cn(\n dropdownMenuRowClassName,\n selected && \"bg-[var(--oh-interactive-selected)]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {getOptionLabel(option)}\n </span>\n {selected ? (\n <Check className=\"h-4 w-4 shrink-0\" aria-hidden />\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"uiBA0BA,SAAgB,EAAqC,CACnD,SACA,QACA,WACA,UACA,kBACA,eACA,YACA,YACA,YAAY,IACiB,CAC7B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAM,GAAW,EAAA,QAAM,SAAS,EAAK,EACtC,EAAe,EAAA,2BACnB,EAAQ,EAAK,CACf,EAEM,EAAkB,GACtB,IAAe,KACd,EAAkB,EAAE,EAAgB,EAAO,EAAI,GAC5C,EACJ,GAAa,EAAE,EAAA,QAAQ,+BAA+B,EAElD,EAAgB,EAAQ,GACxB,EAAgB,EAAe,CAAK,EAE1C,OACE,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,UAAW,EAAA,GACT,oBACA,EAAY,SAAW,SACvB,CACF,EACA,cAAa,WAPf,EASE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,cAAY,mBACZ,gBAAc,OACd,gBAAe,EACf,aAAY,EACZ,YAAe,EAAS,GAAS,CAAC,CAAI,EACtC,UAAW,EAAA,GACT,EAAA,+BACA,GAAa,yBACb,GACE,IAAU,GACV,6BACJ,WAbF,EAeE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,6BAAqB,CAAoB,CAAA,GACzD,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,UAAW,EAAA,GACT,0DACA,GAAQ,YACV,EACA,cAAA,EACD,CAAA,CACK,IAEP,GACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,OACL,cAAa,GAAG,EAAO,OACvB,aAAY,EACZ,UAAW,EAAA,GACT,uDACA,+EACA,EAAA,yBACF,WAEC,EAAQ,IAAK,GAAW,CACvB,IAAM,EAAW,IAAW,EAC5B,OACE,EAAA,EAAA,MAAC,SAAD,CAEE,KAAK,SACL,KAAK,gBACL,eAAc,EACd,cAAa,GAAG,EAAO,GAAG,IAC1B,YAAe,CACb,EAAS,CAAM,EACf,EAAQ,EAAK,CACf,EACA,UAAW,EAAA,GACT,EAAA,yBACA,GAAY,qCACd,WAbF,EAeE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mCACb,EAAe,CAAM,CAClB,CAAA,EACL,GACC,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,mBAAmB,cAAA,EAAa,CAAA,EAC/C,IACE,GApBD,CAoBC,CAEZ,CAAC,CACE,CAAA,EACH,IACD,GAET"}
1
+ {"version":3,"file":"enum-filter-dropdown.cjs","names":[],"sources":["../../../../src/components/shared/filters/enum-filter-dropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownFilterTriggerClassName,\n dropdownMenuListClassName,\n dropdownMenuRowClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface EnumFilterDropdownProps<T extends string> {\n testId: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n labelKeyByValue?: Record<T, I18nKey>;\n /** Plain-string labels, e.g. manifest-supplied copy. Wins over the keys. */\n labelByValue?: Record<T, string>;\n ariaLabel?: string;\n className?: string;\n /** Overrides trigger chip colors, padding, and radius. Menu styles stay shared. */\n triggerClassName?: string;\n /** Stretch the trigger to the container width, e.g. inside a parent menu. */\n fullWidth?: boolean;\n /** Highlight the trigger when the value is not the first option. */\n emphasizeNonDefault?: boolean;\n}\n\nexport function EnumFilterDropdown<T extends string>({\n testId,\n value,\n onChange,\n options,\n labelKeyByValue,\n labelByValue,\n ariaLabel,\n className,\n triggerClassName,\n fullWidth = false,\n emphasizeNonDefault = true,\n}: EnumFilterDropdownProps<T>) {\n const { t } = useTranslation(\"openhands\");\n const [open, setOpen] = React.useState(false);\n const containerRef = useClickOutsideElement<HTMLDivElement>(() =>\n setOpen(false),\n );\n\n const getOptionLabel = (option: T): string =>\n labelByValue?.[option] ??\n (labelKeyByValue ? t(labelKeyByValue[option]) : option);\n const resolvedAriaLabel =\n ariaLabel ?? t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL);\n\n const defaultOption = options[0];\n const selectedLabel = getOptionLabel(value);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative shrink-0\",\n fullWidth ? \"w-full\" : \"w-auto\",\n className,\n )}\n data-testid={testId}\n >\n <button\n type=\"button\"\n data-testid=\"dropdown-trigger\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={resolvedAriaLabel}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n dropdownFilterTriggerClassName,\n fullWidth && \"w-full justify-between\",\n emphasizeNonDefault &&\n defaultOption &&\n value !== defaultOption &&\n \"border-white/60 bg-white/10\",\n triggerClassName,\n )}\n >\n <span className=\"whitespace-nowrap\">{selectedLabel}</span>\n <ChevronDown\n className={cn(\n \"h-4 w-4 shrink-0 text-tertiary-alt transition-transform\",\n open && \"rotate-180\",\n )}\n aria-hidden\n />\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n data-testid={`${testId}-menu`}\n aria-label={resolvedAriaLabel}\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-full w-max\",\n \"max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow\",\n dropdownMenuListClassName,\n )}\n >\n {options.map((option) => {\n const selected = option === value;\n return (\n <button\n key={option}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n data-testid={`${testId}-${option}`}\n onClick={() => {\n onChange(option);\n setOpen(false);\n }}\n className={cn(\n dropdownMenuRowClassName,\n selected && \"bg-[var(--oh-interactive-selected)]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {getOptionLabel(option)}\n </span>\n {selected ? (\n <Check className=\"h-4 w-4 shrink-0\" aria-hidden />\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"uiBA8BA,SAAgB,EAAqC,CACnD,SACA,QACA,WACA,UACA,kBACA,eACA,YACA,YACA,mBACA,YAAY,GACZ,sBAAsB,IACO,CAC7B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAM,GAAW,EAAA,QAAM,SAAS,EAAK,EACtC,EAAe,EAAA,2BACnB,EAAQ,EAAK,CACf,EAEM,EAAkB,GACtB,IAAe,KACd,EAAkB,EAAE,EAAgB,EAAO,EAAI,GAC5C,EACJ,GAAa,EAAE,EAAA,QAAQ,+BAA+B,EAElD,EAAgB,EAAQ,GACxB,EAAgB,EAAe,CAAK,EAE1C,OACE,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,UAAW,EAAA,GACT,oBACA,EAAY,SAAW,SACvB,CACF,EACA,cAAa,WAPf,EASE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,cAAY,mBACZ,gBAAc,OACd,gBAAe,EACf,aAAY,EACZ,YAAe,EAAS,GAAS,CAAC,CAAI,EACtC,UAAW,EAAA,GACT,EAAA,+BACA,GAAa,yBACb,GACE,GACA,IAAU,GACV,8BACF,CACF,WAfF,EAiBE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,6BAAqB,CAAoB,CAAA,GACzD,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,UAAW,EAAA,GACT,0DACA,GAAQ,YACV,EACA,cAAA,EACD,CAAA,CACK,IAEP,GACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,OACL,cAAa,GAAG,EAAO,OACvB,aAAY,EACZ,UAAW,EAAA,GACT,uDACA,+EACA,EAAA,yBACF,WAEC,EAAQ,IAAK,GAAW,CACvB,IAAM,EAAW,IAAW,EAC5B,OACE,EAAA,EAAA,MAAC,SAAD,CAEE,KAAK,SACL,KAAK,gBACL,eAAc,EACd,cAAa,GAAG,EAAO,GAAG,IAC1B,YAAe,CACb,EAAS,CAAM,EACf,EAAQ,EAAK,CACf,EACA,UAAW,EAAA,GACT,EAAA,yBACA,GAAY,qCACd,WAbF,EAeE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mCACb,EAAe,CAAM,CAClB,CAAA,EACL,GACC,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,mBAAmB,cAAA,EAAa,CAAA,EAC/C,IACE,GApBD,CAoBC,CAEZ,CAAC,CACE,CAAA,EACH,IACD,GAET"}
@@ -10,8 +10,12 @@ interface EnumFilterDropdownProps<T extends string> {
10
10
  labelByValue?: Record<T, string>;
11
11
  ariaLabel?: string;
12
12
  className?: string;
13
+ /** Overrides trigger chip colors, padding, and radius. Menu styles stay shared. */
14
+ triggerClassName?: string;
13
15
  /** Stretch the trigger to the container width, e.g. inside a parent menu. */
14
16
  fullWidth?: boolean;
17
+ /** Highlight the trigger when the value is not the first option. */
18
+ emphasizeNonDefault?: boolean;
15
19
  }
16
- export declare function EnumFilterDropdown<T extends string>({ testId, value, onChange, options, labelKeyByValue, labelByValue, ariaLabel, className, fullWidth, }: EnumFilterDropdownProps<T>): React.JSX.Element;
20
+ export declare function EnumFilterDropdown<T extends string>({ testId, value, onChange, options, labelKeyByValue, labelByValue, ariaLabel, className, triggerClassName, fullWidth, emphasizeNonDefault, }: EnumFilterDropdownProps<T>): React.JSX.Element;
17
21
  export {};
@@ -8,31 +8,31 @@ import { useClickOutsideElement as c } from "../../../hooks/use-click-outside-el
8
8
  import l from "react";
9
9
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
10
10
  //#region src/components/shared/filters/enum-filter-dropdown.tsx
11
- function f({ testId: f, value: p, onChange: m, options: h, labelKeyByValue: g, labelByValue: _, ariaLabel: v, className: y, fullWidth: b = !1 }) {
12
- let { t: x } = e("openhands"), [S, C] = l.useState(!1), w = c(() => C(!1)), T = (e) => _?.[e] ?? (g ? x(g[e]) : e), E = v ?? x(t.CONVERSATION_PANEL$FILTER_LABEL), D = h[0], O = T(p);
11
+ function f({ testId: f, value: p, onChange: m, options: h, labelKeyByValue: g, labelByValue: _, ariaLabel: v, className: y, triggerClassName: b, fullWidth: x = !1, emphasizeNonDefault: S = !0 }) {
12
+ let { t: C } = e("openhands"), [w, T] = l.useState(!1), E = c(() => T(!1)), D = (e) => _?.[e] ?? (g ? C(g[e]) : e), O = v ?? C(t.CONVERSATION_PANEL$FILTER_LABEL), k = h[0], A = D(p);
13
13
  return /* @__PURE__ */ d("div", {
14
- ref: w,
15
- className: i("relative shrink-0", b ? "w-full" : "w-auto", y),
14
+ ref: E,
15
+ className: i("relative shrink-0", x ? "w-full" : "w-auto", y),
16
16
  "data-testid": f,
17
17
  children: [/* @__PURE__ */ d("button", {
18
18
  type: "button",
19
19
  "data-testid": "dropdown-trigger",
20
20
  "aria-haspopup": "menu",
21
- "aria-expanded": S,
22
- "aria-label": E,
23
- onClick: () => C((e) => !e),
24
- className: i(a, b && "w-full justify-between", D && p !== D && "border-white/60 bg-white/10"),
21
+ "aria-expanded": w,
22
+ "aria-label": O,
23
+ onClick: () => T((e) => !e),
24
+ className: i(a, x && "w-full justify-between", S && k && p !== k && "border-white/60 bg-white/10", b),
25
25
  children: [/* @__PURE__ */ u("span", {
26
26
  className: "whitespace-nowrap",
27
- children: O
27
+ children: A
28
28
  }), /* @__PURE__ */ u(r, {
29
- className: i("h-4 w-4 shrink-0 text-tertiary-alt transition-transform", S && "rotate-180"),
29
+ className: i("h-4 w-4 shrink-0 text-tertiary-alt transition-transform", w && "rotate-180"),
30
30
  "aria-hidden": !0
31
31
  })]
32
- }), S ? /* @__PURE__ */ u("div", {
32
+ }), w ? /* @__PURE__ */ u("div", {
33
33
  role: "menu",
34
34
  "data-testid": `${f}-menu`,
35
- "aria-label": E,
35
+ "aria-label": O,
36
36
  className: i("absolute right-0 top-full z-50 mt-1 min-w-full w-max", "max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow", o),
37
37
  children: h.map((e) => {
38
38
  let t = e === p;
@@ -42,12 +42,12 @@ function f({ testId: f, value: p, onChange: m, options: h, labelKeyByValue: g, l
42
42
  "aria-checked": t,
43
43
  "data-testid": `${f}-${e}`,
44
44
  onClick: () => {
45
- m(e), C(!1);
45
+ m(e), T(!1);
46
46
  },
47
47
  className: i(s, t && "bg-[var(--oh-interactive-selected)]"),
48
48
  children: [/* @__PURE__ */ u("span", {
49
49
  className: "min-w-0 flex-1 truncate",
50
- children: T(e)
50
+ children: D(e)
51
51
  }), t ? /* @__PURE__ */ u(n, {
52
52
  className: "h-4 w-4 shrink-0",
53
53
  "aria-hidden": !0
@@ -1 +1 @@
1
- {"version":3,"file":"enum-filter-dropdown.js","names":[],"sources":["../../../../src/components/shared/filters/enum-filter-dropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownFilterTriggerClassName,\n dropdownMenuListClassName,\n dropdownMenuRowClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface EnumFilterDropdownProps<T extends string> {\n testId: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n labelKeyByValue?: Record<T, I18nKey>;\n /** Plain-string labels, e.g. manifest-supplied copy. Wins over the keys. */\n labelByValue?: Record<T, string>;\n ariaLabel?: string;\n className?: string;\n /** Stretch the trigger to the container width, e.g. inside a parent menu. */\n fullWidth?: boolean;\n}\n\nexport function EnumFilterDropdown<T extends string>({\n testId,\n value,\n onChange,\n options,\n labelKeyByValue,\n labelByValue,\n ariaLabel,\n className,\n fullWidth = false,\n}: EnumFilterDropdownProps<T>) {\n const { t } = useTranslation(\"openhands\");\n const [open, setOpen] = React.useState(false);\n const containerRef = useClickOutsideElement<HTMLDivElement>(() =>\n setOpen(false),\n );\n\n const getOptionLabel = (option: T): string =>\n labelByValue?.[option] ??\n (labelKeyByValue ? t(labelKeyByValue[option]) : option);\n const resolvedAriaLabel =\n ariaLabel ?? t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL);\n\n const defaultOption = options[0];\n const selectedLabel = getOptionLabel(value);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative shrink-0\",\n fullWidth ? \"w-full\" : \"w-auto\",\n className,\n )}\n data-testid={testId}\n >\n <button\n type=\"button\"\n data-testid=\"dropdown-trigger\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={resolvedAriaLabel}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n dropdownFilterTriggerClassName,\n fullWidth && \"w-full justify-between\",\n defaultOption &&\n value !== defaultOption &&\n \"border-white/60 bg-white/10\",\n )}\n >\n <span className=\"whitespace-nowrap\">{selectedLabel}</span>\n <ChevronDown\n className={cn(\n \"h-4 w-4 shrink-0 text-tertiary-alt transition-transform\",\n open && \"rotate-180\",\n )}\n aria-hidden\n />\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n data-testid={`${testId}-menu`}\n aria-label={resolvedAriaLabel}\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-full w-max\",\n \"max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow\",\n dropdownMenuListClassName,\n )}\n >\n {options.map((option) => {\n const selected = option === value;\n return (\n <button\n key={option}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n data-testid={`${testId}-${option}`}\n onClick={() => {\n onChange(option);\n setOpen(false);\n }}\n className={cn(\n dropdownMenuRowClassName,\n selected && \"bg-[var(--oh-interactive-selected)]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {getOptionLabel(option)}\n </span>\n {selected ? (\n <Check className=\"h-4 w-4 shrink-0\" aria-hidden />\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AA0BA,SAAgB,EAAqC,EACnD,WACA,UACA,aACA,YACA,oBACA,iBACA,cACA,cACA,eAAY,MACiB;CAC7B,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GACtC,IAAe,QACnB,EAAQ,EAAK,CACf,GAEM,KAAkB,MACtB,IAAe,OACd,IAAkB,EAAE,EAAgB,EAAO,IAAI,IAC5C,IACJ,KAAa,EAAE,EAAQ,+BAA+B,GAElD,IAAgB,EAAQ,IACxB,IAAgB,EAAe,CAAK;CAE1C,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,EACT,qBACA,IAAY,WAAW,UACvB,CACF;EACA,eAAa;YAPf,CASE,kBAAC,UAAD;GACE,MAAK;GACL,eAAY;GACZ,iBAAc;GACd,iBAAe;GACf,cAAY;GACZ,eAAe,GAAS,MAAS,CAAC,CAAI;GACtC,WAAW,EACT,GACA,KAAa,0BACb,KACE,MAAU,KACV,6BACJ;aAbF,CAeE,kBAAC,QAAD;IAAM,WAAU;cAAqB;GAAoB,CAAA,GACzD,kBAAC,GAAD;IACE,WAAW,EACT,2DACA,KAAQ,YACV;IACA,eAAA;GACD,CAAA,CACK;MAEP,IACC,kBAAC,OAAD;GACE,MAAK;GACL,eAAa,GAAG,EAAO;GACvB,cAAY;GACZ,WAAW,EACT,wDACA,gFACA,CACF;aAEC,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAW,MAAW;IAC5B,OACE,kBAAC,UAAD;KAEE,MAAK;KACL,MAAK;KACL,gBAAc;KACd,eAAa,GAAG,EAAO,GAAG;KAC1B,eAAe;MAEb,AADA,EAAS,CAAM,GACf,EAAQ,EAAK;KACf;KACA,WAAW,EACT,GACA,KAAY,qCACd;eAbF,CAeE,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAe,CAAM;KAClB,CAAA,GACL,IACC,kBAAC,GAAD;MAAO,WAAU;MAAmB,eAAA;KAAa,CAAA,IAC/C,IACE;OApBD,CAoBC;GAEZ,CAAC;EACE,CAAA,IACH,IACD;;AAET"}
1
+ {"version":3,"file":"enum-filter-dropdown.js","names":[],"sources":["../../../../src/components/shared/filters/enum-filter-dropdown.tsx"],"sourcesContent":["import React from \"react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownFilterTriggerClassName,\n dropdownMenuListClassName,\n dropdownMenuRowClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface EnumFilterDropdownProps<T extends string> {\n testId: string;\n value: T;\n onChange: (value: T) => void;\n options: readonly T[];\n labelKeyByValue?: Record<T, I18nKey>;\n /** Plain-string labels, e.g. manifest-supplied copy. Wins over the keys. */\n labelByValue?: Record<T, string>;\n ariaLabel?: string;\n className?: string;\n /** Overrides trigger chip colors, padding, and radius. Menu styles stay shared. */\n triggerClassName?: string;\n /** Stretch the trigger to the container width, e.g. inside a parent menu. */\n fullWidth?: boolean;\n /** Highlight the trigger when the value is not the first option. */\n emphasizeNonDefault?: boolean;\n}\n\nexport function EnumFilterDropdown<T extends string>({\n testId,\n value,\n onChange,\n options,\n labelKeyByValue,\n labelByValue,\n ariaLabel,\n className,\n triggerClassName,\n fullWidth = false,\n emphasizeNonDefault = true,\n}: EnumFilterDropdownProps<T>) {\n const { t } = useTranslation(\"openhands\");\n const [open, setOpen] = React.useState(false);\n const containerRef = useClickOutsideElement<HTMLDivElement>(() =>\n setOpen(false),\n );\n\n const getOptionLabel = (option: T): string =>\n labelByValue?.[option] ??\n (labelKeyByValue ? t(labelKeyByValue[option]) : option);\n const resolvedAriaLabel =\n ariaLabel ?? t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL);\n\n const defaultOption = options[0];\n const selectedLabel = getOptionLabel(value);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative shrink-0\",\n fullWidth ? \"w-full\" : \"w-auto\",\n className,\n )}\n data-testid={testId}\n >\n <button\n type=\"button\"\n data-testid=\"dropdown-trigger\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={resolvedAriaLabel}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n dropdownFilterTriggerClassName,\n fullWidth && \"w-full justify-between\",\n emphasizeNonDefault &&\n defaultOption &&\n value !== defaultOption &&\n \"border-white/60 bg-white/10\",\n triggerClassName,\n )}\n >\n <span className=\"whitespace-nowrap\">{selectedLabel}</span>\n <ChevronDown\n className={cn(\n \"h-4 w-4 shrink-0 text-tertiary-alt transition-transform\",\n open && \"rotate-180\",\n )}\n aria-hidden\n />\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n data-testid={`${testId}-menu`}\n aria-label={resolvedAriaLabel}\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-full w-max\",\n \"max-h-60 overflow-auto rounded-[6px] bg-tertiary p-1 context-menu-box-shadow\",\n dropdownMenuListClassName,\n )}\n >\n {options.map((option) => {\n const selected = option === value;\n return (\n <button\n key={option}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n data-testid={`${testId}-${option}`}\n onClick={() => {\n onChange(option);\n setOpen(false);\n }}\n className={cn(\n dropdownMenuRowClassName,\n selected && \"bg-[var(--oh-interactive-selected)]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {getOptionLabel(option)}\n </span>\n {selected ? (\n <Check className=\"h-4 w-4 shrink-0\" aria-hidden />\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAgB,EAAqC,EACnD,WACA,UACA,aACA,YACA,oBACA,iBACA,cACA,cACA,qBACA,eAAY,IACZ,yBAAsB,MACO;CAC7B,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GACtC,IAAe,QACnB,EAAQ,EAAK,CACf,GAEM,KAAkB,MACtB,IAAe,OACd,IAAkB,EAAE,EAAgB,EAAO,IAAI,IAC5C,IACJ,KAAa,EAAE,EAAQ,+BAA+B,GAElD,IAAgB,EAAQ,IACxB,IAAgB,EAAe,CAAK;CAE1C,OACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,EACT,qBACA,IAAY,WAAW,UACvB,CACF;EACA,eAAa;YAPf,CASE,kBAAC,UAAD;GACE,MAAK;GACL,eAAY;GACZ,iBAAc;GACd,iBAAe;GACf,cAAY;GACZ,eAAe,GAAS,MAAS,CAAC,CAAI;GACtC,WAAW,EACT,GACA,KAAa,0BACb,KACE,KACA,MAAU,KACV,+BACF,CACF;aAfF,CAiBE,kBAAC,QAAD;IAAM,WAAU;cAAqB;GAAoB,CAAA,GACzD,kBAAC,GAAD;IACE,WAAW,EACT,2DACA,KAAQ,YACV;IACA,eAAA;GACD,CAAA,CACK;MAEP,IACC,kBAAC,OAAD;GACE,MAAK;GACL,eAAa,GAAG,EAAO;GACvB,cAAY;GACZ,WAAW,EACT,wDACA,gFACA,CACF;aAEC,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAW,MAAW;IAC5B,OACE,kBAAC,UAAD;KAEE,MAAK;KACL,MAAK;KACL,gBAAc;KACd,eAAa,GAAG,EAAO,GAAG;KAC1B,eAAe;MAEb,AADA,EAAS,CAAM,GACf,EAAQ,EAAK;KACf;KACA,WAAW,EACT,GACA,KAAY,qCACd;eAbF,CAeE,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAe,CAAM;KAClB,CAAA,GACL,IACC,kBAAC,GAAD;MAAO,WAAU;MAAmB,eAAA;KAAa,CAAA,IAC/C,IACE;OApBD,CAoBC;GAEZ,CAAC;EACE,CAAA,IACH,IACD;;AAET"}
@@ -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
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./modal-backdrop.cjs"),r=require("../../features/settings/brand-button.cjs");let i=require("react/jsx-runtime");function a({text:a,onConfirm:o,onCancel:s,isConfirming:c=!1}){let{t:l}=e.useTranslation(`openhands`);return(0,i.jsx)(n.ModalBackdrop,{onClose:c?void 0:s,closeOnEscape:!c,children:(0,i.jsxs)(`div`,{"data-testid":`confirmation-modal`,className:`bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,children:[(0,i.jsx)(`p`,{children:a}),(0,i.jsxs)(`div`,{className:`w-full flex justify-end gap-2`,children:[(0,i.jsx)(r.BrandButton,{testId:`cancel-button`,type:`button`,onClick:s,variant:`secondary`,isDisabled:c,children:l(t.I18nKey.BUTTON$CANCEL)}),(0,i.jsx)(r.BrandButton,{testId:`confirm-button`,type:`button`,onClick:o,variant:`primary`,isDisabled:c,children:l(t.I18nKey.BUTTON$CONFIRM)})]})]})})}exports.ConfirmationModal=a;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./modal-backdrop.cjs"),r=require("../../features/settings/brand-button.cjs");let i=require("react/jsx-runtime");function a({text:a,onConfirm:o,onCancel:s,confirmText:c,isConfirming:l=!1}){let{t:u}=e.useTranslation(`openhands`);return(0,i.jsx)(n.ModalBackdrop,{onClose:l?void 0:s,closeOnEscape:!l,children:(0,i.jsxs)(`div`,{"data-testid":`confirmation-modal`,className:`bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,children:[(0,i.jsx)(`p`,{children:a}),(0,i.jsxs)(`div`,{className:`w-full flex justify-end gap-2`,children:[(0,i.jsx)(r.BrandButton,{testId:`cancel-button`,type:`button`,onClick:s,variant:`secondary`,isDisabled:l,children:u(t.I18nKey.BUTTON$CANCEL)}),(0,i.jsx)(r.BrandButton,{testId:`confirm-button`,type:`button`,onClick:o,variant:`primary`,isDisabled:l,children:c??u(t.I18nKey.BUTTON$CONFIRM)})]})]})})}exports.ConfirmationModal=a;
2
2
  //# sourceMappingURL=confirmation-modal.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmation-modal.cjs","names":[],"sources":["../../../../src/components/shared/modals/confirmation-modal.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ModalBackdrop } from \"./modal-backdrop\";\n\ninterface ConfirmationModalProps {\n text: string;\n onConfirm: () => void;\n onCancel: () => void;\n /**\n * Disables both action buttons while an asynchronous confirm\n * mutation is in flight. Defaults to false to preserve existing\n * call sites that don't track mutation state.\n */\n isConfirming?: boolean;\n}\n\nexport function ConfirmationModal({\n text,\n onConfirm,\n onCancel,\n isConfirming = false,\n}: ConfirmationModalProps) {\n const { t } = useTranslation(\"openhands\");\n // Suppress the backdrop's click / Escape close handler while the\n // confirm mutation is in flight; otherwise the user could dismiss\n // the modal mid-request and never see the result (the buttons are\n // already disabled, but the backdrop wasn't).\n return (\n <ModalBackdrop\n onClose={isConfirming ? undefined : onCancel}\n closeOnEscape={!isConfirming}\n >\n <div\n data-testid=\"confirmation-modal\"\n className=\"bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]\"\n >\n <p>{text}</p>\n <div className=\"w-full flex justify-end gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n onClick={onCancel}\n variant=\"secondary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n testId=\"confirm-button\"\n type=\"button\"\n onClick={onConfirm}\n variant=\"primary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CONFIRM)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":"2SAiBA,SAAgB,EAAkB,CAChC,OACA,YACA,WACA,eAAe,IACU,CACzB,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAKxC,OACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,QAAS,EAAe,IAAA,GAAY,EACpC,cAAe,CAAC,YAEhB,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,qBACZ,UAAU,iGAFZ,EAIE,EAAA,EAAA,KAAC,IAAD,CAAA,SAAI,CAAQ,CAAA,GACZ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yCAAf,EACE,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,gBACP,KAAK,SACL,QAAS,EACT,QAAQ,YACR,WAAY,WAEX,EAAE,EAAA,QAAQ,aAAa,CACb,CAAA,GACb,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,iBACP,KAAK,SACL,QAAS,EACT,QAAQ,UACR,WAAY,WAEX,EAAE,EAAA,QAAQ,cAAc,CACd,CAAA,CACV,GACF,GACQ,CAAA,CAEnB"}
1
+ {"version":3,"file":"confirmation-modal.cjs","names":[],"sources":["../../../../src/components/shared/modals/confirmation-modal.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ModalBackdrop } from \"./modal-backdrop\";\n\ninterface ConfirmationModalProps {\n text: string;\n onConfirm: () => void;\n onCancel: () => void;\n confirmText?: string;\n /**\n * Disables both action buttons while an asynchronous confirm\n * mutation is in flight. Defaults to false to preserve existing\n * call sites that don't track mutation state.\n */\n isConfirming?: boolean;\n}\n\nexport function ConfirmationModal({\n text,\n onConfirm,\n onCancel,\n confirmText,\n isConfirming = false,\n}: ConfirmationModalProps) {\n const { t } = useTranslation(\"openhands\");\n // Suppress the backdrop's click / Escape close handler while the\n // confirm mutation is in flight; otherwise the user could dismiss\n // the modal mid-request and never see the result (the buttons are\n // already disabled, but the backdrop wasn't).\n return (\n <ModalBackdrop\n onClose={isConfirming ? undefined : onCancel}\n closeOnEscape={!isConfirming}\n >\n <div\n data-testid=\"confirmation-modal\"\n className=\"bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]\"\n >\n <p>{text}</p>\n <div className=\"w-full flex justify-end gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n onClick={onCancel}\n variant=\"secondary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n testId=\"confirm-button\"\n type=\"button\"\n onClick={onConfirm}\n variant=\"primary\"\n isDisabled={isConfirming}\n >\n {confirmText ?? t(I18nKey.BUTTON$CONFIRM)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":"2SAkBA,SAAgB,EAAkB,CAChC,OACA,YACA,WACA,cACA,eAAe,IACU,CACzB,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAKxC,OACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,QAAS,EAAe,IAAA,GAAY,EACpC,cAAe,CAAC,YAEhB,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,qBACZ,UAAU,iGAFZ,EAIE,EAAA,EAAA,KAAC,IAAD,CAAA,SAAI,CAAQ,CAAA,GACZ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yCAAf,EACE,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,gBACP,KAAK,SACL,QAAS,EACT,QAAQ,YACR,WAAY,WAEX,EAAE,EAAA,QAAQ,aAAa,CACb,CAAA,GACb,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,iBACP,KAAK,SACL,QAAS,EACT,QAAQ,UACR,WAAY,WAEX,GAAe,EAAE,EAAA,QAAQ,cAAc,CAC7B,CAAA,CACV,GACF,GACQ,CAAA,CAEnB"}
@@ -2,6 +2,7 @@ interface ConfirmationModalProps {
2
2
  text: string;
3
3
  onConfirm: () => void;
4
4
  onCancel: () => void;
5
+ confirmText?: string;
5
6
  /**
6
7
  * Disables both action buttons while an asynchronous confirm
7
8
  * mutation is in flight. Defaults to false to preserve existing
@@ -9,5 +10,5 @@ interface ConfirmationModalProps {
9
10
  */
10
11
  isConfirming?: boolean;
11
12
  }
12
- export declare function ConfirmationModal({ text, onConfirm, onCancel, isConfirming, }: ConfirmationModalProps): import("react").JSX.Element;
13
+ export declare function ConfirmationModal({ text, onConfirm, onCancel, confirmText, isConfirming, }: ConfirmationModalProps): import("react").JSX.Element;
13
14
  export {};
@@ -4,11 +4,11 @@ import { ModalBackdrop as n } from "./modal-backdrop.js";
4
4
  import { BrandButton as r } from "../../features/settings/brand-button.js";
5
5
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
6
  //#region src/components/shared/modals/confirmation-modal.tsx
7
- function o({ text: o, onConfirm: s, onCancel: c, isConfirming: l = !1 }) {
8
- let { t: u } = e("openhands");
7
+ function o({ text: o, onConfirm: s, onCancel: c, confirmText: l, isConfirming: u = !1 }) {
8
+ let { t: d } = e("openhands");
9
9
  return /* @__PURE__ */ i(n, {
10
- onClose: l ? void 0 : c,
11
- closeOnEscape: !l,
10
+ onClose: u ? void 0 : c,
11
+ closeOnEscape: !u,
12
12
  children: /* @__PURE__ */ a("div", {
13
13
  "data-testid": "confirmation-modal",
14
14
  className: "bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]",
@@ -19,15 +19,15 @@ function o({ text: o, onConfirm: s, onCancel: c, isConfirming: l = !1 }) {
19
19
  type: "button",
20
20
  onClick: c,
21
21
  variant: "secondary",
22
- isDisabled: l,
23
- children: u(t.BUTTON$CANCEL)
22
+ isDisabled: u,
23
+ children: d(t.BUTTON$CANCEL)
24
24
  }), /* @__PURE__ */ i(r, {
25
25
  testId: "confirm-button",
26
26
  type: "button",
27
27
  onClick: s,
28
28
  variant: "primary",
29
- isDisabled: l,
30
- children: u(t.BUTTON$CONFIRM)
29
+ isDisabled: u,
30
+ children: l ?? d(t.BUTTON$CONFIRM)
31
31
  })]
32
32
  })]
33
33
  })
@@ -1 +1 @@
1
- {"version":3,"file":"confirmation-modal.js","names":[],"sources":["../../../../src/components/shared/modals/confirmation-modal.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ModalBackdrop } from \"./modal-backdrop\";\n\ninterface ConfirmationModalProps {\n text: string;\n onConfirm: () => void;\n onCancel: () => void;\n /**\n * Disables both action buttons while an asynchronous confirm\n * mutation is in flight. Defaults to false to preserve existing\n * call sites that don't track mutation state.\n */\n isConfirming?: boolean;\n}\n\nexport function ConfirmationModal({\n text,\n onConfirm,\n onCancel,\n isConfirming = false,\n}: ConfirmationModalProps) {\n const { t } = useTranslation(\"openhands\");\n // Suppress the backdrop's click / Escape close handler while the\n // confirm mutation is in flight; otherwise the user could dismiss\n // the modal mid-request and never see the result (the buttons are\n // already disabled, but the backdrop wasn't).\n return (\n <ModalBackdrop\n onClose={isConfirming ? undefined : onCancel}\n closeOnEscape={!isConfirming}\n >\n <div\n data-testid=\"confirmation-modal\"\n className=\"bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]\"\n >\n <p>{text}</p>\n <div className=\"w-full flex justify-end gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n onClick={onCancel}\n variant=\"secondary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n testId=\"confirm-button\"\n type=\"button\"\n onClick={onConfirm}\n variant=\"primary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CONFIRM)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,EAAkB,EAChC,SACA,cACA,aACA,kBAAe,MACU;CACzB,IAAM,EAAE,SAAM,EAAe,WAAW;CAKxC,OACE,kBAAC,GAAD;EACE,SAAS,IAAe,KAAA,IAAY;EACpC,eAAe,CAAC;YAEhB,kBAAC,OAAD;GACE,eAAY;GACZ,WAAU;aAFZ,CAIE,kBAAC,KAAD,EAAA,UAAI,EAAQ,CAAA,GACZ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAS;KACT,SAAQ;KACR,YAAY;eAEX,EAAE,EAAQ,aAAa;IACb,CAAA,GACb,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAS;KACT,SAAQ;KACR,YAAY;eAEX,EAAE,EAAQ,cAAc;IACd,CAAA,CACV;KACF;;CACQ,CAAA;AAEnB"}
1
+ {"version":3,"file":"confirmation-modal.js","names":[],"sources":["../../../../src/components/shared/modals/confirmation-modal.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ModalBackdrop } from \"./modal-backdrop\";\n\ninterface ConfirmationModalProps {\n text: string;\n onConfirm: () => void;\n onCancel: () => void;\n confirmText?: string;\n /**\n * Disables both action buttons while an asynchronous confirm\n * mutation is in flight. Defaults to false to preserve existing\n * call sites that don't track mutation state.\n */\n isConfirming?: boolean;\n}\n\nexport function ConfirmationModal({\n text,\n onConfirm,\n onCancel,\n confirmText,\n isConfirming = false,\n}: ConfirmationModalProps) {\n const { t } = useTranslation(\"openhands\");\n // Suppress the backdrop's click / Escape close handler while the\n // confirm mutation is in flight; otherwise the user could dismiss\n // the modal mid-request and never see the result (the buttons are\n // already disabled, but the backdrop wasn't).\n return (\n <ModalBackdrop\n onClose={isConfirming ? undefined : onCancel}\n closeOnEscape={!isConfirming}\n >\n <div\n data-testid=\"confirmation-modal\"\n className=\"bg-base-secondary p-4 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]\"\n >\n <p>{text}</p>\n <div className=\"w-full flex justify-end gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n onClick={onCancel}\n variant=\"secondary\"\n isDisabled={isConfirming}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n testId=\"confirm-button\"\n type=\"button\"\n onClick={onConfirm}\n variant=\"primary\"\n isDisabled={isConfirming}\n >\n {confirmText ?? t(I18nKey.BUTTON$CONFIRM)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,EAAkB,EAChC,SACA,cACA,aACA,gBACA,kBAAe,MACU;CACzB,IAAM,EAAE,SAAM,EAAe,WAAW;CAKxC,OACE,kBAAC,GAAD;EACE,SAAS,IAAe,KAAA,IAAY;EACpC,eAAe,CAAC;YAEhB,kBAAC,OAAD;GACE,eAAY;GACZ,WAAU;aAFZ,CAIE,kBAAC,KAAD,EAAA,UAAI,EAAQ,CAAA,GACZ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAS;KACT,SAAQ;KACR,YAAY;eAEX,EAAE,EAAQ,aAAa;IACb,CAAA,GACb,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAS;KACT,SAAQ;KACR,YAAY;eAEX,KAAe,EAAE,EAAQ,cAAc;IAC7B,CAAA,CACV;KACF;;CACQ,CAAA;AAEnB"}
@@ -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("../../../../utils/form-control-classes.cjs"),s=require("../../../../utils/format-model-name.cjs"),c=require("../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.cjs"),l=require("../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.cjs"),u=require("../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.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:s.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=s.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)(u.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:o.formControlSettingsFieldClassName}},children:[(0,v.jsx)(l.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:P.map(e=>(0,v.jsx)(c.listbox_item_base_default,{"data-testid":`provider-item-${e.name}`,children:f.mapProvider(e.name)},e.name))}),F.length>0?(0,v.jsx)(l.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:F.map(e=>(0,v.jsx)(c.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)(u.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:o.formControlSettingsFieldClassName}},children:[(0,v.jsx)(l.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:I.map(e=>(0,v.jsx)(c.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}),s.isFreeOpenHandsModel(`${E}/${e.name}`)?(0,v.jsx)(`span`,{className:y,children:s.FREE_MODEL_BADGE_LABEL}):null]})},e.name))}),L.length>0?(0,v.jsx)(l.listbox_section_base_default,{title:G(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:L.map(e=>(0,v.jsx)(c.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:s.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
@@ -1 +1 @@
1
- {"version":3,"file":"model-selector.cjs","names":[],"sources":["../../../../../src/components/shared/modals/settings/model-selector.tsx"],"sourcesContent":["import {\n Autocomplete,\n AutocompleteItem,\n AutocompleteSection,\n} from \"@heroui/react\";\nimport { Info } from \"lucide-react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { mapProvider } from \"#/utils/map-provider\";\nimport { extractModelAndProvider } from \"#/utils/extract-model-and-provider\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlSettingsFieldClassName } from \"#/utils/form-control-classes\";\nimport { heroUiAutocompleteSelectorButtonClassName } from \"#/ui/combobox-caret\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { PRODUCT_URL } from \"#/utils/constants\";\nimport { useSearchProviders } from \"#/hooks/query/use-search-providers\";\nimport { useProviderModels } from \"#/hooks/query/use-provider-models\";\nimport {\n FREE_MODEL_BADGE_LABEL,\n FREE_OPENHANDS_MODEL_NOTE,\n isFreeOpenHandsModel,\n} from \"#/utils/format-model-name\";\n\nconst freeModelBadgeClassName =\n \"shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning\";\n\nfunction FreeOpenHandsModelsNote() {\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>{FREE_OPENHANDS_MODEL_NOTE}</span>\n </p>\n );\n}\n\ninterface ModelSelectorProps {\n isDisabled?: boolean;\n currentModel?: string;\n onChange?: (provider: string | null, model: string | null) => void;\n onDefaultValuesChanged?: (\n provider: string | null,\n model: string | null,\n ) => void;\n wrapperClassName?: string;\n labelClassName?: string;\n}\n\nexport function ModelSelector({\n isDisabled,\n currentModel,\n onChange,\n onDefaultValuesChanged,\n wrapperClassName,\n labelClassName,\n}: ModelSelectorProps) {\n const [, setLitellmId] = React.useState<string | null>(null);\n const [selectedProvider, setSelectedProvider] = React.useState<string | null>(\n null,\n );\n const [selectedModel, setSelectedModel] = React.useState<string | null>(null);\n\n const { data: providers = [] } = useSearchProviders();\n const {\n data: providerModels = [],\n isLoading: isLoadingModels,\n error: modelsError,\n } = useProviderModels(selectedProvider);\n\n const verifiedProviders = React.useMemo(\n () => providers.filter((p) => p.verified),\n [providers],\n );\n const unverifiedProviders = React.useMemo(\n () => providers.filter((p) => !p.verified),\n [providers],\n );\n\n const verifiedModels = React.useMemo(\n () => providerModels.filter((m) => m.verified),\n [providerModels],\n );\n const unverifiedModels = React.useMemo(\n () => providerModels.filter((m) => !m.verified),\n [providerModels],\n );\n\n React.useEffect(() => {\n if (currentModel) {\n const { provider, model } = extractModelAndProvider(currentModel);\n\n setLitellmId(currentModel);\n setSelectedProvider(provider || null);\n setSelectedModel(model);\n onDefaultValuesChanged?.(provider || null, model);\n }\n }, [currentModel]);\n\n const handleChangeProvider = (provider: string) => {\n setSelectedProvider(provider);\n setSelectedModel(null);\n setLitellmId(`${provider}/`);\n onChange?.(provider, null);\n };\n\n const handleChangeModel = (model: string) => {\n let fullModel = `${selectedProvider}/${model}`;\n if (selectedProvider === \"openai\") {\n fullModel = model;\n }\n setLitellmId(fullModel);\n setSelectedModel(model);\n onChange?.(selectedProvider, model);\n };\n\n const clear = () => {\n setSelectedProvider(null);\n setLitellmId(null);\n };\n\n const selectedFullModel =\n selectedProvider && selectedModel\n ? `${selectedProvider}/${selectedModel}`\n : null;\n const isSelectedModelFree = isFreeOpenHandsModel(selectedFullModel);\n const selectedModelMeasureRef = React.useRef<HTMLSpanElement>(null);\n const [selectedModelTextWidth, setSelectedModelTextWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n if (!isSelectedModelFree || !selectedModelMeasureRef.current) {\n setSelectedModelTextWidth(0);\n return undefined;\n }\n\n const measureSelectedModel = () => {\n setSelectedModelTextWidth(\n Math.ceil(\n selectedModelMeasureRef.current?.getBoundingClientRect().width ?? 0,\n ),\n );\n };\n measureSelectedModel();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(measureSelectedModel);\n observer.observe(selectedModelMeasureRef.current);\n return () => observer.disconnect();\n }, [isSelectedModelFree, selectedModel]);\n\n const { t } = useTranslation(\"openhands\");\n\n return (\n <div\n className={cn(\n \"flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]\",\n wrapperClassName,\n )}\n >\n <fieldset className=\"flex flex-col gap-2.5 w-full\">\n <label className={cn(\"text-sm\", labelClassName)}>\n {t(I18nKey.LLM$PROVIDER)}\n </label>\n <Autocomplete\n data-testid=\"llm-provider-input\"\n isRequired\n isVirtualized={false}\n name=\"llm-provider-input\"\n isDisabled={isDisabled}\n aria-label={t(I18nKey.LLM$PROVIDER)}\n isClearable={false}\n onSelectionChange={(e) => {\n if (e?.toString()) handleChangeProvider(e.toString());\n }}\n onInputChange={(value) => !value && clear()}\n defaultSelectedKey={selectedProvider ?? undefined}\n selectedKey={selectedProvider}\n classNames={{\n popoverContent:\n \"bg-content1 rounded-xl border border-[var(--oh-border)]\",\n selectorButton: heroUiAutocompleteSelectorButtonClassName,\n }}\n selectorButtonProps={{ disableRipple: true }}\n inputProps={{\n classNames: {\n inputWrapper: formControlSettingsFieldClassName,\n },\n }}\n >\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$VERIFIED)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {verifiedProviders.map((provider) => (\n <AutocompleteItem\n data-testid={`provider-item-${provider.name}`}\n key={provider.name}\n >\n {mapProvider(provider.name)}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n {unverifiedProviders.length > 0 ? (\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$OTHERS)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {unverifiedProviders.map((provider) => (\n <AutocompleteItem key={provider.name}>\n {mapProvider(provider.name)}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n </fieldset>\n\n {selectedProvider === \"openhands\" && (\n <div className=\"flex flex-col gap-2\">\n <HelpLink\n testId=\"openhands-account-help\"\n text={t(I18nKey.SETTINGS$NEED_OPENHANDS_ACCOUNT)}\n linkText={t(I18nKey.SETTINGS$CLICK_HERE)}\n href={PRODUCT_URL.PRODUCTION}\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n )}\n\n <fieldset className=\"flex flex-col gap-2.5 w-full\">\n <label className={cn(\"text-sm\", labelClassName)}>\n {t(I18nKey.LLM$MODEL)}\n </label>\n <div className=\"relative\">\n <Autocomplete\n data-testid=\"llm-model-input\"\n isRequired\n isVirtualized={false}\n isLoading={isLoadingModels}\n name=\"llm-model-input\"\n aria-label={t(I18nKey.LLM$MODEL)}\n isClearable={false}\n onSelectionChange={(e) => {\n if (e?.toString()) handleChangeModel(e.toString());\n }}\n isDisabled={isDisabled || !selectedProvider}\n selectedKey={selectedModel}\n defaultSelectedKey={selectedModel ?? undefined}\n classNames={{\n popoverContent:\n \"bg-content1 rounded-xl border border-[var(--oh-border)]\",\n selectorButton: heroUiAutocompleteSelectorButtonClassName,\n }}\n selectorButtonProps={{ disableRipple: true }}\n inputProps={{\n classNames: {\n inputWrapper: formControlSettingsFieldClassName,\n },\n }}\n >\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$VERIFIED)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {verifiedModels.map((model) => (\n <AutocompleteItem key={model.name} textValue={model.name}>\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate\">{model.name}</span>\n {isFreeOpenHandsModel(\n `${selectedProvider}/${model.name}`,\n ) ? (\n <span className={freeModelBadgeClassName}>\n {FREE_MODEL_BADGE_LABEL}\n </span>\n ) : null}\n </span>\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n {unverifiedModels.length > 0 ? (\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$OTHERS)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {unverifiedModels.map((model) => (\n <AutocompleteItem\n data-testid={`model-item-${model.name}`}\n key={model.name}\n textValue={model.name}\n >\n {model.name}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n {isSelectedModelFree && selectedModel ? (\n <>\n <span\n ref={selectedModelMeasureRef}\n className=\"pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0\"\n aria-hidden\n >\n {selectedModel}\n </span>\n <span\n data-testid=\"selected-free-model-badge\"\n className={cn(\n freeModelBadgeClassName,\n \"pointer-events-none absolute top-1/2 z-10 -translate-y-1/2\",\n )}\n style={{\n left: `calc(0.75rem + ${selectedModelTextWidth}px + 0.5rem)`,\n }}\n >\n {FREE_MODEL_BADGE_LABEL}\n </span>\n </>\n ) : null}\n </div>\n {modelsError && (\n <p data-testid=\"models-error\" className=\"text-danger text-xs\">\n {t(I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}\n </p>\n )}\n {selectedProvider === \"openhands\" ? <FreeOpenHandsModelsNote /> : null}\n </fieldset>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model-selector.cjs","names":[],"sources":["../../../../../src/components/shared/modals/settings/model-selector.tsx"],"sourcesContent":["import {\n Autocomplete,\n AutocompleteItem,\n AutocompleteSection,\n} from \"@heroui/react\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { mapProvider } from \"#/utils/map-provider\";\nimport { extractModelAndProvider } from \"#/utils/extract-model-and-provider\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlSettingsFieldClassName } from \"#/utils/form-control-classes\";\nimport { heroUiAutocompleteSelectorButtonClassName } from \"#/ui/combobox-caret\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { PRODUCT_URL } from \"#/utils/constants\";\nimport { useSearchProviders } from \"#/hooks/query/use-search-providers\";\nimport { useProviderModels } from \"#/hooks/query/use-provider-models\";\nimport { FREE_MODEL_BADGE_LABEL } from \"#/utils/format-model-name\";\nimport { FreeOpenHandsModelsNote } from \"#/components/shared/free-models-note\";\n\nconst freeModelBadgeClassName =\n \"shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning\";\n\ninterface ModelSelectorProps {\n isDisabled?: boolean;\n currentModel?: string;\n onChange?: (provider: string | null, model: string | null) => void;\n onDefaultValuesChanged?: (\n provider: string | null,\n model: string | null,\n ) => void;\n wrapperClassName?: string;\n labelClassName?: string;\n}\n\nexport function ModelSelector({\n isDisabled,\n currentModel,\n onChange,\n onDefaultValuesChanged,\n wrapperClassName,\n labelClassName,\n}: ModelSelectorProps) {\n const [, setLitellmId] = React.useState<string | null>(null);\n const [selectedProvider, setSelectedProvider] = React.useState<string | null>(\n null,\n );\n const [selectedModel, setSelectedModel] = React.useState<string | null>(null);\n\n const { data: providers = [] } = useSearchProviders();\n const {\n data: providerModels = [],\n isLoading: isLoadingModels,\n error: modelsError,\n } = useProviderModels(selectedProvider);\n\n const verifiedProviders = React.useMemo(\n () => providers.filter((p) => p.verified),\n [providers],\n );\n const unverifiedProviders = React.useMemo(\n () => providers.filter((p) => !p.verified),\n [providers],\n );\n\n const verifiedModels = React.useMemo(\n () => providerModels.filter((m) => m.verified),\n [providerModels],\n );\n const unverifiedModels = React.useMemo(\n () => providerModels.filter((m) => !m.verified),\n [providerModels],\n );\n\n // DB-driven set of free model names for the selected provider. Mirrors the\n // `verified` flag: the frontend no longer hardcodes which models are free.\n const freeModelNames = React.useMemo(\n () => providerModels.filter((m) => m.free).map((m) => m.name),\n [providerModels],\n );\n const freeModelNameSet = React.useMemo(\n () => new Set(freeModelNames),\n [freeModelNames],\n );\n\n React.useEffect(() => {\n if (currentModel) {\n const { provider, model } = extractModelAndProvider(currentModel);\n\n setLitellmId(currentModel);\n setSelectedProvider(provider || null);\n setSelectedModel(model);\n onDefaultValuesChanged?.(provider || null, model);\n }\n }, [currentModel]);\n\n const handleChangeProvider = (provider: string) => {\n setSelectedProvider(provider);\n setSelectedModel(null);\n setLitellmId(`${provider}/`);\n onChange?.(provider, null);\n };\n\n const handleChangeModel = (model: string) => {\n let fullModel = `${selectedProvider}/${model}`;\n if (selectedProvider === \"openai\") {\n fullModel = model;\n }\n setLitellmId(fullModel);\n setSelectedModel(model);\n onChange?.(selectedProvider, model);\n };\n\n const clear = () => {\n setSelectedProvider(null);\n setLitellmId(null);\n };\n\n const isSelectedModelFree = Boolean(\n selectedModel && freeModelNameSet.has(selectedModel),\n );\n const selectedModelMeasureRef = React.useRef<HTMLSpanElement>(null);\n const [selectedModelTextWidth, setSelectedModelTextWidth] = React.useState(0);\n\n React.useLayoutEffect(() => {\n if (!isSelectedModelFree || !selectedModelMeasureRef.current) {\n setSelectedModelTextWidth(0);\n return undefined;\n }\n\n const measureSelectedModel = () => {\n setSelectedModelTextWidth(\n Math.ceil(\n selectedModelMeasureRef.current?.getBoundingClientRect().width ?? 0,\n ),\n );\n };\n measureSelectedModel();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(measureSelectedModel);\n observer.observe(selectedModelMeasureRef.current);\n return () => observer.disconnect();\n }, [isSelectedModelFree, selectedModel]);\n\n const { t } = useTranslation(\"openhands\");\n\n return (\n <div\n className={cn(\n \"flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]\",\n wrapperClassName,\n )}\n >\n <fieldset className=\"flex flex-col gap-2.5 w-full\">\n <label className={cn(\"text-sm\", labelClassName)}>\n {t(I18nKey.LLM$PROVIDER)}\n </label>\n <Autocomplete\n data-testid=\"llm-provider-input\"\n isRequired\n isVirtualized={false}\n name=\"llm-provider-input\"\n isDisabled={isDisabled}\n aria-label={t(I18nKey.LLM$PROVIDER)}\n isClearable={false}\n onSelectionChange={(e) => {\n if (e?.toString()) handleChangeProvider(e.toString());\n }}\n onInputChange={(value) => !value && clear()}\n defaultSelectedKey={selectedProvider ?? undefined}\n selectedKey={selectedProvider}\n classNames={{\n popoverContent:\n \"bg-content1 rounded-xl border border-[var(--oh-border)]\",\n selectorButton: heroUiAutocompleteSelectorButtonClassName,\n }}\n selectorButtonProps={{ disableRipple: true }}\n inputProps={{\n classNames: {\n inputWrapper: formControlSettingsFieldClassName,\n },\n }}\n >\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$VERIFIED)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {verifiedProviders.map((provider) => (\n <AutocompleteItem\n data-testid={`provider-item-${provider.name}`}\n key={provider.name}\n >\n {mapProvider(provider.name)}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n {unverifiedProviders.length > 0 ? (\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$OTHERS)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {unverifiedProviders.map((provider) => (\n <AutocompleteItem key={provider.name}>\n {mapProvider(provider.name)}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n </fieldset>\n\n {selectedProvider === \"openhands\" && (\n <div className=\"flex flex-col gap-2\">\n <HelpLink\n testId=\"openhands-account-help\"\n text={t(I18nKey.SETTINGS$NEED_OPENHANDS_ACCOUNT)}\n linkText={t(I18nKey.SETTINGS$CLICK_HERE)}\n href={PRODUCT_URL.PRODUCTION}\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n )}\n\n <fieldset className=\"flex flex-col gap-2.5 w-full\">\n <label className={cn(\"text-sm\", labelClassName)}>\n {t(I18nKey.LLM$MODEL)}\n </label>\n <div className=\"relative\">\n <Autocomplete\n data-testid=\"llm-model-input\"\n isRequired\n isVirtualized={false}\n isLoading={isLoadingModels}\n name=\"llm-model-input\"\n aria-label={t(I18nKey.LLM$MODEL)}\n isClearable={false}\n onSelectionChange={(e) => {\n if (e?.toString()) handleChangeModel(e.toString());\n }}\n isDisabled={isDisabled || !selectedProvider}\n selectedKey={selectedModel}\n defaultSelectedKey={selectedModel ?? undefined}\n classNames={{\n popoverContent:\n \"bg-content1 rounded-xl border border-[var(--oh-border)]\",\n selectorButton: heroUiAutocompleteSelectorButtonClassName,\n }}\n selectorButtonProps={{ disableRipple: true }}\n inputProps={{\n classNames: {\n inputWrapper: formControlSettingsFieldClassName,\n },\n }}\n >\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$VERIFIED)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {verifiedModels.map((model) => (\n <AutocompleteItem key={model.name} textValue={model.name}>\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate\">{model.name}</span>\n {model.free ? (\n <span className={freeModelBadgeClassName}>\n {FREE_MODEL_BADGE_LABEL}\n </span>\n ) : null}\n </span>\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n {unverifiedModels.length > 0 ? (\n <AutocompleteSection\n title={t(I18nKey.MODEL_SELECTOR$OTHERS)}\n classNames={{ heading: \"text-[var(--oh-muted)]\" }}\n >\n {unverifiedModels.map((model) => (\n <AutocompleteItem\n data-testid={`model-item-${model.name}`}\n key={model.name}\n textValue={model.name}\n >\n {model.name}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n {isSelectedModelFree && selectedModel ? (\n <>\n <span\n ref={selectedModelMeasureRef}\n className=\"pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0\"\n aria-hidden\n >\n {selectedModel}\n </span>\n <span\n data-testid=\"selected-free-model-badge\"\n className={cn(\n freeModelBadgeClassName,\n \"pointer-events-none absolute top-1/2 z-10 -translate-y-1/2\",\n )}\n style={{\n left: `calc(0.75rem + ${selectedModelTextWidth}px + 0.5rem)`,\n }}\n >\n {FREE_MODEL_BADGE_LABEL}\n </span>\n </>\n ) : null}\n </div>\n {modelsError && (\n <p data-testid=\"models-error\" className=\"text-danger text-xs\">\n {t(I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}\n </p>\n )}\n {selectedProvider === \"openhands\" && freeModelNames.length > 0 ? (\n <FreeOpenHandsModelsNote\n modelIds={freeModelNames.map(\n (name) => `${selectedProvider}/${name}`,\n )}\n />\n ) : null}\n </fieldset>\n </div>\n );\n}\n"],"mappings":"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"}