@openhands/agent-canvas 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1373) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/Trans-De9RwQhA.js +1 -0
  4. package/build/assets/__vite-browser-external-4xJsU2-u.js +1 -0
  5. package/build/assets/{acp-providers-B_ZxlEbx.js → acp-providers-D_D8VUpP.js} +1 -1
  6. package/build/assets/active-backend-context-DRFevVIj.js +1 -0
  7. package/build/assets/add-backend-modal-DzuB9zlG.js +1 -0
  8. package/build/assets/agent-profiles-settings-BfAwTshW.js +1 -0
  9. package/build/assets/{agent-server-client-options-CxnCYyIW.js → agent-server-client-options-DVLRd9sw.js} +1 -1
  10. package/build/assets/agent-server-conversation-service.api-DfH2k6Sx.js +5 -0
  11. package/build/assets/agent-settings-CMMms-0q.js +1 -0
  12. package/build/assets/agent-settings-DjVlKgaP.js +2 -0
  13. package/build/assets/alert-banner-BW0wRYw6.js +1 -0
  14. package/build/assets/api-key-entry-screen-O8gS-fnF.js +1 -0
  15. package/build/assets/app-settings-SlZvaXlk.js +1 -0
  16. package/build/assets/automation-detail-CwsNJ9AM.js +2 -0
  17. package/build/assets/automations-list-B9cPtugh.js +1 -0
  18. package/build/assets/back-nav-button-BYmxFxGt.js +1 -0
  19. package/build/assets/backend-form-modal-D2EDGVAc.js +1 -0
  20. package/build/assets/backend-synced-settings-badge-6OCwIuLY.js +1 -0
  21. package/build/assets/base-modal-CC5Pp8CF.js +1 -0
  22. package/build/assets/bot-D7eUAuSB.js +1 -0
  23. package/build/assets/brand-button-DKPMEKcW.js +1 -0
  24. package/build/assets/{browser-CCwPzPsD.js → browser-B39N74jU.js} +2 -2
  25. package/build/assets/browser-store-BI6uklCG.js +1 -0
  26. package/build/assets/browser-tab-aiDg7aEn.js +1 -0
  27. package/build/assets/chat-send-button-DxuZIoW8.js +1 -0
  28. package/build/assets/check-Bvi71siz.js +1 -0
  29. package/build/assets/checkmark-h7udgXMM.js +1 -0
  30. package/build/assets/{chevron-down-BxZEAIv4.js → chevron-down-CI8A6tet.js} +1 -1
  31. package/build/assets/circle-plus-check-toggle-T3eAIuPQ.js +1 -0
  32. package/build/assets/close-p3Op5lxI.js +1 -0
  33. package/build/assets/code-tag-DYlAhEQY.js +1 -0
  34. package/build/assets/{color-themes-CTNRQd1a.js → color-themes-Dd1sO5U6.js} +1 -1
  35. package/build/assets/combobox-caret-CLGvOs32.js +1 -0
  36. package/build/assets/command-menu-DKrLCRla.js +1 -0
  37. package/build/assets/{command-store-C-57Heey.js → command-store-D8J5LMW1.js} +1 -1
  38. package/build/assets/condenser-settings-BhxvlfoY.js +1 -0
  39. package/build/assets/confirmation-modal-BK1F0A68.js +1 -0
  40. package/build/assets/context-menu-list-item-DBFzplWW.js +1 -0
  41. package/build/assets/conversation-B8prFAZF.js +19 -0
  42. package/build/assets/conversation-DGVDwGn8.js +1 -0
  43. package/build/assets/conversation-local-storage-F6zVMM--.js +1 -0
  44. package/build/assets/conversation-panel-C7DC4Cxx.js +1 -0
  45. package/build/assets/conversation-service.api-Ch9kR9aE.js +1 -0
  46. package/build/assets/conversation-state-store-B2Bp32XI.js +1 -0
  47. package/build/assets/conversation-store-LptbOvKa.js +1 -0
  48. package/build/assets/conversation-tab-empty-state-m8IUkfMj.js +1 -0
  49. package/build/assets/copy-3JCw_XFB.js +1 -0
  50. package/build/assets/copy-BLmGeJcd.js +1 -0
  51. package/build/assets/copy-to-clipboard-button-Aj9wFmt2.js +1 -0
  52. package/build/assets/createLucideIcon-CVAsW2Yo.js +1 -0
  53. package/build/assets/declaration-B9kpCaYl.js +1 -0
  54. package/build/assets/device-verify-B5YCrvSu.js +1 -0
  55. package/build/assets/dist-CodhvuAP.js +1 -0
  56. package/build/assets/dropdown-classes-CgQ45JmQ.js +1 -0
  57. package/build/assets/edit-automation-modal-BoibW8cd.js +1 -0
  58. package/build/assets/ellipsis-button-1BV9Sga8.js +1 -0
  59. package/build/assets/entry.client-BgWj9jL_.js +2 -0
  60. package/build/assets/enum-filter-dropdown-DCITiYVi.js +1 -0
  61. package/build/assets/environment-switch-overlay-DUnKILNH.js +1 -0
  62. package/build/assets/extensions-hub-MtC8lK3A.js +1 -0
  63. package/build/assets/{extensions-navigation-DfLHdTUC.js → extensions-navigation-BtV14oQL.js} +1 -1
  64. package/build/assets/{external-link-D8njjDTk.js → external-link-D2zJjE9G.js} +1 -1
  65. package/build/assets/files-tab-DHqtsKLy.js +1 -0
  66. package/build/assets/files-tab-store-DJsPxYdg.js +1 -0
  67. package/build/assets/folder-mMWFvaw0.js +1 -0
  68. package/build/assets/form-control-classes-9rkU4usZ.js +1 -0
  69. package/build/assets/get-language-from-path-CPNnuVhI.js +1 -0
  70. package/build/assets/git-provider-icon-CGU7_KiU.js +1 -0
  71. package/build/assets/home-BgjWP_UN.js +1 -0
  72. package/build/assets/iconBase-DaTRRUjy.js +1 -0
  73. package/build/assets/index-redirect-CUUJiNki.js +1 -0
  74. package/build/assets/install-server-modal-J_eQ6lhG.js +1 -0
  75. package/build/assets/launch-DamfAY5L.js +1 -0
  76. package/build/assets/lesson-plan-HD886V64.js +4 -0
  77. package/build/assets/link-external-DfKQroKX.js +1 -0
  78. package/build/assets/{list-todo-B_Ts2JmZ.js → list-todo-BfH6yYUK.js} +1 -1
  79. package/build/assets/llm-not-configured-banner-DTrLsVr_.js +27 -0
  80. package/build/assets/llm-settings-BgSFkbHC.js +1 -0
  81. package/build/assets/llm-settings-Bkc8C5Bi.js +1 -0
  82. package/build/assets/{llm-subscription-service-BX_AtNlO.js → llm-subscription-service-CKyaV24y.js} +1 -1
  83. package/build/assets/loader-circle-BEykUKYG.js +1 -0
  84. package/build/assets/loading-spinner-DHAIPZkP.js +1 -0
  85. package/build/assets/manage-backends-modal-BUzj5_Lq.js +1 -0
  86. package/build/assets/manifest-4d6a1552.js +1 -0
  87. package/build/assets/{markdown-renderer-DWy7Np7u.js → markdown-renderer-D8mayGjI.js} +1 -1
  88. package/build/assets/mcp-DvqJYDbz.js +9 -0
  89. package/build/assets/messages-C4KEFkPk.js +40 -0
  90. package/build/assets/middleware-DYHYNAnP.js +6 -0
  91. package/build/assets/modal-backdrop-zVwfOJZr.js +1 -0
  92. package/build/assets/modal-body-Dcu5McCa.js +1 -0
  93. package/build/assets/{modal-classes-C4kS6ib_.js → modal-classes-DPqxSyuP.js} +1 -1
  94. package/build/assets/modal-close-button-CTCX4nCH.js +1 -0
  95. package/build/assets/model-selector-VDHBytb6.js +1 -0
  96. package/build/assets/{mouse-pointer-click-CXAx4FyM.js → mouse-pointer-click-PdEQPL6v.js} +1 -1
  97. package/build/assets/navigation-context-DPs2G0X8.js +1 -0
  98. package/build/assets/navigation-link-D8hfwvxI.js +1 -0
  99. package/build/assets/onboarding-gGIqoxvA.js +1 -0
  100. package/build/assets/onboarding-modal-CGHPoMp7.js +1 -0
  101. package/build/assets/openhands-logo-bcNw5bkY.js +1 -0
  102. package/build/assets/option-service.api-Dz7Eomnx.js +1 -0
  103. package/build/assets/organization-service.api-CnynNoT-.js +1 -0
  104. package/build/assets/path-utils-CBaRYg35.js +1 -0
  105. package/build/assets/{pencil-CsL0ns9y.js → pencil-Dj2XjKmI.js} +1 -1
  106. package/build/assets/plan-components-j9X4AxYM.js +1 -0
  107. package/build/assets/planner-tab-G4j36bJk.js +1 -0
  108. package/build/assets/plugins-management-service-BAp70KN7.js +1 -0
  109. package/build/assets/profiles-service.api-CeYEmSM3.js +1 -0
  110. package/build/assets/providers-CPoq0VXm.js +1 -0
  111. package/build/assets/{proxy-TeteRRW5.js → proxy-CHmFkV16.js} +1 -1
  112. package/build/assets/react-DPDgL6du.js +1 -0
  113. package/build/assets/recommended-automations-launcher-CXaEK1rW.js +50 -0
  114. package/build/assets/{refresh-cw-GkGYXsU-.js → refresh-cw-DM82EIyx.js} +1 -1
  115. package/build/assets/root-CxWZUXTQ.css +1 -0
  116. package/build/assets/root-S6CfVoNm.js +2 -0
  117. package/build/assets/root-layout-CvxdHJ6j.js +2 -0
  118. package/build/assets/runtime-waiting-state-DkzLgvMn.js +1 -0
  119. package/build/assets/schema-field-DwUzlw6b.js +1 -0
  120. package/build/assets/sdk-section-page-BUXONTx6.js +1 -0
  121. package/build/assets/sdk-settings-schema-BjBkMHzZ.js +1 -0
  122. package/build/assets/search-4DHskuhE.js +1 -0
  123. package/build/assets/search-BsjCEFNf.js +1 -0
  124. package/build/assets/secrets-service-CZYjNxFw.js +1 -0
  125. package/build/assets/secrets-settings-ZxyfRBgx.js +1 -0
  126. package/build/assets/segmented-toggle-Cen5AMUc.js +1 -0
  127. package/build/assets/settings-Bx6vn-g8.js +1 -0
  128. package/build/assets/settings-dropdown-input-xzoZwgUe.js +1 -0
  129. package/build/assets/settings-gear-MXCyZW0x.js +1 -0
  130. package/build/assets/settings-index-D4SM26d5.js +1 -0
  131. package/build/assets/settings-input-DYs7t3oK.js +1 -0
  132. package/build/assets/settings-list-classes-DvQr5jVS.js +1 -0
  133. package/build/assets/{settings-CN_HaPjH.js → settings-mQUckT0g.js} +1 -1
  134. package/build/assets/settings-modal-BoC8oMlg.js +1 -0
  135. package/build/assets/settings-section-header-context-COMOIaxV.js +1 -0
  136. package/build/assets/settings-service.api-DldkFI1x.js +1 -0
  137. package/build/assets/settings-switch-C2N2xqEb.js +1 -0
  138. package/build/assets/{settings-utils-9-_6iVIn.js → settings-utils-BMdG65By.js} +1 -1
  139. package/build/assets/shared-conversation-DMiaQFsj.js +1 -0
  140. package/build/assets/sidebar-layout-BtpUSN3j.js +1 -0
  141. package/build/assets/sidebar-mobile-menu-toggle-CaV3tQFF.js +1 -0
  142. package/build/assets/sidebar-nav-link-CIB3NBRW.js +1 -0
  143. package/build/assets/sidebar-store-CZuE8AH5.js +1 -0
  144. package/build/assets/skill-card-pill-row-D2bUe2kB.js +1 -0
  145. package/build/assets/skills-9cDZONKh.js +1 -0
  146. package/build/assets/skills-plugins-D2WkrXkr.js +1 -0
  147. package/build/assets/skills-settings-CZGVOp_t.js +2 -0
  148. package/build/assets/{square-chevron-right-Cfi-SUY0.js → square-chevron-right-Czw3FFWc.js} +1 -1
  149. package/build/assets/styled-tooltip-DsKsFjuq.js +1 -0
  150. package/build/assets/suspense-X5dBsJzn.js +1 -0
  151. package/build/assets/switch-skeleton-DqQwalyu.js +1 -0
  152. package/build/assets/task-list-tab-BAThr9Ex.js +1 -0
  153. package/build/assets/{terminal-HakoMrQX.js → terminal-B0aL_iDZ.js} +2 -2
  154. package/build/assets/terminal-BuLtIrb9.js +1 -0
  155. package/build/assets/toggle-switch-DBlOOzBr.js +1 -0
  156. package/build/assets/{trash-2-Bq4hqiRH.js → trash-2-Be_7y3Mn.js} +1 -1
  157. package/build/assets/typography-YGPBGzOG.js +1 -0
  158. package/build/assets/u-check-circle-BqoIxNz_.js +1 -0
  159. package/build/assets/u-check-circle-half-LiwZkuFe.js +1 -0
  160. package/build/assets/u-edit-DJ90xc8Z.js +1 -0
  161. package/build/assets/use-acp-credential-form-rzaqkJ1n.js +1 -0
  162. package/build/assets/use-activate-agent-profile-DY0txItX.js +1 -0
  163. package/build/assets/use-active-agent-profile-Cp5AFONR.js +1 -0
  164. package/build/assets/use-active-conversation-DvcFBqFe.js +1 -0
  165. package/build/assets/use-agent-profiles-DnH16_Vm.js +1 -0
  166. package/build/assets/use-agent-state-BvRcEzY4.js +1 -0
  167. package/build/assets/use-backends-health-e-Ull4wz.js +1 -0
  168. package/build/assets/use-breakpoint-B-O0lQ84.js +1 -0
  169. package/build/assets/use-can-manage-org-profiles-OIhplvQ0.js +1 -0
  170. package/build/assets/use-click-outside-element-Bf4Omzot.js +1 -0
  171. package/build/assets/use-cloud-current-user-id-ekU7UXDT.js +1 -0
  172. package/build/assets/use-config-Dwf5gla-.js +1 -0
  173. package/build/assets/use-create-conversation-CvAXfA3T.js +1 -0
  174. package/build/assets/use-create-secret-BKeXCo__.js +1 -0
  175. package/build/assets/use-event-store-YSOxy9FC.js +4 -0
  176. package/build/assets/use-handle-plan-click-cAXS-Hft.js +1 -0
  177. package/build/assets/use-is-authed-_dhQ2Xuj.js +1 -0
  178. package/build/assets/use-launch-skill-in-chat-BnoDgvAy.js +1 -0
  179. package/build/assets/use-llm-profiles-BcLibtGb.js +1 -0
  180. package/build/assets/use-onboarding-completion-C_Swglzp.js +1 -0
  181. package/build/assets/use-plugins-marketplace-BGb-KgfD.js +1 -0
  182. package/build/assets/use-runtime-is-ready-CBFe69Ew.js +1 -0
  183. package/build/assets/use-save-agent-profile-DFjxHhNx.js +1 -0
  184. package/build/assets/{use-save-settings-DErJDIDL.js → use-save-settings-5xPYpSQM.js} +1 -1
  185. package/build/assets/use-settings-B07msZ2Z.js +1 -0
  186. package/build/assets/use-settings-nav-items-CswsOEyw.js +16 -0
  187. package/build/assets/use-skills-Aoaoq_ei.js +1 -0
  188. package/build/assets/use-task-list-CmWGElgb.js +1 -0
  189. package/build/assets/use-tracking-CqODdfO4.js +1 -0
  190. package/build/assets/use-user-conversation-BPHQ-dm-.js +1 -0
  191. package/build/assets/useMutation-DCE9RcgK.js +1 -0
  192. package/build/assets/useMutationState-BUab8Kxr.js +1 -0
  193. package/build/assets/useQueries-CRzaAqzH.js +1 -0
  194. package/build/assets/useQuery-CpjHYtZc.js +1 -0
  195. package/build/assets/useTranslation-Cgy4JA_g.js +1 -0
  196. package/build/assets/utils-CE0lDWtb.js +1 -0
  197. package/build/assets/vendor-styling-CI0PQ3ab.js +22 -0
  198. package/build/assets/{vendor~browser-BQU4C3CQ.js → vendor~browser-Cvg7jXCP.js} +1 -1
  199. package/build/assets/{vendor~browser-tab-Cim6xN2k.js → vendor~browser-tab-Di0kh5Zw.js} +1 -1
  200. package/build/assets/vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js +1 -0
  201. package/build/assets/vendor~entry.client-9tWQ_Ugw.js +1 -0
  202. package/build/assets/{vendor~entry.client-lAMyAlBD.js → vendor~entry.client-D6BtSOtn.js} +1 -1
  203. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +177 -0
  204. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js +1 -0
  205. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +10 -0
  206. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~t35o0b0f-Bss49YXv.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js} +1 -1
  207. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js +1 -0
  208. package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~fpbtwbmk-DDSPtjxR.js → vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js} +1 -1
  209. package/build/assets/{vendor~files-tab-BvQLon-P.js → vendor~files-tab-B02k3xvx.js} +1 -1
  210. package/build/assets/{vendor~home~conversation-panel~conversation-DBPRU26Z.js → vendor~home~conversation-panel~conversation-CYMF9JYB.js} +1 -1
  211. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnEBAp2W.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js} +1 -1
  212. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CzI-A-Gz.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js} +1 -1
  213. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-ByET2Quf.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js} +1 -1
  214. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DCYBrned.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js} +1 -1
  215. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnctfFZL.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js} +1 -1
  216. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-pSG7lnvH.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js} +1 -1
  217. package/build/assets/{vendor~launch-DqoOsAhA.js → vendor~launch-CHXA9cJu.js} +1 -1
  218. package/build/assets/vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js +1 -0
  219. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-BJl81v7J.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js} +1 -1
  220. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js +1 -0
  221. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js +48 -0
  222. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DRld6s9c.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js} +236 -17
  223. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-9d2kA26V.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js} +1 -1
  224. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +1 -0
  225. package/build/assets/verification-settings-DZQ-JvKH.js +1 -0
  226. package/build/assets/x-Cb0WAtak.js +1 -0
  227. package/build/assets/x-mark-Batp6gXa.js +1 -0
  228. package/build/index.html +4 -4
  229. package/build/locales/ar/openhands.json +138 -1
  230. package/build/locales/ca/openhands.json +138 -1
  231. package/build/locales/de/openhands.json +138 -1
  232. package/build/locales/en/openhands.json +138 -1
  233. package/build/locales/es/openhands.json +138 -1
  234. package/build/locales/fr/openhands.json +138 -1
  235. package/build/locales/it/openhands.json +138 -1
  236. package/build/locales/ja/openhands.json +138 -1
  237. package/build/locales/ko-KR/openhands.json +138 -1
  238. package/build/locales/no/openhands.json +138 -1
  239. package/build/locales/pt/openhands.json +138 -1
  240. package/build/locales/tr/openhands.json +138 -1
  241. package/build/locales/uk/openhands.json +138 -1
  242. package/build/locales/zh-CN/openhands.json +138 -1
  243. package/build/locales/zh-TW/openhands.json +138 -1
  244. package/config/defaults.json +7 -9
  245. package/dist/_virtual/__vite-browser-external.cjs +2 -0
  246. package/dist/_virtual/__vite-browser-external.cjs.map +1 -0
  247. package/dist/_virtual/__vite-browser-external.js +9 -0
  248. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  249. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs +2 -0
  250. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs.map +1 -0
  251. package/dist/api/agent-profiles-service/agent-profiles-service.api.d.ts +22 -0
  252. package/dist/api/agent-profiles-service/agent-profiles-service.api.js +35 -0
  253. package/dist/api/agent-profiles-service/agent-profiles-service.api.js.map +1 -0
  254. package/dist/api/agent-server-adapter.cjs +2 -2
  255. package/dist/api/agent-server-adapter.cjs.map +1 -1
  256. package/dist/api/agent-server-adapter.d.ts +11 -1
  257. package/dist/api/agent-server-adapter.js +60 -60
  258. package/dist/api/agent-server-adapter.js.map +1 -1
  259. package/dist/api/agent-server-compatibility.cjs +1 -1
  260. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  261. package/dist/api/agent-server-compatibility.js +1 -0
  262. package/dist/api/agent-server-compatibility.js.map +1 -1
  263. package/dist/api/agent-server-home.cjs +1 -1
  264. package/dist/api/agent-server-home.cjs.map +1 -1
  265. package/dist/api/agent-server-home.js +1 -0
  266. package/dist/api/agent-server-home.js.map +1 -1
  267. package/dist/api/cloud/agent-profiles-service.api.cjs +2 -0
  268. package/dist/api/cloud/agent-profiles-service.api.cjs.map +1 -0
  269. package/dist/api/cloud/agent-profiles-service.api.d.ts +7 -0
  270. package/dist/api/cloud/agent-profiles-service.api.js +58 -0
  271. package/dist/api/cloud/agent-profiles-service.api.js.map +1 -0
  272. package/dist/api/cloud/organization-service.api.cjs +1 -1
  273. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  274. package/dist/api/cloud/organization-service.api.d.ts +8 -0
  275. package/dist/api/cloud/organization-service.api.js +3 -1
  276. package/dist/api/cloud/organization-service.api.js.map +1 -1
  277. package/dist/api/cloud/profiles-service.api.cjs +2 -0
  278. package/dist/api/cloud/profiles-service.api.cjs.map +1 -0
  279. package/dist/api/cloud/profiles-service.api.d.ts +7 -0
  280. package/dist/api/cloud/profiles-service.api.js +75 -0
  281. package/dist/api/cloud/profiles-service.api.js.map +1 -0
  282. package/dist/api/cloud/settings-service.api.cjs +1 -1
  283. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  284. package/dist/api/cloud/settings-service.api.js +1 -1
  285. package/dist/api/cloud/settings-service.api.js.map +1 -1
  286. package/dist/api/config-service/config-service.api.cjs +1 -1
  287. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  288. package/dist/api/config-service/config-service.api.js +1 -0
  289. package/dist/api/config-service/config-service.api.js.map +1 -1
  290. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  291. package/dist/api/conversation-metadata-store.d.ts +11 -0
  292. package/dist/api/conversation-metadata-store.js.map +1 -1
  293. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  294. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  295. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -1
  296. package/dist/api/conversation-service/agent-server-conversation-service.api.js +134 -105
  297. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  298. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +2 -0
  299. package/dist/api/conversation-service/conversation-service.api.cjs +1 -1
  300. package/dist/api/conversation-service/conversation-service.api.cjs.map +1 -1
  301. package/dist/api/conversation-service/conversation-service.api.d.ts +1 -0
  302. package/dist/api/conversation-service/conversation-service.api.js +4 -0
  303. package/dist/api/conversation-service/conversation-service.api.js.map +1 -1
  304. package/dist/api/device-flow-client.cjs +1 -1
  305. package/dist/api/device-flow-client.cjs.map +1 -1
  306. package/dist/api/device-flow-client.js +33 -25
  307. package/dist/api/device-flow-client.js.map +1 -1
  308. package/dist/api/event-service/event-service.api.cjs +1 -1
  309. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  310. package/dist/api/event-service/event-service.api.js +1 -0
  311. package/dist/api/event-service/event-service.api.js.map +1 -1
  312. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  313. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  314. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -3
  315. package/dist/api/mcp-service/mcp-redacted-credentials.js +29 -30
  316. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  317. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  318. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  319. package/dist/api/mcp-service/mcp-service.api.d.ts +8 -1
  320. package/dist/api/mcp-service/mcp-service.api.js +129 -23
  321. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  322. package/dist/api/option-service/option-service.api.cjs +1 -1
  323. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  324. package/dist/api/option-service/option-service.api.js +1 -0
  325. package/dist/api/option-service/option-service.api.js.map +1 -1
  326. package/dist/api/plugins-management-service.cjs +2 -0
  327. package/dist/api/plugins-management-service.cjs.map +1 -0
  328. package/dist/api/plugins-management-service.d.ts +50 -0
  329. package/dist/api/plugins-management-service.js +41 -0
  330. package/dist/api/plugins-management-service.js.map +1 -0
  331. package/dist/api/plugins-service.d.ts +49 -0
  332. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  333. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  334. package/dist/api/profiles-service/profiles-service.api.js +21 -14
  335. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  336. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  337. package/dist/api/runtime-service/agent-server-runtime-service.cjs.map +1 -1
  338. package/dist/api/runtime-service/agent-server-runtime-service.js +1 -0
  339. package/dist/api/runtime-service/agent-server-runtime-service.js.map +1 -1
  340. package/dist/api/secrets-service.cjs +1 -1
  341. package/dist/api/secrets-service.cjs.map +1 -1
  342. package/dist/api/secrets-service.js +1 -0
  343. package/dist/api/secrets-service.js.map +1 -1
  344. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  345. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  346. package/dist/api/settings-service/settings-service.api.js +92 -50
  347. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  348. package/dist/api/skills-service.cjs +1 -1
  349. package/dist/api/skills-service.cjs.map +1 -1
  350. package/dist/api/skills-service.js +1 -0
  351. package/dist/api/skills-service.js.map +1 -1
  352. package/dist/api/workspaces-service/workspaces-service.api.cjs +1 -1
  353. package/dist/api/workspaces-service/workspaces-service.api.cjs.map +1 -1
  354. package/dist/api/workspaces-service/workspaces-service.api.js +1 -0
  355. package/dist/api/workspaces-service/workspaces-service.api.js.map +1 -1
  356. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  357. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  358. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +57 -38
  359. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  360. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -1
  361. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  362. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +13 -9
  363. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  364. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  365. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  366. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +65 -26
  367. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  368. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  369. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  370. package/dist/components/conversation-events/chat/event-message.js +78 -76
  371. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  372. package/dist/components/features/analytics/telemetry-consent-banner.cjs +1 -1
  373. package/dist/components/features/analytics/telemetry-consent-banner.cjs.map +1 -1
  374. package/dist/components/features/analytics/telemetry-consent-banner.js +1 -0
  375. package/dist/components/features/analytics/telemetry-consent-banner.js.map +1 -1
  376. package/dist/components/features/automations/detail/activity-log-item.d.ts +3 -2
  377. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -2
  378. package/dist/components/features/automations/detail/debug-automation-button.d.ts +17 -0
  379. package/dist/components/features/automations/detail/run-logs-modal.d.ts +6 -1
  380. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  381. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  382. package/dist/components/features/backends/backend-form-modal.d.ts +6 -2
  383. package/dist/components/features/backends/backend-form-modal.js +198 -161
  384. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  385. package/dist/components/features/backends/backend-row.cjs +1 -1
  386. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  387. package/dist/components/features/backends/backend-row.d.ts +2 -1
  388. package/dist/components/features/backends/backend-row.js +60 -54
  389. package/dist/components/features/backends/backend-row.js.map +1 -1
  390. package/dist/components/features/backends/backend-selector.cjs +1 -1
  391. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  392. package/dist/components/features/backends/backend-selector.js +4 -4
  393. package/dist/components/features/backends/backend-version.cjs +1 -1
  394. package/dist/components/features/backends/backend-version.cjs.map +1 -1
  395. package/dist/components/features/backends/backend-version.js +1 -0
  396. package/dist/components/features/backends/backend-version.js.map +1 -1
  397. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  398. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  399. package/dist/components/features/backends/manage-backends-modal.js +72 -61
  400. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  401. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  402. package/dist/components/features/chat/change-agent-button.js +9 -9
  403. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  404. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  405. package/dist/components/features/chat/chat-add-file-button.js +38 -34
  406. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  407. package/dist/components/features/chat/chat-interface.cjs +2 -2
  408. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  409. package/dist/components/features/chat/chat-interface.js +136 -129
  410. package/dist/components/features/chat/chat-interface.js.map +1 -1
  411. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  412. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  413. package/dist/components/features/chat/components/chat-input-actions.js +100 -87
  414. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  415. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +2 -0
  416. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -0
  417. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +15 -0
  418. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +118 -0
  419. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -0
  420. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  421. package/dist/components/features/chat/components/chat-input-model.js +17 -17
  422. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +2 -0
  423. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -0
  424. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +9 -0
  425. package/dist/components/features/chat/components/chat-input-profile-picker.js +112 -0
  426. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -0
  427. package/dist/components/features/chat/components/resolve-picker-kind.cjs +2 -0
  428. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -0
  429. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +29 -0
  430. package/dist/components/features/chat/components/resolve-picker-kind.js +8 -0
  431. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -0
  432. package/dist/components/features/chat/goal-status-banner.cjs +2 -0
  433. package/dist/components/features/chat/goal-status-banner.cjs.map +1 -0
  434. package/dist/components/features/chat/goal-status-banner.d.ts +11 -0
  435. package/dist/components/features/chat/goal-status-banner.js +12 -0
  436. package/dist/components/features/chat/goal-status-banner.js.map +1 -0
  437. package/dist/components/features/chat/goal-status-content.cjs +2 -0
  438. package/dist/components/features/chat/goal-status-content.cjs.map +1 -0
  439. package/dist/components/features/chat/goal-status-content.d.ts +21 -0
  440. package/dist/components/features/chat/goal-status-content.js +98 -0
  441. package/dist/components/features/chat/goal-status-content.js.map +1 -0
  442. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  443. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  444. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  445. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  446. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs +1 -1
  447. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs.map +1 -1
  448. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +10 -3
  449. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js +29 -16
  450. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js.map +1 -1
  451. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs +1 -1
  452. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs.map +1 -1
  453. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -2
  454. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js +16 -16
  455. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js.map +1 -1
  456. package/dist/components/features/chat/user-message-body.cjs +1 -1
  457. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  458. package/dist/components/features/chat/user-message-body.js +20 -20
  459. package/dist/components/features/chat/user-message-body.js.map +1 -1
  460. package/dist/components/features/command-menu/command-menu-items.d.ts +32 -0
  461. package/dist/components/features/command-menu/command-menu-trigger.cjs +2 -0
  462. package/dist/components/features/command-menu/command-menu-trigger.cjs.map +1 -0
  463. package/dist/components/features/command-menu/command-menu-trigger.d.ts +5 -0
  464. package/dist/components/features/command-menu/command-menu-trigger.js +53 -0
  465. package/dist/components/features/command-menu/command-menu-trigger.js.map +1 -0
  466. package/dist/components/features/command-menu/command-menu.d.ts +2 -0
  467. package/dist/components/features/command-menu/index.d.ts +2 -0
  468. package/dist/components/features/controls/tools-context-menu.cjs +1 -1
  469. package/dist/components/features/controls/tools-context-menu.cjs.map +1 -1
  470. package/dist/components/features/controls/tools-context-menu.d.ts +3 -1
  471. package/dist/components/features/controls/tools-context-menu.js +94 -77
  472. package/dist/components/features/controls/tools-context-menu.js.map +1 -1
  473. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  474. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  475. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +8 -5
  476. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  477. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  478. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +1 -1
  479. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  480. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  481. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  482. package/dist/components/features/conversation-panel/conversation-panel.js +2 -1
  483. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  484. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  485. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  486. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -1
  487. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  488. package/dist/components/features/conversation-panel/plugins-modal.cjs +2 -0
  489. package/dist/components/features/conversation-panel/plugins-modal.cjs.map +1 -0
  490. package/dist/components/features/conversation-panel/plugins-modal.d.ts +12 -0
  491. package/dist/components/features/conversation-panel/plugins-modal.js +62 -0
  492. package/dist/components/features/conversation-panel/plugins-modal.js.map +1 -0
  493. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
  494. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
  495. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +4 -4
  496. package/dist/components/features/mcp-logo-badge.cjs +1 -1
  497. package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
  498. package/dist/components/features/mcp-logo-badge.js +17 -15
  499. package/dist/components/features/mcp-logo-badge.js.map +1 -1
  500. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  501. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  502. package/dist/components/features/mcp-page/custom-server-editor.js +102 -59
  503. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  504. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  505. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  506. package/dist/components/features/mcp-page/install-server-modal.js +284 -169
  507. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  508. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  509. package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
  510. package/dist/components/features/mcp-page/installed-server-card.js +16 -18
  511. package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
  512. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -13
  513. package/dist/components/features/plugins/add-plugin-modal.d.ts +6 -0
  514. package/dist/components/features/plugins/build-plugins-view-model.d.ts +39 -0
  515. package/dist/components/features/plugins/plugin-card.d.ts +13 -0
  516. package/dist/components/features/plugins/plugin-detail-modal.d.ts +13 -0
  517. package/dist/components/features/plugins/plugin-picker-card.d.ts +10 -0
  518. package/dist/components/features/plugins/plugin-picker-modal.d.ts +9 -0
  519. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +9 -0
  520. package/dist/components/features/plugins/plugin-picker.d.ts +18 -0
  521. package/dist/components/features/plugins/plugin-spec-identity.d.ts +28 -0
  522. package/dist/components/features/plugins/plugins-toolbar.d.ts +9 -0
  523. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +16 -0
  524. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +13 -0
  525. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +15 -0
  526. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +7 -0
  527. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +7 -0
  528. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +7 -0
  529. package/dist/components/features/settings/agent-profiles/index.d.ts +6 -0
  530. package/dist/components/features/settings/agent-profiles/merge-agent-profile-save-input.d.ts +18 -0
  531. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
  532. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +1 -0
  533. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  534. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  535. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +3 -1
  536. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +3 -1
  537. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs +1 -1
  538. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs.map +1 -1
  539. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js +3 -2
  540. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js.map +1 -1
  541. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +7 -7
  542. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  543. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +279 -130
  544. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  545. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -12
  546. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -11
  547. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  548. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  549. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  550. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  551. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -2
  552. package/dist/components/features/sidebar/sidebar-rail-body.js +81 -82
  553. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  554. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  555. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  556. package/dist/components/features/sidebar/sidebar.js +45 -46
  557. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  558. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  559. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  560. package/dist/components/features/skills/extensions-navigation.js +1 -2
  561. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  562. package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
  563. package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
  564. package/dist/components/shared/modals/modal-backdrop.d.ts +5 -1
  565. package/dist/components/shared/modals/modal-backdrop.js +3 -3
  566. package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
  567. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  568. package/dist/components/shared/modals/settings/model-selector.js +16 -16
  569. package/dist/config/defaults.cjs +1 -1
  570. package/dist/config/defaults.cjs.map +1 -1
  571. package/dist/config/defaults.js +7 -3
  572. package/dist/config/defaults.js.map +1 -1
  573. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  574. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  575. package/dist/contexts/conversation-websocket-context.js +200 -197
  576. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  577. package/dist/hooks/chat/use-goal-interceptor.cjs +2 -0
  578. package/dist/hooks/chat/use-goal-interceptor.cjs.map +1 -0
  579. package/dist/hooks/chat/use-goal-interceptor.d.ts +8 -0
  580. package/dist/hooks/chat/use-goal-interceptor.js +37 -0
  581. package/dist/hooks/chat/use-goal-interceptor.js.map +1 -0
  582. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  583. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  584. package/dist/hooks/chat/use-grip-resize.js +17 -16
  585. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  586. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  587. package/dist/hooks/chat/use-model-interceptor.cjs.map +1 -1
  588. package/dist/hooks/chat/use-model-interceptor.d.ts +3 -3
  589. package/dist/hooks/chat/use-model-interceptor.js +8 -9
  590. package/dist/hooks/chat/use-model-interceptor.js.map +1 -1
  591. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  592. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  593. package/dist/hooks/chat/use-slash-command.js +4 -4
  594. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  595. package/dist/hooks/mutation/conversation-mutation-utils.cjs +1 -1
  596. package/dist/hooks/mutation/conversation-mutation-utils.cjs.map +1 -1
  597. package/dist/hooks/mutation/conversation-mutation-utils.d.ts +17 -0
  598. package/dist/hooks/mutation/conversation-mutation-utils.js +23 -4
  599. package/dist/hooks/mutation/conversation-mutation-utils.js.map +1 -1
  600. package/dist/hooks/mutation/use-activate-agent-profile.cjs +2 -0
  601. package/dist/hooks/mutation/use-activate-agent-profile.cjs.map +1 -0
  602. package/dist/hooks/mutation/use-activate-agent-profile.d.ts +23 -0
  603. package/dist/hooks/mutation/use-activate-agent-profile.js +34 -0
  604. package/dist/hooks/mutation/use-activate-agent-profile.js.map +1 -0
  605. package/dist/hooks/mutation/use-activate-llm-profile.cjs +1 -1
  606. package/dist/hooks/mutation/use-activate-llm-profile.js +1 -1
  607. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  608. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  609. package/dist/hooks/mutation/use-add-mcp-server.d.ts +1 -12
  610. package/dist/hooks/mutation/use-add-mcp-server.js +10 -34
  611. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  612. package/dist/hooks/mutation/use-apply-onboarding-agent-profile.d.ts +20 -0
  613. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  614. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  615. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -0
  616. package/dist/hooks/mutation/use-create-conversation.js +94 -25
  617. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  618. package/dist/hooks/mutation/use-delete-agent-profile.d.ts +1 -0
  619. package/dist/hooks/mutation/use-delete-llm-profile.cjs +1 -1
  620. package/dist/hooks/mutation/use-delete-llm-profile.js +1 -1
  621. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  622. package/dist/hooks/mutation/use-delete-mcp-server.js +4 -4
  623. package/dist/hooks/mutation/use-fork-conversation.cjs +2 -0
  624. package/dist/hooks/mutation/use-fork-conversation.cjs.map +1 -0
  625. package/dist/hooks/mutation/use-fork-conversation.d.ts +24 -0
  626. package/dist/hooks/mutation/use-fork-conversation.js +29 -0
  627. package/dist/hooks/mutation/use-fork-conversation.js.map +1 -0
  628. package/dist/hooks/mutation/use-install-plugin.d.ts +7 -0
  629. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  630. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  631. package/dist/hooks/mutation/use-new-conversation-command.d.ts +1 -0
  632. package/dist/hooks/mutation/use-new-conversation-command.js +20 -10
  633. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  634. package/dist/hooks/mutation/use-rename-agent-profile.d.ts +6 -0
  635. package/dist/hooks/mutation/use-rename-llm-profile.cjs +1 -1
  636. package/dist/hooks/mutation/use-rename-llm-profile.js +1 -1
  637. package/dist/hooks/mutation/use-save-agent-profile.d.ts +5 -0
  638. package/dist/hooks/mutation/use-save-llm-profile.cjs +1 -1
  639. package/dist/hooks/mutation/use-save-llm-profile.js +1 -1
  640. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  641. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  642. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs +1 -1
  643. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs.map +1 -1
  644. package/dist/hooks/mutation/use-switch-llm-profile-and-log.d.ts +3 -4
  645. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js +10 -35
  646. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js.map +1 -1
  647. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  648. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  649. package/dist/hooks/mutation/use-switch-llm-profile.d.ts +20 -5
  650. package/dist/hooks/mutation/use-switch-llm-profile.js +38 -14
  651. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  652. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  653. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  654. package/dist/hooks/mutation/use-update-mcp-server.js +11 -37
  655. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  656. package/dist/hooks/query/query-keys.cjs +1 -1
  657. package/dist/hooks/query/query-keys.cjs.map +1 -1
  658. package/dist/hooks/query/query-keys.d.ts +21 -0
  659. package/dist/hooks/query/query-keys.js +7 -3
  660. package/dist/hooks/query/query-keys.js.map +1 -1
  661. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  662. package/dist/hooks/query/use-active-conversation.cjs.map +1 -1
  663. package/dist/hooks/query/use-active-conversation.js +17 -16
  664. package/dist/hooks/query/use-active-conversation.js.map +1 -1
  665. package/dist/hooks/query/use-agent-profiles.cjs +2 -0
  666. package/dist/hooks/query/use-agent-profiles.cjs.map +1 -0
  667. package/dist/hooks/query/use-agent-profiles.d.ts +13 -0
  668. package/dist/hooks/query/use-agent-profiles.js +24 -0
  669. package/dist/hooks/query/use-agent-profiles.js.map +1 -0
  670. package/dist/hooks/query/use-backends-health.cjs +1 -1
  671. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  672. package/dist/hooks/query/use-backends-health.js +18 -3
  673. package/dist/hooks/query/use-backends-health.js.map +1 -1
  674. package/dist/hooks/query/use-conversation-history.cjs +1 -1
  675. package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
  676. package/dist/hooks/query/use-conversation-history.js +4 -2
  677. package/dist/hooks/query/use-conversation-history.js.map +1 -1
  678. package/dist/hooks/query/use-local-workspaces.cjs +1 -1
  679. package/dist/hooks/query/use-local-workspaces.cjs.map +1 -1
  680. package/dist/hooks/query/use-local-workspaces.js +1 -0
  681. package/dist/hooks/query/use-local-workspaces.js.map +1 -1
  682. package/dist/hooks/query/use-plugins-marketplace.d.ts +7 -0
  683. package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
  684. package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
  685. package/dist/hooks/query/use-resolved-workspaces.js +7 -6
  686. package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
  687. package/dist/hooks/query/use-search-subdirs.cjs +1 -1
  688. package/dist/hooks/query/use-search-subdirs.cjs.map +1 -1
  689. package/dist/hooks/query/use-search-subdirs.js +1 -0
  690. package/dist/hooks/query/use-search-subdirs.js.map +1 -1
  691. package/dist/hooks/query/use-settings.cjs +1 -1
  692. package/dist/hooks/query/use-settings.cjs.map +1 -1
  693. package/dist/hooks/query/use-settings.js +11 -11
  694. package/dist/hooks/query/use-settings.js.map +1 -1
  695. package/dist/hooks/query/use-verified-models.cjs +1 -1
  696. package/dist/hooks/query/use-verified-models.cjs.map +1 -1
  697. package/dist/hooks/query/use-verified-models.js +1 -0
  698. package/dist/hooks/query/use-verified-models.js.map +1 -1
  699. package/dist/hooks/use-acp-model-context.cjs +1 -1
  700. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  701. package/dist/hooks/use-acp-model-context.d.ts +1 -1
  702. package/dist/hooks/use-acp-model-context.js +9 -8
  703. package/dist/hooks/use-acp-model-context.js.map +1 -1
  704. package/dist/hooks/use-active-agent-profile.cjs +2 -0
  705. package/dist/hooks/use-active-agent-profile.cjs.map +1 -0
  706. package/dist/hooks/use-active-agent-profile.d.ts +20 -0
  707. package/dist/hooks/use-active-agent-profile.js +17 -0
  708. package/dist/hooks/use-active-agent-profile.js.map +1 -0
  709. package/dist/hooks/use-auto-resize.cjs +1 -1
  710. package/dist/hooks/use-auto-resize.cjs.map +1 -1
  711. package/dist/hooks/use-auto-resize.d.ts +2 -0
  712. package/dist/hooks/use-auto-resize.js +49 -45
  713. package/dist/hooks/use-auto-resize.js.map +1 -1
  714. package/dist/hooks/use-can-manage-org-profiles.cjs +1 -0
  715. package/dist/hooks/use-can-manage-org-profiles.d.ts +18 -0
  716. package/dist/hooks/use-can-manage-org-profiles.js +2 -0
  717. package/dist/hooks/use-chat-input-llm-profile-state.cjs +2 -0
  718. package/dist/hooks/use-chat-input-llm-profile-state.cjs.map +1 -0
  719. package/dist/hooks/use-chat-input-llm-profile-state.d.ts +23 -0
  720. package/dist/hooks/use-chat-input-llm-profile-state.js +30 -0
  721. package/dist/hooks/use-chat-input-llm-profile-state.js.map +1 -0
  722. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  723. package/dist/hooks/use-chat-input-model-state.d.ts +1 -1
  724. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  725. package/dist/hooks/use-chat-input-profile-state.cjs +2 -0
  726. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -0
  727. package/dist/hooks/use-chat-input-profile-state.d.ts +20 -0
  728. package/dist/hooks/use-chat-input-profile-state.js +22 -0
  729. package/dist/hooks/use-chat-input-profile-state.js.map +1 -0
  730. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  731. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  732. package/dist/hooks/use-conversation-name-context-menu.d.ts +4 -0
  733. package/dist/hooks/use-conversation-name-context-menu.js +44 -37
  734. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  735. package/dist/hooks/use-conversation-plugins.cjs +2 -0
  736. package/dist/hooks/use-conversation-plugins.cjs.map +1 -0
  737. package/dist/hooks/use-conversation-plugins.d.ts +9 -0
  738. package/dist/hooks/use-conversation-plugins.js +12 -0
  739. package/dist/hooks/use-conversation-plugins.js.map +1 -0
  740. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  741. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  742. package/dist/hooks/use-handle-plan-click.js +2 -1
  743. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  744. package/dist/hooks/use-llm-configured.cjs +1 -1
  745. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  746. package/dist/hooks/use-llm-configured.js +17 -16
  747. package/dist/hooks/use-llm-configured.js.map +1 -1
  748. package/dist/hooks/use-tracking.cjs +1 -1
  749. package/dist/hooks/use-tracking.cjs.map +1 -1
  750. package/dist/hooks/use-tracking.d.ts +51 -1
  751. package/dist/hooks/use-tracking.js +61 -2
  752. package/dist/hooks/use-tracking.js.map +1 -1
  753. package/dist/i18n/declaration.cjs +1 -1
  754. package/dist/i18n/declaration.cjs.map +1 -1
  755. package/dist/i18n/declaration.d.ts +138 -1
  756. package/dist/i18n/declaration.js +1 -1
  757. package/dist/i18n/declaration.js.map +1 -1
  758. package/dist/i18n/translation.cjs +18 -3
  759. package/dist/i18n/translation.cjs.map +1 -1
  760. package/dist/i18n/translation.js +2329 -0
  761. package/dist/i18n/translation.js.map +1 -1
  762. package/dist/icons/slack.cjs +2 -0
  763. package/dist/icons/slack.cjs.map +1 -0
  764. package/dist/icons/slack.js +19 -0
  765. package/dist/icons/slack.js.map +1 -0
  766. package/dist/icons/u-puzzle-piece.cjs +2 -0
  767. package/dist/icons/u-puzzle-piece.cjs.map +1 -0
  768. package/dist/icons/u-puzzle-piece.js +19 -0
  769. package/dist/icons/u-puzzle-piece.js.map +1 -0
  770. package/dist/icons/x-circle-solid.cjs +2 -0
  771. package/dist/icons/x-circle-solid.cjs.map +1 -0
  772. package/dist/icons/x-circle-solid.js +13 -0
  773. package/dist/icons/x-circle-solid.js.map +1 -0
  774. package/dist/locales/ar/openhands.json +138 -1
  775. package/dist/locales/ca/openhands.json +138 -1
  776. package/dist/locales/de/openhands.json +138 -1
  777. package/dist/locales/en/openhands.json +138 -1
  778. package/dist/locales/es/openhands.json +138 -1
  779. package/dist/locales/fr/openhands.json +138 -1
  780. package/dist/locales/it/openhands.json +138 -1
  781. package/dist/locales/ja/openhands.json +138 -1
  782. package/dist/locales/ko-KR/openhands.json +138 -1
  783. package/dist/locales/no/openhands.json +138 -1
  784. package/dist/locales/pt/openhands.json +138 -1
  785. package/dist/locales/tr/openhands.json +138 -1
  786. package/dist/locales/uk/openhands.json +138 -1
  787. package/dist/locales/zh-CN/openhands.json +138 -1
  788. package/dist/locales/zh-TW/openhands.json +138 -1
  789. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
  790. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
  791. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +0 -20
  792. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
  793. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs +1 -1
  794. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs.map +1 -1
  795. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js +1 -6
  796. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js.map +1 -1
  797. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs +1 -1
  798. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs.map +1 -1
  799. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js +1 -6
  800. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js.map +1 -1
  801. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs +1 -1
  802. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs.map +1 -1
  803. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js +1 -6
  804. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js.map +1 -1
  805. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs +1 -1
  806. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs.map +1 -1
  807. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js +3 -7
  808. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js.map +1 -1
  809. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs +1 -1
  810. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs.map +1 -1
  811. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js +1 -6
  812. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js.map +1 -1
  813. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs +1 -1
  814. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs.map +1 -1
  815. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js +1 -6
  816. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js.map +1 -1
  817. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
  818. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
  819. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +20 -26
  820. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
  821. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  822. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  823. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +0 -9
  824. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  825. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs +1 -1
  826. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs.map +1 -1
  827. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js +1 -6
  828. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js.map +1 -1
  829. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs +1 -1
  830. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs.map +1 -1
  831. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js +1 -6
  832. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js.map +1 -1
  833. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs +1 -1
  834. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs.map +1 -1
  835. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js +1 -6
  836. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js.map +1 -1
  837. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs +1 -1
  838. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs.map +1 -1
  839. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js +1 -6
  840. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js.map +1 -1
  841. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs +1 -1
  842. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs.map +1 -1
  843. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js +1 -6
  844. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js.map +1 -1
  845. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs +1 -1
  846. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs.map +1 -1
  847. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js +1 -6
  848. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js.map +1 -1
  849. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs +1 -1
  850. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs.map +1 -1
  851. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js +1 -6
  852. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js.map +1 -1
  853. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs +1 -1
  854. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -1
  855. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js +13 -13
  856. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -1
  857. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs +1 -1
  858. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs.map +1 -1
  859. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js +1 -6
  860. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js.map +1 -1
  861. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs +1 -1
  862. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs.map +1 -1
  863. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js +1 -6
  864. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js.map +1 -1
  865. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs +1 -1
  866. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs.map +1 -1
  867. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js +14 -10
  868. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js.map +1 -1
  869. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs +1 -1
  870. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs.map +1 -1
  871. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js +13 -10
  872. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js.map +1 -1
  873. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs +1 -1
  874. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs.map +1 -1
  875. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js +1 -6
  876. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js.map +1 -1
  877. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  878. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  879. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -8
  880. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  881. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs +1 -1
  882. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs.map +1 -1
  883. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js +1 -6
  884. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js.map +1 -1
  885. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs +1 -1
  886. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs.map +1 -1
  887. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js +1 -6
  888. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js.map +1 -1
  889. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
  890. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
  891. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +20 -18
  892. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
  893. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs +1 -1
  894. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs.map +1 -1
  895. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js +66 -21
  896. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js.map +1 -1
  897. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs +1 -1
  898. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs.map +1 -1
  899. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js +17 -11
  900. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js.map +1 -1
  901. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs +1 -1
  902. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs.map +1 -1
  903. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js +12 -17
  904. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js.map +1 -1
  905. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs +1 -1
  906. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs.map +1 -1
  907. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js +1 -6
  908. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js.map +1 -1
  909. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  910. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  911. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +1 -1
  912. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  913. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs +1 -1
  914. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs.map +1 -1
  915. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js +14 -19
  916. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js.map +1 -1
  917. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
  918. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
  919. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +15 -20
  920. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
  921. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs +1 -1
  922. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs.map +1 -1
  923. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js +10 -8
  924. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js.map +1 -1
  925. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs +1 -1
  926. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs.map +1 -1
  927. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js +1 -6
  928. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js.map +1 -1
  929. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs +1 -1
  930. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs.map +1 -1
  931. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js +1 -6
  932. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js.map +1 -1
  933. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs +1 -1
  934. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs.map +1 -1
  935. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js +1 -6
  936. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js.map +1 -1
  937. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  938. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  939. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +67 -87
  940. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  941. package/dist/node_modules/@openhands/extensions/integrations/index.cjs +1 -1
  942. package/dist/node_modules/@openhands/extensions/integrations/index.cjs.map +1 -1
  943. package/dist/node_modules/@openhands/extensions/integrations/index.js +4 -4
  944. package/dist/node_modules/@openhands/extensions/integrations/index.js.map +1 -1
  945. package/dist/node_modules/@openhands/extensions/skills/index.cjs +236 -17
  946. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  947. package/dist/node_modules/@openhands/extensions/skills/index.js +24 -5
  948. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  949. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs +2 -0
  950. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs.map +1 -0
  951. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js +40 -0
  952. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js.map +1 -0
  953. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
  954. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
  955. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +4 -4
  956. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
  957. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
  958. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
  959. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +3 -0
  960. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
  961. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
  962. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
  963. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +3 -0
  964. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
  965. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +1 -0
  966. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +1 -0
  967. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +1 -0
  968. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +1 -0
  969. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs +1 -1
  970. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs.map +1 -1
  971. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js +84 -27
  972. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js.map +1 -1
  973. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs +1 -1
  974. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs.map +1 -1
  975. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js +9 -0
  976. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js.map +1 -1
  977. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +1 -0
  978. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +1 -0
  979. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs +2 -0
  980. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs.map +1 -0
  981. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js +42 -0
  982. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js.map +1 -0
  983. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +1 -0
  984. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +1 -0
  985. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs +1 -1
  986. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs.map +1 -1
  987. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js +1 -1
  988. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js.map +1 -1
  989. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +1 -0
  990. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +1 -0
  991. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +1 -0
  992. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +1 -0
  993. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -0
  994. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +20 -0
  995. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
  996. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +18 -0
  997. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.cjs +1 -1
  998. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.js +1 -0
  999. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  1000. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +2 -0
  1001. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  1002. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  1003. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +15 -17
  1004. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  1005. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  1006. package/dist/node_modules/@openhands/typescript-client/dist/index.js +3 -0
  1007. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.cjs +1 -0
  1008. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.js +1 -0
  1009. package/dist/package.cjs +1 -1
  1010. package/dist/package.cjs.map +1 -1
  1011. package/dist/package.js +7 -4
  1012. package/dist/package.js.map +1 -1
  1013. package/dist/routes/agent-settings.d.ts +106 -0
  1014. package/dist/routes/files-tab.cjs +1 -1
  1015. package/dist/routes/files-tab.js +23 -23
  1016. package/dist/routes/llm-settings.cjs +1 -1
  1017. package/dist/routes/llm-settings.cjs.map +1 -1
  1018. package/dist/routes/llm-settings.d.ts +6 -4
  1019. package/dist/routes/llm-settings.js +0 -1
  1020. package/dist/routes/llm-settings.js.map +1 -1
  1021. package/dist/routes/mcp.cjs.map +1 -1
  1022. package/dist/routes/mcp.js.map +1 -1
  1023. package/dist/services/settings.cjs +1 -1
  1024. package/dist/services/settings.cjs.map +1 -1
  1025. package/dist/services/settings.js +2 -6
  1026. package/dist/services/settings.js.map +1 -1
  1027. package/dist/stores/command-menu-store.cjs +2 -0
  1028. package/dist/stores/command-menu-store.cjs.map +1 -0
  1029. package/dist/stores/command-menu-store.d.ts +8 -0
  1030. package/dist/stores/command-menu-store.js +12 -0
  1031. package/dist/stores/command-menu-store.js.map +1 -0
  1032. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1033. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1034. package/dist/stores/conversation-panel-preferences-store.js +1 -1
  1035. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1036. package/dist/stores/conversation-store.cjs +1 -1
  1037. package/dist/stores/conversation-store.cjs.map +1 -1
  1038. package/dist/stores/conversation-store.d.ts +1 -0
  1039. package/dist/stores/conversation-store.js +1 -0
  1040. package/dist/stores/conversation-store.js.map +1 -1
  1041. package/dist/stores/goal-store.cjs +2 -0
  1042. package/dist/stores/goal-store.cjs.map +1 -0
  1043. package/dist/stores/goal-store.d.ts +28 -0
  1044. package/dist/stores/goal-store.js +14 -0
  1045. package/dist/stores/goal-store.js.map +1 -0
  1046. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +39 -3
  1047. package/dist/types/agent-server/type-guards.cjs +1 -1
  1048. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  1049. package/dist/types/agent-server/type-guards.d.ts +2 -1
  1050. package/dist/types/agent-server/type-guards.js +3 -3
  1051. package/dist/types/agent-server/type-guards.js.map +1 -1
  1052. package/dist/types/mcp-auth.cjs +2 -0
  1053. package/dist/types/mcp-auth.cjs.map +1 -0
  1054. package/dist/types/mcp-auth.d.ts +43 -0
  1055. package/dist/types/mcp-auth.js +13 -0
  1056. package/dist/types/mcp-auth.js.map +1 -0
  1057. package/dist/types/mcp-server.d.ts +22 -1
  1058. package/dist/types/settings.d.ts +6 -4
  1059. package/dist/ui/context-menu.d.ts +1 -1
  1060. package/dist/utils/acp-command.d.ts +64 -0
  1061. package/dist/utils/automation-debug-prompt.d.ts +18 -0
  1062. package/dist/utils/constants.cjs +1 -1
  1063. package/dist/utils/constants.cjs.map +1 -1
  1064. package/dist/utils/constants.d.ts +2 -0
  1065. package/dist/utils/constants.js +12 -3
  1066. package/dist/utils/constants.js.map +1 -1
  1067. package/dist/utils/dropdown-classes.cjs +1 -1
  1068. package/dist/utils/dropdown-classes.cjs.map +1 -1
  1069. package/dist/utils/dropdown-classes.js +4 -2
  1070. package/dist/utils/dropdown-classes.js.map +1 -1
  1071. package/dist/utils/form-control-classes.cjs +1 -1
  1072. package/dist/utils/form-control-classes.js +1 -1
  1073. package/dist/utils/handle-event-for-ui.cjs +1 -1
  1074. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  1075. package/dist/utils/handle-event-for-ui.js +72 -37
  1076. package/dist/utils/handle-event-for-ui.js.map +1 -1
  1077. package/dist/utils/mcp-config.cjs +1 -1
  1078. package/dist/utils/mcp-config.cjs.map +1 -1
  1079. package/dist/utils/mcp-config.d.ts +15 -9
  1080. package/dist/utils/mcp-config.js +124 -53
  1081. package/dist/utils/mcp-config.js.map +1 -1
  1082. package/dist/utils/mcp-installed-server-display.cjs +2 -0
  1083. package/dist/utils/mcp-installed-server-display.cjs.map +1 -0
  1084. package/dist/utils/mcp-installed-server-display.d.ts +8 -0
  1085. package/dist/utils/mcp-installed-server-display.js +12 -0
  1086. package/dist/utils/mcp-installed-server-display.js.map +1 -0
  1087. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1088. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1089. package/dist/utils/mcp-installed-servers.js +4 -4
  1090. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1091. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  1092. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  1093. package/dist/utils/mcp-marketplace-utils.d.ts +2 -0
  1094. package/dist/utils/mcp-marketplace-utils.js +31 -16
  1095. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  1096. package/dist/utils/mcp-server-name.cjs +2 -0
  1097. package/dist/utils/mcp-server-name.cjs.map +1 -0
  1098. package/dist/utils/mcp-server-name.d.ts +3 -0
  1099. package/dist/utils/mcp-server-name.js +12 -0
  1100. package/dist/utils/mcp-server-name.js.map +1 -0
  1101. package/dist/utils/plugin-display.cjs +2 -0
  1102. package/dist/utils/plugin-display.cjs.map +1 -0
  1103. package/dist/utils/plugin-display.d.ts +20 -0
  1104. package/dist/utils/plugin-display.js +29 -0
  1105. package/dist/utils/plugin-display.js.map +1 -0
  1106. package/dist/utils/settings-utils.cjs.map +1 -1
  1107. package/dist/utils/settings-utils.js.map +1 -1
  1108. package/dist/utils/workspaces-compatibility.cjs +1 -1
  1109. package/dist/utils/workspaces-compatibility.cjs.map +1 -1
  1110. package/dist/utils/workspaces-compatibility.js +1 -0
  1111. package/dist/utils/workspaces-compatibility.js.map +1 -1
  1112. package/package.json +7 -4
  1113. package/scripts/check-sdk-version-sync.mjs +6 -6
  1114. package/scripts/check-translation-completeness.cjs +6 -0
  1115. package/scripts/dev-safe.mjs +14 -3
  1116. package/scripts/dev-with-automation.mjs +4 -0
  1117. package/scripts/gen-acp-docker-env.mjs +107 -0
  1118. package/scripts/ingress.mjs +66 -226
  1119. package/scripts/proxy-utils.mjs +171 -0
  1120. package/scripts/static-server.mjs +127 -283
  1121. package/build/assets/Trans-CiZR6eVI.js +0 -1
  1122. package/build/assets/active-backend-context-CEuva6ZJ.js +0 -1
  1123. package/build/assets/add-backend-modal-b_eiVk3A.js +0 -1
  1124. package/build/assets/agent-server-conversation-service.api-D_uJ7BKc.js +0 -5
  1125. package/build/assets/agent-settings-DyfziYyM.js +0 -2
  1126. package/build/assets/alert-banner-BFayS5vM.js +0 -1
  1127. package/build/assets/analytics-consent-form-modal-CQ22qlFF.js +0 -1
  1128. package/build/assets/api-key-entry-screen-KnIwP0vN.js +0 -1
  1129. package/build/assets/app-settings-CBaHJ5vJ.js +0 -1
  1130. package/build/assets/automation-detail-DgQswnXg.js +0 -1
  1131. package/build/assets/automations-list-D99p6CoQ.js +0 -1
  1132. package/build/assets/back-nav-button-Cp9z-wsG.js +0 -1
  1133. package/build/assets/backend-form-modal-BABAz-zH.js +0 -1
  1134. package/build/assets/backend-synced-settings-badge-DzwWQC4T.js +0 -1
  1135. package/build/assets/base-modal-1bHiB5Wf.js +0 -1
  1136. package/build/assets/brand-button-FHWgEb4Q.js +0 -1
  1137. package/build/assets/browser-store-B9h0eW79.js +0 -1
  1138. package/build/assets/browser-tab-JiCXo0Nc.js +0 -1
  1139. package/build/assets/chat-send-button-QtyofqFt.js +0 -1
  1140. package/build/assets/check-6ieIiPhW.js +0 -1
  1141. package/build/assets/checkmark-BfgRVMHK.js +0 -1
  1142. package/build/assets/circle-plus-check-toggle-CmINKfZj.js +0 -1
  1143. package/build/assets/close-DhH0uMa7.js +0 -1
  1144. package/build/assets/code-tag-CnORXDJj.js +0 -1
  1145. package/build/assets/combobox-caret-BB15S7zY.js +0 -1
  1146. package/build/assets/condenser-settings-BOKNShD9.js +0 -1
  1147. package/build/assets/confirmation-modal-CofmThy4.js +0 -1
  1148. package/build/assets/context-menu-list-item-DO12IEaK.js +0 -1
  1149. package/build/assets/conversation-DIzv-jq8.js +0 -1
  1150. package/build/assets/conversation-DV3odvMe.js +0 -19
  1151. package/build/assets/conversation-local-storage-DK7yJr5N.js +0 -1
  1152. package/build/assets/conversation-panel-CgCarTAn.js +0 -1
  1153. package/build/assets/conversation-service.api-RV_bOKNz.js +0 -1
  1154. package/build/assets/conversation-state-store-4obo4ZMf.js +0 -1
  1155. package/build/assets/conversation-store-CXrL0v-X.js +0 -6
  1156. package/build/assets/conversation-tab-empty-state-CqT5ur_H.js +0 -1
  1157. package/build/assets/copy-C5tBqfWu.js +0 -1
  1158. package/build/assets/copy-to-clipboard-button-BVFYcsg_.js +0 -1
  1159. package/build/assets/createLucideIcon-D3nkdIAN.js +0 -1
  1160. package/build/assets/declaration-B0yY_dkQ.js +0 -1
  1161. package/build/assets/device-verify-DRupI_hz.js +0 -1
  1162. package/build/assets/dist-D5d5zm8o.js +0 -1
  1163. package/build/assets/dist-fV7trlfb.js +0 -1
  1164. package/build/assets/dropdown-classes-5IsMjYYw.js +0 -1
  1165. package/build/assets/edit-automation-modal-BG-gd82b.js +0 -1
  1166. package/build/assets/ellipsis-button-DWvVZO_r.js +0 -1
  1167. package/build/assets/entry.client-uhbVfCtd.js +0 -2
  1168. package/build/assets/enum-filter-dropdown-CB2fqz_e.js +0 -1
  1169. package/build/assets/environment-switch-overlay-Oeal5TVq.js +0 -1
  1170. package/build/assets/extensions-hub-DxiE0AZR.js +0 -1
  1171. package/build/assets/files-tab-1F2OlNeH.js +0 -1
  1172. package/build/assets/files-tab-store-C1q5Rbx3.js +0 -1
  1173. package/build/assets/folder-C5tr7xyN.js +0 -1
  1174. package/build/assets/get-language-from-path-E1JKsbeE.js +0 -1
  1175. package/build/assets/git-provider-icon-CKs-22Ts.js +0 -1
  1176. package/build/assets/home-B3E0le0g.js +0 -1
  1177. package/build/assets/iconBase-DMoh3FEg.js +0 -1
  1178. package/build/assets/index-redirect-DhuK5mhS.js +0 -1
  1179. package/build/assets/install-server-modal-DjintV14.js +0 -1
  1180. package/build/assets/is-backend-llm-ready-Bj44pekN.js +0 -1
  1181. package/build/assets/launch-DCU3S84p.js +0 -1
  1182. package/build/assets/lesson-plan-BUUPKVsa.js +0 -3
  1183. package/build/assets/link-external-CF4KHxx-.js +0 -1
  1184. package/build/assets/llm-client-BakM_czF.js +0 -1
  1185. package/build/assets/llm-not-configured-banner-BV-NIjfR.js +0 -27
  1186. package/build/assets/llm-settings-B5d7PHzz.js +0 -1
  1187. package/build/assets/llm-settings-C5whb-0p.js +0 -1
  1188. package/build/assets/loader-circle-DyX8DmLg.js +0 -1
  1189. package/build/assets/loading-spinner-BvOAco8a.js +0 -1
  1190. package/build/assets/manage-backends-modal-D9ClxVpM.js +0 -1
  1191. package/build/assets/manifest-38a873aa.js +0 -1
  1192. package/build/assets/mcp-7rk44GRS.js +0 -9
  1193. package/build/assets/mcp-client-DxHXYNOw.js +0 -1
  1194. package/build/assets/messages-DgBEaXil.js +0 -43
  1195. package/build/assets/modal-backdrop-DjAC2zOZ.js +0 -1
  1196. package/build/assets/modal-body-OJdIUJ68.js +0 -1
  1197. package/build/assets/modal-close-button-BNjGesHc.js +0 -1
  1198. package/build/assets/model-selector-w2uGPM5y.js +0 -1
  1199. package/build/assets/navigation-context-CUJ60pLI.js +0 -1
  1200. package/build/assets/navigation-link-BiPKTOHF.js +0 -1
  1201. package/build/assets/onboarding-Cit87z8g.js +0 -1
  1202. package/build/assets/onboarding-modal-JPrzvr8W.js +0 -1
  1203. package/build/assets/openhands-logo-uNs9g6LY.js +0 -1
  1204. package/build/assets/option-service.api-BLYUhnCF.js +0 -1
  1205. package/build/assets/organization-service.api-DpSSwlZu.js +0 -1
  1206. package/build/assets/path-utils-B4WAVqvK.js +0 -1
  1207. package/build/assets/plan-components-DSOTFW2D.js +0 -1
  1208. package/build/assets/planner-tab-LmoxgKKe.js +0 -1
  1209. package/build/assets/preload-helper-D_sPnjeL.js +0 -1
  1210. package/build/assets/profiles-client-B4SJ4ZAf.js +0 -1
  1211. package/build/assets/providers-BGUAB8kf.js +0 -1
  1212. package/build/assets/react-Dn-iWFF5.js +0 -1
  1213. package/build/assets/react-dom-BBXlXOZX.js +0 -1
  1214. package/build/assets/react-uQK8du1l.js +0 -1
  1215. package/build/assets/recommended-automations-launcher-Df9MXUpX.js +0 -50
  1216. package/build/assets/root-BShAdYGY.css +0 -1
  1217. package/build/assets/root-C99reK-P.js +0 -2
  1218. package/build/assets/root-layout-BtH64XeC.js +0 -2
  1219. package/build/assets/runtime-waiting-state-C7MjXDeW.js +0 -1
  1220. package/build/assets/schema-field-BCDuEMrl.js +0 -1
  1221. package/build/assets/sdk-section-page-XJN9mGju.js +0 -1
  1222. package/build/assets/sdk-settings-schema-B15AE1GH.js +0 -1
  1223. package/build/assets/search-rob4u9f8.js +0 -1
  1224. package/build/assets/secrets-service-CrPyCR8u.js +0 -1
  1225. package/build/assets/secrets-settings-UJn15N7E.js +0 -1
  1226. package/build/assets/settings-C5aUD_sQ.js +0 -1
  1227. package/build/assets/settings-dropdown-input-DQRt2_RA.js +0 -1
  1228. package/build/assets/settings-gear-B7bZDo_8.js +0 -1
  1229. package/build/assets/settings-index-zP_rYIW1.js +0 -1
  1230. package/build/assets/settings-input-n8FzVso3.js +0 -1
  1231. package/build/assets/settings-list-classes-DquY3fwm.js +0 -1
  1232. package/build/assets/settings-modal-szlQ6LpE.js +0 -1
  1233. package/build/assets/settings-section-header-context-DrXgyNC-.js +0 -1
  1234. package/build/assets/settings-service.api-B4G8NzCM.js +0 -1
  1235. package/build/assets/settings-switch-DsbEm3ie.js +0 -1
  1236. package/build/assets/shared-conversation-BrAvqeaI.js +0 -1
  1237. package/build/assets/sidebar-mobile-menu-toggle-BRZGCe-l.js +0 -1
  1238. package/build/assets/sidebar-nav-link-B_EygIce.js +0 -1
  1239. package/build/assets/skill-card-pill-row-Bq9Imkdh.js +0 -1
  1240. package/build/assets/skills-Wg6i0kbu.js +0 -1
  1241. package/build/assets/skills-client-DNd444Bm.js +0 -1
  1242. package/build/assets/skills-plugins-DaGkVI7-.js +0 -1
  1243. package/build/assets/skills-settings-Dlp0WFaT.js +0 -2
  1244. package/build/assets/styled-tooltip-ulgpZDga.js +0 -1
  1245. package/build/assets/suspense-BqBQEuKs.js +0 -1
  1246. package/build/assets/switch-skeleton-C49gVWOQ.js +0 -1
  1247. package/build/assets/task-list-tab-Bz-UlCm2.js +0 -1
  1248. package/build/assets/telemetry-DD3HKMgf.js +0 -2
  1249. package/build/assets/terminal-BwLvVzyJ.js +0 -1
  1250. package/build/assets/toggle-switch-CxW8-lBI.js +0 -1
  1251. package/build/assets/typography-BLf_mRKH.js +0 -1
  1252. package/build/assets/u-check-circle-CxTAJuY9.js +0 -1
  1253. package/build/assets/u-check-circle-half-Bj73jfUG.js +0 -1
  1254. package/build/assets/u-circuit-C-6V9H9C.js +0 -1
  1255. package/build/assets/u-edit-C7OnK2sa.js +0 -1
  1256. package/build/assets/use-acp-credential-form-oehc057O.js +0 -1
  1257. package/build/assets/use-active-conversation-CFXVX2on.js +0 -1
  1258. package/build/assets/use-agent-state-D6xfZA4-.js +0 -1
  1259. package/build/assets/use-backends-health-93yRIOWs.js +0 -1
  1260. package/build/assets/use-breakpoint-Xdy_aZHE.js +0 -1
  1261. package/build/assets/use-click-outside-element-CADb_gCP.js +0 -1
  1262. package/build/assets/use-cloud-current-user-id-CzOXsy04.js +0 -1
  1263. package/build/assets/use-config-oXjEWyb6.js +0 -1
  1264. package/build/assets/use-create-conversation-D-YkgrxS.js +0 -1
  1265. package/build/assets/use-create-secret-CX7Ij7W4.js +0 -1
  1266. package/build/assets/use-event-store-DMRAQQi8.js +0 -1
  1267. package/build/assets/use-handle-plan-click-CwW2Ijc2.js +0 -1
  1268. package/build/assets/use-is-authed-CNbX1KMm.js +0 -1
  1269. package/build/assets/use-launch-skill-in-chat-xI9byRUw.js +0 -1
  1270. package/build/assets/use-llm-profiles-BXRZ2rBh.js +0 -1
  1271. package/build/assets/use-runtime-is-ready-Dwzs9_vp.js +0 -1
  1272. package/build/assets/use-settings-_usWr_qn.js +0 -1
  1273. package/build/assets/use-settings-nav-items-DoB5iH-7.js +0 -16
  1274. package/build/assets/use-skills-BtorhoCN.js +0 -1
  1275. package/build/assets/use-task-list-u46BhYBC.js +0 -1
  1276. package/build/assets/use-tracking-Ca7p71hH.js +0 -1
  1277. package/build/assets/use-user-conversation-U-16WF6G.js +0 -1
  1278. package/build/assets/useMutation-CseCrRRO.js +0 -1
  1279. package/build/assets/useQuery-bowvACed.js +0 -1
  1280. package/build/assets/useTranslation-KhTtKmnv.js +0 -1
  1281. package/build/assets/utils-cRyMoFbz.js +0 -1
  1282. package/build/assets/vendor~conversation-panel~conversation~alert-banner-CjfR7T3x.js +0 -1
  1283. package/build/assets/vendor~entry.client-_zl82x5T.js +0 -1
  1284. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dj9x5fm9-CgCGB-3J.js +0 -177
  1285. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfvr34cq-BJdsUTJG.js +0 -1
  1286. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~m3df9r20-BynFAJ_S.js +0 -1
  1287. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nk00xiud-MfCRtPrK.js +0 -9
  1288. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ghtfhmuy-BHDILMe2.js +0 -1
  1289. package/build/assets/vendor~root-layout~conversation-panel~conversation-BFZmbXpq.js +0 -1
  1290. package/build/assets/vendor~root-layout~conversation-panel~conversation~index-BPY-kNjK.js +0 -1
  1291. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-BhWqQNmF.js +0 -1
  1292. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~cfyi58ut-CnnEa0dP.js +0 -1
  1293. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~clac83qc-DMX6XUwI.js +0 -2
  1294. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-Cqp6k3RG.js +0 -1
  1295. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-DS4GWhCz.js +0 -9
  1296. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~ji28rqgb-DVffa9Ks.js +0 -48
  1297. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-BzR6ypP3.js +0 -1
  1298. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-BcvHZmEZ.js +0 -2
  1299. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-Cuvp6wqR.js +0 -14
  1300. package/build/assets/verification-settings-DKZnUHD6.js +0 -1
  1301. package/build/assets/x-DpnGZyVW.js +0 -1
  1302. package/build/assets/x-mark-x3tvCZzc.js +0 -1
  1303. package/dist/components/features/analytics/analytics-consent-form-modal.d.ts +0 -5
  1304. package/dist/components/features/chat/switch-profile-button.cjs +0 -2
  1305. package/dist/components/features/chat/switch-profile-button.cjs.map +0 -1
  1306. package/dist/components/features/chat/switch-profile-button.d.ts +0 -1
  1307. package/dist/components/features/chat/switch-profile-button.js +0 -48
  1308. package/dist/components/features/chat/switch-profile-button.js.map +0 -1
  1309. package/dist/components/features/chat/switch-profile-context-menu.cjs +0 -2
  1310. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +0 -1
  1311. package/dist/components/features/chat/switch-profile-context-menu.d.ts +0 -9
  1312. package/dist/components/features/chat/switch-profile-context-menu.js +0 -106
  1313. package/dist/components/features/chat/switch-profile-context-menu.js.map +0 -1
  1314. package/dist/components/features/onboarding/is-backend-llm-ready.d.ts +0 -30
  1315. package/dist/icons/u-circuit.cjs +0 -2
  1316. package/dist/icons/u-circuit.cjs.map +0 -1
  1317. package/dist/icons/u-circuit.js +0 -19
  1318. package/dist/icons/u-circuit.js.map +0 -1
  1319. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs +0 -2
  1320. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs.map +0 -1
  1321. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js +0 -35
  1322. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js.map +0 -1
  1323. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs +0 -2
  1324. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs.map +0 -1
  1325. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js +0 -35
  1326. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js.map +0 -1
  1327. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs +0 -2
  1328. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs.map +0 -1
  1329. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js +0 -35
  1330. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js.map +0 -1
  1331. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +0 -2
  1332. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +0 -1
  1333. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +0 -35
  1334. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +0 -1
  1335. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs +0 -2
  1336. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs.map +0 -1
  1337. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js +0 -35
  1338. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js.map +0 -1
  1339. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs +0 -2
  1340. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs.map +0 -1
  1341. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js +0 -35
  1342. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js.map +0 -1
  1343. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs +0 -2
  1344. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs.map +0 -1
  1345. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js +0 -28
  1346. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js.map +0 -1
  1347. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs +0 -2
  1348. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs.map +0 -1
  1349. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js +0 -35
  1350. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js.map +0 -1
  1351. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs +0 -2
  1352. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs.map +0 -1
  1353. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js +0 -35
  1354. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js.map +0 -1
  1355. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs +0 -2
  1356. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs.map +0 -1
  1357. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js +0 -35
  1358. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js.map +0 -1
  1359. /package/build/assets/{agent-server-ui-style-scope-CIDFDeQb.js → agent-server-ui-style-scope-COnDHTm5.js} +0 -0
  1360. /package/build/assets/{automation-DNgDxqtq.js → automation-BU8zu-FP.js} +0 -0
  1361. /package/build/assets/{common-KeiA2Rod.js → common-Dh7OqABE.js} +0 -0
  1362. /package/build/assets/{environment-switch-store-BpKxp6Xq.js → environment-switch-store-DkjlKWzN.js} +0 -0
  1363. /package/build/assets/{extension-module-card-classes-DvvyImGv.js → extension-module-card-classes-9V3J9J_b.js} +0 -0
  1364. /package/build/assets/{git-status-mapper-B3_HbzUT.js → git-status-mapper-BI8FyUVp.js} +0 -0
  1365. /package/build/assets/{handle-capture-consent-BChvj6mt.js → handle-capture-consent-CPMXU29K.js} +0 -0
  1366. /package/build/assets/{llm-subscription-C1xDoa3K.js → llm-subscription-DtsX5Lhg.js} +0 -0
  1367. /package/build/assets/{map-provider-MonJL5SS.js → map-provider-BM2SJarp.js} +0 -0
  1368. /package/build/assets/{objectWithoutPropertiesLoose-BRYudkUn.js → objectWithoutPropertiesLoose-BgYIAs2y.js} +0 -0
  1369. /package/build/assets/{rolldown-runtime-wFmyQBCi.js → rolldown-runtime-BFRubm34.js} +0 -0
  1370. /package/build/assets/{settings-like-page-layout-classes-DNg2vKSM.js → settings-like-page-layout-classes-DENKlZpD.js} +0 -0
  1371. /package/build/assets/{v4-BMWDcIWQ.js → v4-DbCkTSoU.js} +0 -0
  1372. /package/build/assets/{vendor~browser-yZEspfT9.js → vendor~browser-Dqd33JyP.js} +0 -0
  1373. /package/build/assets/{vendor~terminal-CcUoOdAH.js → vendor~terminal-aeP3PnKf.js} +0 -0
