@openhands/agent-canvas 1.0.0-beta.6 → 1.0.0-beta.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 +24 -7
- package/README.windows.md +27 -0
- package/bin/agent-canvas.mjs +26 -3
- package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
- package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
- package/build/assets/acp-providers-BAX8OU5C.js +1 -0
- package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-HPk6TV-L.js} +1 -1
- package/build/assets/active-backend-context-BSPE-W72.js +1 -0
- package/build/assets/add-backend-modal-mXKmfMI2.js +1 -0
- package/build/assets/agent-server-client-options-9agOSarV.js +1 -0
- package/build/assets/agent-server-compatibility-B7QStIcH.js +1 -0
- package/build/assets/agent-server-conversation-service.api-B9TUYJon.js +5 -0
- package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-g3F623RJ.js} +1 -1
- package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
- package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-BQCNeNVt.js} +1 -1
- package/build/assets/api-key-entry-screen-myuWMqzW.js +1 -0
- package/build/assets/{app-settings-Db9ITeJH.js → app-settings-CCcX8ZEH.js} +1 -1
- package/build/assets/automation-detail-BDHLHSJd.js +1 -0
- package/build/assets/automations-list-CiNtQhq_.js +1 -0
- package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
- package/build/assets/backend-form-modal-D3bDMO3C.js +1 -0
- package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BkW5evM0.js} +1 -1
- package/build/assets/base-modal-C2oy2EBG.js +1 -0
- package/build/assets/brand-button-DJ_S16rO.js +1 -0
- package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
- package/build/assets/browser-store-DAsixKdU.js +1 -0
- package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
- package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
- package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
- package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
- package/build/assets/code-tag-BzyqOtPD.js +1 -0
- package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
- package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
- package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-DCTulgLO.js} +1 -1
- package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
- package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
- package/build/assets/conversation-BKhikfYl.js +1 -0
- package/build/assets/conversation-DTn8jN8L.js +19 -0
- package/build/assets/conversation-panel-DfHR42mG.js +1 -0
- package/build/assets/conversation-service.api-B6CkzaKD.js +1 -0
- package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
- package/build/assets/conversation-store-CC-isCnP.js +1 -0
- package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
- package/build/assets/conversation-websocket-context-DShEuLjh.js +3 -0
- package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
- package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
- package/build/assets/declaration-CR6HMp29.js +1 -0
- package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
- package/build/assets/dist-DNeWJ2bh.js +1 -0
- package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
- package/build/assets/edit-automation-modal-DamwL0s0.js +1 -0
- package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
- package/build/assets/entry.client-Cn71WM8q.js +2 -0
- package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
- package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
- package/build/assets/extensions-hub-CUEmfvGy.js +1 -0
- package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-VQ-3umJ7.js} +1 -1
- package/build/assets/file-BTY6Gyy9.js +1 -0
- package/build/assets/files-tab-C47fQEeL.js +1 -0
- package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
- package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
- package/build/assets/git-control-bar-branch-button-BT0aWH-o.js +27 -0
- package/build/assets/git-provider-icon-Pi-Cxpgv.js +1 -0
- package/build/assets/globe-Bzj_0oXT.js +1 -0
- package/build/assets/home-C3k6sFvB.js +1 -0
- package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
- package/build/assets/install-server-modal-6fuq-TU6.js +1 -0
- package/build/assets/launch-DGghLfGx.js +1 -0
- package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
- package/build/assets/link-external-DGxVm4Ps.js +1 -0
- package/build/assets/{llm-client-DaH1TuyR.js → llm-client-BqyLKgUN.js} +1 -1
- package/build/assets/llm-settings-BKraGtOu.js +1 -0
- package/build/assets/llm-settings-DRQTgOF1.js +1 -0
- package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
- package/build/assets/manage-backends-modal-CRMwyU0t.js +1 -0
- package/build/assets/manage-workspaces-modal-BYmGD1W7.js +1 -0
- package/build/assets/manifest-99b06a11.js +1 -0
- package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
- package/build/assets/mcp-CfDRAmPn.js +9 -0
- package/build/assets/messages-Ba1vaw6t.js +36 -0
- package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
- package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
- package/build/assets/modal-classes-6YqcqA6y.js +1 -0
- package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
- package/build/assets/{model-selector-SM9IUz-q.js → model-selector-DcztJSxT.js} +1 -1
- package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
- package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
- package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
- package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-CGNANEcT.js} +1 -1
- package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-BeuMC9QL.js} +1 -1
- package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-z12iCrQO.js} +1 -1
- package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
- package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-Dte6Vzza.js} +1 -1
- package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-BrqNmaDV.js} +1 -1
- package/build/assets/{providers-Bx6EfrzZ.js → providers-eUyo6pgr.js} +1 -1
- package/build/assets/proxy-BqDMnUY-.js +1 -0
- package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
- package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-D5ADbXao.js} +3 -3
- package/build/assets/{root-dNntxffj.js → root-BmhaEJJ8.js} +2 -2
- package/build/assets/root-Z2VHU4R3.css +1 -0
- package/build/assets/root-layout-CNggm0d8.js +2 -0
- package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-CRCRY3PG.js} +1 -1
- package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
- package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
- package/build/assets/secrets-service-B9AFn9OE.js +1 -0
- package/build/assets/secrets-settings-0UrKMS60.js +1 -0
- package/build/assets/{server-client-DyAQ3NZ_.js → server-client-DYv_GHPl.js} +1 -1
- package/build/assets/{settings-BYkVX7vW.js → settings-6t6LGW04.js} +1 -1
- package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
- package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
- package/build/assets/settings-index-CR6Ou73o.js +1 -0
- package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
- package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
- package/build/assets/settings-modal-T_Yk1Zfo.js +1 -0
- package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
- package/build/assets/settings-service.api-DwtyDeGh.js +1 -0
- package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
- package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
- package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-BzccsVej.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-DGlRg6jG.js +1 -0
- package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-dgVb8Fpy.js} +1 -1
- package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
- package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
- package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
- package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DctDrZ8Y.js} +1 -1
- package/build/assets/skills-settings-rvxImDj_.js +2 -0
- package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
- package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
- package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
- package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
- package/build/assets/{terminal-DgQk1Ay6.js → terminal-KldRPIRT.js} +2 -2
- package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
- package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
- package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
- package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
- package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
- package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
- package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-sPgfSkql.js} +1 -1
- package/build/assets/use-agent-settings-schema-B66kGIi_.js +1 -0
- package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-Dp3pD1h3.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-ClKFPjFz.js} +1 -1
- package/build/assets/{use-config-Co1O8-Ey.js → use-config-C9pvb0Sm.js} +1 -1
- package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-B-lwTnfE.js} +1 -1
- package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
- package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-oyC7PFRz.js} +1 -1
- package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-DP6Rs-YP.js} +1 -1
- package/build/assets/use-is-authed-dw2026rR.js +1 -0
- package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
- package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
- package/build/assets/use-llm-profiles-Bh5JqZUZ.js +1 -0
- package/build/assets/use-runtime-is-ready-BakOUVU-.js +1 -0
- package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-uXXkqvD7.js} +1 -1
- package/build/assets/use-settings-DeO7nvpM.js +1 -0
- package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BGMFn25b.js} +1 -1
- package/build/assets/{use-skills-DAMLFjKU.js → use-skills-DWIK3l3a.js} +1 -1
- package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
- package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DXPtB317.js} +1 -1
- package/build/assets/use-user-conversation-DJen4YIP.js +1 -0
- package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
- package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
- package/build/assets/utils-DCVfKFRt.js +1 -0
- package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
- package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
- package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
- package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js} +1 -1
- package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
- package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-C_zHuDx9.js} +1 -1
- package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DH9x7xXS.js} +1 -1
- package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
- package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +20 -2
- package/build/locales/ca/openhands.json +20 -2
- package/build/locales/de/openhands.json +20 -2
- package/build/locales/en/openhands.json +20 -2
- package/build/locales/es/openhands.json +20 -2
- package/build/locales/fr/openhands.json +20 -2
- package/build/locales/it/openhands.json +20 -2
- package/build/locales/ja/openhands.json +20 -2
- package/build/locales/ko-KR/openhands.json +20 -2
- package/build/locales/no/openhands.json +20 -2
- package/build/locales/pt/openhands.json +20 -2
- package/build/locales/tr/openhands.json +20 -2
- package/build/locales/uk/openhands.json +20 -2
- package/build/locales/zh-CN/openhands.json +20 -2
- package/build/locales/zh-TW/openhands.json +20 -2
- package/dist/api/acp-service/acp-service.api.d.ts +18 -0
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.js +54 -55
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-client-options.cjs +1 -1
- package/dist/api/agent-server-client-options.cjs.map +1 -1
- package/dist/api/agent-server-client-options.d.ts +4 -0
- package/dist/api/agent-server-client-options.js +18 -12
- package/dist/api/agent-server-client-options.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.d.ts +1 -1
- package/dist/api/agent-server-compatibility.js +30 -25
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +15 -48
- package/dist/api/agent-server-config.js +25 -69
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/backend-registry/active-store.cjs +1 -1
- package/dist/api/backend-registry/active-store.cjs.map +1 -1
- package/dist/api/backend-registry/active-store.d.ts +11 -5
- package/dist/api/backend-registry/active-store.js +36 -27
- package/dist/api/backend-registry/active-store.js.map +1 -1
- package/dist/api/backend-registry/auth.cjs +1 -1
- package/dist/api/backend-registry/auth.cjs.map +1 -1
- package/dist/api/backend-registry/auth.js +3 -9
- package/dist/api/backend-registry/auth.js.map +1 -1
- package/dist/api/backend-registry/default-backend.cjs +1 -1
- package/dist/api/backend-registry/default-backend.cjs.map +1 -1
- package/dist/api/backend-registry/default-backend.d.ts +9 -16
- package/dist/api/backend-registry/default-backend.js +5 -4
- package/dist/api/backend-registry/default-backend.js.map +1 -1
- package/dist/api/backend-registry/storage.cjs +1 -1
- package/dist/api/backend-registry/storage.cjs.map +1 -1
- package/dist/api/backend-registry/storage.js +67 -34
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +8 -13
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +1 -2
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/proxy.cjs +1 -1
- package/dist/api/cloud/proxy.cjs.map +1 -1
- package/dist/api/cloud/proxy.d.ts +6 -6
- package/dist/api/cloud/proxy.js +33 -24
- package/dist/api/cloud/proxy.js.map +1 -1
- package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
- package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
- package/dist/api/cloud/sandbox-service.api.js.map +1 -1
- package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
- package/dist/api/cloud/secrets-service.api.d.ts +3 -4
- package/dist/api/cloud/secrets-service.api.js.map +1 -1
- package/dist/api/cloud/settings-service.api.cjs +1 -1
- package/dist/api/cloud/settings-service.api.cjs.map +1 -1
- package/dist/api/cloud/settings-service.api.js +5 -1
- package/dist/api/cloud/settings-service.api.js.map +1 -1
- package/dist/api/cloud/skills-service.api.cjs.map +1 -1
- package/dist/api/cloud/skills-service.api.d.ts +5 -5
- package/dist/api/cloud/skills-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/device-flow-client.cjs +1 -1
- package/dist/api/device-flow-client.cjs.map +1 -1
- package/dist/api/device-flow-client.d.ts +3 -5
- package/dist/api/device-flow-client.js +55 -66
- package/dist/api/device-flow-client.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.cjs.map +1 -1
- package/dist/api/event-service/event-service.api.d.ts +3 -3
- package/dist/api/event-service/event-service.api.js +17 -17
- package/dist/api/event-service/event-service.api.js.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +11 -11
- package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
- package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
- 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.d.ts +1 -0
- package/dist/components/features/backends/backend-form-modal.js +203 -140
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +117 -105
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/backend-status-dot.cjs +1 -1
- package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
- package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
- package/dist/components/features/backends/backend-status-dot.js +1 -1
- package/dist/components/features/backends/backend-status-dot.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +81 -70
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
- package/dist/components/features/chat/change-agent-button.js +59 -57
- package/dist/components/features/chat/change-agent-button.js.map +1 -1
- package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
- package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
- package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
- package/dist/components/features/chat/change-agent-context-menu.js +30 -25
- package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
- package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
- package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
- package/dist/components/features/chat/chat-add-file-button.js +39 -38
- package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +185 -57
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.js +113 -113
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.js +52 -51
- package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
- package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
- package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
- package/dist/components/features/chat/components/slash-command-menu.js +38 -34
- package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-push-button.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 +63 -62
- package/dist/components/features/chat/git-control-bar.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 +27 -23
- package/dist/components/features/chat/pending-user-messages.js.map +1 -1
- package/dist/components/features/chat/switch-profile-button.cjs +1 -1
- package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
- package/dist/components/features/chat/switch-profile-button.js +26 -25
- package/dist/components/features/chat/switch-profile-button.js.map +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
- package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
- package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
- package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
- package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
- package/dist/components/features/controls/agent-status.cjs +1 -1
- package/dist/components/features/controls/agent-status.js +12 -12
- package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
- package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
- package/dist/components/features/controls/git-tools-submenu.js +1 -1
- package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
- package/dist/components/features/controls/macros-submenu.cjs +1 -1
- package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
- package/dist/components/features/controls/macros-submenu.js +1 -1
- package/dist/components/features/controls/macros-submenu.js.map +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
- package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu.js +4 -4
- package/dist/components/features/controls/server-status.cjs +1 -1
- package/dist/components/features/controls/server-status.js +7 -7
- package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
- package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +9 -9
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
- package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +45 -42
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
- package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.js +20 -16
- package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
- package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
- package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
- package/dist/components/features/mcp-page/index.cjs +1 -1
- package/dist/components/features/mcp-page/index.d.ts +1 -0
- package/dist/components/features/mcp-page/index.js +1 -0
- package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.js +141 -121
- package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
- package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
- package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
- package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
- package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
- package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +5 -0
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
- package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +1 -1
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
- package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
- package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
- package/dist/components/shared/buttons/back-nav-button.js +33 -0
- package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
- package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.js +17 -16
- package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
- package/dist/components/shared/text-shimmer.cjs +2 -0
- package/dist/components/shared/text-shimmer.cjs.map +1 -0
- package/dist/components/shared/text-shimmer.d.ts +11 -0
- package/dist/components/shared/text-shimmer.js +43 -0
- package/dist/components/shared/text-shimmer.js.map +1 -0
- package/dist/constants/acp-providers.cjs +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +16 -3
- package/dist/constants/acp-providers.js +0 -1
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/contexts/active-backend-context.cjs +1 -1
- package/dist/contexts/active-backend-context.cjs.map +1 -1
- package/dist/contexts/active-backend-context.js +32 -32
- package/dist/contexts/active-backend-context.js.map +1 -1
- package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
- package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
- package/dist/hooks/chat/use-chat-input-logic.js +13 -6
- package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
- package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
- package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
- package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
- package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
- package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
- package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
- package/dist/hooks/query/use-agent-settings-schema.js +26 -16
- package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.d.ts +2 -0
- package/dist/hooks/query/use-backends-health.js +31 -21
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +15 -14
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-settings.cjs +1 -1
- package/dist/hooks/query/use-settings.cjs.map +1 -1
- package/dist/hooks/query/use-settings.js +65 -52
- package/dist/hooks/query/use-settings.js.map +1 -1
- package/dist/hooks/query/use-user-conversation.cjs +1 -1
- package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
- package/dist/hooks/query/use-user-conversation.js +20 -11
- package/dist/hooks/query/use-user-conversation.js.map +1 -1
- package/dist/hooks/use-agent-state.cjs +1 -1
- package/dist/hooks/use-agent-state.js +13 -13
- package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
- package/dist/hooks/use-conversation-name-context-menu.js +10 -10
- package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
- package/dist/hooks/use-llm-configured.d.ts +25 -0
- package/dist/hooks/use-runtime-is-ready.cjs +1 -1
- package/dist/hooks/use-runtime-is-ready.js +5 -5
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +19 -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 +321 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/stop-circle.cjs +1 -1
- package/dist/icons/stop-circle.cjs.map +1 -1
- package/dist/icons/stop-circle.js +7 -10
- package/dist/icons/stop-circle.js.map +1 -1
- package/dist/locales/ar/openhands.json +20 -2
- package/dist/locales/ca/openhands.json +20 -2
- package/dist/locales/de/openhands.json +20 -2
- package/dist/locales/en/openhands.json +20 -2
- package/dist/locales/es/openhands.json +20 -2
- package/dist/locales/fr/openhands.json +20 -2
- package/dist/locales/it/openhands.json +20 -2
- package/dist/locales/ja/openhands.json +20 -2
- package/dist/locales/ko-KR/openhands.json +20 -2
- package/dist/locales/no/openhands.json +20 -2
- package/dist/locales/pt/openhands.json +20 -2
- package/dist/locales/tr/openhands.json +20 -2
- package/dist/locales/uk/openhands.json +20 -2
- package/dist/locales/zh-CN/openhands.json +20 -2
- package/dist/locales/zh-TW/openhands.json +20 -2
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/conversation.cjs +1 -1
- package/dist/routes/conversation.cjs.map +1 -1
- package/dist/routes/conversation.js +1 -1
- package/dist/routes/conversation.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.js +55 -54
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/secrets-settings.cjs +1 -1
- package/dist/routes/secrets-settings.cjs.map +1 -1
- package/dist/routes/secrets-settings.js +19 -27
- package/dist/routes/secrets-settings.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +4 -0
- package/dist/stores/conversation-store.js +6 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
- package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
- package/dist/types/automation.d.ts +15 -0
- package/dist/types/settings.d.ts +3 -1
- package/dist/ui/combobox-caret.cjs +1 -1
- package/dist/ui/combobox-caret.cjs.map +1 -1
- package/dist/ui/combobox-caret.d.ts +1 -1
- package/dist/ui/combobox-caret.js +9 -8
- package/dist/ui/combobox-caret.js.map +1 -1
- package/dist/ui/context-menu.cjs +1 -1
- package/dist/ui/context-menu.cjs.map +1 -1
- package/dist/ui/context-menu.js +9 -8
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
- package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
- package/dist/ui/dropdown/dropdown-menu.js +21 -17
- package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
- package/dist/ui/dropdown/dropdown.cjs +1 -1
- package/dist/ui/dropdown/dropdown.cjs.map +1 -1
- package/dist/ui/dropdown/dropdown.js +2 -2
- package/dist/ui/dropdown/dropdown.js.map +1 -1
- package/dist/utils/automation-schedule.d.ts +1 -0
- package/dist/utils/dropdown-classes.cjs +2 -0
- package/dist/utils/dropdown-classes.cjs.map +1 -0
- package/dist/utils/dropdown-classes.d.ts +32 -0
- package/dist/utils/dropdown-classes.js +8 -0
- package/dist/utils/dropdown-classes.js.map +1 -0
- package/dist/utils/form-control-classes.cjs +1 -1
- package/dist/utils/form-control-classes.cjs.map +1 -1
- package/dist/utils/form-control-classes.d.ts +18 -2
- package/dist/utils/form-control-classes.js +4 -3
- package/dist/utils/form-control-classes.js.map +1 -1
- package/dist/utils/git-control-bar-classes.cjs +2 -0
- package/dist/utils/git-control-bar-classes.cjs.map +1 -0
- package/dist/utils/git-control-bar-classes.d.ts +4 -0
- package/dist/utils/git-control-bar-classes.js +14 -0
- package/dist/utils/git-control-bar-classes.js.map +1 -0
- package/dist/utils/handle-event-for-ui.cjs.map +1 -1
- package/dist/utils/handle-event-for-ui.d.ts +6 -3
- package/dist/utils/handle-event-for-ui.js.map +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
- package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
- package/dist/utils/modal-classes.cjs +2 -0
- package/dist/utils/modal-classes.cjs.map +1 -0
- package/dist/utils/modal-classes.d.ts +8 -0
- package/dist/utils/modal-classes.js +7 -0
- package/dist/utils/modal-classes.js.map +1 -0
- package/dist/utils/openhands-llm.cjs +2 -0
- package/dist/utils/openhands-llm.cjs.map +1 -0
- package/dist/utils/openhands-llm.d.ts +2 -0
- package/dist/utils/openhands-llm.js +9 -0
- package/dist/utils/openhands-llm.js.map +1 -0
- package/dist/utils/redact-custom-secrets.cjs +2 -0
- package/dist/utils/redact-custom-secrets.cjs.map +1 -0
- package/dist/utils/redact-custom-secrets.d.ts +6 -0
- package/dist/utils/redact-custom-secrets.js +10 -0
- package/dist/utils/redact-custom-secrets.js.map +1 -0
- package/dist/utils/status.cjs +1 -1
- package/dist/utils/status.cjs.map +1 -1
- package/dist/utils/status.d.ts +2 -1
- package/dist/utils/status.js +9 -8
- package/dist/utils/status.js.map +1 -1
- package/dist/utils/system-message-adapter.cjs +1 -1
- package/dist/utils/system-message-adapter.cjs.map +1 -1
- package/dist/utils/system-message-adapter.js +10 -7
- package/dist/utils/system-message-adapter.js.map +1 -1
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.ts +2 -1
- package/dist/utils/utils.js +21 -20
- package/dist/utils/utils.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev-safe.mjs +3 -1
- package/scripts/dev-static.mjs +2 -2
- package/scripts/dev-with-automation.mjs +283 -108
- package/scripts/static-build.mjs +20 -19
- package/scripts/static-server.mjs +65 -6
- package/build/assets/acp-providers-CbiRekh9.js +0 -1
- package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
- package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
- package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
- package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
- package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
- package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
- package/build/assets/automation-detail-DJvbVSYK.js +0 -1
- package/build/assets/automations-list-6FDbI5dc.js +0 -1
- package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
- package/build/assets/base-modal-_dYTw1ri.js +0 -1
- package/build/assets/brand-button-Br7f0kZJ.js +0 -1
- package/build/assets/browser-store-Couc4S5D.js +0 -1
- package/build/assets/clock-BRjCgHTc.js +0 -1
- package/build/assets/combobox-caret-to1O8irE.js +0 -1
- package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
- package/build/assets/conversation-DVrKU0oz.js +0 -19
- package/build/assets/conversation-Dlys-D5A.js +0 -1
- package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
- package/build/assets/conversation-service.api-CCfztilW.js +0 -1
- package/build/assets/conversation-state-store-u5jepov0.js +0 -1
- package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
- package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
- package/build/assets/declaration-BNMqORFE.js +0 -1
- package/build/assets/dist-BxBP7tFD.js +0 -1
- package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
- package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
- package/build/assets/entry.client-1VMHpktY.js +0 -2
- package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
- package/build/assets/extensions-hub-C651jsVh.js +0 -1
- package/build/assets/files-tab-R5z0lLdY.js +0 -1
- package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
- package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
- package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
- package/build/assets/home-e-egNUXZ.js +0 -1
- package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
- package/build/assets/launch-CshDse3e.js +0 -1
- package/build/assets/link-external-D2POYx4c.js +0 -1
- package/build/assets/llm-settings-Bql-vydt.js +0 -1
- package/build/assets/llm-settings-C_tal6Ds.js +0 -1
- package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
- package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
- package/build/assets/manifest-3bf30d69.js +0 -1
- package/build/assets/mcp-ByeBfdfU.js +0 -9
- package/build/assets/messages-D0rWot7s.js +0 -36
- package/build/assets/proxy-CxydCnis.js +0 -1
- package/build/assets/root-DHeCXo9N.css +0 -1
- package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
- package/build/assets/secrets-service-BsnKFc2x.js +0 -1
- package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
- package/build/assets/settings-client-C73C7IgV.js +0 -1
- package/build/assets/settings-index-Dz0BmdJD.js +0 -1
- package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
- package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
- package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
- package/build/assets/skills-settings-DlA5hlXw.js +0 -2
- package/build/assets/status-hp6M6E7E.js +0 -1
- package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
- package/build/assets/use-is-authed-BggE5wPj.js +0 -1
- package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
- package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
- package/build/assets/use-settings-DQIZmIov.js +0 -1
- package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
- package/build/assets/utils-i18rdUj2.js +0 -1
- package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
- package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
- /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
- /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
- /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
- /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
- /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
- /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
- /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
- /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
- /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
- /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
- /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
- /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
- /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
- /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
- /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
- /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
- /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
- /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
- /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
- /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
- /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
- /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
- /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
|
@@ -3,32 +3,33 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
|
|
|
3
3
|
import { cn as n, getGitPullPrompt as r } from "../../../utils/utils.js";
|
|
4
4
|
import { useTracking as i } from "../../../hooks/use-tracking.js";
|
|
5
5
|
import a from "../../../icons/u-arrow-down.js";
|
|
6
|
-
import {
|
|
6
|
+
import { gitControlBarActionButtonClassName as o, gitControlBarActionIconColor as s, gitControlBarActionLabelClassName as c } from "../../../utils/git-control-bar-classes.js";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
8
|
//#region src/components/features/chat/git-control-bar-pull-button.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
10
|
-
return /* @__PURE__ */
|
|
9
|
+
function d({ onSuggestionsClick: d, hasRepository: f, providerTokensReady: p, isConversationReady: m = !0 }) {
|
|
10
|
+
let { t: h } = e("openhands"), { trackPullButtonClick: g } = i(), _ = p && f && m;
|
|
11
|
+
return /* @__PURE__ */ u("button", {
|
|
11
12
|
type: "button",
|
|
12
13
|
onClick: () => {
|
|
13
|
-
|
|
14
|
+
g(), d(r());
|
|
14
15
|
},
|
|
15
|
-
disabled: !
|
|
16
|
-
className: n("
|
|
17
|
-
children: [/* @__PURE__ */
|
|
16
|
+
disabled: !_,
|
|
17
|
+
className: n(o(_), "px-0.5 py-1 w-[76px] min-w-[76px]"),
|
|
18
|
+
children: [/* @__PURE__ */ l("div", {
|
|
18
19
|
className: "w-3 h-3 flex items-center justify-center",
|
|
19
|
-
children: /* @__PURE__ */
|
|
20
|
+
children: /* @__PURE__ */ l(a, {
|
|
20
21
|
width: 12,
|
|
21
22
|
height: 12,
|
|
22
|
-
color:
|
|
23
|
+
color: s(_)
|
|
23
24
|
})
|
|
24
|
-
}), /* @__PURE__ */
|
|
25
|
-
className: "
|
|
26
|
-
title:
|
|
27
|
-
children:
|
|
25
|
+
}), /* @__PURE__ */ l("div", {
|
|
26
|
+
className: n(c, "max-w-[76px]"),
|
|
27
|
+
title: h(t.COMMON$PULL),
|
|
28
|
+
children: h(t.COMMON$PULL)
|
|
28
29
|
})]
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
32
|
//#endregion
|
|
32
|
-
export {
|
|
33
|
+
export { d as GitControlBarPullButton };
|
|
33
34
|
|
|
34
35
|
//# sourceMappingURL=git-control-bar-pull-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-control-bar-pull-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-pull-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowDownIcon from \"#/icons/u-arrow-down.svg?react\";\nimport { cn, getGitPullPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPullButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPullButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n isConversationReady = true,\n}: GitControlBarPullButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPullButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePullClick = () => {\n trackPullButtonClick();\n onSuggestionsClick(getGitPullPrompt());\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePullClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"
|
|
1
|
+
{"version":3,"file":"git-control-bar-pull-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-pull-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowDownIcon from \"#/icons/u-arrow-down.svg?react\";\nimport { cn, getGitPullPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPullButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPullButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n isConversationReady = true,\n}: GitControlBarPullButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPullButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePullClick = () => {\n trackPullButtonClick();\n onSuggestionsClick(getGitPullPrompt());\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePullClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-0.5 py-1 w-[76px] min-w-[76px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowDownIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[76px]\")}\n title={t(I18nKey.COMMON$PULL)}\n >\n {t(I18nKey.COMMON$PULL)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,GAAkB,CAAC;;EAOpC,UAAU,CAAC;EACX,WAAW,EACT,EAAmC,EAAgB,EACnD,oCACD;YAPH,CASE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,OAAO,EAA6B,EAAgB;IACpD,CAAA;GACE,CAAA,EACN,kBAAC,OAAD;GACE,WAAW,EAAG,GAAmC,eAAe;GAChE,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../hooks/use-tracking.cjs`),i=require(`../../../icons/u-arrow-up.cjs`);let
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../hooks/use-tracking.cjs`),i=require(`../../../icons/u-arrow-up.cjs`),a=require(`../../../utils/git-control-bar-classes.cjs`);let o=require(`react/jsx-runtime`);function s({onSuggestionsClick:s,hasRepository:c,providerTokensReady:l,currentGitProvider:u,isConversationReady:d=!0}){let{t:f}=e.useTranslation(`openhands`),{trackPushButtonClick:p}=r.useTracking(),m=l&&c&&d;return(0,o.jsxs)(`button`,{type:`button`,onClick:()=>{p(),s(n.getGitPushPrompt(u))},disabled:!m,className:n.cn(a.gitControlBarActionButtonClassName(m),`px-2 py-1 w-[77px] min-w-[77px]`),children:[(0,o.jsx)(`div`,{className:`w-3 h-3 flex items-center justify-center`,children:(0,o.jsx)(i.default,{width:12,height:12,color:a.gitControlBarActionIconColor(m)})}),(0,o.jsx)(`div`,{className:n.cn(a.gitControlBarActionLabelClassName,`max-w-[77px]`),title:f(t.I18nKey.COMMON$PUSH),children:f(t.I18nKey.COMMON$PUSH)})]})}exports.GitControlBarPushButton=s;
|
|
2
2
|
//# sourceMappingURL=git-control-bar-push-button.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-control-bar-push-button.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"
|
|
1
|
+
{"version":3,"file":"git-control-bar-push-button.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-2 py-1 w-[77px] min-w-[77px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[77px]\")}\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":"yYAoBA,SAAgB,EAAwB,CACtC,qBACA,gBACA,sBACA,qBACA,sBAAsB,IACS,CAC/B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,wBAAyB,EAAA,aAAa,CAExC,EACJ,GAAuB,GAAiB,EAO1C,OACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,YAR0B,CAC5B,GAAsB,CACtB,EAAmB,EAAA,iBAAiB,EAAmB,CAAC,EAOtD,SAAU,CAAC,EACX,UAAW,EAAA,GACT,EAAA,mCAAmC,EAAgB,CACnD,kCACD,UAPH,EASE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qDACb,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,MAAO,GACP,OAAQ,GACR,MAAO,EAAA,6BAA6B,EAAgB,CACpD,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,GAAG,EAAA,kCAAmC,eAAe,CAChE,MAAO,EAAE,EAAA,QAAQ,YAAY,UAE5B,EAAE,EAAA,QAAQ,YAAY,CACnB,CAAA,CACC"}
|
|
@@ -3,32 +3,33 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
|
|
|
3
3
|
import { cn as n, getGitPushPrompt as r } from "../../../utils/utils.js";
|
|
4
4
|
import { useTracking as i } from "../../../hooks/use-tracking.js";
|
|
5
5
|
import a from "../../../icons/u-arrow-up.js";
|
|
6
|
-
import {
|
|
6
|
+
import { gitControlBarActionButtonClassName as o, gitControlBarActionIconColor as s, gitControlBarActionLabelClassName as c } from "../../../utils/git-control-bar-classes.js";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
8
|
//#region src/components/features/chat/git-control-bar-push-button.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
10
|
-
return /* @__PURE__ */
|
|
9
|
+
function d({ onSuggestionsClick: d, hasRepository: f, providerTokensReady: p, currentGitProvider: m, isConversationReady: h = !0 }) {
|
|
10
|
+
let { t: g } = e("openhands"), { trackPushButtonClick: _ } = i(), v = p && f && h;
|
|
11
|
+
return /* @__PURE__ */ u("button", {
|
|
11
12
|
type: "button",
|
|
12
13
|
onClick: () => {
|
|
13
|
-
|
|
14
|
+
_(), d(r(m));
|
|
14
15
|
},
|
|
15
|
-
disabled: !
|
|
16
|
-
className: n("
|
|
17
|
-
children: [/* @__PURE__ */
|
|
16
|
+
disabled: !v,
|
|
17
|
+
className: n(o(v), "px-2 py-1 w-[77px] min-w-[77px]"),
|
|
18
|
+
children: [/* @__PURE__ */ l("div", {
|
|
18
19
|
className: "w-3 h-3 flex items-center justify-center",
|
|
19
|
-
children: /* @__PURE__ */
|
|
20
|
+
children: /* @__PURE__ */ l(a, {
|
|
20
21
|
width: 12,
|
|
21
22
|
height: 12,
|
|
22
|
-
color:
|
|
23
|
+
color: s(v)
|
|
23
24
|
})
|
|
24
|
-
}), /* @__PURE__ */
|
|
25
|
-
className: "
|
|
26
|
-
title:
|
|
27
|
-
children:
|
|
25
|
+
}), /* @__PURE__ */ l("div", {
|
|
26
|
+
className: n(c, "max-w-[77px]"),
|
|
27
|
+
title: g(t.COMMON$PUSH),
|
|
28
|
+
children: g(t.COMMON$PUSH)
|
|
28
29
|
})]
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
32
|
//#endregion
|
|
32
|
-
export {
|
|
33
|
+
export { d as GitControlBarPushButton };
|
|
33
34
|
|
|
34
35
|
//# sourceMappingURL=git-control-bar-push-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-control-bar-push-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"
|
|
1
|
+
{"version":3,"file":"git-control-bar-push-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-2 py-1 w-[77px] min-w-[77px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[77px]\")}\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,uBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,EAAiB,EAAmB,CAAC;;EAOtD,UAAU,CAAC;EACX,WAAW,EACT,EAAmC,EAAgB,EACnD,kCACD;YAPH,CASE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,OAAO,EAA6B,EAAgB;IACpD,CAAA;GACE,CAAA,EACN,kBAAC,OAAD;GACE,WAAW,EAAG,GAAmC,eAAe;GAChE,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../contexts/active-backend-context.cjs`),i=require(`../../../utils/custom-toast-handlers.cjs`),a=require(`../../../stores/optimistic-user-message-store.cjs`),o=require(`../../../api/conversation-metadata-store.cjs`),s=require(`../../../hooks/use-send-message.cjs`),
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../contexts/active-backend-context.cjs`),i=require(`../../../utils/custom-toast-handlers.cjs`),a=require(`../../../stores/optimistic-user-message-store.cjs`),o=require(`../../../api/conversation-metadata-store.cjs`),s=require(`../../../contexts/conversation-websocket-context.cjs`),c=require(`../../../hooks/use-send-message.cjs`),ee=require(`../../../hooks/query/use-active-conversation.cjs`),te=require(`../../../hooks/query/use-task-polling.cjs`),ne=require(`../../../hooks/use-unified-websocket-status.cjs`),l=require(`../../../hooks/mutation/use-create-conversation.cjs`),u=require(`../../../hooks/use-user-providers.cjs`),d=require(`./git-control-bar-repo-button.cjs`),f=require(`./git-control-bar-branch-button.cjs`),p=require(`./git-control-bar-pull-button.cjs`),m=require(`./git-control-bar-push-button.cjs`),h=require(`./git-control-bar-pr-button.cjs`),re=require(`../../../hooks/query/use-local-git-info.cjs`),ie=require(`../../../hooks/mutation/use-update-conversation-repository.cjs`),g=require(`./git-control-bar-tooltip-wrapper.cjs`),ae=require(`../../../stores/home-store.cjs`),oe=require(`./open-repository-modal.cjs`),se=require(`../../../context/scroll-context.cjs`);let _=require(`react`),v=require(`react/jsx-runtime`);function y({onSuggestionsClick:y}){let{t:b}=e.useTranslation(`openhands`),{conversationId:x}=n.useConversationId(),[S,C]=(0,_.useState)(!1),[w,T]=(0,_.useState)(!1),E=(0,_.useRef)(null),{addRecentRepository:D}=ae.useHomeStore(),O=a.useOptimisticUserMessageStore(e=>e.enqueuePendingMessage),k=a.useOptimisticUserMessageStore(e=>e.markPendingMessageError),{backend:A}=r.useActiveBackend(),j=A.kind===`local`,{providers:M}=u.useUserProviders(),N=j||M.length>0,{data:P}=ee.useActiveConversation(),{repositoryInfo:F}=te.useTaskPolling(),{data:I}=re.useLocalGitInfo(),L=ne.useUnifiedWebSocketStatus(),R=s.useConversationWebSocket()?.isLoadingHistory??!1,z=(0,_.useRef)(L);(0,_.useEffect)(()=>{z.current=L},[L]);let{send:B}=c.useSendMessage(),V=(0,_.useRef)(B);(0,_.useEffect)(()=>{V.current=B},[B]);let ce=se.useOptionalScrollContext(),{mutate:H}=ie.useUpdateConversationRepository(),{mutate:le,isPending:ue}=l.useCreateConversation(),U=P?.selected_repository||F?.selectedRepository,W=P?.git_provider||F?.gitProvider,G=P?.selected_branch||F?.selectedBranch,K=U||I?.repository||void 0,q=W||I?.provider,J=G||I?.branch||void 0,Y=(P?.id?o.getStoredConversationMetadata(P.id):null)?.selected_workspace??null,X=Y&&Y.replace(/\/+$/,``).split(`/`).pop()||null,Z=!!K&&!!q,Q=!!P&&L===`OPEN`&&!R;(0,_.useEffect)(()=>{if(!w)return;let e=e=>{E.current&&!E.current.contains(e.target)&&T(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[w]),(0,_.useEffect)(()=>{if(!w)return;let e=e=>{e.key===`Escape`&&T(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[w]);let de=(e,n)=>{x&&(D(e),H({conversationId:x,repository:e.full_name,branch:n.name,gitProvider:e.git_provider},{onSuccess:()=>{if(z.current!==`OPEN`){i.displayErrorToast(b(t.I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));return}let r=e.git_provider.charAt(0).toUpperCase()+e.git_provider.slice(1),a=`Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`,o=x?O({conversationId:x,text:a}):null;ce?.scrollDomToBottom(),Promise.resolve(V.current({action:`message`,args:{content:a,timestamp:new Date().toISOString()}})).catch(e=>{o&&k(o,e instanceof Error?e.message:`Failed to send message`)})}}))},$=!j||!!K||!!X,fe=j&&!Z;return $||J||Z?(0,v.jsxs)(`div`,{className:`flex flex-row items-center`,children:[(0,v.jsxs)(`div`,{className:`flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide`,children:[$?(0,v.jsx)(d.GitControlBarRepoButton,{selectedRepository:K,gitProvider:q,workspaceName:X,onClick:()=>C(!0),disabled:!Q||fe}):null,J?(0,v.jsx)(f.GitControlBarBranchButton,{selectedBranch:J,selectedRepository:K,gitProvider:q}):null,Z?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pull-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(p.GitControlBarPullButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,isConversationReady:Q})}),(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-push-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(m.GitControlBarPushButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})}),(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pr-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(h.GitControlBarPrButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})})]}):null]}),(0,v.jsx)(oe.OpenRepositoryModal,{isOpen:S,onClose:()=>C(!1),onLaunch:de,defaultProvider:q})]}):null}exports.GitControlBar=y;
|
|
2
2
|
//# sourceMappingURL=git-control-bar.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-control-bar.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists and WS is connected\n const isConversationReady = !!conversation && webSocketStatus === \"OPEN\";\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-control-bar.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useConversationWebSocket } from \"#/contexts/conversation-websocket-context\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const conversationWebSocket = useConversationWebSocket();\n const isLoadingHistory = conversationWebSocket?.isLoadingHistory ?? false;\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists, WS is connected, and the\n // initial history preload has finished (matches chat-interface loading gate).\n const isConversationReady =\n !!conversation && webSocketStatus === \"OPEN\" && !isLoadingHistory;\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,137 +2,138 @@ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es
|
|
|
2
2
|
import { I18nKey as t } from "../../../i18n/declaration.js";
|
|
3
3
|
import { useConversationId as n } from "../../../hooks/use-conversation-id.js";
|
|
4
4
|
import { useActiveBackend as r } from "../../../contexts/active-backend-context.js";
|
|
5
|
-
import { displayErrorToast as
|
|
6
|
-
import { useOptimisticUserMessageStore as
|
|
7
|
-
import { getStoredConversationMetadata as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
5
|
+
import { displayErrorToast as i } from "../../../utils/custom-toast-handlers.js";
|
|
6
|
+
import { useOptimisticUserMessageStore as a } from "../../../stores/optimistic-user-message-store.js";
|
|
7
|
+
import { getStoredConversationMetadata as o } from "../../../api/conversation-metadata-store.js";
|
|
8
|
+
import { useConversationWebSocket as s } from "../../../contexts/conversation-websocket-context.js";
|
|
9
|
+
import { useSendMessage as c } from "../../../hooks/use-send-message.js";
|
|
10
|
+
import { useActiveConversation as ee } from "../../../hooks/query/use-active-conversation.js";
|
|
11
|
+
import { useTaskPolling as te } from "../../../hooks/query/use-task-polling.js";
|
|
12
|
+
import { useUnifiedWebSocketStatus as ne } from "../../../hooks/use-unified-websocket-status.js";
|
|
13
|
+
import { useCreateConversation as re } from "../../../hooks/mutation/use-create-conversation.js";
|
|
14
|
+
import { useUserProviders as ie } from "../../../hooks/use-user-providers.js";
|
|
15
|
+
import { GitControlBarRepoButton as ae } from "./git-control-bar-repo-button.js";
|
|
16
|
+
import { GitControlBarBranchButton as oe } from "./git-control-bar-branch-button.js";
|
|
17
|
+
import { GitControlBarPullButton as se } from "./git-control-bar-pull-button.js";
|
|
18
|
+
import { GitControlBarPushButton as l } from "./git-control-bar-push-button.js";
|
|
19
|
+
import { GitControlBarPrButton as u } from "./git-control-bar-pr-button.js";
|
|
20
|
+
import { useLocalGitInfo as d } from "../../../hooks/query/use-local-git-info.js";
|
|
21
|
+
import { useUpdateConversationRepository as f } from "../../../hooks/mutation/use-update-conversation-repository.js";
|
|
22
|
+
import { GitControlBarTooltipWrapper as p } from "./git-control-bar-tooltip-wrapper.js";
|
|
23
|
+
import { useHomeStore as m } from "../../../stores/home-store.js";
|
|
24
|
+
import { OpenRepositoryModal as h } from "./open-repository-modal.js";
|
|
25
|
+
import { useOptionalScrollContext as g } from "../../../context/scroll-context.js";
|
|
26
|
+
import { useEffect as _, useRef as v, useState as y } from "react";
|
|
27
|
+
import { Fragment as ce, jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
27
28
|
//#region src/components/features/chat/git-control-bar.tsx
|
|
28
29
|
function S({ onSuggestionsClick: S }) {
|
|
29
|
-
let { t: C } = e("openhands"), { conversationId: w } = n(), [
|
|
30
|
-
|
|
31
|
-
V.current =
|
|
32
|
-
}, [
|
|
33
|
-
let { send: H } =
|
|
34
|
-
|
|
30
|
+
let { t: C } = e("openhands"), { conversationId: w } = n(), [le, T] = y(!1), [E, D] = y(!1), O = v(null), { addRecentRepository: k } = m(), A = a((e) => e.enqueuePendingMessage), j = a((e) => e.markPendingMessageError), { backend: M } = r(), N = M.kind === "local", { providers: P } = ie(), F = N || P.length > 0, { data: I } = ee(), { repositoryInfo: L } = te(), { data: R } = d(), z = ne(), B = s()?.isLoadingHistory ?? !1, V = v(z);
|
|
31
|
+
_(() => {
|
|
32
|
+
V.current = z;
|
|
33
|
+
}, [z]);
|
|
34
|
+
let { send: H } = c(), U = v(H);
|
|
35
|
+
_(() => {
|
|
35
36
|
U.current = H;
|
|
36
37
|
}, [H]);
|
|
37
|
-
let W =
|
|
38
|
-
|
|
39
|
-
if (!
|
|
38
|
+
let W = g(), { mutate: ue } = f(), { mutate: de, isPending: fe } = re(), pe = I?.selected_repository || L?.selectedRepository, me = I?.git_provider || L?.gitProvider, G = I?.selected_branch || L?.selectedBranch, K = pe || R?.repository || void 0, q = me || R?.provider, J = G || R?.branch || void 0, Y = (I?.id ? o(I.id) : null)?.selected_workspace ?? null, X = Y && Y.replace(/\/+$/, "").split("/").pop() || null, Z = !!K && !!q, Q = !!I && z === "OPEN" && !B;
|
|
39
|
+
_(() => {
|
|
40
|
+
if (!E) return;
|
|
40
41
|
let e = (e) => {
|
|
41
|
-
|
|
42
|
+
O.current && !O.current.contains(e.target) && D(!1);
|
|
42
43
|
};
|
|
43
44
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
44
|
-
}, [
|
|
45
|
-
if (!
|
|
45
|
+
}, [E]), _(() => {
|
|
46
|
+
if (!E) return;
|
|
46
47
|
let e = (e) => {
|
|
47
|
-
e.key === "Escape" &&
|
|
48
|
+
e.key === "Escape" && D(!1);
|
|
48
49
|
};
|
|
49
50
|
return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
|
|
50
|
-
}, [
|
|
51
|
-
let
|
|
52
|
-
w && (
|
|
51
|
+
}, [E]);
|
|
52
|
+
let he = (e, n) => {
|
|
53
|
+
w && (k(e), ue({
|
|
53
54
|
conversationId: w,
|
|
54
55
|
repository: e.full_name,
|
|
55
56
|
branch: n.name,
|
|
56
57
|
gitProvider: e.git_provider
|
|
57
58
|
}, { onSuccess: () => {
|
|
58
59
|
if (V.current !== "OPEN") {
|
|
59
|
-
|
|
60
|
+
i(C(t.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
|
-
let r = e.git_provider.charAt(0).toUpperCase() + e.git_provider.slice(1),
|
|
63
|
+
let r = e.git_provider.charAt(0).toUpperCase() + e.git_provider.slice(1), a = `Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`, o = w ? A({
|
|
63
64
|
conversationId: w,
|
|
64
|
-
text:
|
|
65
|
+
text: a
|
|
65
66
|
}) : null;
|
|
66
67
|
W?.scrollDomToBottom(), Promise.resolve(U.current({
|
|
67
68
|
action: "message",
|
|
68
69
|
args: {
|
|
69
|
-
content:
|
|
70
|
+
content: a,
|
|
70
71
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
71
72
|
}
|
|
72
73
|
})).catch((e) => {
|
|
73
|
-
|
|
74
|
+
o && j(o, e instanceof Error ? e.message : "Failed to send message");
|
|
74
75
|
});
|
|
75
76
|
} }));
|
|
76
|
-
}, $ = !
|
|
77
|
+
}, $ = !N || !!K || !!X;
|
|
77
78
|
return $ || J || Z ? /* @__PURE__ */ x("div", {
|
|
78
79
|
className: "flex flex-row items-center",
|
|
79
80
|
children: [/* @__PURE__ */ x("div", {
|
|
80
81
|
className: "flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide",
|
|
81
82
|
children: [
|
|
82
|
-
$ ? /* @__PURE__ */ b(
|
|
83
|
+
$ ? /* @__PURE__ */ b(ae, {
|
|
83
84
|
selectedRepository: K,
|
|
84
85
|
gitProvider: q,
|
|
85
86
|
workspaceName: X,
|
|
86
|
-
onClick: () =>
|
|
87
|
-
disabled: !Q ||
|
|
87
|
+
onClick: () => T(!0),
|
|
88
|
+
disabled: !Q || N && !Z
|
|
88
89
|
}) : null,
|
|
89
|
-
J ? /* @__PURE__ */ b(
|
|
90
|
+
J ? /* @__PURE__ */ b(oe, {
|
|
90
91
|
selectedBranch: J,
|
|
91
92
|
selectedRepository: K,
|
|
92
93
|
gitProvider: q
|
|
93
94
|
}) : null,
|
|
94
|
-
Z ? /* @__PURE__ */ x(
|
|
95
|
-
/* @__PURE__ */ b(
|
|
95
|
+
Z ? /* @__PURE__ */ x(ce, { children: [
|
|
96
|
+
/* @__PURE__ */ b(p, {
|
|
96
97
|
tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
|
|
97
98
|
testId: "git-control-bar-pull-button-tooltip",
|
|
98
99
|
shouldShowTooltip: !Z,
|
|
99
|
-
children: /* @__PURE__ */ b(
|
|
100
|
+
children: /* @__PURE__ */ b(se, {
|
|
100
101
|
onSuggestionsClick: S,
|
|
101
102
|
hasRepository: Z,
|
|
102
|
-
providerTokensReady:
|
|
103
|
+
providerTokensReady: F,
|
|
103
104
|
isConversationReady: Q
|
|
104
105
|
})
|
|
105
106
|
}),
|
|
106
|
-
/* @__PURE__ */ b(
|
|
107
|
+
/* @__PURE__ */ b(p, {
|
|
107
108
|
tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
|
|
108
109
|
testId: "git-control-bar-push-button-tooltip",
|
|
109
110
|
shouldShowTooltip: !Z,
|
|
110
|
-
children: /* @__PURE__ */ b(
|
|
111
|
+
children: /* @__PURE__ */ b(l, {
|
|
111
112
|
onSuggestionsClick: S,
|
|
112
113
|
hasRepository: Z,
|
|
113
|
-
providerTokensReady:
|
|
114
|
+
providerTokensReady: F,
|
|
114
115
|
currentGitProvider: q,
|
|
115
116
|
isConversationReady: Q
|
|
116
117
|
})
|
|
117
118
|
}),
|
|
118
|
-
/* @__PURE__ */ b(
|
|
119
|
+
/* @__PURE__ */ b(p, {
|
|
119
120
|
tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
|
|
120
121
|
testId: "git-control-bar-pr-button-tooltip",
|
|
121
122
|
shouldShowTooltip: !Z,
|
|
122
|
-
children: /* @__PURE__ */ b(
|
|
123
|
+
children: /* @__PURE__ */ b(u, {
|
|
123
124
|
onSuggestionsClick: S,
|
|
124
125
|
hasRepository: Z,
|
|
125
|
-
providerTokensReady:
|
|
126
|
+
providerTokensReady: F,
|
|
126
127
|
currentGitProvider: q,
|
|
127
128
|
isConversationReady: Q
|
|
128
129
|
})
|
|
129
130
|
})
|
|
130
131
|
] }) : null
|
|
131
132
|
]
|
|
132
|
-
}), /* @__PURE__ */ b(
|
|
133
|
-
isOpen:
|
|
134
|
-
onClose: () =>
|
|
135
|
-
onLaunch:
|
|
133
|
+
}), /* @__PURE__ */ b(h, {
|
|
134
|
+
isOpen: le,
|
|
135
|
+
onClose: () => T(!1),
|
|
136
|
+
onLaunch: he,
|
|
136
137
|
defaultProvider: q
|
|
137
138
|
})]
|
|
138
139
|
}) : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-control-bar.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists and WS is connected\n const isConversationReady = !!conversation && webSocketStatus === \"OPEN\";\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-control-bar.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useConversationWebSocket } from \"#/contexts/conversation-websocket-context\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const conversationWebSocket = useConversationWebSocket();\n const isLoadingHistory = conversationWebSocket?.isLoadingHistory ?? false;\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists, WS is connected, and the\n // initial history preload has finished (matches chat-interface loading gate).\n const isConversationReady =\n !!conversation && webSocketStatus === \"OPEN\" && !isLoadingHistory;\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../hooks/use-conversation-id.cjs`),n=require(`../../../stores/optimistic-user-message-store.cjs`),
|
|
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;
|
|
2
2
|
//# sourceMappingURL=pending-user-messages.cjs.map
|