@openhands/agent-canvas 1.0.0-rc.11 → 1.0.0-rc.12

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 (587) hide show
  1. package/README.md +46 -31
  2. package/README.windows.md +2 -2
  3. package/bin/agent-canvas.mjs +3 -1
  4. package/build/assets/Trans-CBypf0vt.js +1 -0
  5. package/build/assets/{acp-providers-Dzb4nxxB.js → acp-providers-BMyF5WII.js} +1 -1
  6. package/build/assets/active-backend-context-Dbaag70x.js +1 -0
  7. package/build/assets/add-backend-modal-C-Tr8-CM.js +1 -0
  8. package/build/assets/{agent-server-client-options-wXLeJYeM.js → agent-server-client-options-FoO1qgAQ.js} +1 -1
  9. package/build/assets/agent-server-conversation-service.api-8QGAuLAR.js +5 -0
  10. package/build/assets/{agent-settings-Blipgztd.js → agent-settings-iWfcEdL0.js} +2 -2
  11. package/build/assets/{alert-banner-Bsvys-hT.js → alert-banner-BHmoArV2.js} +1 -1
  12. package/build/assets/{analytics-consent-form-modal-D0domcuF.js → analytics-consent-form-modal-DeNk531m.js} +1 -1
  13. package/build/assets/api-key-entry-screen-BwtreCzj.js +1 -0
  14. package/build/assets/app-settings-BVi4XfBW.js +1 -0
  15. package/build/assets/automation-detail-HYDy74SR.js +1 -0
  16. package/build/assets/automations-list-BeEmkf4X.js +1 -0
  17. package/build/assets/{back-nav-button-D20Avel_.js → back-nav-button-Bckz5Wh6.js} +1 -1
  18. package/build/assets/backend-form-modal-CMKq85sE.js +1 -0
  19. package/build/assets/{backend-synced-settings-badge-Da0G6Lwv.js → backend-synced-settings-badge-Bh7rfsqx.js} +1 -1
  20. package/build/assets/{base-modal-DvuGYyu1.js → base-modal-7QRNzf6r.js} +1 -1
  21. package/build/assets/{brand-button-9SOzmqPP.js → brand-button-CKLvirxz.js} +1 -1
  22. package/build/assets/browser-D1ZybR7v.js +5 -0
  23. package/build/assets/browser-store-hzasvz9c.js +1 -0
  24. package/build/assets/{browser-tab-bveyJhG9.js → browser-tab-iOQjXzmI.js} +1 -1
  25. package/build/assets/chat-send-button-wm92Fowv.js +1 -0
  26. package/build/assets/check-DfvhVBub.js +1 -0
  27. package/build/assets/{checkmark--JWAesua.js → checkmark-BHPhb50L.js} +1 -1
  28. package/build/assets/{chevron-down-B9j6lcFg.js → chevron-down-CMkqyPEY.js} +1 -1
  29. package/build/assets/{circle-plus-check-toggle-AO9DWyDX.js → circle-plus-check-toggle-ChmnRlpR.js} +1 -1
  30. package/build/assets/{close--W-tHn1h.js → close-DBs90sI6.js} +1 -1
  31. package/build/assets/{code-tag-chmctf4w.js → code-tag-BtHOqHwB.js} +1 -1
  32. package/build/assets/{color-themes-0biOprdo.js → color-themes-CBikRn3w.js} +1 -1
  33. package/build/assets/{combobox-caret-C9BNHfSu.js → combobox-caret-evUAh6YW.js} +1 -1
  34. package/build/assets/{command-store-UzKGSUC2.js → command-store-DZfR8QtE.js} +1 -1
  35. package/build/assets/condenser-settings-DRipkbWe.js +1 -0
  36. package/build/assets/{confirmation-modal-Cq3eqvqH.js → confirmation-modal-DWuxe1zG.js} +1 -1
  37. package/build/assets/{context-menu-list-item-BQU0jZPq.js → context-menu-list-item-BbHFxHaq.js} +1 -1
  38. package/build/assets/conversation-C8c9c80b.js +1 -0
  39. package/build/assets/conversation-MUSRJNcs.js +19 -0
  40. package/build/assets/{conversation-local-storage-an3MiIiJ.js → conversation-local-storage-Btum2xBJ.js} +1 -1
  41. package/build/assets/conversation-panel-DC6L9i_c.js +1 -0
  42. package/build/assets/conversation-service.api-DSa_gYtg.js +1 -0
  43. package/build/assets/conversation-state-store-DmuPn875.js +1 -0
  44. package/build/assets/{conversation-store-FQmakEd-.js → conversation-store-Bu89Yxg1.js} +1 -1
  45. package/build/assets/{conversation-tab-empty-state-C8tztloo.js → conversation-tab-empty-state-7js7FjYM.js} +1 -1
  46. package/build/assets/{copy-CdKN5rtJ.js → copy-B0SkXenR.js} +1 -1
  47. package/build/assets/copy-to-clipboard-button-CfH2EQz9.js +1 -0
  48. package/build/assets/{createLucideIcon-CkGTf9Qj.js → createLucideIcon-Bazr-V-B.js} +1 -1
  49. package/build/assets/declaration-Cn-NXHEy.js +1 -0
  50. package/build/assets/{device-verify-YuGXnpRk.js → device-verify-CWKyQ680.js} +1 -1
  51. package/build/assets/{dist-5dObF4p4.js → dist-Cbu6eGx8.js} +1 -1
  52. package/build/assets/dist-Dg2JWLGc.js +1 -0
  53. package/build/assets/{dropdown-classes-CVp0kVdt.js → dropdown-classes-BI1bI1ho.js} +1 -1
  54. package/build/assets/edit-automation-modal-Dqkfcq9A.js +1 -0
  55. package/build/assets/{ellipsis-button-k7HLwYth.js → ellipsis-button-DdCsOBHV.js} +1 -1
  56. package/build/assets/entry.client-B9pmN700.js +2 -0
  57. package/build/assets/{enum-filter-dropdown-COqUq3mB.js → enum-filter-dropdown-WROAIeys.js} +1 -1
  58. package/build/assets/{environment-switch-overlay-wB5LxfYZ.js → environment-switch-overlay-Dv0imPE6.js} +1 -1
  59. package/build/assets/{extensions-hub-BYCLWP3d.js → extensions-hub-BBnnYspW.js} +1 -1
  60. package/build/assets/{extensions-navigation-3FLKfb6g.js → extensions-navigation-CpSuf1cO.js} +1 -1
  61. package/build/assets/{external-link-BATfjnkz.js → external-link-FsutnU75.js} +1 -1
  62. package/build/assets/files-tab-CD3kdIo4.js +1 -0
  63. package/build/assets/files-tab-store-SyvkH3ic.js +1 -0
  64. package/build/assets/{folder-DPTBlxWb.js → folder-DusyBXDE.js} +1 -1
  65. package/build/assets/{globe-Dpgjreyy.js → globe-BUcin4kT.js} +1 -1
  66. package/build/assets/home-BVmRaBEJ.js +1 -0
  67. package/build/assets/{iconBase-BVhFI-0E.js → iconBase-B6CXDDaE.js} +1 -1
  68. package/build/assets/index-redirect-nMYgOTBX.js +1 -0
  69. package/build/assets/install-server-modal-Bgk8nar-.js +1 -0
  70. package/build/assets/{launch-D3MjtcA-.js → launch-C2gF0Mkw.js} +1 -1
  71. package/build/assets/lesson-plan-BTPqWdY7.js +3 -0
  72. package/build/assets/{lightbulb-S616sGEL.js → lightbulb-BJ5tWmAh.js} +1 -1
  73. package/build/assets/{link-external-ooNztGLp.js → link-external-DUtmHAHi.js} +1 -1
  74. package/build/assets/{list-todo-nCa9zxVE.js → list-todo-C-gekh-4.js} +1 -1
  75. package/build/assets/{llm-client-D6EtdLBs.js → llm-client-BZUkZYlc.js} +1 -1
  76. package/build/assets/llm-not-configured-banner-DVqNsunp.js +27 -0
  77. package/build/assets/llm-settings-BcSSimrb.js +1 -0
  78. package/build/assets/llm-settings-CdUJTdDr.js +1 -0
  79. package/build/assets/llm-subscription-Bvu8BLXc.js +1 -0
  80. package/build/assets/llm-subscription-service-Bq6z3Wkv.js +1 -0
  81. package/build/assets/loader-circle-Cw7_q9hg.js +1 -0
  82. package/build/assets/{loading-spinner-D7bOU6I7.js → loading-spinner-RF3IlMF5.js} +1 -1
  83. package/build/assets/manage-backends-modal-CAaBa07h.js +1 -0
  84. package/build/assets/manifest-961e7d04.js +1 -0
  85. package/build/assets/markdown-renderer-Tw6FR2ad.js +2 -0
  86. package/build/assets/mcp-C9c_KlHQ.js +9 -0
  87. package/build/assets/mcp-client-ppbYplKX.js +1 -0
  88. package/build/assets/messages-C8-2eWKX.js +41 -0
  89. package/build/assets/{modal-backdrop-_VbcKk5K.js → modal-backdrop-DRpBVVW5.js} +1 -1
  90. package/build/assets/{modal-body-Cd-PtMHr.js → modal-body-CEV2O67p.js} +1 -1
  91. package/build/assets/{modal-classes-CNm4ovfm.js → modal-classes-B2DuQ9qD.js} +1 -1
  92. package/build/assets/{modal-close-button-Dbo0NAMt.js → modal-close-button-gtb7RHFB.js} +1 -1
  93. package/build/assets/model-selector-CAv3RrJ3.js +1 -0
  94. package/build/assets/{mouse-pointer-click-D0QNGSIo.js → mouse-pointer-click-B3i6HcaF.js} +1 -1
  95. package/build/assets/{navigation-context-BpAOh_t5.js → navigation-context-CM9JmTvm.js} +1 -1
  96. package/build/assets/{navigation-link-Dci7Nuyf.js → navigation-link-FmXzqR1J.js} +1 -1
  97. package/build/assets/onboarding-CVxvHm-z.js +1 -0
  98. package/build/assets/{openhands-logo-Dzm-d_V_.js → openhands-logo-B4aEO2sf.js} +1 -1
  99. package/build/assets/option-service.api-QaEq5hDS.js +1 -0
  100. package/build/assets/organization-service.api-CXTKpFnV.js +1 -0
  101. package/build/assets/{path-utils-CokieX_o.js → path-utils-wHZluw1s.js} +1 -1
  102. package/build/assets/{pencil-DPEtl5QD.js → pencil-bWrxRWlr.js} +1 -1
  103. package/build/assets/{plan-components-CutRBi0G.js → plan-components-BF-X7vnQ.js} +1 -1
  104. package/build/assets/{planner-tab-CSe7tZO-.js → planner-tab-D3X1v5ar.js} +1 -1
  105. package/build/assets/plus-BTCK8WtR.js +1 -0
  106. package/build/assets/{profiles-client-BjUo3q05.js → profiles-client-CQ9L1yHR.js} +1 -1
  107. package/build/assets/providers-CBa2Remn.js +1 -0
  108. package/build/assets/proxy-BOcEWkCD.js +1 -0
  109. package/build/assets/{react-dom-hVBnwgwZ.js → react-dom-BBXlXOZX.js} +1 -1
  110. package/build/assets/{react-CM_dJw1Z.js → react-uQK8du1l.js} +1 -1
  111. package/build/assets/{react-Dy05vyj5.js → react-x84lbX6s.js} +1 -1
  112. package/build/assets/{recommended-automations-launcher-DoWDXj6R.js → recommended-automations-launcher-D50wLWD_.js} +5 -5
  113. package/build/assets/root-BAO9x6fg.js +2 -0
  114. package/build/assets/root-PB2Jnj61.css +1 -0
  115. package/build/assets/root-layout-DqRvQdOF.js +2 -0
  116. package/build/assets/{runtime-waiting-state-8i0Z3A_i.js → runtime-waiting-state-C1hJpXxl.js} +1 -1
  117. package/build/assets/sdk-section-page-BMlZydu1.js +1 -0
  118. package/build/assets/sdk-settings-schema-z51bBmMl.js +1 -0
  119. package/build/assets/{search-C_l_XW4e.js → search-Dxm1MUMi.js} +1 -1
  120. package/build/assets/{secrets-service-Skzza9sx.js → secrets-service-DlScPUwy.js} +1 -1
  121. package/build/assets/secrets-settings-Cn4EnhYf.js +1 -0
  122. package/build/assets/settings-C0Uoj_UA.js +1 -0
  123. package/build/assets/{settings-dropdown-input-BP-arqjU.js → settings-dropdown-input-hIIAlmHb.js} +1 -1
  124. package/build/assets/{settings-gear-f-zWpxfI.js → settings-gear-DQLTCnFx.js} +1 -1
  125. package/build/assets/{settings-index-BLfmrKRl.js → settings-index-DhFGpIST.js} +1 -1
  126. package/build/assets/{settings-input-BM8ANxDb.js → settings-input-BlOzCtP3.js} +1 -1
  127. package/build/assets/{settings-list-classes-B9uo5WES.js → settings-list-classes-BFRbCy4U.js} +1 -1
  128. package/build/assets/settings-modal-HFAOyyeq.js +1 -0
  129. package/build/assets/{settings-section-header-context-Cid25HM2.js → settings-section-header-context-iz4Go0dL.js} +1 -1
  130. package/build/assets/settings-service.api-DVLwi82B.js +1 -0
  131. package/build/assets/{settings-switch-xa6q4M6j.js → settings-switch-6cXIH-UE.js} +1 -1
  132. package/build/assets/{settings-utils--H_EvFjx.js → settings-utils-CfScEaPn.js} +1 -1
  133. package/build/assets/shared-conversation-CQ2xhLBe.js +1 -0
  134. package/build/assets/sidebar-mobile-menu-toggle-CCorx3e6.js +1 -0
  135. package/build/assets/{sidebar-nav-link-BekRAssb.js → sidebar-nav-link-DFPrrDCu.js} +1 -1
  136. package/build/assets/{skill-card-pill-row-DeodrwPG.js → skill-card-pill-row-D13WRKIE.js} +1 -1
  137. package/build/assets/{skills-BE5HJuGM.js → skills-NpRk6v79.js} +1 -1
  138. package/build/assets/{skills-client-CgraS-wA.js → skills-client-DsqwQEwj.js} +1 -1
  139. package/build/assets/{skills-plugins-rIza_fUf.js → skills-plugins-DBTBZvdO.js} +1 -1
  140. package/build/assets/{skills-settings-gcnVrSpU.js → skills-settings-DHfhCQza.js} +2 -2
  141. package/build/assets/{square-chevron-right-BWAB7NPp.js → square-chevron-right-DxZKcVq4.js} +1 -1
  142. package/build/assets/{styled-tooltip-X61SEwqk.js → styled-tooltip-DG1ofAcS.js} +1 -1
  143. package/build/assets/suspense-sOGeme-f.js +1 -0
  144. package/build/assets/{switch-skeleton-BbIWemkK.js → switch-skeleton-CZ6XCVZk.js} +1 -1
  145. package/build/assets/{task-list-tab-BFnyHGsn.js → task-list-tab-CddMPNCD.js} +1 -1
  146. package/build/assets/telemetry-wqIi5m85.js +2 -0
  147. package/build/assets/{terminal-C8qpEPQ1.js → terminal-67fy8_-t.js} +1 -1
  148. package/build/assets/{terminal-B92mACR5.js → terminal-DbtwHqt4.js} +1 -1
  149. package/build/assets/{toggle-switch-CL_wRiGs.js → toggle-switch-C0t6ge2m.js} +1 -1
  150. package/build/assets/{trash-2-C-RvV8WA.js → trash-2-Dmprz0A0.js} +1 -1
  151. package/build/assets/{typography-BLSEGjph.js → typography-CNHbO1eE.js} +1 -1
  152. package/build/assets/{u-check-circle-dG_VJqx5.js → u-check-circle-CX66WzfT.js} +1 -1
  153. package/build/assets/{u-check-circle-half-D-5ZPRnd.js → u-check-circle-half-Bj853Ub0.js} +1 -1
  154. package/build/assets/{u-circuit-BXoisXOA.js → u-circuit-B9bLCP7N.js} +1 -1
  155. package/build/assets/{u-edit-DIgADxLH.js → u-edit-D7JyvoWm.js} +1 -1
  156. package/build/assets/use-acp-credential-form-T3zNfBsj.js +1 -0
  157. package/build/assets/{use-active-conversation-TDXAnMi8.js → use-active-conversation-CsZjR4Fe.js} +1 -1
  158. package/build/assets/use-agent-settings-schema-C9cpCbDO.js +1 -0
  159. package/build/assets/{use-agent-state-CLmOVbXa.js → use-agent-state-B42GkgkV.js} +1 -1
  160. package/build/assets/{use-breakpoint-DpxHDmuH.js → use-breakpoint-Cent5lpI.js} +1 -1
  161. package/build/assets/{use-click-outside-element-DhxCUyWl.js → use-click-outside-element-DOYR26nw.js} +1 -1
  162. package/build/assets/{use-cloud-current-user-id-CSm3kgqy.js → use-cloud-current-user-id-zqhuggY4.js} +1 -1
  163. package/build/assets/use-config-BZbOI79k.js +1 -0
  164. package/build/assets/use-create-conversation-DKDBT-jR.js +1 -0
  165. package/build/assets/{use-create-secret-LObNBU3M.js → use-create-secret-nNHqwnov.js} +1 -1
  166. package/build/assets/{use-event-store-DNSmyzUh.js → use-event-store-Nv92IYMU.js} +1 -1
  167. package/build/assets/use-handle-plan-click-JN-6bWzz.js +1 -0
  168. package/build/assets/use-is-authed-mnJtd2bw.js +1 -0
  169. package/build/assets/{use-launch-skill-in-chat-BTgXIu3N.js → use-launch-skill-in-chat-NDUo_UCA.js} +1 -1
  170. package/build/assets/use-llm-profiles--ZFR-3Wc.js +1 -0
  171. package/build/assets/use-runtime-is-ready-D3wdvgXm.js +1 -0
  172. package/build/assets/use-save-settings-D7-H8Jzg.js +1 -0
  173. package/build/assets/use-settings-CywotK_Q.js +1 -0
  174. package/build/assets/{use-settings-nav-items-ykMjd_NG.js → use-settings-nav-items-CmfCfBVe.js} +2 -2
  175. package/build/assets/{use-skills-BDreb1l1.js → use-skills-B9gOHrOj.js} +1 -1
  176. package/build/assets/{use-task-list-E5t-jtgs.js → use-task-list-DLKPnq3I.js} +1 -1
  177. package/build/assets/{use-tracking-C9P88zSo.js → use-tracking-C3Hy1lVb.js} +1 -1
  178. package/build/assets/{use-user-conversation-BOaassZf.js → use-user-conversation-CbMwT5GW.js} +1 -1
  179. package/build/assets/useMutation-cXADjWAv.js +1 -0
  180. package/build/assets/useQuery-BQr6A6ry.js +1 -0
  181. package/build/assets/useTranslation-Bp1btAjp.js +1 -0
  182. package/build/assets/{utils-eXk6yerZ.js → utils-o-OXNtEy.js} +1 -1
  183. package/build/assets/v4-DOSjXdIn.js +1 -0
  184. package/build/assets/{vendor~browser-tab-BGJDGHyS.js → vendor~browser-tab-642bOcE1.js} +1 -1
  185. package/build/assets/{vendor~conversation-panel~conversation-D98u43rl.js → vendor~conversation-panel~conversation-DqmbnXRn.js} +1 -1
  186. package/build/assets/{vendor~conversation-panel~conversation~alert-banner-CtjHOMO_.js → vendor~conversation-panel~conversation~alert-banner-CSDVP1nw.js} +1 -1
  187. package/build/assets/{vendor~conversation-panel~conversation~index-BXt2-3Cc.js → vendor~conversation-panel~conversation~index-DITarr3F.js} +1 -1
  188. package/build/assets/{vendor~entry.client-DrAdOKqA.js → vendor~entry.client-CQ77DucR.js} +1 -1
  189. package/build/assets/{vendor~entry.client-EcEhmoJW.js → vendor~entry.client-ePAFmSwg.js} +1 -1
  190. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~f0pn7nss-DUk-MwlC.js +177 -0
  191. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lb3qbbk3-BvmOva8I.js +1 -0
  192. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-Cl4h-NSi.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-BkQQxq_q.js} +1 -1
  193. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BmOMM-6e.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-8xF3WeB9.js} +1 -1
  194. package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-BjMt2JeR.js → vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~nyk4vv4g-UzR6fe3Y.js} +1 -1
  195. package/build/assets/{vendor~files-tab--640YzQO.js → vendor~files-tab-Cko7Kr5k.js} +1 -1
  196. package/build/assets/{vendor~home~conversation-panel~conversation-dhKA2JVJ.js → vendor~home~conversation-panel~conversation-D3otw5Jn.js} +1 -1
  197. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DMOoHVBy.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CMdKUYP2.js} +1 -1
  198. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BoE6JRJj.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DSR6Mugx.js} +1 -1
  199. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dqpi2xyZ.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DdOzMvB1.js} +1 -1
  200. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DX2CmDJ0.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dj2eezvL.js} +1 -1
  201. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BNExlCqT.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DyN8jeZz.js} +1 -1
  202. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DCn1M97v.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-lpEWrbMA.js} +1 -1
  203. package/build/assets/{vendor~launch-C0VvUe2W.js → vendor~launch-DoYO54df.js} +1 -1
  204. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-COLUW-6M.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BGwU2SbU.js} +1 -1
  205. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-eG1kjEbj.js → vendor~root-layout~home~conversation-panel~conversation-Iqs0j4Wo.js} +1 -1
  206. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-7eqKdLSQ.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-BdS6bbw9.js} +1 -1
  207. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-BP3MGAAY.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-Fd3F3jth.js} +1 -1
  208. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-Dkd2wxJA.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-Cg0AqwMN.js} +2 -2
  209. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~bxn4ldi1-_LydBB1e.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~bxn4ldi1-BlsbqRyZ.js} +1 -1
  210. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~ec6pk3ix-CBICqfKC.js +48 -0
  211. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~mcp~automati~dou5smdo-DPWYsRFL.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~nv6afr11-BYNoKMU0.js} +15 -6
  212. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CsO1gYxF.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-BspUuSsP.js} +1 -1
  213. package/build/assets/{vendor~root-layout~home~mcp~automations-list-D40jgugf.js → vendor~root-layout~home~mcp~automations-list-C9U_eOqU.js} +1 -1
  214. package/build/assets/{vendor~root-layout~home~mcp~automations-list-cNHi83v_.js → vendor~root-layout~home~mcp~automations-list-DhQ3LPVw.js} +1 -1
  215. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-xCM3k6Rd.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BEbhHQYg.js} +1 -1
  216. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BIm99UaF.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-DdgDNzMc.js} +2 -2
  217. package/build/assets/{verification-settings-EUkt_CkZ.js → verification-settings-ClzsPf1W.js} +1 -1
  218. package/build/assets/x-DCZg87p7.js +1 -0
  219. package/build/assets/{x-mark-C42svtnu.js → x-mark-jrBTJbnP.js} +1 -1
  220. package/build/index.html +4 -4
  221. package/build/locales/ar/openhands.json +22 -0
  222. package/build/locales/ca/openhands.json +22 -0
  223. package/build/locales/de/openhands.json +22 -0
  224. package/build/locales/en/openhands.json +22 -0
  225. package/build/locales/es/openhands.json +22 -0
  226. package/build/locales/fr/openhands.json +22 -0
  227. package/build/locales/it/openhands.json +22 -0
  228. package/build/locales/ja/openhands.json +22 -0
  229. package/build/locales/ko-KR/openhands.json +22 -0
  230. package/build/locales/no/openhands.json +22 -0
  231. package/build/locales/pt/openhands.json +22 -0
  232. package/build/locales/tr/openhands.json +22 -0
  233. package/build/locales/uk/openhands.json +22 -0
  234. package/build/locales/zh-CN/openhands.json +22 -0
  235. package/build/locales/zh-TW/openhands.json +22 -0
  236. package/config/defaults.json +4 -2
  237. package/dist/api/agent-server-adapter.cjs +3 -3
  238. package/dist/api/agent-server-adapter.cjs.map +1 -1
  239. package/dist/api/agent-server-adapter.d.ts +8 -0
  240. package/dist/api/agent-server-adapter.js +82 -80
  241. package/dist/api/agent-server-adapter.js.map +1 -1
  242. package/dist/api/agent-server-compatibility.cjs +1 -1
  243. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  244. package/dist/api/agent-server-compatibility.d.ts +10 -0
  245. package/dist/api/agent-server-compatibility.js +69 -25
  246. package/dist/api/agent-server-compatibility.js.map +1 -1
  247. package/dist/api/backend-registry/default-backend.cjs +1 -1
  248. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  249. package/dist/api/backend-registry/default-backend.d.ts +6 -5
  250. package/dist/api/backend-registry/default-backend.js +1 -1
  251. package/dist/api/backend-registry/default-backend.js.map +1 -1
  252. package/dist/api/backend-registry/storage.cjs +1 -1
  253. package/dist/api/backend-registry/storage.cjs.map +1 -1
  254. package/dist/api/backend-registry/storage.js +38 -68
  255. package/dist/api/backend-registry/storage.js.map +1 -1
  256. package/dist/api/cloud/proxy.cjs +1 -1
  257. package/dist/api/cloud/proxy.cjs.map +1 -1
  258. package/dist/api/cloud/proxy.d.ts +3 -16
  259. package/dist/api/cloud/proxy.js +1 -1
  260. package/dist/api/cloud/proxy.js.map +1 -1
  261. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.js +75 -75
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  265. package/dist/api/llm-subscription-service.cjs +2 -0
  266. package/dist/api/llm-subscription-service.cjs.map +1 -0
  267. package/dist/api/llm-subscription-service.d.ts +23 -0
  268. package/dist/api/llm-subscription-service.js +109 -0
  269. package/dist/api/llm-subscription-service.js.map +1 -0
  270. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  271. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  272. package/dist/api/mcp-service/mcp-service.api.d.ts +2 -3
  273. package/dist/api/mcp-service/mcp-service.api.js +38 -13
  274. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  275. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  276. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  277. package/dist/api/settings-service/settings-service.api.js +41 -42
  278. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  279. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  280. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  281. package/dist/components/conversation-events/chat/messages.js +4 -4
  282. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  283. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  284. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  285. package/dist/components/features/backends/backend-form-modal.js +136 -135
  286. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  287. package/dist/components/features/backends/backend-selector.cjs +1 -1
  288. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  289. package/dist/components/features/backends/backend-selector.js +103 -91
  290. package/dist/components/features/backends/backend-selector.js.map +1 -1
  291. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  292. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  293. package/dist/components/features/backends/manage-backends-modal.js +14 -8
  294. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  295. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  296. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
  297. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +77 -66
  298. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
  299. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  300. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  301. package/dist/components/features/mcp-page/custom-server-editor.js +1 -0
  302. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  303. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  304. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  305. package/dist/components/features/mcp-page/install-server-modal.js +73 -46
  306. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  307. package/dist/components/features/settings/brand-button.cjs +1 -1
  308. package/dist/components/features/settings/brand-button.cjs.map +1 -1
  309. package/dist/components/features/settings/brand-button.js +1 -1
  310. package/dist/components/features/settings/brand-button.js.map +1 -1
  311. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs +2 -0
  312. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs.map +1 -0
  313. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.d.ts +5 -0
  314. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js +167 -0
  315. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js.map +1 -0
  316. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  317. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  318. package/dist/components/shared/modals/settings/model-selector.d.ts +1 -2
  319. package/dist/components/shared/modals/settings/model-selector.js +59 -65
  320. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  321. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  322. package/dist/components/shared/modals/settings/settings-form.cjs.map +1 -1
  323. package/dist/components/shared/modals/settings/settings-form.js +1 -2
  324. package/dist/components/shared/modals/settings/settings-form.js.map +1 -1
  325. package/dist/config/defaults.cjs +2 -0
  326. package/dist/config/defaults.cjs.map +1 -0
  327. package/dist/config/defaults.js +35 -0
  328. package/dist/config/defaults.js.map +1 -0
  329. package/dist/constants/llm-subscription.cjs +2 -0
  330. package/dist/constants/llm-subscription.cjs.map +1 -0
  331. package/dist/constants/llm-subscription.d.ts +16 -0
  332. package/dist/constants/llm-subscription.js +47 -0
  333. package/dist/constants/llm-subscription.js.map +1 -0
  334. package/dist/contexts/conversation-websocket-context.cjs +1 -1
  335. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  336. package/dist/contexts/conversation-websocket-context.js +1 -1
  337. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  338. package/dist/hooks/mutation/use-llm-subscription-auth.cjs +2 -0
  339. package/dist/hooks/mutation/use-llm-subscription-auth.cjs.map +1 -0
  340. package/dist/hooks/mutation/use-llm-subscription-auth.d.ts +3 -0
  341. package/dist/hooks/mutation/use-llm-subscription-auth.js +30 -0
  342. package/dist/hooks/mutation/use-llm-subscription-auth.js.map +1 -0
  343. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +1 -1
  344. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -1
  345. package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +8 -6
  346. package/dist/hooks/mutation/use-save-fields-as-secrets.js +1 -1
  347. package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -1
  348. package/dist/hooks/mutation/use-test-mcp-server.d.ts +1 -1
  349. package/dist/hooks/query/query-keys.cjs +1 -1
  350. package/dist/hooks/query/query-keys.cjs.map +1 -1
  351. package/dist/hooks/query/query-keys.d.ts +5 -0
  352. package/dist/hooks/query/query-keys.js +14 -2
  353. package/dist/hooks/query/query-keys.js.map +1 -1
  354. package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
  355. package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
  356. package/dist/hooks/query/use-agent-settings-schema.d.ts +2 -2
  357. package/dist/hooks/query/use-agent-settings-schema.js +21 -19
  358. package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
  359. package/dist/hooks/query/use-backends-health.cjs +1 -1
  360. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  361. package/dist/hooks/query/use-backends-health.js +38 -36
  362. package/dist/hooks/query/use-backends-health.js.map +1 -1
  363. package/dist/hooks/query/use-llm-subscription-models.cjs +2 -0
  364. package/dist/hooks/query/use-llm-subscription-models.cjs.map +1 -0
  365. package/dist/hooks/query/use-llm-subscription-models.d.ts +3 -0
  366. package/dist/hooks/query/use-llm-subscription-models.js +19 -0
  367. package/dist/hooks/query/use-llm-subscription-models.js.map +1 -0
  368. package/dist/hooks/query/use-llm-subscription-status.cjs +2 -0
  369. package/dist/hooks/query/use-llm-subscription-status.cjs.map +1 -0
  370. package/dist/hooks/query/use-llm-subscription-status.d.ts +3 -0
  371. package/dist/hooks/query/use-llm-subscription-status.js +19 -0
  372. package/dist/hooks/query/use-llm-subscription-status.js.map +1 -0
  373. package/dist/hooks/use-websocket.cjs +1 -1
  374. package/dist/hooks/use-websocket.cjs.map +1 -1
  375. package/dist/hooks/use-websocket.d.ts +0 -1
  376. package/dist/hooks/use-websocket.js +37 -38
  377. package/dist/hooks/use-websocket.js.map +1 -1
  378. package/dist/i18n/declaration.cjs +1 -1
  379. package/dist/i18n/declaration.cjs.map +1 -1
  380. package/dist/i18n/declaration.d.ts +22 -0
  381. package/dist/i18n/declaration.js +1 -1
  382. package/dist/i18n/declaration.js.map +1 -1
  383. package/dist/i18n/translation.cjs +2 -2
  384. package/dist/i18n/translation.cjs.map +1 -1
  385. package/dist/i18n/translation.js +374 -0
  386. package/dist/i18n/translation.js.map +1 -1
  387. package/dist/locales/ar/openhands.json +22 -0
  388. package/dist/locales/ca/openhands.json +22 -0
  389. package/dist/locales/de/openhands.json +22 -0
  390. package/dist/locales/en/openhands.json +22 -0
  391. package/dist/locales/es/openhands.json +22 -0
  392. package/dist/locales/fr/openhands.json +22 -0
  393. package/dist/locales/it/openhands.json +22 -0
  394. package/dist/locales/ja/openhands.json +22 -0
  395. package/dist/locales/ko-KR/openhands.json +22 -0
  396. package/dist/locales/no/openhands.json +22 -0
  397. package/dist/locales/pt/openhands.json +22 -0
  398. package/dist/locales/tr/openhands.json +22 -0
  399. package/dist/locales/uk/openhands.json +22 -0
  400. package/dist/locales/zh-CN/openhands.json +22 -0
  401. package/dist/locales/zh-TW/openhands.json +22 -0
  402. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  403. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  404. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +10 -22
  405. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  406. package/dist/node_modules/@openhands/extensions/skills/index.cjs +15 -6
  407. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  408. package/dist/node_modules/@openhands/extensions/skills/index.js +1 -1
  409. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  410. package/dist/package.cjs +1 -1
  411. package/dist/package.cjs.map +1 -1
  412. package/dist/package.js +3 -5
  413. package/dist/package.js.map +1 -1
  414. package/dist/routes/files-tab.cjs +1 -1
  415. package/dist/routes/files-tab.cjs.map +1 -1
  416. package/dist/routes/files-tab.js +28 -17
  417. package/dist/routes/files-tab.js.map +1 -1
  418. package/dist/routes/llm-settings.cjs +1 -1
  419. package/dist/routes/llm-settings.cjs.map +1 -1
  420. package/dist/routes/llm-settings.js +143 -86
  421. package/dist/routes/llm-settings.js.map +1 -1
  422. package/dist/services/canvas-ui.cjs +1 -1
  423. package/dist/services/canvas-ui.cjs.map +1 -1
  424. package/dist/services/canvas-ui.d.ts +1 -1
  425. package/dist/services/canvas-ui.js +2 -2
  426. package/dist/services/canvas-ui.js.map +1 -1
  427. package/dist/stores/files-tab-store.cjs +1 -1
  428. package/dist/stores/files-tab-store.cjs.map +1 -1
  429. package/dist/stores/files-tab-store.d.ts +2 -1
  430. package/dist/stores/files-tab-store.js +5 -1
  431. package/dist/stores/files-tab-store.js.map +1 -1
  432. package/dist/stores/use-event-store.cjs +1 -1
  433. package/dist/stores/use-event-store.cjs.map +1 -1
  434. package/dist/stores/use-event-store.js +39 -34
  435. package/dist/stores/use-event-store.js.map +1 -1
  436. package/dist/types/mcp-server.d.ts +21 -0
  437. package/dist/ui/dropdown/dropdown.cjs +1 -1
  438. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  439. package/dist/ui/dropdown/dropdown.js +6 -2
  440. package/dist/ui/dropdown/dropdown.js.map +1 -1
  441. package/dist/utils/handle-event-for-ui.cjs +1 -1
  442. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  443. package/dist/utils/handle-event-for-ui.d.ts +2 -0
  444. package/dist/utils/handle-event-for-ui.js +1 -1
  445. package/dist/utils/handle-event-for-ui.js.map +1 -1
  446. package/dist/utils/llm-subscription-schema.cjs +2 -0
  447. package/dist/utils/llm-subscription-schema.cjs.map +1 -0
  448. package/dist/utils/llm-subscription-schema.d.ts +2 -0
  449. package/dist/utils/llm-subscription-schema.js +22 -0
  450. package/dist/utils/llm-subscription-schema.js.map +1 -0
  451. package/dist/utils/mcp-config.cjs +1 -1
  452. package/dist/utils/mcp-config.cjs.map +1 -1
  453. package/dist/utils/mcp-config.js +32 -17
  454. package/dist/utils/mcp-config.js.map +1 -1
  455. package/dist/utils/mcp-credential-validation.cjs +2 -0
  456. package/dist/utils/mcp-credential-validation.cjs.map +1 -0
  457. package/dist/utils/mcp-credential-validation.d.ts +22 -0
  458. package/dist/utils/mcp-credential-validation.js +31 -0
  459. package/dist/utils/mcp-credential-validation.js.map +1 -0
  460. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  461. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  462. package/dist/utils/mcp-marketplace-utils.d.ts +7 -2
  463. package/dist/utils/mcp-marketplace-utils.js +33 -48
  464. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  465. package/dist/utils/sdk-settings-schema.cjs +1 -1
  466. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  467. package/dist/utils/sdk-settings-schema.js +64 -61
  468. package/dist/utils/sdk-settings-schema.js.map +1 -1
  469. package/package.json +3 -5
  470. package/scripts/check-sdk-version-sync.mjs +9 -27
  471. package/scripts/dev-with-automation.mjs +1 -3
  472. package/scripts/docker-build.mjs +0 -4
  473. package/scripts/run-staged-typecheck.mjs +44 -0
  474. package/build/assets/QueryClientProvider-XcSjsfpb.js +0 -1
  475. package/build/assets/Trans-sy4l4TyQ.js +0 -1
  476. package/build/assets/active-backend-context-B2OSC-qe.js +0 -1
  477. package/build/assets/add-backend-modal-lG8XDYjr.js +0 -1
  478. package/build/assets/agent-server-adapter-B2emh2bd.js +0 -5
  479. package/build/assets/agent-server-conversation-service.api-QJAmctjl.js +0 -1
  480. package/build/assets/api-key-entry-screen-BarZU9nr.js +0 -1
  481. package/build/assets/app-settings-CofRfixq.js +0 -1
  482. package/build/assets/automation-detail-BIaQg3B1.js +0 -1
  483. package/build/assets/automations-list-NqyWbUTK.js +0 -1
  484. package/build/assets/backend-form-modal-B3BCZDPq.js +0 -1
  485. package/build/assets/browser-store-JRrcGdlk.js +0 -1
  486. package/build/assets/browser-wz8UzRmF.js +0 -5
  487. package/build/assets/chat-send-button-DdFU42vc.js +0 -1
  488. package/build/assets/check-BhnsMsWy.js +0 -1
  489. package/build/assets/condenser-settings-Bo07FAEi.js +0 -1
  490. package/build/assets/context-CI9FqkUp.js +0 -1
  491. package/build/assets/conversation-IS51UprA.js +0 -1
  492. package/build/assets/conversation-QDDJhI3U.js +0 -19
  493. package/build/assets/conversation-panel-BOSaPWpE.js +0 -1
  494. package/build/assets/conversation-service.api-CYR48oH0.js +0 -1
  495. package/build/assets/conversation-state-store-NEktJKfL.js +0 -1
  496. package/build/assets/declaration-D9ucT0fq.js +0 -1
  497. package/build/assets/dist-BCpEDEJq.js +0 -1
  498. package/build/assets/edit-automation-modal-CpA_JKLY.js +0 -1
  499. package/build/assets/entry.client-DUpefbBp.js +0 -2
  500. package/build/assets/files-tab-DZo59vtd.js +0 -1
  501. package/build/assets/files-tab-store-DSKUhziI.js +0 -1
  502. package/build/assets/home-DwZNg297.js +0 -1
  503. package/build/assets/index-redirect-BQ_55qN6.js +0 -1
  504. package/build/assets/install-server-modal-DBD6kDy0.js +0 -1
  505. package/build/assets/lesson-plan-Dz838P7k.js +0 -3
  506. package/build/assets/llm-not-configured-banner-DnrJFzRk.js +0 -27
  507. package/build/assets/llm-settings-BCwmvxk9.js +0 -1
  508. package/build/assets/llm-settings-DjZdxCR0.js +0 -1
  509. package/build/assets/loader-circle-1XB9nbwF.js +0 -1
  510. package/build/assets/manage-backends-modal-v5POMal5.js +0 -1
  511. package/build/assets/manifest-3def662b.js +0 -1
  512. package/build/assets/markdown-renderer-z446oW0Z.js +0 -2
  513. package/build/assets/mcp-B7K5rfzz.js +0 -9
  514. package/build/assets/mcp-settings-redirect-l3Zbmc0F.js +0 -1
  515. package/build/assets/messages-CKiNUUz1.js +0 -41
  516. package/build/assets/model-selector-aFK4OhGB.js +0 -1
  517. package/build/assets/onboarding-BXTpr86T.js +0 -1
  518. package/build/assets/option-service.api-CdYnKVsu.js +0 -1
  519. package/build/assets/organization-service.api-CzMvXIQT.js +0 -1
  520. package/build/assets/plus-DKUID4kd.js +0 -1
  521. package/build/assets/providers-CbpQft-X.js +0 -1
  522. package/build/assets/proxy-Bx3NeKeo.js +0 -1
  523. package/build/assets/query-client-config-Ca3tW1AH.js +0 -1
  524. package/build/assets/root-CRkz_h2T.css +0 -1
  525. package/build/assets/root-CWzVAsvD.js +0 -2
  526. package/build/assets/root-layout-BrKjMGHZ.js +0 -2
  527. package/build/assets/sdk-section-page-DPBwwLle.js +0 -1
  528. package/build/assets/sdk-settings-schema-Big50zDH.js +0 -1
  529. package/build/assets/secrets-settings-DmpsTC9V.js +0 -1
  530. package/build/assets/settings-ChsRtIJQ.js +0 -1
  531. package/build/assets/settings-modal-uHPPWYSS.js +0 -1
  532. package/build/assets/settings-service.api-CcpckquT.js +0 -1
  533. package/build/assets/shared-conversation-DJDrV3Gn.js +0 -1
  534. package/build/assets/sidebar-mobile-menu-toggle-hWfhojwa.js +0 -1
  535. package/build/assets/suspense-Bqb0V0q1.js +0 -1
  536. package/build/assets/telemetry-BPbYj5YU.js +0 -2
  537. package/build/assets/use-acp-credential-form-Dj7Jkhgp.js +0 -1
  538. package/build/assets/use-agent-settings-schema-Lf_lBAky.js +0 -1
  539. package/build/assets/use-config-DVU9HaPf.js +0 -1
  540. package/build/assets/use-create-conversation-DR9x_AZF.js +0 -1
  541. package/build/assets/use-handle-plan-click-Dx4MJQoh.js +0 -1
  542. package/build/assets/use-is-authed-B8eLO-Xq.js +0 -1
  543. package/build/assets/use-llm-profiles-BBTR-OsK.js +0 -1
  544. package/build/assets/use-runtime-is-ready-Bu6I0EBx.js +0 -1
  545. package/build/assets/use-save-settings-7_MLft-Y.js +0 -1
  546. package/build/assets/use-settings-CNsxccvQ.js +0 -1
  547. package/build/assets/useMutation-Dm84WAKR.js +0 -1
  548. package/build/assets/useQuery-DGRSm7IT.js +0 -1
  549. package/build/assets/useTranslation-CL6FTf1b.js +0 -1
  550. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dqseey1n-D_BSEDk4.js +0 -1
  551. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfbjdnyv-C5ZIbuq8.js +0 -177
  552. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-DQE89epK.js +0 -48
  553. package/build/assets/x-CCfDppg5.js +0 -1
  554. package/dist/api/settings-service/legacy-app-preferences-migration.cjs +0 -2
  555. package/dist/api/settings-service/legacy-app-preferences-migration.cjs.map +0 -1
  556. package/dist/api/settings-service/legacy-app-preferences-migration.d.ts +0 -34
  557. package/dist/api/settings-service/legacy-app-preferences-migration.js +0 -52
  558. package/dist/api/settings-service/legacy-app-preferences-migration.js.map +0 -1
  559. package/dist/hooks/query/use-openhands-verified-models.cjs +0 -2
  560. package/dist/hooks/query/use-openhands-verified-models.cjs.map +0 -1
  561. package/dist/hooks/query/use-openhands-verified-models.d.ts +0 -1
  562. package/dist/hooks/query/use-openhands-verified-models.js +0 -14
  563. package/dist/hooks/query/use-openhands-verified-models.js.map +0 -1
  564. package/dist/utils/normalize-display-model.cjs +0 -2
  565. package/dist/utils/normalize-display-model.cjs.map +0 -1
  566. package/dist/utils/normalize-display-model.d.ts +0 -9
  567. package/dist/utils/normalize-display-model.js +0 -13
  568. package/dist/utils/normalize-display-model.js.map +0 -1
  569. package/dist/utils/openhands-llm.cjs +0 -2
  570. package/dist/utils/openhands-llm.cjs.map +0 -1
  571. package/dist/utils/openhands-llm.d.ts +0 -6
  572. package/dist/utils/openhands-llm.js +0 -9
  573. package/dist/utils/openhands-llm.js.map +0 -1
  574. /package/build/assets/{agent-server-ui-style-scope-BwIZYdC1.js → agent-server-ui-style-scope-1MuaCC1k.js} +0 -0
  575. /package/build/assets/{common-Dh7OqABE.js → common-DqjLSBOt.js} +0 -0
  576. /package/build/assets/{environment-switch-store-CiurvTtK.js → environment-switch-store-CBXkf5bS.js} +0 -0
  577. /package/build/assets/{extension-module-card-classes-DP5J6ngE.js → extension-module-card-classes-CVGfXtoL.js} +0 -0
  578. /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-DVFXF1_X.js} +0 -0
  579. /package/build/assets/{handle-capture-consent-CPMXU29K.js → handle-capture-consent-BTvatyfE.js} +0 -0
  580. /package/build/assets/{map-provider-BM2SJarp.js → map-provider-COgsZR9p.js} +0 -0
  581. /package/build/assets/{objectWithoutPropertiesLoose-DSQKyRhw.js → objectWithoutPropertiesLoose-B80nTzVc.js} +0 -0
  582. /package/build/assets/{preload-helper-CT1Z6Pdu.js → preload-helper-D_sPnjeL.js} +0 -0
  583. /package/build/assets/{rolldown-runtime-BFRubm34.js → rolldown-runtime-wFmyQBCi.js} +0 -0
  584. /package/build/assets/{sdk-settings-field-metadata-p2GVlft7.js → sdk-settings-field-metadata-Cc4D-ut7.js} +0 -0
  585. /package/build/assets/{settings-wh2sLLJM.js → settings-1287uR2J.js} +0 -0
  586. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nh19ovoo-DJTFnsA1.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~cg1m3bv7-aUIHudsf.js} +0 -0
  587. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ntycl9e1-BmZcy_kH.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ntycl9e1-DPPGSgT1.js} +0 -0