@@ -0,0 +1,6 @@
1
+ export { AgentProfilesLocalView } from "./agent-profiles-local-view";
2
+ export { AgentProfilesManager } from "./agent-profiles-manager";
3
+ export { AgentProfilesBody } from "./agent-profiles-body";
4
+ export { AgentProfileRow } from "./agent-profile-row";
5
+ export { AgentProfileActionsMenu } from "./agent-profile-actions-menu";
6
+ export { DeleteAgentProfileModal } from "./delete-agent-profile-modal";
@@ -0,0 +1,18 @@
1
+ import type { AgentProfile, AgentProfileSaveInput } from "#/api/agent-profiles-service/agent-profiles-service.api";
2
+ /**
3
+ * Merge the minimal editor's fields over the stored profile so an edit-save
4
+ * doesn't wipe the fields the editor doesn't model (condenser, verification,
5
+ * system_message_suffix, mcp_server_refs, the disabled_skills deny-list, ACP
6
+ * session mode/timeout, …) — `POST /api/agent-profiles/{name}` is a
7
+ * whole-profile overwrite, and unset fields fall back to server-side defaults.
8
+ *
9
+ * Kind-aware: when the editor switched `agent_kind`, the stored variant's
10
+ * fields must NOT be carried over — the server's `extra="forbid"` profile
11
+ * union rejects a payload mixing openhands and acp fields — so a kind switch
12
+ * stays a clean variant replacement built from the edited fields alone.
13
+ *
14
+ * Identity (`id` / `name` / `revision`) is stripped from the merge: the path
15
+ * name is authoritative on save, and the server preserves the namesake's id
16
+ * and bumps the revision itself (`save_profile_preserving_identity`).
17
+ */
18
+ export declare function mergeAgentProfileSaveInput(stored: AgentProfile | null, edited: AgentProfileSaveInput): AgentProfileSaveInput;
@@ -1 +1 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`),require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../brand-button.cjs`),require(`./rename-profile-modal.cjs`),require(`./delete-profile-modal.cjs`),require(`./profiles-body.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`react`),require(`react/jsx-runtime`);
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`),require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../brand-button.cjs`),require(`./rename-profile-modal.cjs`),require(`./delete-profile-modal.cjs`),require(`./profiles-body.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`../../../../hooks/use-can-manage-org-profiles.cjs`),require(`react`),require(`react/jsx-runtime`);
@@ -7,5 +7,6 @@ import "./delete-profile-modal.js";
7
7
  import "./profiles-body.js";
