@openhands/agent-canvas 1.0.0-rc.7 → 1.0.0-rc.9

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 (269) hide show
  1. package/README.md +1 -3
  2. package/README.windows.md +2 -2
  3. package/build/assets/{QueryClientProvider-2bFjjuvv.js → QueryClientProvider-XcSjsfpb.js} +1 -1
  4. package/build/assets/{Trans-D1xHkKyr.js → Trans-sy4l4TyQ.js} +1 -1
  5. package/build/assets/{acp-providers-Djbp2WMV.js → acp-providers-Dzb4nxxB.js} +1 -1
  6. package/build/assets/{active-backend-context-BiVlte2V.js → active-backend-context-B2OSC-qe.js} +1 -1
  7. package/build/assets/add-backend-modal-lG8XDYjr.js +1 -0
  8. package/build/assets/{agent-server-adapter-BD6kvwWb.js → agent-server-adapter-BPpZcLOE.js} +3 -3
  9. package/build/assets/agent-server-client-options-wXLeJYeM.js +1 -0
  10. package/build/assets/{agent-server-conversation-service.api-8AC86rC5.js → agent-server-conversation-service.api-C4Fc9Jnp.js} +1 -1
  11. package/build/assets/{agent-settings-DycVwGfd.js → agent-settings-Blipgztd.js} +1 -1
  12. package/build/assets/{alert-banner-BUqPui_3.js → alert-banner-Bsvys-hT.js} +1 -1
  13. package/build/assets/{analytics-consent-form-modal-D0KeG5vZ.js → analytics-consent-form-modal-Cujm1lCj.js} +1 -1
  14. package/build/assets/{api-key-entry-screen-BnvQM0v5.js → api-key-entry-screen-BarZU9nr.js} +1 -1
  15. package/build/assets/{app-settings-FRYUtG-Z.js → app-settings-CofRfixq.js} +1 -1
  16. package/build/assets/{automation-detail-DiIq3Vsh.js → automation-detail-BV4Cn0O8.js} +1 -1
  17. package/build/assets/{automations-list-DQn7k1Ix.js → automations-list-BaJ61q7P.js} +1 -1
  18. package/build/assets/{back-nav-button-B8eULM4t.js → back-nav-button-D20Avel_.js} +1 -1
  19. package/build/assets/{backend-form-modal-DY3My0us.js → backend-form-modal-B3BCZDPq.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-BW2WPX-c.js → backend-synced-settings-badge-Da0G6Lwv.js} +1 -1
  21. package/build/assets/{base-modal-B_MCb3rx.js → base-modal-DvuGYyu1.js} +1 -1
  22. package/build/assets/{brand-button-B6g_UvEG.js → brand-button-9SOzmqPP.js} +1 -1
  23. package/build/assets/{browser-tab-DVHx54yn.js → browser-tab-bveyJhG9.js} +1 -1
  24. package/build/assets/{chat-send-button-Ce9rK8Vd.js → chat-send-button-DzRpAQr4.js} +1 -1
  25. package/build/assets/{checkmark-BQIxLn5W.js → checkmark--JWAesua.js} +1 -1
  26. package/build/assets/{circle-plus-check-toggle-DRwQ4Z7K.js → circle-plus-check-toggle-AO9DWyDX.js} +1 -1
  27. package/build/assets/{close-HybccyBS.js → close--W-tHn1h.js} +1 -1
  28. package/build/assets/{code-tag-DZCEX2zo.js → code-tag-chmctf4w.js} +1 -1
  29. package/build/assets/{combobox-caret-kEa3kTvf.js → combobox-caret-C9BNHfSu.js} +1 -1
  30. package/build/assets/{condenser-settings-BlbT8YRd.js → condenser-settings-Bo07FAEi.js} +1 -1
  31. package/build/assets/{confirmation-modal-CG_Fgrny.js → confirmation-modal-Cq3eqvqH.js} +1 -1
  32. package/build/assets/{context-menu-list-item-CvJv3-kq.js → context-menu-list-item-BQU0jZPq.js} +1 -1
  33. package/build/assets/conversation-DDdRyW4z.js +19 -0
  34. package/build/assets/conversation-panel-Dww2uJOd.js +1 -0
  35. package/build/assets/conversation-rGQV1Eym.js +1 -0
  36. package/build/assets/{conversation-service.api-CngSQhPh.js → conversation-service.api-ByRiRU1e.js} +1 -1
  37. package/build/assets/{conversation-tab-empty-state-B5eOSEGv.js → conversation-tab-empty-state-C8tztloo.js} +1 -1
  38. package/build/assets/{copy-D6CyDz2n.js → copy-CdKN5rtJ.js} +1 -1
  39. package/build/assets/{declaration-BDfM67Kl.js → declaration-D9ucT0fq.js} +1 -1
  40. package/build/assets/{device-verify-CAevP6_3.js → device-verify-YuGXnpRk.js} +1 -1
  41. package/build/assets/{dropdown-classes-CL8egwz_.js → dropdown-classes-CVp0kVdt.js} +1 -1
  42. package/build/assets/{edit-automation-modal-CwLfhSMN.js → edit-automation-modal-CpA_JKLY.js} +1 -1
  43. package/build/assets/{ellipsis-button-Db-AwbLv.js → ellipsis-button-k7HLwYth.js} +1 -1
  44. package/build/assets/{entry.client-BKDpKmdB.js → entry.client-DUpefbBp.js} +2 -2
  45. package/build/assets/{enum-filter-dropdown-DnYXhc1E.js → enum-filter-dropdown-COqUq3mB.js} +1 -1
  46. package/build/assets/{environment-switch-overlay-BgYKFdf6.js → environment-switch-overlay-wB5LxfYZ.js} +1 -1
  47. package/build/assets/{extensions-hub-CgisT2wb.js → extensions-hub-BYCLWP3d.js} +1 -1
  48. package/build/assets/{extensions-navigation-nurGkQe5.js → extensions-navigation-3FLKfb6g.js} +1 -1
  49. package/build/assets/{files-tab-DIyAYvp0.js → files-tab-CBUPwSV1.js} +1 -1
  50. package/build/assets/{files-tab-store-RScGdwu8.js → files-tab-store-DSKUhziI.js} +1 -1
  51. package/build/assets/{folder-IChmji2Y.js → folder-DPTBlxWb.js} +1 -1
  52. package/build/assets/home-BDCL0Psk.js +1 -0
  53. package/build/assets/{install-server-modal-C8fylTet.js → install-server-modal-CWZhBKwH.js} +1 -1
  54. package/build/assets/{launch-BNiqgTvz.js → launch-CMZknx1e.js} +1 -1
  55. package/build/assets/{lesson-plan-BdmMvboE.js → lesson-plan-y520IDs6.js} +1 -1
  56. package/build/assets/{lightbulb-DzViGAuw.js → lightbulb-S616sGEL.js} +1 -1
  57. package/build/assets/{link-external-Dwv3oQAx.js → link-external-ooNztGLp.js} +1 -1
  58. package/build/assets/{llm-client-P9f2gKeW.js → llm-client-D6EtdLBs.js} +1 -1
  59. package/build/assets/llm-not-configured-banner-CJyURBCm.js +27 -0
  60. package/build/assets/llm-settings-BW6yW2Go.js +1 -0
  61. package/build/assets/{llm-settings-B92l1Z2N.js → llm-settings-CiY22Wzi.js} +1 -1
  62. package/build/assets/{loading-spinner-Dtm7y-w5.js → loading-spinner-D7bOU6I7.js} +1 -1
  63. package/build/assets/{manage-backends-modal-qpq2M_oN.js → manage-backends-modal-v5POMal5.js} +1 -1
  64. package/build/assets/manifest-eccb7f46.js +1 -0
  65. package/build/assets/{markdown-renderer-Dt0RXhUJ.js → markdown-renderer-z446oW0Z.js} +1 -1
  66. package/build/assets/{mcp-BKdD21xY.js → mcp-DgPFZ_Dv.js} +1 -1
  67. package/build/assets/{messages-Ch8Rd1cx.js → messages-Dq6AQ8mp.js} +1 -1
  68. package/build/assets/{modal-backdrop-DmDLoot0.js → modal-backdrop-_VbcKk5K.js} +1 -1
  69. package/build/assets/{modal-body-BWjhfiSa.js → modal-body-Cd-PtMHr.js} +1 -1
  70. package/build/assets/{modal-classes-DbJbhQCW.js → modal-classes-CNm4ovfm.js} +1 -1
  71. package/build/assets/{modal-close-button-DXN6uYvt.js → modal-close-button-Dbo0NAMt.js} +1 -1
  72. package/build/assets/{model-selector-BMn4D5v6.js → model-selector-CdZs21EZ.js} +1 -1
  73. package/build/assets/{navigation-context-BrRCrWhm.js → navigation-context-BpAOh_t5.js} +1 -1
  74. package/build/assets/{navigation-link-qUrH_I5_.js → navigation-link-Dci7Nuyf.js} +1 -1
  75. package/build/assets/{onboarding-B50IeNyy.js → onboarding-Cdwu8QIy.js} +1 -1
  76. package/build/assets/{openhands-logo-DnfHAq7Y.js → openhands-logo-Dzm-d_V_.js} +1 -1
  77. package/build/assets/{option-service.api-lzN_3s9w.js → option-service.api-CdYnKVsu.js} +1 -1
  78. package/build/assets/{organization-service.api-CNmSPGj4.js → organization-service.api-CzMvXIQT.js} +1 -1
  79. package/build/assets/{path-utils-CKgIQZAY.js → path-utils-DKu3CNkH.js} +1 -1
  80. package/build/assets/{plan-components-D9fU4FFh.js → plan-components-CutRBi0G.js} +1 -1
  81. package/build/assets/{planner-tab-B7kpsTT8.js → planner-tab-YkOp7QXt.js} +1 -1
  82. package/build/assets/{profiles-client-BNvHck-I.js → profiles-client-BjUo3q05.js} +1 -1
  83. package/build/assets/{providers-189W9TJO.js → providers-CbpQft-X.js} +1 -1
  84. package/build/assets/{proxy--Uy1iGsW.js → proxy-Bx3NeKeo.js} +1 -1
  85. package/build/assets/{query-client-config-B9ZI-1_w.js → query-client-config-Ca3tW1AH.js} +1 -1
  86. package/build/assets/{recommended-automations-launcher-C_RcP2yb.js → recommended-automations-launcher-WxaZcjRD.js} +1 -1
  87. package/build/assets/{root-Bz22PITD.js → root-CiNoOVrb.js} +2 -2
  88. package/build/assets/{root-layout-B8swq9fS.js → root-layout-DUw-s9LS.js} +2 -2
  89. package/build/assets/{runtime-waiting-state-DPjfE32a.js → runtime-waiting-state-8i0Z3A_i.js} +1 -1
  90. package/build/assets/{sdk-section-page-ozvrzW4r.js → sdk-section-page-DPBwwLle.js} +1 -1
  91. package/build/assets/{sdk-settings-schema-Ck6f2ON9.js → sdk-settings-schema-Big50zDH.js} +1 -1
  92. package/build/assets/{search-aDWSdSb7.js → search-C_l_XW4e.js} +1 -1
  93. package/build/assets/{secrets-service-D6Gcymcs.js → secrets-service-Skzza9sx.js} +1 -1
  94. package/build/assets/{secrets-settings-Bga0bwB1.js → secrets-settings-DmpsTC9V.js} +1 -1
  95. package/build/assets/{settings-DHAhcPm2.js → settings-ChsRtIJQ.js} +1 -1
  96. package/build/assets/{settings-dropdown-input-N0FtDFkk.js → settings-dropdown-input-BP-arqjU.js} +1 -1
  97. package/build/assets/{settings-gear-D8ao16bi.js → settings-gear-f-zWpxfI.js} +1 -1
  98. package/build/assets/{settings-index-CJvQH5ls.js → settings-index-BLfmrKRl.js} +1 -1
  99. package/build/assets/{settings-input-CyWJBrqC.js → settings-input-BM8ANxDb.js} +1 -1
  100. package/build/assets/{settings-list-classes-CYRnRf8r.js → settings-list-classes-B9uo5WES.js} +1 -1
  101. package/build/assets/{settings-modal-BeAlR7Be.js → settings-modal-Cth7Zb-I.js} +1 -1
  102. package/build/assets/{settings-section-header-context-1fN7Xkb3.js → settings-section-header-context-Cid25HM2.js} +1 -1
  103. package/build/assets/{settings-service.api-CFt5HmXD.js → settings-service.api-CcpckquT.js} +1 -1
  104. package/build/assets/{settings-switch-D3aEIphL.js → settings-switch-xa6q4M6j.js} +1 -1
  105. package/build/assets/{shared-conversation-CtRf6CQN.js → shared-conversation-Y0C8zqdr.js} +1 -1
  106. package/build/assets/{sidebar-mobile-menu-toggle-DkYaKR6Q.js → sidebar-mobile-menu-toggle-BvcBXvLY.js} +1 -1
  107. package/build/assets/{sidebar-nav-link-CzeuB4So.js → sidebar-nav-link-BekRAssb.js} +1 -1
  108. package/build/assets/{skill-card-pill-row-CvLCLqqD.js → skill-card-pill-row-DeodrwPG.js} +1 -1
  109. package/build/assets/{skills-jKeJCunm.js → skills-BE5HJuGM.js} +1 -1
  110. package/build/assets/{skills-client-Ui_9FvXp.js → skills-client-CgraS-wA.js} +1 -1
  111. package/build/assets/{skills-plugins-juwPhlEE.js → skills-plugins-rIza_fUf.js} +1 -1
  112. package/build/assets/{skills-settings-BW09n_Px.js → skills-settings-Dvl7gpEx.js} +1 -1
  113. package/build/assets/{styled-tooltip-B3wz8m5E.js → styled-tooltip-X61SEwqk.js} +1 -1
  114. package/build/assets/{suspense-BpkWt-39.js → suspense-Bqb0V0q1.js} +1 -1
  115. package/build/assets/{switch-skeleton-Cl_Nh2kt.js → switch-skeleton-BbIWemkK.js} +1 -1
  116. package/build/assets/{task-list-tab-DKnHShLG.js → task-list-tab-BFnyHGsn.js} +1 -1
  117. package/build/assets/{telemetry-DR_3fMN0.js → telemetry-CAWBJ_rB.js} +1 -1
  118. package/build/assets/{terminal-BFi5FOMc.js → terminal-B92mACR5.js} +1 -1
  119. package/build/assets/{terminal-CZH2h1J3.js → terminal-BFypysgZ.js} +1 -1
  120. package/build/assets/{toggle-switch-BzaEofjj.js → toggle-switch-CL_wRiGs.js} +1 -1
  121. package/build/assets/{typography-BFj4IzMj.js → typography-BLSEGjph.js} +1 -1
  122. package/build/assets/{u-check-circle-Cs2GOrZ7.js → u-check-circle-dG_VJqx5.js} +1 -1
  123. package/build/assets/{u-check-circle-half-DGgLKVV1.js → u-check-circle-half-D-5ZPRnd.js} +1 -1
  124. package/build/assets/{u-circuit-DniZPNAV.js → u-circuit-BXoisXOA.js} +1 -1
  125. package/build/assets/{u-edit-BvTiDr33.js → u-edit-DIgADxLH.js} +1 -1
  126. package/build/assets/{use-acp-credential-form-8yHKY_py.js → use-acp-credential-form-Dj7Jkhgp.js} +1 -1
  127. package/build/assets/{use-active-conversation-CLzls6XV.js → use-active-conversation-BkohEtaN.js} +1 -1
  128. package/build/assets/{use-agent-settings-schema-BCXxH2N-.js → use-agent-settings-schema-Lf_lBAky.js} +1 -1
  129. package/build/assets/{use-agent-state-BocVPR5S.js → use-agent-state-DITv5qV7.js} +1 -1
  130. package/build/assets/{use-cloud-current-user-id-BjDwnldw.js → use-cloud-current-user-id-CSm3kgqy.js} +1 -1
  131. package/build/assets/use-config-DVU9HaPf.js +1 -0
  132. package/build/assets/{use-create-conversation-CIkPp9u9.js → use-create-conversation-CJUAOf1q.js} +1 -1
  133. package/build/assets/{use-create-secret-Bwy6457V.js → use-create-secret-LObNBU3M.js} +1 -1
  134. package/build/assets/{use-handle-plan-click-CjNwpDeO.js → use-handle-plan-click-BdcdMWbv.js} +1 -1
  135. package/build/assets/use-is-authed-B8eLO-Xq.js +1 -0
  136. package/build/assets/{use-launch-skill-in-chat-QmcJQxUY.js → use-launch-skill-in-chat-BTgXIu3N.js} +1 -1
  137. package/build/assets/{use-llm-profiles-CZD1ALup.js → use-llm-profiles-BBTR-OsK.js} +1 -1
  138. package/build/assets/use-runtime-is-ready-BOQpqCvp.js +1 -0
  139. package/build/assets/{use-save-settings-BjYPOrtF.js → use-save-settings-7_MLft-Y.js} +1 -1
  140. package/build/assets/{use-settings-YTDcMvj1.js → use-settings-CNsxccvQ.js} +1 -1
  141. package/build/assets/{use-settings-nav-items-DMit9adK.js → use-settings-nav-items-ykMjd_NG.js} +1 -1
  142. package/build/assets/{use-skills-fh_U4ZGe.js → use-skills-_unimM2d.js} +1 -1
  143. package/build/assets/{use-tracking-DJ3Z7ha1.js → use-tracking-C9P88zSo.js} +1 -1
  144. package/build/assets/{use-user-conversation-Ct93yaXj.js → use-user-conversation-2jZZ-MLA.js} +1 -1
  145. package/build/assets/{useMutation-B1gQr_yr.js → useMutation-Dm84WAKR.js} +1 -1
  146. package/build/assets/{useQuery-CbqdITLM.js → useQuery-DGRSm7IT.js} +1 -1
  147. package/build/assets/{useTranslation-C-T8J2U-.js → useTranslation-CL6FTf1b.js} +1 -1
  148. package/build/assets/{utils-CXRkUr73.js → utils-eXk6yerZ.js} +1 -1
  149. package/build/assets/{vendor~conversation-panel~conversation-CkFCLbQW.js → vendor~conversation-panel~conversation-D98u43rl.js} +1 -1
  150. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-C1BmvJX4.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dqpi2xyZ.js} +1 -1
  151. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-RuHTcYaf.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-7eqKdLSQ.js} +1 -1
  152. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-B04AZhMW.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-BP3MGAAY.js} +1 -1
  153. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-D7ZsdcLa.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-Dkd2wxJA.js} +1 -1
  154. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-CGm-Jxp5.js → vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-DQE89epK.js} +1 -1
  155. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~mcp~automati~dou5smdo-DH07jaIY.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~mcp~automati~dou5smdo-DavKsAvB.js} +186 -40
  156. package/build/assets/{vendor~root-layout~home~mcp~automations-list-COlx7Is6.js → vendor~root-layout~home~mcp~automations-list-D40jgugf.js} +1 -1
  157. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-DuiHR4ce.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BIm99UaF.js} +1 -1
  158. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-4yr76Evz.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-xCM3k6Rd.js} +1 -1
  159. package/build/assets/{verification-settings-CeIuPtF2.js → verification-settings-EUkt_CkZ.js} +1 -1
  160. package/build/assets/{x-mark-BMhi11Sg.js → x-mark-C42svtnu.js} +1 -1
  161. package/build/index.html +4 -4
  162. package/build/locales/ar/openhands.json +45 -40
  163. package/build/locales/ca/openhands.json +41 -36
  164. package/build/locales/de/openhands.json +42 -37
  165. package/build/locales/en/openhands.json +6 -1
  166. package/build/locales/es/openhands.json +44 -39
  167. package/build/locales/fr/openhands.json +44 -39
  168. package/build/locales/it/openhands.json +44 -39
  169. package/build/locales/ja/openhands.json +44 -39
  170. package/build/locales/ko-KR/openhands.json +44 -39
  171. package/build/locales/no/openhands.json +44 -39
  172. package/build/locales/pt/openhands.json +44 -39
  173. package/build/locales/tr/openhands.json +43 -38
  174. package/build/locales/uk/openhands.json +44 -39
  175. package/build/locales/zh-CN/openhands.json +44 -39
  176. package/build/locales/zh-TW/openhands.json +44 -39
  177. package/config/defaults.json +4 -4
  178. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  179. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  180. package/dist/components/features/backends/backend-form-modal.js +1 -1
  181. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  182. package/dist/components/features/chat/chat-interface.cjs +1 -1
  183. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  184. package/dist/components/features/chat/chat-interface.js +1 -1
  185. package/dist/components/features/chat/chat-interface.js.map +1 -1
  186. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  187. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  188. package/dist/components/features/chat/git-control-bar.js +1 -1
  189. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  190. package/dist/components/features/chat/open-repository-modal.cjs +1 -1
  191. package/dist/components/features/chat/open-repository-modal.cjs.map +1 -1
  192. package/dist/components/features/chat/open-repository-modal.js +0 -3
  193. package/dist/components/features/chat/open-repository-modal.js.map +1 -1
  194. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  195. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  196. package/dist/components/features/chat/pending-user-messages.js +31 -28
  197. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  198. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs +1 -1
  199. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs.map +1 -1
  200. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js +79 -77
  201. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js.map +1 -1
  202. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs +1 -1
  203. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs.map +1 -1
  204. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js +67 -65
  205. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js.map +1 -1
  206. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
  207. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
  208. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +2 -2
  209. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js.map +1 -1
  210. package/dist/components/features/settings/settings-navigation.cjs +1 -1
  211. package/dist/components/features/settings/settings-navigation.cjs.map +1 -1
  212. package/dist/components/features/settings/settings-navigation.js +1 -1
  213. package/dist/components/features/settings/settings-navigation.js.map +1 -1
  214. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  215. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  216. package/dist/components/features/sidebar/sidebar.js +3 -2
  217. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  218. package/dist/i18n/declaration.cjs +1 -1
  219. package/dist/i18n/declaration.cjs.map +1 -1
  220. package/dist/i18n/declaration.d.ts +6 -1
  221. package/dist/i18n/declaration.js +1 -1
  222. package/dist/i18n/declaration.js.map +1 -1
  223. package/dist/i18n/translation.cjs +3 -3
  224. package/dist/i18n/translation.cjs.map +1 -1
  225. package/dist/i18n/translation.js +612 -527
  226. package/dist/i18n/translation.js.map +1 -1
  227. package/dist/locales/ar/openhands.json +45 -40
  228. package/dist/locales/ca/openhands.json +41 -36
  229. package/dist/locales/de/openhands.json +42 -37
  230. package/dist/locales/en/openhands.json +6 -1
  231. package/dist/locales/es/openhands.json +44 -39
  232. package/dist/locales/fr/openhands.json +44 -39
  233. package/dist/locales/it/openhands.json +44 -39
  234. package/dist/locales/ja/openhands.json +44 -39
  235. package/dist/locales/ko-KR/openhands.json +44 -39
  236. package/dist/locales/no/openhands.json +44 -39
  237. package/dist/locales/pt/openhands.json +44 -39
  238. package/dist/locales/tr/openhands.json +43 -38
  239. package/dist/locales/uk/openhands.json +44 -39
  240. package/dist/locales/zh-CN/openhands.json +44 -39
  241. package/dist/locales/zh-TW/openhands.json +44 -39
  242. package/dist/node_modules/@openhands/extensions/skills/index.cjs +186 -40
  243. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  244. package/dist/node_modules/@openhands/extensions/skills/index.js +2 -2
  245. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  246. package/dist/package.cjs +1 -1
  247. package/dist/package.cjs.map +1 -1
  248. package/dist/package.js +2 -2
  249. package/dist/package.js.map +1 -1
  250. package/dist/utils/websocket-url.cjs +1 -1
  251. package/dist/utils/websocket-url.cjs.map +1 -1
  252. package/dist/utils/websocket-url.js +2 -2
  253. package/dist/utils/websocket-url.js.map +1 -1
  254. package/package.json +2 -2
  255. package/scripts/check-sdk-version-sync.mjs +6 -6
  256. package/scripts/check-translation-completeness.cjs +149 -59
  257. package/scripts/dev-safe.mjs +1 -1
  258. package/build/assets/add-backend-modal-CSfOPrnr.js +0 -1
  259. package/build/assets/agent-server-client-options-B-C8JaTb.js +0 -1
  260. package/build/assets/conversation-B7ztPdyS.js +0 -1
  261. package/build/assets/conversation-DZYd8QiZ.js +0 -19
  262. package/build/assets/conversation-panel-CklMXcs6.js +0 -1
  263. package/build/assets/home-iVOrSOWL.js +0 -1
  264. package/build/assets/llm-not-configured-banner-BQgVTo0O.js +0 -27
  265. package/build/assets/llm-settings-ICWFhhjM.js +0 -1
  266. package/build/assets/manifest-d230d4a5.js +0 -1
  267. package/build/assets/use-config-C4DX1-nF.js +0 -1
  268. package/build/assets/use-is-authed-7P3xSsit.js +0 -1
  269. package/build/assets/use-runtime-is-ready-B7sbw-q5.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"open-repository-modal.cjs","names":[],"sources":["../../../../src/components/features/chat/open-repository-modal.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { BaseModalTitle } from \"#/components/shared/modals/confirmation-modals/base-modal\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { GitRepoDropdown } from \"#/components/features/home/git-repo-dropdown/git-repo-dropdown\";\nimport { GitBranchDropdown } from \"#/components/features/home/git-branch-dropdown/git-branch-dropdown\";\nimport { GitProviderDropdown } from \"#/components/features/home/git-provider-dropdown/git-provider-dropdown\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\n\ninterface OpenRepositoryModalProps {\n isOpen: boolean;\n onClose: () => void;\n onLaunch: (repository: GitRepository, branch: Branch) => void;\n defaultProvider?: Provider;\n}\n\nexport function OpenRepositoryModal({\n isOpen,\n onClose,\n onLaunch,\n defaultProvider = \"github\",\n}: OpenRepositoryModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { providers } = useUserProviders();\n\n const [selectedProvider, setSelectedProvider] = useState<Provider | null>(\n null,\n );\n const [selectedRepository, setSelectedRepository] =\n useState<GitRepository | null>(null);\n const [selectedBranch, setSelectedBranch] = useState<Branch | null>(null);\n\n // Auto-select provider: single provider auto-selects, multiple uses defaultProvider if available\n useEffect(() => {\n if (providers.length === 1 && !selectedProvider) {\n setSelectedProvider(providers[0]);\n } else if (providers.length > 1 && !selectedProvider && defaultProvider) {\n if (providers.includes(defaultProvider)) {\n setSelectedProvider(defaultProvider);\n }\n }\n }, [providers, selectedProvider, defaultProvider]);\n\n const handleProviderChange = useCallback(\n (provider: Provider | null) => {\n if (provider === selectedProvider) return;\n setSelectedProvider(provider);\n setSelectedRepository(null);\n setSelectedBranch(null);\n },\n [selectedProvider],\n );\n\n const handleRepositoryChange = useCallback((repository?: GitRepository) => {\n if (repository) {\n setSelectedRepository(repository);\n setSelectedBranch(null);\n } else {\n setSelectedRepository(null);\n setSelectedBranch(null);\n }\n }, []);\n\n const handleBranchSelect = useCallback((branch: Branch | null) => {\n setSelectedBranch(branch);\n }, []);\n\n const handleLaunch = () => {\n if (!selectedRepository || !selectedBranch) return;\n\n onLaunch(selectedRepository, selectedBranch);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n const handleClose = () => {\n setSelectedProvider(null);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const activeProvider =\n selectedRepository?.git_provider || selectedProvider || defaultProvider;\n const canLaunch = !!selectedRepository && !!selectedBranch;\n\n return (\n <ModalBackdrop onClose={handleClose}>\n <ModalBody\n width=\"sm\"\n className=\"relative items-start border border-[var(--oh-border)] !gap-4\"\n >\n <ModalCloseButton\n onClose={handleClose}\n testId=\"close-open-repository-modal\"\n />\n <div className=\"w-full pr-6\">\n <BaseModalTitle title={t(I18nKey.CONVERSATION$OPEN_REPOSITORY)} />\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-white font-normal leading-[22px]\">\n {t(I18nKey.CONVERSATION$SELECT_OR_INSERT_LINK)}\n </span>\n {providers.length > 1 && (\n <GitProviderDropdown\n providers={providers}\n value={selectedProvider}\n placeholder=\"Select Provider\"\n onChange={handleProviderChange}\n />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[10px] w-full\">\n <GitRepoDropdown\n provider={activeProvider}\n value={selectedRepository?.id || null}\n repositoryName={selectedRepository?.full_name || null}\n onChange={handleRepositoryChange}\n placeholder=\"Search repositories...\"\n className=\"w-full\"\n />\n\n <GitBranchDropdown\n repository={selectedRepository?.full_name || null}\n provider={activeProvider}\n selectedBranch={selectedBranch}\n onBranchSelect={handleBranchSelect}\n defaultBranch={selectedRepository?.main_branch || null}\n placeholder=\"Select branch...\"\n disabled={!selectedRepository}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div\n className=\"flex justify-end gap-2 w-full\"\n onClick={(event) => event.stopPropagation()}\n >\n <BrandButton type=\"button\" variant=\"secondary\" onClick={handleClose}>\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={handleLaunch}\n isDisabled={!canLaunch}\n >\n {t(I18nKey.BUTTON$LAUNCH)}\n </BrandButton>\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"open-repository-modal.cjs","names":[],"sources":["../../../../src/components/features/chat/open-repository-modal.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { BaseModalTitle } from \"#/components/shared/modals/confirmation-modals/base-modal\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { GitRepoDropdown } from \"#/components/features/home/git-repo-dropdown/git-repo-dropdown\";\nimport { GitBranchDropdown } from \"#/components/features/home/git-branch-dropdown/git-branch-dropdown\";\nimport { GitProviderDropdown } from \"#/components/features/home/git-provider-dropdown/git-provider-dropdown\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\n\ninterface OpenRepositoryModalProps {\n isOpen: boolean;\n onClose: () => void;\n onLaunch: (repository: GitRepository, branch: Branch) => void;\n defaultProvider?: Provider;\n}\n\nexport function OpenRepositoryModal({\n isOpen,\n onClose,\n onLaunch,\n defaultProvider = \"github\",\n}: OpenRepositoryModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { providers } = useUserProviders();\n\n const [selectedProvider, setSelectedProvider] = useState<Provider | null>(\n null,\n );\n const [selectedRepository, setSelectedRepository] =\n useState<GitRepository | null>(null);\n const [selectedBranch, setSelectedBranch] = useState<Branch | null>(null);\n\n // Auto-select provider: single provider auto-selects, multiple uses defaultProvider if available\n useEffect(() => {\n if (providers.length === 1 && !selectedProvider) {\n setSelectedProvider(providers[0]);\n } else if (providers.length > 1 && !selectedProvider && defaultProvider) {\n if (providers.includes(defaultProvider)) {\n setSelectedProvider(defaultProvider);\n }\n }\n }, [providers, selectedProvider, defaultProvider]);\n\n const handleProviderChange = useCallback(\n (provider: Provider | null) => {\n if (provider === selectedProvider) return;\n setSelectedProvider(provider);\n setSelectedRepository(null);\n setSelectedBranch(null);\n },\n [selectedProvider],\n );\n\n const handleRepositoryChange = useCallback((repository?: GitRepository) => {\n if (repository) {\n setSelectedRepository(repository);\n setSelectedBranch(null);\n } else {\n setSelectedRepository(null);\n setSelectedBranch(null);\n }\n }, []);\n\n const handleBranchSelect = useCallback((branch: Branch | null) => {\n setSelectedBranch(branch);\n }, []);\n\n const handleLaunch = () => {\n if (!selectedRepository || !selectedBranch) return;\n\n onLaunch(selectedRepository, selectedBranch);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n const handleClose = () => {\n setSelectedProvider(null);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const activeProvider =\n selectedRepository?.git_provider || selectedProvider || defaultProvider;\n const canLaunch = !!selectedRepository && !!selectedBranch;\n\n return (\n <ModalBackdrop onClose={handleClose}>\n <ModalBody\n width=\"sm\"\n className=\"relative items-start border border-[var(--oh-border)] !gap-4\"\n >\n <ModalCloseButton\n onClose={handleClose}\n testId=\"close-open-repository-modal\"\n />\n <div className=\"w-full pr-6\">\n <BaseModalTitle title={t(I18nKey.CONVERSATION$OPEN_REPOSITORY)} />\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-white font-normal leading-[22px]\">\n {t(I18nKey.CONVERSATION$SELECT_OR_INSERT_LINK)}\n </span>\n {providers.length > 1 && (\n <GitProviderDropdown\n providers={providers}\n value={selectedProvider}\n onChange={handleProviderChange}\n />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[10px] w-full\">\n <GitRepoDropdown\n provider={activeProvider}\n value={selectedRepository?.id || null}\n repositoryName={selectedRepository?.full_name || null}\n onChange={handleRepositoryChange}\n className=\"w-full\"\n />\n\n <GitBranchDropdown\n repository={selectedRepository?.full_name || null}\n provider={activeProvider}\n selectedBranch={selectedBranch}\n onBranchSelect={handleBranchSelect}\n defaultBranch={selectedRepository?.main_branch || null}\n disabled={!selectedRepository}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div\n className=\"flex justify-end gap-2 w-full\"\n onClick={(event) => event.stopPropagation()}\n >\n <BrandButton type=\"button\" variant=\"secondary\" onClick={handleClose}>\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={handleLaunch}\n isDisabled={!canLaunch}\n >\n {t(I18nKey.BUTTON$LAUNCH)}\n </BrandButton>\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":"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"}
