@openhands/agent-canvas 1.17.0 → 1.19.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 (601) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/acp-providers-BQ4o4vqy.js +1 -0
  4. package/build/assets/active-backend-context-BsLfwrXB.js +2 -0
  5. package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D9i6ezoJ.js} +1 -1
  6. package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-U-9YzDFU.js} +1 -1
  7. package/build/assets/agent-profiles-settings-D-bUV2PX.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-BaVQ6NpE.js +88 -0
  11. package/build/assets/agent-settings-BZJHtaIK.js +2 -0
  12. package/build/assets/agent-settings-D4snDd6u.js +1 -0
  13. package/build/assets/alert-banner-BkVt_8Or.js +1 -0
  14. package/build/assets/{api-error-message-Ve79qDcN.js → api-error-message-BXo0lCI5.js} +1 -1
  15. package/build/assets/api-key-entry-screen-fAIld-n7.js +1 -0
  16. package/build/assets/app-settings-DITbrM2u.js +1 -0
  17. package/build/assets/automation-detail-DawHmaOl.js +3 -0
  18. package/build/assets/automation-disabled-reason-DtgC8Ppt.js +1 -0
  19. package/build/assets/{automation-export-DxY47m3T.js → automation-export-Kv6e0bHx.js} +1 -1
  20. package/build/assets/automation-git-sync-Dd98G_Oz.js +1 -0
  21. package/build/assets/automation-setup-route-Cdc109ZD.js +3 -0
  22. package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Xhr-FDAB.js} +1 -1
  23. package/build/assets/automations-list-BeP1LuzQ.js +1 -0
  24. package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-DWNiN277.js} +1 -1
  25. package/build/assets/backend-form-modal-DeaUJIik.js +1 -0
  26. package/build/assets/backend-synced-settings-badge-Br85iWIY.js +1 -0
  27. package/build/assets/badge-Cdnei7Ly.js +1 -0
  28. package/build/assets/{base-modal-DTULovNc.js → base-modal-Ds7grR67.js} +1 -1
  29. package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
  30. package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-mQq2Ld1I.js} +1 -1
  31. package/build/assets/browser-Bfum8fkE.js +46 -0
  32. package/build/assets/browser-tab-CmYT4j_r.js +1 -0
  33. package/build/assets/canvas-extension-page-CokKSVRG.js +1 -0
  34. package/build/assets/canvas-extensions-BoQEYG-2.js +1 -0
  35. package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-Du2M5iEX.js} +1 -1
  36. package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-DM3JgMc2.js} +1 -1
  37. package/build/assets/check-Bo8s5Ylg.js +1 -0
  38. package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
  39. package/build/assets/chevron-right-CfdfRn-8.js +1 -0
  40. package/build/assets/circle-check-5pH3qCji.js +1 -0
  41. package/build/assets/circle-plus-check-toggle-BbYBiUwv.js +1 -0
  42. package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D02kgq1s.js} +1 -1
  43. package/build/assets/{cog-VBlRo6iw.js → cog-Dy1eWbSZ.js} +1 -1
  44. package/build/assets/command-menu-mehU3Evb.js +1 -0
  45. package/build/assets/commits-tab-DhQW8CXi.js +1 -0
  46. package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-eRk6Fkx6.js} +1 -1
  47. package/build/assets/confirmation-modal-BmVt_c0I.js +1 -0
  48. package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-lx2zk9G7.js} +1 -1
  49. package/build/assets/{conversation-BnjJSFf5.js → conversation-BOj0ENI6.js} +8 -8
  50. package/build/assets/conversation-SouWlGvs.js +1 -0
  51. package/build/assets/conversation-panel-SouWlGvs.js +1 -0
  52. package/build/assets/conversation-state-store-C6YncQNo.js +1 -0
  53. package/build/assets/conversation-store-DC-JlJuq.js +6 -0
  54. package/build/assets/{conversation-tab-empty-state-DKlzAz5c.js → conversation-tab-empty-state-DIhwCC2J.js} +1 -1
  55. package/build/assets/copy-to-clipboard-button-DVNXLylP.js +1 -0
  56. package/build/assets/device-verify-LP-x7nra.js +1 -0
  57. package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-goDldkiu.js} +1 -1
  58. package/build/assets/edit-automation-modal-BJJR9wSW.js +1 -0
  59. package/build/assets/empty-state-Cd-TFe7i.js +1 -0
  60. package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-CJdjIvMZ.js} +2 -2
  61. package/build/assets/enum-filter-dropdown-pocrz9AL.js +1 -0
  62. package/build/assets/environment-switch-overlay-Dwe78wRl.js +1 -0
  63. package/build/assets/error-state-SuWwztxV.js +1 -0
  64. package/build/assets/extensions-hub-O0esK3Er.js +1 -0
  65. package/build/assets/extensions-navigation-CgCVSXje.js +1 -0
  66. package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
  67. package/build/assets/files-tab-B_6t8ljw.js +1 -0
  68. package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-lQfLxzH4.js} +1 -1
  69. package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
  70. package/build/assets/get-git-path-Bp5rsUkl.js +1 -0
  71. package/build/assets/git-repo-dropdown-CbD0_LPN.js +1 -0
  72. package/build/assets/git-repo-dropdown-DPQVumZg.js +1 -0
  73. package/build/assets/highlighted-source-view-Bp0sgK-f.js +1 -0
  74. package/build/assets/home-BghzJd-D.js +1 -0
  75. package/build/assets/home-CXZ8zawS.js +1 -0
  76. package/build/assets/home-automation-run-tooltip-BdpCckKO.js +1 -0
  77. package/build/assets/home-store-DNQpfIEO.js +1 -0
  78. package/build/assets/hooks-service-DkxnQa4N.js +1 -0
  79. package/build/assets/index-home-Ca6Q5CtT.js +1 -0
  80. package/build/assets/info-BcajzHn1.js +1 -0
  81. package/build/assets/install-server-modal-DvxxYKia.js +1 -0
  82. package/build/assets/{key-CfXbJa8w.js → key-CwTE6XJj.js} +1 -1
  83. package/build/assets/launch-jsRGPRBx.js +1 -0
  84. package/build/assets/link-external-B4gx3EeM.js +1 -0
  85. package/build/assets/list-filter-B8PQk3RA.js +1 -0
  86. package/build/assets/{list-todo-ByXMdY4W.js → list-todo-Caa8E1X_.js} +1 -1
  87. package/build/assets/llm-not-configured-banner-DMdL1vaX.js +27 -0
  88. package/build/assets/llm-settings-dkQ5Oq7W.js +1 -0
  89. package/build/assets/llm-settings-lNDerSlu.js +1 -0
  90. package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-BiQaZbvv.js} +1 -1
  91. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  92. package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-DK1sAwVg.js} +1 -1
  93. package/build/assets/manage-backends-modal-DqCJohsX.js +1 -0
  94. package/build/assets/manifest-ff93dc8c.js +1 -0
  95. package/build/assets/manifest-subpage-layout-sxuPqfUr.js +1 -0
  96. package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
  97. package/build/assets/markdown-renderer-BH5pqDuJ.js +8 -0
  98. package/build/assets/mcp-BtaJDXnP.js +1 -0
  99. package/build/assets/mcp-installed-servers-Br4ZLsjr.js +1 -0
  100. package/build/assets/mcp-marketplace-utils-BwEnDYqm.js +1 -0
  101. package/build/assets/mcp-page-DwbnQpVs.js +9 -0
  102. package/build/assets/messages-DmFJlW6c.js +41 -0
  103. package/build/assets/{modal-body-DJw4xBki.js → modal-body-DBweM2EN.js} +1 -1
  104. package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-jvG85nkU.js} +1 -1
  105. package/build/assets/modal-close-button-BrM5fNnn.js +1 -0
  106. package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
  107. package/build/assets/onboarding-CQ8T6T0U.js +1 -0
  108. package/build/assets/onboarding-modal-CnliiaSN.js +1 -0
  109. package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-DmFUEmu5.js} +1 -1
  110. package/build/assets/parse-git-remote-url-BG8pcKL8.js +1 -0
  111. package/build/assets/{pencil-D5c47kyN.js → pencil-q-ihqDYv.js} +1 -1
  112. package/build/assets/{pin-C7vMagvf.js → pin-BdroVQdN.js} +1 -1
  113. package/build/assets/planner-tab-CXph_C9F.js +1 -0
  114. package/build/assets/{plug-CeaqeF6u.js → plug-7ACOEbMs.js} +1 -1
  115. package/build/assets/{plugins-management-service-Bh_pBuf-.js → plugins-management-service-CcEpfNKz.js} +1 -1
  116. package/build/assets/plus-C2e21TFC.js +1 -0
  117. package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-DdF_4Zhe.js} +1 -1
  118. package/build/assets/providers-BWRnl31s.js +1 -0
  119. package/build/assets/proxy-DbEf3Nqr.js +1 -0
  120. package/build/assets/{puzzle-DdAqbUrb.js → puzzle-LJYnuxKe.js} +1 -1
  121. package/build/assets/react-BX7IV650.js +1 -0
  122. package/build/assets/recommended-automations-launcher-r0oI91HN.js +1 -0
  123. package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
  124. package/build/assets/root-j2fFRlWS.js +2 -0
  125. package/build/assets/root-layout-CfGgm2lo.js +2 -0
  126. package/build/assets/root-sEWn3ha1.css +1 -0
  127. package/build/assets/schema-field-c3Ncgm4x.js +1 -0
  128. package/build/assets/sdk-section-page-DFEiuiFQ.js +1 -0
  129. package/build/assets/secret-form-WXXNFqTM.js +1 -0
  130. package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-DU6wh3wX.js} +1 -1
  131. package/build/assets/secrets-settings-BEqbPvjy.js +1 -0
  132. package/build/assets/settings-DjaSQwFh.js +1 -0
  133. package/build/assets/settings-dropdown-input-BRR2OZwi.js +1 -0
  134. package/build/assets/settings-index-DHv4XFcM.js +1 -0
  135. package/build/assets/settings-input-Cm4VxUon.js +1 -0
  136. package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-CaUfKZ33.js} +1 -1
  137. package/build/assets/settings-modal-djXuAnBO.js +1 -0
  138. package/build/assets/settings-nav-DFb3hBMr.js +16 -0
  139. package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-Q9lKW1TX.js} +1 -1
  140. package/build/assets/settings-switch-seaSJc7t.js +1 -0
  141. package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
  142. package/build/assets/shared-conversation-x3rxVCon.js +1 -0
  143. package/build/assets/{shield-check-DO7wa_eu.js → shield-check-C3Rl0NF8.js} +1 -1
  144. package/build/assets/{sidebar-layout-EPfWxk11.js → sidebar-layout-B6mcvvdV.js} +1 -1
  145. package/build/assets/sidebar-mobile-menu-toggle-CEqS8KnA.js +1 -0
  146. package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-BTHX11LG.js} +1 -1
  147. package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-BP1kzn6p.js} +1 -1
  148. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  149. package/build/assets/skill-card-pill-row-TD39nfP3.js +1 -0
  150. package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-CdBbbwjm.js} +2 -2
  151. package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-vUEp7gsC.js} +1 -1
  152. package/build/assets/skill-scope-BTRBQt0-.js +1 -0
  153. package/build/assets/skills-plugins-k1tUNAw4.js +1 -0
  154. package/build/assets/skills-settings-CENviPT7.js +1 -0
  155. package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-DVAlWYnL.js} +1 -1
  156. package/build/assets/task-list-tab-BLKF_x9f.js +1 -0
  157. package/build/assets/{terminal-onXx0_Qz.js → terminal-Ckbnqb23.js} +1 -1
  158. package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-DeiG9Mf6.js} +1 -1
  159. package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
  160. package/build/assets/trash-CXN2R54L.js +1 -0
  161. package/build/assets/{triangle-alert-BajLPpQg.js → triangle-alert-DEdu-b_L.js} +1 -1
  162. package/build/assets/{typography-HLLg_FAn.js → typography-NarNyelM.js} +1 -1
  163. package/build/assets/usage-tab-Drd3O006.js +1 -0
  164. package/build/assets/use-acp-credential-form-CJ5wPsQm.js +1 -0
  165. package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-iQZ0U3qV.js} +1 -1
  166. package/build/assets/use-agent-profiles-LCvb5OXT.js +1 -0
  167. package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-DdgSa8sA.js} +1 -1
  168. package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-D3kEeieu.js} +1 -1
  169. package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-CEubcYTD.js} +1 -1
  170. package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-CB8ybxFK.js} +1 -1
  171. package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-BMacwi2v.js} +1 -1
  172. package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-BEKRd6XZ.js} +1 -1
  173. package/build/assets/{use-config-DpafU_QP.js → use-config-3WYcJsgC.js} +1 -1
  174. package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-Be-eVpFp.js} +1 -1
  175. package/build/assets/use-create-secret-Bk9ZxTjl.js +1 -0
  176. package/build/assets/use-free-models-Ci3FkKEm.js +1 -0
  177. package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-fqS0kxt6.js} +1 -1
  178. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  179. package/build/assets/{use-launch-skill-in-chat-DeYa1tFM.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  180. package/build/assets/use-llm-configured-B71ZEVg2.js +1 -0
  181. package/build/assets/use-llm-profiles-xtCBMbef.js +1 -0
  182. package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-Bso6A_-A.js} +1 -1
  183. package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-CEgjL02y.js} +1 -1
  184. package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-pK4IlJ-p.js} +1 -1
  185. package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-B8-ZEB34.js} +1 -1
  186. package/build/assets/use-save-agent-profile-D7hJuW_u.js +1 -0
  187. package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-CikTu5xV.js} +1 -1
  188. package/build/assets/{use-settings-Dn00UISA.js → use-settings-BWIH5EuN.js} +1 -1
  189. package/build/assets/use-settings-nav-items-DSKwLDnd.js +1 -0
  190. package/build/assets/use-tracking-ChnSFChv.js +3 -0
  191. package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-C_l65DqW.js} +1 -1
  192. package/build/assets/{useInfiniteQuery-BzrRqjLg.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  193. package/build/assets/{useMutation-CJuK90oc.js → useMutation-Cszf8mKy.js} +1 -1
  194. package/build/assets/useQueries-pUohFMSP.js +1 -0
  195. package/build/assets/useQuery-DAAacS7O.js +1 -0
  196. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  197. package/build/assets/utils-D-gOfhmN.js +1 -0
  198. package/build/assets/{vendor~conversation-panel~conversation-4eJ0tml3.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  199. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-D6owle9R.js +2 -0
  200. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  201. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  202. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  203. package/build/assets/{vendor~root-layout-n8XCEXG8.js → vendor~root-layout-CcdIqs-C.js} +1 -1
  204. package/build/assets/{vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  205. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  206. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  207. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-BFRW8wt-.js +48 -0
  208. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +1 -1
  209. package/build/assets/{verification-settings-u2POabjH.js → verification-settings-PKtoIUUY.js} +1 -1
  210. package/build/assets/{wrench-CkgI4rxA.js → wrench-B8Wg_nbp.js} +1 -1
  211. package/build/assets/{x-By6qCmtY.js → x-CX8lVGwm.js} +1 -1
  212. package/build/index.html +4 -4
  213. package/build/locales/ar/openhands.json +16 -2
  214. package/build/locales/ca/openhands.json +16 -2
  215. package/build/locales/de/openhands.json +16 -2
  216. package/build/locales/en/openhands.json +16 -2
  217. package/build/locales/es/openhands.json +16 -2
  218. package/build/locales/fr/openhands.json +16 -2
  219. package/build/locales/it/openhands.json +16 -2
  220. package/build/locales/ja/openhands.json +16 -2
  221. package/build/locales/ko-KR/openhands.json +16 -2
  222. package/build/locales/no/openhands.json +16 -2
  223. package/build/locales/pt/openhands.json +16 -2
  224. package/build/locales/tr/openhands.json +16 -2
  225. package/build/locales/uk/openhands.json +16 -2
  226. package/build/locales/zh-CN/openhands.json +16 -2
  227. package/build/locales/zh-TW/openhands.json +16 -2
  228. package/config/defaults.json +3 -3
  229. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  230. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  231. package/dist/api/cloud/organization-service.api.js.map +1 -1
  232. package/dist/api/config-service/config-service.api.cjs +1 -1
  233. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  234. package/dist/api/config-service/config-service.api.js +6 -2
  235. package/dist/api/config-service/config-service.api.js.map +1 -1
  236. package/dist/api/config-service/config-service.types.d.ts +13 -0
  237. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs +3 -3
  238. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs.map +1 -1
  239. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js +12 -16
  240. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js.map +1 -1
  241. package/dist/components/features/automations/automation-card.cjs +1 -1
  242. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  243. package/dist/components/features/automations/automation-card.js +39 -38
  244. package/dist/components/features/automations/automation-card.js.map +1 -1
  245. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  246. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  247. package/dist/components/features/automations/automation-list-row.js +73 -72
  248. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  249. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  250. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  251. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  252. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  253. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  254. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  255. package/dist/components/features/automations/detail/detail-header.d.ts +8 -5
  256. package/dist/components/features/automations/detail/disabled-reason-banner.d.ts +16 -0
  257. package/dist/components/features/backends/backend-selector.cjs +1 -1
  258. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  259. package/dist/components/features/backends/backend-selector.js +112 -112
  260. package/dist/components/features/backends/backend-selector.js.map +1 -1
  261. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  262. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  263. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  264. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  265. package/dist/components/features/chat/model-messages.cjs +1 -1
  266. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  267. package/dist/components/features/chat/model-messages.js +27 -26
  268. package/dist/components/features/chat/model-messages.js.map +1 -1
  269. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  270. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  271. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  272. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  273. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  274. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  275. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  276. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  277. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  278. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  279. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  280. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  281. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  282. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +38 -29
  283. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  284. package/dist/components/features/images/image-lightbox.cjs +2 -0
  285. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  286. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  287. package/dist/components/features/images/image-lightbox.js +37 -0
  288. package/dist/components/features/images/image-lightbox.js.map +1 -0
  289. package/dist/components/features/images/image-preview.cjs +1 -1
  290. package/dist/components/features/images/image-preview.cjs.map +1 -1
  291. package/dist/components/features/images/image-preview.d.ts +2 -1
  292. package/dist/components/features/images/image-preview.js +33 -13
  293. package/dist/components/features/images/image-preview.js.map +1 -1
  294. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  295. package/dist/components/features/settings/agent-profiles/profile-scope-list.d.ts +20 -0
  296. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  297. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  298. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  299. package/dist/components/features/settings/cloud-settings-link.js +22 -21
  300. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  301. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  302. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  303. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  304. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  305. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  306. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  307. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +2 -1
  308. package/dist/components/features/sidebar/sidebar-rail-body.js +143 -142
  309. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  310. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  311. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  312. package/dist/components/features/sidebar/sidebar.js +28 -27
  313. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  314. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  315. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  316. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  317. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  318. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  319. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  320. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  321. package/dist/components/shared/buttons/remove-button.js +2 -1
  322. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  323. package/dist/components/shared/free-models-note.cjs +2 -0
  324. package/dist/components/shared/free-models-note.cjs.map +1 -0
  325. package/dist/components/shared/free-models-note.d.ts +3 -0
  326. package/dist/components/shared/free-models-note.js +20 -0
  327. package/dist/components/shared/free-models-note.js.map +1 -0
  328. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  329. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  330. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  331. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  332. package/dist/config/defaults.cjs +1 -1
  333. package/dist/config/defaults.cjs.map +1 -1
  334. package/dist/config/defaults.js +3 -3
  335. package/dist/config/defaults.js.map +1 -1
  336. package/dist/constants/acp-providers.cjs +1 -1
  337. package/dist/constants/acp-providers.cjs.map +1 -1
  338. package/dist/constants/acp-providers.d.ts +7 -0
  339. package/dist/constants/acp-providers.js +20 -16
  340. package/dist/constants/acp-providers.js.map +1 -1
  341. package/dist/constants/profile-scope.d.ts +21 -0
  342. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  343. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  344. package/dist/hooks/chat/use-slash-command.js +63 -62
  345. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  346. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  347. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  348. package/dist/hooks/query/use-automation-sdk-version.js +3 -1
  349. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  350. package/dist/hooks/query/use-free-models.cjs +2 -0
  351. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  352. package/dist/hooks/query/use-free-models.d.ts +23 -0
  353. package/dist/hooks/query/use-free-models.js +67 -0
  354. package/dist/hooks/query/use-free-models.js.map +1 -0
  355. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  356. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  357. package/dist/hooks/query/use-provider-models.cjs +1 -1
  358. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  359. package/dist/hooks/query/use-provider-models.js +34 -25
  360. package/dist/hooks/query/use-provider-models.js.map +1 -1
  361. package/dist/hooks/query/use-search-providers.cjs +1 -1
  362. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  363. package/dist/hooks/query/use-search-providers.js +31 -19
  364. package/dist/hooks/query/use-search-providers.js.map +1 -1
  365. package/dist/hooks/use-drag-resize.cjs +1 -1
  366. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  367. package/dist/hooks/use-drag-resize.js +8 -9
  368. package/dist/hooks/use-drag-resize.js.map +1 -1
  369. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  370. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  371. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  372. package/dist/hooks/use-home-automation-actions.js +0 -1
  373. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  374. package/dist/i18n/declaration.cjs +1 -1
  375. package/dist/i18n/declaration.cjs.map +1 -1
  376. package/dist/i18n/declaration.d.ts +16 -2
  377. package/dist/i18n/declaration.js +1 -1
  378. package/dist/i18n/declaration.js.map +1 -1
  379. package/dist/i18n/translation.cjs +3 -3
  380. package/dist/i18n/translation.cjs.map +1 -1
  381. package/dist/i18n/translation.js +255 -17
  382. package/dist/i18n/translation.js.map +1 -1
  383. package/dist/locales/ar/openhands.json +16 -2
  384. package/dist/locales/ca/openhands.json +16 -2
  385. package/dist/locales/de/openhands.json +16 -2
  386. package/dist/locales/en/openhands.json +16 -2
  387. package/dist/locales/es/openhands.json +16 -2
  388. package/dist/locales/fr/openhands.json +16 -2
  389. package/dist/locales/it/openhands.json +16 -2
  390. package/dist/locales/ja/openhands.json +16 -2
  391. package/dist/locales/ko-KR/openhands.json +16 -2
  392. package/dist/locales/no/openhands.json +16 -2
  393. package/dist/locales/pt/openhands.json +16 -2
  394. package/dist/locales/tr/openhands.json +16 -2
  395. package/dist/locales/uk/openhands.json +16 -2
  396. package/dist/locales/zh-CN/openhands.json +16 -2
  397. package/dist/locales/zh-TW/openhands.json +16 -2
  398. package/dist/manifests/manifest-validation.cjs +1 -1
  399. package/dist/manifests/manifest-validation.cjs.map +1 -1
  400. package/dist/manifests/manifest-validation.js +2 -2
  401. package/dist/manifests/manifest-validation.js.map +1 -1
  402. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
  403. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
  404. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +15 -8
  405. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
  406. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
  407. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
  408. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +11 -13
  409. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
  410. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
  411. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
  412. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +6 -0
  413. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
  414. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +1 -1
  415. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -1
  416. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +3 -6
  417. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -1
  418. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs +1 -1
  419. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs.map +1 -1
  420. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js +9 -12
  421. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js.map +1 -1
  422. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs +2 -0
  423. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs.map +1 -0
  424. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js +41 -0
  425. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js.map +1 -0
  426. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs +1 -1
  427. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs.map +1 -1
  428. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js +3 -6
  429. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js.map +1 -1
  430. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  431. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +1 -1
  432. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  433. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  434. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +199 -61
  435. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  436. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs +1 -1
  437. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs.map +1 -1
  438. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js +9 -8
  439. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js.map +1 -1
  440. package/dist/package.cjs +1 -1
  441. package/dist/package.cjs.map +1 -1
  442. package/dist/package.js +2 -2
  443. package/dist/package.js.map +1 -1
  444. package/dist/routes/agent-settings.d.ts +5 -0
  445. package/dist/routes/app-settings.cjs +1 -1
  446. package/dist/routes/app-settings.cjs.map +1 -1
  447. package/dist/routes/app-settings.js +52 -47
  448. package/dist/routes/app-settings.js.map +1 -1
  449. package/dist/routes/llm-settings.cjs +1 -1
  450. package/dist/routes/llm-settings.cjs.map +1 -1
  451. package/dist/routes/llm-settings.js +137 -145
  452. package/dist/routes/llm-settings.js.map +1 -1
  453. package/dist/stores/free-models-store.cjs +2 -0
  454. package/dist/stores/free-models-store.cjs.map +1 -0
  455. package/dist/stores/free-models-store.d.ts +30 -0
  456. package/dist/stores/free-models-store.js +22 -0
  457. package/dist/stores/free-models-store.js.map +1 -0
  458. package/dist/types/automation.cjs.map +1 -1
  459. package/dist/types/automation.d.ts +23 -1
  460. package/dist/types/automation.js.map +1 -1
  461. package/dist/utils/automation-disabled-reason.cjs +2 -0
  462. package/dist/utils/automation-disabled-reason.cjs.map +1 -0
  463. package/dist/utils/automation-disabled-reason.d.ts +32 -0
  464. package/dist/utils/automation-disabled-reason.js +19 -0
  465. package/dist/utils/automation-disabled-reason.js.map +1 -0
  466. package/dist/utils/format-model-name.cjs +1 -1
  467. package/dist/utils/format-model-name.cjs.map +1 -1
  468. package/dist/utils/format-model-name.d.ts +27 -6
  469. package/dist/utils/format-model-name.js +14 -6
  470. package/dist/utils/format-model-name.js.map +1 -1
  471. package/dist/utils/parse-git-remote-url.cjs +1 -1
  472. package/dist/utils/parse-git-remote-url.cjs.map +1 -1
  473. package/dist/utils/parse-git-remote-url.d.ts +5 -1
  474. package/dist/utils/parse-git-remote-url.js +20 -13
  475. package/dist/utils/parse-git-remote-url.js.map +1 -1
  476. package/package.json +2 -2
  477. package/scripts/check-sdk-version-sync.mjs +79 -8
  478. package/scripts/dev-safe.mjs +1 -1
  479. package/scripts/static-server.mjs +24 -7
  480. package/build/assets/acp-providers-DrjNsPOH.js +0 -1
  481. package/build/assets/active-backend-context-rZiLJRUc.js +0 -2
  482. package/build/assets/agent-profiles-settings-x6RvPsq7.js +0 -1
  483. package/build/assets/agent-server-client-options-BikiNwTa.js +0 -1
  484. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +0 -88
  485. package/build/assets/agent-settings-BJyovpJ_.js +0 -1
  486. package/build/assets/agent-settings-CpY3zObk.js +0 -2
  487. package/build/assets/alert-banner-vARz1idS.js +0 -1
  488. package/build/assets/api-key-entry-screen-CsMuBhoP.js +0 -1
  489. package/build/assets/app-settings-BaJ7nfHt.js +0 -1
  490. package/build/assets/automation-detail-CVoGDrKq.js +0 -3
  491. package/build/assets/automation-git-sync-CRMP9Bbm.js +0 -1
  492. package/build/assets/automation-setup-route-072beLz1.js +0 -3
  493. package/build/assets/automations-list-xuqTSQL4.js +0 -1
  494. package/build/assets/backend-form-modal-0aJmWdsa.js +0 -1
  495. package/build/assets/backend-synced-settings-badge-B7rKWBir.js +0 -1
  496. package/build/assets/badge-CcGx2TaV.js +0 -1
  497. package/build/assets/browser-C-_qBasq.js +0 -46
  498. package/build/assets/browser-tab-DZanIw5m.js +0 -1
  499. package/build/assets/canvas-extension-page-o_cWgE9B.js +0 -1
  500. package/build/assets/canvas-extensions-DSgNlCha.js +0 -1
  501. package/build/assets/check-fDEfgSzj.js +0 -1
  502. package/build/assets/chevron-down-CFrWHqu8.js +0 -1
  503. package/build/assets/chevron-right-C5roOrJu.js +0 -1
  504. package/build/assets/circle-check-ClTzJTdb.js +0 -1
  505. package/build/assets/circle-plus-check-toggle-Fr-h-mbL.js +0 -1
  506. package/build/assets/command-menu-BT3Ia5Ru.js +0 -1
  507. package/build/assets/commits-tab-2jhtaohl.js +0 -1
  508. package/build/assets/confirmation-modal-gIFHeZt6.js +0 -1
  509. package/build/assets/conversation-DZ578rOX.js +0 -1
  510. package/build/assets/conversation-panel-DZ578rOX.js +0 -1
  511. package/build/assets/conversation-state-store-D1_G_9I-.js +0 -1
  512. package/build/assets/conversation-store-DVVfkCsk.js +0 -6
  513. package/build/assets/copy-to-clipboard-button-B3w0X7WH.js +0 -1
  514. package/build/assets/device-verify-BfkCzyFB.js +0 -1
  515. package/build/assets/edit-automation-modal-BwhJ39JT.js +0 -1
  516. package/build/assets/empty-state-RZz0OfnY.js +0 -1
  517. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +0 -1
  518. package/build/assets/environment-switch-overlay-P2ZAuzov.js +0 -1
  519. package/build/assets/error-state-B_5cgNPJ.js +0 -1
  520. package/build/assets/extensions-hub-DsaUr4ca.js +0 -1
  521. package/build/assets/extensions-navigation-CRMZd-FE.js +0 -1
  522. package/build/assets/files-tab-CCgAcVdc.js +0 -1
  523. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  524. package/build/assets/get-git-path-EHrSDxTM.js +0 -1
  525. package/build/assets/git-repo-dropdown-D2WEQ97X.js +0 -1
  526. package/build/assets/git-repo-dropdown-DVeCUUXG.js +0 -1
  527. package/build/assets/highlighted-source-view-DjHO3SdW.js +0 -1
  528. package/build/assets/home-BorS_vdS.js +0 -1
  529. package/build/assets/home-aIMbHw5M.js +0 -1
  530. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +0 -1
  531. package/build/assets/home-store-DyXz0w6d.js +0 -1
  532. package/build/assets/hooks-service-C6dpRtZM.js +0 -1
  533. package/build/assets/index-home-zKFuKK2B.js +0 -1
  534. package/build/assets/info-CTIdjttz.js +0 -1
  535. package/build/assets/install-server-modal-DUiZMc8u.js +0 -1
  536. package/build/assets/kebab-menu-item-content-mm04SBD3.js +0 -1
  537. package/build/assets/launch-BSIf9KEg.js +0 -1
  538. package/build/assets/link-external-BNZzCM1I.js +0 -1
  539. package/build/assets/list-filter-CNpqTWVY.js +0 -1
  540. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +0 -27
  541. package/build/assets/llm-settings-B-5AHMiX.js +0 -1
  542. package/build/assets/llm-settings-B3SjHDmA.js +0 -1
  543. package/build/assets/loader-circle-Dex47vVW.js +0 -1
  544. package/build/assets/manage-backends-modal-q1NdFisr.js +0 -1
  545. package/build/assets/manifest-8920b615.js +0 -1
  546. package/build/assets/manifest-subpage-layout-BQQy5ipR.js +0 -1
  547. package/build/assets/markdown-renderer-rivLvYh-.js +0 -8
  548. package/build/assets/mcp-CEXDhQWn.js +0 -1
  549. package/build/assets/mcp-marketplace-utils-Cn_NIMWM.js +0 -1
  550. package/build/assets/mcp-page-LGYIICMG.js +0 -9
  551. package/build/assets/messages-DUSeANAh.js +0 -41
  552. package/build/assets/modal-close-button-B9j4nasm.js +0 -1
  553. package/build/assets/onboarding-BjFebfs5.js +0 -1
  554. package/build/assets/onboarding-modal-DDTjOpyd.js +0 -1
  555. package/build/assets/parse-git-remote-url-DpDM9bK6.js +0 -1
  556. package/build/assets/planner-tab-D8f2Y3rn.js +0 -1
  557. package/build/assets/plus-B3wvU06-.js +0 -1
  558. package/build/assets/providers-2gIIkz2N.js +0 -1
  559. package/build/assets/proxy-CBgMd2zf.js +0 -1
  560. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +0 -1
  561. package/build/assets/root-Bye_XmEL.js +0 -2
  562. package/build/assets/root-Cnwwzgo0.css +0 -1
  563. package/build/assets/root-layout-CSAwxBGM.js +0 -2
  564. package/build/assets/schema-field-CK0xYNbO.js +0 -1
  565. package/build/assets/sdk-section-page-Da73Rs_o.js +0 -1
  566. package/build/assets/secret-form-CB2VwYYg.js +0 -1
  567. package/build/assets/secrets-settings-Bh0udeKv.js +0 -1
  568. package/build/assets/settings-DmyIgRxO.js +0 -1
  569. package/build/assets/settings-dropdown-input-DVpyD87C.js +0 -1
  570. package/build/assets/settings-index-BSJUFmjE.js +0 -1
  571. package/build/assets/settings-input-C0dd8Utu.js +0 -1
  572. package/build/assets/settings-modal-yStgEh2o.js +0 -1
  573. package/build/assets/settings-switch-B78Khmyz.js +0 -1
  574. package/build/assets/shared-conversation-DM96X4KV.js +0 -1
  575. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +0 -1
  576. package/build/assets/sidebar-store-CSDFK0W5.js +0 -1
  577. package/build/assets/skill-card-pill-row-989y15jV.js +0 -1
  578. package/build/assets/skill-scope-Dz3kPH3P.js +0 -1
  579. package/build/assets/skills-plugins-e3CYGdUJ.js +0 -1
  580. package/build/assets/skills-settings-3e-FuHw_.js +0 -1
  581. package/build/assets/task-list-tab-3Jg8ywch.js +0 -1
  582. package/build/assets/trash-B6OIe4yX.js +0 -1
  583. package/build/assets/usage-tab-Cm-9j3UK.js +0 -1
  584. package/build/assets/use-acp-credential-form-BARcvjYE.js +0 -1
  585. package/build/assets/use-agent-profiles-1P91KSXz.js +0 -1
  586. package/build/assets/use-create-secret-D8p9ybQj.js +0 -1
  587. package/build/assets/use-is-authed-BRPjCRKM.js +0 -1
  588. package/build/assets/use-llm-configured-DGm8FiRR.js +0 -1
  589. package/build/assets/use-llm-profiles-BTTtpW4z.js +0 -1
  590. package/build/assets/use-save-agent-profile-CxyO9YG-.js +0 -1
  591. package/build/assets/use-settings-nav-items-vrjxTqcu.js +0 -16
  592. package/build/assets/use-tracking-B9prBsrq.js +0 -3
  593. package/build/assets/useQueries-CykmpT-a.js +0 -1
  594. package/build/assets/useQuery-S6j94er1.js +0 -1
  595. package/build/assets/utils-BOco8mxR.js +0 -1
  596. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +0 -2
  597. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +0 -185
  598. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js +0 -1
  599. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js +0 -1
  600. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js +0 -48
  601. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"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":"kiCAoBA,IAAM,EACJ,mHAcF,SAAgB,EAAc,CAC5B,aACA,eACA,WACA,yBACA,mBACA,kBACqB,CACrB,GAAM,EAAG,GAAgB,EAAA,QAAM,SAAwB,IAAI,EACrD,CAAC,EAAkB,GAAuB,EAAA,QAAM,SACpD,IACF,EACM,CAAC,EAAe,GAAoB,EAAA,QAAM,SAAwB,IAAI,EAEtE,CAAE,KAAM,EAAY,CAAC,GAAM,EAAA,mBAAmB,EAC9C,CACJ,KAAM,EAAiB,CAAC,EACxB,UAAW,EACX,MAAO,GACL,EAAA,kBAAkB,CAAgB,EAEhC,EAAoB,EAAA,QAAM,YACxB,EAAU,OAAQ,GAAM,EAAE,QAAQ,EACxC,CAAC,CAAS,CACZ,EACM,EAAsB,EAAA,QAAM,YAC1B,EAAU,OAAQ,GAAM,CAAC,EAAE,QAAQ,EACzC,CAAC,CAAS,CACZ,EAEM,EAAiB,EAAA,QAAM,YACrB,EAAe,OAAQ,GAAM,EAAE,QAAQ,EAC7C,CAAC,CAAc,CACjB,EACM,EAAmB,EAAA,QAAM,YACvB,EAAe,OAAQ,GAAM,CAAC,EAAE,QAAQ,EAC9C,CAAC,CAAc,CACjB,EAIM,EAAiB,EAAA,QAAM,YACrB,EAAe,OAAQ,GAAM,EAAE,IAAI,EAAE,IAAK,GAAM,EAAE,IAAI,EAC5D,CAAC,CAAc,CACjB,EACM,EAAmB,EAAA,QAAM,YACvB,IAAI,IAAI,CAAc,EAC5B,CAAC,CAAc,CACjB,EAEA,EAAA,QAAM,cAAgB,CACpB,GAAI,EAAc,CAChB,GAAM,CAAE,WAAU,SAAU,EAAA,wBAAwB,CAAY,EAEhE,EAAa,CAAY,EACzB,EAAoB,GAAY,IAAI,EACpC,EAAiB,CAAK,EACtB,IAAyB,GAAY,KAAM,CAAK,CAClD,CACF,EAAG,CAAC,CAAY,CAAC,EAEjB,IAAM,EAAwB,GAAqB,CACjD,EAAoB,CAAQ,EAC5B,EAAiB,IAAI,EACrB,EAAa,GAAG,EAAS,EAAE,EAC3B,IAAW,EAAU,IAAI,CAC3B,EAEM,EAAqB,GAAkB,CAC3C,IAAI,EAAY,GAAG,EAAiB,GAAG,IACnC,IAAqB,WACvB,EAAY,GAEd,EAAa,CAAS,EACtB,EAAiB,CAAK,EACtB,IAAW,EAAkB,CAAK,CACpC,EAEM,MAAc,CAClB,EAAoB,IAAI,EACxB,EAAa,IAAI,CACnB,EAEM,EAAsB,GAC1B,GAAiB,EAAiB,IAAI,CAAa,GAE/C,EAA0B,EAAA,QAAM,OAAwB,IAAI,EAC5D,CAAC,EAAwB,GAA6B,EAAA,QAAM,SAAS,CAAC,EAE5E,EAAA,QAAM,oBAAsB,CAC1B,GAAI,CAAC,GAAuB,CAAC,EAAwB,QAAS,CAC5D,EAA0B,CAAC,EAC3B,MACF,CAEA,IAAM,MAA6B,CACjC,EACE,KAAK,KACH,EAAwB,SAAS,sBAAsB,EAAE,OAAS,CACpE,CACF,CACF,EAGA,GAFA,EAAqB,EAEjB,OAAO,eAAmB,IAC5B,OAGF,IAAM,EAAW,IAAI,eAAe,CAAoB,EAExD,OADA,EAAS,QAAQ,EAAwB,OAAO,MACnC,EAAS,WAAW,CACnC,EAAG,CAAC,EAAqB,CAAa,CAAC,EAEvC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAExC,OACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,+EACA,CACF,WAJF,EAME,EAAA,EAAA,MAAC,WAAD,CAAU,UAAU,wCAApB,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAW,EAAA,GAAG,UAAW,CAAc,WAC3C,EAAE,EAAA,QAAQ,YAAY,CAClB,CAAA,GACP,EAAA,EAAA,MAAC,EAAA,qBAAD,CACE,cAAY,qBACZ,WAAA,GACA,cAAe,GACf,KAAK,qBACO,aACZ,aAAY,EAAE,EAAA,QAAQ,YAAY,EAClC,YAAa,GACb,kBAAoB,GAAM,CACpB,GAAG,SAAS,GAAG,EAAqB,EAAE,SAAS,CAAC,CACtD,EACA,cAAgB,GAAU,CAAC,GAAS,EAAM,EAC1C,mBAAoB,GAAoB,IAAA,GACxC,YAAa,EACb,WAAY,CACV,eACE,0DACF,eAAgB,EAAA,yCAClB,EACA,oBAAqB,CAAE,cAAe,EAAK,EAC3C,WAAY,CACV,WAAY,CACV,aAAc,EAAA,iCAChB,CACF,WAxBF,EA0BE,EAAA,EAAA,KAAC,EAAA,6BAAD,CACE,MAAO,EAAE,EAAA,QAAQ,uBAAuB,EACxC,WAAY,CAAE,QAAS,wBAAyB,WAE/C,EAAkB,IAAK,IACtB,EAAA,EAAA,KAAC,EAAA,0BAAD,CACE,cAAa,iBAAiB,EAAS,gBAGtC,EAAA,YAAY,EAAS,IAAI,CACV,EAHX,EAAS,IAGE,CACnB,CACkB,CAAA,EACpB,EAAoB,OAAS,GAC5B,EAAA,EAAA,KAAC,EAAA,6BAAD,CACE,MAAO,EAAE,EAAA,QAAQ,qBAAqB,EACtC,WAAY,CAAE,QAAS,wBAAyB,WAE/C,EAAoB,IAAK,IACxB,EAAA,EAAA,KAAC,EAAA,0BAAD,CAAA,SACG,EAAA,YAAY,EAAS,IAAI,CACV,EAFK,EAAS,IAEd,CACnB,CACkB,CAAA,EACnB,IACQ,GACN,IAET,IAAqB,cACpB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACb,EAAA,EAAA,KAAC,EAAA,SAAD,CACE,OAAO,yBACP,KAAM,EAAE,EAAA,QAAQ,+BAA+B,EAC/C,SAAU,EAAE,EAAA,QAAQ,mBAAmB,EACvC,KAAM,EAAA,YAAY,WAClB,KAAK,WACL,UAAU,OACX,CAAA,CACE,CAAA,GAGP,EAAA,EAAA,MAAC,WAAD,CAAU,UAAU,wCAApB,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAW,EAAA,GAAG,UAAW,CAAc,WAC3C,EAAE,EAAA,QAAQ,SAAS,CACf,CAAA,GACP,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oBAAf,EACE,EAAA,EAAA,MAAC,EAAA,qBAAD,CACE,cAAY,kBACZ,WAAA,GACA,cAAe,GACf,UAAW,EACX,KAAK,kBACL,aAAY,EAAE,EAAA,QAAQ,SAAS,EAC/B,YAAa,GACb,kBAAoB,GAAM,CACpB,GAAG,SAAS,GAAG,EAAkB,EAAE,SAAS,CAAC,CACnD,EACA,WAAY,GAAc,CAAC,EAC3B,YAAa,EACb,mBAAoB,GAAiB,IAAA,GACrC,WAAY,CACV,eACE,0DACF,eAAgB,EAAA,yCAClB,EACA,oBAAqB,CAAE,cAAe,EAAK,EAC3C,WAAY,CACV,WAAY,CACV,aAAc,EAAA,iCAChB,CACF,WAxBF,EA0BE,EAAA,EAAA,KAAC,EAAA,6BAAD,CACE,MAAO,EAAE,EAAA,QAAQ,uBAAuB,EACxC,WAAY,CAAE,QAAS,wBAAyB,WAE/C,EAAe,IAAK,IACnB,EAAA,EAAA,KAAC,EAAA,0BAAD,CAAmC,UAAW,EAAM,eAClD,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2CAAhB,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oBAAY,EAAM,IAAW,CAAA,EAC5C,EAAM,MACL,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,WACd,EAAA,sBACG,CAAA,EACJ,IACA,GACU,EATK,EAAM,IASX,CACnB,CACkB,CAAA,EACpB,EAAiB,OAAS,GACzB,EAAA,EAAA,KAAC,EAAA,6BAAD,CACE,MAAO,EAAE,EAAA,QAAQ,qBAAqB,EACtC,WAAY,CAAE,QAAS,wBAAyB,WAE/C,EAAiB,IAAK,IACrB,EAAA,EAAA,KAAC,EAAA,0BAAD,CACE,cAAa,cAAc,EAAM,OAEjC,UAAW,EAAM,cAEhB,EAAM,IACS,EAJX,EAAM,IAIK,CACnB,CACkB,CAAA,EACnB,IACQ,IACb,GAAuB,GACtB,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,OAAD,CACE,IAAK,EACL,UAAU,+EACV,cAAA,YAEC,CACG,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,4BACZ,UAAW,EAAA,GACT,EACA,4DACF,EACA,MAAO,CACL,KAAM,kBAAkB,EAAuB,aACjD,WAEC,EAAA,sBACG,CAAA,CACN,CAAA,CAAA,EACA,IACD,IACJ,IACC,EAAA,EAAA,KAAC,IAAD,CAAG,cAAY,eAAe,UAAU,+BACrC,EAAE,EAAA,QAAQ,gCAAgC,CAC1C,CAAA,EAEJ,IAAqB,aAAe,EAAe,OAAS,GAC3D,EAAA,EAAA,KAAC,EAAA,wBAAD,CACE,SAAU,EAAe,IACtB,GAAS,GAAG,EAAiB,GAAG,GACnC,CACD,CAAA,EACC,IACI,GACP,GAET"}
@@ -1,193 +1,183 @@
1
1
  import { useTranslation as e } from "../../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../../i18n/declaration.js";
3
- import { Info as n } from "../../../../node_modules/lucide-react/dist/esm/icons/info.js";
4
- import { PRODUCT_URL as r } from "../../../../utils/constants.js";
5
- import { cn as i } from "../../../../utils/utils.js";
6
- import { listbox_item_base_default as a } from "../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.js";
7
- import { listbox_section_base_default as o } from "../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.js";
8
- import { autocomplete_default as s } from "../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.js";
9
- import { formControlSettingsFieldClassName as c } from "../../../../utils/form-control-classes.js";
10
- import { FREE_MODEL_BADGE_LABEL as l, FREE_OPENHANDS_MODEL_NOTE as u, isFreeOpenHandsModel as d } from "../../../../utils/format-model-name.js";
11
- import { heroUiAutocompleteSelectorButtonClassName as f } from "../../../../ui/combobox-caret.js";
12
- import { mapProvider as p } from "../../../../utils/map-provider.js";
13
- import { extractModelAndProvider as m } from "../../../../utils/extract-model-and-provider.js";
14
- import { HelpLink as h } from "../../../../ui/help-link.js";
15
- import { useSearchProviders as g } from "../../../../hooks/query/use-search-providers.js";
16
- import { useProviderModels as _ } from "../../../../hooks/query/use-provider-models.js";
17
- import v from "react";
18
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
3
+ import { PRODUCT_URL as n } from "../../../../utils/constants.js";
4
+ import { cn as r } from "../../../../utils/utils.js";
5
+ import { listbox_item_base_default as i } from "../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.js";
6
+ import { listbox_section_base_default as a } from "../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.js";
7
+ import { autocomplete_default as o } from "../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.js";
8
+ import { formControlSettingsFieldClassName as s } from "../../../../utils/form-control-classes.js";
9
+ import { FREE_MODEL_BADGE_LABEL as c } from "../../../../utils/format-model-name.js";
10
+ import { heroUiAutocompleteSelectorButtonClassName as l } from "../../../../ui/combobox-caret.js";
11
+ import { mapProvider as u } from "../../../../utils/map-provider.js";
12
+ import { extractModelAndProvider as d } from "../../../../utils/extract-model-and-provider.js";
13
+ import { HelpLink as f } from "../../../../ui/help-link.js";
14
+ import { useSearchProviders as p } from "../../../../hooks/query/use-search-providers.js";
15
+ import { useProviderModels as m } from "../../../../hooks/query/use-provider-models.js";
16
+ import { FreeOpenHandsModelsNote as h } from "../../free-models-note.js";
17
+ import g from "react";
18
+ import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
19
19
  //#region src/components/shared/modals/settings/model-selector.tsx
20
- var S = "shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning";
21
- function C() {
22
- return /* @__PURE__ */ x("p", {
23
- "data-testid": "openhands-free-models-note",
24
- className: "flex items-start gap-2 text-xs text-warning",
25
- children: [/* @__PURE__ */ b(n, {
26
- className: "mt-0.5 size-4 shrink-0 text-warning",
27
- "aria-hidden": !0
28
- }), /* @__PURE__ */ b("span", { children: u })]
29
- });
30
- }
31
- function w({ isDisabled: n, currentModel: u, onChange: w, onDefaultValuesChanged: T, wrapperClassName: E, labelClassName: D }) {
32
- let [, O] = v.useState(null), [k, A] = v.useState(null), [j, M] = v.useState(null), { data: N = [] } = g(), { data: P = [], isLoading: F, error: I } = _(k), L = v.useMemo(() => N.filter((e) => e.verified), [N]), R = v.useMemo(() => N.filter((e) => !e.verified), [N]), z = v.useMemo(() => P.filter((e) => e.verified), [P]), B = v.useMemo(() => P.filter((e) => !e.verified), [P]);
33
- v.useEffect(() => {
34
- if (u) {
35
- let { provider: e, model: t } = m(u);
36
- O(u), A(e || null), M(t), T?.(e || null, t);
20
+ var b = "shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning";
21
+ function x({ isDisabled: x, currentModel: S, onChange: C, onDefaultValuesChanged: w, wrapperClassName: T, labelClassName: E }) {
22
+ let [, D] = g.useState(null), [O, k] = g.useState(null), [A, j] = g.useState(null), { data: M = [] } = p(), { data: N = [], isLoading: P, error: F } = m(O), I = g.useMemo(() => M.filter((e) => e.verified), [M]), L = g.useMemo(() => M.filter((e) => !e.verified), [M]), R = g.useMemo(() => N.filter((e) => e.verified), [N]), z = g.useMemo(() => N.filter((e) => !e.verified), [N]), B = g.useMemo(() => N.filter((e) => e.free).map((e) => e.name), [N]), V = g.useMemo(() => new Set(B), [B]);
23
+ g.useEffect(() => {
24
+ if (S) {
25
+ let { provider: e, model: t } = d(S);
26
+ D(S), k(e || null), j(t), w?.(e || null, t);
37
27
  }
38
- }, [u]);
39
- let V = (e) => {
40
- A(e), M(null), O(`${e}/`), w?.(e, null);
41
- }, H = (e) => {
42
- let t = `${k}/${e}`;
43
- k === "openai" && (t = e), O(t), M(e), w?.(k, e);
44
- }, U = () => {
45
- A(null), O(null);
46
- }, W = d(k && j ? `${k}/${j}` : null), G = v.useRef(null), [K, q] = v.useState(0);
47
- v.useLayoutEffect(() => {
48
- if (!W || !G.current) {
49
- q(0);
28
+ }, [S]);
29
+ let H = (e) => {
30
+ k(e), j(null), D(`${e}/`), C?.(e, null);
31
+ }, U = (e) => {
32
+ let t = `${O}/${e}`;
33
+ O === "openai" && (t = e), D(t), j(e), C?.(O, e);
34
+ }, W = () => {
35
+ k(null), D(null);
36
+ }, G = !!(A && V.has(A)), K = g.useRef(null), [q, J] = g.useState(0);
37
+ g.useLayoutEffect(() => {
38
+ if (!G || !K.current) {
39
+ J(0);
50
40
  return;
51
41
  }
52
42
  let e = () => {
53
- q(Math.ceil(G.current?.getBoundingClientRect().width ?? 0));
43
+ J(Math.ceil(K.current?.getBoundingClientRect().width ?? 0));
54
44
  };
55
45
  if (e(), typeof ResizeObserver > "u") return;
56
46
  let t = new ResizeObserver(e);
57
- return t.observe(G.current), () => t.disconnect();
58
- }, [W, j]);
59
- let { t: J } = e("openhands");
60
- return /* @__PURE__ */ x("div", {
61
- className: i("flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]", E),
47
+ return t.observe(K.current), () => t.disconnect();
48
+ }, [G, A]);
49
+ let { t: Y } = e("openhands");
50
+ return /* @__PURE__ */ y("div", {
51
+ className: r("flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]", T),
62
52
  children: [
63
- /* @__PURE__ */ x("fieldset", {
53
+ /* @__PURE__ */ y("fieldset", {
64
54
  className: "flex flex-col gap-2.5 w-full",
65
- children: [/* @__PURE__ */ b("label", {
66
- className: i("text-sm", D),
67
- children: J(t.LLM$PROVIDER)
68
- }), /* @__PURE__ */ x(s, {
55
+ children: [/* @__PURE__ */ v("label", {
56
+ className: r("text-sm", E),
57
+ children: Y(t.LLM$PROVIDER)
58
+ }), /* @__PURE__ */ y(o, {
69
59
  "data-testid": "llm-provider-input",
70
60
  isRequired: !0,
71
61
  isVirtualized: !1,
72
62
  name: "llm-provider-input",
73
- isDisabled: n,
74
- "aria-label": J(t.LLM$PROVIDER),
63
+ isDisabled: x,
64
+ "aria-label": Y(t.LLM$PROVIDER),
75
65
  isClearable: !1,
76
66
  onSelectionChange: (e) => {
77
- e?.toString() && V(e.toString());
67
+ e?.toString() && H(e.toString());
78
68
  },
79
- onInputChange: (e) => !e && U(),
80
- defaultSelectedKey: k ?? void 0,
81
- selectedKey: k,
69
+ onInputChange: (e) => !e && W(),
70
+ defaultSelectedKey: O ?? void 0,
71
+ selectedKey: O,
82
72
  classNames: {
83
73
  popoverContent: "bg-content1 rounded-xl border border-[var(--oh-border)]",
84
- selectorButton: f
74
+ selectorButton: l
85
75
  },
86
76
  selectorButtonProps: { disableRipple: !0 },
87
- inputProps: { classNames: { inputWrapper: c } },
88
- children: [/* @__PURE__ */ b(o, {
89
- title: J(t.MODEL_SELECTOR$VERIFIED),
77
+ inputProps: { classNames: { inputWrapper: s } },
78
+ children: [/* @__PURE__ */ v(a, {
79
+ title: Y(t.MODEL_SELECTOR$VERIFIED),
90
80
  classNames: { heading: "text-[var(--oh-muted)]" },
91
- children: L.map((e) => /* @__PURE__ */ b(a, {
81
+ children: I.map((e) => /* @__PURE__ */ v(i, {
92
82
  "data-testid": `provider-item-${e.name}`,
93
- children: p(e.name)
83
+ children: u(e.name)
94
84
  }, e.name))
95
- }), R.length > 0 ? /* @__PURE__ */ b(o, {
96
- title: J(t.MODEL_SELECTOR$OTHERS),
85
+ }), L.length > 0 ? /* @__PURE__ */ v(a, {
86
+ title: Y(t.MODEL_SELECTOR$OTHERS),
97
87
  classNames: { heading: "text-[var(--oh-muted)]" },
98
- children: R.map((e) => /* @__PURE__ */ b(a, { children: p(e.name) }, e.name))
88
+ children: L.map((e) => /* @__PURE__ */ v(i, { children: u(e.name) }, e.name))
99
89
  }) : null]
100
90
  })]
101
91
  }),
102
- k === "openhands" && /* @__PURE__ */ b("div", {
92
+ O === "openhands" && /* @__PURE__ */ v("div", {
103
93
  className: "flex flex-col gap-2",
104
- children: /* @__PURE__ */ b(h, {
94
+ children: /* @__PURE__ */ v(f, {
105
95
  testId: "openhands-account-help",
106
- text: J(t.SETTINGS$NEED_OPENHANDS_ACCOUNT),
107
- linkText: J(t.SETTINGS$CLICK_HERE),
108
- href: r.PRODUCTION,
96
+ text: Y(t.SETTINGS$NEED_OPENHANDS_ACCOUNT),
97
+ linkText: Y(t.SETTINGS$CLICK_HERE),
98
+ href: n.PRODUCTION,
109
99
  size: "settings",
110
100
  linkColor: "white"
111
101
  })
112
102
  }),
113
- /* @__PURE__ */ x("fieldset", {
103
+ /* @__PURE__ */ y("fieldset", {
114
104
  className: "flex flex-col gap-2.5 w-full",
115
105
  children: [
116
- /* @__PURE__ */ b("label", {
117
- className: i("text-sm", D),
118
- children: J(t.LLM$MODEL)
106
+ /* @__PURE__ */ v("label", {
107
+ className: r("text-sm", E),
108
+ children: Y(t.LLM$MODEL)
119
109
  }),
120
- /* @__PURE__ */ x("div", {
110
+ /* @__PURE__ */ y("div", {
121
111
  className: "relative",
122
- children: [/* @__PURE__ */ x(s, {
112
+ children: [/* @__PURE__ */ y(o, {
123
113
  "data-testid": "llm-model-input",
124
114
  isRequired: !0,
125
115
  isVirtualized: !1,
126
- isLoading: F,
116
+ isLoading: P,
127
117
  name: "llm-model-input",
128
- "aria-label": J(t.LLM$MODEL),
118
+ "aria-label": Y(t.LLM$MODEL),
129
119
  isClearable: !1,
130
120
  onSelectionChange: (e) => {
131
- e?.toString() && H(e.toString());
121
+ e?.toString() && U(e.toString());
132
122
  },
133
- isDisabled: n || !k,
134
- selectedKey: j,
135
- defaultSelectedKey: j ?? void 0,
123
+ isDisabled: x || !O,
124
+ selectedKey: A,
125
+ defaultSelectedKey: A ?? void 0,
136
126
  classNames: {
137
127
  popoverContent: "bg-content1 rounded-xl border border-[var(--oh-border)]",
138
- selectorButton: f
128
+ selectorButton: l
139
129
  },
140
130
  selectorButtonProps: { disableRipple: !0 },
141
- inputProps: { classNames: { inputWrapper: c } },
142
- children: [/* @__PURE__ */ b(o, {
143
- title: J(t.MODEL_SELECTOR$VERIFIED),
131
+ inputProps: { classNames: { inputWrapper: s } },
132
+ children: [/* @__PURE__ */ v(a, {
133
+ title: Y(t.MODEL_SELECTOR$VERIFIED),
144
134
  classNames: { heading: "text-[var(--oh-muted)]" },
145
- children: z.map((e) => /* @__PURE__ */ b(a, {
135
+ children: R.map((e) => /* @__PURE__ */ v(i, {
146
136
  textValue: e.name,
147
- children: /* @__PURE__ */ x("span", {
137
+ children: /* @__PURE__ */ y("span", {
148
138
  className: "flex min-w-0 items-center gap-2",
149
- children: [/* @__PURE__ */ b("span", {
139
+ children: [/* @__PURE__ */ v("span", {
150
140
  className: "truncate",
151
141
  children: e.name
152
- }), d(`${k}/${e.name}`) ? /* @__PURE__ */ b("span", {
153
- className: S,
154
- children: l
142
+ }), e.free ? /* @__PURE__ */ v("span", {
143
+ className: b,
144
+ children: c
155
145
  }) : null]
156
146
  })
157
147
  }, e.name))
158
- }), B.length > 0 ? /* @__PURE__ */ b(o, {
159
- title: J(t.MODEL_SELECTOR$OTHERS),
148
+ }), z.length > 0 ? /* @__PURE__ */ v(a, {
149
+ title: Y(t.MODEL_SELECTOR$OTHERS),
160
150
  classNames: { heading: "text-[var(--oh-muted)]" },
161
- children: B.map((e) => /* @__PURE__ */ b(a, {
151
+ children: z.map((e) => /* @__PURE__ */ v(i, {
162
152
  "data-testid": `model-item-${e.name}`,
163
153
  textValue: e.name,
164
154
  children: e.name
165
155
  }, e.name))
166
156
  }) : null]
167
- }), W && j ? /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b("span", {
168
- ref: G,
157
+ }), G && A ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v("span", {
158
+ ref: K,
169
159
  className: "pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0",
170
160
  "aria-hidden": !0,
171
- children: j
172
- }), /* @__PURE__ */ b("span", {
161
+ children: A
162
+ }), /* @__PURE__ */ v("span", {
173
163
  "data-testid": "selected-free-model-badge",
174
- className: i(S, "pointer-events-none absolute top-1/2 z-10 -translate-y-1/2"),
175
- style: { left: `calc(0.75rem + ${K}px + 0.5rem)` },
176
- children: l
164
+ className: r(b, "pointer-events-none absolute top-1/2 z-10 -translate-y-1/2"),
165
+ style: { left: `calc(0.75rem + ${q}px + 0.5rem)` },
166
+ children: c
177
167
  })] }) : null]
178
168
  }),
179
- I && /* @__PURE__ */ b("p", {
169
+ F && /* @__PURE__ */ v("p", {
180
170
  "data-testid": "models-error",
181
171
  className: "text-danger text-xs",
182
- children: J(t.CONFIGURATION$ERROR_FETCH_MODELS)
172
+ children: Y(t.CONFIGURATION$ERROR_FETCH_MODELS)
183
173
  }),
184
- k === "openhands" ? /* @__PURE__ */ b(C, {}) : null
174
+ O === "openhands" && B.length > 0 ? /* @__PURE__ */ v(h, { modelIds: B.map((e) => `${O}/${e}`) }) : null
185
175
  ]
186
176
  })
187
177
  ]
188
178
  });
189
179
  }
190
180
  //#endregion
191
- export { w as ModelSelector };
181
+ export { x as ModelSelector };
192
182
 
193
183
  //# sourceMappingURL=model-selector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-selector.js","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.js","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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"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e={_comment:`Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.`,versions:{agentServer:`1.46.0`,agentCanvas:`1.17.0`,automation:`1.11.1`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_comment:`Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3,_vscodeComment:`Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.`,vscode:8001},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`,canvasBasePath:`/canvas`,_vscodeBasePathComment:`Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.`,vscodeBasePath:`/vscode`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`},telemetry:{posthogApiKey:`phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U`,posthogHost:`https://us.i.posthog.com`}};exports.default=e;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e={_comment:`Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.`,versions:{agentServer:`1.48.0`,agentCanvas:`1.19.0`,automation:`1.12.1`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_comment:`Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3,_vscodeComment:`Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.`,vscode:8001},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`,canvasBasePath:`/canvas`,_vscodeBasePathComment:`Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.`,vscodeBasePath:`/vscode`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`},telemetry:{posthogApiKey:`phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U`,posthogHost:`https://us.i.posthog.com`}};exports.default=e;
2
2
  //# sourceMappingURL=defaults.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.cjs","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.46.0\",\n \"agentCanvas\": \"1.17.0\",\n \"automation\": \"1.11.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"defaults.cjs","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.48.0\",\n \"agentCanvas\": \"1.19.0\",\n \"automation\": \"1.12.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}
@@ -1,9 +1,9 @@
1
1
  var e = {
2
2
  _comment: "Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.",
3
3
  versions: {
4
- agentServer: "1.46.0",
5
- agentCanvas: "1.17.0",
6
- automation: "1.11.1"
4
+ agentServer: "1.48.0",
5
+ agentCanvas: "1.19.0",
6
+ automation: "1.12.1"
7
7
  },
8
8
  compatibility: { minimumAgentServer: "1.28.0" },
9
9
  constraints: {
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.46.0\",\n \"agentCanvas\": \"1.17.0\",\n \"automation\": \"1.11.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"defaults.js","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.48.0\",\n \"agentCanvas\": \"1.19.0\",\n \"automation\": \"1.12.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../node_modules/@openhands/typescript-client/dist/models/acp.cjs");require("../node_modules/@openhands/typescript-client/dist/index.cjs");function n(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||t===`acp-managed`?null:t}function r(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=n(t);if(e)return e}return e.providerDefault??null}var i={"claude-code":{icon:`claude-code`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION},codex:{icon:`codex`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION},"gemini-cli":{icon:`gemini`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION}},a=Object.entries(i).map(([e,n])=>{let r=t.getAcpProvider(e);return{key:e,display_name:r?.display_name??e,default_command:r?[...r.default_command]:[],available_models:r?.available_models?.map(e=>({id:e.id,label:e.label})),default_model:r?.default_model??void 0,description_key:n.description_key,icon:n.icon}});e.I18nKey.ONBOARDING$ACP_SECRET_FILE_BLOB_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_OAUTH_TOKEN_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_FILE_BLOB_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_GCP_PROJECT_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_GCP_LOCATION_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_VERTEXAI_FLAG_HINT;var o=`gemini-2.5-pro`;function s(e){return e===`gemini-cli`?o:c(e)?.default_model??null}function c(e){if(e)return a.find(t=>t.key===e)}function l(e){let t=c(e);return t?t.display_name:null}function u(e){return c(e)?.icon??`cli-generic`}function d(e,t){return t?c(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.getAcpPreferredDefaultModel=s,exports.getAcpProvider=c,exports.getAcpProviderDisplayName=l,exports.labelForAcpModel=d,exports.resolveAcpProviderIcon=u,exports.resolveEffectiveAcpModel=r;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../node_modules/@openhands/typescript-client/dist/models/acp.cjs");require("../node_modules/@openhands/typescript-client/dist/index.cjs");function n(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||t===`acp-managed`?null:t}function r(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=n(t);if(e)return e}return e.providerDefault??null}var i={"claude-code":{icon:`claude-code`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION},codex:{icon:`codex`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION},"gemini-cli":{icon:`gemini`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION}};function a(e){return t.getAcpProvider(e)?.available_models?.map(e=>({id:e.id,label:e.label}))}var o=Object.entries(i).map(([e,n])=>{let r=t.getAcpProvider(e);return{key:e,display_name:r?.display_name??e,default_command:r?[...r.default_command]:[],available_models:a(e),default_model:r?.default_model??void 0,description_key:n.description_key,icon:n.icon}});e.I18nKey.ONBOARDING$ACP_SECRET_FILE_BLOB_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_OAUTH_TOKEN_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_FILE_BLOB_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_GCP_PROJECT_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_GCP_LOCATION_HINT,e.I18nKey.ONBOARDING$ACP_SECRET_VERTEXAI_FLAG_HINT;var s=`gemini-2.5-pro`;function c(e){return e===`gemini-cli`?s:l(e)?.default_model??null}function l(e){if(e)return o.find(t=>t.key===e)}function u(e){let t=l(e);return t?t.display_name:null}function d(e){return l(e)?.icon??`cli-generic`}function f(e,t){return t?l(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.getAcpPreferredDefaultModel=c,exports.getAcpProvider=l,exports.getAcpProviderDisplayName=u,exports.labelForAcpModel=f,exports.resolveAcpProviderIcon=d,exports.resolveEffectiveAcpModel=r;
2
2
  //# sourceMappingURL=acp-providers.cjs.map