8
8
  import "../../../../hooks/mutation/use-activate-llm-profile.js";
9
9
  import "../../../../hooks/mutation/use-save-llm-profile.js";
10
+ import "../../../../hooks/use-can-manage-org-profiles.js";
10
11
  import "react";
11
12
  import "react/jsx-runtime";
@@ -1 +1 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../hooks/query/use-settings.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../../../../ui/typography.cjs`),require(`../brand-button.cjs`),require(`../../../../hooks/query/use-agent-settings-schema.cjs`),require(`./profile-name-input.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`./llm-profiles-manager.cjs`),require(`../../../shared/buttons/back-nav-button.cjs`),require(`../../../../contexts/settings-section-header-context.cjs`),require(`../../../../routes/llm-settings.cjs`);let t=require(`react`);t=e.__toESM(t,1),require(`react/jsx-runtime`);
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-settings.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../../../../ui/typography.cjs`),require(`../brand-button.cjs`),require(`../../../../hooks/query/use-agent-settings-schema.cjs`),require(`./profile-name-input.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`./llm-profiles-manager.cjs`),require(`../../../shared/buttons/back-nav-button.cjs`),require(`../../../../contexts/settings-section-header-context.cjs`),require(`../../../../routes/llm-settings.cjs`);let t=require(`react`);t=e.__toESM(t,1),require(`react/jsx-runtime`);
@@ -1,6 +1,6 @@
1
1
  import "../../../../utils/custom-toast-handlers.js";
