@openhands/agent-canvas 1.10.0 → 1.12.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 (531) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-B_bg5h9O.js} +1 -1
  5. package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-CzWS1DgR.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-hd2cAIZM.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +86 -0
  8. package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-D2J1dKVd.js} +1 -1
  9. package/build/assets/agent-settings-D_SVrWhI.js +1 -0
  10. package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-D70oJj2c.js} +1 -1
  12. package/build/assets/app-settings-D0OKHB3M.js +1 -0
  13. package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-C0SxWTnQ.js} +3 -3
  14. package/build/assets/{automation-export-CRq40mux.js → automation-export-BjQa_fT6.js} +1 -1
  15. package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-BzCNpljP.js} +1 -1
  16. package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-D9gs6ihu.js} +1 -1
  17. package/build/assets/{automations-list-CG4HKOTn.js → automations-list-dZg8zOCl.js} +1 -1
  18. package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/{backend-form-modal-B_lXjOGa.js → backend-form-modal-HwclKrUS.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-YI3k09Wr.js} +1 -1
  21. package/build/assets/{badge-C64c-7PO.js → badge-Dpn3-LTV.js} +1 -1
  22. package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
  24. package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
  25. package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-4CPdj3J3.js} +1 -1
  26. package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
  27. package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  28. package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CcSez21r.js} +1 -1
  29. package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
  30. package/build/assets/command-menu-BKOLj-TC.js +1 -0
  31. package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-DLQogFnB.js} +1 -1
  32. package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
  33. package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
  34. package/build/assets/{conversation-Csdxh9Xt.js → conversation-Cmyw9bFh.js} +4 -4
  35. package/build/assets/conversation-CvoGZ5vC.js +1 -0
  36. package/build/assets/conversation-panel-CvoGZ5vC.js +1 -0
  37. package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-CtgILxWF.js} +1 -1
  38. package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  39. package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  40. package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
  41. package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
  42. package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-EBn3ZtNP.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  45. package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-BZ3HYztk.js} +1 -1
  46. package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-Bnx32WAb.js} +1 -1
  47. package/build/assets/{files-tab-CLLG55-q.js → files-tab-D5zuU5TY.js} +1 -1
  48. package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
  49. package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
  50. package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-BerVamGl.js} +1 -1
  51. package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-zuKz2cwo.js} +1 -1
  52. package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B5VnMftu.js} +1 -1
  53. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +1 -0
  54. package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  55. package/build/assets/home-DqyeeFA_.js +1 -0
  56. package/build/assets/{home-BpZQkDWM.js → home-Y0aDou-a.js} +1 -1
  57. package/build/assets/{home-store-DM4qw1lF.js → home-store-Cubdq0uP.js} +1 -1
  58. package/build/assets/index-home-DqyeeFA_.js +1 -0
  59. package/build/assets/install-server-modal-DW6dSyGr.js +1 -0
  60. package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-CKydZrbH.js} +1 -1
  61. package/build/assets/{launch-C9uijypN.js → launch-c4GEP8oo.js} +1 -1
  62. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +27 -0
  63. package/build/assets/llm-settings-8eWBF3Ij.js +1 -0
  64. package/build/assets/llm-settings-D9ko42Pi.js +1 -0
  65. package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-B3K-97lP.js} +1 -1
  66. package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
  67. package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-DTCME_Pu.js} +1 -1
  68. package/build/assets/manifest-e1c3bc3b.js +1 -0
  69. package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-Ds7G5GZ8.js} +1 -1
  70. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  71. package/build/assets/markdown-renderer-DzvgdZey.js +8 -0
  72. package/build/assets/mcp-Da7wFU7A.js +9 -0
  73. package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-DSLou4n7.js} +1 -1
  74. package/build/assets/messages-B2l0qLVk.js +40 -0
  75. package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
  76. package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
  77. package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
  78. package/build/assets/npm-Cswluf6-.js +1 -0
  79. package/build/assets/{onboarding-5CZvRBbh.js → onboarding-BKbTYlW1.js} +1 -1
  80. package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-DrrGlEQq.js} +1 -1
  81. package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-DK8csGvK.js} +1 -1
  82. package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-D-mZ1I7n.js} +1 -1
  83. package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-CywqyfLK.js} +1 -1
  84. package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-vcE_jJCe.js} +1 -1
  85. package/build/assets/{providers-CeuhK46N.js → providers-CdrPPm0z.js} +1 -1
  86. package/build/assets/{proxy-CIGI9zQC.js → proxy-b4aqL4SX.js} +1 -1
  87. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +1 -0
  88. package/build/assets/{root-BQPNqNvD.js → root-CBBi6IAe.js} +2 -2
  89. package/build/assets/root-CRK9fOFd.css +1 -0
  90. package/build/assets/root-layout-BFN2rCOy.js +2 -0
  91. package/build/assets/{schema-field-z2vSLuLo.js → schema-field-Z-rMg9ti.js} +1 -1
  92. package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-m_cjygxR.js} +1 -1
  93. package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-BHF4fxML.js} +1 -1
  94. package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-aBGXtQhX.js} +1 -1
  95. package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
  96. package/build/assets/settings-CZPGNens.js +1 -0
  97. package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  98. package/build/assets/{settings-index-BECdgecg.js → settings-index-Dtlegd6s.js} +1 -1
  99. package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
  100. package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
  101. package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-CalzJP2l.js} +1 -1
  102. package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DfPYaxZJ.js} +1 -1
  103. package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
  104. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  105. package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-BIAcuORk.js} +1 -1
  106. package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
  107. package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  108. package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-C6HpQ55l.js} +1 -1
  109. package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  110. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  111. package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  112. package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  113. package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-Dt1V5X2p.js} +1 -1
  114. package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B-H0cCOP.js} +1 -1
  115. package/build/assets/skills-settings-DthdIDUb.js +2 -0
  116. package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
  117. package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-BTde81Iu.js} +1 -1
  118. package/build/assets/{terminal-DRc4rup7.js → terminal-DRrJo-cR.js} +1 -1
  119. package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
  120. package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
  121. package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DGyo0QvL.js} +1 -1
  122. package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-DrPzIKJF.js} +1 -1
  123. package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-B37XWDLq.js} +1 -1
  124. package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-BzE28H3x.js} +1 -1
  125. package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-U6HPjy50.js} +1 -1
  126. package/build/assets/{use-config-C3zGuUQI.js → use-config-DapX3pjC.js} +1 -1
  127. package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-CRf1dCm5.js} +1 -1
  128. package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-DcpT3RPw.js} +1 -1
  129. package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CHxqoHiN.js} +1 -1
  130. package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-zihHDbMW.js} +1 -1
  131. package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-6kWOW3ul.js} +1 -1
  132. package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-CqkR8kLE.js} +1 -1
  133. package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-CH9_EXQG.js} +1 -1
  134. package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-DIEurJ3D.js} +1 -1
  135. package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BmLzQjnC.js} +1 -1
  136. package/build/assets/use-settings-nav-items-DV9qgeu7.js +16 -0
  137. package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-salbPJxT.js} +1 -1
  138. package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-Dt-W6uNw.js} +1 -1
  139. package/build/assets/utils-DPQfkd-7.js +1 -0
  140. package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-oi54wEc1.js} +1 -1
  141. package/build/assets/wrench-B1_H-tL1.js +1 -0
  142. package/build/index.html +4 -4
  143. package/build/locales/ar/openhands.json +39 -2
  144. package/build/locales/ca/openhands.json +39 -2
  145. package/build/locales/de/openhands.json +39 -2
  146. package/build/locales/en/openhands.json +39 -2
  147. package/build/locales/es/openhands.json +39 -2
  148. package/build/locales/fr/openhands.json +39 -2
  149. package/build/locales/it/openhands.json +39 -2
  150. package/build/locales/ja/openhands.json +39 -2
  151. package/build/locales/ko-KR/openhands.json +39 -2
  152. package/build/locales/no/openhands.json +39 -2
  153. package/build/locales/pt/openhands.json +39 -2
  154. package/build/locales/tr/openhands.json +39 -2
  155. package/build/locales/uk/openhands.json +39 -2
  156. package/build/locales/zh-CN/openhands.json +39 -2
  157. package/build/locales/zh-TW/openhands.json +39 -2
  158. package/config/defaults.json +1 -1
  159. package/dist/api/agent-server-adapter.cjs +3 -3
  160. package/dist/api/agent-server-adapter.cjs.map +1 -1
  161. package/dist/api/agent-server-adapter.d.ts +32 -5
  162. package/dist/api/agent-server-adapter.js +120 -91
  163. package/dist/api/agent-server-adapter.js.map +1 -1
  164. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  165. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  166. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  167. package/dist/api/cloud/conversation-service.api.js +51 -47
  168. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  169. package/dist/api/conversation-file-upload.api.cjs +1 -1
  170. package/dist/api/conversation-file-upload.api.js +10 -10
  171. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  172. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  173. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  174. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  175. package/dist/api/event-service/event-service.api.cjs +1 -1
  176. package/dist/api/event-service/event-service.api.js +12 -12
  177. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  178. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  179. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  180. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  181. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  182. package/dist/api/open-hands.types.d.ts +1 -1
  183. package/dist/api/workspace-upload-path.cjs +1 -1
  184. package/dist/api/workspace-upload-path.js +8 -8
  185. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  186. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  187. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  192. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  193. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  194. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  195. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  196. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  197. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  198. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  199. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
  200. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  201. package/dist/components/features/chat/model-messages.cjs +1 -1
  202. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  203. package/dist/components/features/chat/model-messages.js +26 -25
  204. package/dist/components/features/chat/model-messages.js.map +1 -1
  205. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  206. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  207. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
  208. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +50 -53
  209. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  210. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  211. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  212. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  213. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  214. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  215. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  216. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  217. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  218. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  219. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  220. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  221. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  222. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  223. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  224. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  225. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  226. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  227. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  228. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  229. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  230. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  231. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  232. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  233. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  234. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  235. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  236. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  237. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  238. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  239. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  240. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  241. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  242. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  243. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  244. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  245. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  246. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  247. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  248. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  249. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  250. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  251. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  252. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  253. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  254. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  255. package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
  256. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  257. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  258. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  259. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  260. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  261. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  262. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  263. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  264. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  265. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  266. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  267. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  268. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  269. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  270. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  271. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  272. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  273. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
  274. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  275. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  276. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  277. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  278. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  279. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  280. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  281. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  282. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  283. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  284. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  285. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  286. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  287. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  288. package/dist/components/features/skills/extensions-navigation.js +9 -9
  289. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  290. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  291. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  292. package/dist/components/shared/modals/settings/model-selector.js +154 -98
  293. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  294. package/dist/config/defaults.cjs +1 -1
  295. package/dist/config/defaults.cjs.map +1 -1
  296. package/dist/config/defaults.js +1 -1
  297. package/dist/config/defaults.js.map +1 -1
  298. package/dist/constants/child-conversation.cjs +2 -0
  299. package/dist/constants/child-conversation.cjs.map +1 -0
  300. package/dist/constants/child-conversation.d.ts +29 -0
  301. package/dist/constants/child-conversation.js +6 -0
  302. package/dist/constants/child-conversation.js.map +1 -0
  303. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  304. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  305. package/dist/contexts/conversation-websocket-context.js +189 -188
  306. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  307. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  308. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  309. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  310. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  311. package/dist/hooks/chat/use-slash-command.js +61 -60
  312. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  313. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  314. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  315. package/dist/i18n/declaration.cjs +1 -1
  316. package/dist/i18n/declaration.cjs.map +1 -1
  317. package/dist/i18n/declaration.d.ts +38 -1
  318. package/dist/i18n/declaration.js +1 -1
  319. package/dist/i18n/declaration.js.map +1 -1
  320. package/dist/i18n/translation.cjs +2 -2
  321. package/dist/i18n/translation.cjs.map +1 -1
  322. package/dist/i18n/translation.js +644 -15
  323. package/dist/i18n/translation.js.map +1 -1
  324. package/dist/icons/docker.cjs +2 -0
  325. package/dist/icons/docker.cjs.map +1 -0
  326. package/dist/icons/docker.js +19 -0
  327. package/dist/icons/docker.js.map +1 -0
  328. package/dist/icons/npm.cjs +2 -0
  329. package/dist/icons/npm.cjs.map +1 -0
  330. package/dist/icons/npm.js +19 -0
  331. package/dist/icons/npm.js.map +1 -0
  332. package/dist/locales/ar/openhands.json +39 -2
  333. package/dist/locales/ca/openhands.json +39 -2
  334. package/dist/locales/de/openhands.json +39 -2
  335. package/dist/locales/en/openhands.json +39 -2
  336. package/dist/locales/es/openhands.json +39 -2
  337. package/dist/locales/fr/openhands.json +39 -2
  338. package/dist/locales/it/openhands.json +39 -2
  339. package/dist/locales/ja/openhands.json +39 -2
  340. package/dist/locales/ko-KR/openhands.json +39 -2
  341. package/dist/locales/no/openhands.json +39 -2
  342. package/dist/locales/pt/openhands.json +39 -2
  343. package/dist/locales/tr/openhands.json +39 -2
  344. package/dist/locales/uk/openhands.json +39 -2
  345. package/dist/locales/zh-CN/openhands.json +39 -2
  346. package/dist/locales/zh-TW/openhands.json +39 -2
  347. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  348. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  349. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  354. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  355. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  356. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  357. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  358. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  359. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  360. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  361. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  362. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  363. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  364. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  365. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  366. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  367. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  368. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  369. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  370. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  371. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  372. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  373. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  374. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  375. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  376. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  377. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  378. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  379. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  380. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  381. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  382. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  383. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  384. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  385. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  386. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  387. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  388. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  389. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  390. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  391. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  392. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  393. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  394. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  395. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  396. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  397. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  398. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  399. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  400. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  401. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  402. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  403. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  404. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  405. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  406. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  410. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  411. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  412. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  413. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  414. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  415. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  417. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  418. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  419. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  420. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  421. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  422. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  423. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  424. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  425. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  426. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  427. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  428. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  429. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  430. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  431. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  432. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  433. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  434. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  435. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  436. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  437. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  438. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  439. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  440. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  441. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  442. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  443. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  444. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  445. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  446. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  447. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  448. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  449. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  450. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  451. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  452. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  453. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  454. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  455. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  456. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  457. package/dist/package.cjs +1 -1
  458. package/dist/package.cjs.map +1 -1
  459. package/dist/package.js +6 -3
  460. package/dist/package.js.map +1 -1
  461. package/dist/routes/app-settings.cjs +1 -1
  462. package/dist/routes/app-settings.cjs.map +1 -1
  463. package/dist/routes/app-settings.js +94 -93
  464. package/dist/routes/app-settings.js.map +1 -1
  465. package/dist/routes/llm-settings.cjs +1 -1
  466. package/dist/routes/llm-settings.cjs.map +1 -1
  467. package/dist/routes/llm-settings.js +131 -119
  468. package/dist/routes/llm-settings.js.map +1 -1
  469. package/dist/services/child-conversation-launch.cjs +2 -0
  470. package/dist/services/child-conversation-launch.cjs.map +1 -0
  471. package/dist/services/child-conversation-launch.d.ts +41 -0
  472. package/dist/services/child-conversation-launch.js +182 -0
  473. package/dist/services/child-conversation-launch.js.map +1 -0
  474. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  475. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  476. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  477. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  478. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  479. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  480. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  481. package/dist/types/agent-server/type-guards.cjs +1 -1
  482. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  483. package/dist/types/agent-server/type-guards.d.ts +8 -1
  484. package/dist/types/agent-server/type-guards.js +4 -3
  485. package/dist/types/agent-server/type-guards.js.map +1 -1
  486. package/dist/types/automation.d.ts +14 -0
  487. package/dist/utils/custom-toast-handlers.cjs +1 -1
  488. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  489. package/dist/utils/custom-toast-handlers.js +18 -1
  490. package/dist/utils/custom-toast-handlers.js.map +1 -1
  491. package/dist/utils/format-model-name.cjs +1 -1
  492. package/dist/utils/format-model-name.cjs.map +1 -1
  493. package/dist/utils/format-model-name.d.ts +11 -0
  494. package/dist/utils/format-model-name.js +11 -3
  495. package/dist/utils/format-model-name.js.map +1 -1
  496. package/package.json +6 -3
  497. package/scripts/brand-dev-electron.mjs +244 -0
  498. package/scripts/check-translation-completeness.cjs +4 -0
  499. package/scripts/generate-icons.mjs +109 -0
  500. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
  501. package/build/assets/agent-settings-nmO-KSXr.js +0 -1
  502. package/build/assets/app-settings-9ok42bV6.js +0 -1
  503. package/build/assets/command-menu-CA3IjGNc.js +0 -1
  504. package/build/assets/conversation-B6t6EiVp.js +0 -1
  505. package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
  506. package/build/assets/copy-DaHuDtG4.js +0 -1
  507. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
  508. package/build/assets/home-OEx0XtfP.js +0 -1
  509. package/build/assets/index-home-OEx0XtfP.js +0 -1
  510. package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
  511. package/build/assets/list-filter-C86CBRDE.js +0 -1
  512. package/build/assets/llm-not-configured-banner-DrBrhfN0.js +0 -27
  513. package/build/assets/llm-settings-CRsLqxgu.js +0 -1
  514. package/build/assets/llm-settings-RBm_3kNm.js +0 -1
  515. package/build/assets/manifest-c352d453.js +0 -1
  516. package/build/assets/map-provider-CXU6issd.js +0 -1
  517. package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
  518. package/build/assets/mcp-DD4hPTRE.js +0 -9
  519. package/build/assets/messages-Dt77e0qi.js +0 -40
  520. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
  521. package/build/assets/root-BeuHFY2s.css +0 -1
  522. package/build/assets/root-layout-Dl_2CDoq.js +0 -3
  523. package/build/assets/settings-Co-M5bK9.js +0 -1
  524. package/build/assets/sidebar-store-B04sX8aP.js +0 -1
  525. package/build/assets/skills-settings-DnbIu2eO.js +0 -2
  526. package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
  527. package/build/assets/utils-BX9XJ0IE.js +0 -1
  528. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  529. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  530. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  531. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Generate electron/build-resources/icon.ico and icon.icns from the