@@ -58,7 +58,6 @@ function g({ isOpen: g, onClose: _, onLaunch: v, defaultProvider: y = "github" }
58
58
  }), x.length > 1 && /* @__PURE__ */ m(u, {
59
59
  providers: x,
60
60
  value: S,
61
- placeholder: "Select Provider",
62
61
  onChange: O
63
62
  })]
64
63
  }), /* @__PURE__ */ h("div", {
@@ -68,7 +67,6 @@ function g({ isOpen: g, onClose: _, onLaunch: v, defaultProvider: y = "github" }
68
67
  value: w?.id || null,
69
68
  repositoryName: w?.full_name || null,
70
69
  onChange: k,
71
- placeholder: "Search repositories...",
72
70
  className: "w-full"
73
71
  }), /* @__PURE__ */ m(l, {
74
72
  repository: w?.full_name || null,
@@ -76,7 +74,6 @@ function g({ isOpen: g, onClose: _, onLaunch: v, defaultProvider: y = "github" }
76
74
  selectedBranch: E,
77
75
  onBranchSelect: A,
78
76
  defaultBranch: w?.main_branch || null,
79
- placeholder: "Select branch...",
80
77
  disabled: !w,
81
78
  className: "w-full"
82
79
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"open-repository-modal.js","names":[],"sources":["../../../../src/components/features/chat/open-repository-modal.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { BaseModalTitle } from \"#/components/shared/modals/confirmation-modals/base-modal\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { GitRepoDropdown } from \"#/components/features/home/git-repo-dropdown/git-repo-dropdown\";\nimport { GitBranchDropdown } from \"#/components/features/home/git-branch-dropdown/git-branch-dropdown\";\nimport { GitProviderDropdown } from \"#/components/features/home/git-provider-dropdown/git-provider-dropdown\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\n\ninterface OpenRepositoryModalProps {\n isOpen: boolean;\n onClose: () => void;\n onLaunch: (repository: GitRepository, branch: Branch) => void;\n defaultProvider?: Provider;\n}\n\nexport function OpenRepositoryModal({\n isOpen,\n onClose,\n onLaunch,\n defaultProvider = \"github\",\n}: OpenRepositoryModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { providers } = useUserProviders();\n\n const [selectedProvider, setSelectedProvider] = useState<Provider | null>(\n null,\n );\n const [selectedRepository, setSelectedRepository] =\n useState<GitRepository | null>(null);\n const [selectedBranch, setSelectedBranch] = useState<Branch | null>(null);\n\n // Auto-select provider: single provider auto-selects, multiple uses defaultProvider if available\n useEffect(() => {\n if (providers.length === 1 && !selectedProvider) {\n setSelectedProvider(providers[0]);\n } else if (providers.length > 1 && !selectedProvider && defaultProvider) {\n if (providers.includes(defaultProvider)) {\n setSelectedProvider(defaultProvider);\n }\n }\n }, [providers, selectedProvider, defaultProvider]);\n\n const handleProviderChange = useCallback(\n (provider: Provider | null) => {\n if (provider === selectedProvider) return;\n setSelectedProvider(provider);\n setSelectedRepository(null);\n setSelectedBranch(null);\n },\n [selectedProvider],\n );\n\n const handleRepositoryChange = useCallback((repository?: GitRepository) => {\n if (repository) {\n setSelectedRepository(repository);\n setSelectedBranch(null);\n } else {\n setSelectedRepository(null);\n setSelectedBranch(null);\n }\n }, []);\n\n const handleBranchSelect = useCallback((branch: Branch | null) => {\n setSelectedBranch(branch);\n }, []);\n\n const handleLaunch = () => {\n if (!selectedRepository || !selectedBranch) return;\n\n onLaunch(selectedRepository, selectedBranch);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n const handleClose = () => {\n setSelectedProvider(null);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const activeProvider =\n selectedRepository?.git_provider || selectedProvider || defaultProvider;\n const canLaunch = !!selectedRepository && !!selectedBranch;\n\n return (\n <ModalBackdrop onClose={handleClose}>\n <ModalBody\n width=\"sm\"\n className=\"relative items-start border border-[var(--oh-border)] !gap-4\"\n >\n <ModalCloseButton\n onClose={handleClose}\n testId=\"close-open-repository-modal\"\n />\n <div className=\"w-full pr-6\">\n <BaseModalTitle title={t(I18nKey.CONVERSATION$OPEN_REPOSITORY)} />\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-white font-normal leading-[22px]\">\n {t(I18nKey.CONVERSATION$SELECT_OR_INSERT_LINK)}\n </span>\n {providers.length > 1 && (\n <GitProviderDropdown\n providers={providers}\n value={selectedProvider}\n placeholder=\"Select Provider\"\n onChange={handleProviderChange}\n />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[10px] w-full\">\n <GitRepoDropdown\n provider={activeProvider}\n value={selectedRepository?.id || null}\n repositoryName={selectedRepository?.full_name || null}\n onChange={handleRepositoryChange}\n placeholder=\"Search repositories...\"\n className=\"w-full\"\n />\n\n <GitBranchDropdown\n repository={selectedRepository?.full_name || null}\n provider={activeProvider}\n selectedBranch={selectedBranch}\n onBranchSelect={handleBranchSelect}\n defaultBranch={selectedRepository?.main_branch || null}\n placeholder=\"Select branch...\"\n disabled={!selectedRepository}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div\n className=\"flex justify-end gap-2 w-full\"\n onClick={(event) => event.stopPropagation()}\n >\n <BrandButton type=\"button\" variant=\"secondary\" onClick={handleClose}>\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={handleLaunch}\n isDisabled={!canLaunch}\n >\n {t(I18nKey.BUTTON$LAUNCH)}\n </BrandButton>\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,SAAgB,EAAoB,EAClC,WACA,YACA,aACA,qBAAkB,YACS;CAC3B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,iBAAc,GAAkB,EAElC,CAAC,GAAkB,KAAuB,EAC9C,KACD,EACK,CAAC,GAAoB,KACzB,EAA+B,KAAK,EAChC,CAAC,GAAgB,KAAqB,EAAwB,KAAK;AAGzE,SAAgB;AACd,EAAI,EAAU,WAAW,KAAK,CAAC,IAC7B,EAAoB,EAAU,GAAG,GACxB,EAAU,SAAS,KAAK,CAAC,KAAoB,KAClD,EAAU,SAAS,EAAgB,IACrC,EAAoB,EAAgB;IAGvC;EAAC;EAAW;EAAkB;EAAgB,CAAC;CAElD,IAAM,IAAuB,GAC1B,MAA8B;AACzB,QAAa,MACjB,EAAoB,EAAS,EAC7B,EAAsB,KAAK,EAC3B,EAAkB,KAAK;IAEzB,CAAC,EAAiB,CACnB,EAEK,IAAyB,GAAa,MAA+B;AACzE,EAAI,KACF,EAAsB,EAAW,EACjC,EAAkB,KAAK,KAEvB,EAAsB,KAAK,EAC3B,EAAkB,KAAK;IAExB,EAAE,CAAC,EAEA,IAAqB,GAAa,MAA0B;AAChE,IAAkB,EAAO;IACxB,EAAE,CAAC,EAEA,UAAqB;AACrB,GAAC,KAAsB,CAAC,MAE5B,EAAS,GAAoB,EAAe,EAC5C,EAAsB,KAAK,EAC3B,EAAkB,KAAK,EACvB,GAAS;IAGL,UAAoB;AAIxB,EAHA,EAAoB,KAAK,EACzB,EAAsB,KAAK,EAC3B,EAAkB,KAAK,EACvB,GAAS;;AAGX,KAAI,CAAC,EAAQ,QAAO;CAEpB,IAAM,IACJ,GAAoB,gBAAgB,KAAoB,GACpD,IAAY,CAAC,CAAC,KAAsB,CAAC,CAAC;AAE5C,QACE,kBAAC,GAAD;EAAe,SAAS;YACtB,kBAAC,GAAD;GACE,OAAM;GACN,WAAU;aAFZ;IAIE,kBAAC,GAAD;KACE,SAAS;KACT,QAAO;KACP,CAAA;IACF,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAgB,OAAO,EAAE,EAAQ,6BAA6B,EAAI,CAAA;KAC9D,CAAA;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAE,EAAQ,mCAAmC;OACzC,CAAA,EACN,EAAU,SAAS,KAClB,kBAAC,GAAD;OACa;OACX,OAAO;OACP,aAAY;OACZ,UAAU;OACV,CAAA,CAEA;SAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,UAAU;OACV,OAAO,GAAoB,MAAM;OACjC,gBAAgB,GAAoB,aAAa;OACjD,UAAU;OACV,aAAY;OACZ,WAAU;OACV,CAAA,EAEF,kBAAC,GAAD;OACE,YAAY,GAAoB,aAAa;OAC7C,UAAU;OACM;OAChB,gBAAgB;OAChB,eAAe,GAAoB,eAAe;OAClD,aAAY;OACZ,UAAU,CAAC;OACX,WAAU;OACV,CAAA,CACE;QACF;;IAEN,kBAAC,OAAD;KACE,WAAU;KACV,UAAU,MAAU,EAAM,iBAAiB;eAF7C,CAIE,kBAAC,GAAD;MAAa,MAAK;MAAS,SAAQ;MAAY,SAAS;gBACrD,EAAE,EAAQ,cAAc;MACb,CAAA,EACd,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,SAAS;MACT,YAAY,CAAC;gBAEZ,EAAE,EAAQ,cAAc;MACb,CAAA,CACV;;IACI;;EACE,CAAA"}
1
+ {"version":3,"file":"open-repository-modal.js","names":[],"sources":["../../../../src/components/features/chat/open-repository-modal.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { BaseModalTitle } from \"#/components/shared/modals/confirmation-modals/base-modal\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { GitRepoDropdown } from \"#/components/features/home/git-repo-dropdown/git-repo-dropdown\";\nimport { GitBranchDropdown } from \"#/components/features/home/git-branch-dropdown/git-branch-dropdown\";\nimport { GitProviderDropdown } from \"#/components/features/home/git-provider-dropdown/git-provider-dropdown\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\n\ninterface OpenRepositoryModalProps {\n isOpen: boolean;\n onClose: () => void;\n onLaunch: (repository: GitRepository, branch: Branch) => void;\n defaultProvider?: Provider;\n}\n\nexport function OpenRepositoryModal({\n isOpen,\n onClose,\n onLaunch,\n defaultProvider = \"github\",\n}: OpenRepositoryModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { providers } = useUserProviders();\n\n const [selectedProvider, setSelectedProvider] = useState<Provider | null>(\n null,\n );\n const [selectedRepository, setSelectedRepository] =\n useState<GitRepository | null>(null);\n const [selectedBranch, setSelectedBranch] = useState<Branch | null>(null);\n\n // Auto-select provider: single provider auto-selects, multiple uses defaultProvider if available\n useEffect(() => {\n if (providers.length === 1 && !selectedProvider) {\n setSelectedProvider(providers[0]);\n } else if (providers.length > 1 && !selectedProvider && defaultProvider) {\n if (providers.includes(defaultProvider)) {\n setSelectedProvider(defaultProvider);\n }\n }\n }, [providers, selectedProvider, defaultProvider]);\n\n const handleProviderChange = useCallback(\n (provider: Provider | null) => {\n if (provider === selectedProvider) return;\n setSelectedProvider(provider);\n setSelectedRepository(null);\n setSelectedBranch(null);\n },\n [selectedProvider],\n );\n\n const handleRepositoryChange = useCallback((repository?: GitRepository) => {\n if (repository) {\n setSelectedRepository(repository);\n setSelectedBranch(null);\n } else {\n setSelectedRepository(null);\n setSelectedBranch(null);\n }\n }, []);\n\n const handleBranchSelect = useCallback((branch: Branch | null) => {\n setSelectedBranch(branch);\n }, []);\n\n const handleLaunch = () => {\n if (!selectedRepository || !selectedBranch) return;\n\n onLaunch(selectedRepository, selectedBranch);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n const handleClose = () => {\n setSelectedProvider(null);\n setSelectedRepository(null);\n setSelectedBranch(null);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const activeProvider =\n selectedRepository?.git_provider || selectedProvider || defaultProvider;\n const canLaunch = !!selectedRepository && !!selectedBranch;\n\n return (\n <ModalBackdrop onClose={handleClose}>\n <ModalBody\n width=\"sm\"\n className=\"relative items-start border border-[var(--oh-border)] !gap-4\"\n >\n <ModalCloseButton\n onClose={handleClose}\n testId=\"close-open-repository-modal\"\n />\n <div className=\"w-full pr-6\">\n <BaseModalTitle title={t(I18nKey.CONVERSATION$OPEN_REPOSITORY)} />\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-white font-normal leading-[22px]\">\n {t(I18nKey.CONVERSATION$SELECT_OR_INSERT_LINK)}\n </span>\n {providers.length > 1 && (\n <GitProviderDropdown\n providers={providers}\n value={selectedProvider}\n onChange={handleProviderChange}\n />\n )}\n </div>\n\n <div className=\"flex flex-col gap-[10px] w-full\">\n <GitRepoDropdown\n provider={activeProvider}\n value={selectedRepository?.id || null}\n repositoryName={selectedRepository?.full_name || null}\n onChange={handleRepositoryChange}\n className=\"w-full\"\n />\n\n <GitBranchDropdown\n repository={selectedRepository?.full_name || null}\n provider={activeProvider}\n selectedBranch={selectedBranch}\n onBranchSelect={handleBranchSelect}\n defaultBranch={selectedRepository?.main_branch || null}\n disabled={!selectedRepository}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div\n className=\"flex justify-end gap-2 w-full\"\n onClick={(event) => event.stopPropagation()}\n >\n <BrandButton type=\"button\" variant=\"secondary\" onClick={handleClose}>\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={handleLaunch}\n isDisabled={!canLaunch}\n >\n {t(I18nKey.BUTTON$LAUNCH)}\n </BrandButton>\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,SAAgB,EAAoB,EAClC,WACA,YACA,aACA,qBAAkB,YACS;CAC3B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,iBAAc,GAAkB,EAElC,CAAC,GAAkB,KAAuB,EAC9C,KACD,EACK,CAAC,GAAoB,KACzB,EAA+B,KAAK,EAChC,CAAC,GAAgB,KAAqB,EAAwB,KAAK;AAGzE,SAAgB;AACd,EAAI,EAAU,WAAW,KAAK,CAAC,IAC7B,EAAoB,EAAU,GAAG,GACxB,EAAU,SAAS,KAAK,CAAC,KAAoB,KAClD,EAAU,SAAS,EAAgB,IACrC,EAAoB,EAAgB;IAGvC;EAAC;EAAW;EAAkB;EAAgB,CAAC;CAElD,IAAM,IAAuB,GAC1B,MAA8B;AACzB,QAAa,MACjB,EAAoB,EAAS,EAC7B,EAAsB,KAAK,EAC3B,EAAkB,KAAK;IAEzB,CAAC,EAAiB,CACnB,EAEK,IAAyB,GAAa,MAA+B;AACzE,EAAI,KACF,EAAsB,EAAW,EACjC,EAAkB,KAAK,KAEvB,EAAsB,KAAK,EAC3B,EAAkB,KAAK;IAExB,EAAE,CAAC,EAEA,IAAqB,GAAa,MAA0B;AAChE,IAAkB,EAAO;IACxB,EAAE,CAAC,EAEA,UAAqB;AACrB,GAAC,KAAsB,CAAC,MAE5B,EAAS,GAAoB,EAAe,EAC5C,EAAsB,KAAK,EAC3B,EAAkB,KAAK,EACvB,GAAS;IAGL,UAAoB;AAIxB,EAHA,EAAoB,KAAK,EACzB,EAAsB,KAAK,EAC3B,EAAkB,KAAK,EACvB,GAAS;;AAGX,KAAI,CAAC,EAAQ,QAAO;CAEpB,IAAM,IACJ,GAAoB,gBAAgB,KAAoB,GACpD,IAAY,CAAC,CAAC,KAAsB,CAAC,CAAC;AAE5C,QACE,kBAAC,GAAD;EAAe,SAAS;YACtB,kBAAC,GAAD;GACE,OAAM;GACN,WAAU;aAFZ;IAIE,kBAAC,GAAD;KACE,SAAS;KACT,QAAO;KACP,CAAA;IACF,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAgB,OAAO,EAAE,EAAQ,6BAA6B,EAAI,CAAA;KAC9D,CAAA;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAE,EAAQ,mCAAmC;OACzC,CAAA,EACN,EAAU,SAAS,KAClB,kBAAC,GAAD;OACa;OACX,OAAO;OACP,UAAU;OACV,CAAA,CAEA;SAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,UAAU;OACV,OAAO,GAAoB,MAAM;OACjC,gBAAgB,GAAoB,aAAa;OACjD,UAAU;OACV,WAAU;OACV,CAAA,EAEF,kBAAC,GAAD;OACE,YAAY,GAAoB,aAAa;OAC7C,UAAU;OACM;OAChB,gBAAgB;OAChB,eAAe,GAAoB,eAAe;OAClD,UAAU,CAAC;OACX,WAAU;OACV,CAAA,CACE;QACF;;IAEN,kBAAC,OAAD;KACE,WAAU;KACV,UAAU,MAAU,EAAM,iBAAiB;eAF7C,CAIE,kBAAC,GAAD;MAAa,MAAK;MAAS,SAAQ;MAAY,SAAS;gBACrD,EAAE,EAAQ,cAAc;MACb,CAAA,EACd,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,SAAS;MACT,YAAY,CAAC;gBAEZ,EAAE,EAAQ,cAAc;MACb,CAAA,CACV;;IACI;;EACE,CAAA"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../hooks/use-conversation-id.cjs`),n=require(`../../../stores/conversation-store.cjs`),r=require(`../../../stores/optimistic-user-message-store.cjs`),i=require(`../../../hooks/use-send-message.cjs`),a=require(`../../../utils/pending-task-message-link.cjs`),o=require(`../../../services/chat-service.cjs`),s=require(`./chat-message.cjs`),c=require(`../images/image-carousel.cjs`);let l=require(`react`);l=e.__toESM(l,1);let u=require(`react/jsx-runtime`);function d(){let{conversationId:e}=t.useOptionalConversationId(),d=r.useOptimisticUserMessageStore(e=>e.pendingMessages),f=r.useOptimisticUserMessageStore(e=>e.markPendingMessageError),p=r.useOptimisticUserMessageStore(e=>e.markPendingMessageSending),m=r.useOptimisticUserMessageStore(e=>e.removePendingMessage),h=n.useConversationStore(e=>e.restoreMessageToInputIfEmpty),{send:g}=i.useSendMessage(),_=l.default.useMemo(()=>e?d.filter(t=>a.matchesPendingConversationId(e,t.conversationId)):[],[d,e]),v=l.default.useCallback(async e=>{let t=r.useOptimisticUserMessageStore.getState().pendingMessages.find(t=>t.id===e);if(t){p(e);try{await g(o.createChatMessage(t.text,t.imageUrls,t.fileUrls,t.timestamp))}catch(t){f(e,t instanceof Error?t.message:`Failed to send message`)}}},[g,f,p]),y=l.default.useCallback((e,t)=>{h(t),m(e)},[h,m]);return _.length===0?null:(0,u.jsx)(u.Fragment,{children:_.map(e=>(0,u.jsx)(s.ChatMessage,{type:`user`,message:e.text,pendingStatus:e.status,onRetry:e.status===`error`?()=>v(e.id):void 0,onStop:e.status===`sending`?()=>y(e.id,e.text):void 0,children:e.imageUrls.length>0&&(0,u.jsx)(c.ImageCarousel,{size:`small`,images:e.imageUrls})},e.id))})}exports.PendingUserMessages=d;
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../hooks/use-conversation-id.cjs`),i=require(`../../../stores/conversation-store.cjs`),a=require(`../../../stores/optimistic-user-message-store.cjs`),o=require(`../../../hooks/use-send-message.cjs`),s=require(`../../../utils/pending-task-message-link.cjs`),c=require(`../../../services/chat-service.cjs`),l=require(`./chat-message.cjs`),u=require(`../images/image-carousel.cjs`);let d=require(`react`);d=e.__toESM(d,1);let f=require(`react/jsx-runtime`);function p(){let{t:e}=t.useTranslation(`openhands`),{conversationId:p}=r.useOptionalConversationId(),m=a.useOptimisticUserMessageStore(e=>e.pendingMessages),h=a.useOptimisticUserMessageStore(e=>e.markPendingMessageError),g=a.useOptimisticUserMessageStore(e=>e.markPendingMessageSending),_=a.useOptimisticUserMessageStore(e=>e.removePendingMessage),v=i.useConversationStore(e=>e.restoreMessageToInputIfEmpty),{send:y}=o.useSendMessage(),b=d.default.useMemo(()=>p?m.filter(e=>s.matchesPendingConversationId(p,e.conversationId)):[],[m,p]),x=d.default.useCallback(async t=>{let r=a.useOptimisticUserMessageStore.getState().pendingMessages.find(e=>e.id===t);if(r){g(t);try{await y(c.createChatMessage(r.text,r.imageUrls,r.fileUrls,r.timestamp))}catch(r){h(t,r instanceof Error?r.message:e(n.I18nKey.CHAT_INTERFACE$FAILED_TO_SEND_MESSAGE))}}},[y,h,g,e]),S=d.default.useCallback((e,t)=>{v(t),_(e)},[v,_]);return b.length===0?null:(0,f.jsx)(f.Fragment,{children:b.map(e=>(0,f.jsx)(l.ChatMessage,{type:`user`,message:e.text,pendingStatus:e.status,onRetry:e.status===`error`?()=>x(e.id):void 0,onStop:e.status===`sending`?()=>S(e.id,e.text):void 0,children:e.imageUrls.length>0&&(0,f.jsx)(u.ImageCarousel,{size:`small`,images:e.imageUrls})},e.id))})}exports.PendingUserMessages=p;
2
2
  //# sourceMappingURL=pending-user-messages.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pending-user-messages.cjs","names":[],"sources":["../../../../src/components/features/chat/pending-user-messages.tsx"],"sourcesContent":["import React from \"react\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { createChatMessage } from \"#/services/chat-service\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { matchesPendingConversationId } from \"#/utils/pending-task-message-link\";\nimport { ImageCarousel } from \"#/components/features/images/image-carousel\";\nimport { ChatMessage } from \"./chat-message\";\n\n/**\n * Renders the queue of locally-tracked user messages that have been submitted\n * but not yet echoed back through the WebSocket. Each message shows a faded\n * \"sending\" treatment until the server echoes a real `UserMessageEvent`\n * (which removes it via `consumeMatchingPendingMessage`). If the API rejects the\n * send, the message switches to an \"error\" state with a retry button.\n *\n * The queue is global but each entry is tagged with the conversation id it\n * was enqueued from; this component filters to only entries belonging to the\n * active conversation, so switching conversations never carries pending\n * bubbles over.\n */\nexport function PendingUserMessages() {\n const { conversationId } = useOptionalConversationId();\n const pendingMessages = useOptimisticUserMessageStore(\n (state) => state.pendingMessages,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const markPendingMessageSending = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageSending,\n );\n const removePendingMessage = useOptimisticUserMessageStore(\n (state) => state.removePendingMessage,\n );\n const restoreMessageToInputIfEmpty = useConversationStore(\n (state) => state.restoreMessageToInputIfEmpty,\n );\n const { send } = useSendMessage();\n\n const visibleMessages = React.useMemo(\n () =>\n conversationId\n ? pendingMessages.filter((message) =>\n matchesPendingConversationId(\n conversationId,\n message.conversationId,\n ),\n )\n : [],\n [pendingMessages, conversationId],\n );\n\n const handleRetry = React.useCallback(\n async (id: string) => {\n const message = useOptimisticUserMessageStore\n .getState()\n .pendingMessages.find((entry) => entry.id === id);\n if (!message) return;\n\n markPendingMessageSending(id);\n\n try {\n await send(\n createChatMessage(\n message.text,\n message.imageUrls,\n message.fileUrls,\n message.timestamp,\n ),\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(id, errorMessage);\n }\n },\n [send, markPendingMessageError, markPendingMessageSending],\n );\n\n const handleStop = React.useCallback(\n (id: string, text: string) => {\n restoreMessageToInputIfEmpty(text);\n removePendingMessage(id);\n },\n [restoreMessageToInputIfEmpty, removePendingMessage],\n );\n\n if (visibleMessages.length === 0) {\n return null;\n }\n\n return (\n <>\n {visibleMessages.map((message) => (\n <ChatMessage\n key={message.id}\n type=\"user\"\n message={message.text}\n pendingStatus={message.status}\n onRetry={\n message.status === \"error\"\n ? () => handleRetry(message.id)\n : undefined\n }\n onStop={\n message.status === \"sending\"\n ? () => handleStop(message.id, message.text)\n : undefined\n }\n >\n {message.imageUrls.length > 0 && (\n <ImageCarousel size=\"small\" images={message.imageUrls} />\n )}\n </ChatMessage>\n ))}\n </>\n );\n}\n"],"mappings":"khBAsBA,SAAgB,GAAsB,CACpC,GAAM,CAAE,kBAAmB,EAAA,2BAA2B,CAChD,EAAkB,EAAA,8BACrB,GAAU,EAAM,gBAClB,CACK,EAA0B,EAAA,8BAC7B,GAAU,EAAM,wBAClB,CACK,EAA4B,EAAA,8BAC/B,GAAU,EAAM,0BAClB,CACK,EAAuB,EAAA,8BAC1B,GAAU,EAAM,qBAClB,CACK,EAA+B,EAAA,qBAClC,GAAU,EAAM,6BAClB,CACK,CAAE,QAAS,EAAA,gBAAgB,CAE3B,EAAkB,EAAA,QAAM,YAE1B,EACI,EAAgB,OAAQ,GACtB,EAAA,6BACE,EACA,EAAQ,eACT,CACF,CACD,EAAE,CACR,CAAC,EAAiB,EAAe,CAClC,CAEK,EAAc,EAAA,QAAM,YACxB,KAAO,IAAe,CACpB,IAAM,EAAU,EAAA,8BACb,UAAU,CACV,gBAAgB,KAAM,GAAU,EAAM,KAAO,EAAG,CAC9C,KAEL,GAA0B,EAAG,CAE7B,GAAI,CACF,MAAM,EACJ,EAAA,kBACE,EAAQ,KACR,EAAQ,UACR,EAAQ,SACR,EAAQ,UACT,CACF,OACM,EAAO,CAGd,EAAwB,EADtB,aAAiB,MAAQ,EAAM,QAAU,yBACF,IAG7C,CAAC,EAAM,EAAyB,EAA0B,CAC3D,CAEK,EAAa,EAAA,QAAM,aACtB,EAAY,IAAiB,CAC5B,EAA6B,EAAK,CAClC,EAAqB,EAAG,EAE1B,CAAC,EAA8B,EAAqB,CACrD,CAMD,OAJI,EAAgB,SAAW,EACtB,MAIP,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EAAgB,IAAK,IACpB,EAAA,EAAA,KAAC,EAAA,YAAD,CAEE,KAAK,OACL,QAAS,EAAQ,KACjB,cAAe,EAAQ,OACvB,QACE,EAAQ,SAAW,YACT,EAAY,EAAQ,GAAG,CAC7B,IAAA,GAEN,OACE,EAAQ,SAAW,cACT,EAAW,EAAQ,GAAI,EAAQ,KAAK,CAC1C,IAAA,YAGL,EAAQ,UAAU,OAAS,IAC1B,EAAA,EAAA,KAAC,EAAA,cAAD,CAAe,KAAK,QAAQ,OAAQ,EAAQ,UAAa,CAAA,CAE/C,CAlBP,EAAQ,GAkBD,CACd,CACD,CAAA"}
1
+ {"version":3,"file":"pending-user-messages.cjs","names":[],"sources":["../../../../src/components/features/chat/pending-user-messages.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { createChatMessage } from \"#/services/chat-service\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { matchesPendingConversationId } from \"#/utils/pending-task-message-link\";\nimport { ImageCarousel } from \"#/components/features/images/image-carousel\";\nimport { ChatMessage } from \"./chat-message\";\n\n/**\n * Renders the queue of locally-tracked user messages that have been submitted\n * but not yet echoed back through the WebSocket. Each message shows a faded\n * \"sending\" treatment until the server echoes a real `UserMessageEvent`\n * (which removes it via `consumeMatchingPendingMessage`). If the API rejects the\n * send, the message switches to an \"error\" state with a retry button.\n *\n * The queue is global but each entry is tagged with the conversation id it\n * was enqueued from; this component filters to only entries belonging to the\n * active conversation, so switching conversations never carries pending\n * bubbles over.\n */\nexport function PendingUserMessages() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useOptionalConversationId();\n const pendingMessages = useOptimisticUserMessageStore(\n (state) => state.pendingMessages,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const markPendingMessageSending = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageSending,\n );\n const removePendingMessage = useOptimisticUserMessageStore(\n (state) => state.removePendingMessage,\n );\n const restoreMessageToInputIfEmpty = useConversationStore(\n (state) => state.restoreMessageToInputIfEmpty,\n );\n const { send } = useSendMessage();\n\n const visibleMessages = React.useMemo(\n () =>\n conversationId\n ? pendingMessages.filter((message) =>\n matchesPendingConversationId(\n conversationId,\n message.conversationId,\n ),\n )\n : [],\n [pendingMessages, conversationId],\n );\n\n const handleRetry = React.useCallback(\n async (id: string) => {\n const message = useOptimisticUserMessageStore\n .getState()\n .pendingMessages.find((entry) => entry.id === id);\n if (!message) return;\n\n markPendingMessageSending(id);\n\n try {\n await send(\n createChatMessage(\n message.text,\n message.imageUrls,\n message.fileUrls,\n message.timestamp,\n ),\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : t(I18nKey.CHAT_INTERFACE$FAILED_TO_SEND_MESSAGE);\n markPendingMessageError(id, errorMessage);\n }\n },\n [send, markPendingMessageError, markPendingMessageSending, t],\n );\n\n const handleStop = React.useCallback(\n (id: string, text: string) => {\n restoreMessageToInputIfEmpty(text);\n removePendingMessage(id);\n },\n [restoreMessageToInputIfEmpty, removePendingMessage],\n );\n\n if (visibleMessages.length === 0) {\n return null;\n }\n\n return (\n <>\n {visibleMessages.map((message) => (\n <ChatMessage\n key={message.id}\n type=\"user\"\n message={message.text}\n pendingStatus={message.status}\n onRetry={\n message.status === \"error\"\n ? () => handleRetry(message.id)\n : undefined\n }\n onStop={\n message.status === \"sending\"\n ? () => handleStop(message.id, message.text)\n : undefined\n }\n >\n {message.imageUrls.length > 0 && (\n <ImageCarousel size=\"small\" images={message.imageUrls} />\n )}\n </ChatMessage>\n ))}\n </>\n );\n}\n"],"mappings":"yoBAwBA,SAAgB,GAAsB,CACpC,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,kBAAmB,EAAA,2BAA2B,CAChD,EAAkB,EAAA,8BACrB,GAAU,EAAM,gBAClB,CACK,EAA0B,EAAA,8BAC7B,GAAU,EAAM,wBAClB,CACK,EAA4B,EAAA,8BAC/B,GAAU,EAAM,0BAClB,CACK,EAAuB,EAAA,8BAC1B,GAAU,EAAM,qBAClB,CACK,EAA+B,EAAA,qBAClC,GAAU,EAAM,6BAClB,CACK,CAAE,QAAS,EAAA,gBAAgB,CAE3B,EAAkB,EAAA,QAAM,YAE1B,EACI,EAAgB,OAAQ,GACtB,EAAA,6BACE,EACA,EAAQ,eACT,CACF,CACD,EAAE,CACR,CAAC,EAAiB,EAAe,CAClC,CAEK,EAAc,EAAA,QAAM,YACxB,KAAO,IAAe,CACpB,IAAM,EAAU,EAAA,8BACb,UAAU,CACV,gBAAgB,KAAM,GAAU,EAAM,KAAO,EAAG,CAC9C,KAEL,GAA0B,EAAG,CAE7B,GAAI,CACF,MAAM,EACJ,EAAA,kBACE,EAAQ,KACR,EAAQ,UACR,EAAQ,SACR,EAAQ,UACT,CACF,OACM,EAAO,CAKd,EAAwB,EAHtB,aAAiB,MACb,EAAM,QACN,EAAE,EAAA,QAAQ,sCAAsC,CACb,IAG7C,CAAC,EAAM,EAAyB,EAA2B,EAAE,CAC9D,CAEK,EAAa,EAAA,QAAM,aACtB,EAAY,IAAiB,CAC5B,EAA6B,EAAK,CAClC,EAAqB,EAAG,EAE1B,CAAC,EAA8B,EAAqB,CACrD,CAMD,OAJI,EAAgB,SAAW,EACtB,MAIP,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EAAgB,IAAK,IACpB,EAAA,EAAA,KAAC,EAAA,YAAD,CAEE,KAAK,OACL,QAAS,EAAQ,KACjB,cAAe,EAAQ,OACvB,QACE,EAAQ,SAAW,YACT,EAAY,EAAQ,GAAG,CAC7B,IAAA,GAEN,OACE,EAAQ,SAAW,cACT,EAAW,EAAQ,GAAI,EAAQ,KAAK,CAC1C,IAAA,YAGL,EAAQ,UAAU,OAAS,IAC1B,EAAA,EAAA,KAAC,EAAA,cAAD,CAAe,KAAK,QAAQ,OAAQ,EAAQ,UAAa,CAAA,CAE/C,CAlBP,EAAQ,GAkBD,CACd,CACD,CAAA"}
@@ -1,45 +1,48 @@
1
- import { useOptionalConversationId as e } from "../../../hooks/use-conversation-id.js";
2
- import { useConversationStore as t } from "../../../stores/conversation-store.js";
3
- import { useOptimisticUserMessageStore as n } from "../../../stores/optimistic-user-message-store.js";
4
- import { useSendMessage as r } from "../../../hooks/use-send-message.js";
5
- import { matchesPendingConversationId as i } from "../../../utils/pending-task-message-link.js";
6
- import { createChatMessage as a } from "../../../services/chat-service.js";
7
- import { ChatMessage as o } from "./chat-message.js";
8
- import { ImageCarousel as s } from "../images/image-carousel.js";
9
- import c from "react";
10
- import { Fragment as l, jsx as u } from "react/jsx-runtime";
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { useOptionalConversationId as n } from "../../../hooks/use-conversation-id.js";
4
+ import { useConversationStore as r } from "../../../stores/conversation-store.js";
5
+ import { useOptimisticUserMessageStore as i } from "../../../stores/optimistic-user-message-store.js";
6
+ import { useSendMessage as a } from "../../../hooks/use-send-message.js";
7
+ import { matchesPendingConversationId as o } from "../../../utils/pending-task-message-link.js";
8
+ import { createChatMessage as s } from "../../../services/chat-service.js";
9
+ import { ChatMessage as c } from "./chat-message.js";
10
+ import { ImageCarousel as l } from "../images/image-carousel.js";
11
+ import u from "react";
12
+ import { Fragment as d, jsx as f } from "react/jsx-runtime";
11
13
  //#region src/components/features/chat/pending-user-messages.tsx
12
- function d() {
13
- let { conversationId: d } = e(), f = n((e) => e.pendingMessages), p = n((e) => e.markPendingMessageError), m = n((e) => e.markPendingMessageSending), h = n((e) => e.removePendingMessage), g = t((e) => e.restoreMessageToInputIfEmpty), { send: _ } = r(), v = c.useMemo(() => d ? f.filter((e) => i(d, e.conversationId)) : [], [f, d]), y = c.useCallback(async (e) => {
14
- let t = n.getState().pendingMessages.find((t) => t.id === e);
15
- if (t) {
16
- m(e);
14
+ function p() {
15
+ let { t: p } = e("openhands"), { conversationId: m } = n(), h = i((e) => e.pendingMessages), g = i((e) => e.markPendingMessageError), _ = i((e) => e.markPendingMessageSending), v = i((e) => e.removePendingMessage), y = r((e) => e.restoreMessageToInputIfEmpty), { send: b } = a(), x = u.useMemo(() => m ? h.filter((e) => o(m, e.conversationId)) : [], [h, m]), S = u.useCallback(async (e) => {
16
+ let n = i.getState().pendingMessages.find((t) => t.id === e);
17
+ if (n) {
18
+ _(e);
17
19
  try {
18
- await _(a(t.text, t.imageUrls, t.fileUrls, t.timestamp));
19
- } catch (t) {
20
- p(e, t instanceof Error ? t.message : "Failed to send message");
20
+ await b(s(n.text, n.imageUrls, n.fileUrls, n.timestamp));
21
+ } catch (n) {
22
+ g(e, n instanceof Error ? n.message : p(t.CHAT_INTERFACE$FAILED_TO_SEND_MESSAGE));
21
23
  }
22
24
  }
23
25
  }, [
26
+ b,
27
+ g,
24
28
  _,
25
- p,
26
- m
27
- ]), b = c.useCallback((e, t) => {
28
- g(t), h(e);
29
- }, [g, h]);
30
- return v.length === 0 ? null : /* @__PURE__ */ u(l, { children: v.map((e) => /* @__PURE__ */ u(o, {
29
+ p
30
+ ]), C = u.useCallback((e, t) => {
31
+ y(t), v(e);
32
+ }, [y, v]);
33
+ return x.length === 0 ? null : /* @__PURE__ */ f(d, { children: x.map((e) => /* @__PURE__ */ f(c, {
31
34
  type: "user",
32
35
  message: e.text,
33
36
  pendingStatus: e.status,
34
- onRetry: e.status === "error" ? () => y(e.id) : void 0,
35
- onStop: e.status === "sending" ? () => b(e.id, e.text) : void 0,
36
- children: e.imageUrls.length > 0 && /* @__PURE__ */ u(s, {
37
+ onRetry: e.status === "error" ? () => S(e.id) : void 0,
38
+ onStop: e.status === "sending" ? () => C(e.id, e.text) : void 0,
39
+ children: e.imageUrls.length > 0 && /* @__PURE__ */ f(l, {
37
40
  size: "small",
38
41
  images: e.imageUrls
39
42
  })
40
43
  }, e.id)) });
41
44
  }
42
45
  //#endregion
43
- export { d as PendingUserMessages };
46
+ export { p as PendingUserMessages };
44
47
 
45
48
  //# sourceMappingURL=pending-user-messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pending-user-messages.js","names":[],"sources":["../../../../src/components/features/chat/pending-user-messages.tsx"],"sourcesContent":["import React from \"react\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { createChatMessage } from \"#/services/chat-service\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { matchesPendingConversationId } from \"#/utils/pending-task-message-link\";\nimport { ImageCarousel } from \"#/components/features/images/image-carousel\";\nimport { ChatMessage } from \"./chat-message\";\n\n/**\n * Renders the queue of locally-tracked user messages that have been submitted\n * but not yet echoed back through the WebSocket. Each message shows a faded\n * \"sending\" treatment until the server echoes a real `UserMessageEvent`\n * (which removes it via `consumeMatchingPendingMessage`). If the API rejects the\n * send, the message switches to an \"error\" state with a retry button.\n *\n * The queue is global but each entry is tagged with the conversation id it\n * was enqueued from; this component filters to only entries belonging to the\n * active conversation, so switching conversations never carries pending\n * bubbles over.\n */\nexport function PendingUserMessages() {\n const { conversationId } = useOptionalConversationId();\n const pendingMessages = useOptimisticUserMessageStore(\n (state) => state.pendingMessages,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const markPendingMessageSending = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageSending,\n );\n const removePendingMessage = useOptimisticUserMessageStore(\n (state) => state.removePendingMessage,\n );\n const restoreMessageToInputIfEmpty = useConversationStore(\n (state) => state.restoreMessageToInputIfEmpty,\n );\n const { send } = useSendMessage();\n\n const visibleMessages = React.useMemo(\n () =>\n conversationId\n ? pendingMessages.filter((message) =>\n matchesPendingConversationId(\n conversationId,\n message.conversationId,\n ),\n )\n : [],\n [pendingMessages, conversationId],\n );\n\n const handleRetry = React.useCallback(\n async (id: string) => {\n const message = useOptimisticUserMessageStore\n .getState()\n .pendingMessages.find((entry) => entry.id === id);\n if (!message) return;\n\n markPendingMessageSending(id);\n\n try {\n await send(\n createChatMessage(\n message.text,\n message.imageUrls,\n message.fileUrls,\n message.timestamp,\n ),\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(id, errorMessage);\n }\n },\n [send, markPendingMessageError, markPendingMessageSending],\n );\n\n const handleStop = React.useCallback(\n (id: string, text: string) => {\n restoreMessageToInputIfEmpty(text);\n removePendingMessage(id);\n },\n [restoreMessageToInputIfEmpty, removePendingMessage],\n );\n\n if (visibleMessages.length === 0) {\n return null;\n }\n\n return (\n <>\n {visibleMessages.map((message) => (\n <ChatMessage\n key={message.id}\n type=\"user\"\n message={message.text}\n pendingStatus={message.status}\n onRetry={\n message.status === \"error\"\n ? () => handleRetry(message.id)\n : undefined\n }\n onStop={\n message.status === \"sending\"\n ? () => handleStop(message.id, message.text)\n : undefined\n }\n >\n {message.imageUrls.length > 0 && (\n <ImageCarousel size=\"small\" images={message.imageUrls} />\n )}\n </ChatMessage>\n ))}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;AAsBA,SAAgB,IAAsB;CACpC,IAAM,EAAE,sBAAmB,GAA2B,EAChD,IAAkB,GACrB,MAAU,EAAM,gBAClB,EACK,IAA0B,GAC7B,MAAU,EAAM,wBAClB,EACK,IAA4B,GAC/B,MAAU,EAAM,0BAClB,EACK,IAAuB,GAC1B,MAAU,EAAM,qBAClB,EACK,IAA+B,GAClC,MAAU,EAAM,6BAClB,EACK,EAAE,YAAS,GAAgB,EAE3B,IAAkB,EAAM,cAE1B,IACI,EAAgB,QAAQ,MACtB,EACE,GACA,EAAQ,eACT,CACF,GACD,EAAE,EACR,CAAC,GAAiB,EAAe,CAClC,EAEK,IAAc,EAAM,YACxB,OAAO,MAAe;EACpB,IAAM,IAAU,EACb,UAAU,CACV,gBAAgB,MAAM,MAAU,EAAM,OAAO,EAAG;AAC9C,SAEL;KAA0B,EAAG;AAE7B,OAAI;AACF,UAAM,EACJ,EACE,EAAQ,MACR,EAAQ,WACR,EAAQ,UACR,EAAQ,UACT,CACF;YACM,GAAO;AAGd,MAAwB,GADtB,aAAiB,QAAQ,EAAM,UAAU,yBACF;;;IAG7C;EAAC;EAAM;EAAyB;EAA0B,CAC3D,EAEK,IAAa,EAAM,aACtB,GAAY,MAAiB;AAE5B,EADA,EAA6B,EAAK,EAClC,EAAqB,EAAG;IAE1B,CAAC,GAA8B,EAAqB,CACrD;AAMD,QAJI,EAAgB,WAAW,IACtB,OAIP,kBAAA,GAAA,EAAA,UACG,EAAgB,KAAK,MACpB,kBAAC,GAAD;EAEE,MAAK;EACL,SAAS,EAAQ;EACjB,eAAe,EAAQ;EACvB,SACE,EAAQ,WAAW,gBACT,EAAY,EAAQ,GAAG,GAC7B,KAAA;EAEN,QACE,EAAQ,WAAW,kBACT,EAAW,EAAQ,IAAI,EAAQ,KAAK,GAC1C,KAAA;YAGL,EAAQ,UAAU,SAAS,KAC1B,kBAAC,GAAD;GAAe,MAAK;GAAQ,QAAQ,EAAQ;GAAa,CAAA;EAE/C,EAlBP,EAAQ,GAkBD,CACd,EACD,CAAA"}
1
+ {"version":3,"file":"pending-user-messages.js","names":[],"sources":["../../../../src/components/features/chat/pending-user-messages.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { createChatMessage } from \"#/services/chat-service\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { matchesPendingConversationId } from \"#/utils/pending-task-message-link\";\nimport { ImageCarousel } from \"#/components/features/images/image-carousel\";\nimport { ChatMessage } from \"./chat-message\";\n\n/**\n * Renders the queue of locally-tracked user messages that have been submitted\n * but not yet echoed back through the WebSocket. Each message shows a faded\n * \"sending\" treatment until the server echoes a real `UserMessageEvent`\n * (which removes it via `consumeMatchingPendingMessage`). If the API rejects the\n * send, the message switches to an \"error\" state with a retry button.\n *\n * The queue is global but each entry is tagged with the conversation id it\n * was enqueued from; this component filters to only entries belonging to the\n * active conversation, so switching conversations never carries pending\n * bubbles over.\n */\nexport function PendingUserMessages() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useOptionalConversationId();\n const pendingMessages = useOptimisticUserMessageStore(\n (state) => state.pendingMessages,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const markPendingMessageSending = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageSending,\n );\n const removePendingMessage = useOptimisticUserMessageStore(\n (state) => state.removePendingMessage,\n );\n const restoreMessageToInputIfEmpty = useConversationStore(\n (state) => state.restoreMessageToInputIfEmpty,\n );\n const { send } = useSendMessage();\n\n const visibleMessages = React.useMemo(\n () =>\n conversationId\n ? pendingMessages.filter((message) =>\n matchesPendingConversationId(\n conversationId,\n message.conversationId,\n ),\n )\n : [],\n [pendingMessages, conversationId],\n );\n\n const handleRetry = React.useCallback(\n async (id: string) => {\n const message = useOptimisticUserMessageStore\n .getState()\n .pendingMessages.find((entry) => entry.id === id);\n if (!message) return;\n\n markPendingMessageSending(id);\n\n try {\n await send(\n createChatMessage(\n message.text,\n message.imageUrls,\n message.fileUrls,\n message.timestamp,\n ),\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : t(I18nKey.CHAT_INTERFACE$FAILED_TO_SEND_MESSAGE);\n markPendingMessageError(id, errorMessage);\n }\n },\n [send, markPendingMessageError, markPendingMessageSending, t],\n );\n\n const handleStop = React.useCallback(\n (id: string, text: string) => {\n restoreMessageToInputIfEmpty(text);\n removePendingMessage(id);\n },\n [restoreMessageToInputIfEmpty, removePendingMessage],\n );\n\n if (visibleMessages.length === 0) {\n return null;\n }\n\n return (\n <>\n {visibleMessages.map((message) => (\n <ChatMessage\n key={message.id}\n type=\"user\"\n message={message.text}\n pendingStatus={message.status}\n onRetry={\n message.status === \"error\"\n ? () => handleRetry(message.id)\n : undefined\n }\n onStop={\n message.status === \"sending\"\n ? () => handleStop(message.id, message.text)\n : undefined\n }\n >\n {message.imageUrls.length > 0 && (\n <ImageCarousel size=\"small\" images={message.imageUrls} />\n )}\n </ChatMessage>\n ))}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAwBA,SAAgB,IAAsB;CACpC,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,sBAAmB,GAA2B,EAChD,IAAkB,GACrB,MAAU,EAAM,gBAClB,EACK,IAA0B,GAC7B,MAAU,EAAM,wBAClB,EACK,IAA4B,GAC/B,MAAU,EAAM,0BAClB,EACK,IAAuB,GAC1B,MAAU,EAAM,qBAClB,EACK,IAA+B,GAClC,MAAU,EAAM,6BAClB,EACK,EAAE,YAAS,GAAgB,EAE3B,IAAkB,EAAM,cAE1B,IACI,EAAgB,QAAQ,MACtB,EACE,GACA,EAAQ,eACT,CACF,GACD,EAAE,EACR,CAAC,GAAiB,EAAe,CAClC,EAEK,IAAc,EAAM,YACxB,OAAO,MAAe;EACpB,IAAM,IAAU,EACb,UAAU,CACV,gBAAgB,MAAM,MAAU,EAAM,OAAO,EAAG;AAC9C,SAEL;KAA0B,EAAG;AAE7B,OAAI;AACF,UAAM,EACJ,EACE,EAAQ,MACR,EAAQ,WACR,EAAQ,UACR,EAAQ,UACT,CACF;YACM,GAAO;AAKd,MAAwB,GAHtB,aAAiB,QACb,EAAM,UACN,EAAE,EAAQ,sCAAsC,CACb;;;IAG7C;EAAC;EAAM;EAAyB;EAA2B;EAAE,CAC9D,EAEK,IAAa,EAAM,aACtB,GAAY,MAAiB;AAE5B,EADA,EAA6B,EAAK,EAClC,EAAqB,EAAG;IAE1B,CAAC,GAA8B,EAAqB,CACrD;AAMD,QAJI,EAAgB,WAAW,IACtB,OAIP,kBAAA,GAAA,EAAA,UACG,EAAgB,KAAK,MACpB,kBAAC,GAAD;EAEE,MAAK;EACL,SAAS,EAAQ;EACjB,eAAe,EAAQ;EACvB,SACE,EAAQ,WAAW,gBACT,EAAY,EAAQ,GAAG,GAC7B,KAAA;EAEN,QACE,EAAQ,WAAW,kBACT,EAAW,EAAQ,IAAI,EAAQ,KAAK,GAC1C,KAAA;YAGL,EAAQ,UAAU,SAAS,KAC1B,kBAAC,GAAD;GAAe,MAAK;GAAQ,QAAQ,EAAQ;GAAa,CAAA;EAE/C,EAlBP,EAAQ,GAkBD,CACd,EACD,CAAA"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../utils/utils.cjs`),n=require(`../../../../utils/form-control-classes.cjs`),r=require(`../../../../icons/u-code-branch.cjs`),i=require(`../../../../node_modules/downshift/dist/downshift.esm.cjs`),a=require(`../../../../hooks/use-debounce.cjs`),o=require(`../shared/clear-button.cjs`),s=require(`../shared/toggle-button.cjs`),c=require(`../shared/error-message.cjs`),l=require(`../../../../hooks/query/use-branch-data.cjs`),u=require(`./branch-dropdown-menu.cjs`);let d=require(`react`);d=e.__toESM(d,1);let f=require(`react/jsx-runtime`);function p({repository:e,provider:p,selectedBranch:m,onBranchSelect:h,defaultBranch:g,placeholder:_=`Select branch...`,disabled:v=!1,className:y}){let[b,x]=(0,d.useState)(``),[S,C]=(0,d.useState)(!1),w=a.useDebounce(b,300),T=(0,d.useRef)(null),E=(0,d.useMemo)(()=>w.trim().length>0?w.trim():``,[w]),{branches:D,isLoading:O,isError:k,fetchNextPage:A,hasNextPage:j,isFetchingNextPage:M,isSearchLoading:N}=l.useBranchData(e,p,g||null,E,b,m),P=k?Error(`Failed to load branches`):null,F=(0,d.useCallback)(()=>{x(``),h(null),C(!0)},[h]),I=(0,d.useCallback)(e=>{h(e),x(``)},[h]),L=(0,d.useCallback)(e=>{let{scrollTop:t,scrollHeight:n,clientHeight:r}=e.currentTarget;n-t<=r*1.5&&j&&!M&&A()},[j,M,A]),{isOpen:R,selectedItem:z,highlightedIndex:B,getInputProps:V,getItemProps:H,getMenuProps:U,getToggleButtonProps:W}=i.useCombobox({items:D,selectedItem:m,itemToString:e=>e?.name||``,onSelectedItemChange:({selectedItem:e})=>{I(e||null)},inputValue:b,stateReducer:(e,t)=>t.type===i.useCombobox.stateChangeTypes.InputClick&&e.isOpen?{...t.changes,isOpen:!0}:t.changes});(0,d.useEffect)(()=>{e&&(h(null),C(!1))},[e,h]),(0,d.useEffect)(()=>{if(e&&g&&!m&&!S&&D.length>0&&!O){let e=D.find(e=>e.name===g);e&&h(e)}},[e,g,m,S,D,h,O]),(0,d.useEffect)(()=>{x(``)},[e]),(0,d.useEffect)(()=>{m&&!R?x(m.name):!m&&!R&&x(``)},[m,R]);let G=O||N||M;return(0,f.jsxs)(`div`,{className:t.cn(`relative`,y),children:[(0,f.jsxs)(`div`,{className:`group relative text-[var(--oh-muted)] hover:text-white`,children:[(0,f.jsx)(`div`,{className:`absolute left-2 top-1/2 transform -translate-y-1/2 z-10`,children:G?(0,f.jsx)(`div`,{className:`animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full`}):(0,f.jsx)(r.default,{width:16,height:16})}),(0,f.jsx)(`input`,{...V({disabled:v||!e,placeholder:_,className:t.cn(n.formControlFieldClassName,`text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5`,`placeholder:text-[var(--oh-muted)]`,`disabled:cursor-not-allowed disabled:opacity-60`),onChange:e=>{x(e.target.value)}}),"data-testid":`git-branch-dropdown-input`}),(0,f.jsxs)(`div`,{className:`absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center`,children:[m&&(0,f.jsx)(o.ClearButton,{disabled:v,onClear:F}),(0,f.jsx)(s.ToggleButton,{isOpen:R,disabled:v||!e,getToggleButtonProps:W})]})]}),(0,f.jsx)(u.BranchDropdownMenu,{isOpen:R,filteredBranches:D,inputValue:b,highlightedIndex:B,selectedItem:z,getMenuProps:U,getItemProps:H,onScroll:L,menuRef:T}),(0,f.jsx)(c.ErrorMessage,{isError:!!P})]})}exports.GitBranchDropdown=p;
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../../i18n/declaration.cjs`),r=require(`../../../../utils/utils.cjs`),i=require(`../../../../utils/form-control-classes.cjs`),a=require(`../../../../icons/u-code-branch.cjs`),o=require(`../../../../node_modules/downshift/dist/downshift.esm.cjs`),s=require(`../../../../hooks/use-debounce.cjs`),c=require(`../shared/clear-button.cjs`),l=require(`../shared/toggle-button.cjs`),u=require(`../shared/error-message.cjs`),d=require(`../../../../hooks/query/use-branch-data.cjs`),f=require(`./branch-dropdown-menu.cjs`);let p=require(`react`);p=e.__toESM(p,1);let m=require(`react/jsx-runtime`);function h({repository:e,provider:h,selectedBranch:g,onBranchSelect:_,defaultBranch:v,placeholder:y,disabled:b=!1,className:x}){let{t:S}=t.useTranslation(`openhands`),[C,w]=(0,p.useState)(``),[T,E]=(0,p.useState)(!1),D=s.useDebounce(C,300),O=(0,p.useRef)(null),k=(0,p.useMemo)(()=>D.trim().length>0?D.trim():``,[D]),{branches:A,isLoading:j,isError:M,fetchNextPage:N,hasNextPage:P,isFetchingNextPage:F,isSearchLoading:I}=d.useBranchData(e,h,v||null,k,C,g),L=M?Error(`Failed to load branches`):null,R=(0,p.useCallback)(()=>{w(``),_(null),E(!0)},[_]),z=(0,p.useCallback)(e=>{_(e),w(``)},[_]),B=(0,p.useCallback)(e=>{let{scrollTop:t,scrollHeight:n,clientHeight:r}=e.currentTarget;n-t<=r*1.5&&P&&!F&&N()},[P,F,N]),{isOpen:V,selectedItem:H,highlightedIndex:U,getInputProps:W,getItemProps:G,getMenuProps:K,getToggleButtonProps:q}=o.useCombobox({items:A,selectedItem:g,itemToString:e=>e?.name||``,onSelectedItemChange:({selectedItem:e})=>{z(e||null)},inputValue:C,stateReducer:(e,t)=>t.type===o.useCombobox.stateChangeTypes.InputClick&&e.isOpen?{...t.changes,isOpen:!0}:t.changes});(0,p.useEffect)(()=>{e&&(_(null),E(!1))},[e,_]),(0,p.useEffect)(()=>{if(e&&v&&!g&&!T&&A.length>0&&!j){let e=A.find(e=>e.name===v);e&&_(e)}},[e,v,g,T,A,_,j]),(0,p.useEffect)(()=>{w(``)},[e]),(0,p.useEffect)(()=>{g&&!V?w(g.name):!g&&!V&&w(``)},[g,V]);let J=j||I||F;return(0,m.jsxs)(`div`,{className:r.cn(`relative`,x),children:[(0,m.jsxs)(`div`,{className:`group relative text-[var(--oh-muted)] hover:text-white`,children:[(0,m.jsx)(`div`,{className:`absolute left-2 top-1/2 transform -translate-y-1/2 z-10`,children:J?(0,m.jsx)(`div`,{className:`animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full`}):(0,m.jsx)(a.default,{width:16,height:16})}),(0,m.jsx)(`input`,{...W({disabled:b||!e,placeholder:y??S(n.I18nKey.COMMON$SELECT_BRANCH_PLACEHOLDER),className:r.cn(i.formControlFieldClassName,`text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5`,`placeholder:text-[var(--oh-muted)]`,`disabled:cursor-not-allowed disabled:opacity-60`),onChange:e=>{w(e.target.value)}}),"data-testid":`git-branch-dropdown-input`}),(0,m.jsxs)(`div`,{className:`absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center`,children:[g&&(0,m.jsx)(c.ClearButton,{disabled:b,onClear:R}),(0,m.jsx)(l.ToggleButton,{isOpen:V,disabled:b||!e,getToggleButtonProps:q})]})]}),(0,m.jsx)(f.BranchDropdownMenu,{isOpen:V,filteredBranches:A,inputValue:C,highlightedIndex:U,selectedItem:H,getMenuProps:K,getItemProps:G,onScroll:B,menuRef:O}),(0,m.jsx)(u.ErrorMessage,{isError:!!L})]})}exports.GitBranchDropdown=h;
2
2
  //# sourceMappingURL=git-branch-dropdown.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-branch-dropdown.cjs","names":[],"sources":["../../../../../src/components/features/home/git-branch-dropdown/git-branch-dropdown.tsx"],"sourcesContent":["import React, {\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n} from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { Branch } from \"#/types/git\";\nimport { Provider } from \"#/types/settings\";\nimport { useDebounce } from \"#/hooks/use-debounce\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlFieldClassName } from \"#/utils/form-control-classes\";\nimport { useBranchData } from \"#/hooks/query/use-branch-data\";\n\nimport { ClearButton } from \"../shared/clear-button\";\nimport { ToggleButton } from \"../shared/toggle-button\";\nimport { ErrorMessage } from \"../shared/error-message\";\nimport { BranchDropdownMenu } from \"./branch-dropdown-menu\";\nimport BranchIcon from \"#/icons/u-code-branch.svg?react\";\n\nexport interface GitBranchDropdownProps {\n repository: string | null;\n provider: Provider;\n selectedBranch: Branch | null;\n onBranchSelect: (branch: Branch | null) => void;\n defaultBranch?: string | null;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function GitBranchDropdown({\n repository,\n provider,\n selectedBranch,\n onBranchSelect,\n defaultBranch,\n placeholder = \"Select branch...\",\n disabled = false,\n className,\n}: GitBranchDropdownProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [userManuallyCleared, setUserManuallyCleared] = useState(false);\n const debouncedInputValue = useDebounce(inputValue, 300);\n const menuRef = useRef<HTMLUListElement>(null);\n\n // Process search input (debounced and filtered)\n const processedSearchInput = useMemo(\n () =>\n debouncedInputValue.trim().length > 0 ? debouncedInputValue.trim() : \"\",\n [debouncedInputValue],\n );\n\n // Use the new branch data hook with default branch prioritization\n const {\n branches: filteredBranches,\n isLoading,\n isError,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isSearchLoading,\n } = useBranchData(\n repository,\n provider,\n defaultBranch || null,\n processedSearchInput,\n inputValue,\n selectedBranch,\n );\n\n const error = isError ? new Error(\"Failed to load branches\") : null;\n\n // Handle clear\n const handleClear = useCallback(() => {\n setInputValue(\"\");\n onBranchSelect(null);\n setUserManuallyCleared(true); // Mark that user manually cleared the branch\n }, [onBranchSelect]);\n\n // Handle branch selection\n const handleBranchSelect = useCallback(\n (branch: Branch | null) => {\n onBranchSelect(branch);\n setInputValue(\"\");\n },\n [onBranchSelect],\n );\n\n // Handle menu scroll for infinite loading\n const handleMenuScroll = useCallback(\n (event: React.UIEvent<HTMLUListElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;\n if (\n scrollHeight - scrollTop <= clientHeight * 1.5 &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingNextPage, fetchNextPage],\n );\n\n // Downshift configuration\n const {\n isOpen,\n selectedItem,\n highlightedIndex,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n } = useCombobox({\n items: filteredBranches,\n selectedItem: selectedBranch,\n itemToString: (item) => item?.name || \"\",\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n handleBranchSelect(newSelectedItem || null);\n },\n inputValue,\n // Override Downshift's default input-click behavior to avoid closing/reopening\n // the menu, which would reset scroll position and break search continuity.\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n });\n\n // Reset branch selection when repository changes\n useEffect(() => {\n if (repository) {\n onBranchSelect(null);\n setUserManuallyCleared(false); // Reset the manual clear flag when repository changes\n }\n }, [repository, onBranchSelect]);\n\n // Auto-select default branch when branches are loaded and no branch is selected\n // But only if the user hasn't manually cleared the branch\n useEffect(() => {\n if (\n repository &&\n defaultBranch &&\n !selectedBranch &&\n !userManuallyCleared && // Don't auto-select if user manually cleared\n filteredBranches.length > 0 &&\n !isLoading\n ) {\n const defaultBranchObj = filteredBranches.find(\n (branch) => branch.name === defaultBranch,\n );\n\n if (defaultBranchObj) {\n onBranchSelect(defaultBranchObj);\n }\n }\n }, [\n repository,\n defaultBranch,\n selectedBranch,\n userManuallyCleared,\n filteredBranches,\n onBranchSelect,\n isLoading,\n ]);\n\n // Reset input when repository changes\n useEffect(() => {\n setInputValue(\"\");\n }, [repository]);\n\n // Initialize input value when selectedBranch changes (but not when user is typing)\n useEffect(() => {\n if (selectedBranch && !isOpen) {\n setInputValue(selectedBranch.name);\n } else if (!selectedBranch && !isOpen) {\n setInputValue(\"\");\n }\n }, [selectedBranch, isOpen]);\n\n const isLoadingState = isLoading || isSearchLoading || isFetchingNextPage;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"group relative text-[var(--oh-muted)] hover:text-white\">\n <div className=\"absolute left-2 top-1/2 transform -translate-y-1/2 z-10\">\n {isLoadingState ? (\n <div className=\"animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full\" />\n ) : (\n <BranchIcon width={16} height={16} />\n )}\n </div>\n <input\n {...getInputProps({\n disabled: disabled || !repository,\n placeholder,\n className: cn(\n formControlFieldClassName,\n \"text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5\",\n \"placeholder:text-[var(--oh-muted)]\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n ),\n // Direct onChange for cursor position preservation\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n },\n })}\n data-testid=\"git-branch-dropdown-input\"\n />\n\n <div className=\"absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center\">\n {selectedBranch && (\n <ClearButton disabled={disabled} onClear={handleClear} />\n )}\n\n <ToggleButton\n isOpen={isOpen}\n disabled={disabled || !repository}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n </div>\n\n <BranchDropdownMenu\n isOpen={isOpen}\n filteredBranches={filteredBranches}\n inputValue={inputValue}\n highlightedIndex={highlightedIndex}\n selectedItem={selectedItem}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n onScroll={handleMenuScroll}\n menuRef={menuRef}\n />\n\n <ErrorMessage isError={!!error} />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"git-branch-dropdown.cjs","names":[],"sources":["../../../../../src/components/features/home/git-branch-dropdown/git-branch-dropdown.tsx"],"sourcesContent":["import React, {\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n} from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { useTranslation } from \"react-i18next\";\nimport { Branch } from \"#/types/git\";\nimport { Provider } from \"#/types/settings\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useDebounce } from \"#/hooks/use-debounce\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlFieldClassName } from \"#/utils/form-control-classes\";\nimport { useBranchData } from \"#/hooks/query/use-branch-data\";\n\nimport { ClearButton } from \"../shared/clear-button\";\nimport { ToggleButton } from \"../shared/toggle-button\";\nimport { ErrorMessage } from \"../shared/error-message\";\nimport { BranchDropdownMenu } from \"./branch-dropdown-menu\";\nimport BranchIcon from \"#/icons/u-code-branch.svg?react\";\n\nexport interface GitBranchDropdownProps {\n repository: string | null;\n provider: Provider;\n selectedBranch: Branch | null;\n onBranchSelect: (branch: Branch | null) => void;\n defaultBranch?: string | null;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function GitBranchDropdown({\n repository,\n provider,\n selectedBranch,\n onBranchSelect,\n defaultBranch,\n placeholder,\n disabled = false,\n className,\n}: GitBranchDropdownProps) {\n const { t } = useTranslation(\"openhands\");\n const [inputValue, setInputValue] = useState(\"\");\n const [userManuallyCleared, setUserManuallyCleared] = useState(false);\n const debouncedInputValue = useDebounce(inputValue, 300);\n const menuRef = useRef<HTMLUListElement>(null);\n\n // Process search input (debounced and filtered)\n const processedSearchInput = useMemo(\n () =>\n debouncedInputValue.trim().length > 0 ? debouncedInputValue.trim() : \"\",\n [debouncedInputValue],\n );\n\n // Use the new branch data hook with default branch prioritization\n const {\n branches: filteredBranches,\n isLoading,\n isError,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isSearchLoading,\n } = useBranchData(\n repository,\n provider,\n defaultBranch || null,\n processedSearchInput,\n inputValue,\n selectedBranch,\n );\n\n const error = isError ? new Error(\"Failed to load branches\") : null;\n\n // Handle clear\n const handleClear = useCallback(() => {\n setInputValue(\"\");\n onBranchSelect(null);\n setUserManuallyCleared(true); // Mark that user manually cleared the branch\n }, [onBranchSelect]);\n\n // Handle branch selection\n const handleBranchSelect = useCallback(\n (branch: Branch | null) => {\n onBranchSelect(branch);\n setInputValue(\"\");\n },\n [onBranchSelect],\n );\n\n // Handle menu scroll for infinite loading\n const handleMenuScroll = useCallback(\n (event: React.UIEvent<HTMLUListElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;\n if (\n scrollHeight - scrollTop <= clientHeight * 1.5 &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n [hasNextPage, isFetchingNextPage, fetchNextPage],\n );\n\n // Downshift configuration\n const {\n isOpen,\n selectedItem,\n highlightedIndex,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n } = useCombobox({\n items: filteredBranches,\n selectedItem: selectedBranch,\n itemToString: (item) => item?.name || \"\",\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n handleBranchSelect(newSelectedItem || null);\n },\n inputValue,\n // Override Downshift's default input-click behavior to avoid closing/reopening\n // the menu, which would reset scroll position and break search continuity.\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n });\n\n // Reset branch selection when repository changes\n useEffect(() => {\n if (repository) {\n onBranchSelect(null);\n setUserManuallyCleared(false); // Reset the manual clear flag when repository changes\n }\n }, [repository, onBranchSelect]);\n\n // Auto-select default branch when branches are loaded and no branch is selected\n // But only if the user hasn't manually cleared the branch\n useEffect(() => {\n if (\n repository &&\n defaultBranch &&\n !selectedBranch &&\n !userManuallyCleared && // Don't auto-select if user manually cleared\n filteredBranches.length > 0 &&\n !isLoading\n ) {\n const defaultBranchObj = filteredBranches.find(\n (branch) => branch.name === defaultBranch,\n );\n\n if (defaultBranchObj) {\n onBranchSelect(defaultBranchObj);\n }\n }\n }, [\n repository,\n defaultBranch,\n selectedBranch,\n userManuallyCleared,\n filteredBranches,\n onBranchSelect,\n isLoading,\n ]);\n\n // Reset input when repository changes\n useEffect(() => {\n setInputValue(\"\");\n }, [repository]);\n\n // Initialize input value when selectedBranch changes (but not when user is typing)\n useEffect(() => {\n if (selectedBranch && !isOpen) {\n setInputValue(selectedBranch.name);\n } else if (!selectedBranch && !isOpen) {\n setInputValue(\"\");\n }\n }, [selectedBranch, isOpen]);\n\n const isLoadingState = isLoading || isSearchLoading || isFetchingNextPage;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"group relative text-[var(--oh-muted)] hover:text-white\">\n <div className=\"absolute left-2 top-1/2 transform -translate-y-1/2 z-10\">\n {isLoadingState ? (\n <div className=\"animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full\" />\n ) : (\n <BranchIcon width={16} height={16} />\n )}\n </div>\n <input\n {...getInputProps({\n disabled: disabled || !repository,\n placeholder:\n placeholder ?? t(I18nKey.COMMON$SELECT_BRANCH_PLACEHOLDER),\n className: cn(\n formControlFieldClassName,\n \"text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5\",\n \"placeholder:text-[var(--oh-muted)]\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n ),\n // Direct onChange for cursor position preservation\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n },\n })}\n data-testid=\"git-branch-dropdown-input\"\n />\n\n <div className=\"absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center\">\n {selectedBranch && (\n <ClearButton disabled={disabled} onClear={handleClear} />\n )}\n\n <ToggleButton\n isOpen={isOpen}\n disabled={disabled || !repository}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n </div>\n\n <BranchDropdownMenu\n isOpen={isOpen}\n filteredBranches={filteredBranches}\n inputValue={inputValue}\n highlightedIndex={highlightedIndex}\n selectedItem={selectedItem}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n onScroll={handleMenuScroll}\n menuRef={menuRef}\n />\n\n <ErrorMessage isError={!!error} />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,115 +1,117 @@
1
- import { cn as e } from "../../../../utils/utils.js";
2
- import { formControlFieldClassName as t } from "../../../../utils/form-control-classes.js";
3
- import n from "../../../../icons/u-code-branch.js";
4
- import { useCombobox as r } from "../../../../node_modules/downshift/dist/downshift.esm.js";
5
- import { useDebounce as i } from "../../../../hooks/use-debounce.js";
6
- import { ClearButton as a } from "../shared/clear-button.js";
7
- import { ToggleButton as o } from "../shared/toggle-button.js";
8
- import { ErrorMessage as s } from "../shared/error-message.js";
9
- import { useBranchData as c } from "../../../../hooks/query/use-branch-data.js";
10
- import { BranchDropdownMenu as l } from "./branch-dropdown-menu.js";
11
- import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
12
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
1
+ import { useTranslation as e } from "../../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../../i18n/declaration.js";
3
+ import { cn as n } from "../../../../utils/utils.js";
4
+ import { formControlFieldClassName as r } from "../../../../utils/form-control-classes.js";
5
+ import i from "../../../../icons/u-code-branch.js";
6
+ import { useCombobox as a } from "../../../../node_modules/downshift/dist/downshift.esm.js";
7
+ import { useDebounce as o } from "../../../../hooks/use-debounce.js";
8
+ import { ClearButton as s } from "../shared/clear-button.js";
9
+ import { ToggleButton as c } from "../shared/toggle-button.js";
10
+ import { ErrorMessage as l } from "../shared/error-message.js";
11
+ import { useBranchData as u } from "../../../../hooks/query/use-branch-data.js";
12
+ import { BranchDropdownMenu as d } from "./branch-dropdown-menu.js";
13
+ import { useCallback as f, useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
14
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
13
15
  //#region src/components/features/home/git-branch-dropdown/git-branch-dropdown.tsx
14
- function _({ repository: _, provider: v, selectedBranch: y, onBranchSelect: b, defaultBranch: x, placeholder: S = "Select branch...", disabled: C = !1, className: w }) {
15
- let [T, E] = m(""), [D, O] = m(!1), k = i(T, 300), A = p(null), j = f(() => k.trim().length > 0 ? k.trim() : "", [k]), { branches: M, isLoading: N, isError: P, fetchNextPage: F, hasNextPage: I, isFetchingNextPage: L, isSearchLoading: R } = c(_, v, x || null, j, T, y), z = P ? /* @__PURE__ */ Error("Failed to load branches") : null, B = u(() => {
16
- E(""), b(null), O(!0);
17
- }, [b]), V = u((e) => {
18
- b(e), E("");
19
- }, [b]), H = u((e) => {
16
+ function y({ repository: y, provider: b, selectedBranch: x, onBranchSelect: S, defaultBranch: C, placeholder: w, disabled: T = !1, className: E }) {
17
+ let { t: D } = e("openhands"), [O, k] = g(""), [A, j] = g(!1), M = o(O, 300), N = h(null), P = m(() => M.trim().length > 0 ? M.trim() : "", [M]), { branches: F, isLoading: I, isError: L, fetchNextPage: R, hasNextPage: z, isFetchingNextPage: B, isSearchLoading: V } = u(y, b, C || null, P, O, x), H = L ? /* @__PURE__ */ Error("Failed to load branches") : null, U = f(() => {
18
+ k(""), S(null), j(!0);
19
+ }, [S]), W = f((e) => {
20
+ S(e), k("");
21
+ }, [S]), G = f((e) => {
20
22
  let { scrollTop: t, scrollHeight: n, clientHeight: r } = e.currentTarget;
21
- n - t <= r * 1.5 && I && !L && F();
23
+ n - t <= r * 1.5 && z && !B && R();
22
24
  }, [
23
- I,
24
- L,
25
- F
26
- ]), { isOpen: U, selectedItem: W, highlightedIndex: G, getInputProps: K, getItemProps: q, getMenuProps: J, getToggleButtonProps: Y } = r({
27
- items: M,
28
- selectedItem: y,
25
+ z,
26
+ B,
27
+ R
28
+ ]), { isOpen: K, selectedItem: q, highlightedIndex: J, getInputProps: Y, getItemProps: X, getMenuProps: Z, getToggleButtonProps: Q } = a({
29
+ items: F,
30
+ selectedItem: x,
29
31
  itemToString: (e) => e?.name || "",
30
32
  onSelectedItemChange: ({ selectedItem: e }) => {
31
- V(e || null);
33
+ W(e || null);
32
34
  },
33
- inputValue: T,
34
- stateReducer: (e, t) => t.type === r.stateChangeTypes.InputClick && e.isOpen ? {
35
+ inputValue: O,
36
+ stateReducer: (e, t) => t.type === a.stateChangeTypes.InputClick && e.isOpen ? {
35
37
  ...t.changes,
36
38
  isOpen: !0
37
39
  } : t.changes
38
40
  });
39
- d(() => {
40
- _ && (b(null), O(!1));
41
- }, [_, b]), d(() => {
42
- if (_ && x && !y && !D && M.length > 0 && !N) {
43
- let e = M.find((e) => e.name === x);
44
- e && b(e);
41
+ p(() => {
42
+ y && (S(null), j(!1));
43
+ }, [y, S]), p(() => {
44
+ if (y && C && !x && !A && F.length > 0 && !I) {
45
+ let e = F.find((e) => e.name === C);
46
+ e && S(e);
45
47
  }
46
48
  }, [
47
- _,
48
- x,
49
49
  y,
50
- D,
51
- M,
52
- b,
53
- N
54
- ]), d(() => {
55
- E("");
56
- }, [_]), d(() => {
57
- y && !U ? E(y.name) : !y && !U && E("");
58
- }, [y, U]);
59
- let X = N || R || L;
60
- return /* @__PURE__ */ g("div", {
61
- className: e("relative", w),
50
+ C,
51
+ x,
52
+ A,
53
+ F,
54
+ S,
55
+ I
56
+ ]), p(() => {
57
+ k("");
58
+ }, [y]), p(() => {
59
+ x && !K ? k(x.name) : !x && !K && k("");
60
+ }, [x, K]);
61
+ let $ = I || V || B;
62
+ return /* @__PURE__ */ v("div", {
63
+ className: n("relative", E),
62
64
  children: [
63
- /* @__PURE__ */ g("div", {
65
+ /* @__PURE__ */ v("div", {
64
66
  className: "group relative text-[var(--oh-muted)] hover:text-white",
65
67
  children: [
66
- /* @__PURE__ */ h("div", {
68
+ /* @__PURE__ */ _("div", {
67
69
  className: "absolute left-2 top-1/2 transform -translate-y-1/2 z-10",
68
- children: X ? /* @__PURE__ */ h("div", { className: "animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full" }) : /* @__PURE__ */ h(n, {
70
+ children: $ ? /* @__PURE__ */ _("div", { className: "animate-spin h-4 w-4 border-2 border-transparent border-t-white rounded-full" }) : /* @__PURE__ */ _(i, {
69
71
  width: 16,
70
72
  height: 16
71
73
  })
72
74
  }),
73
- /* @__PURE__ */ h("input", {
74
- ...K({
75
- disabled: C || !_,
76
- placeholder: S,
77
- className: e(t, "text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5", "placeholder:text-[var(--oh-muted)]", "disabled:cursor-not-allowed disabled:opacity-60"),
75
+ /* @__PURE__ */ _("input", {
76
+ ...Y({
77
+ disabled: T || !y,
78
+ placeholder: w ?? D(t.COMMON$SELECT_BRANCH_PLACEHOLDER),
79
+ className: n(r, "text-inherit shadow-none pl-7 pr-16 text-sm font-normal leading-5", "placeholder:text-[var(--oh-muted)]", "disabled:cursor-not-allowed disabled:opacity-60"),
78
80
  onChange: (e) => {
79
- E(e.target.value);
81
+ k(e.target.value);
80
82
  }
81
83
  }),
82
84
  "data-testid": "git-branch-dropdown-input"
83
85
  }),
84
- /* @__PURE__ */ g("div", {
86
+ /* @__PURE__ */ v("div", {
85
87
  className: "absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center",
86
- children: [y && /* @__PURE__ */ h(a, {
87
- disabled: C,
88
- onClear: B
89
- }), /* @__PURE__ */ h(o, {
90
- isOpen: U,
91
- disabled: C || !_,
92
- getToggleButtonProps: Y
88
+ children: [x && /* @__PURE__ */ _(s, {
89
+ disabled: T,
90
+ onClear: U
91
+ }), /* @__PURE__ */ _(c, {
92
+ isOpen: K,
93
+ disabled: T || !y,
94
+ getToggleButtonProps: Q
93
95
  })]
94
96
  })
95
97
  ]
96
98
  }),
97
- /* @__PURE__ */ h(l, {
98
- isOpen: U,
99
- filteredBranches: M,
100
- inputValue: T,
101
- highlightedIndex: G,
102
- selectedItem: W,
103
- getMenuProps: J,
104
- getItemProps: q,
105
- onScroll: H,
106
- menuRef: A
99
+ /* @__PURE__ */ _(d, {
100
+ isOpen: K,
101
+ filteredBranches: F,
102
+ inputValue: O,
103
+ highlightedIndex: J,
104
+ selectedItem: q,
105
+ getMenuProps: Z,
106
+ getItemProps: X,
107
+ onScroll: G,
108
+ menuRef: N
107
109
  }),
108
- /* @__PURE__ */ h(s, { isError: !!z })
110
+ /* @__PURE__ */ _(l, { isError: !!H })
109
111
  ]
110
112
  });
111
113
  }
112
114
  //#endregion
113
- export { _ as GitBranchDropdown };
115
+ export { y as GitBranchDropdown };
114
116
 
115
117
  //# sourceMappingURL=git-branch-dropdown.js.map