2
- import "../../../../hooks/query/use-settings.js";
3
2
  import "../../../../api/profiles-service/profiles-service.api.js";
3
+ import "../../../../hooks/query/use-settings.js";
4
4
  import "../../../../hooks/query/use-llm-profiles.js";
5
5
  import "../../../../ui/typography.js";
6
6
  import "../brand-button.js";
@@ -2,6 +2,8 @@ import { ProfileInfo } from "#/api/profiles-service/profiles-service.api";
2
2
  interface ProfileRowProps {
3
3
  profile: ProfileInfo;
4
4
  isActive: boolean;
5
+ /** When false, the row is read-only and the actions menu is hidden. */
6
+ canManage: boolean;
5
7
  onActivate: (name: string) => void;
6
8
  onEdit: (profile: ProfileInfo) => void;
7
9
  onRename: (profile: ProfileInfo) => void;
@@ -9,5 +11,5 @@ interface ProfileRowProps {
9
11
  onDelete: (profile: ProfileInfo) => void;
10
12
  isActivating: boolean;
11
13
  }
12
- export declare function ProfileRow({ profile, isActive, onActivate, onEdit, onRename, onDuplicate, onDelete, isActivating, }: ProfileRowProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function ProfileRow({ profile, isActive, canManage, onActivate, onEdit, onRename, onDuplicate, onDelete, isActivating, }: ProfileRowProps): import("react/jsx-runtime").JSX.Element;
13
15
  export {};
@@ -4,6 +4,8 @@ interface ProfilesBodyProps {
4
4
  loadError: Error | null;
5
5
  profiles: ProfileInfo[];
6
6
  active: string | null;
7
+ /** When false, rows render read-only (no actions menu) — cloud members. */
8
+ canManage: boolean;
7
9
  onActivate: (name: string) => void;
8
10
  onEdit: (profile: ProfileInfo) => void;
9
11
  onRename: (profile: ProfileInfo) => void;
@@ -11,5 +13,5 @@ interface ProfilesBodyProps {
11
13
  onDelete: (profile: ProfileInfo) => void;
12
14
  isActivating: boolean;
13
15
  }
14
- export declare function ProfilesBody({ isLoading, loadError, profiles, active, onActivate, onEdit, onRename, onDuplicate, onDelete, isActivating, }: ProfilesBodyProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function ProfilesBody({ isLoading, loadError, profiles, active, canManage, onActivate, onEdit, onRename, onDuplicate, onDelete, isActivating, }: ProfilesBodyProps): import("react/jsx-runtime").JSX.Element;
15
17
  export {};
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs`),i=require(`../../../../utils/custom-toast-handlers.cjs`),a=require(`../../../shared/buttons/copy-to-clipboard-button.cjs`),o=require(`../../../../ui/typography.cjs`),s=require(`../brand-button.cjs`),c=require(`../../../../hooks/mutation/use-llm-subscription-auth.cjs`),l=require(`../../../../hooks/query/use-llm-subscription-status.cjs`);let u=require(`react`);u=e.__toESM(u,1);let d=require(`react/jsx-runtime`);var f=5,p=1;function m(e){let t=e.verificationUriComplete??e.verificationUri;window.open(t,`_blank`,`noopener,noreferrer`)}function h({isDisabled:e=!1}){let{t:h}=t.useTranslation(`openhands`),g=l.useOpenAISubscriptionStatus(),_=c.useStartOpenAISubscriptionLogin(),v=c.usePollOpenAISubscriptionLogin(),y=c.useLogoutOpenAISubscription(),[b,x]=u.default.useState(null),[S,C]=u.default.useState(!1),[w,T]=u.default.useState(!1),E=u.default.useRef(null),D=u.default.useCallback(()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)},[]),O=()=>{b&&(navigator.clipboard.writeText(b.userCode),C(!0),setTimeout(()=>C(!1),2e3))},k=_.isPending||v.isPending||y.isPending,A=!!g.data?.connected,j=u.default.useCallback(async e=>{try{return(await v.mutateAsync(e)).connected?(x(null),T(!1),i.displaySuccessToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST)),!0):(T(!0),!1)}catch{return i.displayErrorToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR)),!0}},[v,h]);return u.default.useEffect(()=>{if(!b||A||e)return;let t=!1,n=Math.max(b.intervalSeconds??f,p),r=()=>{D(),E.current=window.setTimeout(async()=>{if(t)return;let e=await j(b.deviceCode);!t&&!e&&r()},n*1e3)};return r(),()=>{t=!0,D()}},[b,D,A,e,j]),(0,d.jsxs)(`section`,{"data-testid":`openai-subscription-auth-card`,className:`flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4`,children:[(0,d.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,d.jsx)(o.Typography.H3,{children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}),(0,d.jsx)(o.Typography.Paragraph,{className:`text-tertiary-alt text-sm leading-5`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)})]}),(0,d.jsx)(`div`,{className:`flex flex-col gap-1 text-sm`,"data-testid":`subscription-status`,children:g.isLoading?(0,d.jsx)(`span`,{className:`text-tertiary-light`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}):g.isError?(0,d.jsx)(`span`,{className:`text-danger`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}):A?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`span`,{className:`text-success`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}),g.data?.accountEmail?(0,d.jsx)(`span`,{className:`text-tertiary-light`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT,{account:g.data.accountEmail})}):null]}):(0,d.jsx)(`span`,{className:`text-warning`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)})}),b?(0,d.jsxs)(`div`,{"data-testid":`subscription-device-challenge`,className:`flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm`,children:[(0,d.jsx)(`span`,{children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}),(0,d.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base text-[var(--oh-foreground)]`,children:[(0,d.jsx)(`span`,{className:`flex-1 select-all`,children:b.userCode}),(0,d.jsx)(a.CopyToClipboardButton,{isHidden:!1,isDisabled:!1,onClick:O,mode:S?`copied`:`copy`})]}),(0,d.jsxs)(`a`,{href:b.verificationUriComplete??b.verificationUri,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline`,children:[h(n.I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN),(0,d.jsx)(r.ExternalLink,{size:14,"aria-hidden":!0})]}),w?(0,d.jsx)(`span`,{className:`text-warning`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}):null]}):null,(0,d.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[A?(0,d.jsx)(s.BrandButton,{testId:`subscription-disconnect`,type:`button`,variant:`tertiary`,isDisabled:e||k,onClick:async()=>{try{await y.mutateAsync(),D(),x(null),T(!1),i.displaySuccessToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST))}catch{i.displayErrorToast(h(n.I18nKey.ERROR$GENERIC))}},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}):(0,d.jsx)(s.BrandButton,{testId:`subscription-connect`,type:`button`,variant:`primary`,isDisabled:e||k,onClick:async()=>{try{let e=await _.mutateAsync();x(e),T(!0),m(e)}catch{i.displayErrorToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR))}},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}),b?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.BrandButton,{testId:`subscription-poll`,type:`button`,variant:`secondary`,isDisabled:e||k,onClick:async()=>{b&&(D(),j(b.deviceCode))},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}),(0,d.jsx)(s.BrandButton,{testId:`subscription-cancel`,type:`button`,variant:`tertiary`,isDisabled:e||k,onClick:()=>{D(),x(null),T(!1)},children:h(n.I18nKey.BUTTON$CANCEL)})]}):null]})]})}exports.OpenAISubscriptionAuthCard=h;
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs`),i=require(`../../../../utils/custom-toast-handlers.cjs`),a=require(`../../../shared/buttons/copy-to-clipboard-button.cjs`),o=require(`../../../../ui/typography.cjs`),s=require(`../brand-button.cjs`),c=require(`../../../../hooks/mutation/use-llm-subscription-auth.cjs`),l=require(`../../../../hooks/query/use-llm-subscription-status.cjs`);let u=require(`react`);u=e.__toESM(u,1);let d=require(`react/jsx-runtime`);var f=5,p=1;function m(e){let t=e.verificationUriComplete??e.verificationUri;window.open(t,`_blank`,`noopener,noreferrer`)}function h({isDisabled:e=!1}){let{t:h}=t.useTranslation(`openhands`),g=l.useOpenAISubscriptionStatus(),_=c.useStartOpenAISubscriptionLogin(),v=c.usePollOpenAISubscriptionLogin(),y=c.useLogoutOpenAISubscription(),[b,x]=u.default.useState(null),[S,C]=u.default.useState(!1),[w,T]=u.default.useState(!1),E=u.default.useRef(null),D=u.default.useCallback(()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)},[]),O=()=>{b&&(navigator.clipboard.writeText(b.userCode),C(!0),setTimeout(()=>C(!1),2e3))},k=_.isPending||v.isPending||y.isPending,A=!!g.data?.connected,j=u.default.useCallback(async e=>{try{return(await v.mutateAsync(e)).connected?(x(null),T(!1),i.displaySuccessToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST)),!0):(T(!0),!1)}catch{return i.displayErrorToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR)),!0}},[v,h]);return u.default.useEffect(()=>{if(!b||A||e)return;let t=!1,n=Math.max(b.intervalSeconds??f,p),r=()=>{D(),E.current=window.setTimeout(async()=>{if(t)return;let e=await j(b.deviceCode);!t&&!e&&r()},n*1e3)};return r(),()=>{t=!0,D()}},[b,D,A,e,j]),(0,d.jsxs)(`section`,{"data-testid":`openai-subscription-auth-card`,className:`flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4`,children:[(0,d.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,d.jsx)(o.Typography.H3,{children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}),(0,d.jsx)(o.Typography.Paragraph,{className:`text-tertiary-alt text-sm leading-5`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)})]}),(0,d.jsx)(`div`,{className:`flex flex-col gap-1 text-sm`,"data-testid":`subscription-status`,children:g.isLoading?(0,d.jsx)(`span`,{className:`text-tertiary-light`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}):g.isError?(0,d.jsx)(`span`,{className:`text-danger`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}):A?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`span`,{className:`text-success`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}),g.data?.accountEmail?(0,d.jsx)(`span`,{className:`text-tertiary-light`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT,{account:g.data.accountEmail})}):null]}):(0,d.jsx)(`span`,{className:`text-warning`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)})}),b?(0,d.jsxs)(`div`,{"data-testid":`subscription-device-challenge`,className:`flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm`,children:[(0,d.jsx)(`span`,{children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}),(0,d.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white`,children:[(0,d.jsx)(`span`,{"data-testid":`subscription-user-code`,className:`flex-1 select-all tracking-[0.08em]`,children:b.userCode}),(0,d.jsx)(a.CopyToClipboardButton,{isHidden:!1,isDisabled:!1,onClick:O,mode:S?`copied`:`copy`})]}),(0,d.jsxs)(`a`,{href:b.verificationUriComplete??b.verificationUri,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline`,children:[h(n.I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN),(0,d.jsx)(r.ExternalLink,{size:14,"aria-hidden":!0})]}),w?(0,d.jsx)(`span`,{className:`text-warning`,children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}):null]}):null,(0,d.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[A?(0,d.jsx)(s.BrandButton,{testId:`subscription-disconnect`,type:`button`,variant:`tertiary`,isDisabled:e||k,onClick:async()=>{try{await y.mutateAsync(),D(),x(null),T(!1),i.displaySuccessToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST))}catch{i.displayErrorToast(h(n.I18nKey.ERROR$GENERIC))}},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}):(0,d.jsx)(s.BrandButton,{testId:`subscription-connect`,type:`button`,variant:`primary`,isDisabled:e||k,onClick:async()=>{try{let e=await _.mutateAsync();x(e),T(!0),m(e)}catch{i.displayErrorToast(h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR))}},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}),b?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.BrandButton,{testId:`subscription-poll`,type:`button`,variant:`secondary`,isDisabled:e||k,onClick:async()=>{b&&(D(),j(b.deviceCode))},children:h(n.I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}),(0,d.jsx)(s.BrandButton,{testId:`subscription-cancel`,type:`button`,variant:`tertiary`,isDisabled:e||k,onClick:()=>{D(),x(null),T(!1)},children:h(n.I18nKey.BUTTON$CANCEL)})]}):null]})]})}exports.OpenAISubscriptionAuthCard=h;
2
2
  //# sourceMappingURL=openai-subscription-auth-card.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-subscription-auth-card.cjs","names":[],"sources":["../../../../../src/components/features/settings/llm-settings/openai-subscription-auth-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ExternalLink } from \"lucide-react\";\nimport type { LLMSubscriptionDeviceChallenge } from \"#/api/llm-subscription-service\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport {\n useLogoutOpenAISubscription,\n usePollOpenAISubscriptionLogin,\n useStartOpenAISubscriptionLogin,\n} from \"#/hooks/mutation/use-llm-subscription-auth\";\nimport { useOpenAISubscriptionStatus } from \"#/hooks/query/use-llm-subscription-status\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Typography } from \"#/ui/typography\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nconst DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\nconst MIN_DEVICE_POLL_INTERVAL_SECONDS = 1;\n\ninterface OpenAISubscriptionAuthCardProps {\n isDisabled?: boolean;\n}\n\nfunction openVerificationUrl(challenge: LLMSubscriptionDeviceChallenge) {\n const url = challenge.verificationUriComplete ?? challenge.verificationUri;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function OpenAISubscriptionAuthCard({\n isDisabled = false,\n}: OpenAISubscriptionAuthCardProps) {\n const { t } = useTranslation(\"openhands\");\n const status = useOpenAISubscriptionStatus();\n const startLogin = useStartOpenAISubscriptionLogin();\n const pollLogin = usePollOpenAISubscriptionLogin();\n const logout = useLogoutOpenAISubscription();\n const [challenge, setChallenge] =\n React.useState<LLMSubscriptionDeviceChallenge | null>(null);\n const [copied, setCopied] = React.useState(false);\n const [isPendingLogin, setIsPendingLogin] = React.useState(false);\n const pollTimeoutRef = React.useRef<number | null>(null);\n\n const clearPollTimeout = React.useCallback(() => {\n if (pollTimeoutRef.current !== null) {\n window.clearTimeout(pollTimeoutRef.current);\n pollTimeoutRef.current = null;\n }\n }, []);\n\n const handleCopyCode = () => {\n if (!challenge) return;\n navigator.clipboard.writeText(challenge.userCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const isBusy =\n startLogin.isPending || pollLogin.isPending || logout.isPending;\n const connected = Boolean(status.data?.connected);\n\n const pollDeviceLogin = React.useCallback(\n async (deviceCode: string) => {\n try {\n const nextStatus = await pollLogin.mutateAsync(deviceCode);\n if (nextStatus.connected) {\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST));\n return true;\n }\n setIsPendingLogin(true);\n return false;\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n return true;\n }\n },\n [pollLogin, t],\n );\n\n React.useEffect(() => {\n if (!challenge || connected || isDisabled) {\n return undefined;\n }\n\n let cancelled = false;\n const intervalSeconds = Math.max(\n challenge.intervalSeconds ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\n MIN_DEVICE_POLL_INTERVAL_SECONDS,\n );\n\n const schedulePoll = () => {\n clearPollTimeout();\n pollTimeoutRef.current = window.setTimeout(async () => {\n if (cancelled) {\n return;\n }\n\n const shouldStop = await pollDeviceLogin(challenge.deviceCode);\n if (!cancelled && !shouldStop) {\n schedulePoll();\n }\n }, intervalSeconds * 1000);\n };\n\n schedulePoll();\n\n return () => {\n cancelled = true;\n clearPollTimeout();\n };\n }, [challenge, clearPollTimeout, connected, isDisabled, pollDeviceLogin]);\n\n const handleStartLogin = async () => {\n try {\n const nextChallenge = await startLogin.mutateAsync();\n setChallenge(nextChallenge);\n setIsPendingLogin(true);\n openVerificationUrl(nextChallenge);\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n }\n };\n\n const handlePollLogin = async () => {\n if (!challenge) return;\n clearPollTimeout();\n void pollDeviceLogin(challenge.deviceCode);\n };\n\n const handleLogout = async () => {\n try {\n await logout.mutateAsync();\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST));\n } catch {\n displayErrorToast(t(I18nKey.ERROR$GENERIC));\n }\n };\n\n const handleCancelLogin = () => {\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n };\n\n return (\n <section\n data-testid=\"openai-subscription-auth-card\"\n className=\"flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4\"\n >\n <div className=\"flex flex-col gap-2\">\n <Typography.H3>\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}\n </Typography.H3>\n <Typography.Paragraph className=\"text-tertiary-alt text-sm leading-5\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)}\n </Typography.Paragraph>\n </div>\n\n <div\n className=\"flex flex-col gap-1 text-sm\"\n data-testid=\"subscription-status\"\n >\n {status.isLoading ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}\n </span>\n ) : status.isError ? (\n <span className=\"text-danger\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}\n </span>\n ) : connected ? (\n <>\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}\n </span>\n {status.data?.accountEmail ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT, {\n account: status.data.accountEmail,\n })}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)}\n </span>\n )}\n </div>\n\n {challenge ? (\n <div\n data-testid=\"subscription-device-challenge\"\n className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm\"\n >\n <span>{t(I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}</span>\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base text-[var(--oh-foreground)]\">\n <span className=\"flex-1 select-all\">{challenge.userCode}</span>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopyCode}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n <a\n href={\n challenge.verificationUriComplete ?? challenge.verificationUri\n }\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN)}\n <ExternalLink size={14} aria-hidden />\n </a>\n {isPendingLogin ? (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {connected ? (\n <BrandButton\n testId=\"subscription-disconnect\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleLogout}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}\n </BrandButton>\n ) : (\n <BrandButton\n testId=\"subscription-connect\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleStartLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}\n </BrandButton>\n )}\n\n {challenge ? (\n <>\n <BrandButton\n testId=\"subscription-poll\"\n type=\"button\"\n variant=\"secondary\"\n isDisabled={isDisabled || isBusy}\n onClick={handlePollLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}\n </BrandButton>\n <BrandButton\n testId=\"subscription-cancel\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleCancelLogin}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n </>\n ) : null}\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openai-subscription-auth-card.cjs","names":[],"sources":["../../../../../src/components/features/settings/llm-settings/openai-subscription-auth-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ExternalLink } from \"lucide-react\";\nimport type { LLMSubscriptionDeviceChallenge } from \"#/api/llm-subscription-service\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport {\n useLogoutOpenAISubscription,\n usePollOpenAISubscriptionLogin,\n useStartOpenAISubscriptionLogin,\n} from \"#/hooks/mutation/use-llm-subscription-auth\";\nimport { useOpenAISubscriptionStatus } from \"#/hooks/query/use-llm-subscription-status\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Typography } from \"#/ui/typography\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nconst DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\nconst MIN_DEVICE_POLL_INTERVAL_SECONDS = 1;\n\ninterface OpenAISubscriptionAuthCardProps {\n isDisabled?: boolean;\n}\n\nfunction openVerificationUrl(challenge: LLMSubscriptionDeviceChallenge) {\n const url = challenge.verificationUriComplete ?? challenge.verificationUri;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function OpenAISubscriptionAuthCard({\n isDisabled = false,\n}: OpenAISubscriptionAuthCardProps) {\n const { t } = useTranslation(\"openhands\");\n const status = useOpenAISubscriptionStatus();\n const startLogin = useStartOpenAISubscriptionLogin();\n const pollLogin = usePollOpenAISubscriptionLogin();\n const logout = useLogoutOpenAISubscription();\n const [challenge, setChallenge] =\n React.useState<LLMSubscriptionDeviceChallenge | null>(null);\n const [copied, setCopied] = React.useState(false);\n const [isPendingLogin, setIsPendingLogin] = React.useState(false);\n const pollTimeoutRef = React.useRef<number | null>(null);\n\n const clearPollTimeout = React.useCallback(() => {\n if (pollTimeoutRef.current !== null) {\n window.clearTimeout(pollTimeoutRef.current);\n pollTimeoutRef.current = null;\n }\n }, []);\n\n const handleCopyCode = () => {\n if (!challenge) return;\n navigator.clipboard.writeText(challenge.userCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const isBusy =\n startLogin.isPending || pollLogin.isPending || logout.isPending;\n const connected = Boolean(status.data?.connected);\n\n const pollDeviceLogin = React.useCallback(\n async (deviceCode: string) => {\n try {\n const nextStatus = await pollLogin.mutateAsync(deviceCode);\n if (nextStatus.connected) {\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST));\n return true;\n }\n setIsPendingLogin(true);\n return false;\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n return true;\n }\n },\n [pollLogin, t],\n );\n\n React.useEffect(() => {\n if (!challenge || connected || isDisabled) {\n return undefined;\n }\n\n let cancelled = false;\n const intervalSeconds = Math.max(\n challenge.intervalSeconds ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\n MIN_DEVICE_POLL_INTERVAL_SECONDS,\n );\n\n const schedulePoll = () => {\n clearPollTimeout();\n pollTimeoutRef.current = window.setTimeout(async () => {\n if (cancelled) {\n return;\n }\n\n const shouldStop = await pollDeviceLogin(challenge.deviceCode);\n if (!cancelled && !shouldStop) {\n schedulePoll();\n }\n }, intervalSeconds * 1000);\n };\n\n schedulePoll();\n\n return () => {\n cancelled = true;\n clearPollTimeout();\n };\n }, [challenge, clearPollTimeout, connected, isDisabled, pollDeviceLogin]);\n\n const handleStartLogin = async () => {\n try {\n const nextChallenge = await startLogin.mutateAsync();\n setChallenge(nextChallenge);\n setIsPendingLogin(true);\n openVerificationUrl(nextChallenge);\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n }\n };\n\n const handlePollLogin = async () => {\n if (!challenge) return;\n clearPollTimeout();\n void pollDeviceLogin(challenge.deviceCode);\n };\n\n const handleLogout = async () => {\n try {\n await logout.mutateAsync();\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST));\n } catch {\n displayErrorToast(t(I18nKey.ERROR$GENERIC));\n }\n };\n\n const handleCancelLogin = () => {\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n };\n\n return (\n <section\n data-testid=\"openai-subscription-auth-card\"\n className=\"flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4\"\n >\n <div className=\"flex flex-col gap-2\">\n <Typography.H3>\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}\n </Typography.H3>\n <Typography.Paragraph className=\"text-tertiary-alt text-sm leading-5\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)}\n </Typography.Paragraph>\n </div>\n\n <div\n className=\"flex flex-col gap-1 text-sm\"\n data-testid=\"subscription-status\"\n >\n {status.isLoading ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}\n </span>\n ) : status.isError ? (\n <span className=\"text-danger\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}\n </span>\n ) : connected ? (\n <>\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}\n </span>\n {status.data?.accountEmail ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT, {\n account: status.data.accountEmail,\n })}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)}\n </span>\n )}\n </div>\n\n {challenge ? (\n <div\n data-testid=\"subscription-device-challenge\"\n className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm\"\n >\n <span>{t(I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}</span>\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white\">\n <span\n data-testid=\"subscription-user-code\"\n className=\"flex-1 select-all tracking-[0.08em]\"\n >\n {challenge.userCode}\n </span>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopyCode}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n <a\n href={\n challenge.verificationUriComplete ?? challenge.verificationUri\n }\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN)}\n <ExternalLink size={14} aria-hidden />\n </a>\n {isPendingLogin ? (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {connected ? (\n <BrandButton\n testId=\"subscription-disconnect\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleLogout}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}\n </BrandButton>\n ) : (\n <BrandButton\n testId=\"subscription-connect\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleStartLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}\n </BrandButton>\n )}\n\n {challenge ? (\n <>\n <BrandButton\n testId=\"subscription-poll\"\n type=\"button\"\n variant=\"secondary\"\n isDisabled={isDisabled || isBusy}\n onClick={handlePollLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}\n </BrandButton>\n <BrandButton\n testId=\"subscription-cancel\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleCancelLogin}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n </>\n ) : null}\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