@@ -12,125 +12,119 @@ import { extractModelAndProvider as u } from "../../../../utils/extract-model-an
12
12
  import { HelpLink as d } from "../../../../ui/help-link.js";
13
13
  import { useSearchProviders as f } from "../../../../hooks/query/use-search-providers.js";
14
14
  import { useProviderModels as p } from "../../../../hooks/query/use-provider-models.js";
15
- import { useOpenhandsVerifiedModels as m } from "../../../../hooks/query/use-openhands-verified-models.js";
16
- import { normalizeDisplayModel as h } from "../../../../utils/normalize-display-model.js";
17
- import g from "react";
18
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
15
+ import m from "react";
16
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
19
17
  //#region src/components/shared/modals/settings/model-selector.tsx
20
- function y({ isDisabled: y, currentModel: b, currentBaseUrl: x, onChange: S, onDefaultValuesChanged: C, wrapperClassName: w, labelClassName: T }) {
21
- let [, E] = g.useState(null), [D, O] = g.useState(null), [k, A] = g.useState(null), { data: j = [] } = f(), { data: M } = m(), { data: N = [], isLoading: P, error: F } = p(D), I = g.useMemo(() => j.filter((e) => e.verified), [j]), L = g.useMemo(() => j.filter((e) => !e.verified), [j]), R = g.useMemo(() => N.filter((e) => e.verified), [N]), z = g.useMemo(() => N.filter((e) => !e.verified), [N]);
22
- g.useEffect(() => {
23
- if (b && M !== void 0) {
24
- let e = h(b, x, M), { provider: t, model: n } = u(e);
25
- E(e), O(t || null), A(n), C?.(t || null, n);
18
+ function _({ isDisabled: _, currentModel: v, onChange: y, onDefaultValuesChanged: b, wrapperClassName: x, labelClassName: S }) {
19
+ let [, C] = m.useState(null), [w, T] = m.useState(null), [E, D] = m.useState(null), { data: O = [] } = f(), { data: k = [], isLoading: A, error: j } = p(w), M = m.useMemo(() => O.filter((e) => e.verified), [O]), N = m.useMemo(() => O.filter((e) => !e.verified), [O]), P = m.useMemo(() => k.filter((e) => e.verified), [k]), F = m.useMemo(() => k.filter((e) => !e.verified), [k]);
20
+ m.useEffect(() => {
21
+ if (v) {
22
+ let { provider: e, model: t } = u(v);
23
+ C(v), T(e || null), D(t), b?.(e || null, t);
26
24
  }
27
- }, [
28
- b,
29
- x,
30
- M
31
- ]);
32
- let B = (e) => {
33
- O(e), A(null), E(`${e}/`), S?.(e, null);
34
- }, V = (e) => {
35
- let t = `${D}/${e}`;
36
- D === "openai" && (t = e), E(t), A(e), S?.(D, e);
37
- }, H = () => {
38
- O(null), E(null);
39
- }, { t: U } = e("openhands");
40
- return /* @__PURE__ */ v("div", {
41
- className: r("flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]", w),
25
+ }, [v]);
26
+ let I = (e) => {
27
+ T(e), D(null), C(`${e}/`), y?.(e, null);
28
+ }, L = (e) => {
29
+ let t = `${w}/${e}`;
30
+ w === "openai" && (t = e), C(t), D(e), y?.(w, e);
31
+ }, R = () => {
32
+ T(null), C(null);
33
+ }, { t: z } = e("openhands");
34
+ return /* @__PURE__ */ g("div", {
35
+ className: r("flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]", x),
42
36
  children: [
43
- /* @__PURE__ */ v("fieldset", {
37
+ /* @__PURE__ */ g("fieldset", {
44
38
  className: "flex flex-col gap-2.5 w-full",
45
- children: [/* @__PURE__ */ _("label", {
46
- className: r("text-sm", T),
47
- children: U(t.LLM$PROVIDER)
48
- }), /* @__PURE__ */ v(s, {
39
+ children: [/* @__PURE__ */ h("label", {
40
+ className: r("text-sm", S),
41
+ children: z(t.LLM$PROVIDER)
42
+ }), /* @__PURE__ */ g(s, {
49
43
  "data-testid": "llm-provider-input",
50
44
  isRequired: !0,
51
45
  isVirtualized: !1,
52
46
  name: "llm-provider-input",
53
- isDisabled: y,
54
- "aria-label": U(t.LLM$PROVIDER),
47
+ isDisabled: _,
48
+ "aria-label": z(t.LLM$PROVIDER),
55
49
  isClearable: !1,
56
50
  onSelectionChange: (e) => {
57
- e?.toString() && B(e.toString());
51
+ e?.toString() && I(e.toString());
58
52
  },
59
- onInputChange: (e) => !e && H(),
60
- defaultSelectedKey: D ?? void 0,
61
- selectedKey: D,
53
+ onInputChange: (e) => !e && R(),
54
+ defaultSelectedKey: w ?? void 0,
55
+ selectedKey: w,
62
56
  classNames: {
63
57
  popoverContent: "bg-content1 rounded-xl border border-[var(--oh-border)]",
64
58
  selectorButton: c
65
59
  },
66
60
  selectorButtonProps: { disableRipple: !0 },
67
61
  inputProps: { classNames: { inputWrapper: i } },
68
- children: [/* @__PURE__ */ _(o, {
69
- title: U(t.MODEL_SELECTOR$VERIFIED),
62
+ children: [/* @__PURE__ */ h(o, {
63
+ title: z(t.MODEL_SELECTOR$VERIFIED),
70
64
  classNames: { heading: "text-[var(--oh-muted)]" },
71
- children: I.map((e) => /* @__PURE__ */ _(a, {
65
+ children: M.map((e) => /* @__PURE__ */ h(a, {
72
66
  "data-testid": `provider-item-${e.name}`,
73
67
  children: l(e.name)
74
68
  }, e.name))
75
- }), L.length > 0 ? /* @__PURE__ */ _(o, {
76
- title: U(t.MODEL_SELECTOR$OTHERS),
69
+ }), N.length > 0 ? /* @__PURE__ */ h(o, {
70
+ title: z(t.MODEL_SELECTOR$OTHERS),
77
71
  classNames: { heading: "text-[var(--oh-muted)]" },
78
- children: L.map((e) => /* @__PURE__ */ _(a, { children: l(e.name) }, e.name))
72
+ children: N.map((e) => /* @__PURE__ */ h(a, { children: l(e.name) }, e.name))
79
73
  }) : null]
80
74
  })]
81
75
  }),
82
- D === "openhands" && /* @__PURE__ */ _(d, {
76
+ w === "openhands" && /* @__PURE__ */ h(d, {
83
77
  testId: "openhands-account-help",
84
- text: U(t.SETTINGS$NEED_OPENHANDS_ACCOUNT),
85
- linkText: U(t.SETTINGS$CLICK_HERE),
78
+ text: z(t.SETTINGS$NEED_OPENHANDS_ACCOUNT),
79
+ linkText: z(t.SETTINGS$CLICK_HERE),
86
80
  href: n.PRODUCTION,
87
81
  size: "settings",
88
82
  linkColor: "white"
89
83
  }),
90
- /* @__PURE__ */ v("fieldset", {
84
+ /* @__PURE__ */ g("fieldset", {
91
85
  className: "flex flex-col gap-2.5 w-full",
92
86
  children: [
93
- /* @__PURE__ */ _("label", {
94
- className: r("text-sm", T),
95
- children: U(t.LLM$MODEL)
87
+ /* @__PURE__ */ h("label", {
88
+ className: r("text-sm", S),
89
+ children: z(t.LLM$MODEL)
96
90
  }),
97
- /* @__PURE__ */ v(s, {
91
+ /* @__PURE__ */ g(s, {
98
92
  "data-testid": "llm-model-input",
99
93
  isRequired: !0,
100
94
  isVirtualized: !1,
101
- isLoading: P,
95
+ isLoading: A,
102
96
  name: "llm-model-input",
103
- "aria-label": U(t.LLM$MODEL),
97
+ "aria-label": z(t.LLM$MODEL),
104
98
  isClearable: !1,
105
99
  onSelectionChange: (e) => {
106
- e?.toString() && V(e.toString());
100
+ e?.toString() && L(e.toString());
107
101
  },
108
- isDisabled: y || !D,
109
- selectedKey: k,
110
- defaultSelectedKey: k ?? void 0,
102
+ isDisabled: _ || !w,
103
+ selectedKey: E,
104
+ defaultSelectedKey: E ?? void 0,
111
105
  classNames: {
112
106
  popoverContent: "bg-content1 rounded-xl border border-[var(--oh-border)]",
113
107
  selectorButton: c
114
108
  },
115
109
  selectorButtonProps: { disableRipple: !0 },
116
110
  inputProps: { classNames: { inputWrapper: i } },
117
- children: [/* @__PURE__ */ _(o, {
118
- title: U(t.MODEL_SELECTOR$VERIFIED),
111
+ children: [/* @__PURE__ */ h(o, {
112
+ title: z(t.MODEL_SELECTOR$VERIFIED),
119
113
  classNames: { heading: "text-[var(--oh-muted)]" },
120
- children: R.map((e) => /* @__PURE__ */ _(a, { children: e.name }, e.name))
121
- }), z.length > 0 ? /* @__PURE__ */ _(o, {
122
- title: U(t.MODEL_SELECTOR$OTHERS),
114
+ children: P.map((e) => /* @__PURE__ */ h(a, { children: e.name }, e.name))
115
+ }), F.length > 0 ? /* @__PURE__ */ h(o, {
116
+ title: z(t.MODEL_SELECTOR$OTHERS),
123
117
  classNames: { heading: "text-[var(--oh-muted)]" },
124
- children: z.map((e) => /* @__PURE__ */ _(a, {
118
+ children: F.map((e) => /* @__PURE__ */ h(a, {
125
119
  "data-testid": `model-item-${e.name}`,
126
120
  children: e.name
127
121
  }, e.name))
128
122
  }) : null]
129
123
  }),
130
- F && /* @__PURE__ */ _("p", {
124
+ j && /* @__PURE__ */ h("p", {
131
125
  "data-testid": "models-error",
132
126
  className: "text-danger text-xs",
133
- children: U(t.CONFIGURATION$ERROR_FETCH_MODELS)
127
+ children: z(t.CONFIGURATION$ERROR_FETCH_MODELS)
134
128
  })
135
129
  ]
136
130
  })
@@ -138,6 +132,6 @@ function y({ isDisabled: y, currentModel: b, currentBaseUrl: x, onChange: S, onD
138
132
  });
139
133
  }
140
134
  //#endregion
141
- export { y as ModelSelector };
135
+ export { _ as ModelSelector };
142
136
 
143
137
  //# 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 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 { useOpenhandsVerifiedModels } from \"#/hooks/query/use-openhands-verified-models\";\nimport { normalizeDisplayModel } from \"#/utils/normalize-display-model\";\n\ninterface ModelSelectorProps {\n isDisabled?: boolean;\n currentModel?: string;\n currentBaseUrl?: 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 currentBaseUrl,\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 { data: openhandsVerifiedModels } = useOpenhandsVerifiedModels();\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 // Wait for the openhands verified list before initializing — otherwise a\n // persisted `litellm_proxy/<m>` model would first land as `litellm_proxy`\n // and only later flip to `openhands`, triggering a redundant /api/llm/models\n // fetch for the throwaway provider value.\n if (currentModel && openhandsVerifiedModels !== undefined) {\n const displayModel = normalizeDisplayModel(\n currentModel,\n currentBaseUrl,\n openhandsVerifiedModels,\n );\n const { provider, model } = extractModelAndProvider(displayModel);\n\n setLitellmId(displayModel);\n setSelectedProvider(provider || null);\n setSelectedModel(model);\n onDefaultValuesChanged?.(provider || null, model);\n }\n }, [currentModel, currentBaseUrl, openhandsVerifiedModels]);\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 { 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 <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 )}\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 <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}>{model.name}</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 >\n {model.name}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n {modelsError && (\n <p data-testid=\"models-error\" className=\"text-danger text-xs\">\n {t(I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}\n </p>\n )}\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\";\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 { 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 <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 )}\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 <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}>{model.name}</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 >\n {model.name}\n </AutocompleteItem>\n ))}\n </AutocompleteSection>\n ) : null}\n </Autocomplete>\n {modelsError && (\n <p data-testid=\"models-error\" className=\"text-danger text-xs\">\n {t(I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}\n </p>\n )}\n </fieldset>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../utils/constants.cjs`),i=require(`../../../../context/navigation-context.cjs`),a=require(`../../../../hooks/use-tracking.cjs`),o=require(`../modal-backdrop.cjs`),s=require(`../../../features/settings/brand-button.cjs`),c=require(`../../../../utils/settings-utils.cjs`),l=require(`../../../../hooks/mutation/use-save-settings.cjs`),u=require(`../../../features/settings/settings-input.cjs`),d=require(`../../../../ui/help-link.cjs`),f=require(`./model-selector.cjs`),p=require(`../../../../utils/sdk-settings-schema.cjs`),m=require(`../confirmation-modals/danger-modal.cjs`);let h=require(`react`);h=e.__toESM(h,1);let g=require(`react/jsx-runtime`);function _({settings:e,onClose:_}){let{trackSettingsSaved:v}=a.useTracking(),{mutate:y}=l.useSaveSettings(),{currentPath:b}=i.useNavigation(),{t:x}=t.useTranslation(`openhands`),S=h.default.useRef(null),[C,w]=h.default.useState(!1),T=async e=>{let t=c.extractSettings(e);await y(t,{onSuccess:()=>{_();let e=t.agent_settings_diff?.llm??{};v({llmModel:e.model,llmApiKeySet:e.api_key?`SET`:`UNSET`,searchApiKeySet:t.search_api_key?`SET`:`UNSET`,remoteRuntimeResourceFactor:t.remote_runtime_resource_factor})}})},E=()=>{T(new FormData(S.current??void 0))},D=e=>{e.preventDefault();let t=new FormData(e.currentTarget);b.startsWith(`/conversations/`)?w(!0):T(t)},O=e.llm_api_key_set,k=p.getAgentSettingValue(e,`llm.model`),A=p.getAgentSettingValue(e,`llm.base_url`);return(0,g.jsxs)(`div`,{children:[(0,g.jsxs)(`form`,{ref:S,"data-testid":`settings-form`,className:`flex flex-col gap-6`,onSubmit:D,children:[(0,g.jsxs)(`div`,{className:`flex flex-col gap-[17px]`,children:[(0,g.jsx)(f.ModelSelector,{currentModel:typeof k==`string`?k:void 0,currentBaseUrl:typeof A==`string`?A:void 0,wrapperClassName:`!flex-col !gap-[17px]`,labelClassName:r.SETTINGS_FORM.LABEL_CLASSNAME}),(0,g.jsx)(u.SettingsInput,{testId:`llm-api-key-input`,name:`llm-api-key-input`,label:x(n.I18nKey.SETTINGS_FORM$API_KEY),type:`password`,className:`w-full`,placeholder:O?`<hidden>`:``,labelClassName:r.SETTINGS_FORM.LABEL_CLASSNAME}),(0,g.jsx)(d.HelpLink,{testId:`llm-api-key-help-anchor`,text:x(n.I18nKey.SETTINGS$DONT_KNOW_API_KEY),linkText:x(n.I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS),href:`https://docs.openhands.dev/usage/local-setup#getting-an-api-key`,size:`settings`,linkColor:`white`})]}),(0,g.jsx)(`div`,{className:`flex flex-col gap-2`,children:(0,g.jsx)(s.BrandButton,{testId:`save-settings-button`,type:`submit`,variant:`primary`,className:`w-full`,children:x(n.I18nKey.BUTTON$SAVE)})})]}),C&&(0,g.jsx)(o.ModalBackdrop,{children:(0,g.jsx)(m.DangerModal,{title:x(n.I18nKey.MODAL$END_SESSION_TITLE),description:x(n.I18nKey.MODAL$END_SESSION_MESSAGE),buttons:{danger:{text:x(n.I18nKey.BUTTON$END_SESSION),onClick:E},cancel:{text:x(n.I18nKey.BUTTON$CANCEL),onClick:()=>w(!1)}}})})]})}exports.SettingsForm=_;
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../utils/constants.cjs`),i=require(`../../../../context/navigation-context.cjs`),a=require(`../../../../hooks/use-tracking.cjs`),o=require(`../modal-backdrop.cjs`),s=require(`../../../features/settings/brand-button.cjs`),c=require(`../../../../utils/settings-utils.cjs`),l=require(`../../../../hooks/mutation/use-save-settings.cjs`),u=require(`../../../features/settings/settings-input.cjs`),d=require(`../../../../ui/help-link.cjs`),f=require(`./model-selector.cjs`),p=require(`../../../../utils/sdk-settings-schema.cjs`),m=require(`../confirmation-modals/danger-modal.cjs`);let h=require(`react`);h=e.__toESM(h,1);let g=require(`react/jsx-runtime`);function _({settings:e,onClose:_}){let{trackSettingsSaved:v}=a.useTracking(),{mutate:y}=l.useSaveSettings(),{currentPath:b}=i.useNavigation(),{t:x}=t.useTranslation(`openhands`),S=h.default.useRef(null),[C,w]=h.default.useState(!1),T=async e=>{let t=c.extractSettings(e);await y(t,{onSuccess:()=>{_();let e=t.agent_settings_diff?.llm??{};v({llmModel:e.model,llmApiKeySet:e.api_key?`SET`:`UNSET`,searchApiKeySet:t.search_api_key?`SET`:`UNSET`,remoteRuntimeResourceFactor:t.remote_runtime_resource_factor})}})},E=()=>{T(new FormData(S.current??void 0))},D=e=>{e.preventDefault();let t=new FormData(e.currentTarget);b.startsWith(`/conversations/`)?w(!0):T(t)},O=e.llm_api_key_set,k=p.getAgentSettingValue(e,`llm.model`);return(0,g.jsxs)(`div`,{children:[(0,g.jsxs)(`form`,{ref:S,"data-testid":`settings-form`,className:`flex flex-col gap-6`,onSubmit:D,children:[(0,g.jsxs)(`div`,{className:`flex flex-col gap-[17px]`,children:[(0,g.jsx)(f.ModelSelector,{currentModel:typeof k==`string`?k:void 0,wrapperClassName:`!flex-col !gap-[17px]`,labelClassName:r.SETTINGS_FORM.LABEL_CLASSNAME}),(0,g.jsx)(u.SettingsInput,{testId:`llm-api-key-input`,name:`llm-api-key-input`,label:x(n.I18nKey.SETTINGS_FORM$API_KEY),type:`password`,className:`w-full`,placeholder:O?`<hidden>`:``,labelClassName:r.SETTINGS_FORM.LABEL_CLASSNAME}),(0,g.jsx)(d.HelpLink,{testId:`llm-api-key-help-anchor`,text:x(n.I18nKey.SETTINGS$DONT_KNOW_API_KEY),linkText:x(n.I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS),href:`https://docs.openhands.dev/usage/local-setup#getting-an-api-key`,size:`settings`,linkColor:`white`})]}),(0,g.jsx)(`div`,{className:`flex flex-col gap-2`,children:(0,g.jsx)(s.BrandButton,{testId:`save-settings-button`,type:`submit`,variant:`primary`,className:`w-full`,children:x(n.I18nKey.BUTTON$SAVE)})})]}),C&&(0,g.jsx)(o.ModalBackdrop,{children:(0,g.jsx)(m.DangerModal,{title:x(n.I18nKey.MODAL$END_SESSION_TITLE),description:x(n.I18nKey.MODAL$END_SESSION_MESSAGE),buttons:{danger:{text:x(n.I18nKey.BUTTON$END_SESSION),onClick:E},cancel:{text:x(n.I18nKey.BUTTON$CANCEL),onClick:()=>w(!1)}}})})]})}exports.SettingsForm=_;
2
2
  //# sourceMappingURL=settings-form.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-form.cjs","names":[],"sources":["../../../../../src/components/shared/modals/settings/settings-form.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport React from \"react\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { DangerModal } from \"../confirmation-modals/danger-modal\";\nimport { extractSettings } from \"#/utils/settings-utils\";\nimport { ModalBackdrop } from \"../modal-backdrop\";\nimport { ModelSelector } from \"./model-selector\";\nimport { Settings } from \"#/types/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { getAgentSettingValue } from \"#/utils/sdk-settings-schema\";\nimport { SETTINGS_FORM } from \"#/utils/constants\";\n\ninterface SettingsFormProps {\n settings: Settings;\n onClose: () => void;\n}\n\nexport function SettingsForm({ settings, onClose }: SettingsFormProps) {\n const { trackSettingsSaved } = useTracking();\n const { mutate: saveUserSettings } = useSaveSettings();\n const { currentPath } = useNavigation();\n const { t } = useTranslation(\"openhands\");\n\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] =\n React.useState(false);\n\n const handleFormSubmission = async (formData: FormData) => {\n const newSettings = extractSettings(formData);\n\n await saveUserSettings(newSettings, {\n onSuccess: () => {\n onClose();\n\n const agentLlm =\n ((newSettings.agent_settings_diff as Record<string, unknown>)\n ?.llm as Record<string, unknown>) ?? {};\n trackSettingsSaved({\n llmModel: agentLlm.model,\n llmApiKeySet: agentLlm.api_key ? \"SET\" : \"UNSET\",\n searchApiKeySet: newSettings.search_api_key ? \"SET\" : \"UNSET\",\n remoteRuntimeResourceFactor:\n newSettings.remote_runtime_resource_factor,\n });\n },\n });\n };\n\n const handleConfirmEndSession = () => {\n const formData = new FormData(formRef.current ?? undefined);\n handleFormSubmission(formData);\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n\n if (currentPath.startsWith(\"/conversations/\")) {\n setConfirmEndSessionModalOpen(true);\n } else {\n handleFormSubmission(formData);\n }\n };\n\n const isLLMKeySet = settings.llm_api_key_set;\n const currentModel = getAgentSettingValue(settings, \"llm.model\");\n const currentBaseUrl = getAgentSettingValue(settings, \"llm.base_url\");\n\n return (\n <div>\n <form\n ref={formRef}\n data-testid=\"settings-form\"\n className=\"flex flex-col gap-6\"\n onSubmit={handleSubmit}\n >\n <div className=\"flex flex-col gap-[17px]\">\n <ModelSelector\n currentModel={\n typeof currentModel === \"string\" ? currentModel : undefined\n }\n currentBaseUrl={\n typeof currentBaseUrl === \"string\" ? currentBaseUrl : undefined\n }\n wrapperClassName=\"!flex-col !gap-[17px]\"\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <SettingsInput\n testId=\"llm-api-key-input\"\n name=\"llm-api-key-input\"\n label={t(I18nKey.SETTINGS_FORM$API_KEY)}\n type=\"password\"\n className=\"w-full\"\n placeholder={isLLMKeySet ? \"<hidden>\" : \"\"}\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <HelpLink\n testId=\"llm-api-key-help-anchor\"\n text={t(I18nKey.SETTINGS$DONT_KNOW_API_KEY)}\n linkText={t(I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS)}\n href=\"https://docs.openhands.dev/usage/local-setup#getting-an-api-key\"\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <BrandButton\n testId=\"save-settings-button\"\n type=\"submit\"\n variant=\"primary\"\n className=\"w-full\"\n >\n {t(I18nKey.BUTTON$SAVE)}\n </BrandButton>\n </div>\n </form>\n\n {confirmEndSessionModalOpen && (\n <ModalBackdrop>\n <DangerModal\n title={t(I18nKey.MODAL$END_SESSION_TITLE)}\n description={t(I18nKey.MODAL$END_SESSION_MESSAGE)}\n buttons={{\n danger: {\n text: t(I18nKey.BUTTON$END_SESSION),\n onClick: handleConfirmEndSession,\n },\n cancel: {\n text: t(I18nKey.BUTTON$CANCEL),\n onClick: () => setConfirmEndSessionModalOpen(false),\n },\n }}\n />\n </ModalBackdrop>\n )}\n </div>\n );\n}\n"],"mappings":"01BAsBA,SAAgB,EAAa,CAAE,WAAU,WAA8B,CACrE,GAAM,CAAE,sBAAuB,EAAA,aAAa,CACtC,CAAE,OAAQ,GAAqB,EAAA,iBAAiB,CAChD,CAAE,eAAgB,EAAA,eAAe,CACjC,CAAE,KAAM,EAAA,eAAe,YAAY,CAEnC,EAAU,EAAA,QAAM,OAAwB,KAAK,CAE7C,CAAC,EAA4B,GACjC,EAAA,QAAM,SAAS,GAAM,CAEjB,EAAuB,KAAO,IAAuB,CACzD,IAAM,EAAc,EAAA,gBAAgB,EAAS,CAE7C,MAAM,EAAiB,EAAa,CAClC,cAAiB,CACf,GAAS,CAET,IAAM,EACF,EAAY,qBACV,KAAmC,EAAE,CAC3C,EAAmB,CACjB,SAAU,EAAS,MACnB,aAAc,EAAS,QAAU,MAAQ,QACzC,gBAAiB,EAAY,eAAiB,MAAQ,QACtD,4BACE,EAAY,+BACf,CAAC,EAEL,CAAC,EAGE,MAAgC,CAEpC,EAAqB,IADA,SAAS,EAAQ,SAAW,IAAA,GAC5B,CAAS,EAG1B,EAAgB,GAA4C,CAChE,EAAM,gBAAgB,CACtB,IAAM,EAAW,IAAI,SAAS,EAAM,cAAc,CAE9C,EAAY,WAAW,kBAAkB,CAC3C,EAA8B,GAAK,CAEnC,EAAqB,EAAS,EAI5B,EAAc,EAAS,gBACvB,EAAe,EAAA,qBAAqB,EAAU,YAAY,CAC1D,EAAiB,EAAA,qBAAqB,EAAU,eAAe,CAErE,OACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,MAAC,OAAD,CACE,IAAK,EACL,cAAY,gBACZ,UAAU,sBACV,SAAU,WAJZ,EAME,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oCAAf,EACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,aACE,OAAO,GAAiB,SAAW,EAAe,IAAA,GAEpD,eACE,OAAO,GAAmB,SAAW,EAAiB,IAAA,GAExD,iBAAiB,wBACjB,eAAgB,EAAA,cAAc,gBAC9B,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,oBACP,KAAK,oBACL,MAAO,EAAE,EAAA,QAAQ,sBAAsB,CACvC,KAAK,WACL,UAAU,SACV,YAAa,EAAc,WAAa,GACxC,eAAgB,EAAA,cAAc,gBAC9B,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,SAAD,CACE,OAAO,0BACP,KAAM,EAAE,EAAA,QAAQ,2BAA2B,CAC3C,SAAU,EAAE,EAAA,QAAQ,gCAAgC,CACpD,KAAK,kEACL,KAAK,WACL,UAAU,QACV,CAAA,CACE,IAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACb,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,uBACP,KAAK,SACL,QAAQ,UACR,UAAU,kBAET,EAAE,EAAA,QAAQ,YAAY,CACX,CAAA,CACV,CAAA,CACD,GAEN,IACC,EAAA,EAAA,KAAC,EAAA,cAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,MAAO,EAAE,EAAA,QAAQ,wBAAwB,CACzC,YAAa,EAAE,EAAA,QAAQ,0BAA0B,CACjD,QAAS,CACP,OAAQ,CACN,KAAM,EAAE,EAAA,QAAQ,mBAAmB,CACnC,QAAS,EACV,CACD,OAAQ,CACN,KAAM,EAAE,EAAA,QAAQ,cAAc,CAC9B,YAAe,EAA8B,GAAM,CACpD,CACF,CACD,CAAA,CACY,CAAA,CAEd,CAAA,CAAA"}
1
+ {"version":3,"file":"settings-form.cjs","names":[],"sources":["../../../../../src/components/shared/modals/settings/settings-form.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport React from \"react\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { DangerModal } from \"../confirmation-modals/danger-modal\";\nimport { extractSettings } from \"#/utils/settings-utils\";\nimport { ModalBackdrop } from \"../modal-backdrop\";\nimport { ModelSelector } from \"./model-selector\";\nimport { Settings } from \"#/types/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { getAgentSettingValue } from \"#/utils/sdk-settings-schema\";\nimport { SETTINGS_FORM } from \"#/utils/constants\";\n\ninterface SettingsFormProps {\n settings: Settings;\n onClose: () => void;\n}\n\nexport function SettingsForm({ settings, onClose }: SettingsFormProps) {\n const { trackSettingsSaved } = useTracking();\n const { mutate: saveUserSettings } = useSaveSettings();\n const { currentPath } = useNavigation();\n const { t } = useTranslation(\"openhands\");\n\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] =\n React.useState(false);\n\n const handleFormSubmission = async (formData: FormData) => {\n const newSettings = extractSettings(formData);\n\n await saveUserSettings(newSettings, {\n onSuccess: () => {\n onClose();\n\n const agentLlm =\n ((newSettings.agent_settings_diff as Record<string, unknown>)\n ?.llm as Record<string, unknown>) ?? {};\n trackSettingsSaved({\n llmModel: agentLlm.model,\n llmApiKeySet: agentLlm.api_key ? \"SET\" : \"UNSET\",\n searchApiKeySet: newSettings.search_api_key ? \"SET\" : \"UNSET\",\n remoteRuntimeResourceFactor:\n newSettings.remote_runtime_resource_factor,\n });\n },\n });\n };\n\n const handleConfirmEndSession = () => {\n const formData = new FormData(formRef.current ?? undefined);\n handleFormSubmission(formData);\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n\n if (currentPath.startsWith(\"/conversations/\")) {\n setConfirmEndSessionModalOpen(true);\n } else {\n handleFormSubmission(formData);\n }\n };\n\n const isLLMKeySet = settings.llm_api_key_set;\n const currentModel = getAgentSettingValue(settings, \"llm.model\");\n\n return (\n <div>\n <form\n ref={formRef}\n data-testid=\"settings-form\"\n className=\"flex flex-col gap-6\"\n onSubmit={handleSubmit}\n >\n <div className=\"flex flex-col gap-[17px]\">\n <ModelSelector\n currentModel={\n typeof currentModel === \"string\" ? currentModel : undefined\n }\n wrapperClassName=\"!flex-col !gap-[17px]\"\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <SettingsInput\n testId=\"llm-api-key-input\"\n name=\"llm-api-key-input\"\n label={t(I18nKey.SETTINGS_FORM$API_KEY)}\n type=\"password\"\n className=\"w-full\"\n placeholder={isLLMKeySet ? \"<hidden>\" : \"\"}\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <HelpLink\n testId=\"llm-api-key-help-anchor\"\n text={t(I18nKey.SETTINGS$DONT_KNOW_API_KEY)}\n linkText={t(I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS)}\n href=\"https://docs.openhands.dev/usage/local-setup#getting-an-api-key\"\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <BrandButton\n testId=\"save-settings-button\"\n type=\"submit\"\n variant=\"primary\"\n className=\"w-full\"\n >\n {t(I18nKey.BUTTON$SAVE)}\n </BrandButton>\n </div>\n </form>\n\n {confirmEndSessionModalOpen && (\n <ModalBackdrop>\n <DangerModal\n title={t(I18nKey.MODAL$END_SESSION_TITLE)}\n description={t(I18nKey.MODAL$END_SESSION_MESSAGE)}\n buttons={{\n danger: {\n text: t(I18nKey.BUTTON$END_SESSION),\n onClick: handleConfirmEndSession,\n },\n cancel: {\n text: t(I18nKey.BUTTON$CANCEL),\n onClick: () => setConfirmEndSessionModalOpen(false),\n },\n }}\n />\n </ModalBackdrop>\n )}\n </div>\n );\n}\n"],"mappings":"01BAsBA,SAAgB,EAAa,CAAE,WAAU,WAA8B,CACrE,GAAM,CAAE,sBAAuB,EAAA,aAAa,CACtC,CAAE,OAAQ,GAAqB,EAAA,iBAAiB,CAChD,CAAE,eAAgB,EAAA,eAAe,CACjC,CAAE,KAAM,EAAA,eAAe,YAAY,CAEnC,EAAU,EAAA,QAAM,OAAwB,KAAK,CAE7C,CAAC,EAA4B,GACjC,EAAA,QAAM,SAAS,GAAM,CAEjB,EAAuB,KAAO,IAAuB,CACzD,IAAM,EAAc,EAAA,gBAAgB,EAAS,CAE7C,MAAM,EAAiB,EAAa,CAClC,cAAiB,CACf,GAAS,CAET,IAAM,EACF,EAAY,qBACV,KAAmC,EAAE,CAC3C,EAAmB,CACjB,SAAU,EAAS,MACnB,aAAc,EAAS,QAAU,MAAQ,QACzC,gBAAiB,EAAY,eAAiB,MAAQ,QACtD,4BACE,EAAY,+BACf,CAAC,EAEL,CAAC,EAGE,MAAgC,CAEpC,EAAqB,IADA,SAAS,EAAQ,SAAW,IAAA,GAC5B,CAAS,EAG1B,EAAgB,GAA4C,CAChE,EAAM,gBAAgB,CACtB,IAAM,EAAW,IAAI,SAAS,EAAM,cAAc,CAE9C,EAAY,WAAW,kBAAkB,CAC3C,EAA8B,GAAK,CAEnC,EAAqB,EAAS,EAI5B,EAAc,EAAS,gBACvB,EAAe,EAAA,qBAAqB,EAAU,YAAY,CAEhE,OACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,MAAC,OAAD,CACE,IAAK,EACL,cAAY,gBACZ,UAAU,sBACV,SAAU,WAJZ,EAME,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oCAAf,EACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,aACE,OAAO,GAAiB,SAAW,EAAe,IAAA,GAEpD,iBAAiB,wBACjB,eAAgB,EAAA,cAAc,gBAC9B,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,oBACP,KAAK,oBACL,MAAO,EAAE,EAAA,QAAQ,sBAAsB,CACvC,KAAK,WACL,UAAU,SACV,YAAa,EAAc,WAAa,GACxC,eAAgB,EAAA,cAAc,gBAC9B,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,SAAD,CACE,OAAO,0BACP,KAAM,EAAE,EAAA,QAAQ,2BAA2B,CAC3C,SAAU,EAAE,EAAA,QAAQ,gCAAgC,CACpD,KAAK,kEACL,KAAK,WACL,UAAU,QACV,CAAA,CACE,IAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACb,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,uBACP,KAAK,SACL,QAAQ,UACR,UAAU,kBAET,EAAE,EAAA,QAAQ,YAAY,CACX,CAAA,CACV,CAAA,CACD,GAEN,IACC,EAAA,EAAA,KAAC,EAAA,cAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,MAAO,EAAE,EAAA,QAAQ,wBAAwB,CACzC,YAAa,EAAE,EAAA,QAAQ,0BAA0B,CACjD,QAAS,CACP,OAAQ,CACN,KAAM,EAAE,EAAA,QAAQ,mBAAmB,CACnC,QAAS,EACV,CACD,OAAQ,CACN,KAAM,EAAE,EAAA,QAAQ,cAAc,CAC9B,YAAe,EAA8B,GAAM,CACpD,CACF,CACD,CAAA,CACY,CAAA,CAEd,CAAA,CAAA"}
@@ -34,7 +34,7 @@ function _({ settings: _, onClose: v }) {
34
34
  e.preventDefault();
35
35
  let t = new FormData(e.currentTarget);
36
36
  x.startsWith("/conversations/") ? T(!0) : E(t);
37
- }, k = _.llm_api_key_set, A = f(_, "llm.model"), j = f(_, "llm.base_url");
37
+ }, k = _.llm_api_key_set, A = f(_, "llm.model");
38
38
  return /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("form", {
39
39
  ref: C,
40
40
  "data-testid": "settings-form",
@@ -45,7 +45,6 @@ function _({ settings: _, onClose: v }) {
45
45
  children: [
46
46
  /* @__PURE__ */ h(d, {
47
47
  currentModel: typeof A == "string" ? A : void 0,
48
- currentBaseUrl: typeof j == "string" ? j : void 0,
49
48
  wrapperClassName: "!flex-col !gap-[17px]",
50
49
  labelClassName: n.LABEL_CLASSNAME
51
50
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"settings-form.js","names":[],"sources":["../../../../../src/components/shared/modals/settings/settings-form.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport React from \"react\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { DangerModal } from \"../confirmation-modals/danger-modal\";\nimport { extractSettings } from \"#/utils/settings-utils\";\nimport { ModalBackdrop } from \"../modal-backdrop\";\nimport { ModelSelector } from \"./model-selector\";\nimport { Settings } from \"#/types/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { getAgentSettingValue } from \"#/utils/sdk-settings-schema\";\nimport { SETTINGS_FORM } from \"#/utils/constants\";\n\ninterface SettingsFormProps {\n settings: Settings;\n onClose: () => void;\n}\n\nexport function SettingsForm({ settings, onClose }: SettingsFormProps) {\n const { trackSettingsSaved } = useTracking();\n const { mutate: saveUserSettings } = useSaveSettings();\n const { currentPath } = useNavigation();\n const { t } = useTranslation(\"openhands\");\n\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] =\n React.useState(false);\n\n const handleFormSubmission = async (formData: FormData) => {\n const newSettings = extractSettings(formData);\n\n await saveUserSettings(newSettings, {\n onSuccess: () => {\n onClose();\n\n const agentLlm =\n ((newSettings.agent_settings_diff as Record<string, unknown>)\n ?.llm as Record<string, unknown>) ?? {};\n trackSettingsSaved({\n llmModel: agentLlm.model,\n llmApiKeySet: agentLlm.api_key ? \"SET\" : \"UNSET\",\n searchApiKeySet: newSettings.search_api_key ? \"SET\" : \"UNSET\",\n remoteRuntimeResourceFactor:\n newSettings.remote_runtime_resource_factor,\n });\n },\n });\n };\n\n const handleConfirmEndSession = () => {\n const formData = new FormData(formRef.current ?? undefined);\n handleFormSubmission(formData);\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n\n if (currentPath.startsWith(\"/conversations/\")) {\n setConfirmEndSessionModalOpen(true);\n } else {\n handleFormSubmission(formData);\n }\n };\n\n const isLLMKeySet = settings.llm_api_key_set;\n const currentModel = getAgentSettingValue(settings, \"llm.model\");\n const currentBaseUrl = getAgentSettingValue(settings, \"llm.base_url\");\n\n return (\n <div>\n <form\n ref={formRef}\n data-testid=\"settings-form\"\n className=\"flex flex-col gap-6\"\n onSubmit={handleSubmit}\n >\n <div className=\"flex flex-col gap-[17px]\">\n <ModelSelector\n currentModel={\n typeof currentModel === \"string\" ? currentModel : undefined\n }\n currentBaseUrl={\n typeof currentBaseUrl === \"string\" ? currentBaseUrl : undefined\n }\n wrapperClassName=\"!flex-col !gap-[17px]\"\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <SettingsInput\n testId=\"llm-api-key-input\"\n name=\"llm-api-key-input\"\n label={t(I18nKey.SETTINGS_FORM$API_KEY)}\n type=\"password\"\n className=\"w-full\"\n placeholder={isLLMKeySet ? \"<hidden>\" : \"\"}\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <HelpLink\n testId=\"llm-api-key-help-anchor\"\n text={t(I18nKey.SETTINGS$DONT_KNOW_API_KEY)}\n linkText={t(I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS)}\n href=\"https://docs.openhands.dev/usage/local-setup#getting-an-api-key\"\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <BrandButton\n testId=\"save-settings-button\"\n type=\"submit\"\n variant=\"primary\"\n className=\"w-full\"\n >\n {t(I18nKey.BUTTON$SAVE)}\n </BrandButton>\n </div>\n </form>\n\n {confirmEndSessionModalOpen && (\n <ModalBackdrop>\n <DangerModal\n title={t(I18nKey.MODAL$END_SESSION_TITLE)}\n description={t(I18nKey.MODAL$END_SESSION_MESSAGE)}\n buttons={{\n danger: {\n text: t(I18nKey.BUTTON$END_SESSION),\n onClick: handleConfirmEndSession,\n },\n cancel: {\n text: t(I18nKey.BUTTON$CANCEL),\n onClick: () => setConfirmEndSessionModalOpen(false),\n },\n }}\n />\n </ModalBackdrop>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsBA,SAAgB,EAAa,EAAE,aAAU,cAA8B;CACrE,IAAM,EAAE,0BAAuB,GAAa,EACtC,EAAE,QAAQ,MAAqB,GAAiB,EAChD,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,EAAe,YAAY,EAEnC,IAAU,EAAM,OAAwB,KAAK,EAE7C,CAAC,GAA4B,KACjC,EAAM,SAAS,GAAM,EAEjB,IAAuB,OAAO,MAAuB;EACzD,IAAM,IAAc,EAAgB,EAAS;AAE7C,QAAM,EAAiB,GAAa,EAClC,iBAAiB;AACf,MAAS;GAET,IAAM,IACF,EAAY,qBACV,OAAmC,EAAE;AAC3C,KAAmB;IACjB,UAAU,EAAS;IACnB,cAAc,EAAS,UAAU,QAAQ;IACzC,iBAAiB,EAAY,iBAAiB,QAAQ;IACtD,6BACE,EAAY;IACf,CAAC;KAEL,CAAC;IAGE,UAAgC;AAEpC,IAAqB,IADA,SAAS,EAAQ,WAAW,KAAA,EAC5B,CAAS;IAG1B,KAAgB,MAA4C;AAChE,IAAM,gBAAgB;EACtB,IAAM,IAAW,IAAI,SAAS,EAAM,cAAc;AAElD,EAAI,EAAY,WAAW,kBAAkB,GAC3C,EAA8B,GAAK,GAEnC,EAAqB,EAAS;IAI5B,IAAc,EAAS,iBACvB,IAAe,EAAqB,GAAU,YAAY,EAC1D,IAAiB,EAAqB,GAAU,eAAe;AAErE,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;EACE,KAAK;EACL,eAAY;EACZ,WAAU;EACV,UAAU;YAJZ,CAME,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,cACE,OAAO,KAAiB,WAAW,IAAe,KAAA;KAEpD,gBACE,OAAO,KAAmB,WAAW,IAAiB,KAAA;KAExD,kBAAiB;KACjB,gBAAgB,EAAc;KAC9B,CAAA;IAEF,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,OAAO,EAAE,EAAQ,sBAAsB;KACvC,MAAK;KACL,WAAU;KACV,aAAa,IAAc,aAAa;KACxC,gBAAgB,EAAc;KAC9B,CAAA;IAEF,kBAAC,GAAD;KACE,QAAO;KACP,MAAM,EAAE,EAAQ,2BAA2B;KAC3C,UAAU,EAAE,EAAQ,gCAAgC;KACpD,MAAK;KACL,MAAK;KACL,WAAU;KACV,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,QAAO;IACP,MAAK;IACL,SAAQ;IACR,WAAU;cAET,EAAE,EAAQ,YAAY;IACX,CAAA;GACV,CAAA,CACD;KAEN,KACC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,OAAO,EAAE,EAAQ,wBAAwB;EACzC,aAAa,EAAE,EAAQ,0BAA0B;EACjD,SAAS;GACP,QAAQ;IACN,MAAM,EAAE,EAAQ,mBAAmB;IACnC,SAAS;IACV;GACD,QAAQ;IACN,MAAM,EAAE,EAAQ,cAAc;IAC9B,eAAe,EAA8B,GAAM;IACpD;GACF;EACD,CAAA,EACY,CAAA,CAEd,EAAA,CAAA"}
1
+ {"version":3,"file":"settings-form.js","names":[],"sources":["../../../../../src/components/shared/modals/settings/settings-form.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport React from \"react\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { DangerModal } from \"../confirmation-modals/danger-modal\";\nimport { extractSettings } from \"#/utils/settings-utils\";\nimport { ModalBackdrop } from \"../modal-backdrop\";\nimport { ModelSelector } from \"./model-selector\";\nimport { Settings } from \"#/types/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { HelpLink } from \"#/ui/help-link\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { getAgentSettingValue } from \"#/utils/sdk-settings-schema\";\nimport { SETTINGS_FORM } from \"#/utils/constants\";\n\ninterface SettingsFormProps {\n settings: Settings;\n onClose: () => void;\n}\n\nexport function SettingsForm({ settings, onClose }: SettingsFormProps) {\n const { trackSettingsSaved } = useTracking();\n const { mutate: saveUserSettings } = useSaveSettings();\n const { currentPath } = useNavigation();\n const { t } = useTranslation(\"openhands\");\n\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] =\n React.useState(false);\n\n const handleFormSubmission = async (formData: FormData) => {\n const newSettings = extractSettings(formData);\n\n await saveUserSettings(newSettings, {\n onSuccess: () => {\n onClose();\n\n const agentLlm =\n ((newSettings.agent_settings_diff as Record<string, unknown>)\n ?.llm as Record<string, unknown>) ?? {};\n trackSettingsSaved({\n llmModel: agentLlm.model,\n llmApiKeySet: agentLlm.api_key ? \"SET\" : \"UNSET\",\n searchApiKeySet: newSettings.search_api_key ? \"SET\" : \"UNSET\",\n remoteRuntimeResourceFactor:\n newSettings.remote_runtime_resource_factor,\n });\n },\n });\n };\n\n const handleConfirmEndSession = () => {\n const formData = new FormData(formRef.current ?? undefined);\n handleFormSubmission(formData);\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n\n if (currentPath.startsWith(\"/conversations/\")) {\n setConfirmEndSessionModalOpen(true);\n } else {\n handleFormSubmission(formData);\n }\n };\n\n const isLLMKeySet = settings.llm_api_key_set;\n const currentModel = getAgentSettingValue(settings, \"llm.model\");\n\n return (\n <div>\n <form\n ref={formRef}\n data-testid=\"settings-form\"\n className=\"flex flex-col gap-6\"\n onSubmit={handleSubmit}\n >\n <div className=\"flex flex-col gap-[17px]\">\n <ModelSelector\n currentModel={\n typeof currentModel === \"string\" ? currentModel : undefined\n }\n wrapperClassName=\"!flex-col !gap-[17px]\"\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <SettingsInput\n testId=\"llm-api-key-input\"\n name=\"llm-api-key-input\"\n label={t(I18nKey.SETTINGS_FORM$API_KEY)}\n type=\"password\"\n className=\"w-full\"\n placeholder={isLLMKeySet ? \"<hidden>\" : \"\"}\n labelClassName={SETTINGS_FORM.LABEL_CLASSNAME}\n />\n\n <HelpLink\n testId=\"llm-api-key-help-anchor\"\n text={t(I18nKey.SETTINGS$DONT_KNOW_API_KEY)}\n linkText={t(I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS)}\n href=\"https://docs.openhands.dev/usage/local-setup#getting-an-api-key\"\n size=\"settings\"\n linkColor=\"white\"\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <BrandButton\n testId=\"save-settings-button\"\n type=\"submit\"\n variant=\"primary\"\n className=\"w-full\"\n >\n {t(I18nKey.BUTTON$SAVE)}\n </BrandButton>\n </div>\n </form>\n\n {confirmEndSessionModalOpen && (\n <ModalBackdrop>\n <DangerModal\n title={t(I18nKey.MODAL$END_SESSION_TITLE)}\n description={t(I18nKey.MODAL$END_SESSION_MESSAGE)}\n buttons={{\n danger: {\n text: t(I18nKey.BUTTON$END_SESSION),\n onClick: handleConfirmEndSession,\n },\n cancel: {\n text: t(I18nKey.BUTTON$CANCEL),\n onClick: () => setConfirmEndSessionModalOpen(false),\n },\n }}\n />\n </ModalBackdrop>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsBA,SAAgB,EAAa,EAAE,aAAU,cAA8B;CACrE,IAAM,EAAE,0BAAuB,GAAa,EACtC,EAAE,QAAQ,MAAqB,GAAiB,EAChD,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,EAAe,YAAY,EAEnC,IAAU,EAAM,OAAwB,KAAK,EAE7C,CAAC,GAA4B,KACjC,EAAM,SAAS,GAAM,EAEjB,IAAuB,OAAO,MAAuB;EACzD,IAAM,IAAc,EAAgB,EAAS;AAE7C,QAAM,EAAiB,GAAa,EAClC,iBAAiB;AACf,MAAS;GAET,IAAM,IACF,EAAY,qBACV,OAAmC,EAAE;AAC3C,KAAmB;IACjB,UAAU,EAAS;IACnB,cAAc,EAAS,UAAU,QAAQ;IACzC,iBAAiB,EAAY,iBAAiB,QAAQ;IACtD,6BACE,EAAY;IACf,CAAC;KAEL,CAAC;IAGE,UAAgC;AAEpC,IAAqB,IADA,SAAS,EAAQ,WAAW,KAAA,EAC5B,CAAS;IAG1B,KAAgB,MAA4C;AAChE,IAAM,gBAAgB;EACtB,IAAM,IAAW,IAAI,SAAS,EAAM,cAAc;AAElD,EAAI,EAAY,WAAW,kBAAkB,GAC3C,EAA8B,GAAK,GAEnC,EAAqB,EAAS;IAI5B,IAAc,EAAS,iBACvB,IAAe,EAAqB,GAAU,YAAY;AAEhE,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;EACE,KAAK;EACL,eAAY;EACZ,WAAU;EACV,UAAU;YAJZ,CAME,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,cACE,OAAO,KAAiB,WAAW,IAAe,KAAA;KAEpD,kBAAiB;KACjB,gBAAgB,EAAc;KAC9B,CAAA;IAEF,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,OAAO,EAAE,EAAQ,sBAAsB;KACvC,MAAK;KACL,WAAU;KACV,aAAa,IAAc,aAAa;KACxC,gBAAgB,EAAc;KAC9B,CAAA;IAEF,kBAAC,GAAD;KACE,QAAO;KACP,MAAM,EAAE,EAAQ,2BAA2B;KAC3C,UAAU,EAAE,EAAQ,gCAAgC;KACpD,MAAK;KACL,MAAK;KACL,WAAU;KACV,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,QAAO;IACP,MAAK;IACL,SAAQ;IACR,WAAU;cAET,EAAE,EAAQ,YAAY;IACX,CAAA;GACV,CAAA,CACD;KAEN,KACC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,OAAO,EAAE,EAAQ,wBAAwB;EACzC,aAAa,EAAE,EAAQ,0BAA0B;EACjD,SAAS;GACP,QAAQ;IACN,MAAM,EAAE,EAAQ,mBAAmB;IACnC,SAAS;IACV;GACD,QAAQ;IACN,MAAM,EAAE,EAAQ,cAAc;IAC9B,eAAe,EAA8B,GAAM;IACpD;GACF;EACD,CAAA,EACY,CAAA,CAEd,EAAA,CAAA"}
@@ -0,0 +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.28.1`,agentCanvas:`1.0.0-rc.12`,automation:`1.0.0a9`,githubMcpServer:`1.2.0`},compatibility:{minimumAgentServer:`1.28.0`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`}};exports.default=e;
2
+ //# sourceMappingURL=defaults.cjs.map
@@ -0,0 +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.28.1\",\n \"agentCanvas\": \"1.0.0-rc.12\",\n \"automation\": \"1.0.0a9\",\n \"githubMcpServer\": \"1.2.0\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\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 },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n }\n}\n"],"mappings":""}
@@ -0,0 +1,35 @@
1
+ var e = {
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
+ versions: {
4
+ agentServer: "1.28.1",
5
+ agentCanvas: "1.0.0-rc.12",
6
+ automation: "1.0.0a9",
7
+ githubMcpServer: "1.2.0"
8
+ },
9
+ compatibility: { minimumAgentServer: "1.28.0" },
10
+ images: {
11
+ agentServer: "ghcr.io/openhands/agent-server",
12
+ agentCanvas: "ghcr.io/openhands/agent-canvas"
13
+ },
14
+ ports: {
15
+ agentServer: 18e3,
16
+ automation: 18001,
17
+ proxy: 8e3
18
+ },
19
+ paths: {
20
+ stateSubdir: "agent-canvas",
21
+ conversations: "agent-canvas/conversations",
22
+ bashEvents: "agent-canvas/bash_events",
23
+ automationDb: "automation/automations.db"
24
+ },
25
+ packages: {
26
+ agentServer: "openhands-agent-server",
27
+ automation: "openhands-automation",
28
+ tools: "openhands-tools",
29
+ workspace: "openhands-workspace"
30
+ }
31
+ };
32
+ //#endregion
33
+ export { e as default };
34
+
35
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +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.28.1\",\n \"agentCanvas\": \"1.0.0-rc.12\",\n \"automation\": \"1.0.0a9\",\n \"githubMcpServer\": \"1.2.0\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\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 },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);var e=`llm.auth_type`,t=`llm.subscription_vendor`,n=`api_key`,r=`subscription`,i=`openai`,a=`/api/llm/subscription/openai/models`,o=`/api/llm/subscription/openai/status`,s=`/api/llm/subscription/openai/device/start`,c=`/api/llm/subscription/openai/device/poll`,l=`/api/llm/subscription/openai/logout`,u=[{key:e,label:`Authentication`,description:`Choose whether this profile uses API credentials or a ChatGPT subscription.`,section:`llm`,section_label:`LLM`,value_type:`string`,default:n,choices:[{label:`API key`,value:n},{label:`ChatGPT subscription`,value:r}],depends_on:[],prominence:`critical`,secret:!1,required:!0},{key:t,label:`Subscription provider`,description:`Provider used for subscription-backed LLM access.`,section:`llm`,section_label:`LLM`,value_type:`string`,default:i,choices:[{label:`OpenAI`,value:i}],depends_on:[],prominence:`critical`,secret:!1,required:!0}];function d(e){return e===`subscription`?r:n}function f(e){return d(e?.auth_type)===r}exports.LLM_AUTH_TYPE_API_KEY=n,exports.LLM_AUTH_TYPE_KEY=e,exports.LLM_AUTH_TYPE_SUBSCRIPTION=r,exports.LLM_SUBSCRIPTION_SCHEMA_FIELDS=u,exports.LLM_SUBSCRIPTION_VENDOR_KEY=t,exports.OPENAI_SUBSCRIPTION_DEVICE_POLL_PATH=c,exports.OPENAI_SUBSCRIPTION_DEVICE_START_PATH=s,exports.OPENAI_SUBSCRIPTION_LOGOUT_PATH=l,exports.OPENAI_SUBSCRIPTION_MODELS_PATH=a,exports.OPENAI_SUBSCRIPTION_STATUS_PATH=o,exports.OPENAI_SUBSCRIPTION_VENDOR=i,exports.isSubscriptionLlmConfig=f,exports.resolveLlmAuthType=d;
2
+ //# sourceMappingURL=llm-subscription.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-subscription.cjs","names":[],"sources":["../../src/constants/llm-subscription.ts"],"sourcesContent":["import type { SettingsChoice, SettingsFieldSchema } from \"#/types/settings\";\n\nexport const LLM_AUTH_TYPE_KEY = \"llm.auth_type\";\nexport const LLM_SUBSCRIPTION_VENDOR_KEY = \"llm.subscription_vendor\";\nexport const LLM_AUTH_TYPE_API_KEY = \"api_key\";\nexport const LLM_AUTH_TYPE_SUBSCRIPTION = \"subscription\";\nexport const OPENAI_SUBSCRIPTION_VENDOR = \"openai\";\n\nexport const OPENAI_SUBSCRIPTION_MODELS_PATH =\n \"/api/llm/subscription/openai/models\";\nexport const OPENAI_SUBSCRIPTION_STATUS_PATH =\n \"/api/llm/subscription/openai/status\";\nexport const OPENAI_SUBSCRIPTION_DEVICE_START_PATH =\n \"/api/llm/subscription/openai/device/start\";\nexport const OPENAI_SUBSCRIPTION_DEVICE_POLL_PATH =\n \"/api/llm/subscription/openai/device/poll\";\nexport const OPENAI_SUBSCRIPTION_LOGOUT_PATH =\n \"/api/llm/subscription/openai/logout\";\n\nexport type LlmAuthType =\n | typeof LLM_AUTH_TYPE_API_KEY\n | typeof LLM_AUTH_TYPE_SUBSCRIPTION;\n\nexport const LLM_AUTH_TYPE_CHOICES: SettingsChoice[] = [\n { label: \"API key\", value: LLM_AUTH_TYPE_API_KEY },\n { label: \"ChatGPT subscription\", value: LLM_AUTH_TYPE_SUBSCRIPTION },\n];\n\nconst LLM_AUTH_TYPE_FIELD: SettingsFieldSchema = {\n key: LLM_AUTH_TYPE_KEY,\n label: \"Authentication\",\n description:\n \"Choose whether this profile uses API credentials or a ChatGPT subscription.\",\n section: \"llm\",\n section_label: \"LLM\",\n value_type: \"string\",\n default: LLM_AUTH_TYPE_API_KEY,\n choices: LLM_AUTH_TYPE_CHOICES,\n depends_on: [],\n prominence: \"critical\",\n secret: false,\n required: true,\n};\n\nconst LLM_SUBSCRIPTION_VENDOR_FIELD: SettingsFieldSchema = {\n key: LLM_SUBSCRIPTION_VENDOR_KEY,\n label: \"Subscription provider\",\n description: \"Provider used for subscription-backed LLM access.\",\n section: \"llm\",\n section_label: \"LLM\",\n value_type: \"string\",\n default: OPENAI_SUBSCRIPTION_VENDOR,\n choices: [{ label: \"OpenAI\", value: OPENAI_SUBSCRIPTION_VENDOR }],\n depends_on: [],\n prominence: \"critical\",\n secret: false,\n required: true,\n};\n\nexport const LLM_SUBSCRIPTION_SCHEMA_FIELDS = [\n LLM_AUTH_TYPE_FIELD,\n LLM_SUBSCRIPTION_VENDOR_FIELD,\n];\n\nexport function resolveLlmAuthType(value: unknown): LlmAuthType {\n return value === LLM_AUTH_TYPE_SUBSCRIPTION\n ? LLM_AUTH_TYPE_SUBSCRIPTION\n : LLM_AUTH_TYPE_API_KEY;\n}\n\nexport function isSubscriptionLlmConfig(\n llm: Record<string, unknown> | null | undefined,\n): boolean {\n return resolveLlmAuthType(llm?.auth_type) === LLM_AUTH_TYPE_SUBSCRIPTION;\n}\n"],"mappings":"6CAEA,IAAa,EAAoB,gBACpB,EAA8B,0BAC9B,EAAwB,UACxB,EAA6B,eAC7B,EAA6B,SAE7B,EACX,sCACW,EACX,sCACW,EACX,4CACW,EACX,2CACW,EACX,sCA0CW,EAAiC,CAC5C,CA/BA,IAAK,EACL,MAAO,iBACP,YACE,8EACF,QAAS,MACT,cAAe,MACf,WAAY,SACZ,QAAS,EACT,QAAS,CAbT,CAAE,MAAO,UAAW,MAAO,EAAuB,CAClD,CAAE,MAAO,uBAAwB,MAAO,EAA4B,CAY3D,CACT,WAAY,EAAE,CACd,WAAY,WACZ,OAAQ,GACR,SAAU,GAmBV,CACA,CAhBA,IAAK,EACL,MAAO,wBACP,YAAa,oDACb,QAAS,MACT,cAAe,MACf,WAAY,SACZ,QAAS,EACT,QAAS,CAAC,CAAE,MAAO,SAAU,MAAO,EAA4B,CAAC,CACjE,WAAY,EAAE,CACd,WAAY,WACZ,OAAQ,GACR,SAAU,GAKV,CACD,CAED,SAAgB,EAAmB,EAA6B,CAC9D,OAAO,IAAA,eACH,EACA,EAGN,SAAgB,EACd,EACS,CACT,OAAO,EAAmB,GAAK,UAAU,GAAK"}
@@ -0,0 +1,16 @@
1
+ import type { SettingsChoice, SettingsFieldSchema } from "#/types/settings";
2
+ export declare const LLM_AUTH_TYPE_KEY = "llm.auth_type";
3
+ export declare const LLM_SUBSCRIPTION_VENDOR_KEY = "llm.subscription_vendor";
4
+ export declare const LLM_AUTH_TYPE_API_KEY = "api_key";
5
+ export declare const LLM_AUTH_TYPE_SUBSCRIPTION = "subscription";
6
+ export declare const OPENAI_SUBSCRIPTION_VENDOR = "openai";
7
+ export declare const OPENAI_SUBSCRIPTION_MODELS_PATH = "/api/llm/subscription/openai/models";
8
+ export declare const OPENAI_SUBSCRIPTION_STATUS_PATH = "/api/llm/subscription/openai/status";
9
+ export declare const OPENAI_SUBSCRIPTION_DEVICE_START_PATH = "/api/llm/subscription/openai/device/start";
10
+ export declare const OPENAI_SUBSCRIPTION_DEVICE_POLL_PATH = "/api/llm/subscription/openai/device/poll";
11
+ export declare const OPENAI_SUBSCRIPTION_LOGOUT_PATH = "/api/llm/subscription/openai/logout";
12
+ export type LlmAuthType = typeof LLM_AUTH_TYPE_API_KEY | typeof LLM_AUTH_TYPE_SUBSCRIPTION;
13
+ export declare const LLM_AUTH_TYPE_CHOICES: SettingsChoice[];
14
+ export declare const LLM_SUBSCRIPTION_SCHEMA_FIELDS: SettingsFieldSchema[];
15
+ export declare function resolveLlmAuthType(value: unknown): LlmAuthType;
16
+ export declare function isSubscriptionLlmConfig(llm: Record<string, unknown> | null | undefined): boolean;
@@ -0,0 +1,47 @@
1
+ //#region src/constants/llm-subscription.ts
2
+ var e = "llm.auth_type", t = "llm.subscription_vendor", n = "api_key", r = "subscription", i = "openai", a = "/api/llm/subscription/openai/models", o = "/api/llm/subscription/openai/status", s = "/api/llm/subscription/openai/device/start", c = "/api/llm/subscription/openai/device/poll", l = "/api/llm/subscription/openai/logout", u = [{
3
+ key: e,
4
+ label: "Authentication",
5
+ description: "Choose whether this profile uses API credentials or a ChatGPT subscription.",
6
+ section: "llm",
7
+ section_label: "LLM",
8
+ value_type: "string",
9
+ default: n,
10
+ choices: [{
11
+ label: "API key",
12
+ value: n
13
+ }, {
14
+ label: "ChatGPT subscription",
15
+ value: r
16
+ }],
17
+ depends_on: [],
18
+ prominence: "critical",
19
+ secret: !1,
20
+ required: !0
21
+ }, {
22
+ key: t,
23
+ label: "Subscription provider",
24
+ description: "Provider used for subscription-backed LLM access.",
25
+ section: "llm",
26
+ section_label: "LLM",
27
+ value_type: "string",
28
+ default: i,
29
+ choices: [{
30
+ label: "OpenAI",
31
+ value: i
32
+ }],
33
+ depends_on: [],
34
+ prominence: "critical",
35
+ secret: !1,
36
+ required: !0
37
+ }];
38
+ function d(e) {
39
+ return e === "subscription" ? r : n;
40
+ }
41
+ function f(e) {
42
+ return d(e?.auth_type) === r;
43
+ }
44
+ //#endregion
45
+ export { n as LLM_AUTH_TYPE_API_KEY, e as LLM_AUTH_TYPE_KEY, r as LLM_AUTH_TYPE_SUBSCRIPTION, u as LLM_SUBSCRIPTION_SCHEMA_FIELDS, t as LLM_SUBSCRIPTION_VENDOR_KEY, c as OPENAI_SUBSCRIPTION_DEVICE_POLL_PATH, s as OPENAI_SUBSCRIPTION_DEVICE_START_PATH, l as OPENAI_SUBSCRIPTION_LOGOUT_PATH, a as OPENAI_SUBSCRIPTION_MODELS_PATH, o as OPENAI_SUBSCRIPTION_STATUS_PATH, i as OPENAI_SUBSCRIPTION_VENDOR, f as isSubscriptionLlmConfig, d as resolveLlmAuthType };
46
+
47
+ //# sourceMappingURL=llm-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-subscription.js","names":[],"sources":["../../src/constants/llm-subscription.ts"],"sourcesContent":["import type { SettingsChoice, SettingsFieldSchema } from \"#/types/settings\";\n\nexport const LLM_AUTH_TYPE_KEY = \"llm.auth_type\";\nexport const LLM_SUBSCRIPTION_VENDOR_KEY = \"llm.subscription_vendor\";\nexport const LLM_AUTH_TYPE_API_KEY = \"api_key\";\nexport const LLM_AUTH_TYPE_SUBSCRIPTION = \"subscription\";\nexport const OPENAI_SUBSCRIPTION_VENDOR = \"openai\";\n\nexport const OPENAI_SUBSCRIPTION_MODELS_PATH =\n \"/api/llm/subscription/openai/models\";\nexport const OPENAI_SUBSCRIPTION_STATUS_PATH =\n \"/api/llm/subscription/openai/status\";\nexport const OPENAI_SUBSCRIPTION_DEVICE_START_PATH =\n \"/api/llm/subscription/openai/device/start\";\nexport const OPENAI_SUBSCRIPTION_DEVICE_POLL_PATH =\n \"/api/llm/subscription/openai/device/poll\";\nexport const OPENAI_SUBSCRIPTION_LOGOUT_PATH =\n \"/api/llm/subscription/openai/logout\";\n\nexport type LlmAuthType =\n | typeof LLM_AUTH_TYPE_API_KEY\n | typeof LLM_AUTH_TYPE_SUBSCRIPTION;\n\nexport const LLM_AUTH_TYPE_CHOICES: SettingsChoice[] = [\n { label: \"API key\", value: LLM_AUTH_TYPE_API_KEY },\n { label: \"ChatGPT subscription\", value: LLM_AUTH_TYPE_SUBSCRIPTION },\n];\n\nconst LLM_AUTH_TYPE_FIELD: SettingsFieldSchema = {\n key: LLM_AUTH_TYPE_KEY,\n label: \"Authentication\",\n description:\n \"Choose whether this profile uses API credentials or a ChatGPT subscription.\",\n section: \"llm\",\n section_label: \"LLM\",\n value_type: \"string\",\n default: LLM_AUTH_TYPE_API_KEY,\n choices: LLM_AUTH_TYPE_CHOICES,\n depends_on: [],\n prominence: \"critical\",\n secret: false,\n required: true,\n};\n\nconst LLM_SUBSCRIPTION_VENDOR_FIELD: SettingsFieldSchema = {\n key: LLM_SUBSCRIPTION_VENDOR_KEY,\n label: \"Subscription provider\",\n description: \"Provider used for subscription-backed LLM access.\",\n section: \"llm\",\n section_label: \"LLM\",\n value_type: \"string\",\n default: OPENAI_SUBSCRIPTION_VENDOR,\n choices: [{ label: \"OpenAI\", value: OPENAI_SUBSCRIPTION_VENDOR }],\n depends_on: [],\n prominence: \"critical\",\n secret: false,\n required: true,\n};\n\nexport const LLM_SUBSCRIPTION_SCHEMA_FIELDS = [\n LLM_AUTH_TYPE_FIELD,\n LLM_SUBSCRIPTION_VENDOR_FIELD,\n];\n\nexport function resolveLlmAuthType(value: unknown): LlmAuthType {\n return value === LLM_AUTH_TYPE_SUBSCRIPTION\n ? LLM_AUTH_TYPE_SUBSCRIPTION\n : LLM_AUTH_TYPE_API_KEY;\n}\n\nexport function isSubscriptionLlmConfig(\n llm: Record<string, unknown> | null | undefined,\n): boolean {\n return resolveLlmAuthType(llm?.auth_type) === LLM_AUTH_TYPE_SUBSCRIPTION;\n}\n"],"mappings":";AAEA,IAAa,IAAoB,iBACpB,IAA8B,2BAC9B,IAAwB,WACxB,IAA6B,gBAC7B,IAA6B,UAE7B,IACX,uCACW,IACX,uCACW,IACX,6CACW,IACX,4CACW,IACX,uCA0CW,IAAiC,CAC5C;CA/BA,KAAK;CACL,OAAO;CACP,aACE;CACF,SAAS;CACT,eAAe;CACf,YAAY;CACZ,SAAS;CACT,SAAS,CAbT;EAAE,OAAO;EAAW,OAAO;EAAuB,EAClD;EAAE,OAAO;EAAwB,OAAO;EAA4B,CAY3D;CACT,YAAY,EAAE;CACd,YAAY;CACZ,QAAQ;CACR,UAAU;CAmBV,EACA;CAhBA,KAAK;CACL,OAAO;CACP,aAAa;CACb,SAAS;CACT,eAAe;CACf,YAAY;CACZ,SAAS;CACT,SAAS,CAAC;EAAE,OAAO;EAAU,OAAO;EAA4B,CAAC;CACjE,YAAY,EAAE;CACd,YAAY;CACZ,QAAQ;CACR,UAAU;CAKV,CACD;AAED,SAAgB,EAAmB,GAA6B;AAC9D,QAAO,MAAA,iBACH,IACA;;AAGN,SAAgB,EACd,GACS;AACT,QAAO,EAAmB,GAAK,UAAU,KAAK"}
@@ -1,4 +1,4 @@
1
1
  const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../stores/browser-store.cjs`),n=require(`../stores/command-store.cjs`),ee=require(`../utils/conversation-local-storage.cjs`),r=require(`../stores/conversation-store.cjs`),te=require(`../stores/conversation-state-store.cjs`),ne=require(`../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs`),i=require(`../utils/websocket-url.cjs`),re=require(`../api/agent-server-client-options.cjs`),ie=require(`../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),a=require(`../types/agent-server/type-guards.cjs`),o=require(`../stores/use-event-store.cjs`),ae=require(`../node_modules/posthog-js/react/dist/esm/index.cjs`),oe=require(`../hooks/use-websocket.cjs`),se=require(`../constants/server-connection-error.cjs`),ce=require(`../stores/error-message-store.cjs`),le=require(`../stores/optimistic-user-message-store.cjs`),ue=require(`../services/canvas-ui.cjs`),de=require(`../utils/cache-utils.cjs`),fe=require(`../api/event-service/event-service.api.cjs`),s=require(`../utils/error-handler.cjs`),c=require(`../api/conversation-metadata-store.cjs`),pe=require(`../hooks/mutation/use-read-conversation-file.cjs`),me=require(`../stores/metrics-store.cjs`),he=require(`../hooks/query/use-conversation-history.cjs`),l=require(`../hooks/chat/record-model-switch-message.cjs`),u=require(`../hooks/mutation/conversation-mutation-utils.cjs`);let d=require(`react`);d=e.__toESM(d,1);let ge=require(`react/jsx-runtime`);var f=(0,d.createContext)(void 0);function p(e){return e.llm_message.content.filter(e=>e.type===`text`).map(e=>e.text).join(``)}function m({children:e,conversationId:m,conversationUrl:h,sessionApiKey:g,subConversations:_,subConversationIds:_e}){let[v,y]=(0,d.useState)(`CONNECTING`),[b,x]=(0,d.useState)(`CONNECTING`),S=d.default.useRef(!1),C=d.default.useRef(!1),w=ae.usePostHog(),T=ie.useQueryClient(),E=o.useEventStore(e=>e.addEvent),ve=o.useEventStore(e=>e.addEvents),D=o.useEventStore(e=>e.clearEventsForConversation),{setErrorMessage:O,removeErrorMessage:k,clearConnectionError:A}=ce.useErrorMessageStore(),j=le.useOptimisticUserMessageStore(e=>e.consumeMatchingPendingMessage),{setExecutionStatus:M}=te.useConversationStateStore(),{appendInput:N,appendOutput:P}=n.useCommandStore(),F=t.useBrowserStore(e=>e.reset),[I,L]=(0,d.useState)(!0),[R,z]=(0,d.useState)(null),{setPlanContent:B}=r.useConversationStore(),{mutate:V}=pe.useReadConversationFile(),H=(0,d.useRef)(0),U=(0,d.useRef)(null),ye=e=>e?.toUpperCase().endsWith(`PLAN.MD`)??!1,W=(0,d.useCallback)(()=>{A()},[A]),G=(0,d.useCallback)(e=>{if(e.value.usage_to_metrics?.agent){let t=e.value.usage_to_metrics.agent,n={cost:t.accumulated_cost,max_budget_per_task:t.max_budget_per_task??null,usage:t.accumulated_token_usage?{prompt_tokens:t.accumulated_token_usage.prompt_tokens,completion_tokens:t.accumulated_token_usage.completion_tokens,cache_read_tokens:t.accumulated_token_usage.cache_read_tokens,cache_write_tokens:t.accumulated_token_usage.cache_write_tokens,context_window:t.accumulated_token_usage.context_window,per_turn_token:t.accumulated_token_usage.per_turn_token}:null};me.default.getState().setMetrics(n)}},[]),{data:K,isPending:q,isError:be}=he.useConversationHistory(m),xe=!!m&&q;(0,d.useLayoutEffect)(()=>{let e=m??null;o.useEventStore.getState().loadedConversationId!==e&&(D(e),F())},[m,D,F]),(0,d.useLayoutEffect)(()=>{if(!(!K||K.events.length===0)&&(ve(K.events),m)){l.seedModelSwitchesFromHistory(m,o.useEventStore.getState().uiEvents);for(let e of K.events)a.isUserMessageEvent(e)&&j(m,p(e))}},[K,ve,m,j]);let J=(0,d.useMemo)(()=>{if(q)return null;let e=K?.events??[],t=e[e.length-1];return!t||!(`timestamp`in t)||!t.timestamp?null:t.timestamp},[K,q]),Y=(0,d.useMemo)(()=>!m||!h||q&&!be?null:i.buildWebSocketUrl(m,h),[m,h,q,be]),X=(0,d.useMemo)(()=>{if(!_?.length)return null;let e=_[0];return!e?.id||!e.conversation_url?null:i.buildWebSocketUrl(e.id,e.conversation_url)},[_]),Se=(0,d.useMemo)(()=>X?v===`CONNECTING`||b===`CONNECTING`?`CONNECTING`:v===`OPEN`&&b===`OPEN`?`OPEN`:v===`CLOSED`&&b===`CLOSED`?`CLOSED`:v===`CLOSING`||b===`CLOSING`?`CLOSING`:`CLOSED`:v,[v,b,X]);(0,d.useEffect)(()=>{R!==null&&H.current>=R&&I&&L(!1)},[R,I,H]),(0,d.useEffect)(()=>{if(!I&&U.current){let{path:e,conversationId:t}=U.current;V({conversationId:t,filePath:e},{onSuccess:e=>{B(e)},onError:e=>{console.warn(`Failed to read conversation file:`,e)}}),U.current=null}},[I,V,B]),(0,d.useEffect)(()=>{S.current=!1,L(!!_e?.length),z(null),H.current=0,U.current=null},[_e]),(0,d.useEffect)(()=>{S.current=!1,C.current=!1,U.current=null},[m]);let Ce=(0,d.useMemo)(()=>xe||I,[xe,I]),Z=(0,d.useCallback)(e=>{try{let n=JSON.parse(e.data);if(a.isAgentServerEvent(n)){let e=!o.useEventStore.getState().eventIds.has(n.id)&&a.isSwitchLLMObservationEvent(n)?n:null;if(E(n),a.isDisplayableErrorEvent(n)){let e=n;s.trackError({message:e.detail,source:`conversation`,metadata:{eventId:e.id,errorCode:e.code},posthog:w}),O(e.detail)}else W();if(a.isAgentErrorEvent(n)&&s.trackError({message:n.error,source:`agent`,metadata:{eventId:n.id,toolName:n.tool_name,toolCallId:n.tool_call_id},posthog:w}),a.isUserMessageEvent(n)&&m&&(j(m,p(n)),ee.setConversationState(m,{draftMessage:null})),a.isActionEvent(n)&&de.handleActionEventCacheInvalidation(n,m||`test-conversation-id`,T),a.isConversationStateUpdateEvent(n)&&(a.isFullStateConversationStateUpdateEvent(n)&&M(n.value.execution_status),a.isAgentStatusConversationStateUpdateEvent(n)&&M(n.value),a.isStatsConversationStateUpdateEvent(n)&&G(n)),a.isExecuteBashActionEvent(n)&&N(n.action.command),a.isExecuteBashObservationEvent(n)&&P(n.observation.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
- `)),a.isBrowserObservationEvent(n)){let{screenshot_data:e}=n.observation;if(e){let n=e.startsWith(`data:`)?e:`data:image/png;base64,${e}`;t.useBrowserStore.getState().setScreenshotSrc(n)}}if(a.isBrowserNavigateActionEvent(n)&&t.useBrowserStore.getState().setUrl(n.action.url),m&&e&&!e.observation.is_error){l.recordModelSwitchMessage(m,e.observation.profile_name);let t=c.getStoredConversationMetadata(m);c.setStoredConversationMetadata(m,{selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:e.observation.profile_name}),e.observation.active_model&&u.updateConversationLlmModelInCache(T,m,e.observation.active_model),u.invalidateConversationQueries(T,m)}a.isCanvasUIActionEvent(n)&&ue.handleCanvasUIAction(n.action)}}catch(e){console.warn(`Failed to parse WebSocket message as JSON:`,e)}},[E,O,j,T,m,M,N,P,G,W,w]),we=(0,d.useCallback)(e=>{try{let t=JSON.parse(e.data);if(I&&(H.current+=1,R!==null&&H.current>=R&&L(!1)),a.isAgentServerEvent(t)){if(E({...t,isFromPlanningAgent:!0}),a.isDisplayableErrorEvent(t)){let e=t;s.trackError({message:e.detail,source:`planning_conversation`,metadata:{eventId:e.id,errorCode:e.code},posthog:w}),O(e.detail)}else W();if(a.isAgentErrorEvent(t)&&s.trackError({message:t.error,source:`planning_agent`,metadata:{eventId:t.id,toolName:t.tool_name,toolCallId:t.tool_call_id},posthog:w}),a.isUserMessageEvent(t)&&m&&(j(m,p(t)),ee.setConversationState(m,{draftMessage:null})),a.isActionEvent(t)&&de.handleActionEventCacheInvalidation(t,_?.[0]?.id||`test-conversation-id`,T),a.isConversationStateUpdateEvent(t)&&(a.isFullStateConversationStateUpdateEvent(t)&&M(t.value.execution_status),a.isAgentStatusConversationStateUpdateEvent(t)&&M(t.value),a.isStatsConversationStateUpdateEvent(t)&&G(t)),a.isExecuteBashActionEvent(t)&&N(t.action.command),a.isExecuteBashObservationEvent(t)&&P(t.observation.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
+ `)),a.isBrowserObservationEvent(n)){let{screenshot_data:e}=n.observation;if(e){let n=e.startsWith(`data:`)?e:`data:image/png;base64,${e}`;t.useBrowserStore.getState().setScreenshotSrc(n)}}if(a.isBrowserNavigateActionEvent(n)&&t.useBrowserStore.getState().setUrl(n.action.url),m&&e&&!e.observation.is_error){l.recordModelSwitchMessage(m,e.observation.profile_name);let t=c.getStoredConversationMetadata(m);c.setStoredConversationMetadata(m,{selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:e.observation.profile_name}),e.observation.active_model&&u.updateConversationLlmModelInCache(T,m,e.observation.active_model),u.invalidateConversationQueries(T,m)}a.isCanvasUIActionEvent(n)&&ue.handleCanvasUIAction(n.action,m??null)}}catch(e){console.warn(`Failed to parse WebSocket message as JSON:`,e)}},[E,O,j,T,m,M,N,P,G,W,w]),we=(0,d.useCallback)(e=>{try{let t=JSON.parse(e.data);if(I&&(H.current+=1,R!==null&&H.current>=R&&L(!1)),a.isAgentServerEvent(t)){if(E({...t,isFromPlanningAgent:!0}),a.isDisplayableErrorEvent(t)){let e=t;s.trackError({message:e.detail,source:`planning_conversation`,metadata:{eventId:e.id,errorCode:e.code},posthog:w}),O(e.detail)}else W();if(a.isAgentErrorEvent(t)&&s.trackError({message:t.error,source:`planning_agent`,metadata:{eventId:t.id,toolName:t.tool_name,toolCallId:t.tool_call_id},posthog:w}),a.isUserMessageEvent(t)&&m&&(j(m,p(t)),ee.setConversationState(m,{draftMessage:null})),a.isActionEvent(t)&&de.handleActionEventCacheInvalidation(t,_?.[0]?.id||`test-conversation-id`,T),a.isConversationStateUpdateEvent(t)&&(a.isFullStateConversationStateUpdateEvent(t)&&M(t.value.execution_status),a.isAgentStatusConversationStateUpdateEvent(t)&&M(t.value),a.isStatsConversationStateUpdateEvent(t)&&G(t)),a.isExecuteBashActionEvent(t)&&N(t.action.command),a.isExecuteBashObservationEvent(t)&&P(t.observation.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
3
3
  `)),a.isPlanningFileEditorObservationEvent(t)){let{path:e}=t.observation;if(ye(e)){let t=_?.[0]?.id;t&&e&&(I?U.current={path:e,conversationId:t}:V({conversationId:t,filePath:e},{onSuccess:e=>{B(e)},onError:e=>{console.warn(`Failed to read conversation file:`,e)}}))}}}}catch(e){console.warn(`Failed to parse WebSocket message as JSON:`,e)}},[E,I,R,O,j,T,_,m,M,N,P,V,B,G,W,w]),Te=(0,d.useMemo)(()=>{let e=J?{resend_mode:`since`,after_timestamp:J}:{resend_mode:`all`};return g&&(e.session_api_key=g),{queryParams:e,reconnect:{enabled:!0},onOpen:()=>{y(`OPEN`),S.current=!0,A()},onClose:()=>{y(`CLOSED`)},onError:()=>{y(`CLOSED`),S.current&&O(se.SERVER_CONNECTION_ERROR_MESSAGE,`connection`)},onMessage:Z}},[Z,O,A,g,J]),Ee=(0,d.useMemo)(()=>{let e={resend_all:!0};g&&(e.session_api_key=g);let t=_?.[0];return{queryParams:e,reconnect:{enabled:!0},onOpen:async()=>{if(x(`OPEN`),C.current=!0,A(),t?.id&&t.conversation_url)try{let e=await fe.default.getEventCount(t.id,t.conversation_url,t.session_api_key);z(e),e===0&&L(!1)}catch{L(!1)}},onClose:()=>{x(`CLOSED`)},onError:()=>{x(`CLOSED`),C.current&&O(se.SERVER_CONNECTION_ERROR_MESSAGE,`connection`)},onMessage:we}},[we,O,A,g,_]),{socket:Q,reconnect:De}=oe.useWebSocket(Y||``,Te),{socket:$,reconnect:Oe}=oe.useWebSocket(X||``,Ee),ke=(0,d.useCallback)(()=>{if(k(),r.useConversationStore.getState().conversationMode===`plan`&&X){Oe();return}De()},[X,De,Oe,k]),Ae=(0,d.useCallback)(async e=>{let t=r.useConversationStore.getState().conversationMode===`plan`?$:Q;if(t?.readyState!==WebSocket.OPEN){if(!m){let e=Error(`No conversation ID available`);throw O(e.message),e}try{return await new ne.ConversationClient(re.getAgentServerClientOptions()).sendEvent(m,{role:`user`,content:e.content},{run:!0}),{queued:!0}}catch(e){throw O(e instanceof Error?e.message:`Failed to queue message for delivery`),e}}try{return t.send(JSON.stringify({...e,run:!0})),{queued:!1}}catch(e){throw O(e instanceof Error?e.message:`Failed to send message`),e}},[Q,$,O,m]);(0,d.useEffect)(()=>{Q&&Y&&(()=>{switch(Q.readyState){case WebSocket.CONNECTING:y(`CONNECTING`);break;case WebSocket.OPEN:y(`OPEN`);break;case WebSocket.CLOSING:y(`CLOSING`);break;case WebSocket.CLOSED:y(`CLOSED`);break;default:y(`CLOSED`);break}})()},[Q,Y]),(0,d.useEffect)(()=>{$&&X&&(()=>{switch($.readyState){case WebSocket.CONNECTING:x(`CONNECTING`);break;case WebSocket.OPEN:x(`OPEN`);break;case WebSocket.CLOSING:x(`CLOSING`);break;case WebSocket.CLOSED:x(`CLOSED`);break;default:x(`CLOSED`);break}})()},[$,X]);let je=(0,d.useMemo)(()=>({connectionState:Se,sendMessage:Ae,isLoadingHistory:Ce,reconnect:ke}),[Se,Ae,Ce,ke]);return(0,ge.jsx)(f.Provider,{value:je,children:e})}var h=()=>(0,d.useContext)(f)||null;exports.ConversationWebSocketProvider=m,exports.useConversationWebSocket=h;
4
4
  //# sourceMappingURL=conversation-websocket-context.cjs.map