@openhands/agent-canvas 1.0.0-rc.6 → 1.0.0-rc.8
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.
- package/README.md +1 -3
- package/README.windows.md +2 -2
- package/build/assets/{QueryClientProvider-2bFjjuvv.js → QueryClientProvider-XcSjsfpb.js} +1 -1
- package/build/assets/{Trans-D1xHkKyr.js → Trans-sy4l4TyQ.js} +1 -1
- package/build/assets/{acp-providers-Djbp2WMV.js → acp-providers-BqUvf67Q.js} +1 -1
- package/build/assets/{active-backend-context-BiVlte2V.js → active-backend-context-CNF2lPkA.js} +1 -1
- package/build/assets/add-backend-modal-BywVr6uq.js +1 -0
- package/build/assets/{agent-server-adapter-BD6kvwWb.js → agent-server-adapter-k8veH-1O.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-8AC86rC5.js → agent-server-conversation-service.api-CGbkhsLj.js} +1 -1
- package/build/assets/{agent-settings-DycVwGfd.js → agent-settings-DoHXHcoA.js} +1 -1
- package/build/assets/{alert-banner-BUqPui_3.js → alert-banner-Bsvys-hT.js} +1 -1
- package/build/assets/{analytics-consent-form-modal-CdP5JRph.js → analytics-consent-form-modal-CVhsAREx.js} +1 -1
- package/build/assets/{api-key-entry-screen-BnvQM0v5.js → api-key-entry-screen-Dnr5TcV0.js} +1 -1
- package/build/assets/{app-settings-FRYUtG-Z.js → app-settings-Bgm2-yOM.js} +1 -1
- package/build/assets/{automation-detail-DiIq3Vsh.js → automation-detail-86M_yMqz.js} +1 -1
- package/build/assets/{automations-list-DQn7k1Ix.js → automations-list-BWUILrqY.js} +1 -1
- package/build/assets/{back-nav-button-B8eULM4t.js → back-nav-button-D20Avel_.js} +1 -1
- package/build/assets/{backend-form-modal-DY3My0us.js → backend-form-modal-Dl29wkF5.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-BW2WPX-c.js → backend-synced-settings-badge-Dcd4712m.js} +1 -1
- package/build/assets/{base-modal-B_MCb3rx.js → base-modal-DvuGYyu1.js} +1 -1
- package/build/assets/{brand-button-B6g_UvEG.js → brand-button-9SOzmqPP.js} +1 -1
- package/build/assets/{browser-tab-DVHx54yn.js → browser-tab-bveyJhG9.js} +1 -1
- package/build/assets/{chat-send-button-Ce9rK8Vd.js → chat-send-button-BhoO7T0s.js} +1 -1
- package/build/assets/{checkmark-BQIxLn5W.js → checkmark--JWAesua.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-DRwQ4Z7K.js → circle-plus-check-toggle-AO9DWyDX.js} +1 -1
- package/build/assets/{close-HybccyBS.js → close--W-tHn1h.js} +1 -1
- package/build/assets/{code-tag-DZCEX2zo.js → code-tag-chmctf4w.js} +1 -1
- package/build/assets/{combobox-caret-kEa3kTvf.js → combobox-caret-C9BNHfSu.js} +1 -1
- package/build/assets/{condenser-settings-BlbT8YRd.js → condenser-settings-DgQ0rsAf.js} +1 -1
- package/build/assets/{confirmation-modal-CG_Fgrny.js → confirmation-modal-Cq3eqvqH.js} +1 -1
- package/build/assets/{context-menu-list-item-CvJv3-kq.js → context-menu-list-item-BQU0jZPq.js} +1 -1
- package/build/assets/conversation-CayU5Lrr.js +19 -0
- package/build/assets/conversation-erinyBqT.js +1 -0
- package/build/assets/conversation-panel-DiI4q-8-.js +1 -0
- package/build/assets/{conversation-service.api-CngSQhPh.js → conversation-service.api-shHWtFwu.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-B5eOSEGv.js → conversation-tab-empty-state-C8tztloo.js} +1 -1
- package/build/assets/{copy-D6CyDz2n.js → copy-CdKN5rtJ.js} +1 -1
- package/build/assets/{declaration-BDfM67Kl.js → declaration-D9ucT0fq.js} +1 -1
- package/build/assets/{device-verify-CAevP6_3.js → device-verify-YuGXnpRk.js} +1 -1
- package/build/assets/{dropdown-classes-CL8egwz_.js → dropdown-classes-CVp0kVdt.js} +1 -1
- package/build/assets/{edit-automation-modal-CwLfhSMN.js → edit-automation-modal-8y9Uctxo.js} +1 -1
- package/build/assets/{ellipsis-button-Db-AwbLv.js → ellipsis-button-k7HLwYth.js} +1 -1
- package/build/assets/{entry.client-BKDpKmdB.js → entry.client-D_wtryHT.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DnYXhc1E.js → enum-filter-dropdown-COqUq3mB.js} +1 -1
- package/build/assets/{environment-switch-overlay-BgYKFdf6.js → environment-switch-overlay-wB5LxfYZ.js} +1 -1
- package/build/assets/{extensions-hub-CgisT2wb.js → extensions-hub-CoWO3SzQ.js} +1 -1
- package/build/assets/{extensions-navigation-nurGkQe5.js → extensions-navigation-D5w2sFQe.js} +1 -1
- package/build/assets/{files-tab-DIyAYvp0.js → files-tab-CxdtgkIe.js} +1 -1
- package/build/assets/{files-tab-store-RScGdwu8.js → files-tab-store-DSKUhziI.js} +1 -1
- package/build/assets/{folder-IChmji2Y.js → folder-DPTBlxWb.js} +1 -1
- package/build/assets/home-3joHMYSR.js +1 -0
- package/build/assets/{install-server-modal-C8fylTet.js → install-server-modal-_7l1gcjd.js} +1 -1
- package/build/assets/{launch-BNiqgTvz.js → launch-fU77utLO.js} +1 -1
- package/build/assets/{lesson-plan-BdmMvboE.js → lesson-plan-CHGc-B8Y.js} +1 -1
- package/build/assets/{lightbulb-DzViGAuw.js → lightbulb-S616sGEL.js} +1 -1
- package/build/assets/{link-external-Dwv3oQAx.js → link-external-ooNztGLp.js} +1 -1
- package/build/assets/llm-not-configured-banner-BMGzpBPV.js +27 -0
- package/build/assets/llm-settings-BRotm_g6.js +1 -0
- package/build/assets/{llm-settings-B92l1Z2N.js → llm-settings-yDgbXP6Q.js} +1 -1
- package/build/assets/{loading-spinner-Dtm7y-w5.js → loading-spinner-D7bOU6I7.js} +1 -1
- package/build/assets/{manage-backends-modal-qpq2M_oN.js → manage-backends-modal-tfdzTXWU.js} +1 -1
- package/build/assets/{manifest-05156141.js → manifest-bbc1374e.js} +1 -1
- package/build/assets/{markdown-renderer-Dt0RXhUJ.js → markdown-renderer-z446oW0Z.js} +1 -1
- package/build/assets/{mcp-BKdD21xY.js → mcp-Dopstf0t.js} +1 -1
- package/build/assets/{messages-Ch8Rd1cx.js → messages-CsFUrAen.js} +1 -1
- package/build/assets/{modal-backdrop-DmDLoot0.js → modal-backdrop-_VbcKk5K.js} +1 -1
- package/build/assets/{modal-body-BWjhfiSa.js → modal-body-Cd-PtMHr.js} +1 -1
- package/build/assets/{modal-classes-DbJbhQCW.js → modal-classes-CNm4ovfm.js} +1 -1
- package/build/assets/{modal-close-button-DXN6uYvt.js → modal-close-button-Dbo0NAMt.js} +1 -1
- package/build/assets/{model-selector-BMn4D5v6.js → model-selector-sioC8xP4.js} +1 -1
- package/build/assets/{navigation-context-BrRCrWhm.js → navigation-context-BpAOh_t5.js} +1 -1
- package/build/assets/{navigation-link-qUrH_I5_.js → navigation-link-Dci7Nuyf.js} +1 -1
- package/build/assets/{onboarding-B50IeNyy.js → onboarding-CQh50i2z.js} +1 -1
- package/build/assets/{openhands-logo-DnfHAq7Y.js → openhands-logo-Dzm-d_V_.js} +1 -1
- package/build/assets/{option-service.api-lzN_3s9w.js → option-service.api-DjPvPAtd.js} +1 -1
- package/build/assets/{organization-service.api-CNmSPGj4.js → organization-service.api-BNc9Kn6n.js} +1 -1
- package/build/assets/{path-utils-CKgIQZAY.js → path-utils-YlkpoImJ.js} +1 -1
- package/build/assets/{plan-components-D9fU4FFh.js → plan-components-CutRBi0G.js} +1 -1
- package/build/assets/{planner-tab-B7kpsTT8.js → planner-tab-DjIFIQDk.js} +1 -1
- package/build/assets/{providers-189W9TJO.js → providers-BiWSYwRT.js} +1 -1
- package/build/assets/{query-client-config-B9ZI-1_w.js → query-client-config-Ca3tW1AH.js} +1 -1
- package/build/assets/{recommended-automations-launcher-C_RcP2yb.js → recommended-automations-launcher-DCi0RXIj.js} +1 -1
- package/build/assets/{root-CFnl2e43.js → root-DrHpnAqU.js} +2 -2
- package/build/assets/{root-layout-BQGwrist.js → root-layout-Cf7FC9DC.js} +2 -2
- package/build/assets/{runtime-waiting-state-DPjfE32a.js → runtime-waiting-state-8i0Z3A_i.js} +1 -1
- package/build/assets/{sdk-section-page-ozvrzW4r.js → sdk-section-page-COlGKv4E.js} +1 -1
- package/build/assets/{sdk-settings-schema-Ck6f2ON9.js → sdk-settings-schema-Big50zDH.js} +1 -1
- package/build/assets/{search-aDWSdSb7.js → search-C_l_XW4e.js} +1 -1
- package/build/assets/{secrets-settings-Bga0bwB1.js → secrets-settings-DYfTc5c8.js} +1 -1
- package/build/assets/{settings-DHAhcPm2.js → settings-DRmVFdOc.js} +1 -1
- package/build/assets/{settings-dropdown-input-N0FtDFkk.js → settings-dropdown-input-BP-arqjU.js} +1 -1
- package/build/assets/{settings-gear-D8ao16bi.js → settings-gear-f-zWpxfI.js} +1 -1
- package/build/assets/{settings-index-CJvQH5ls.js → settings-index-B035V2pu.js} +1 -1
- package/build/assets/{settings-input-CyWJBrqC.js → settings-input-BM8ANxDb.js} +1 -1
- package/build/assets/{settings-list-classes-CYRnRf8r.js → settings-list-classes-B9uo5WES.js} +1 -1
- package/build/assets/{settings-modal-BeAlR7Be.js → settings-modal-CeRvS5Bc.js} +1 -1
- package/build/assets/{settings-section-header-context-1fN7Xkb3.js → settings-section-header-context-Cid25HM2.js} +1 -1
- package/build/assets/{settings-switch-D3aEIphL.js → settings-switch-xa6q4M6j.js} +1 -1
- package/build/assets/{shared-conversation-CtRf6CQN.js → shared-conversation-CBbpyPaD.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-DkYaKR6Q.js → sidebar-mobile-menu-toggle-SKcwsEtD.js} +1 -1
- package/build/assets/{sidebar-nav-link-CzeuB4So.js → sidebar-nav-link-CPWuQ_c6.js} +1 -1
- package/build/assets/{skill-card-pill-row-CvLCLqqD.js → skill-card-pill-row-DeodrwPG.js} +1 -1
- package/build/assets/{skills-jKeJCunm.js → skills-BE5HJuGM.js} +1 -1
- package/build/assets/{skills-plugins-juwPhlEE.js → skills-plugins-Dc4ec3CW.js} +1 -1
- package/build/assets/{skills-settings-BW09n_Px.js → skills-settings-B6HwvA0S.js} +1 -1
- package/build/assets/{styled-tooltip-B3wz8m5E.js → styled-tooltip-X61SEwqk.js} +1 -1
- package/build/assets/{suspense-BpkWt-39.js → suspense-Bqb0V0q1.js} +1 -1
- package/build/assets/{switch-skeleton-Cl_Nh2kt.js → switch-skeleton-BbIWemkK.js} +1 -1
- package/build/assets/{task-list-tab-DKnHShLG.js → task-list-tab-BFnyHGsn.js} +1 -1
- package/build/assets/{telemetry-Ca_YAGcO.js → telemetry-DCFAqpIA.js} +1 -1
- package/build/assets/{terminal-BFi5FOMc.js → terminal-B92mACR5.js} +1 -1
- package/build/assets/{terminal-CZH2h1J3.js → terminal-CltMeLv4.js} +1 -1
- package/build/assets/{toggle-switch-BzaEofjj.js → toggle-switch-CL_wRiGs.js} +1 -1
- package/build/assets/{typography-BFj4IzMj.js → typography-BLSEGjph.js} +1 -1
- package/build/assets/{u-check-circle-Cs2GOrZ7.js → u-check-circle-dG_VJqx5.js} +1 -1
- package/build/assets/{u-check-circle-half-DGgLKVV1.js → u-check-circle-half-D-5ZPRnd.js} +1 -1
- package/build/assets/{u-circuit-DniZPNAV.js → u-circuit-BXoisXOA.js} +1 -1
- package/build/assets/{u-edit-BvTiDr33.js → u-edit-DIgADxLH.js} +1 -1
- package/build/assets/{use-acp-credential-form-8yHKY_py.js → use-acp-credential-form-LjCIhMSK.js} +1 -1
- package/build/assets/{use-active-conversation-CLzls6XV.js → use-active-conversation-B0_rXnqa.js} +1 -1
- package/build/assets/{use-agent-settings-schema-BCXxH2N-.js → use-agent-settings-schema-D8x5LJVS.js} +1 -1
- package/build/assets/{use-agent-state-BocVPR5S.js → use-agent-state-BuOzLeFN.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-BjDwnldw.js → use-cloud-current-user-id-DVZXa_WH.js} +1 -1
- package/build/assets/use-config-5zEjywCL.js +1 -0
- package/build/assets/{use-create-conversation-CIkPp9u9.js → use-create-conversation-pV2eA-e9.js} +1 -1
- package/build/assets/{use-create-secret-Bwy6457V.js → use-create-secret-ClPpLBgD.js} +1 -1
- package/build/assets/{use-handle-plan-click-CjNwpDeO.js → use-handle-plan-click-CwN_nNib.js} +1 -1
- package/build/assets/use-is-authed-B8eLO-Xq.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-QmcJQxUY.js → use-launch-skill-in-chat-BTgXIu3N.js} +1 -1
- package/build/assets/{use-llm-profiles-CZD1ALup.js → use-llm-profiles-CWLfWjav.js} +1 -1
- package/build/assets/use-runtime-is-ready-Bbory9-s.js +1 -0
- package/build/assets/{use-save-settings-BjYPOrtF.js → use-save-settings-Xp8DD-jf.js} +1 -1
- package/build/assets/{use-settings-YTDcMvj1.js → use-settings-0SeqaDeW.js} +1 -1
- package/build/assets/{use-settings-nav-items-DMit9adK.js → use-settings-nav-items-DVrMNk0I.js} +1 -1
- package/build/assets/{use-skills-fh_U4ZGe.js → use-skills-Bv8LXrys.js} +1 -1
- package/build/assets/{use-tracking-DJ3Z7ha1.js → use-tracking-BhyV5A9i.js} +1 -1
- package/build/assets/{use-user-conversation-Ct93yaXj.js → use-user-conversation-6yFVEXiG.js} +1 -1
- package/build/assets/{useMutation-B1gQr_yr.js → useMutation-Dm84WAKR.js} +1 -1
- package/build/assets/{useQuery-CbqdITLM.js → useQuery-DGRSm7IT.js} +1 -1
- package/build/assets/{useTranslation-C-T8J2U-.js → useTranslation-CL6FTf1b.js} +1 -1
- package/build/assets/{utils-CXRkUr73.js → utils-eXk6yerZ.js} +1 -1
- package/build/assets/{vendor~conversation-panel~conversation-CkFCLbQW.js → vendor~conversation-panel~conversation-D98u43rl.js} +1 -1
- 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
- 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
- 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
- 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
- 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
- package/build/assets/{vendor~root-layout~home~mcp~automations-list-COlx7Is6.js → vendor~root-layout~home~mcp~automations-list-D40jgugf.js} +1 -1
- 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
- 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
- package/build/assets/{verification-settings-CeIuPtF2.js → verification-settings-Be6NxjuT.js} +1 -1
- package/build/assets/{x-mark-BMhi11Sg.js → x-mark-C42svtnu.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +45 -40
- package/build/locales/ca/openhands.json +41 -36
- package/build/locales/de/openhands.json +42 -37
- package/build/locales/en/openhands.json +6 -1
- package/build/locales/es/openhands.json +44 -39
- package/build/locales/fr/openhands.json +44 -39
- package/build/locales/it/openhands.json +44 -39
- package/build/locales/ja/openhands.json +44 -39
- package/build/locales/ko-KR/openhands.json +44 -39
- package/build/locales/no/openhands.json +44 -39
- package/build/locales/pt/openhands.json +44 -39
- package/build/locales/tr/openhands.json +43 -38
- package/build/locales/uk/openhands.json +44 -39
- package/build/locales/zh-CN/openhands.json +44 -39
- package/build/locales/zh-TW/openhands.json +44 -39
- package/config/defaults.json +9 -4
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.js +1 -1
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +1 -1
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +1 -1
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/git-control-bar.cjs +1 -1
- package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar.js +1 -1
- package/dist/components/features/chat/git-control-bar.js.map +1 -1
- package/dist/components/features/chat/open-repository-modal.cjs +1 -1
- package/dist/components/features/chat/open-repository-modal.cjs.map +1 -1
- package/dist/components/features/chat/open-repository-modal.js +0 -3
- package/dist/components/features/chat/open-repository-modal.js.map +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
- package/dist/components/features/chat/pending-user-messages.js +31 -28
- package/dist/components/features/chat/pending-user-messages.js.map +1 -1
- package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs +1 -1
- package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs.map +1 -1
- package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js +79 -77
- package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js.map +1 -1
- package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs +1 -1
- package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs.map +1 -1
- package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js +67 -65
- package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js.map +1 -1
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +2 -2
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js.map +1 -1
- package/dist/components/features/settings/settings-navigation.cjs +1 -1
- package/dist/components/features/settings/settings-navigation.cjs.map +1 -1
- package/dist/components/features/settings/settings-navigation.js +1 -1
- package/dist/components/features/settings/settings-navigation.js.map +1 -1
- package/dist/components/features/sidebar/sidebar.cjs +1 -1
- package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar.js +3 -2
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +6 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +612 -527
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +45 -40
- package/dist/locales/ca/openhands.json +41 -36
- package/dist/locales/de/openhands.json +42 -37
- package/dist/locales/en/openhands.json +6 -1
- package/dist/locales/es/openhands.json +44 -39
- package/dist/locales/fr/openhands.json +44 -39
- package/dist/locales/it/openhands.json +44 -39
- package/dist/locales/ja/openhands.json +44 -39
- package/dist/locales/ko-KR/openhands.json +44 -39
- package/dist/locales/no/openhands.json +44 -39
- package/dist/locales/pt/openhands.json +44 -39
- package/dist/locales/tr/openhands.json +43 -38
- package/dist/locales/uk/openhands.json +44 -39
- package/dist/locales/zh-CN/openhands.json +44 -39
- package/dist/locales/zh-TW/openhands.json +44 -39
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +186 -40
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +2 -2
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -1
- package/package.json +2 -2
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +149 -59
- package/scripts/dev-safe.mjs +1 -1
- package/build/assets/add-backend-modal-CSfOPrnr.js +0 -1
- package/build/assets/conversation-B7ztPdyS.js +0 -1
- package/build/assets/conversation-DZYd8QiZ.js +0 -19
- package/build/assets/conversation-panel-CklMXcs6.js +0 -1
- package/build/assets/home-iVOrSOWL.js +0 -1
- package/build/assets/llm-not-configured-banner-BQgVTo0O.js +0 -27
- package/build/assets/llm-settings-ICWFhhjM.js +0 -1
- package/build/assets/use-config-C4DX1-nF.js +0 -1
- package/build/assets/use-is-authed-7P3xSsit.js +0 -1
- 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
|
|
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
|
|
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`),
|
|
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
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import c from "
|
|
10
|
-
import {
|
|
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
|
|
13
|
-
let {
|
|
14
|
-
let
|
|
15
|
-
if (
|
|
16
|
-
|
|
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
|
|
19
|
-
} catch (
|
|
20
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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" ? () =>
|
|
35
|
-
onStop: e.status === "sending" ? () =>
|
|
36
|
-
children: e.imageUrls.length > 0 && /* @__PURE__ */
|
|
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 {
|
|
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
|
|
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`),
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import n from "../../../../
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
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
|
|
15
|
-
let [
|
|
16
|
-
|
|
17
|
-
}, [
|
|
18
|
-
|
|
19
|
-
}, [
|
|
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 &&
|
|
23
|
+
n - t <= r * 1.5 && z && !B && R();
|
|
22
24
|
}, [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
]), { isOpen:
|
|
27
|
-
items:
|
|
28
|
-
selectedItem:
|
|
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
|
-
|
|
33
|
+
W(e || null);
|
|
32
34
|
},
|
|
33
|
-
inputValue:
|
|
34
|
-
stateReducer: (e, t) => t.type ===
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
}, [
|
|
42
|
-
if (
|
|
43
|
-
let e =
|
|
44
|
-
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}, [y,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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__ */
|
|
65
|
+
/* @__PURE__ */ v("div", {
|
|
64
66
|
className: "group relative text-[var(--oh-muted)] hover:text-white",
|
|
65
67
|
children: [
|
|
66
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ _("div", {
|
|
67
69
|
className: "absolute left-2 top-1/2 transform -translate-y-1/2 z-10",
|
|
68
|
-
children:
|
|
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__ */
|
|
74
|
-
...
|
|
75
|
-
disabled:
|
|
76
|
-
placeholder:
|
|
77
|
-
className:
|
|
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
|
-
|
|
81
|
+
k(e.target.value);
|
|
80
82
|
}
|
|
81
83
|
}),
|
|
82
84
|
"data-testid": "git-branch-dropdown-input"
|
|
83
85
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ v("div", {
|
|
85
87
|
className: "absolute right-1 top-1/2 transform -translate-y-1/2 flex items-center",
|
|
86
|
-
children: [
|
|
87
|
-
disabled:
|
|
88
|
-
onClear:
|
|
89
|
-
}), /* @__PURE__ */
|
|
90
|
-
isOpen:
|
|
91
|
-
disabled:
|
|
92
|
-
getToggleButtonProps:
|
|
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__ */
|
|
98
|
-
isOpen:
|
|
99
|
-
filteredBranches:
|
|
100
|
-
inputValue:
|
|
101
|
-
highlightedIndex:
|
|
102
|
-
selectedItem:
|
|
103
|
-
getMenuProps:
|
|
104
|
-
getItemProps:
|
|
105
|
-
onScroll:
|
|
106
|
-
menuRef:
|
|
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__ */
|
|
110
|
+
/* @__PURE__ */ _(l, { isError: !!H })
|
|
109
111
|
]
|
|
110
112
|
});
|
|
111
113
|
}
|
|
112
114
|
//#endregion
|
|
113
|
-
export {
|
|
115
|
+
export { y as GitBranchDropdown };
|
|
114
116
|
|
|
115
117
|
//# sourceMappingURL=git-branch-dropdown.js.map
|