@@ -82,9 +82,10 @@ function y({ isDisabled: y = !1 }) {
82
82
  children: [
83
83
  /* @__PURE__ */ m("span", { children: b(t.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS) }),
84
84
  /* @__PURE__ */ h("div", {
85
- className: "flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base text-[var(--oh-foreground)]",
85
+ className: "flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white",
86
86
  children: [/* @__PURE__ */ m("span", {
87
- className: "flex-1 select-all",
87
+ "data-testid": "subscription-user-code",
88
+ className: "flex-1 select-all tracking-[0.08em]",
88
89
  children: T.userCode
89
90
  }), /* @__PURE__ */ m(a, {
90
91
  isHidden: !1,
@@ -1 +1 @@
1
- {"version":3,"file":"openai-subscription-auth-card.js","names":[],"sources":["../../../../../src/components/features/settings/llm-settings/openai-subscription-auth-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ExternalLink } from \"lucide-react\";\nimport type { LLMSubscriptionDeviceChallenge } from \"#/api/llm-subscription-service\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport {\n useLogoutOpenAISubscription,\n usePollOpenAISubscriptionLogin,\n useStartOpenAISubscriptionLogin,\n} from \"#/hooks/mutation/use-llm-subscription-auth\";\nimport { useOpenAISubscriptionStatus } from \"#/hooks/query/use-llm-subscription-status\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Typography } from \"#/ui/typography\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nconst DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\nconst MIN_DEVICE_POLL_INTERVAL_SECONDS = 1;\n\ninterface OpenAISubscriptionAuthCardProps {\n isDisabled?: boolean;\n}\n\nfunction openVerificationUrl(challenge: LLMSubscriptionDeviceChallenge) {\n const url = challenge.verificationUriComplete ?? challenge.verificationUri;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function OpenAISubscriptionAuthCard({\n isDisabled = false,\n}: OpenAISubscriptionAuthCardProps) {\n const { t } = useTranslation(\"openhands\");\n const status = useOpenAISubscriptionStatus();\n const startLogin = useStartOpenAISubscriptionLogin();\n const pollLogin = usePollOpenAISubscriptionLogin();\n const logout = useLogoutOpenAISubscription();\n const [challenge, setChallenge] =\n React.useState<LLMSubscriptionDeviceChallenge | null>(null);\n const [copied, setCopied] = React.useState(false);\n const [isPendingLogin, setIsPendingLogin] = React.useState(false);\n const pollTimeoutRef = React.useRef<number | null>(null);\n\n const clearPollTimeout = React.useCallback(() => {\n if (pollTimeoutRef.current !== null) {\n window.clearTimeout(pollTimeoutRef.current);\n pollTimeoutRef.current = null;\n }\n }, []);\n\n const handleCopyCode = () => {\n if (!challenge) return;\n navigator.clipboard.writeText(challenge.userCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const isBusy =\n startLogin.isPending || pollLogin.isPending || logout.isPending;\n const connected = Boolean(status.data?.connected);\n\n const pollDeviceLogin = React.useCallback(\n async (deviceCode: string) => {\n try {\n const nextStatus = await pollLogin.mutateAsync(deviceCode);\n if (nextStatus.connected) {\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST));\n return true;\n }\n setIsPendingLogin(true);\n return false;\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n return true;\n }\n },\n [pollLogin, t],\n );\n\n React.useEffect(() => {\n if (!challenge || connected || isDisabled) {\n return undefined;\n }\n\n let cancelled = false;\n const intervalSeconds = Math.max(\n challenge.intervalSeconds ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\n MIN_DEVICE_POLL_INTERVAL_SECONDS,\n );\n\n const schedulePoll = () => {\n clearPollTimeout();\n pollTimeoutRef.current = window.setTimeout(async () => {\n if (cancelled) {\n return;\n }\n\n const shouldStop = await pollDeviceLogin(challenge.deviceCode);\n if (!cancelled && !shouldStop) {\n schedulePoll();\n }\n }, intervalSeconds * 1000);\n };\n\n schedulePoll();\n\n return () => {\n cancelled = true;\n clearPollTimeout();\n };\n }, [challenge, clearPollTimeout, connected, isDisabled, pollDeviceLogin]);\n\n const handleStartLogin = async () => {\n try {\n const nextChallenge = await startLogin.mutateAsync();\n setChallenge(nextChallenge);\n setIsPendingLogin(true);\n openVerificationUrl(nextChallenge);\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n }\n };\n\n const handlePollLogin = async () => {\n if (!challenge) return;\n clearPollTimeout();\n void pollDeviceLogin(challenge.deviceCode);\n };\n\n const handleLogout = async () => {\n try {\n await logout.mutateAsync();\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST));\n } catch {\n displayErrorToast(t(I18nKey.ERROR$GENERIC));\n }\n };\n\n const handleCancelLogin = () => {\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n };\n\n return (\n <section\n data-testid=\"openai-subscription-auth-card\"\n className=\"flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4\"\n >\n <div className=\"flex flex-col gap-2\">\n <Typography.H3>\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}\n </Typography.H3>\n <Typography.Paragraph className=\"text-tertiary-alt text-sm leading-5\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)}\n </Typography.Paragraph>\n </div>\n\n <div\n className=\"flex flex-col gap-1 text-sm\"\n data-testid=\"subscription-status\"\n >\n {status.isLoading ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}\n </span>\n ) : status.isError ? (\n <span className=\"text-danger\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}\n </span>\n ) : connected ? (\n <>\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}\n </span>\n {status.data?.accountEmail ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT, {\n account: status.data.accountEmail,\n })}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)}\n </span>\n )}\n </div>\n\n {challenge ? (\n <div\n data-testid=\"subscription-device-challenge\"\n className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm\"\n >\n <span>{t(I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}</span>\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base text-[var(--oh-foreground)]\">\n <span className=\"flex-1 select-all\">{challenge.userCode}</span>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopyCode}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n <a\n href={\n challenge.verificationUriComplete ?? challenge.verificationUri\n }\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN)}\n <ExternalLink size={14} aria-hidden />\n </a>\n {isPendingLogin ? (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {connected ? (\n <BrandButton\n testId=\"subscription-disconnect\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleLogout}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}\n </BrandButton>\n ) : (\n <BrandButton\n testId=\"subscription-connect\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleStartLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}\n </BrandButton>\n )}\n\n {challenge ? (\n <>\n <BrandButton\n testId=\"subscription-poll\"\n type=\"button\"\n variant=\"secondary\"\n isDisabled={isDisabled || isBusy}\n onClick={handlePollLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}\n </BrandButton>\n <BrandButton\n testId=\"subscription-cancel\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleCancelLogin}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n </>\n ) : null}\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openai-subscription-auth-card.js","names":[],"sources":["../../../../../src/components/features/settings/llm-settings/openai-subscription-auth-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ExternalLink } from \"lucide-react\";\nimport type { LLMSubscriptionDeviceChallenge } from \"#/api/llm-subscription-service\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport {\n useLogoutOpenAISubscription,\n usePollOpenAISubscriptionLogin,\n useStartOpenAISubscriptionLogin,\n} from \"#/hooks/mutation/use-llm-subscription-auth\";\nimport { useOpenAISubscriptionStatus } from \"#/hooks/query/use-llm-subscription-status\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Typography } from \"#/ui/typography\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nconst DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;\nconst MIN_DEVICE_POLL_INTERVAL_SECONDS = 1;\n\ninterface OpenAISubscriptionAuthCardProps {\n isDisabled?: boolean;\n}\n\nfunction openVerificationUrl(challenge: LLMSubscriptionDeviceChallenge) {\n const url = challenge.verificationUriComplete ?? challenge.verificationUri;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function OpenAISubscriptionAuthCard({\n isDisabled = false,\n}: OpenAISubscriptionAuthCardProps) {\n const { t } = useTranslation(\"openhands\");\n const status = useOpenAISubscriptionStatus();\n const startLogin = useStartOpenAISubscriptionLogin();\n const pollLogin = usePollOpenAISubscriptionLogin();\n const logout = useLogoutOpenAISubscription();\n const [challenge, setChallenge] =\n React.useState<LLMSubscriptionDeviceChallenge | null>(null);\n const [copied, setCopied] = React.useState(false);\n const [isPendingLogin, setIsPendingLogin] = React.useState(false);\n const pollTimeoutRef = React.useRef<number | null>(null);\n\n const clearPollTimeout = React.useCallback(() => {\n if (pollTimeoutRef.current !== null) {\n window.clearTimeout(pollTimeoutRef.current);\n pollTimeoutRef.current = null;\n }\n }, []);\n\n const handleCopyCode = () => {\n if (!challenge) return;\n navigator.clipboard.writeText(challenge.userCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const isBusy =\n startLogin.isPending || pollLogin.isPending || logout.isPending;\n const connected = Boolean(status.data?.connected);\n\n const pollDeviceLogin = React.useCallback(\n async (deviceCode: string) => {\n try {\n const nextStatus = await pollLogin.mutateAsync(deviceCode);\n if (nextStatus.connected) {\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST));\n return true;\n }\n setIsPendingLogin(true);\n return false;\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n return true;\n }\n },\n [pollLogin, t],\n );\n\n React.useEffect(() => {\n if (!challenge || connected || isDisabled) {\n return undefined;\n }\n\n let cancelled = false;\n const intervalSeconds = Math.max(\n challenge.intervalSeconds ?? DEFAULT_DEVICE_POLL_INTERVAL_SECONDS,\n MIN_DEVICE_POLL_INTERVAL_SECONDS,\n );\n\n const schedulePoll = () => {\n clearPollTimeout();\n pollTimeoutRef.current = window.setTimeout(async () => {\n if (cancelled) {\n return;\n }\n\n const shouldStop = await pollDeviceLogin(challenge.deviceCode);\n if (!cancelled && !shouldStop) {\n schedulePoll();\n }\n }, intervalSeconds * 1000);\n };\n\n schedulePoll();\n\n return () => {\n cancelled = true;\n clearPollTimeout();\n };\n }, [challenge, clearPollTimeout, connected, isDisabled, pollDeviceLogin]);\n\n const handleStartLogin = async () => {\n try {\n const nextChallenge = await startLogin.mutateAsync();\n setChallenge(nextChallenge);\n setIsPendingLogin(true);\n openVerificationUrl(nextChallenge);\n } catch {\n displayErrorToast(t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT_ERROR));\n }\n };\n\n const handlePollLogin = async () => {\n if (!challenge) return;\n clearPollTimeout();\n void pollDeviceLogin(challenge.deviceCode);\n };\n\n const handleLogout = async () => {\n try {\n await logout.mutateAsync();\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n displaySuccessToast(t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST));\n } catch {\n displayErrorToast(t(I18nKey.ERROR$GENERIC));\n }\n };\n\n const handleCancelLogin = () => {\n clearPollTimeout();\n setChallenge(null);\n setIsPendingLogin(false);\n };\n\n return (\n <section\n data-testid=\"openai-subscription-auth-card\"\n className=\"flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4\"\n >\n <div className=\"flex flex-col gap-2\">\n <Typography.H3>\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_TITLE)}\n </Typography.H3>\n <Typography.Paragraph className=\"text-tertiary-alt text-sm leading-5\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)}\n </Typography.Paragraph>\n </div>\n\n <div\n className=\"flex flex-col gap-1 text-sm\"\n data-testid=\"subscription-status\"\n >\n {status.isLoading ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}\n </span>\n ) : status.isError ? (\n <span className=\"text-danger\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}\n </span>\n ) : connected ? (\n <>\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}\n </span>\n {status.data?.accountEmail ? (\n <span className=\"text-tertiary-light\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_ACCOUNT, {\n account: status.data.accountEmail,\n })}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)}\n </span>\n )}\n </div>\n\n {challenge ? (\n <div\n data-testid=\"subscription-device-challenge\"\n className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm\"\n >\n <span>{t(I18nKey.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}</span>\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white\">\n <span\n data-testid=\"subscription-user-code\"\n className=\"flex-1 select-all tracking-[0.08em]\"\n >\n {challenge.userCode}\n </span>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopyCode}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n <a\n href={\n challenge.verificationUriComplete ?? challenge.verificationUri\n }\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_OPEN_LOGIN)}\n <ExternalLink size={14} aria-hidden />\n </a>\n {isPendingLogin ? (\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"flex flex-wrap gap-2\">\n {connected ? (\n <BrandButton\n testId=\"subscription-disconnect\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleLogout}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_DISCONNECT)}\n </BrandButton>\n ) : (\n <BrandButton\n testId=\"subscription-connect\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleStartLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_CONNECT)}\n </BrandButton>\n )}\n\n {challenge ? (\n <>\n <BrandButton\n testId=\"subscription-poll\"\n type=\"button\"\n variant=\"secondary\"\n isDisabled={isDisabled || isBusy}\n onClick={handlePollLogin}\n >\n {t(I18nKey.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}\n </BrandButton>\n <BrandButton\n testId=\"subscription-cancel\"\n type=\"button\"\n variant=\"tertiary\"\n isDisabled={isDisabled || isBusy}\n onClick={handleCancelLogin}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n </>\n ) : null}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAmBA,IAAM,IAAuC,GACvC,IAAmC;AAMzC,SAAS,EAAoB,GAA2C;CACtE,IAAM,IAAM,EAAU,2BAA2B,EAAU;AAC3D,QAAO,KAAK,GAAK,UAAU,sBAAsB;;AAGnD,SAAgB,EAA2B,EACzC,gBAAa,MACqB;CAClC,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,IAAS,GAA6B,EACtC,IAAa,GAAiC,EAC9C,IAAY,GAAgC,EAC5C,IAAS,GAA6B,EACtC,CAAC,GAAW,KAChB,EAAM,SAAgD,KAAK,EACvD,CAAC,GAAQ,KAAa,EAAM,SAAS,GAAM,EAC3C,CAAC,GAAgB,KAAqB,EAAM,SAAS,GAAM,EAC3D,IAAiB,EAAM,OAAsB,KAAK,EAElD,IAAmB,EAAM,kBAAkB;AAC/C,EAAI,EAAe,YAAY,SAC7B,OAAO,aAAa,EAAe,QAAQ,EAC3C,EAAe,UAAU;IAE1B,EAAE,CAAC,EAEA,UAAuB;AACtB,QACL,UAAU,UAAU,UAAU,EAAU,SAAS,EACjD,EAAU,GAAK,EACf,iBAAiB,EAAU,GAAM,EAAE,IAAK;IAGpC,IACJ,EAAW,aAAa,EAAU,aAAa,EAAO,WAClD,IAAY,EAAQ,EAAO,MAAM,WAEjC,IAAkB,EAAM,YAC5B,OAAO,MAAuB;AAC5B,MAAI;AASF,WAPI,MADqB,EAAU,YAAY,EAAW,EAC3C,aACb,EAAa,KAAK,EAClB,EAAkB,GAAM,EACxB,EAAoB,EAAE,EAAQ,sCAAsC,CAAC,EAC9D,OAET,EAAkB,GAAK,EAChB;UACD;AAEN,UADA,EAAkB,EAAE,EAAQ,oCAAoC,CAAC,EAC1D;;IAGX,CAAC,GAAW,EAAE,CACf;AAsED,QApEA,EAAM,gBAAgB;AACpB,MAAI,CAAC,KAAa,KAAa,EAC7B;EAGF,IAAI,IAAY,IACV,IAAkB,KAAK,IAC3B,EAAU,mBAAmB,GAC7B,EACD,EAEK,UAAqB;AAEzB,GADA,GAAkB,EAClB,EAAe,UAAU,OAAO,WAAW,YAAY;AACrD,QAAI,EACF;IAGF,IAAM,IAAa,MAAM,EAAgB,EAAU,WAAW;AAC9D,IAAI,CAAC,KAAa,CAAC,KACjB,GAAc;MAEf,IAAkB,IAAK;;AAK5B,SAFA,GAAc,QAED;AAEX,GADA,IAAY,IACZ,GAAkB;;IAEnB;EAAC;EAAW;EAAkB;EAAW;EAAY;EAAgB,CAAC,EAsCvE,kBAAC,WAAD;EACE,eAAY;EACZ,WAAU;YAFZ;GAIE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,EAAW,IAAZ,EAAA,UACG,EAAE,EAAQ,iCAAiC,EAC9B,CAAA,EAChB,kBAAC,EAAW,WAAZ;KAAsB,WAAU;eAC7B,EAAE,EAAQ,uCAAuC;KAC7B,CAAA,CACnB;;GAEN,kBAAC,OAAD;IACE,WAAU;IACV,eAAY;cAEX,EAAO,YACN,kBAAC,QAAD;KAAM,WAAU;eACb,EAAE,EAAQ,sCAAsC;KAC5C,CAAA,GACL,EAAO,UACT,kBAAC,QAAD;KAAM,WAAU;eACb,EAAE,EAAQ,yCAAyC;KAC/C,CAAA,GACL,IACF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;KAAM,WAAU;eACb,EAAE,EAAQ,uCAAuC;KAC7C,CAAA,EACN,EAAO,MAAM,eACZ,kBAAC,QAAD;KAAM,WAAU;eACb,EAAE,EAAQ,+BAA+B,EACxC,SAAS,EAAO,KAAK,cACtB,CAAC;KACG,CAAA,GACL,KACH,EAAA,CAAA,GAEH,kBAAC,QAAD;KAAM,WAAU;eACb,EAAE,EAAQ,0CAA0C;KAChD,CAAA;IAEL,CAAA;GAEL,IACC,kBAAC,OAAD;IACE,eAAY;IACZ,WAAU;cAFZ;KAIE,kBAAC,QAAD,EAAA,UAAO,EAAE,EAAQ,0CAA0C,EAAQ,CAAA;KACnE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OACE,eAAY;OACZ,WAAU;iBAET,EAAU;OACN,CAAA,EACP,kBAAC,GAAD;OACE,UAAU;OACV,YAAY;OACZ,SAAS;OACT,MAAM,IAAS,WAAW;OAC1B,CAAA,CACE;;KACN,kBAAC,KAAD;MACE,MACE,EAAU,2BAA2B,EAAU;MAEjD,QAAO;MACP,KAAI;MACJ,WAAU;gBANZ,CAQG,EAAE,EAAQ,iCAAiC,EAC5C,kBAAC,GAAD;OAAc,MAAM;OAAI,eAAA;OAAc,CAAA,CACpC;;KACH,IACC,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAE,EAAQ,oCAAoC;MAC1C,CAAA,GACL;KACA;QACJ;GAEJ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,IACC,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAQ;KACR,YAAY,KAAc;KAC1B,SAAS,YA9Gc;AAC/B,UAAI;AAKF,OAJA,MAAM,EAAO,aAAa,EAC1B,GAAkB,EAClB,EAAa,KAAK,EAClB,EAAkB,GAAM,EACxB,EAAoB,EAAE,EAAQ,yCAAyC,CAAC;cAClE;AACN,SAAkB,EAAE,EAAQ,cAAc,CAAC;;;eAwGpC,EAAE,EAAQ,iCAAiC;KAChC,CAAA,GAEd,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAQ;KACR,YAAY,KAAc;KAC1B,SAAS,YAzIkB;AACnC,UAAI;OACF,IAAM,IAAgB,MAAM,EAAW,aAAa;AAGpD,OAFA,EAAa,EAAc,EAC3B,EAAkB,GAAK,EACvB,EAAoB,EAAc;cAC5B;AACN,SAAkB,EAAE,EAAQ,oCAAoC,CAAC;;;eAoI1D,EAAE,EAAQ,8BAA8B;KAC7B,CAAA,EAGf,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAQ;KACR,YAAY,KAAc;KAC1B,SAAS,YA3Ie;AAC7B,YACL,GAAkB,EACb,EAAgB,EAAU,WAAW;;eA0I/B,EAAE,EAAQ,qCAAqC;KACpC,CAAA,EACd,kBAAC,GAAD;KACE,QAAO;KACP,MAAK;KACL,SAAQ;KACR,YAAY,KAAc;KAC1B,eAlIoB;AAG9B,MAFA,GAAkB,EAClB,EAAa,KAAK,EAClB,EAAkB,GAAM;;eAiIb,EAAE,EAAQ,cAAc;KACb,CAAA,CACb,EAAA,CAAA,GACD,KACA;;GACE"}
@@ -1,10 +1,10 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../node_modules/lucide-react/dist/esm/icons/trash-2.cjs`),i=require(`../../../../utils/utils.cjs`),a=require(`../../../../utils/form-control-classes.cjs`),o=require(`../brand-button.cjs`),s=require(`../optional-tag.cjs`),c=require(`../settings-input.cjs`),l=require(`../settings-dropdown-input.cjs`);let u=require(`react`);u=e.__toESM(u,1);let d=require(`react/jsx-runtime`);function f({mode:e,server:f,existingServers:p,onSubmit:m,onCancel:h,onDelete:g,isActionDisabled:_=!1,onTest:v,isTestPending:y=!1,testMessage:b=null}){let{t:x}=t.useTranslation(`openhands`),[S,C]=u.default.useState(f?.type||`sse`),[w,T]=u.default.useState(null),E=u.default.useRef(null),D=[{key:`sse`,label:x(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE)},{key:`stdio`,label:x(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO)},{key:`shttp`,label:x(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP)}],O=e=>{if(!e)return x(n.I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);try{let t=new URL(e);if(![`http:`,`https:`].includes(t.protocol))return x(n.I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL)}catch{return x(n.I18nKey.SETTINGS$MCP_ERROR_URL_INVALID)}return null},k=e=>e?/^[a-zA-Z0-9_-]+$/.test(e)?null:x(n.I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID):x(n.I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED),A=t=>!p||!(e===`add`||e===`edit`&&f?.name!==t)?null:p.filter(e=>e.type===`stdio`).map(e=>e.name).filter(Boolean).includes(t)?x(n.I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE):null,j=e=>e?e.includes(` `)?x(n.I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES):null:x(n.I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED),M=t=>{if(!p)return null;let r=f?.url;return(e===`add`||e===`edit`&&r!==t)&&p.some(e=>(e.type===`sse`||e.type===`shttp`)&&e.url===t)?x(n.I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE):null},N=e=>{if(!e.trim())return null;let t=e.split(`
2
- `);for(let e=0;e<t.length;e+=1){let r=t[e].trim();if(r){let e=r.indexOf(`=`);if(e===-1||!r.substring(0,e).trim())return x(n.I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT)}}return null},P=e=>{if(!e.trim())return null;let t=parseInt(e.trim(),10);return Number.isNaN(t)?x(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER):t<=0?x(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE):t>3600?x(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED):null},F=e=>{let t=e.get(`name`)?.toString().trim()||``,n=e.get(`command`)?.toString().trim()||``,r=e.get(`env`)?.toString()||``;return k(t)||A(t)||j(n)||N(r)||null},I=e=>{if(S===`sse`||S===`shttp`){let t=e.get(`url`)?.toString().trim()||``,r=O(t);if(r)return r;let i=M(t);if(i)return i;let a=e.get(`name`)?.toString().trim()||``;if(a&&!/^[a-zA-Z0-9_-]+$/.test(a))return x(n.I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);if(S===`shttp`){let t=P(e.get(`timeout`)?.toString()||``);if(t)return t}return null}return S===`stdio`?F(e):null},L=e=>{let t={},n=e.trim();if(!n)return t;for(let e of n.split(`
3
- `)){let n=e.trim(),r=n.indexOf(`=`),i=r>=0?n.substring(0,r).trim():``;n&&r!==-1&&i&&(t[i]=n.substring(r+1).trim())}return t},R=e=>e?Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
4
- `):``,z=e=>{let t={id:f?.id||`${S}-${Date.now()}`,type:S};if(S===`sse`||S===`shttp`){let n=e.get(`name`)?.toString().trim(),r=e.get(`url`)?.toString().trim(),i=e.get(`api_key`)?.toString().trim(),a=e.get(`timeout`)?.toString().trim(),o={...t,...n&&{name:n},url:r,...i&&{api_key:i}};if(S===`shttp`&&a){let e=parseInt(a,10);Number.isNaN(e)||(o.timeout=e)}return o}let n=e.get(`name`)?.toString().trim(),r=e.get(`command`)?.toString().trim(),i=e.get(`args`)?.toString().trim(),a=e.get(`env`)?.toString().trim(),o=i?i.split(`
5
- `).map(e=>e.trim()).filter(Boolean):[],s=L(a||``);return{...t,name:n,command:r,...o.length>0&&{args:o},...Object.keys(s).length>0&&{env:s}}};return(0,d.jsxs)(`form`,{ref:E,"data-testid":e===`add`?`add-mcp-server-form`:`edit-mcp-server-form`,onSubmit:e=>{e.preventDefault(),T(null);let t=new FormData(e.currentTarget),n=I(t);if(n){T(n);return}m(z(t))},className:`flex flex-col items-start gap-6`,children:[e===`add`&&(0,d.jsx)(l.SettingsDropdownInput,{testId:`server-type-dropdown`,name:`server-type`,label:x(n.I18nKey.SETTINGS$MCP_SERVER_TYPE),items:D,selectedKey:S,onSelectionChange:e=>C(e),onInputChange:()=>{},isClearable:!1,allowsCustomValue:!1,required:!0,wrapperClassName:`w-full min-w-0`}),w&&(0,d.jsx)(`p`,{className:`text-red-500 text-sm`,children:w}),(S===`sse`||S===`shttp`)&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(c.SettingsInput,{testId:`server-name-input`,name:`name`,type:`text`,label:x(n.I18nKey.SETTINGS$MCP_SERVER_NAME),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:f?.name||``,placeholder:`my-search-server`}),(0,d.jsx)(c.SettingsInput,{testId:`url-input`,name:`url`,type:`url`,label:x(n.I18nKey.SETTINGS$MCP_URL),className:`w-full min-w-0`,required:!0,defaultValue:f?.url||``,placeholder:`https://api.example.com`}),(0,d.jsx)(c.SettingsInput,{testId:`api-key-input`,name:`api_key`,type:`password`,label:x(n.I18nKey.SETTINGS$MCP_API_KEY),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:f?.api_key||``,placeholder:x(n.I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}),S===`shttp`&&(0,d.jsx)(c.SettingsInput,{testId:`timeout-input`,name:`timeout`,type:`number`,label:x(n.I18nKey.SETTINGS$MCP_TIMEOUT_LABEL),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:f?.timeout?.toString()||``,placeholder:`60`,min:1,max:3600})]}),S===`stdio`&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(c.SettingsInput,{testId:`name-input`,name:`name`,type:`text`,label:x(n.I18nKey.SETTINGS$MCP_NAME),className:`w-full min-w-0`,required:!0,defaultValue:f?.name||``,placeholder:`my-mcp-server`,pattern:`^[a-zA-Z0-9_-]+$`}),(0,d.jsx)(c.SettingsInput,{testId:`command-input`,name:`command`,type:`text`,label:x(n.I18nKey.SETTINGS$MCP_COMMAND),className:`w-full min-w-0`,required:!0,defaultValue:f?.command||``,placeholder:`npx`}),(0,d.jsxs)(`label`,{className:`flex flex-col gap-2.5 w-full min-w-0`,children:[(0,d.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,d.jsx)(`span`,{className:`text-sm`,children:x(n.I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}),(0,d.jsx)(s.OptionalTag,{})]}),(0,d.jsx)(`textarea`,{"data-testid":`args-input`,name:`args`,rows:3,defaultValue:f?.args?.join(`
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../node_modules/lucide-react/dist/esm/icons/trash-2.cjs`),i=require(`../../../../utils/utils.cjs`),a=require(`../../../../utils/mcp-server-name.cjs`),o=require(`../../../../utils/form-control-classes.cjs`),s=require(`../brand-button.cjs`),c=require(`../optional-tag.cjs`),l=require(`../settings-input.cjs`),u=require(`../settings-dropdown-input.cjs`);let d=require(`react`);d=e.__toESM(d,1);let f=require(`react/jsx-runtime`);function p({mode:e,server:p,existingServers:m,onSubmit:h,onCancel:g,onDelete:_,isActionDisabled:v=!1,onTest:y,isTestPending:b=!1,testMessage:x=null}){let{t:S}=t.useTranslation(`openhands`),[C,w]=d.default.useState(p?.type||`sse`),[T,E]=d.default.useState(()=>p?.auth?.strategy===`oauth2`?`oauth2`:p?.auth?.strategy===`header`?`header`:p?.auth?.strategy===`bearer`||p?.auth?.strategy===`api_key`?`bearer`:`none`),[D,O]=d.default.useState(()=>p?.auth?.strategy===`oauth2`?p.auth.authentication?.client_auth_method??`auto`:`auto`),[k,A]=d.default.useState(null),j=d.default.useRef(null),M=[{key:`sse`,label:S(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE)},{key:`stdio`,label:S(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO)},{key:`shttp`,label:S(n.I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP)}],N=[{key:`none`,label:S(n.I18nKey.SETTINGS$MCP_AUTH_MODE_NONE)},{key:`bearer`,label:S(n.I18nKey.SETTINGS$MCP_AUTH_MODE_BEARER)},{key:`header`,label:S(n.I18nKey.SETTINGS$MCP_AUTH_MODE_HEADER)},{key:`oauth2`,label:S(n.I18nKey.SETTINGS$MCP_AUTH_MODE_OAUTH)}],P=[{key:`auto`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_AUTO)},{key:`none`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_NONE)},{key:`client_secret_post`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_SECRET_POST)},{key:`client_secret_basic`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_SECRET_BASIC)},{key:`private_key_jwt`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_PRIVATE_KEY_JWT)}],F=e=>{if(!e)return S(n.I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);try{let t=new URL(e);if(![`http:`,`https:`].includes(t.protocol))return S(n.I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL)}catch{return S(n.I18nKey.SETTINGS$MCP_ERROR_URL_INVALID)}return null},I=e=>e?a.isValidMcpServerName(e)?null:S(n.I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID):S(n.I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED),L=t=>!m||!(e===`add`||e===`edit`&&p?.name!==t)?null:m.filter(e=>e.type===`stdio`).map(e=>e.name).filter(Boolean).includes(t)?S(n.I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE):null,R=e=>e?e.includes(` `)?S(n.I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES):null:S(n.I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED),z=t=>{if(!m)return null;let r=p?.url;return(e===`add`||e===`edit`&&r!==t)&&m.some(e=>(e.type===`sse`||e.type===`shttp`)&&e.url===t)?S(n.I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE):null},B=e=>{if(!e.trim())return null;let t=e.split(`
2
+ `);for(let e=0;e<t.length;e+=1){let r=t[e].trim();if(r){let e=r.indexOf(`=`);if(e===-1||!r.substring(0,e).trim())return S(n.I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT)}}return null},V=e=>{if(T===`header`){let t=e.get(`headers`)?.toString()||``;return t.trim()?B(t):S(n.I18nKey.SETTINGS$MCP_ERROR_HEADER_REQUIRED)}if(T===`oauth2`){let t=e.get(`oauth_client_id`)?.toString().trim();if(e.get(`oauth_client_secret`)?.toString().trim()&&!t)return S(n.I18nKey.SETTINGS$MCP_ERROR_OAUTH_SECRET_REQUIRES_ID)}return null},H=e=>{if(!e.trim())return null;let t=parseInt(e.trim(),10);return Number.isNaN(t)?S(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER):t<=0?S(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE):t>3600?S(n.I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED):null},U=e=>{let t=e.get(`name`)?.toString().trim()||``,n=e.get(`command`)?.toString().trim()||``,r=e.get(`env`)?.toString()||``;return I(t)||L(t)||R(n)||B(r)||null},W=e=>{if(C===`sse`||C===`shttp`){let t=e.get(`url`)?.toString().trim()||``,r=F(t);if(r)return r;let i=z(t);if(i)return i;let o=e.get(`name`)?.toString().trim()||``;if(o&&!a.isValidMcpServerName(o))return S(n.I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);if(C===`shttp`){let t=H(e.get(`timeout`)?.toString()||``);if(t)return t}return V(e)}return C===`stdio`?U(e):null},G=e=>{let t={},n=e.trim();if(!n)return t;for(let e of n.split(`
3
+ `)){let n=e.trim(),r=n.indexOf(`=`),i=r>=0?n.substring(0,r).trim():``;n&&r!==-1&&i&&(t[i]=n.substring(r+1).trim())}return t},K=e=>e?Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
4
+ `):``,q=e=>e?.strategy===`bearer`||e?.strategy===`api_key`?e.value??``:``,J=e=>e?.strategy===`header`?K(e.headers):``,Y=p?.auth?.strategy===`oauth2`?p.auth.authentication:void 0,X=p?.auth?.strategy===`oauth2`?p.auth.state:void 0,Z=e=>{if(T===`none`)return;if(T===`bearer`){let t=e.get(`api_key`)?.toString().trim();return t?p?.auth?.strategy===`api_key`?{...p.auth,value:t}:{strategy:`bearer`,value:t}:void 0}if(T===`header`)return{strategy:`header`,headers:G(e.get(`headers`)?.toString()||``)};let t=e.get(`oauth_scopes`)?.toString().trim(),n=e.get(`oauth_client_id`)?.toString().trim(),r=e.get(`oauth_client_secret`)?.toString().trim();return{strategy:`oauth2`,authentication:{type:`oauth`,...D!==`auto`&&{client_auth_method:D},...t&&{scopes:t},...n&&{client_id:n},...r&&{client_secret:r}},...X&&{state:X}}},Q=e=>{let t={id:p?.id||`${C}-${Date.now()}`,type:C};if(C===`sse`||C===`shttp`){let n=e.get(`name`)?.toString().trim(),r=e.get(`url`)?.toString().trim(),i=e.get(`timeout`)?.toString().trim(),a=Z(e),o={...t,...n&&{name:n},url:r,...a&&{auth:a}};if(C===`shttp`&&i){let e=parseInt(i,10);Number.isNaN(e)||(o.timeout=e)}return o}let n=e.get(`name`)?.toString().trim(),r=e.get(`command`)?.toString().trim(),i=e.get(`args`)?.toString().trim(),a=e.get(`env`)?.toString().trim(),o=i?i.split(`
5
+ `).map(e=>e.trim()).filter(Boolean):[],s=G(a||``);return{...t,name:n,command:r,...o.length>0&&{args:o},...Object.keys(s).length>0&&{env:s}}};return(0,f.jsxs)(`form`,{ref:j,"data-testid":e===`add`?`add-mcp-server-form`:`edit-mcp-server-form`,onSubmit:e=>{e.preventDefault(),A(null);let t=new FormData(e.currentTarget),n=W(t);if(n){A(n);return}h(Q(t))},className:`flex flex-col items-start gap-6`,noValidate:!0,children:[e===`add`&&(0,f.jsx)(u.SettingsDropdownInput,{testId:`server-type-dropdown`,name:`server-type`,label:S(n.I18nKey.SETTINGS$MCP_SERVER_TYPE),items:M,selectedKey:C,onSelectionChange:e=>w(e),onInputChange:()=>{},isClearable:!1,allowsCustomValue:!1,required:!0,wrapperClassName:`w-full min-w-0`}),k&&(0,f.jsx)(`p`,{className:`text-red-500 text-sm`,children:k}),(C===`sse`||C===`shttp`)&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(l.SettingsInput,{testId:`server-name-input`,name:`name`,type:`text`,label:S(n.I18nKey.SETTINGS$MCP_SERVER_NAME),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:p?.name||``,placeholder:`my_search_server`,pattern:a.MCP_SERVER_NAME_PATTERN.source}),(0,f.jsx)(l.SettingsInput,{testId:`url-input`,name:`url`,type:`url`,label:S(n.I18nKey.SETTINGS$MCP_URL),className:`w-full min-w-0`,required:!0,defaultValue:p?.url||``,placeholder:`https://api.example.com`}),(0,f.jsx)(u.SettingsDropdownInput,{testId:`auth-mode-dropdown`,name:`auth-mode`,label:S(n.I18nKey.SETTINGS$MCP_AUTHENTICATION),items:N,selectedKey:T,onSelectionChange:e=>E(e),onInputChange:()=>{},isClearable:!1,allowsCustomValue:!1,wrapperClassName:`w-full min-w-0`}),T===`bearer`&&(0,f.jsx)(l.SettingsInput,{testId:`api-key-input`,name:`api_key`,type:`password`,label:S(n.I18nKey.SETTINGS$MCP_API_KEY),className:`w-full min-w-0`,required:!0,defaultValue:q(p?.auth),placeholder:S(n.I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}),T===`header`&&(0,f.jsxs)(`label`,{className:`flex flex-col gap-2.5 w-full min-w-0`,children:[(0,f.jsx)(`span`,{className:`text-sm`,children:S(n.I18nKey.SETTINGS$MCP_HEADERS)}),(0,f.jsx)(`textarea`,{"data-testid":`headers-input`,name:`headers`,rows:4,defaultValue:J(p?.auth),placeholder:S(n.I18nKey.SETTINGS$MCP_HEADERS_PLACEHOLDER),className:i.cn(o.formControlMultilineFieldClassName,`resize-none placeholder:italic`,`disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]`)})]}),T===`oauth2`&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(u.SettingsDropdownInput,{testId:`oauth-client-auth-method-dropdown`,name:`oauth_client_auth_method`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH),items:P,selectedKey:D,onSelectionChange:e=>O(e),onInputChange:()=>{},isClearable:!1,allowsCustomValue:!1,wrapperClassName:`w-full min-w-0`}),(0,f.jsx)(l.SettingsInput,{testId:`oauth-client-id-input`,name:`oauth_client_id`,type:`text`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_ID),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:Y?.client_id||``,placeholder:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_ID_PLACEHOLDER)}),(0,f.jsx)(l.SettingsInput,{testId:`oauth-client-secret-input`,name:`oauth_client_secret`,type:`password`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_SECRET),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:Y?.client_secret||``,placeholder:S(n.I18nKey.SETTINGS$MCP_OAUTH_CLIENT_SECRET_PLACEHOLDER)}),(0,f.jsx)(l.SettingsInput,{testId:`oauth-scopes-input`,name:`oauth_scopes`,type:`text`,label:S(n.I18nKey.SETTINGS$MCP_OAUTH_SCOPES),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:Array.isArray(Y?.scopes)?Y.scopes.join(` `):Y?.scopes||``,placeholder:S(n.I18nKey.SETTINGS$MCP_OAUTH_SCOPES_PLACEHOLDER)})]}),C===`shttp`&&(0,f.jsx)(l.SettingsInput,{testId:`timeout-input`,name:`timeout`,type:`number`,label:S(n.I18nKey.SETTINGS$MCP_TIMEOUT_LABEL),className:`w-full min-w-0`,showOptionalTag:!0,defaultValue:p?.timeout?.toString()||``,placeholder:`60`,min:1,max:3600})]}),C===`stdio`&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(l.SettingsInput,{testId:`name-input`,name:`name`,type:`text`,label:S(n.I18nKey.SETTINGS$MCP_NAME),className:`w-full min-w-0`,required:!0,defaultValue:p?.name||``,placeholder:`my_mcp_server`,pattern:a.MCP_SERVER_NAME_PATTERN.source}),(0,f.jsx)(l.SettingsInput,{testId:`command-input`,name:`command`,type:`text`,label:S(n.I18nKey.SETTINGS$MCP_COMMAND),className:`w-full min-w-0`,required:!0,defaultValue:p?.command||``,placeholder:`npx`}),(0,f.jsxs)(`label`,{className:`flex flex-col gap-2.5 w-full min-w-0`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`span`,{className:`text-sm`,children:S(n.I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}),(0,f.jsx)(c.OptionalTag,{})]}),(0,f.jsx)(`textarea`,{"data-testid":`args-input`,name:`args`,rows:3,defaultValue:p?.args?.join(`
6
6
  `)||``,placeholder:`arg1
7
7
  arg2
8
- arg3`,className:i.cn(a.formControlMultilineFieldClassName,`resize-none placeholder:italic`,`disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]`)}),(0,d.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:x(n.I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)})]}),(0,d.jsxs)(`label`,{className:`flex flex-col gap-2.5 w-full min-w-0`,children:[(0,d.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,d.jsx)(`span`,{className:`text-sm`,children:x(n.I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}),(0,d.jsx)(s.OptionalTag,{})]}),(0,d.jsx)(`textarea`,{"data-testid":`env-input`,name:`env`,rows:4,defaultValue:R(f?.env),placeholder:`KEY1=value1
9
- KEY2=value2`,className:i.cn(a.formControlMultilineFieldClassName,`resize-none placeholder:italic`,`disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]`)})]})]}),b&&(0,d.jsx)(`p`,{"data-testid":`mcp-test-message`,className:b.ok?`text-sm text-green-500 whitespace-pre-wrap`:`text-sm text-red-500 whitespace-pre-wrap`,children:b.text}),(0,d.jsxs)(`div`,{className:i.cn(`flex w-full items-center gap-2`,g?`justify-between`:`justify-end`),children:[g?(0,d.jsx)(o.BrandButton,{testId:`mcp-custom-editor-delete`,type:`button`,variant:`secondary`,onClick:g,isDisabled:_,startContent:(0,d.jsx)(r.Trash2,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),children:x(n.I18nKey.BUTTON$DELETE)}):null,(0,d.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,d.jsx)(o.BrandButton,{testId:`cancel-button`,type:`button`,variant:`secondary`,onClick:h,isDisabled:_,children:x(n.I18nKey.BUTTON$CANCEL)}),v&&(0,d.jsx)(o.BrandButton,{testId:`mcp-test-connection`,type:`button`,variant:`secondary`,onClick:()=>{if(!v||!E.current)return;T(null);let e=new FormData(E.current),t=I(e);if(t){T(t);return}v(z(e))},isDisabled:_||y,children:x(y?n.I18nKey.MCP$VERIFYING:n.I18nKey.MCP$TEST_BUTTON)}),(0,d.jsxs)(o.BrandButton,{testId:`submit-button`,type:`submit`,variant:`primary`,isDisabled:_||y,children:[e===`add`&&x(n.I18nKey.SETTINGS$MCP_ADD_SERVER),e===`edit`&&x(n.I18nKey.SETTINGS$MCP_SAVE_SERVER)]})]})]})]})}exports.MCPServerForm=f;
8
+ arg3`,className:i.cn(o.formControlMultilineFieldClassName,`resize-none placeholder:italic`,`disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]`)}),(0,f.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:S(n.I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)})]}),(0,f.jsxs)(`label`,{className:`flex flex-col gap-2.5 w-full min-w-0`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(`span`,{className:`text-sm`,children:S(n.I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}),(0,f.jsx)(c.OptionalTag,{})]}),(0,f.jsx)(`textarea`,{"data-testid":`env-input`,name:`env`,rows:4,defaultValue:K(p?.env),placeholder:`KEY1=value1
9
+ KEY2=value2`,className:i.cn(o.formControlMultilineFieldClassName,`resize-none placeholder:italic`,`disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]`)})]})]}),x&&(0,f.jsx)(`p`,{"data-testid":`mcp-test-message`,className:x.ok?`text-sm text-green-500 whitespace-pre-wrap`:`text-sm text-red-500 whitespace-pre-wrap`,children:x.text}),(0,f.jsxs)(`div`,{className:i.cn(`flex w-full items-center gap-2`,_?`justify-between`:`justify-end`),children:[_?(0,f.jsx)(s.BrandButton,{testId:`mcp-custom-editor-delete`,type:`button`,variant:`secondary`,onClick:_,isDisabled:v,startContent:(0,f.jsx)(r.Trash2,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),children:S(n.I18nKey.BUTTON$DELETE)}):null,(0,f.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,f.jsx)(s.BrandButton,{testId:`cancel-button`,type:`button`,variant:`secondary`,onClick:g,isDisabled:v,children:S(n.I18nKey.BUTTON$CANCEL)}),y&&(0,f.jsx)(s.BrandButton,{testId:`mcp-test-connection`,type:`button`,variant:`secondary`,onClick:()=>{if(!y||!j.current)return;A(null);let e=new FormData(j.current),t=W(e);if(t){A(t);return}y(Q(e))},isDisabled:v||b,children:S(b?n.I18nKey.MCP$VERIFYING:n.I18nKey.MCP$TEST_BUTTON)}),(0,f.jsxs)(s.BrandButton,{testId:`submit-button`,type:`submit`,variant:`primary`,isDisabled:v||b,children:[e===`add`&&S(n.I18nKey.SETTINGS$MCP_ADD_SERVER),e===`edit`&&S(n.I18nKey.SETTINGS$MCP_SAVE_SERVER)]})]})]})]})}exports.MCPServerForm=p;
10
10
  //# sourceMappingURL=mcp-server-form.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server-form.cjs","names":[],"sources":["../../../../../src/components/features/settings/mcp-settings/mcp-server-form.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Trash2 } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsInput } from \"../settings-input\";\nimport { SettingsDropdownInput } from \"../settings-dropdown-input\";\nimport { BrandButton } from \"../brand-button\";\nimport { OptionalTag } from \"../optional-tag\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlMultilineFieldClassName } from \"#/utils/form-control-classes\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\n\ntype MCPServerType = \"sse\" | \"stdio\" | \"shttp\";\n\nexport interface TestMessage {\n ok: boolean;\n text: string;\n}\n\ninterface MCPServerFormProps {\n mode: \"add\" | \"edit\";\n server?: MCPServerConfig;\n existingServers?: MCPServerConfig[];\n onSubmit: (server: MCPServerConfig) => void;\n onCancel: () => void;\n onDelete?: () => void;\n isActionDisabled?: boolean;\n onTest?: (server: MCPServerConfig) => void;\n isTestPending?: boolean;\n testMessage?: TestMessage | null;\n}\n\nexport function MCPServerForm({\n mode,\n server,\n existingServers,\n onSubmit,\n onCancel,\n onDelete,\n isActionDisabled = false,\n onTest,\n isTestPending = false,\n testMessage = null,\n}: MCPServerFormProps) {\n const { t } = useTranslation(\"openhands\");\n const [serverType, setServerType] = React.useState<MCPServerType>(\n server?.type || \"sse\",\n );\n const [error, setError] = React.useState<string | null>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const serverTypeOptions = [\n { key: \"sse\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE) },\n { key: \"stdio\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO) },\n { key: \"shttp\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP) },\n ];\n\n const validateUrl = (url: string): string | null => {\n if (!url) return t(I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);\n try {\n const urlObj = new URL(url);\n if (![\"http:\", \"https:\"].includes(urlObj.protocol)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL);\n }\n } catch {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID);\n }\n return null;\n };\n\n const validateName = (name: string): string | null => {\n if (!name) return t(I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED);\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n return null;\n };\n\n const validateNameUniqueness = (name: string): string | null => {\n if (!existingServers) return null;\n const shouldCheckUniqueness =\n mode === \"add\" || (mode === \"edit\" && server?.name !== name);\n if (!shouldCheckUniqueness) return null;\n\n const existingStdioNames = existingServers\n .filter((s) => s.type === \"stdio\")\n .map((s) => s.name)\n .filter(Boolean);\n if (existingStdioNames.includes(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE);\n }\n return null;\n };\n\n const validateCommand = (command: string): string | null => {\n if (!command) return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED);\n if (command.includes(\" \")) {\n return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES);\n }\n return null;\n };\n\n const validateUrlUniqueness = (url: string): string | null => {\n if (!existingServers) return null;\n const originalUrl = server?.url;\n const changed = mode === \"add\" || (mode === \"edit\" && originalUrl !== url);\n if (!changed) return null;\n // For URL-based servers (sse/shttp), ensure URL is unique across both types\n const exists = existingServers.some(\n (s) => (s.type === \"sse\" || s.type === \"shttp\") && s.url === url,\n );\n if (exists) return t(I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE);\n return null;\n };\n\n const validateEnvFormat = (envString: string): string | null => {\n if (!envString.trim()) return null;\n const lines = envString.split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const trimmed = lines[i].trim();\n if (trimmed) {\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n const key = trimmed.substring(0, eq).trim();\n if (!key) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n }\n }\n return null;\n };\n\n const validateTimeout = (timeoutStr: string): string | null => {\n if (!timeoutStr.trim()) return null; // Optional field\n\n const timeout = parseInt(timeoutStr.trim(), 10);\n if (Number.isNaN(timeout)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER);\n }\n if (timeout <= 0) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE);\n }\n if (timeout > 3600) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED);\n }\n return null;\n };\n\n const validateStdioServer = (formData: FormData): string | null => {\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n const command = formData.get(\"command\")?.toString().trim() || \"\";\n const envString = formData.get(\"env\")?.toString() || \"\";\n\n const nameError = validateName(name);\n if (nameError) return nameError;\n\n const uniquenessError = validateNameUniqueness(name);\n if (uniquenessError) return uniquenessError;\n\n const commandError = validateCommand(command);\n if (commandError) return commandError;\n\n // Validate environment variable format\n const envError = validateEnvFormat(envString);\n if (envError) return envError;\n\n return null;\n };\n\n const validateForm = (formData: FormData): string | null => {\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim() || \"\";\n const urlError = validateUrl(url);\n if (urlError) return urlError;\n const urlDupError = validateUrlUniqueness(url);\n if (urlDupError) return urlDupError;\n\n // The name is optional, but when provided it becomes the mcp_config\n // key (and the reference used in mcp_server_refs), so hold it to the\n // same safe-identifier rule as stdio names.\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n if (name && !/^[a-zA-Z0-9_-]+$/.test(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n\n // Validate timeout for SHTTP servers only\n if (serverType === \"shttp\") {\n const timeoutStr = formData.get(\"timeout\")?.toString() || \"\";\n const timeoutError = validateTimeout(timeoutStr);\n if (timeoutError) return timeoutError;\n }\n\n return null;\n }\n\n if (serverType === \"stdio\") {\n return validateStdioServer(formData);\n }\n\n return null;\n };\n\n const parseEnvironmentVariables = (\n envString: string,\n ): Record<string, string> => {\n const env: Record<string, string> = {};\n const input = envString.trim();\n if (!input) return env;\n\n for (const line of input.split(\"\\n\")) {\n const trimmed = line.trim();\n const eq = trimmed.indexOf(\"=\");\n const key = eq >= 0 ? trimmed.substring(0, eq).trim() : \"\";\n if (trimmed && eq !== -1 && key) {\n env[key] = trimmed.substring(eq + 1).trim();\n }\n }\n return env;\n };\n\n const formatEnvironmentVariables = (env?: Record<string, string>): string => {\n if (!env) return \"\";\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n };\n\n const buildConfig = (formData: FormData): MCPServerConfig => {\n const baseConfig = {\n id: server?.id || `${serverType}-${Date.now()}`,\n type: serverType,\n };\n\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const name = formData.get(\"name\")?.toString().trim();\n const url = formData.get(\"url\")?.toString().trim();\n const apiKey = formData.get(\"api_key\")?.toString().trim();\n const timeoutStr = formData.get(\"timeout\")?.toString().trim();\n\n const serverConfig: MCPServerConfig = {\n ...baseConfig,\n ...(name && { name }),\n url: url!,\n ...(apiKey && { api_key: apiKey }),\n };\n\n // Only add timeout for SHTTP servers\n if (serverType === \"shttp\" && timeoutStr) {\n const timeoutValue = parseInt(timeoutStr, 10);\n if (!Number.isNaN(timeoutValue)) {\n serverConfig.timeout = timeoutValue;\n }\n }\n\n return serverConfig;\n }\n\n // stdio\n const name = formData.get(\"name\")?.toString().trim();\n const command = formData.get(\"command\")?.toString().trim();\n const argsString = formData.get(\"args\")?.toString().trim();\n const envString = formData.get(\"env\")?.toString().trim();\n\n const args = argsString\n ? argsString\n .split(\"\\n\")\n .map((arg) => arg.trim())\n .filter(Boolean)\n : [];\n const env = parseEnvironmentVariables(envString || \"\");\n\n return {\n ...baseConfig,\n name: name!,\n command: command!,\n ...(args.length > 0 && { args }),\n ...(Object.keys(env).length > 0 && { env }),\n };\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n const formData = new FormData(event.currentTarget);\n const validationError = validateForm(formData);\n\n if (validationError) {\n setError(validationError);\n return;\n }\n\n onSubmit(buildConfig(formData));\n };\n\n const handleTestClick = () => {\n if (!onTest || !formRef.current) return;\n setError(null);\n const formData = new FormData(formRef.current);\n const validationError = validateForm(formData);\n if (validationError) {\n setError(validationError);\n return;\n }\n onTest(buildConfig(formData));\n };\n\n const formTestId =\n mode === \"add\" ? \"add-mcp-server-form\" : \"edit-mcp-server-form\";\n\n return (\n <form\n ref={formRef}\n data-testid={formTestId}\n onSubmit={handleSubmit}\n className=\"flex flex-col items-start gap-6\"\n >\n {mode === \"add\" && (\n <SettingsDropdownInput\n testId=\"server-type-dropdown\"\n name=\"server-type\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_TYPE)}\n items={serverTypeOptions}\n selectedKey={serverType}\n onSelectionChange={(key) => setServerType(key as MCPServerType)}\n onInputChange={() => {}} // Prevent input changes\n isClearable={false}\n allowsCustomValue={false}\n required\n wrapperClassName=\"w-full min-w-0\"\n />\n )}\n\n {error && <p className=\"text-red-500 text-sm\">{error}</p>}\n\n {(serverType === \"sse\" || serverType === \"shttp\") && (\n <>\n <SettingsInput\n testId=\"server-name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_NAME)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.name || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"my-search-server\"\n />\n\n <SettingsInput\n testId=\"url-input\"\n name=\"url\"\n type=\"url\"\n label={t(I18nKey.SETTINGS$MCP_URL)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.url || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"https://api.example.com\"\n />\n\n <SettingsInput\n testId=\"api-key-input\"\n name=\"api_key\"\n type=\"password\"\n label={t(I18nKey.SETTINGS$MCP_API_KEY)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.api_key || \"\"}\n placeholder={t(I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}\n />\n\n {serverType === \"shttp\" && (\n <SettingsInput\n testId=\"timeout-input\"\n name=\"timeout\"\n type=\"number\"\n label={t(I18nKey.SETTINGS$MCP_TIMEOUT_LABEL)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.timeout?.toString() || \"\"}\n placeholder=\"60\"\n min={1}\n max={3600}\n />\n )}\n </>\n )}\n\n {serverType === \"stdio\" && (\n <>\n <SettingsInput\n testId=\"name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_NAME)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.name || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"my-mcp-server\"\n pattern=\"^[a-zA-Z0-9_-]+$\"\n />\n\n <SettingsInput\n testId=\"command-input\"\n name=\"command\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_COMMAND)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.command || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"npx\"\n />\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"args-input\"\n name=\"args\"\n rows={3}\n defaultValue={server?.args?.join(\"\\n\") || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"arg1&#10;arg2&#10;arg3\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n <p className=\"text-xs text-tertiary-alt\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)}\n </p>\n </label>\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"env-input\"\n name=\"env\"\n rows={4}\n defaultValue={formatEnvironmentVariables(server?.env)}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"KEY1=value1&#10;KEY2=value2\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n </label>\n </>\n )}\n\n {testMessage && (\n <p\n data-testid=\"mcp-test-message\"\n className={\n testMessage.ok\n ? \"text-sm text-green-500 whitespace-pre-wrap\"\n : \"text-sm text-red-500 whitespace-pre-wrap\"\n }\n >\n {testMessage.text}\n </p>\n )}\n\n <div\n className={cn(\n \"flex w-full items-center gap-2\",\n onDelete ? \"justify-between\" : \"justify-end\",\n )}\n >\n {onDelete ? (\n <BrandButton\n testId=\"mcp-custom-editor-delete\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onDelete}\n isDisabled={isActionDisabled}\n startContent={\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n }\n >\n {t(I18nKey.BUTTON$DELETE)}\n </BrandButton>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n isDisabled={isActionDisabled}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n {onTest && (\n <BrandButton\n testId=\"mcp-test-connection\"\n type=\"button\"\n variant=\"secondary\"\n onClick={handleTestClick}\n isDisabled={isActionDisabled || isTestPending}\n >\n {isTestPending\n ? t(I18nKey.MCP$VERIFYING)\n : t(I18nKey.MCP$TEST_BUTTON)}\n </BrandButton>\n )}\n <BrandButton\n testId=\"submit-button\"\n type=\"submit\"\n variant=\"primary\"\n isDisabled={isActionDisabled || isTestPending}\n >\n {mode === \"add\" && t(I18nKey.SETTINGS$MCP_ADD_SERVER)}\n {mode === \"edit\" && t(I18nKey.SETTINGS$MCP_SAVE_SERVER)}\n </BrandButton>\n </div>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server-form.cjs","names":[],"sources":["../../../../../src/components/features/settings/mcp-settings/mcp-server-form.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Trash2 } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsInput } from \"../settings-input\";\nimport { SettingsDropdownInput } from \"../settings-dropdown-input\";\nimport { BrandButton } from \"../brand-button\";\nimport { OptionalTag } from \"../optional-tag\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlMultilineFieldClassName } from \"#/utils/form-control-classes\";\nimport {\n isValidMcpServerName,\n MCP_SERVER_NAME_PATTERN,\n} from \"#/utils/mcp-server-name\";\nimport type {\n MCPAuthCredential,\n MCPAuthenticationConfig,\n MCPOAuthClientAuthMethod,\n} from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\n\ntype MCPServerType = \"sse\" | \"stdio\" | \"shttp\";\ntype RemoteAuthMode = \"none\" | \"bearer\" | \"header\" | \"oauth2\";\ntype OAuthClientAuthMethodOption = \"auto\" | MCPOAuthClientAuthMethod;\n\nexport interface TestMessage {\n ok: boolean;\n text: string;\n}\n\ninterface MCPServerFormProps {\n mode: \"add\" | \"edit\";\n server?: MCPServerConfig;\n existingServers?: MCPServerConfig[];\n onSubmit: (server: MCPServerConfig) => void;\n onCancel: () => void;\n onDelete?: () => void;\n isActionDisabled?: boolean;\n onTest?: (server: MCPServerConfig) => void;\n isTestPending?: boolean;\n testMessage?: TestMessage | null;\n}\n\nexport function MCPServerForm({\n mode,\n server,\n existingServers,\n onSubmit,\n onCancel,\n onDelete,\n isActionDisabled = false,\n onTest,\n isTestPending = false,\n testMessage = null,\n}: MCPServerFormProps) {\n const { t } = useTranslation(\"openhands\");\n const [serverType, setServerType] = React.useState<MCPServerType>(\n server?.type || \"sse\",\n );\n const [authMode, setAuthMode] = React.useState<RemoteAuthMode>(() => {\n if (server?.auth?.strategy === \"oauth2\") return \"oauth2\";\n if (server?.auth?.strategy === \"header\") return \"header\";\n if (\n server?.auth?.strategy === \"bearer\" ||\n server?.auth?.strategy === \"api_key\"\n ) {\n return \"bearer\";\n }\n return \"none\";\n });\n const [oauthClientAuthMethod, setOAuthClientAuthMethod] =\n React.useState<OAuthClientAuthMethodOption>(() =>\n server?.auth?.strategy === \"oauth2\"\n ? (server.auth.authentication?.client_auth_method ?? \"auto\")\n : \"auto\",\n );\n const [error, setError] = React.useState<string | null>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const serverTypeOptions = [\n { key: \"sse\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE) },\n { key: \"stdio\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO) },\n { key: \"shttp\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP) },\n ];\n const authModeOptions = [\n { key: \"none\", label: t(I18nKey.SETTINGS$MCP_AUTH_MODE_NONE) },\n { key: \"bearer\", label: t(I18nKey.SETTINGS$MCP_AUTH_MODE_BEARER) },\n { key: \"header\", label: t(I18nKey.SETTINGS$MCP_AUTH_MODE_HEADER) },\n { key: \"oauth2\", label: t(I18nKey.SETTINGS$MCP_AUTH_MODE_OAUTH) },\n ];\n const oauthClientAuthMethodOptions = [\n { key: \"auto\", label: t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_AUTO) },\n { key: \"none\", label: t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_NONE) },\n {\n key: \"client_secret_post\",\n label: t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_SECRET_POST),\n },\n {\n key: \"client_secret_basic\",\n label: t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_SECRET_BASIC),\n },\n {\n key: \"private_key_jwt\",\n label: t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH_PRIVATE_KEY_JWT),\n },\n ];\n\n const validateUrl = (url: string): string | null => {\n if (!url) return t(I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);\n try {\n const urlObj = new URL(url);\n if (![\"http:\", \"https:\"].includes(urlObj.protocol)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL);\n }\n } catch {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID);\n }\n return null;\n };\n\n const validateName = (name: string): string | null => {\n if (!name) return t(I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED);\n if (!isValidMcpServerName(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n return null;\n };\n\n const validateNameUniqueness = (name: string): string | null => {\n if (!existingServers) return null;\n const shouldCheckUniqueness =\n mode === \"add\" || (mode === \"edit\" && server?.name !== name);\n if (!shouldCheckUniqueness) return null;\n\n const existingStdioNames = existingServers\n .filter((s) => s.type === \"stdio\")\n .map((s) => s.name)\n .filter(Boolean);\n if (existingStdioNames.includes(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE);\n }\n return null;\n };\n\n const validateCommand = (command: string): string | null => {\n if (!command) return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED);\n if (command.includes(\" \")) {\n return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES);\n }\n return null;\n };\n\n const validateUrlUniqueness = (url: string): string | null => {\n if (!existingServers) return null;\n const originalUrl = server?.url;\n const changed = mode === \"add\" || (mode === \"edit\" && originalUrl !== url);\n if (!changed) return null;\n // For URL-based servers (sse/shttp), ensure URL is unique across both types\n const exists = existingServers.some(\n (s) => (s.type === \"sse\" || s.type === \"shttp\") && s.url === url,\n );\n if (exists) return t(I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE);\n return null;\n };\n\n const validateEnvFormat = (envString: string): string | null => {\n if (!envString.trim()) return null;\n const lines = envString.split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const trimmed = lines[i].trim();\n if (trimmed) {\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n const key = trimmed.substring(0, eq).trim();\n if (!key) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n }\n }\n return null;\n };\n\n const validateRemoteAuth = (formData: FormData): string | null => {\n if (authMode === \"header\") {\n const headerString = formData.get(\"headers\")?.toString() || \"\";\n if (!headerString.trim())\n return t(I18nKey.SETTINGS$MCP_ERROR_HEADER_REQUIRED);\n return validateEnvFormat(headerString);\n }\n if (authMode === \"oauth2\") {\n const clientId = formData.get(\"oauth_client_id\")?.toString().trim();\n const clientSecret = formData\n .get(\"oauth_client_secret\")\n ?.toString()\n .trim();\n if (clientSecret && !clientId) {\n return t(I18nKey.SETTINGS$MCP_ERROR_OAUTH_SECRET_REQUIRES_ID);\n }\n }\n return null;\n };\n\n const validateTimeout = (timeoutStr: string): string | null => {\n if (!timeoutStr.trim()) return null; // Optional field\n\n const timeout = parseInt(timeoutStr.trim(), 10);\n if (Number.isNaN(timeout)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER);\n }\n if (timeout <= 0) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE);\n }\n if (timeout > 3600) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED);\n }\n return null;\n };\n\n const validateStdioServer = (formData: FormData): string | null => {\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n const command = formData.get(\"command\")?.toString().trim() || \"\";\n const envString = formData.get(\"env\")?.toString() || \"\";\n\n const nameError = validateName(name);\n if (nameError) return nameError;\n\n const uniquenessError = validateNameUniqueness(name);\n if (uniquenessError) return uniquenessError;\n\n const commandError = validateCommand(command);\n if (commandError) return commandError;\n\n // Validate environment variable format\n const envError = validateEnvFormat(envString);\n if (envError) return envError;\n\n return null;\n };\n\n const validateForm = (formData: FormData): string | null => {\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim() || \"\";\n const urlError = validateUrl(url);\n if (urlError) return urlError;\n const urlDupError = validateUrlUniqueness(url);\n if (urlDupError) return urlDupError;\n\n // The name is optional, but when provided it becomes the mcp_config\n // key (and the reference used in mcp_server_refs), so hold it to the\n // same safe-identifier rule as stdio names.\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n if (name && !isValidMcpServerName(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n\n // Validate timeout for SHTTP servers only\n if (serverType === \"shttp\") {\n const timeoutStr = formData.get(\"timeout\")?.toString() || \"\";\n const timeoutError = validateTimeout(timeoutStr);\n if (timeoutError) return timeoutError;\n }\n\n return validateRemoteAuth(formData);\n }\n\n if (serverType === \"stdio\") {\n return validateStdioServer(formData);\n }\n\n return null;\n };\n\n const parseEnvironmentVariables = (\n envString: string,\n ): Record<string, string> => {\n const env: Record<string, string> = {};\n const input = envString.trim();\n if (!input) return env;\n\n for (const line of input.split(\"\\n\")) {\n const trimmed = line.trim();\n const eq = trimmed.indexOf(\"=\");\n const key = eq >= 0 ? trimmed.substring(0, eq).trim() : \"\";\n if (trimmed && eq !== -1 && key) {\n env[key] = trimmed.substring(eq + 1).trim();\n }\n }\n return env;\n };\n\n const formatEnvironmentVariables = (\n env?: Record<string, string> | null,\n ): string => {\n if (!env) return \"\";\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n };\n\n const editableAuthValue = (auth: MCPAuthCredential | undefined): string => {\n if (auth?.strategy === \"bearer\" || auth?.strategy === \"api_key\") {\n return auth.value ?? \"\";\n }\n return \"\";\n };\n\n const editableHeaderValue = (auth: MCPAuthCredential | undefined): string => {\n if (auth?.strategy !== \"header\") return \"\";\n return formatEnvironmentVariables(auth.headers);\n };\n\n const oauthAuthentication =\n server?.auth?.strategy === \"oauth2\"\n ? server.auth.authentication\n : undefined;\n const oauthState =\n server?.auth?.strategy === \"oauth2\" ? server.auth.state : undefined;\n\n const authFromFormData = (\n formData: FormData,\n ): MCPAuthCredential | undefined => {\n if (authMode === \"none\") return undefined;\n if (authMode === \"bearer\") {\n const value = formData.get(\"api_key\")?.toString().trim();\n if (!value) return undefined;\n if (server?.auth?.strategy === \"api_key\") {\n return { ...server.auth, value };\n }\n return { strategy: \"bearer\", value };\n }\n if (authMode === \"header\") {\n const headers = parseEnvironmentVariables(\n formData.get(\"headers\")?.toString() || \"\",\n );\n return { strategy: \"header\", headers };\n }\n\n const scopes = formData.get(\"oauth_scopes\")?.toString().trim();\n const clientId = formData.get(\"oauth_client_id\")?.toString().trim();\n const clientSecret = formData.get(\"oauth_client_secret\")?.toString().trim();\n const authentication: MCPAuthenticationConfig = {\n type: \"oauth\",\n ...(oauthClientAuthMethod !== \"auto\" && {\n client_auth_method: oauthClientAuthMethod,\n }),\n ...(scopes && { scopes }),\n ...(clientId && { client_id: clientId }),\n ...(clientSecret && { client_secret: clientSecret }),\n };\n return {\n strategy: \"oauth2\",\n authentication,\n ...(oauthState && { state: oauthState }),\n };\n };\n\n const buildConfig = (formData: FormData): MCPServerConfig => {\n const baseConfig = {\n id: server?.id || `${serverType}-${Date.now()}`,\n type: serverType,\n };\n\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const name = formData.get(\"name\")?.toString().trim();\n const url = formData.get(\"url\")?.toString().trim();\n const timeoutStr = formData.get(\"timeout\")?.toString().trim();\n const auth = authFromFormData(formData);\n\n const serverConfig: MCPServerConfig = {\n ...baseConfig,\n ...(name && { name }),\n url: url!,\n ...(auth && { auth }),\n };\n\n // Only add timeout for SHTTP servers\n if (serverType === \"shttp\" && timeoutStr) {\n const timeoutValue = parseInt(timeoutStr, 10);\n if (!Number.isNaN(timeoutValue)) {\n serverConfig.timeout = timeoutValue;\n }\n }\n\n return serverConfig;\n }\n\n // stdio\n const name = formData.get(\"name\")?.toString().trim();\n const command = formData.get(\"command\")?.toString().trim();\n const argsString = formData.get(\"args\")?.toString().trim();\n const envString = formData.get(\"env\")?.toString().trim();\n\n const args = argsString\n ? argsString\n .split(\"\\n\")\n .map((arg) => arg.trim())\n .filter(Boolean)\n : [];\n const env = parseEnvironmentVariables(envString || \"\");\n\n return {\n ...baseConfig,\n name: name!,\n command: command!,\n ...(args.length > 0 && { args }),\n ...(Object.keys(env).length > 0 && { env }),\n };\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n const formData = new FormData(event.currentTarget);\n const validationError = validateForm(formData);\n\n if (validationError) {\n setError(validationError);\n return;\n }\n\n onSubmit(buildConfig(formData));\n };\n\n const handleTestClick = () => {\n if (!onTest || !formRef.current) return;\n setError(null);\n const formData = new FormData(formRef.current);\n const validationError = validateForm(formData);\n if (validationError) {\n setError(validationError);\n return;\n }\n onTest(buildConfig(formData));\n };\n\n const formTestId =\n mode === \"add\" ? \"add-mcp-server-form\" : \"edit-mcp-server-form\";\n\n return (\n <form\n ref={formRef}\n data-testid={formTestId}\n onSubmit={handleSubmit}\n className=\"flex flex-col items-start gap-6\"\n noValidate\n >\n {mode === \"add\" && (\n <SettingsDropdownInput\n testId=\"server-type-dropdown\"\n name=\"server-type\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_TYPE)}\n items={serverTypeOptions}\n selectedKey={serverType}\n onSelectionChange={(key) => setServerType(key as MCPServerType)}\n onInputChange={() => {}} // Prevent input changes\n isClearable={false}\n allowsCustomValue={false}\n required\n wrapperClassName=\"w-full min-w-0\"\n />\n )}\n\n {error && <p className=\"text-red-500 text-sm\">{error}</p>}\n\n {(serverType === \"sse\" || serverType === \"shttp\") && (\n <>\n <SettingsInput\n testId=\"server-name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_NAME)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.name || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"my_search_server\"\n pattern={MCP_SERVER_NAME_PATTERN.source}\n />\n\n <SettingsInput\n testId=\"url-input\"\n name=\"url\"\n type=\"url\"\n label={t(I18nKey.SETTINGS$MCP_URL)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.url || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"https://api.example.com\"\n />\n\n <SettingsDropdownInput\n testId=\"auth-mode-dropdown\"\n name=\"auth-mode\"\n label={t(I18nKey.SETTINGS$MCP_AUTHENTICATION)}\n items={authModeOptions}\n selectedKey={authMode}\n onSelectionChange={(key) => setAuthMode(key as RemoteAuthMode)}\n onInputChange={() => {}}\n isClearable={false}\n allowsCustomValue={false}\n wrapperClassName=\"w-full min-w-0\"\n />\n\n {authMode === \"bearer\" && (\n <SettingsInput\n testId=\"api-key-input\"\n name=\"api_key\"\n type=\"password\"\n label={t(I18nKey.SETTINGS$MCP_API_KEY)}\n className=\"w-full min-w-0\"\n required\n defaultValue={editableAuthValue(server?.auth)}\n placeholder={t(I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}\n />\n )}\n\n {authMode === \"header\" && (\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <span className=\"text-sm\">{t(I18nKey.SETTINGS$MCP_HEADERS)}</span>\n <textarea\n data-testid=\"headers-input\"\n name=\"headers\"\n rows={4}\n defaultValue={editableHeaderValue(server?.auth)}\n placeholder={t(I18nKey.SETTINGS$MCP_HEADERS_PLACEHOLDER)}\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n </label>\n )}\n\n {authMode === \"oauth2\" && (\n <>\n <SettingsDropdownInput\n testId=\"oauth-client-auth-method-dropdown\"\n name=\"oauth_client_auth_method\"\n label={t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_AUTH)}\n items={oauthClientAuthMethodOptions}\n selectedKey={oauthClientAuthMethod}\n onSelectionChange={(key) =>\n setOAuthClientAuthMethod(key as OAuthClientAuthMethodOption)\n }\n onInputChange={() => {}}\n isClearable={false}\n allowsCustomValue={false}\n wrapperClassName=\"w-full min-w-0\"\n />\n <SettingsInput\n testId=\"oauth-client-id-input\"\n name=\"oauth_client_id\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_ID)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={oauthAuthentication?.client_id || \"\"}\n placeholder={t(\n I18nKey.SETTINGS$MCP_OAUTH_CLIENT_ID_PLACEHOLDER,\n )}\n />\n <SettingsInput\n testId=\"oauth-client-secret-input\"\n name=\"oauth_client_secret\"\n type=\"password\"\n label={t(I18nKey.SETTINGS$MCP_OAUTH_CLIENT_SECRET)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={oauthAuthentication?.client_secret || \"\"}\n placeholder={t(\n I18nKey.SETTINGS$MCP_OAUTH_CLIENT_SECRET_PLACEHOLDER,\n )}\n />\n <SettingsInput\n testId=\"oauth-scopes-input\"\n name=\"oauth_scopes\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_OAUTH_SCOPES)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={\n Array.isArray(oauthAuthentication?.scopes)\n ? oauthAuthentication.scopes.join(\" \")\n : oauthAuthentication?.scopes || \"\"\n }\n placeholder={t(I18nKey.SETTINGS$MCP_OAUTH_SCOPES_PLACEHOLDER)}\n />\n </>\n )}\n\n {serverType === \"shttp\" && (\n <SettingsInput\n testId=\"timeout-input\"\n name=\"timeout\"\n type=\"number\"\n label={t(I18nKey.SETTINGS$MCP_TIMEOUT_LABEL)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.timeout?.toString() || \"\"}\n placeholder=\"60\"\n min={1}\n max={3600}\n />\n )}\n </>\n )}\n\n {serverType === \"stdio\" && (\n <>\n <SettingsInput\n testId=\"name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_NAME)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.name || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"my_mcp_server\"\n pattern={MCP_SERVER_NAME_PATTERN.source}\n />\n\n <SettingsInput\n testId=\"command-input\"\n name=\"command\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_COMMAND)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.command || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"npx\"\n />\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"args-input\"\n name=\"args\"\n rows={3}\n defaultValue={server?.args?.join(\"\\n\") || \"\"}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"arg1&#10;arg2&#10;arg3\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n <p className=\"text-xs text-tertiary-alt\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)}\n </p>\n </label>\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"env-input\"\n name=\"env\"\n rows={4}\n defaultValue={formatEnvironmentVariables(server?.env)}\n // eslint-disable-next-line i18next/no-literal-string -- example value, not translatable\n placeholder=\"KEY1=value1&#10;KEY2=value2\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n </label>\n </>\n )}\n\n {testMessage && (\n <p\n data-testid=\"mcp-test-message\"\n className={\n testMessage.ok\n ? \"text-sm text-green-500 whitespace-pre-wrap\"\n : \"text-sm text-red-500 whitespace-pre-wrap\"\n }\n >\n {testMessage.text}\n </p>\n )}\n\n <div\n className={cn(\n \"flex w-full items-center gap-2\",\n onDelete ? \"justify-between\" : \"justify-end\",\n )}\n >\n {onDelete ? (\n <BrandButton\n testId=\"mcp-custom-editor-delete\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onDelete}\n isDisabled={isActionDisabled}\n startContent={\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n }\n >\n {t(I18nKey.BUTTON$DELETE)}\n </BrandButton>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n isDisabled={isActionDisabled}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n {onTest && (\n <BrandButton\n testId=\"mcp-test-connection\"\n type=\"button\"\n variant=\"secondary\"\n onClick={handleTestClick}\n isDisabled={isActionDisabled || isTestPending}\n >\n {isTestPending\n ? t(I18nKey.MCP$VERIFYING)\n : t(I18nKey.MCP$TEST_BUTTON)}\n </BrandButton>\n )}\n <BrandButton\n testId=\"submit-button\"\n type=\"submit\"\n variant=\"primary\"\n isDisabled={isActionDisabled || isTestPending}\n >\n {mode === \"add\" && t(I18nKey.SETTINGS$MCP_ADD_SERVER)}\n {mode === \"edit\" && t(I18nKey.SETTINGS$MCP_SAVE_SERVER)}\n </BrandButton>\n </div>\n </div>\n </form>\n );\n}\n"],"mappings":"ynBA2CA,SAAgB,EAAc,CAC5B,OACA,SACA,kBACA,WACA,WACA,WACA,mBAAmB,GACnB,SACA,gBAAgB,GAChB,cAAc,MACO,CACrB,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAC,EAAY,GAAiB,EAAA,QAAM,SACxC,GAAQ,MAAQ,MACjB,CACK,CAAC,EAAU,GAAe,EAAA,QAAM,aAChC,GAAQ,MAAM,WAAa,SAAiB,SAC5C,GAAQ,MAAM,WAAa,SAAiB,SAE9C,GAAQ,MAAM,WAAa,UAC3B,GAAQ,MAAM,WAAa,UAEpB,SAEF,OACP,CACI,CAAC,EAAuB,GAC5B,EAAA,QAAM,aACJ,GAAQ,MAAM,WAAa,SACtB,EAAO,KAAK,gBAAgB,oBAAsB,OACnD,OACL,CACG,CAAC,EAAO,GAAY,EAAA,QAAM,SAAwB,KAAK,CACvD,EAAU,EAAA,QAAM,OAAwB,KAAK,CAE7C,EAAoB,CACxB,CAAE,IAAK,MAAO,MAAO,EAAE,EAAA,QAAQ,6BAA6B,CAAE,CAC9D,CAAE,IAAK,QAAS,MAAO,EAAE,EAAA,QAAQ,+BAA+B,CAAE,CAClE,CAAE,IAAK,QAAS,MAAO,EAAE,EAAA,QAAQ,+BAA+B,CAAE,CACnE,CACK,EAAkB,CACtB,CAAE,IAAK,OAAQ,MAAO,EAAE,EAAA,QAAQ,4BAA4B,CAAE,CAC9D,CAAE,IAAK,SAAU,MAAO,EAAE,EAAA,QAAQ,8BAA8B,CAAE,CAClE,CAAE,IAAK,SAAU,MAAO,EAAE,EAAA,QAAQ,8BAA8B,CAAE,CAClE,CAAE,IAAK,SAAU,MAAO,EAAE,EAAA,QAAQ,6BAA6B,CAAE,CAClE,CACK,EAA+B,CACnC,CAAE,IAAK,OAAQ,MAAO,EAAE,EAAA,QAAQ,oCAAoC,CAAE,CACtE,CAAE,IAAK,OAAQ,MAAO,EAAE,EAAA,QAAQ,oCAAoC,CAAE,CACtE,CACE,IAAK,qBACL,MAAO,EAAE,EAAA,QAAQ,2CAA2C,CAC7D,CACD,CACE,IAAK,sBACL,MAAO,EAAE,EAAA,QAAQ,4CAA4C,CAC9D,CACD,CACE,IAAK,kBACL,MAAO,EAAE,EAAA,QAAQ,+CAA+C,CACjE,CACF,CAEK,EAAe,GAA+B,CAClD,GAAI,CAAC,EAAK,OAAO,EAAE,EAAA,QAAQ,gCAAgC,CAC3D,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,EAAI,CAC3B,GAAI,CAAC,CAAC,QAAS,SAAS,CAAC,SAAS,EAAO,SAAS,CAChD,OAAO,EAAE,EAAA,QAAQ,wCAAwC,MAErD,CACN,OAAO,EAAE,EAAA,QAAQ,+BAA+B,CAElD,OAAO,MAGH,EAAgB,GACf,EACA,EAAA,qBAAqB,EAAK,CAGxB,KAFE,EAAE,EAAA,QAAQ,gCAAgC,CAFjC,EAAE,EAAA,QAAQ,iCAAiC,CAOzD,EAA0B,GAC1B,CAAC,GAGD,EADF,IAAS,OAAU,IAAS,QAAU,GAAQ,OAAS,GACtB,KAER,EACxB,OAAQ,GAAM,EAAE,OAAS,QAAQ,CACjC,IAAK,GAAM,EAAE,KAAK,CAClB,OAAO,QACN,CAAmB,SAAS,EAAK,CAC5B,EAAE,EAAA,QAAQ,kCAAkC,CAE9C,KAGH,EAAmB,GAClB,EACD,EAAQ,SAAS,IAAI,CAChB,EAAE,EAAA,QAAQ,qCAAqC,CAEjD,KAJc,EAAE,EAAA,QAAQ,oCAAoC,CAO/D,EAAyB,GAA+B,CAC5D,GAAI,CAAC,EAAiB,OAAO,KAC7B,IAAM,EAAc,GAAQ,IAQ5B,OAPgB,IAAS,OAAU,IAAS,QAAU,IAAgB,IAGvD,EAAgB,KAC5B,IAAO,EAAE,OAAS,OAAS,EAAE,OAAS,UAAY,EAAE,MAAQ,EAE3D,CAAe,EAAE,EAAA,QAAQ,iCAAiC,CACvD,MAGH,EAAqB,GAAqC,CAC9D,GAAI,CAAC,EAAU,MAAM,CAAE,OAAO,KAC9B,IAAM,EAAQ,EAAU,MAAM;EAAK,CACnC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,EAAG,CACxC,IAAM,EAAU,EAAM,GAAG,MAAM,CAC/B,GAAI,EAAS,CACX,IAAM,EAAK,EAAQ,QAAQ,IAAI,CAG/B,GAFI,IAAO,IAEP,CADQ,EAAQ,UAAU,EAAG,EAAG,CAAC,MAChC,CAAK,OAAO,EAAE,EAAA,QAAQ,sCAAsC,EAGrE,OAAO,MAGH,EAAsB,GAAsC,CAChE,GAAI,IAAa,SAAU,CACzB,IAAM,EAAe,EAAS,IAAI,UAAU,EAAE,UAAU,EAAI,GAG5D,OAFK,EAAa,MAAM,CAEjB,EAAkB,EAAa,CAD7B,EAAE,EAAA,QAAQ,mCAAmC,CAGxD,GAAI,IAAa,SAAU,CACzB,IAAM,EAAW,EAAS,IAAI,kBAAkB,EAAE,UAAU,CAAC,MAAM,CAKnE,GAJqB,EAClB,IAAI,sBAAsB,EACzB,UAAU,CACX,MAAM,EACW,CAAC,EACnB,OAAO,EAAE,EAAA,QAAQ,4CAA4C,CAGjE,OAAO,MAGH,EAAmB,GAAsC,CAC7D,GAAI,CAAC,EAAW,MAAM,CAAE,OAAO,KAE/B,IAAM,EAAU,SAAS,EAAW,MAAM,CAAE,GAAG,CAU/C,OATI,OAAO,MAAM,EAAQ,CAChB,EAAE,EAAA,QAAQ,0CAA0C,CAEzD,GAAW,EACN,EAAE,EAAA,QAAQ,oCAAoC,CAEnD,EAAU,KACL,EAAE,EAAA,QAAQ,wCAAwC,CAEpD,MAGH,EAAuB,GAAsC,CACjE,IAAM,EAAO,EAAS,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,EAAI,GAClD,EAAU,EAAS,IAAI,UAAU,EAAE,UAAU,CAAC,MAAM,EAAI,GACxD,EAAY,EAAS,IAAI,MAAM,EAAE,UAAU,EAAI,GAerD,OAbkB,EAAa,EAC3B,EAEoB,EAAuB,EAC3C,EAEiB,EAAgB,EACjC,EAGa,EAAkB,EAC/B,EAEG,MAGH,EAAgB,GAAsC,CAC1D,GAAI,IAAe,OAAS,IAAe,QAAS,CAClD,IAAM,EAAM,EAAS,IAAI,MAAM,EAAE,UAAU,CAAC,MAAM,EAAI,GAChD,EAAW,EAAY,EAAI,CACjC,GAAI,EAAU,OAAO,EACrB,IAAM,EAAc,EAAsB,EAAI,CAC9C,GAAI,EAAa,OAAO,EAKxB,IAAM,EAAO,EAAS,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,EAAI,GACxD,GAAI,GAAQ,CAAC,EAAA,qBAAqB,EAAK,CACrC,OAAO,EAAE,EAAA,QAAQ,gCAAgC,CAInD,GAAI,IAAe,QAAS,CAE1B,IAAM,EAAe,EADF,EAAS,IAAI,UAAU,EAAE,UAAU,EAAI,GACV,CAChD,GAAI,EAAc,OAAO,EAG3B,OAAO,EAAmB,EAAS,CAOrC,OAJI,IAAe,QACV,EAAoB,EAAS,CAG/B,MAGH,EACJ,GAC2B,CAC3B,IAAM,EAA8B,EAAE,CAChC,EAAQ,EAAU,MAAM,CAC9B,GAAI,CAAC,EAAO,OAAO,EAEnB,IAAK,IAAM,KAAQ,EAAM,MAAM;EAAK,CAAE,CACpC,IAAM,EAAU,EAAK,MAAM,CACrB,EAAK,EAAQ,QAAQ,IAAI,CACzB,EAAM,GAAM,EAAI,EAAQ,UAAU,EAAG,EAAG,CAAC,MAAM,CAAG,GACpD,GAAW,IAAO,IAAM,IAC1B,EAAI,GAAO,EAAQ,UAAU,EAAK,EAAE,CAAC,MAAM,EAG/C,OAAO,GAGH,EACJ,GAEK,EACE,OAAO,QAAQ,EAAI,CACvB,KAAK,CAAC,EAAK,KAAW,GAAG,EAAI,GAAG,IAAQ,CACxC,KAAK;EAAK,CAHI,GAMb,EAAqB,GACrB,GAAM,WAAa,UAAY,GAAM,WAAa,UAC7C,EAAK,OAAS,GAEhB,GAGH,EAAuB,GACvB,GAAM,WAAa,SAChB,EAA2B,EAAK,QAAQ,CADP,GAIpC,EACJ,GAAQ,MAAM,WAAa,SACvB,EAAO,KAAK,eACZ,IAAA,GACA,EACJ,GAAQ,MAAM,WAAa,SAAW,EAAO,KAAK,MAAQ,IAAA,GAEtD,EACJ,GACkC,CAClC,GAAI,IAAa,OAAQ,OACzB,GAAI,IAAa,SAAU,CACzB,IAAM,EAAQ,EAAS,IAAI,UAAU,EAAE,UAAU,CAAC,MAAM,CAKxD,OAJK,EACD,GAAQ,MAAM,WAAa,UACtB,CAAE,GAAG,EAAO,KAAM,QAAO,CAE3B,CAAE,SAAU,SAAU,QAAO,CAJxB,OAMd,GAAI,IAAa,SAIf,MAAO,CAAE,SAAU,SAAU,QAHb,EACd,EAAS,IAAI,UAAU,EAAE,UAAU,EAAI,GAEZ,CAAS,CAGxC,IAAM,EAAS,EAAS,IAAI,eAAe,EAAE,UAAU,CAAC,MAAM,CACxD,EAAW,EAAS,IAAI,kBAAkB,EAAE,UAAU,CAAC,MAAM,CAC7D,EAAe,EAAS,IAAI,sBAAsB,EAAE,UAAU,CAAC,MAAM,CAU3E,MAAO,CACL,SAAU,SACV,eAAA,CAVA,KAAM,QACN,GAAI,IAA0B,QAAU,CACtC,mBAAoB,EACrB,CACD,GAAI,GAAU,CAAE,SAAQ,CACxB,GAAI,GAAY,CAAE,UAAW,EAAU,CACvC,GAAI,GAAgB,CAAE,cAAe,EAAc,CAInD,CACA,GAAI,GAAc,CAAE,MAAO,EAAY,CACxC,EAGG,EAAe,GAAwC,CAC3D,IAAM,EAAa,CACjB,GAAI,GAAQ,IAAM,GAAG,EAAW,GAAG,KAAK,KAAK,GAC7C,KAAM,EACP,CAED,GAAI,IAAe,OAAS,IAAe,QAAS,CAClD,IAAM,EAAO,EAAS,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,CAC9C,EAAM,EAAS,IAAI,MAAM,EAAE,UAAU,CAAC,MAAM,CAC5C,EAAa,EAAS,IAAI,UAAU,EAAE,UAAU,CAAC,MAAM,CACvD,EAAO,EAAiB,EAAS,CAEjC,EAAgC,CACpC,GAAG,EACH,GAAI,GAAQ,CAAE,OAAM,CACf,MACL,GAAI,GAAQ,CAAE,OAAM,CACrB,CAGD,GAAI,IAAe,SAAW,EAAY,CACxC,IAAM,EAAe,SAAS,EAAY,GAAG,CACxC,OAAO,MAAM,EAAa,GAC7B,EAAa,QAAU,GAI3B,OAAO,EAIT,IAAM,EAAO,EAAS,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,CAC9C,EAAU,EAAS,IAAI,UAAU,EAAE,UAAU,CAAC,MAAM,CACpD,EAAa,EAAS,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,CACpD,EAAY,EAAS,IAAI,MAAM,EAAE,UAAU,CAAC,MAAM,CAElD,EAAO,EACT,EACG,MAAM;EAAK,CACX,IAAK,GAAQ,EAAI,MAAM,CAAC,CACxB,OAAO,QAAQ,CAClB,EAAE,CACA,EAAM,EAA0B,GAAa,GAAG,CAEtD,MAAO,CACL,GAAG,EACG,OACG,UACT,GAAI,EAAK,OAAS,GAAK,CAAE,OAAM,CAC/B,GAAI,OAAO,KAAK,EAAI,CAAC,OAAS,GAAK,CAAE,MAAK,CAC3C,EAiCH,OACE,EAAA,EAAA,MAAC,OAAD,CACE,IAAK,EACL,cALF,IAAS,MAAQ,sBAAwB,uBAMvC,SAlCkB,GAA4C,CAChE,EAAM,gBAAgB,CACtB,EAAS,KAAK,CAEd,IAAM,EAAW,IAAI,SAAS,EAAM,cAAc,CAC5C,EAAkB,EAAa,EAAS,CAE9C,GAAI,EAAiB,CACnB,EAAS,EAAgB,CACzB,OAGF,EAAS,EAAY,EAAS,CAAC,EAuB7B,UAAU,kCACV,WAAA,YALF,CAOG,IAAS,QACR,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,OAAO,uBACP,KAAK,cACL,MAAO,EAAE,EAAA,QAAQ,yBAAyB,CAC1C,MAAO,EACP,YAAa,EACb,kBAAoB,GAAQ,EAAc,EAAqB,CAC/D,kBAAqB,GACrB,YAAa,GACb,kBAAmB,GACnB,SAAA,GACA,iBAAiB,iBACjB,CAAA,CAGH,IAAS,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gCAAwB,EAAU,CAAA,EAEvD,IAAe,OAAS,IAAe,WACvC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,oBACP,KAAK,OACL,KAAK,OACL,MAAO,EAAE,EAAA,QAAQ,yBAAyB,CAC1C,UAAU,iBACV,gBAAA,GACA,aAAc,GAAQ,MAAQ,GAE9B,YAAY,mBACZ,QAAS,EAAA,wBAAwB,OACjC,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,YACP,KAAK,MACL,KAAK,MACL,MAAO,EAAE,EAAA,QAAQ,iBAAiB,CAClC,UAAU,iBACV,SAAA,GACA,aAAc,GAAQ,KAAO,GAE7B,YAAY,0BACZ,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,OAAO,qBACP,KAAK,YACL,MAAO,EAAE,EAAA,QAAQ,4BAA4B,CAC7C,MAAO,EACP,YAAa,EACb,kBAAoB,GAAQ,EAAY,EAAsB,CAC9D,kBAAqB,GACrB,YAAa,GACb,kBAAmB,GACnB,iBAAiB,iBACjB,CAAA,CAED,IAAa,WACZ,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,gBACP,KAAK,UACL,KAAK,WACL,MAAO,EAAE,EAAA,QAAQ,qBAAqB,CACtC,UAAU,iBACV,SAAA,GACA,aAAc,EAAkB,GAAQ,KAAK,CAC7C,YAAa,EAAE,EAAA,QAAQ,iCAAiC,CACxD,CAAA,CAGH,IAAa,WACZ,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,gDAAjB,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBAAW,EAAE,EAAA,QAAQ,qBAAqB,CAAQ,CAAA,EAClE,EAAA,EAAA,KAAC,WAAD,CACE,cAAY,gBACZ,KAAK,UACL,KAAM,EACN,aAAc,EAAoB,GAAQ,KAAK,CAC/C,YAAa,EAAE,EAAA,QAAQ,iCAAiC,CACxD,UAAW,EAAA,GACT,EAAA,mCACA,iCACA,mFACD,CACD,CAAA,CACI,GAGT,IAAa,WACZ,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,OAAO,oCACP,KAAK,2BACL,MAAO,EAAE,EAAA,QAAQ,+BAA+B,CAChD,MAAO,EACP,YAAa,EACb,kBAAoB,GAClB,EAAyB,EAAmC,CAE9D,kBAAqB,GACrB,YAAa,GACb,kBAAmB,GACnB,iBAAiB,iBACjB,CAAA,EACF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,wBACP,KAAK,kBACL,KAAK,OACL,MAAO,EAAE,EAAA,QAAQ,6BAA6B,CAC9C,UAAU,iBACV,gBAAA,GACA,aAAc,GAAqB,WAAa,GAChD,YAAa,EACX,EAAA,QAAQ,yCACT,CACD,CAAA,EACF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,4BACP,KAAK,sBACL,KAAK,WACL,MAAO,EAAE,EAAA,QAAQ,iCAAiC,CAClD,UAAU,iBACV,gBAAA,GACA,aAAc,GAAqB,eAAiB,GACpD,YAAa,EACX,EAAA,QAAQ,6CACT,CACD,CAAA,EACF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,qBACP,KAAK,eACL,KAAK,OACL,MAAO,EAAE,EAAA,QAAQ,0BAA0B,CAC3C,UAAU,iBACV,gBAAA,GACA,aACE,MAAM,QAAQ,GAAqB,OAAO,CACtC,EAAoB,OAAO,KAAK,IAAI,CACpC,GAAqB,QAAU,GAErC,YAAa,EAAE,EAAA,QAAQ,sCAAsC,CAC7D,CAAA,CACD,CAAA,CAAA,CAGJ,IAAe,UACd,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,gBACP,KAAK,UACL,KAAK,SACL,MAAO,EAAE,EAAA,QAAQ,2BAA2B,CAC5C,UAAU,iBACV,gBAAA,GACA,aAAc,GAAQ,SAAS,UAAU,EAAI,GAC7C,YAAY,KACZ,IAAK,EACL,IAAK,KACL,CAAA,CAEH,CAAA,CAAA,CAGJ,IAAe,UACd,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,aACP,KAAK,OACL,KAAK,OACL,MAAO,EAAE,EAAA,QAAQ,kBAAkB,CACnC,UAAU,iBACV,SAAA,GACA,aAAc,GAAQ,MAAQ,GAE9B,YAAY,gBACZ,QAAS,EAAA,wBAAwB,OACjC,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,OAAO,gBACP,KAAK,UACL,KAAK,OACL,MAAO,EAAE,EAAA,QAAQ,qBAAqB,CACtC,UAAU,iBACV,SAAA,GACA,aAAc,GAAQ,SAAW,GAEjC,YAAY,MACZ,CAAA,EAEF,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,gDAAjB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBACb,EAAE,EAAA,QAAQ,+BAA+B,CACrC,CAAA,EACP,EAAA,EAAA,KAAC,EAAA,YAAD,EAAe,CAAA,CACX,IACN,EAAA,EAAA,KAAC,WAAD,CACE,cAAY,aACZ,KAAK,OACL,KAAM,EACN,aAAc,GAAQ,MAAM,KAAK;EAAK,EAAI,GAE1C,YAAY;;MACZ,UAAW,EAAA,GACT,EAAA,mCACA,iCACA,mFACD,CACD,CAAA,EACF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,qCACV,EAAE,EAAA,QAAQ,oCAAoC,CAC7C,CAAA,CACE,IAER,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,gDAAjB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBACb,EAAE,EAAA,QAAQ,mCAAmC,CACzC,CAAA,EACP,EAAA,EAAA,KAAC,EAAA,YAAD,EAAe,CAAA,CACX,IACN,EAAA,EAAA,KAAC,WAAD,CACE,cAAY,YACZ,KAAK,MACL,KAAM,EACN,aAAc,EAA2B,GAAQ,IAAI,CAErD,YAAY;aACZ,UAAW,EAAA,GACT,EAAA,mCACA,iCACA,mFACD,CACD,CAAA,CACI,GACP,CAAA,CAAA,CAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,cAAY,mBACZ,UACE,EAAY,GACR,6CACA,oDAGL,EAAY,KACX,CAAA,EAGN,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,iCACA,EAAW,kBAAoB,cAChC,UAJH,CAMG,GACC,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,2BACP,KAAK,SACL,QAAQ,YACR,QAAS,EACT,WAAY,EACZ,cACE,EAAA,EAAA,KAAC,EAAA,OAAD,CAAQ,cAAA,GAAY,UAAU,SAAS,YAAa,EAAK,CAAA,UAG1D,EAAE,EAAA,QAAQ,cAAc,CACb,CAAA,CACZ,MACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,EACE,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,gBACP,KAAK,SACL,QAAQ,YACR,QAAS,EACT,WAAY,WAEX,EAAE,EAAA,QAAQ,cAAc,CACb,CAAA,CACb,IACC,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,OAAO,sBACP,KAAK,SACL,QAAQ,YACR,YAtTkB,CAC5B,GAAI,CAAC,GAAU,CAAC,EAAQ,QAAS,OACjC,EAAS,KAAK,CACd,IAAM,EAAW,IAAI,SAAS,EAAQ,QAAQ,CACxC,EAAkB,EAAa,EAAS,CAC9C,GAAI,EAAiB,CACnB,EAAS,EAAgB,CACzB,OAEF,EAAO,EAAY,EAAS,CAAC,EA8SnB,WAAY,GAAoB,WAG5B,EADH,EACK,EAAA,QAAQ,cACR,EAAA,QAAQ,gBAAgB,CAClB,CAAA,EAEhB,EAAA,EAAA,MAAC,EAAA,YAAD,CACE,OAAO,gBACP,KAAK,SACL,QAAQ,UACR,WAAY,GAAoB,WAJlC,CAMG,IAAS,OAAS,EAAE,EAAA,QAAQ,wBAAwB,CACpD,IAAS,QAAU,EAAE,EAAA,QAAQ,yBAAyB,CAC3C,GACV,GACF,GACD"}