3
+ * 1024×1024 icon.png master. Run after changing icon.png:
4
+ *
5
+ * npm run generate-icons
6
+ *
7
+ * The outputs are COMMITTED — electron-builder auto-discovers them in
8
+ * directories.buildResources and uses them as-is. We don't rely on
9
+ * electron-builder's own PNG→ICO conversion because it emits a single
10
+ * 256×256 PNG-compressed entry, which several Windows shell surfaces
11
+ * (Explorer small views, NSIS, taskbar) can't render — they fall back to
12
+ * the default Electron icon. png2icons with forWinExe=true stores the
13
+ * 48/32/24/16 entries as classic BMP, which is what Windows expects.
14
+ */
15
+ import { readFileSync, writeFileSync } from "node:fs";
16
+ import { dirname, join } from "node:path";
17
+ import { fileURLToPath, pathToFileURL } from "node:url";
18
+ import png2icons from "png2icons";
19
+
20
+ // Standard Windows app-icon sizes (Microsoft recommends 16/24/32/48/256;
21
+ // 64/128 cover intermediate DPI scaling).
22
+ export const REQUIRED_ICO_SIZES = [16, 24, 32, 48, 64, 128, 256];
23
+
24
+ // The ten standard macOS representations (16 → 512@2x). is32/il32 (+ the
25
+ // l8mk/s8mk masks png2icons emits alongside) are the legacy non-retina
26
+ // 16/32 forms; ic07–ic14 cover 128 → 512@2x.
27
+ export const REQUIRED_ICNS_TYPES = [
28
+ "is32",
29
+ "il32",
30
+ "ic07",
31
+ "ic08",
32
+ "ic09",
33
+ "ic10",
34
+ "ic11",
35
+ "ic12",
36
+ "ic13",
37
+ "ic14",
38
+ ];
39
+
40
+ /**
41
+ * Parse an ICO buffer's ICONDIR into [{size, isPng}] — isPng distinguishes
42
+ * PNG-compressed payloads from classic BMP entries.
43
+ */
44
+ export function listIcoEntries(ico) {
45
+ const entries = [];
46
+ for (let i = 0; i < ico.readUInt16LE(4); i++) {
47
+ const entry = 6 + i * 16;
48
+ const width = ico[entry];
49
+ const offset = ico.readUInt32LE(entry + 12);
50
+ entries.push({
51
+ size: width === 0 ? 256 : width,
52
+ isPng: ico.readUInt32BE(offset) === 0x89504e47, // \x89PNG
53
+ });
54
+ }
55
+ return entries;
56
+ }
57
+
58
+ /** List the 4-char OSType of every chunk in an ICNS buffer. */
59
+ export function listIcnsTypes(icns) {
60
+ const types = [];
61
+ for (let p = 8; p < icns.length; p += icns.readUInt32BE(p + 4)) {
62
+ types.push(icns.toString("ascii", p, p + 4));
63
+ }
64
+ return types;
65
+ }
66
+
67
+ /**
68
+ * Convert a PNG buffer into { ico, icns } buffers, asserting the emitted
69
+ * size sets so a png2icons upgrade that changes them fails loudly.
70
+ */
71
+ export function generateIcons(input) {
72
+ // forWinExe: true → 48/32/24/16 stored as classic BMP entries (required
73
+ // by Windows shell small-icon surfaces), ≥64 PNG-compressed. 0 = lossless.
74
+ const ico = png2icons.createICO(input, png2icons.BICUBIC2, 0, false, true);
75
+ const icns = png2icons.createICNS(input, png2icons.BICUBIC2, 0);
76
+ if (!ico || !icns) throw new Error("png2icons failed to convert icon.png");
77
+
78
+ const icoSizes = listIcoEntries(ico).map((entry) => entry.size);
79
+ for (const size of REQUIRED_ICO_SIZES) {
80
+ if (!icoSizes.includes(size)) throw new Error(`icon.ico missing ${size}px`);
81
+ }
82
+ const icnsTypes = listIcnsTypes(icns);
83
+ for (const type of REQUIRED_ICNS_TYPES) {
84
+ if (!icnsTypes.includes(type)) throw new Error(`icon.icns missing ${type}`);
85
+ }
86
+
87
+ return { ico, icns };
88
+ }
89
+
90
+ const isMainModule =
91
+ process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
92
+
93
+ if (isMainModule) {
94
+ const resDir = join(
95
+ dirname(fileURLToPath(import.meta.url)),
96
+ "..",
97
+ "electron",
98
+ "build-resources",
99
+ );
100
+ const { ico, icns } = generateIcons(readFileSync(join(resDir, "icon.png")));
101
+ writeFileSync(join(resDir, "icon.ico"), ico);
102
+ writeFileSync(join(resDir, "icon.icns"), icns);
103
+ console.log(
104
+ `icon.ico (${listIcoEntries(ico)
105
+ .map((entry) => entry.size)
106
+ .join("/")}px, ${ico.length} B), ` +
107
+ `icon.icns (${listIcnsTypes(icns).join(",")}, ${icns.length} B)`,
108
+ );
109
+ }
@@ -1,41 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/secrets-service-DGUNlwQd.js","assets/rolldown-runtime-Cyuzqnbw.js","assets/active-backend-context-B0wI7OzM.js","assets/vendor-styling-Ck5D_A2Q.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js","assets/utils-BX9XJ0IE.js","assets/proxy-CIGI9zQC.js"])))=>i.map(i=>d[i]);
2
- import{xt as e}from"./vendor-styling-Ck5D_A2Q.js";import{_ as t,c as n,f as r,g as i,y as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js";import{$ as o,Q as s,T as c,U as l,ct as u,ht as ee,lt as d,nt as f,q as p,yt as m}from"./active-backend-context-B0wI7OzM.js";import{C as h}from"./utils-BX9XJ0IE.js";import{r as g,t as _}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js";import{t as v}from"./proxy-CIGI9zQC.js";import{t as y}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js";import{t as b}from"./settings-CWFxymAf.js";import{t as te}from"./settings-service.api-Dz9cZyvx.js";import{t as ne}from"./profiles-service.api-Dl20_2IM.js";import{f as x,o as S,s as C}from"./acp-providers-DLe_gVDY.js";import{d as w,f as T,r as re}from"./llm-subscription-DTqtBCWz.js";import{t as ie}from"./llm-subscription-service-DwjJ8-_X.js";var E=[];for(let e=0;e<256;++e)E.push((e+256).toString(16).slice(1));function ae(e,t=0){return(E[e[t+0]]+E[e[t+1]]+E[e[t+2]]+E[e[t+3]]+`-`+E[e[t+4]]+E[e[t+5]]+`-`+E[e[t+6]]+E[e[t+7]]+`-`+E[e[t+8]]+E[e[t+9]]+`-`+E[e[t+10]]+E[e[t+11]]+E[e[t+12]]+E[e[t+13]]+E[e[t+14]]+E[e[t+15]]).toLowerCase()}var oe=new Uint8Array(16);function se(){return crypto.getRandomValues(oe)}function D(e,t,n){return!t&&!e&&crypto.randomUUID?crypto.randomUUID():ce(e,t,n)}function ce(e,t,n){e||={};let r=e.random??e.rng?.()??se();if(r.length<16)throw Error(`Random bytes length must be >= 16`);if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){if(n||=0,n<0||n+16>t.length)throw RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[n+e]=r[e];return t}return ae(r)}var O=new Map;function le(e){return/^([/\\]|[a-zA-Z]:[/\\])/.test(e)}function ue(e,t){return`${e.replace(/[/\\]+$/,``)}/${t.replace(/^[/\\]+/,``)}`}async function k(e={}){let t=o(e),n=t.host,r=O.get(n);if(r)return r;let a=(async()=>{let{home:e}=await new i(t).getHome();if(!e||typeof e!=`string`)throw Error(`Agent server returned an empty home directory`);return e.replace(/[/\\]+$/,``)})();O.set(n,a);try{return await a}catch(e){throw O.delete(n),e}}async function de(e,t={}){let n=e.replace(/[/\\]+$/,``);return n?le(n)?n:ue(await k(t),n):k(t)}var A=`openhands-agent-server-conversation-metadata`,fe=e=>({source:e.source,ref:e.ref??null,repo_path:e.repo_path??null}),j=()=>{if(typeof window>`u`)return{};try{let e=window.localStorage.getItem(A);if(!e)return{};let t=JSON.parse(e);return!t||typeof t!=`object`?{}:t}catch{return{}}},pe=e=>{if(!(typeof window>`u`)){if(Object.keys(e).length===0){window.localStorage.removeItem(A);return}window.localStorage.setItem(A,JSON.stringify(e))}},M=e=>j()[e]??null,N=(e,t)=>{let n=j();n[e]=t,pe(n)},P=e=>{let t=j();e in t&&(delete t[e],pe(t))};function me(e){if(!e?.id)return e;let t=M(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function F(){let e=u().backend;if(e.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return e}async function he(e=20,t){let n=F(),r=new URLSearchParams;r.set(`limit`,String(e)),t&&r.set(`page_id`,t),r.set(`sort_order`,`UPDATED_AT_DESC`);let i=await v({backend:n,method:`GET`,path:`/api/v1/app-conversations/search?${r.toString()}`});return{items:(i?.items??[]).map(e=>me(e)),next_page_id:i?.next_page_id??null}}async function I(e){if(e.length===0)return[];let t=F(),n=new URLSearchParams;for(let t of e)n.append(`ids`,t);return(await v({backend:t,method:`GET`,path:`/api/v1/app-conversations?${n.toString()}`})??[]).map(me)}async function ge(e){return await v({backend:F(),method:`POST`,path:`/api/v1/app-conversations`,body:e,headers:c})}async function _e(e){return v({backend:F(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function ve(e){await v({backend:F(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function ye(e,t){return await v({backend:F(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:t}})}async function be(e){await v({backend:F(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function xe(e){await v({backend:F(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function Se(e,t){let n=F(),r=new URLSearchParams;return r.append(`file_path`,t),await v({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${r.toString()}`})??``}async function Ce(e){let t=F(),n=new URLSearchParams;return n.set(`ids`,e),(await v({backend:t,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${n.toString()}`}))?.[0]??null}function we(e){return e.kind===`cloud`&&e.authMode===`cookie`||!e.apiKey?{}:e.kind===`cloud`?{Authorization:`Bearer ${e.apiKey}`}:{"X-Session-API-Key":e.apiKey}}var Te=`canvas_ui`,L=`canvas_ui_control`,Ee=`ClientAction_${L}`,De={name:L,description:`The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.
3
-
4
- They will NOT see the files you wrote, the terminal output, or the browser
5
- unless you call this tool to switch the right-side panel to the relevant
6
- tab. Call this every time you finish work that produces something the user
7
- should look at — don't rely on them noticing on their own.
8
-
9
- When to call (pick the most specific option that matches your last action):
10
-
11
- * You wrote or modified a single file (ANY language, ANY size — including
12
- small scripts like a hello-world bash file) →
13
- command="navigate_to_file", path=<workspace-relative path of that file>
14
-
15
- * You generated an HTML page, image, SVG, PDF, markdown report, or other
16
- previewable artifact →
17
- command="show_preview", path=<that file>
18
-
19
- * You finished editing multiple files in one logical step →
20
- command="open_tab", tab="files"
21
- (The Files tab automatically renders a diff view when the workspace has
22
- uncommitted git changes, which covers the "highlight changes" case.)
23
-
24
- * You ran a long-running terminal command, or one whose output the user
25
- should inspect →
26
- command="open_tab", tab="terminal"
27
-
28
- * You browsed to a URL the user should see →
29
- First call browser_get_state(include_screenshot=true) after your final
30
- browser interaction so Agent Canvas has a screenshot to display, then call
31
- command="open_tab", tab="browser"
32
- (browser_navigate alone only updates the URL; without browser_get_state,
33
- the Browser tab will open without a screenshot.)
34
-
35
- Call this BEFORE writing your chat-message summary of the change, so the
36
- artifact is visible while the user reads what you did. One canvas_ui_control
37
- call per logical step is enough — don't repeat it for the same file or tab in
38
- the same turn.`,parameters:{type:`object`,additionalProperties:!1,properties:{command:{type:`string`,enum:[`navigate_to_file`,`open_tab`,`show_preview`],description:`UI command to dispatch.`},path:{type:`string`,description:`Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise.`},tab:{type:`string`,enum:[`files`,`browser`,`vscode`,`terminal`,`planner`,`tasklist`],description:`Tab to open. Required for open_tab; ignored otherwise.`}},required:[`command`]},annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},Oe=[`terminal`,`file_editor`,`task_tracker`],R=`browser_tool_set`,z=`task_tool_set`;function ke(){return!0}function B(e){if(typeof e==`string`){let t=e.trim();if(!t)return null;try{return B(JSON.parse(t))}catch{return null}}if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return!t.services||typeof t.services!=`object`?null:t}async function Ae(){let e;try{e=o({timeout:3e3})}catch{return null}let t=B(l({host:e.host})?.runtime_services);if(t)return t;try{return B((await new a(e).getServerInfo()).runtime_services)}catch{return null}}function je(e){let t=B(e);if(!t?.services)return;let n=[];n.push(`<RUNTIME_SERVICES>`),t.mode?n.push(`You are running inside an agent-canvas dev stack started in '${t.mode}' mode.`):n.push(`You are running inside an agent-canvas dev stack.`),n.push(`The following services are reachable from your sandbox. URLs are written`,`from your point of view (i.e., as you should curl/fetch them).`,``);let{agent_server:r,ingress:i,automation:a}=t.services,{frontend:o}=t.services;r?.url_from_agent&&n.push(`* Agent Server (you): ${r.url_from_agent}`,` ${r.description??`The agent-server hosting your tool calls.`}`),i?.url_from_agent&&n.push(`* Ingress: ${i.url_from_agent}`,` ${i.description??`Unified entry point for browser-facing traffic.`}`),o?.url_from_agent&&n.push(`* Frontend: ${o.url_from_agent}`,` ${o.description??`Frontend dev server.`}`),a?.url_from_agent?(n.push(`* Automation backend: ${a.url_from_agent}`,` ${a.description??`OpenHands Automations service.`}`),a.docs_url&&n.push(` Docs: ${a.docs_url}`),a.openapi_url&&n.push(` OpenAPI: ${a.openapi_url}`),a.auth_env_var&&n.push(` Auth: header 'X-Session-API-Key: $${a.auth_env_var}'`)):n.push(`* Automation backend: not running in this dev mode (skip /api/automation calls).`);let s=r?.url_from_agent;return n.push(``,`Trust this block over guessing: do not assume any other URLs are running.`),s&&n.push(`In particular, ${s} inside your sandbox is the Agent Server`,`you are running inside of — NOT the automation backend.`),n.push(`</RUNTIME_SERVICES>`),n.join(`
39
- `)}function Me(e){let{host:t}=o();return`${t}/api/conversations/${e}`}function V(e){return`Conversation ${e.slice(0,5)}`}function H(e){let t=M(e.id),n=e.agent?.kind===`ACPAgent`,r=n?e.tags?.acpserver??e.agent?.acp_server??null:null;return{id:e.id,created_by_user_id:null,selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:t?.active_profile??null,title:e.title?.trim()?e.title:V(e.id),trigger:null,pr_number:[],agent_kind:n?`acp`:`openhands`,acp_server:r,tags:e.tags??null,launched_agent_profile:e.launched_agent_profile??null,llm_model:n?x({runtimeName:e.current_model_name,runtimeId:e.current_model_id,configured:e.agent?.acp_model,sdkLlm:e.agent?.llm?.model}):e.agent?.llm?.model??b.llm_model,metrics:e.metrics?{accumulated_cost:e.metrics.accumulated_cost??null,max_budget_per_task:e.metrics.max_budget_per_task??null,accumulated_token_usage:e.metrics.accumulated_token_usage?{prompt_tokens:e.metrics.accumulated_token_usage.prompt_tokens??0,completion_tokens:e.metrics.accumulated_token_usage.completion_tokens??0,cache_read_tokens:e.metrics.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:e.metrics.accumulated_token_usage.cache_write_tokens??0,context_window:e.metrics.accumulated_token_usage.context_window??0,per_turn_token:e.metrics.accumulated_token_usage.per_turn_token??0}:null}:null,created_at:e.created_at,updated_at:e.updated_at,execution_status:e.execution_status??h.IDLE,sandbox_status:e.sandbox_status??null,conversation_url:Me(e.id),session_api_key:o().apiKey??null,sandbox_id:null,workspace:{working_dir:e.workspace?.working_dir??m()},public:!1,sub_conversation_ids:[]}}function Ne(e){return{items:e.items.map(H),next_page_id:e.next_page_id??null}}var U=`acpserver`,Pe=new Set([U]);function Fe(e){return e?Object.entries(e).filter(([e])=>!Pe.has(e)).sort(([e],[t])=>e.localeCompare(t)):[]}var Ie=`gAAAAA`,Le=new Set([`schema_version`,`agent_settings`,`workspace`,`conversation_id`,`initial_message`,`plugins`]);function W(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:structuredClone(e)}function G(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function K(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function q(e){return typeof e==`string`?e.startsWith(Ie):Array.isArray(e)?e.some(q):K(e)?Object.values(e).some(q):!1}function Re(e){return K(e)?Object.values(e).some(q):!1}function ze(e){return e.confirmation_mode===!0?e.security_analyzer===`llm`?{kind:`ConfirmRisky`,threshold:`HIGH`,confirm_unknown:!0}:{kind:`AlwaysConfirm`}:{kind:`NeverConfirm`}}function Be(e){switch(e.security_analyzer){case`llm`:return{kind:`LLMSecurityAnalyzer`};case`pattern`:return{kind:`PatternSecurityAnalyzer`};case`policy_rail`:return{kind:`PolicyRailSecurityAnalyzer`};default:return}}function Ve(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&typeof e.name==`string`}function J(e,t){return e===R?ke()&&p(e):e===z?t.enable_sub_agents===!0&&p(e):!0}function He(e){let t=new Map;for(let n of Oe)J(n,e)&&t.set(n,{name:n,params:{}});for(let n of[R,z])J(n,e)&&t.set(n,{name:n,params:{}});let n=e.tools;if(Array.isArray(n)&&n.every(e=>Ve(e)))for(let r of n)J(r.name,e)&&t.set(r.name,{name:r.name,params:W(r.params)});return Array.from(t.values())}function Ue(e,t){let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length===0?null:{role:`user`,content:[{type:`text`,text:n.join(`
40
-
41
- `)}],run:!0}}function We(){return y.map(e=>{let t=e.triggers?.length>0?{type:`keyword`,keywords:e.triggers}:null,n=`/home/runner/work/OpenHands/OpenHands/node_modules/@openhands/extensions/skills/${e.name}/SKILL.md`;return{name:e.name,content:e.content,trigger:t,source:n,description:e.description??null,is_agentskills_format:!0,...e.license?{license:e.license}:{},...e.compatibility?{compatibility:e.compatibility}:{}}})}function Ge(e,t,n=[]){let r=je(t),i=W(e.agent_context),a=Array.isArray(i.skills)?i.skills:[],o=new Set(n),s=[...a,...We()].filter(e=>typeof e.name!=`string`||!o.has(e.name));return{...i,skills:s,load_public_skills:!1,load_user_skills:!0,load_project_skills:!0,...r?{system_message_suffix:r}:{}}}function Ke(e){return W(e.agent_settings).agent_kind===`acp`}function qe(e){let t=W(e.agent_settings).acp_server;return typeof t==`string`&&t.length>0?t:void 0}function Je(e){let t=e.acp_command;if(!(Array.isArray(t)&&t.length===0)&&t!==void 0)return t;let n=C(typeof e.acp_server==`string`?e.acp_server:void 0);return n?[...n.default_command]:t}function Ye(e,t){let n=W(e.agent_settings),r={agent_kind:`acp`,agent_context:Ge(n,t,e.disabled_skills)};for(let e of _){if(e===`acp_model`||e===`acp_env`)continue;let t=e===`acp_command`?Je(n):n[e];t!=null&&(r[e]=t)}let i=W(n.mcp_config);Object.keys(i).length>0&&(r.mcp_config=i);let a=typeof n.acp_server==`string`?n.acp_server:void 0,o=x({configured:n.acp_model,providerDefault:S(a)});return o&&(r.acp_model=o),r}function Xe(e,t){let n=W(e.agent_settings),r=W(n.llm);r.model=typeof r.model==`string`&&r.model.trim().length>0?r.model:b.llm_model,r.stream=!0;let i=G(r.api_key);i?r.api_key=i:delete r.api_key;let a=G(r.base_url);a?r.base_url=a:delete r.base_url,T(r)?(r.auth_type=re,r.subscription_vendor=w,delete r.api_key,delete r.base_url):(delete r.auth_type,delete r.subscription_vendor);let o=W(n.mcp_config);Object.keys(o).length===0&&delete n.mcp_config,delete n.acp_server;for(let e of _)delete n[e];return delete n.acp_env,{...n,llm:r,agent_context:Ge(n,t,e.disabled_skills),tools:He(n)}}function Ze(e,t){return Ke(e)?Ye(e,t):Xe(e,t)}function Qe(e){let{settings:t,query:n,conversationInstructions:r,plugins:i,workingDir:a}=e,o=W(t.conversation_settings),s=Ue(n,r);return Le.forEach(e=>delete o[e]),{...o,workspace:{kind:`LocalWorkspace`,working_dir:a??m()},...s?{initial_message:s}:{},...i?.length?{plugins:i.map(e=>({source:e.source,...e.ref?{ref:e.ref}:{},...e.repo_path?{repo_path:e.repo_path}:{}}))}:{}}}function $e(e){let t=e.encryptedAgentSettings?{...e.settings,agent_settings:e.encryptedAgentSettings}:e.settings,n=Ke(t),r=e.agentProfileId?e.agentProfileKind:n?`acp`:`openhands`,i=Ze(t,e.runtimeServicesInfo),a=n?qe(t):void 0,o=Qe(e.encryptedConversationSettings?{...e,settings:{...e.settings,conversation_settings:e.encryptedConversationSettings}}:e),s={...e.agentProfileId?{agent_profile_id:e.agentProfileId}:{agent_settings:i},workspace:o.workspace,client_tools:r===`openhands`?[De]:[],confirmation_policy:ze(o),max_iterations:typeof o.max_iterations==`number`?o.max_iterations:500,stuck_detection:!0,autotitle:!0,...e.titleLlmProfile?{title_llm_profile:e.titleLlmProfile}:{},worktree:e.worktree??!0};!e.agentProfileId&&a&&(s.tags={[U]:a}),!e.agentProfileId&&e.secretsEncrypted&&(!n||Re(i.mcp_config))&&(s.secrets_encrypted=!0),e.conversationId&&(s.conversation_id=e.conversationId);let c=Be(o);c&&(s.security_analyzer=c),o.initial_message&&(s.initial_message=o.initial_message),o.plugins&&(s.plugins=o.plugins),o.hook_config&&(s.hook_config=o.hook_config);let l={...o.tool_module_qualnames??{}};if(delete l[Te],delete l[L],Object.keys(l).length>0&&(s.tool_module_qualnames=l),o.agent_definitions&&(s.agent_definitions=o.agent_definitions),e.customSecrets&&e.customSecrets.length>0){let t=d(),n=t?we(t):{},r={};for(let t of e.customSecrets){let e={kind:`LookupSecret`,url:`/api/settings/secrets/${encodeURIComponent(t.name)}`,description:t.description};Object.keys(n).length>0&&(e.headers=n),r[t.name]=e}s.secrets=r}return s}var et=`Connect your ChatGPT subscription before starting a conversation with this LLM profile.`;async function tt(e){if(T(W(e.llm))&&!(await ie.getOpenAIStatus()).connected)throw Error(et)}async function nt(t){let{SecretsService:n}=await e(async()=>{let{SecretsService:e}=await import(`./secrets-service-DGUNlwQd.js`).then(e=>e.n);return{SecretsService:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8])),[r,i,a]=await Promise.all([te.getSettingsForConversation(),n.getSecrets(),Ae()]),{agentSettings:o,conversationSettings:s,secretsEncrypted:c}=r;return t.agentProfileId||await tt(o),$e({...t,encryptedAgentSettings:o,encryptedConversationSettings:s,secretsEncrypted:c,customSecrets:i,runtimeServicesInfo:a})}function rt(){return{hooks:[]}}function it(e,t){if(!t)return;let n=new Set(t.profiles.map(e=>e.name));if(e&&n.has(e))return e;if(t.active_profile&&n.has(t.active_profile))return t.active_profile}var at=`1970-01-01T00:00:00.000Z`,ot=300*1e3,st=`Unable to load conversations because the selected agent server returned data this UI does not understand. Check the backend URL/session key and update the agent server if needed.`;function Y(){return Error(st)}function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ct(e){return typeof e==`number`?e:null}function Z(e){return typeof e==`number`?e:0}function Q(e){return typeof e==`string`?e:null}function lt(e,t,n){let r=e[t]??e[n];return typeof r==`string`&&r.trim()?r:at}function ut(e){return X(e)?{prompt_tokens:Z(e.prompt_tokens),completion_tokens:Z(e.completion_tokens),cache_read_tokens:Z(e.cache_read_tokens),cache_write_tokens:Z(e.cache_write_tokens),context_window:Z(e.context_window),per_turn_token:Z(e.per_turn_token)}:null}function dt(e){return X(e)?{accumulated_cost:ct(e.accumulated_cost),max_budget_per_task:ct(e.max_budget_per_task),accumulated_token_usage:ut(e.accumulated_token_usage)}:null}function ft(e){if(!X(e))return null;let t=X(e.llm)?{model:Q(e.llm.model)}:null;return{kind:Q(e.kind),acp_server:Q(e.acp_server),acp_model:Q(e.acp_model),llm:t}}function pt(e){return X(e)?{working_dir:Q(e.working_dir)}:null}function mt(e){if(!X(e))return null;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function ht(e){if(!X(e))return null;let{agent_profile_id:t,revision:n}=e;return typeof t!=`string`||typeof n!=`number`?null:{agent_profile_id:t,revision:n}}function gt(e){if(!e.startsWith(`/`))return null;let t=[];for(let n of e.split(`/`))if(n&&n!==`.`)if(n===`..`){if(!t.length)return null;t.pop()}else t.push(n);return`/${t.join(`/`)}`}function _t(e,t){let n=gt(e),r=gt(t);if(!n||!r||n!==r&&!n.startsWith(`${r}/`))throw Error(`Conversation file path must stay inside the workspace`);return n}function vt(e){if(!X(e)||typeof e.id!=`string`||!e.id.trim())throw Y();return{id:e.id.trim(),title:Q(e.title),created_at:lt(e,`created_at`,`createdAt`),updated_at:lt(e,`updated_at`,`updatedAt`),execution_status:Q(e.execution_status),sandbox_status:Q(e.sandbox_status),metrics:dt(e.metrics),agent:ft(e.agent),workspace:pt(e.workspace),tags:mt(e.tags),launched_agent_profile:ht(e.launched_agent_profile),current_model_id:Q(e.current_model_id),current_model_name:Q(e.current_model_name)}}function $(e){if(!Array.isArray(e))throw Y();return e.map(vt)}function yt(e){if(Array.isArray(e))return{items:$(e),next_page_id:null};if(!X(e))throw Y();return{items:$(e.items),next_page_id:typeof e.next_page_id==`string`?e.next_page_id:null}}var bt=new Set([`idle`,`running`,`paused`,`waiting_for_confirmation`,`finished`,`error`,`stuck`]);function xt(e){let t=e??`idle`;return bt.has(t)?t:`idle`}function St(e,t){if(!e)throw Error(`Conversation ${t} was not found`);return e}var Ct=class{static async sendMessage(e,n,r){let i=u().backend,a=r?.conversationUrl??null,s=r?.sessionApiKey??null;if(i.kind===`cloud`){if(!a||!s){let[t]=await I([e]);a=t?.conversation_url?.trim()??null,s=t?.session_api_key?.trim()??null}if(!a||!s)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return await v({backend:i,method:`POST`,hostOverride:f(a),path:`/api/conversations/${e}/events`,body:{...n,run:!0},authMode:`session-api-key`,sessionApiKey:s}),n}return await new t(o({conversationUrl:a,sessionApiKey:s})).sendEvent(e,n,{run:!0}),n}static async createConversation(e,n,r,i,a,c,l,f,p,m,h){if(u().backend.kind===`cloud`)return ge({initial_message:e?{role:`user`,content:[{type:`text`,text:e}]}:null,title:n??null,selected_repository:i?.selected_repository??null,selected_branch:i?.selected_branch??null,git_provider:i?.git_provider??null,plugins:r??null,parent_conversation_id:l??null,agent_type:f,sandbox_id:p??null,agent_profile_id:m??null});let[g,_]=await Promise.all([te.getSettings(),ne.listProfiles().catch(()=>void 0)]),v=it(g.title_llm_profile,_),y=D(),b=await de(a??ee(y)),x=c??(a?`local_repo`:`new_worktree`),S=await nt({settings:g,query:e,conversationInstructions:n,plugins:r,conversationId:y,workingDir:b,worktree:x===`new_worktree`,agentProfileId:m,agentProfileKind:h,titleLlmProfile:v}),C=await new t(o({timeout:ot})).createConversation(S),w=d();if(!w)throw new s;return(i?.selected_repository||a)&&N(C.id,{selected_repository:i?.selected_repository??null,selected_branch:i?.selected_branch??null,git_provider:i?.git_provider??null,selected_workspace:a??null,workspace_mode:x}),{id:C.id,created_by_user_id:null,status:`READY`,detail:null,app_conversation_id:C.id,agent_server_url:w.host,request:{initial_message:S.initial_message,plugins:r??null},created_at:C.created_at,updated_at:C.updated_at}}static async getStartTask(e){return u().backend.kind===`cloud`?Ce(e):null}static async getVSCodeUrl(e,t,r){let i=await this.resolveConversationWorkingDir(e);return{vscode_url:await new n(o({conversationUrl:t,sessionApiKey:r})).getUrl({baseUrl:typeof window<`u`?window.location.origin:void 0,workspaceDir:i})}}static async resolveConversationWorkingDir(e){let[t]=await this.batchGetAppConversations([e]);return t?.workspace?.working_dir??m()}static async batchGetAppConversations(e){return e.length===0?[]:u().backend.kind===`cloud`?I(e):$(await new t(o()).getConversations(e)).map(e=>H(e))}static async updateConversationPublicFlag(e,t){if(u().backend.kind!==`cloud`)throw Error(`Public sharing requires a cloud backend.`);return ye(e,t)}static async updateConversationRepository(e,t,n,r){t?N(e,{...M(e)??{},selected_repository:t,selected_branch:n??null,git_provider:r??null}):P(e);let[i]=await this.batchGetAppConversations([e]);return St(i,e)}static async readConversationFile(e,t){if(u().backend.kind===`cloud`)return Se(e,_t(t??`/workspace/project/.agents_tmp/PLAN.md`,`/workspace/project`));let n=await this.resolveConversationWorkingDir(e),r=_t(t??`${n}/.agents_tmp/PLAN.md`,n);return new i(o()).downloadTextFile(r)}static async downloadConversation(e){return u().backend.kind===`cloud`?_e(e):new i(o()).downloadTrajectory(e)}static async getHooks(e){return rt()}static async getRuntimeConversation(e,n,r){let i=u().backend,a=i.kind===`cloud`&&n?await v({backend:i,method:`GET`,hostOverride:f(n),path:`/api/conversations/${e}`,authMode:`session-api-key`,sessionApiKey:r}):await new t(o({conversationUrl:n,sessionApiKey:r})).getConversation(e),s=vt(a),c=X(a)?a.stats:null;return{id:s.id,title:s.title?.trim()?s.title:V(s.id),metrics:dt(s.metrics),created_at:s.created_at,updated_at:s.updated_at,status:xt(s.execution_status),stats:X(c)?c:{usage_to_metrics:{}}}}static async searchConversations(e=20,n){return u().backend.kind===`cloud`?he(e,n):Ne(yt(await new t(o()).searchConversations({limit:e,page_id:n,sort_order:g.UPDATED_AT_DESC})))}static async deleteConversation(e){u().backend.kind===`cloud`?await ve(e):await new t(o()).deleteConversation(e),P(e)}static async updateConversationTitle(e,n){await new t(o()).updateConversation(e,{title:n});let[r]=await this.batchGetAppConversations([e]);return St(r,e)}static async forkConversation(e,n,r){if(u().backend.kind===`cloud`)throw Error(`Branching a conversation isn't supported on the cloud backend yet.`);let i=await new t(o()).forkConversation(e,{from_event_id:n,...r?{title:r}:{}}),a=M(e);return a&&N(i.id,a),i}static async getEventParentId(e,n){return(await new t(o()).getEvent(e,n)).parent_id??void 0}static async switchProfile(e,n){let{backend:i}=u();if(i.kind===`cloud`){if(!e){await ne.activateProfile(n);return}await v({backend:i,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_profile`,body:{profile_name:n}});return}if(!e){await new r(o()).activateProfile(n);return}let a=o(),s=new t(a),c=await new r(a).getProfile(n,{exposeSecrets:`encrypted`}),l=typeof c.config.model==`string`?c.config.model:``;if(!l)throw Error(`Profile '${n}' has no model.`);await tt({llm:c.config}),await s.switchLLM(e,{...c.config,model:l,stream:!0,usage_id:`profile:${n}:${D()}`})}static async switchAcpModel(e,n){let{backend:r}=u();if(r.kind===`cloud`){await v({backend:r,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_acp_model`,body:{model:n}});return}await new t(o()).switchAcpModel(e,n)}};export{Te as a,Se as c,N as d,fe as f,L as i,xe as l,D as m,Fe as n,I as o,de as p,Ee as r,be as s,Ct as t,M as u};
@@ -1 +0,0 @@
1
- import{n as e,r as t}from"./agent-settings-UE-U4Xii.js";export{e as default,t as handle};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,yt as n}from"./vendor-styling-Ck5D_A2Q.js";import{U as r}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js";import{t as i}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js";import{At as a,Pt as o,_ as s,jt as c,n as l,zt as u}from"./active-backend-context-B0wI7OzM.js";import{z as d}from"./utils-BX9XJ0IE.js";import{t as f}from"./settings-CWFxymAf.js";import{n as p}from"./use-settings-3RcgdUuZ.js";import{t as m}from"./use-save-settings-C9B8Y-h3.js";import{t as h}from"./brand-button-DJmFCyMK.js";import{i as g,n as _,r as v,t as y}from"./color-themes-DTj5Ylbr.js";import{t as b}from"./navigation-link-Bxo3-4vo.js";import{t as x}from"./settings-input-BQY115xH.js";import{t as S}from"./use-llm-profiles-C-tDO6UB.js";import{t as C}from"./settings-dropdown-input-Cx4g7Xfl.js";import{n as w,t as T}from"./switch-skeleton-DwOoCqaL.js";import{t as E}from"./settings-switch-BIodMVz9.js";var D=e(t(),1),O=n();function k({defaultKey:e,onChange:t,name:n}){let{t:r}=i(`openhands`);return(0,O.jsx)(C,{testId:n,name:n,onInputChange:t,label:r(d.SETTINGS$LANGUAGE),items:u.map(e=>({key:e.value,label:e.label})),defaultSelectedKey:e,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function A(){let{t:e}=i(`openhands`),t=D.useCallback(e=>{if(!e)return;let t=e;_(t),v(t)},[]);return(0,O.jsx)(C,{testId:`color-theme-input`,name:`color-theme-input`,label:e(d.SETTINGS$COLOR_THEME),items:y.map(e=>({key:e.key,label:e.label})),defaultSelectedKey:g(),onSelectionChange:t,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function j(){return(0,O.jsxs)(`div`,{"data-testid":`app-settings-skeleton`,className:`px-11 py-9 flex flex-col gap-6`,children:[(0,O.jsx)(w,{}),(0,O.jsx)(T,{}),(0,O.jsx)(T,{})]})}var M=`__automatic__`;function N(){let{t:e}=i(`openhands`),{mutate:t,isPending:n}=m(),{data:r,isLoading:g}=p(),_=l().backend.kind===`cloud`,{data:v,isLoading:y}=S(),[w,T]=D.useState(!1),[N,P]=D.useState(!1),[F,I]=D.useState(!1),[L,R]=D.useState(!1),[z,B]=D.useState(!1),[V,H]=D.useState(void 0),U=D.useMemo(()=>{let e=r?.title_llm_profile??null;return!e||!v||v.profiles.some(t=>t.name===e)?e:null},[v,r?.title_llm_profile]),W=V===void 0?U:V,G=D.useMemo(()=>[{key:M,label:e(d.SETTINGS$TITLE_GENERATION_AUTOMATIC)},...v?.profiles.map(t=>({key:t.name,label:t.model?e(d.SETTINGS$TITLE_GENERATION_PROFILE_OPTION,{name:t.name,model:t.model}):t.name}))??[]],[v?.profiles,e]),K=n=>{let r=n.get(`language-input`)?.toString(),i=u.find(({label:e})=>e===r)?.value||f.language,l=_?!0:n.get(`enable-analytics-switch`)?.toString()===`on`,p=n.get(`enable-sound-notifications-switch`)?.toString()===`on`,m=n.get(`git-user-name-input`)?.toString()||f.git_user_name,h=n.get(`git-user-email-input`)?.toString()||f.git_user_email;t({language:i,...!_&&{user_consents_to_analytics:l},enable_sound_notifications:p,git_user_name:m,git_user_email:h,title_llm_profile:W},{onSuccess:()=>{s(l?`granted`:`denied`),c(e(d.SETTINGS$SAVED))},onError:t=>{a(o(t)||e(d.ERROR$GENERIC))},onSettled:()=>{T(!1),P(!1),I(!1),R(!1),B(!1),H(void 0)}})},q=e=>{let t=u.find(({label:t})=>t===e)?.label,n=u.find(({value:e})=>e===r?.language)?.label;T(t!==n)},J=e=>{P(e!==(r?.user_consents_to_analytics??!0))},Y=e=>{I(e!==!!r?.enable_sound_notifications)},X=e=>{let t=r?.git_user_name;R(e!==t)},Z=e=>{let t=r?.git_user_email;B(e!==t)},Q=!w&&!N&&!F&&W===U&&!L&&!z,$=!r||g||y||n;return(0,O.jsxs)(`form`,{"data-testid":`app-settings-screen`,action:K,className:`flex flex-col gap-6`,children:[$&&(0,O.jsx)(j,{}),!$&&(0,O.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,O.jsx)(k,{name:`language-input`,defaultKey:r.language,onChange:q}),(0,O.jsx)(A,{}),(0,O.jsx)(E,{testId:`enable-analytics-switch`,name:_?void 0:`enable-analytics-switch`,defaultIsToggled:_?!0:r.user_consents_to_analytics??!0,isToggled:_?!0:void 0,isDisabled:_,onToggle:_?void 0:J,children:e(d.ANALYTICS$SEND_ANONYMOUS_DATA)}),(0,O.jsx)(E,{testId:`enable-sound-notifications-switch`,name:`enable-sound-notifications-switch`,defaultIsToggled:!!r.enable_sound_notifications,onToggle:Y,children:e(d.SETTINGS$SOUND_NOTIFICATIONS)}),(0,O.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,O.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:e(d.SETTINGS$CONVERSATION_TITLES)}),(0,O.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:e(d.SETTINGS$TITLE_GENERATION_DESCRIPTION)}),(0,O.jsx)(C,{testId:`title-llm-profile-input`,name:`title-llm-profile-input`,label:e(d.SETTINGS$TITLE_GENERATION_MODEL),items:G,selectedKey:W??M,onSelectionChange:e=>{let t=e?.toString();H(!t||t===M?null:t)}}),(0,O.jsx)(b,{to:`/settings/llm`,className:`mt-3 inline-block text-sm text-primary hover:underline`,children:e(d.SETTINGS$MANAGE_LLM_PROFILES)})]}),(0,O.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,O.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:e(d.SETTINGS$GIT_SETTINGS)}),(0,O.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:e(d.SETTINGS$GIT_SETTINGS_DESCRIPTION)}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,O.jsx)(x,{testId:`git-user-name-input`,name:`git-user-name-input`,type:`text`,label:e(d.SETTINGS$GIT_USERNAME),defaultValue:r.git_user_name||``,onChange:X,placeholder:e(d.SETTINGS$GIT_USERNAME_PLACEHOLDER),className:`w-full min-w-0`}),(0,O.jsx)(x,{testId:`git-user-email-input`,name:`git-user-email-input`,type:`email`,label:e(d.SETTINGS$GIT_EMAIL),defaultValue:r.git_user_email||``,onChange:Z,placeholder:e(d.SETTINGS$GIT_EMAIL_PLACEHOLDER),className:`w-full min-w-0`})]}),(0,O.jsx)(`div`,{className:`flex justify-start pt-4`,children:(0,O.jsxs)(h,{testId:`submit-button`,variant:`primary`,type:`submit`,isDisabled:n||Q,children:[!n&&e(d.SETTINGS$SAVE_CHANGES),n&&e(d.SETTINGS$SAVING)]})})]})]})]})}var P=r(N);export{P as default};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,bt as n,yt as r}from"./vendor-styling-Ck5D_A2Q.js";import{t as i}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js";import{E as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js";import{t as o,z as s}from"./utils-BX9XJ0IE.js";import{t as c}from"./bot-DuN83i3p.js";import{t as l}from"./list-todo-CheUtB7F.js";import{t as u}from"./search-CYaiKHRp.js";import{n as d,r as f,t as p}from"./sidebar-store-B04sX8aP.js";import{n as m,t as h}from"./wrench-DRitTfwe.js";import{t as g}from"./sparkles-g7y3r-Ut.js";import{t as _}from"./x-RYDBg-e2.js";import{t as v}from"./zap-tbKDzCe3.js";import{m as y,x as b}from"./use-tracking-CTtkLAmx.js";import{n as x}from"./navigation-context-CQZwH_tC.js";var S=a(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),C=a(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),w=a(`keyboard`,[[`path`,{d:`M10 8h.01`,key:`1r9ogq`}],[`path`,{d:`M12 12h.01`,key:`1mp3jc`}],[`path`,{d:`M14 8h.01`,key:`1primd`}],[`path`,{d:`M16 12h.01`,key:`1l6xoz`}],[`path`,{d:`M18 8h.01`,key:`emo2bl`}],[`path`,{d:`M6 8h.01`,key:`x9i8wu`}],[`path`,{d:`M7 16h10`,key:`wp8him`}],[`path`,{d:`M8 12h.01`,key:`czm47f`}],[`rect`,{width:`20`,height:`16`,x:`2`,y:`4`,rx:`2`,key:`18n3k1`}]]),T=a(`panels-top-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M9 21V9`,key:`1oto5p`}]]),E=e(n(),1),D=e(t(),1),O=r(),k=18,A={conversations:`/conversations`,customize:`/customize`,automations:y(),mcp:`/mcp`,settings:`/settings`,agentSettings:`/settings/agents`,llmSettings:`/settings/llm`,condenserSettings:`/settings/condenser`,verificationSettings:`/settings/verification`,appSettings:`/settings/app`,secretsSettings:`/settings/secrets`},j={navigation:s.COMMAND_MENU$GROUP_NAVIGATION,settings:s.COMMAND_MENU$GROUP_SETTINGS,actions:s.COMMAND_MENU$GROUP_ACTIONS},M=[`navigation`,`settings`,`actions`],N=({toggleSidebar:e})=>[{id:`new-chat`,group:`navigation`,titleKey:s.COMMAND_MENU$NEW_CHAT_TITLE,descriptionKey:s.COMMAND_MENU$NEW_CHAT_DESCRIPTION,keywordsKey:s.COMMAND_MENU$NEW_CHAT_KEYWORDS,icon:(0,O.jsx)(S,{size:k}),to:A.conversations},{id:`customize`,group:`navigation`,titleKey:s.COMMAND_MENU$CUSTOMIZE_TITLE,descriptionKey:s.COMMAND_MENU$CUSTOMIZE_DESCRIPTION,keywordsKey:s.COMMAND_MENU$CUSTOMIZE_KEYWORDS,icon:(0,O.jsx)(g,{size:k}),to:A.customize},{id:`automations`,group:`navigation`,titleKey:s.COMMAND_MENU$AUTOMATIONS_TITLE,descriptionKey:s.COMMAND_MENU$AUTOMATIONS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$AUTOMATIONS_KEYWORDS,title:b().commandMenuTitle??void 0,description:b().commandMenuDescription??void 0,keywords:b().commandMenuKeywords??void 0,icon:(0,O.jsx)(v,{size:k}),to:A.automations},{id:`mcp`,group:`navigation`,titleKey:s.COMMAND_MENU$MCP_TITLE,descriptionKey:s.COMMAND_MENU$MCP_DESCRIPTION,keywordsKey:s.COMMAND_MENU$MCP_KEYWORDS,icon:(0,O.jsx)(h,{size:k}),to:A.mcp},{id:`settings`,group:`settings`,titleKey:s.COMMAND_MENU$SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$SETTINGS_KEYWORDS,icon:(0,O.jsx)(f,{size:k}),to:A.settings},{id:`agent-settings`,group:`settings`,titleKey:s.COMMAND_MENU$AGENT_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$AGENT_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$AGENT_SETTINGS_KEYWORDS,icon:(0,O.jsx)(c,{size:k}),to:A.agentSettings},{id:`llm-settings`,group:`settings`,titleKey:s.COMMAND_MENU$LLM_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$LLM_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$LLM_SETTINGS_KEYWORDS,icon:(0,O.jsx)(u,{size:k}),to:A.llmSettings},{id:`condenser-settings`,group:`settings`,titleKey:s.COMMAND_MENU$CONDENSER_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$CONDENSER_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$CONDENSER_SETTINGS_KEYWORDS,icon:(0,O.jsx)(l,{size:k}),to:A.condenserSettings},{id:`verification-settings`,group:`settings`,titleKey:s.COMMAND_MENU$VERIFICATION_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$VERIFICATION_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$VERIFICATION_SETTINGS_KEYWORDS,icon:(0,O.jsx)(m,{size:k}),to:A.verificationSettings},{id:`app-settings`,group:`settings`,titleKey:s.COMMAND_MENU$APP_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$APP_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$APP_SETTINGS_KEYWORDS,icon:(0,O.jsx)(T,{size:k}),to:A.appSettings},{id:`secrets-settings`,group:`settings`,titleKey:s.COMMAND_MENU$SECRETS_SETTINGS_TITLE,descriptionKey:s.COMMAND_MENU$SECRETS_SETTINGS_DESCRIPTION,keywordsKey:s.COMMAND_MENU$SECRETS_SETTINGS_KEYWORDS,icon:(0,O.jsx)(C,{size:k}),to:A.secretsSettings},{id:`toggle-sidebar`,group:`actions`,titleKey:s.COMMAND_MENU$TOGGLE_SIDEBAR_TITLE,descriptionKey:s.COMMAND_MENU$TOGGLE_SIDEBAR_DESCRIPTION,keywordsKey:s.COMMAND_MENU$TOGGLE_SIDEBAR_KEYWORDS,icon:(0,O.jsx)(w,{size:k}),perform:e}],P=`command-menu-search`,F=`command-menu-results`,I=`command-menu-option`,L=`command-menu`,R=`k`,z=`ArrowDown`,B=`ArrowUp`,V=`Enter`,H=`Escape`,U=``,W=-1;function G(e){return`${I}-${e.id}`}function K({item:e,query:t,translate:n}){let r=t.trim().toLocaleLowerCase().split(/\s+/).filter(Boolean);if(r.length===0)return!0;let i=[e.title??n(e.titleKey),e.description??n(e.descriptionKey),e.keywords??n(e.keywordsKey)].join(` `).toLocaleLowerCase();return r.every(e=>i.includes(e))}function q(){let{t:e}=i(`openhands`),{navigate:t}=x(),n=d(e=>e.isOpen),r=d(e=>e.open),a=d(e=>e.close),[c,l]=D.useState(U),[f,m]=D.useState(0),h=D.useRef(null),g=D.useRef(new Map);D.useEffect(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLocaleLowerCase()===R&&(e.preventDefault(),r())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r]),D.useEffect(()=>{if(!n){l(U),m(0),g.current.clear();return}let e=requestAnimationFrame(()=>h.current?.focus());return()=>cancelAnimationFrame(e)},[n]);let v=D.useMemo(()=>N({toggleSidebar:()=>p.getState().toggleCollapsed()}),[]),y=D.useMemo(()=>v.filter(t=>K({item:t,query:c,translate:t=>e(t)})),[v,c,e]);D.useEffect(()=>{m(e=>y.length===0?W:Math.min(Math.max(e,0),y.length-1))},[y.length]),D.useEffect(()=>{let e=y[f];if(!e)return;let t=g.current.get(e.id);typeof t?.scrollIntoView==`function`&&t.scrollIntoView({block:`nearest`})},[f,y]);let b=D.useCallback(e=>{if(e){if(a(),e.to){t(e.to);return}e.perform?.()}},[a,t]),S=e=>{if(e.key===z){e.preventDefault(),m(e=>y.length===0?e:(e+1)%y.length);return}if(e.key===B){e.preventDefault(),m(e=>y.length===0?e:(e-1+y.length)%y.length);return}if(e.key===V){e.preventDefault(),b(y[f]);return}e.key===H&&(e.preventDefault(),a())};if(!n||typeof document>`u`)return null;let C=y[f];return(0,E.createPortal)((0,O.jsxs)(`div`,{className:`fixed inset-0 z-[70] flex items-start justify-center px-3 pt-[10vh] sm:px-6`,"data-testid":L,role:`dialog`,"aria-modal":`true`,"aria-label":e(s.COMMAND_MENU$ARIA_LABEL),children:[(0,O.jsx)(`button`,{type:`button`,className:`absolute inset-0 cursor-default bg-black/65 backdrop-blur-[2px]`,"aria-label":e(s.COMMAND_MENU$CLOSE_LABEL),onClick:a}),(0,O.jsxs)(`div`,{className:o(`relative flex max-h-[min(720px,78vh)] w-full max-w-2xl flex-col overflow-hidden rounded-2xl`,`border border-[var(--oh-border)] bg-[var(--oh-surface)]`,`shadow-[0_24px_90px_rgba(0,0,0,0.52),0_0_0_1px_rgba(255,255,255,0.03)_inset]`),children:[(0,O.jsxs)(`div`,{className:`relative flex items-center gap-3 border-b border-[var(--oh-border)] px-4 py-3`,children:[(0,O.jsx)(u,{className:`size-5 shrink-0 text-[var(--oh-text-dim)]`}),(0,O.jsx)(`input`,{ref:h,id:P,className:`h-11 min-w-0 flex-1 bg-transparent text-base text-white outline-none placeholder:text-[var(--oh-text-dim)]`,placeholder:e(s.COMMAND_MENU$PLACEHOLDER),"aria-label":e(s.COMMAND_MENU$SEARCH_LABEL),role:`combobox`,"aria-expanded":`true`,"aria-controls":F,"aria-activedescendant":C?G(C):void 0,value:c,onChange:e=>l(e.target.value),onKeyDown:S}),c?(0,O.jsx)(`button`,{type:`button`,className:`inline-flex size-8 items-center justify-center rounded-lg text-[var(--oh-muted)] hover:bg-[var(--oh-surface-raised)] hover:text-white`,"aria-label":e(s.COMMAND_MENU$CLEAR_SEARCH_LABEL),onClick:()=>{l(U),h.current?.focus()},children:(0,O.jsx)(_,{className:`size-4`})}):null,(0,O.jsx)(`kbd`,{className:`hidden rounded-md border border-[var(--oh-border)] bg-black/25 px-2 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--oh-text-dim)] sm:inline-flex`,children:e(s.COMMAND_MENU$SHORTCUT)})]}),(0,O.jsx)(`div`,{id:F,role:`listbox`,className:`relative min-h-0 flex-1 overflow-y-auto px-2 py-2 custom-scrollbar`,children:y.length===0?(0,O.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-2 px-6 py-16 text-center`,children:[(0,O.jsx)(`div`,{className:`flex size-11 items-center justify-center rounded-2xl border border-dashed border-[var(--oh-border)] text-[var(--oh-text-dim)]`,children:(0,O.jsx)(u,{className:`size-5`})}),(0,O.jsx)(`p`,{className:`text-sm font-medium text-white`,children:e(s.COMMAND_MENU$NO_RESULTS_TITLE)}),(0,O.jsx)(`p`,{className:`max-w-sm text-xs leading-5 text-[var(--oh-muted)]`,children:e(s.COMMAND_MENU$NO_RESULTS_DESCRIPTION)})]}):M.map(t=>{let n=y.filter(e=>e.group===t);return n.length===0?null:(0,O.jsxs)(`section`,{className:`py-1`,children:[(0,O.jsx)(`div`,{className:`px-3 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--oh-text-dim)]`,children:e(j[t])}),(0,O.jsx)(`div`,{className:`space-y-1`,children:n.map(t=>{let n=y.indexOf(t),r=n===f,i=t.to,a=e=>{e?g.current.set(t.id,e):g.current.delete(t.id)},c=o(`group flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left transition-colors duration-150`,r?`bg-white/[0.09] text-white shadow-[0_0_0_1px_rgba(255,255,255,0.08)_inset]`:`text-[var(--oh-muted)] hover:bg-white/[0.05] hover:text-white`),l=(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`span`,{className:o(`flex size-9 shrink-0 items-center justify-center rounded-lg border transition-colors duration-150`,r?`border-[var(--oh-accent)] bg-[var(--oh-accent)]/15 text-white`:`border-[var(--oh-border)] bg-black/15 text-[var(--oh-text-dim)] group-hover:text-white`),"aria-hidden":`true`,children:t.icon}),(0,O.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,O.jsx)(`span`,{className:`block truncate text-sm font-medium text-current`,children:t.title??e(t.titleKey)}),(0,O.jsx)(`span`,{className:`mt-0.5 block truncate text-xs text-[var(--oh-text-dim)]`,children:t.description??e(t.descriptionKey)})]}),(0,O.jsx)(`span`,{className:`hidden shrink-0 rounded-md border border-[var(--oh-border)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.14em] text-[var(--oh-text-dim)] sm:inline-flex`,children:e(i?s.COMMAND_MENU$GO_HINT:s.COMMAND_MENU$RUN_HINT)})]});return i?(0,O.jsx)(`a`,{ref:a,id:G(t),href:i,role:`option`,"aria-selected":r,onMouseEnter:()=>m(n),onClick:e=>{e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),b(t))},className:c,children:l},t.id):(0,O.jsx)(`button`,{ref:a,id:G(t),type:`button`,role:`option`,"aria-selected":r,onMouseEnter:()=>m(n),onClick:()=>b(t),className:c,children:l},t.id)})})]},t)})}),(0,O.jsx)(`div`,{className:`border-t border-[var(--oh-border)] px-4 py-2.5 text-[11px] text-[var(--oh-text-dim)]`,children:e(s.COMMAND_MENU$FOOTER_HINT)})]})]}),document.body)}export{q as CommandMenu};
@@ -1 +0,0 @@
1
- import{t as e}from"./conversation-Csdxh9Xt.js";export{e as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./conversation-Csdxh9Xt.js";export{e as default};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]);export{t};
@@ -1 +0,0 @@
1
- import"./git-repo-dropdown-CWnaUyxL.js";
@@ -1 +0,0 @@
1
- import{t as e}from"./home-BpZQkDWM.js";export{e as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./home-BpZQkDWM.js";export{e as default};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,yt as n}from"./vendor-styling-Ck5D_A2Q.js";import{n as r}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js";import{t as i}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js";import{p as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js";import{t as o}from"./useMutation-ChpkYxI5.js";import{$ as s,At as c,Pt as l,R as u,ct as d,jt as f,n as ee,ut as te}from"./active-backend-context-B0wI7OzM.js";import{t as p,z as m}from"./utils-BX9XJ0IE.js";import{t as h}from"./bot-DuN83i3p.js";import{c as g,i as _,l as v,m as y,p as ne,r as b,t as x,u as S}from"./settings-service.api-Dz9cZyvx.js";import{n as C}from"./use-settings-3RcgdUuZ.js";import{t as re}from"./modal-backdrop-BSzNhM4r.js";import{n as ie}from"./modal-classes-DSTLuxkA.js";import{t as ae}from"./brand-button-DJmFCyMK.js";import{t as w}from"./styled-tooltip-CQ9JEFiO.js";import{t as oe}from"./modal-close-button-dheWZ2ys.js";import{t as T}from"./settings-input-BQY115xH.js";import{t as E}from"./secrets-service-DGUNlwQd.js";import{c as se,i as ce,s as D,t as O}from"./mcp-marketplace-utils-BMnYz0Gc.js";import{t as k}from"./vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js";var A=e(t()),j=n();function M({fieldKey:e,checked:t,onToggle:n}){let{t:r}=i(`openhands`);return(0,j.jsxs)(`label`,{"data-testid":`mcp-install-save-secret-${e}`,className:p(`flex items-center gap-2 px-3 py-2 mt-0.5 rounded-lg border cursor-pointer transition-colors`,t?`border-green-500/35 bg-green-500/10`:`border-[var(--oh-border)] bg-transparent hover:bg-white/[0.03]`),children:[(0,j.jsx)(`input`,{className:`sr-only`,id:`mcp-save-secret-checkbox-${e}`,type:`checkbox`,checked:t,onChange:e=>n(e.target.checked)}),(0,j.jsx)(`span`,{"aria-hidden":`true`,className:p(`relative inline-flex h-[22px] w-[40px] shrink-0 items-center rounded-full border transition-colors duration-200`,t?`border-green-500 bg-green-500`:`border-[var(--oh-border)] bg-surface-raised`),children:(0,j.jsx)(`span`,{className:p(`inline-block size-4 rounded-full transition-transform duration-200`,t?`translate-x-[21px] bg-white`:`translate-x-[2px] bg-[var(--oh-muted)]`)})}),(0,j.jsx)(`span`,{className:`text-sm`,children:r(m.MCP$ALSO_SAVE_AS_SECRET)}),(0,j.jsx)(`code`,{className:p(`ml-auto text-[11px] font-mono tracking-tight border rounded px-1.5 py-0.5`,t?`text-green-500 border-green-500/35 bg-white/[0.04]`:`text-tertiary-alt border-[var(--oh-border)]`),children:e}),(0,j.jsx)(w,{content:r(m.MCP$SAVE_AS_SECRET_TOOLTIP),placement:`top`,children:(0,j.jsx)(`button`,{type:`button`,"aria-label":r(m.MCP$SAVE_AS_SECRET_TOOLTIP),className:`flex items-center justify-center size-[15px] shrink-0 rounded-full border border-[var(--oh-muted)] text-tertiary-alt text-[9px] font-bold cursor-help`,onClick:e=>e.preventDefault(),children:`?`})})]})}var le=e=>(0,j.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,...e,children:(0,j.jsx)(`path`,{d:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,fill:`currentColor`})}),ue={xs:`h-4 w-4 rounded [&>svg]:h-2.5 [&>svg]:w-2.5`,sm:`h-5 w-5 rounded-md [&>svg]:h-3 [&>svg]:w-3`,md:`h-10 w-10 rounded-lg [&>svg]:h-5 [&>svg]:w-5`},N={slack:le};function de({entry:e,size:t=`md`,className:n,fallback:r,testId:i}){let a=e?N[e.id]:void 0;return(0,j.jsx)(`span`,{"aria-hidden":`true`,title:e?.name,"data-testid":i,className:p(`inline-flex shrink-0 items-center justify-center overflow-hidden`,`border border-white/10 shadow-[inset_0_1px_0_rgba(255,255,255,0.18)]`,ue[t],n),style:{backgroundColor:e?.iconBg??`var(--oh-color-tertiary)`,color:e?.iconColor??`#FFFFFF`},children:a?(0,j.jsx)(a,{}):e?.logoUrl?(0,j.jsx)(`img`,{src:e.logoUrl,alt:`${e.name} logo`,className:`h-full w-full object-contain p-[22%]`,onError:e=>{let t=e.currentTarget;t.style.display=`none`}}):r??(0,j.jsx)(h,{className:`h-5 w-5`,strokeWidth:2.25})})}var fe=new Set([`invalid_auth`,`not_authed`,`account_inactive`,`token_revoked`,`token_expired`]),P=e=>e.is_error?e.text||`tool call failed`:null,pe={github:{toolCall:{name:`get_me`,arguments:{}},interpret:P},linear:{toolCall:{name:`list_teams`,arguments:{}},interpret:P},slack:{toolCall:{name:`slack_list_channels`,arguments:{limit:1}},interpret:e=>{if(e.is_error)return e.text||`tool call failed`;try{let t=JSON.parse(e.text);if(t?.ok===!1&&fe.has(t.error))return String(t.error)}catch{}return null}}};function F(e){let t=O(e,D(k));return t?pe[t.id]:void 0}var me=4,he=/token|key|secret|auth/i,ge=[/\bgh[pousr]_[A-Za-z0-9]{16,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,/\bxox[a-z](?:-[A-Za-z0-9]+)+/g,/\blin_api_[A-Za-z0-9]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\b/g],_e=/\bBearer\s+[A-Za-z0-9._~+/=-]{8,}/gi;function I(e,t){typeof t==`string`&&(t.length<me||t!==`**********`&&e.add(t))}function L(e,t){for(let n of Object.values(t??{}))I(e,n)}function ve(e,t){if(t)try{let n=new URL(t);I(e,n.username),I(e,n.password),I(e,decodeURIComponent(n.username)),I(e,decodeURIComponent(n.password)),n.searchParams.forEach((t,n)=>{he.test(n)&&I(e,t)})}catch{}}function ye(e,t){if(t)switch(t.strategy){case`api_key`:case`bearer`:I(e,t.value);break;case`basic`:I(e,t.username),I(e,t.password);break;case`header`:L(e,t.headers);break;case`oauth2`:I(e,t.authentication?.client_secret),L(e,t.state?.tokens);break;default:break}}function be(e){let t=new Set;return L(t,e.env),L(t,e.headers),ye(t,e.auth),ve(t,e.url),[...t].sort((e,t)=>t.length-e.length)}function R(e,...t){if(!e)return e;let n=e;for(let e of t)if(e)for(let t of be(e))n=n.split(t).join(b);n=n.replace(_e,`Bearer ${b}`);for(let e of ge)n=n.replace(e,b);return n}var z=e=>!!e&&typeof e==`object`&&!Array.isArray(e),xe=e=>{if(!z(e))return;let t=Object.entries(e).filter(e=>typeof e[1]==`string`);return t.length>0?Object.fromEntries(t):void 0},Se=e=>!!e&&Object.values(e).some(e=>e===`**********`);function Ce(e,t){if(!z(e))return e;let n=z(t)?t:{},r={...e};for(let[t,i]of Object.entries(e))if(i===`**********`){let e=n[t];typeof e==`string`&&e!==`**********`&&(r[t]=e)}else z(i)&&(r[t]=Ce(i,n[t]));return r}var we=(e,t)=>t[e.id];async function Te(e){let t=(await x.fetchSettingsFromApi(`encrypted`)).agent_settings?.mcp_config;if(z(t))return we(e,t)}async function Ee(e){let t=e.type===`stdio`&&Se(e.env),n=(e.type===`sse`||e.type===`shttp`)&&g(e.auth),r=(e.type===`sse`||e.type===`shttp`)&&Se(e.headers);if(!t&&!n&&!r)return e;try{let i=await Te(e);if(!i)return e;if(t){let t=xe(i.env)??{},n=Object.fromEntries(Object.entries(e.env??{}).map(([e,n])=>[e,n===`**********`&&typeof t[e]==`string`?t[e]:n]));return{...e,env:n}}let a={...e};if(n&&y(i.auth)&&(a.auth=Ce(e.auth,i.auth)),r){let t=xe(i.headers)??{};a.headers=Object.fromEntries(Object.entries(e.headers??{}).map(([e,n])=>[e,n===`**********`&&typeof t[e]==`string`?t[e]:n]))}return a}catch{return e}}var De=120;function Oe(e){return e.type===`stdio`?{type:`stdio`,command:e.command,...e.args?.length&&{args:e.args},...e.env&&Object.keys(e.env).length>0&&{env:e.env}}:{type:e.type===`sse`?`sse`:`http`,url:e.url,...e.headers&&Object.keys(e.headers).length>0&&{headers:e.headers},...e.auth?{auth:e.auth}:{}}}function ke(e){return e.auth?.strategy===`oauth2`?De:e.timeout}async function Ae(e){let t=F(e),n=await Ee(e),r=Oe(n),i=ke(e);return{request:{server:r,...e.name?{name:e.name}:{},...i===void 0?{}:{timeout:i},...t?{tool_call:t.toolCall}:{}},substituted:n}}function je(e,t){return e.ok?e.tool_result?{...e,tool_result:{...e.tool_result,text:R(e.tool_result.text,...t)}}:e:{...e,error:R(e.error,...t)}}function Me(e,t,n){let r=je(e,n);if(r.ok&&t&&r.tool_result&&r.tools.includes(t.toolCall.name)){let e=t.interpret(r.tool_result);if(e)return{ok:!1,error:e,error_kind:`credentials`}}return r}function Ne(){if(d().backend.kind===`local`){let{host:e,apiKey:t}=s();return{host:e,...t?{apiKey:t}:{}}}let e=te().find(e=>e.kind===`local`&&e.host);if(e)return{host:e.host.replace(/\/+$/,``),...e.apiKey?{apiKey:e.apiKey}:{}};throw Error(`OAuth authorization requires a reachable local backend.`)}function B(){let{host:e,apiKey:t}=Ne();return new a({host:e,...t?{apiKey:t}:{},timeout:125e3})}function Pe(e){return e.status===`succeeded`?{ok:!0,tools:e.tools??[],...e.tool_result!==void 0&&{tool_result:e.tool_result},...e.oauth_state!==void 0&&{oauth_state:e.oauth_state}}:{ok:!1,error:e.error||`OAuth authorization did not complete`,error_kind:e.error_kind||`unknown`}}var Fe=e=>new Promise(t=>{window.setTimeout(t,e)}),V=class e{static async testServer(e){if(d().backend.kind===`cloud`)return{ok:!0,tools:[]};let t=F(e),{host:n,apiKey:r}=s(),i=new a({host:n,...r?{apiKey:r}:{}});try{let{request:n,substituted:r}=await Ae(e);return Me(await i.testServer(n),t,[r,e])}finally{i.close()}}static async startOAuth(t){let n=B();try{return await e.startOAuthWithClient(n,t)}finally{n.close()}}static async getOAuthStatus(t){let n=B();try{return await e.getOAuthStatusWithClient(n,t)}finally{n.close()}}static async submitOAuthCallback(t,n){let r=B();try{return await e.submitOAuthCallbackWithClient(r,t,n)}finally{r.close()}}static async authorizeOAuth(t){let n=F(t),r=e=>Me(e,n,[t]),i=window.open(`about:blank`,`_blank`),a=B();try{let n=await e.startOAuthWithClient(a,t);if(!n.ok||!n.job_id||!n.authorization_url)return i?.close(),r({ok:!1,error:n.error||`Could not start OAuth authorization`,error_kind:n.error_kind||`unknown`});let o=await e.getOAuthStatusWithClient(a,n.job_id);for(let t=0;t<20;t+=1){if(o.status===`succeeded`||o.status===`failed`)return i?.close(),r(Pe(o));if(o.callback_ready)break;await Fe(250),o=await e.getOAuthStatusWithClient(a,n.job_id)}i&&(i.location.href=n.authorization_url);for(let t=0;t<De;t+=1)if(await Fe(1e3),o=await e.getOAuthStatusWithClient(a,n.job_id),o.status===`succeeded`||o.status===`failed`)return i?.close(),r(Pe(o));return{ok:!1,error:`OAuth authorization timed out`,error_kind:`timeout`}}finally{a.close()}}static async startOAuthWithClient(e,t){let{request:n}=await Ae(t);return e.startOAuth(n)}static async getOAuthStatusWithClient(e,t){return await e.getOAuthStatus(t)}static async submitOAuthCallbackWithClient(e,t,n){return await e.submitOAuthCallback(t,{callback_url:n})}},H=e=>Object.keys(e??{}).sort();function U(e){return e.type===`stdio`?JSON.stringify({type:e.type,name:e.name??``,command:e.command??``,args:e.args??[],envKeys:H(e.env)}):JSON.stringify({type:e.type,name:e.name??``,url:e.url??``,headerKeys:H(e.headers),authStrategy:e.auth?.strategy??``,authHeaderName:e.auth?.strategy===`api_key`?e.auth.header_name??``:``,authHeaderKeys:e.auth?.strategy===`header`?H(e.auth.headers):[]})}var W={},G=new Set,Ie=1;function K(e){W=e,G.forEach(e=>e())}function Le(){return W}function Re(e){return G.add(e),()=>{G.delete(e)}}function ze(e){let t=Ie;return Ie+=1,K({...W,[e]:{status:`checking`,checkId:t}}),t}function q(e,t,n){let r=W[e];r?.status!==`checking`||r.checkId!==t||K({...W,[e]:n})}function Be(e,t){K({...W,[e]:t})}function Ve(e){if(!(e in W))return;let{[e]:t,...n}=W;K(n)}var He=/\b(401|403)\b|unauthorized|forbidden|invalid[ _-]?(token|credentials?|api[ _-]?key)/i;function Ue(e,t){return{status:`failed`,kind:`unknown`,error:R(t instanceof Error?t.message:String(t),e),checkedAt:Date.now()}}function J(e,t){let n=Date.now();if(!t.ok)return{status:`failed`,kind:(t.error_kind===`connection`||t.error_kind===`unknown`)&&He.test(t.error)?`credentials`:t.error_kind,error:t.error,checkedAt:n};let r=F(e);return{status:`healthy`,verification:r&&t.tools.includes(r.toolCall.name)&&t.tool_result&&!t.tool_result.is_error?`verified`:`connectivity-only`,toolCount:t.tools.length,checkedAt:n}}async function We(e){let t=U(e),n=ze(t),r;try{r=J(e,await V.testServer(e))}catch(t){r=Ue(e,t)}q(t,n,r)}async function Ge(e){let t=U(e),n=ze(t);try{let r=await V.authorizeOAuth(e);return q(t,n,J(e,r)),r}catch(r){return q(t,n,Ue(e,r)),null}}function Y(e,t,n){let r=U(e);n.some(e=>U(e)===r)||Be(r,J(e,t))}function Ke(){let e=r(),{data:t}=C();return o({mutationFn:async e=>{if(!t)throw Error(`MCP settings are still loading. Please try again.`);let n=_(t.mcp_config??v(t.agent_settings?.mcp_config),e.name,e.type);await x.createMcpServer(n,S(e))},onSuccess:()=>{e.invalidateQueries({queryKey:u.personal()})}})}function qe(){return o({mutationFn:e=>V.testServer(e)})}function Je(e){return e.length<=3?e.join(`, `):`${e.slice(0,3).join(`, `)} … (+${e.length-3})`}function Ye(){let{t:e}=i(`openhands`),t=r();return(0,A.useCallback)((n,r,i)=>{let a=n.filter(e=>i[e.key]&&(r[e.key]??``).trim());return a.length===0?Promise.resolve():Promise.allSettled(a.map(e=>E.createSecret(e.key,r[e.key].trim(),e.label))).then(n=>{let r=a.filter((e,t)=>n[t].status===`fulfilled`).map(e=>e.key),i=a.filter((e,t)=>n[t].status===`rejected`).map(e=>e.key);r.length>0&&(t.invalidateQueries({queryKey:[`secrets-search`]}),t.invalidateQueries({queryKey:[`secrets`]}),f(e(m.MCP$SECRETS_SAVED,{keys:Je(r)}))),i.length>0&&c(e(m.MCP$SECRETS_SAVE_FAILED,{keys:Je(i)}))})},[e,t])}function X(e,t,n){switch(t){case`timeout`:return e(m.MCP$TEST_ERROR_TIMEOUT);case`connection`:return e(m.MCP$TEST_ERROR_CONNECTION);case`credentials`:return e(m.MCP$TEST_ERROR_CREDENTIALS,{error:n});default:return e(m.MCP$TEST_ERROR_UNKNOWN,{error:n})}}function Z(e){let t=/\[([^\]]+)\]\(([^)]+)\)/g,n=[],r=0;for(let i of e.matchAll(t))i.index>r&&n.push(e.slice(r,i.index)),n.push((0,j.jsx)(`a`,{href:/^https?:\/\//i.test(i[2])?i[2]:`#`,target:`_blank`,rel:`noreferrer`,className:`underline hover:text-white transition-colors`,children:i[1]},i.index)),r=i.index+i[0].length;return r<e.length&&n.push(e.slice(r)),n}function Q(e){return e?.transport.kind!==`shttp`&&e?.transport.kind!==`sse`?!1:[`api_key`,`bearer`].includes(e.auth.strategy)}function Xe(e){return!!e&&e.auth.strategy===`oauth2`}function Ze(e){return e.transport.kind===`stdio`?e.auth.apiKeyOptional??!1:e.auth.apiKeyOptional??e.transport.apiKeyOptional??!1}function $(e){return e?.transport.kind!==`shttp`&&e?.transport.kind!==`sse`?[]:e.transport.headerFields??[]}function Qe(e){let t={},n={},r=ce(e),i=r?.transport;if(i?.kind===`stdio`){for(let e of i.envFields??[])t[e.key]=``,n[e.key]=e.type===`password`;for(let e of i.argFields??[])t[e.key]=``}else if(i?.kind===`shttp`||i?.kind===`sse`){t.url=i.url;for(let e of $(r))t[e.key]=``,n[e.key]=e.type===`password`;Q(r)&&(t.api_key=``,r?.auth.credentialSecretName&&(n.api_key=r.auth.saveCredentialAsSecretByDefault??!1))}return{values:t,errors:{},savedAsSecret:n}}function $e({entry:e,existingServers:t,onClose:n,onSuccess:r}){let{t:a}=i(`openhands`),{mutate:o,isPending:s}=Ke(),{mutate:c,isPending:u}=qe(),d=Ye(),{backend:te}=ee(),p=te.kind===`cloud`,[h,g]=A.useState(()=>Qe(e)),_=A.useRef(h);_.current=h;let[v,y]=A.useState(null),[b,x]=A.useState(!1),[S,C]=A.useState(!1),w=ce(e),E=w?.transport,D=u||S||s||b,O=(e,t)=>{g(n=>({...n,values:{...n.values,[e]:t},errors:{...n.errors,[e]:null}})),y(null)},k=(e,t)=>{g(n=>({...n,savedAsSecret:{...n.savedAsSecret,[e]:t}}))},le=()=>{let e=w?.auth.credentialSecretName,t=_.current.values.api_key?.trim();return!e||!t||!_.current.savedAsSecret.api_key?Promise.resolve():d([{key:e,label:w.auth.credentialLabel??e,type:`password`,required:!0}],{[e]:t},{[e]:!0})},ue=()=>E?.kind===`stdio`?d(E.envFields??[],_.current.values,_.current.savedAsSecret):E?.kind===`shttp`||E?.kind===`sse`?Promise.all([le(),d($(w),_.current.values,_.current.savedAsSecret)]).then(()=>void 0):Promise.resolve(),N=i=>{if(i.auth?.strategy===`oauth2`){C(!0),V.authorizeOAuth(i).then(s=>{if(!s.ok){y(X(a,s.error_kind,s.error));return}let c=s.oauth_state?{...i,auth:{...i.auth,state:s.oauth_state}}:i;o(c,{onSuccess:()=>{p||Y(c,s,t),f(a(m.MCP$INSTALL_SUCCESS)),x(!0),(async()=>{try{await ue()}finally{r?.(e),n()}})()},onError:e=>{y(l(e)||a(m.ERROR$GENERIC))}})}).catch(e=>{y(l(e)||a(m.ERROR$GENERIC))}).finally(()=>C(!1));return}c(i,{onSuccess:s=>{if(!s.ok){y(X(a,s.error_kind,s.error));return}let c=s.oauth_state&&i.auth?.strategy===`oauth2`?{...i,auth:{...i.auth,state:s.oauth_state}}:i;o(c,{onSuccess:()=>{p||Y(c,s,t),f(a(m.MCP$INSTALL_SUCCESS)),x(!0),(async()=>{try{await ue()}finally{r?.(e),n()}})()},onError:e=>{y(l(e)||a(m.ERROR$GENERIC))}})},onError:e=>{y(l(e)||a(m.ERROR$GENERIC))}})},fe=()=>{if(E?.kind!==`shttp`&&E?.kind!==`sse`||!w)return;let t=h.values.api_key?.trim()??``,n=E.urlEditable?h.values.url?.trim()??``:E.url,r=Xe(w),i=Q(w),o=$(w),s={};if(!n)s.url=a(m.SETTINGS$MCP_ERROR_URL_REQUIRED);else try{let e=new URL(n);[`http:`,`https:`].includes(e.protocol)||(s.url=a(m.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL))}catch{s.url=a(m.SETTINGS$MCP_ERROR_URL_INVALID)}for(let e of o)e.required&&!(h.values[e.key]??``).trim()&&(s[e.key]=a(m.MCP$ERROR_FIELD_REQUIRED));if(!r&&i&&!Ze(w)&&!t&&(s.api_key=a(m.MCP$ERROR_FIELD_REQUIRED)),Object.values(s).some(Boolean)){g(e=>({...e,errors:s}));return}let c=r?se(w):void 0,l=Object.fromEntries(o.map(e=>[e.key,h.values[e.key]?.trim()??``]).filter(([,e])=>e)),u=Object.keys(l).length>0,d;r?d={strategy:`oauth2`,...c&&{authentication:c}}:i&&t?d=w.auth.strategy===`api_key`?{strategy:`api_key`,value:t,...w.auth.apiKeyHeaderName&&{header_name:w.auth.apiKeyHeaderName}}:{strategy:`bearer`,value:t}:u&&(d={strategy:`header`,headers:l}),N({id:``,type:E.kind,name:ne(e.id),url:n,...d&&{auth:d},...u&&d?.strategy!==`header`&&{headers:l}})},P=()=>{if(E?.kind!==`stdio`)return;let e=E,t={};for(let n of e.envFields??[])n.required&&!(h.values[n.key]??``).trim()&&(t[n.key]=a(m.MCP$ERROR_FIELD_REQUIRED));for(let n of e.argFields??[])n.required&&!(h.values[n.key]??``).trim()&&(t[n.key]=a(m.MCP$ERROR_FIELD_REQUIRED));if(Object.values(t).some(Boolean)){g(e=>({...e,errors:t}));return}let n={};for(let t of e.envFields??[]){let e=h.values[t.key]?.trim();e&&(n[t.key]=e)}let r=[];for(let t of e.argFields??[]){let e=h.values[t.key]?.trim();if(e)for(let t of e.split(/\s+/))t&&r.push(t)}N({id:``,type:`stdio`,name:e.serverName,command:e.command,args:[...e.args,...r],...Object.keys(n).length>0&&{env:n}})};return(0,j.jsx)(re,{onClose:n,"aria-label":e.name,children:(0,j.jsxs)(`form`,{"data-testid":`mcp-install-modal`,"data-marketplace-id":e.id,onSubmit:e=>(e.preventDefault(),y(null),E?.kind===`shttp`||E?.kind===`sse`?fe():P()),className:`relative bg-base-secondary p-6 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)] w-[520px] max-w-[90vw] max-h-[85vh] overflow-y-auto custom-scrollbar`,children:[(0,j.jsx)(oe,{onClose:n,testId:`mcp-install-modal-close`,disabled:D}),(0,j.jsxs)(`div`,{className:`flex items-start gap-3 pr-6`,children:[(0,j.jsx)(de,{entry:e}),(0,j.jsxs)(`div`,{className:`flex flex-col flex-1`,children:[(0,j.jsx)(`h2`,{className:ie,children:e.name}),(0,j.jsx)(`p`,{className:`text-xs text-tertiary-light`,children:e.description})]})]}),e.installHint&&(0,j.jsx)(`p`,{className:`text-xs text-tertiary-light`,children:e.installHint}),e.docsUrl&&(0,j.jsx)(`a`,{href:e.docsUrl,target:`_blank`,rel:`noreferrer`,className:`text-xs text-[var(--oh-muted)] hover:text-white hover:underline self-start transition-colors`,children:a(m.MCP$VIEW_DOCS)}),(0,j.jsx)(`div`,{className:`flex flex-col gap-3`,children:(()=>{if(E?.kind===`shttp`||E?.kind===`sse`){let e=Xe(w),t=Q(w),n=w?Ze(w):!1,r=w?.auth.credentialSecretName,i=$(w);return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(T,{testId:`mcp-install-field-url`,name:`url`,type:`url`,label:a(m.SETTINGS$MCP_URL),value:h.values.url??E.url,onChange:e=>O(`url`,e),isDisabled:!E.urlEditable,className:`w-full`}),h.errors.url&&(0,j.jsx)(`p`,{className:`text-xs text-red-500`,children:h.errors.url}),i.map(e=>(0,j.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,j.jsx)(T,{testId:`mcp-install-field-${e.key}`,name:e.key,type:e.type===`password`?`password`:`text`,label:e.label,value:h.values[e.key]??``,onChange:t=>O(e.key,t),placeholder:e.placeholder,required:e.required,showOptionalTag:!e.required,className:`w-full`}),e.helperText&&(0,j.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:Z(e.helperText)}),h.errors[e.key]&&(0,j.jsx)(`p`,{className:`text-xs text-red-500`,children:h.errors[e.key]}),e.key in h.savedAsSecret&&(0,j.jsx)(M,{fieldKey:e.key,checked:h.savedAsSecret[e.key]??!1,onToggle:t=>k(e.key,t)})]},e.key)),e?(0,j.jsxs)(`div`,{"data-testid":`mcp-install-oauth-info`,className:`flex flex-col gap-2 p-3 rounded-lg border border-[var(--oh-border)] bg-base-tertiary`,children:[(0,j.jsx)(`p`,{className:`text-sm text-secondary-light`,children:a(m.MCP$OAUTH_CONNECT_INFO)}),(0,j.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:a(m.MCP$OAUTH_CONNECT_HINT)})]}):t?(0,j.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,j.jsx)(T,{testId:`mcp-install-field-api_key`,name:`api_key`,type:`password`,label:w?.auth.credentialLabel??a(m.SETTINGS$MCP_API_KEY),value:h.values.api_key??``,onChange:e=>O(`api_key`,e),placeholder:w?.auth.credentialPlaceholder??a(m.SETTINGS$MCP_API_KEY_PLACEHOLDER),showOptionalTag:n,required:!n,className:`w-full`}),w?.auth.credentialHelp&&(0,j.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:Z(w.auth.credentialHelp)}),h.errors.api_key&&(0,j.jsx)(`p`,{className:`text-xs text-red-500`,children:h.errors.api_key}),r&&(0,j.jsx)(M,{fieldKey:r,checked:h.savedAsSecret.api_key??!1,onToggle:e=>k(`api_key`,e)})]}):null]})}if(E?.kind!==`stdio`)return null;let e=E;return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(T,{testId:`mcp-install-field-command-readonly`,name:`command-readonly`,type:`text`,label:a(m.MCP$COMMAND_LABEL),value:`${e.command} ${e.args.join(` `)}`.trim(),onChange:()=>{},isDisabled:!0,className:`w-full`}),(e.envFields??[]).map(e=>(0,j.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,j.jsx)(T,{testId:`mcp-install-field-${e.key}`,name:e.key,type:e.type===`password`?`password`:`text`,label:e.label,value:h.values[e.key]??``,onChange:t=>O(e.key,t),placeholder:e.placeholder,required:e.required,showOptionalTag:!e.required,className:`w-full`}),e.helperText&&(0,j.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:Z(e.helperText)}),h.errors[e.key]&&(0,j.jsx)(`p`,{className:`text-xs text-red-500`,children:h.errors[e.key]}),e.key in h.savedAsSecret&&(0,j.jsx)(M,{fieldKey:e.key,checked:h.savedAsSecret[e.key],onToggle:t=>k(e.key,t)})]},e.key)),(e.argFields??[]).map(e=>(0,j.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,j.jsx)(T,{testId:`mcp-install-field-${e.key}`,name:e.key,type:e.type===`password`?`password`:`text`,label:e.label,value:h.values[e.key]??``,onChange:t=>O(e.key,t),placeholder:e.placeholder,required:e.required,showOptionalTag:!e.required,className:`w-full`}),e.helperText&&(0,j.jsx)(`p`,{className:`text-xs text-tertiary-alt`,children:Z(e.helperText)}),h.errors[e.key]&&(0,j.jsx)(`p`,{className:`text-xs text-red-500`,children:h.errors[e.key]})]},e.key))]})})()}),v&&(0,j.jsx)(`p`,{"data-testid":`mcp-install-modal-error`,className:`text-sm text-red-500 whitespace-pre-wrap`,children:v}),(0,j.jsxs)(`div`,{className:`flex justify-end gap-2 mt-2`,children:[(0,j.jsx)(ae,{type:`button`,variant:`secondary`,onClick:n,testId:`mcp-install-cancel`,isDisabled:D,children:a(m.BUTTON$CANCEL)}),(0,j.jsx)(ae,{type:`submit`,variant:`primary`,isDisabled:D,testId:`mcp-install-submit`,children:a(u||S?m.MCP$VERIFYING:s||b?m.SETTINGS$SAVING:m.MCP$INSTALL_BUTTON)})]})]})})}export{We as a,Ve as c,U as d,V as f,Ke as i,Le as l,X as n,Ge as o,de as p,qe as r,Y as s,$e as t,Re as u};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js";var t=e(`list-filter`,[[`path`,{d:`M2 5h20`,key:`1fs1ex`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`path`,{d:`M9 19h6`,key:`456am0`}]]);export{t};