@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-panel.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Folder, Plus } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { usePaginatedConversations } from \"#/hooks/query/use-paginated-conversations\";\nimport { useStartTasks } from \"#/hooks/query/use-start-tasks\";\nimport { useDeleteConversation } from \"#/hooks/mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"#/hooks/mutation/use-unified-stop-conversation\";\nimport { ConfirmDeleteModal } from \"./confirm-delete-modal\";\nimport { ConfirmStopModal } from \"./confirm-stop-modal\";\nimport { LoadingSpinner } from \"#/components/shared/loading-spinner\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { ExitConversationModal } from \"./exit-conversation-modal\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { Provider } from \"#/types/settings\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { isExecutionActive } from \"#/utils/status\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { useIsCreatingConversation } from \"#/hooks/use-is-creating-conversation\";\nimport { ConversationCard } from \"./conversation-card/conversation-card\";\nimport { StartTaskCard } from \"./start-task-card/start-task-card\";\nimport { ConversationCardSkeleton } from \"./conversation-card/conversation-card-skeleton\";\nimport { CompactConversationRow } from \"./compact-conversation-row\";\nimport { useConversationPanelPreferencesStore } from \"#/stores/conversation-panel-preferences-store\";\nimport { cn } from \"#/utils/utils\";\nimport { ConversationPanelFilterMenu } from \"./conversation-panel-filter-menu\";\nimport { ConversationPanelNewThreadPicker } from \"./conversation-panel-new-thread-picker\";\nimport {\n groupConversations,\n getGroupConversationPreview,\n sortConversationsByField,\n type ConversationGroupLaunch,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationPanelProps {\n onClose?: () => void;\n /**\n * Render a minimal icon-only variant of each conversation row (used by the\n * collapsed sidebar). Each row is a single status dot with a hover preview\n * containing the full card content.\n */\n compact?: boolean;\n}\n\nconst noop = () => {};\n\nconst ONE_HOUR_MS = 60 * 60 * 1000;\n\nconst partitionByCutoff = <T extends { updated_at: string }>(\n items: readonly T[],\n): { recent: T[]; older: T[] } => {\n // The cutoff is intentionally relative to \"now\" each time the list is\n // recomputed, so conversations naturally age into the older bucket as the\n // conversations query refreshes.\n const cutoff = Date.now() - ONE_HOUR_MS;\n const recent: T[] = [];\n const older: T[] = [];\n for (const item of items) {\n const updatedAt = item.updated_at ? Date.parse(item.updated_at) : NaN;\n // Missing or unparseable timestamps stay in the \"recent\" bucket so we\n // do not accidentally hide them behind the older-conversations toggle.\n if (Number.isFinite(updatedAt) && updatedAt < cutoff) {\n older.push(item);\n } else {\n recent.push(item);\n }\n }\n return { recent, older };\n};\n\nexport function ConversationPanel({\n onClose,\n compact = false,\n}: ConversationPanelProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend: activeBackend } = useActiveBackend();\n // Click-outside is only relevant in the legacy drawer mode where an\n // onClose handler is provided. When the panel is rendered inline (e.g.\n // as the always-visible conversation list pane), clicking outside should\n // not dismiss the list, so we pass a no-op callback in that case.\n const ref = useClickOutsideElement<HTMLDivElement>(onClose ?? noop);\n\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const [\n confirmExitConversationModalVisible,\n setConfirmExitConversationModalVisible,\n ] = React.useState(false);\n const [confirmDeleteAllVisible, setConfirmDeleteAllVisible] =\n React.useState(false);\n const showOlderConversations = useConversationPanelPreferencesStore(\n (state) => state.showOlderConversations,\n );\n const toggleShowOlderConversations = useConversationPanelPreferencesStore(\n (state) => state.toggleShowOlderConversations,\n );\n const showRepoBranchMetadata = useConversationPanelPreferencesStore(\n (state) => state.showRepoBranchMetadata,\n );\n const toggleShowRepoBranchMetadata = useConversationPanelPreferencesStore(\n (state) => state.toggleShowRepoBranchMetadata,\n );\n const showLlmProfiles = useConversationPanelPreferencesStore(\n (state) => state.showLlmProfiles,\n );\n const toggleShowLlmProfiles = useConversationPanelPreferencesStore(\n (state) => state.toggleShowLlmProfiles,\n );\n const organizeMode = useConversationPanelPreferencesStore(\n (state) => state.organizeMode,\n );\n const setOrganizeMode = useConversationPanelPreferencesStore(\n (state) => state.setOrganizeMode,\n );\n const conversationSort = useConversationPanelPreferencesStore(\n (state) => state.conversationSort,\n );\n const setConversationSort = useConversationPanelPreferencesStore(\n (state) => state.setConversationSort,\n );\n const threadScope = useConversationPanelPreferencesStore(\n (state) => state.threadScope,\n );\n const setThreadScope = useConversationPanelPreferencesStore(\n (state) => state.setThreadScope,\n );\n const [filterMenuOpen, setFilterMenuOpen] = React.useState(false);\n const [isListScrolled, setIsListScrolled] = React.useState(false);\n const filterMenuRef = useClickOutsideElement<HTMLDivElement>(() => {\n setFilterMenuOpen(false);\n });\n const [collapsedGroupIds, setCollapsedGroupIds] = React.useState<\n ReadonlySet<string>\n >(() => new Set());\n const [expandedGroupPreviewIds, setExpandedGroupPreviewIds] = React.useState<\n ReadonlySet<string>\n >(() => new Set());\n\n const toggleGroupCollapsed = React.useCallback((groupId: string) => {\n setCollapsedGroupIds((prev) => {\n const next = new Set(prev);\n if (next.has(groupId)) {\n next.delete(groupId);\n } else {\n next.add(groupId);\n }\n return next;\n });\n }, []);\n\n const toggleGroupPreviewExpanded = React.useCallback((groupId: string) => {\n setExpandedGroupPreviewIds((prev) => {\n const next = new Set(prev);\n if (next.has(groupId)) {\n next.delete(groupId);\n } else {\n next.add(groupId);\n }\n return next;\n });\n }, []);\n\n React.useEffect(() => {\n if (organizeMode !== \"grouped\") {\n setCollapsedGroupIds(new Set());\n setExpandedGroupPreviewIds(new Set());\n }\n }, [organizeMode]);\n\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [selectedConversationId, setSelectedConversationId] = React.useState<\n string | null\n >(null);\n const [selectedConversationTitle, setSelectedConversationTitle] =\n React.useState<string | null>(null);\n const [openContextMenuId, setOpenContextMenuId] = React.useState<\n string | null\n >(null);\n\n const {\n data,\n isLoading,\n isFetched,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = usePaginatedConversations();\n\n // Fetch in-progress start tasks\n const { data: startTasks } = useStartTasks();\n\n const conversations = React.useMemo(\n () => data?.pages.flatMap((page) => page.items) ?? [],\n [data],\n );\n\n const scopedConversations = React.useMemo(() => {\n if (threadScope === \"relevant\") {\n return conversations.filter((c) => isExecutionActive(c.execution_status));\n }\n return conversations;\n }, [conversations, threadScope]);\n\n const { recent: recentScoped, older: olderScoped } = React.useMemo(\n () => partitionByCutoff(scopedConversations),\n [scopedConversations],\n );\n\n // Sort the full visible set as one list. The recent/older partition is\n // still computed (it gates the \"Show older\" toggle and \"Load more\"\n // visibility), but the rendering must not use it as a visual boundary —\n // when sorting by `created`, a stale-but-recently-touched conversation\n // would otherwise land in `recent` and render above an actually-newer-\n // by-`created_at` conversation sitting in `older`.\n const sortedVisibleConversations = React.useMemo(() => {\n const visible = showOlderConversations\n ? [...recentScoped, ...olderScoped]\n : recentScoped;\n return sortConversationsByField(visible, conversationSort);\n }, [recentScoped, olderScoped, showOlderConversations, conversationSort]);\n\n const groupLabels = React.useMemo(\n () => ({\n emptyWorkspace: t(I18nKey.CONVERSATION_PANEL$NO_WORKSPACE),\n emptyRepository: t(I18nKey.CONVERSATION_PANEL$NO_REPOSITORY),\n }),\n [t],\n );\n\n const conversationGroups = React.useMemo(() => {\n if (compact || organizeMode !== \"grouped\") {\n return null;\n }\n // Use the unsorted partitions: groupConversations sorts each bucket\n // internally by `sortField`, so pre-sorting the merged input is wasted\n // work in grouped mode (the per-group sort overrides any global order).\n const merged = [\n ...recentScoped,\n ...(showOlderConversations ? olderScoped : []),\n ];\n return groupConversations(\n merged,\n activeBackend.kind,\n conversationSort,\n groupLabels,\n );\n }, [\n activeBackend.kind,\n compact,\n conversationSort,\n groupLabels,\n olderScoped,\n organizeMode,\n recentScoped,\n showOlderConversations,\n ]);\n\n const compactVisibleConversations = React.useMemo(\n () =>\n sortConversationsByField(\n recentScoped.filter((conversation) =>\n isExecutionActive(conversation.execution_status),\n ),\n conversationSort,\n ),\n [conversationSort, recentScoped],\n );\n\n const visibleFlatCount = sortedVisibleConversations.length;\n\n const visibleGroupedCount = React.useMemo(() => {\n if (!conversationGroups) {\n return 0;\n }\n return conversationGroups.reduce((n, g) => n + g.conversations.length, 0);\n }, [conversationGroups]);\n\n const listIsEffectivelyEmpty =\n organizeMode === \"grouped\" && !compact\n ? visibleGroupedCount === 0\n : visibleFlatCount === 0;\n\n const { mutate: deleteConversation, mutateAsync: deleteConversationAsync } =\n useDeleteConversation();\n const { mutate: pauseConversation } = useUnifiedPauseConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n // The next page of conversations is loaded only via the explicit \"Load\n // more\" link rendered at the end of the list — there is no scroll-driven\n // pagination, which previously caused the panel to feel like it had stray\n // scrollable space at the bottom.\n const olderHidden = olderScoped.length > 0 && !showOlderConversations;\n // Compact mode also hides \"Load more\" — paginating into archived\n // conversations contradicts the \"active only\" intent of the icon rail.\n // Do not show when the visible list is empty (e.g. filters hide every\n // loaded conversation) — that state already shows \"No conversations found\".\n const showLoadMore =\n !!hasNextPage && !olderHidden && !compact && !listIsEffectivelyEmpty;\n\n const { mutate: createConversation } = useCreateConversation();\n const isCreatingConversationFlow = useIsCreatingConversation();\n\n const launchFromGroup = React.useCallback(\n (launch: ConversationGroupLaunch) => {\n if (isCreatingConversationFlow) return;\n createConversation(\n {\n workingDir: launch.workingDir,\n repository: launch.repository,\n },\n {\n onSuccess: (data) => {\n navigate(`/conversations/${data.conversation_id}`);\n },\n },\n );\n },\n [createConversation, isCreatingConversationFlow, navigate],\n );\n\n const handleDeleteProject = React.useCallback(\n (conversationId: string, title: string) => {\n setConfirmDeleteModalVisible(true);\n setSelectedConversationId(conversationId);\n setSelectedConversationTitle(title);\n },\n [],\n );\n\n const handleStopConversation = React.useCallback((conversationId: string) => {\n setConfirmStopModalVisible(true);\n setSelectedConversationId(conversationId);\n }, []);\n\n const handleConversationTitleChange = React.useCallback(\n (conversationId: string, newTitle: string) => {\n updateConversation(\n { conversationId, newTitle },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n },\n [t, updateConversation],\n );\n\n const handleConfirmDelete = () => {\n if (selectedConversationId) {\n deleteConversation(\n { conversationId: selectedConversationId },\n {\n onSuccess: () => {\n if (selectedConversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n };\n\n const handleConfirmStop = () => {\n if (selectedConversationId) {\n pauseConversation({\n conversationId: selectedConversationId,\n });\n }\n };\n\n const handleConfirmDeleteAll = async () => {\n const idsToDelete = conversations.map((c) => c.id);\n const results = await Promise.allSettled(\n idsToDelete.map((conversationId) =>\n deleteConversationAsync({ conversationId }),\n ),\n );\n\n const deletedIds = results.flatMap((result, index) =>\n result.status === \"fulfilled\" ? [idsToDelete[index]] : [],\n );\n const failedCount = results.length - deletedIds.length;\n\n if (\n currentConversationId !== null &&\n deletedIds.includes(currentConversationId)\n ) {\n navigate(\"/conversations\");\n }\n\n if (failedCount > 0) {\n displayErrorToast(\n `${failedCount} conversation${failedCount === 1 ? \"\" : \"s\"} could not be deleted.`,\n );\n }\n };\n\n const renderConversationCard = React.useCallback(\n (conversation: (typeof conversations)[number]) => {\n if (compact) {\n return (\n <CompactConversationRow\n key={conversation.id}\n conversationId={conversation.id}\n title={conversation.title ?? \"\"}\n selectedRepository={{\n selected_repository: conversation.selected_repository,\n selected_branch: conversation.selected_branch,\n git_provider: conversation.git_provider as Provider,\n }}\n executionStatus={conversation.execution_status}\n sandboxStatus={conversation.sandbox_status}\n lastUpdatedAt={conversation.updated_at}\n createdAt={conversation.created_at}\n workspaceWorkingDir={\n conversation.selected_workspace ??\n conversation.workspace?.working_dir\n }\n isActive={conversation.id === currentConversationId}\n onClose={onClose}\n showRepositoryMetadata={showRepoBranchMetadata}\n llmModel={conversation.llm_model}\n showLlmProfiles={showLlmProfiles}\n agentKind={conversation.agent_kind}\n acpServer={conversation.acp_server}\n />\n );\n }\n return (\n <NavigationLink\n key={conversation.id}\n to={`/conversations/${conversation.id}`}\n onClick={onClose}\n className=\"block\"\n >\n <ConversationCard\n onDelete={() =>\n handleDeleteProject(conversation.id, conversation.title ?? \"\")\n }\n onStop={() => handleStopConversation(conversation.id)}\n onChangeTitle={(title) =>\n handleConversationTitleChange(conversation.id, title)\n }\n title={conversation.title ?? \"\"}\n selectedRepository={{\n selected_repository: conversation.selected_repository,\n selected_branch: conversation.selected_branch,\n git_provider: conversation.git_provider as Provider,\n }}\n lastUpdatedAt={conversation.updated_at}\n createdAt={conversation.created_at}\n executionStatus={conversation.execution_status}\n sandboxStatus={conversation.sandbox_status}\n conversationId={conversation.id}\n contextMenuOpen={openContextMenuId === conversation.id}\n onContextMenuToggle={(isOpen) =>\n setOpenContextMenuId(isOpen ? conversation.id : null)\n }\n isActive={conversation.id === currentConversationId}\n workspaceWorkingDir={\n conversation.selected_workspace ??\n conversation.workspace?.working_dir\n }\n showRepositoryMetadata={showRepoBranchMetadata}\n llmModel={conversation.llm_model}\n showLlmProfiles={showLlmProfiles}\n agentKind={conversation.agent_kind}\n acpServer={conversation.acp_server}\n />\n </NavigationLink>\n );\n },\n [\n compact,\n currentConversationId,\n handleConversationTitleChange,\n handleDeleteProject,\n handleStopConversation,\n onClose,\n openContextMenuId,\n showRepoBranchMetadata,\n showLlmProfiles,\n ],\n );\n\n // Standard layout: panel fills its slot in the sidebar; the inner scroll\n // child fills the panel and scrolls when its content overflows. Modals are\n // siblings of the scroll element and are `position: fixed`, so they don't\n // participate in the panel's scroll geometry.\n // Gate on `isLoading` / `!isFetched` (true only until the first fetch settles),\n // not `isFetching` — the latter flips back to true on every 10s background\n // refetch, causing the skeleton/empty-state to flicker when the list is empty.\n const showInitialSkeleton = isLoading || !isFetched;\n const showEmptyState =\n isFetched &&\n !isLoading &&\n !compact &&\n listIsEffectivelyEmpty &&\n !startTasks?.length;\n\n const showConversationHeader = !compact;\n\n return (\n <div\n ref={ref}\n data-testid=\"conversation-panel\"\n className=\"flex h-full min-h-0 w-full flex-col\"\n >\n {showConversationHeader && (\n <div\n className={cn(\n // Pull flush to the sidebar edges: `-ml-2.5` matches aside `pl-2.5`;\n // width extends by that inset on the right now that aside is `pr-0`.\n \"-ml-2.5 w-[calc(100%+0.625rem)] max-w-none box-border border-b\",\n isListScrolled ? \"border-[var(--oh-border)]\" : \"border-transparent\",\n )}\n >\n <div\n data-testid=\"older-conversations-summary\"\n className=\"flex min-w-0 flex-nowrap items-center gap-x-2 py-2 pl-4 pr-2.5 text-[var(--oh-muted)]\"\n >\n <span className=\"min-w-0 truncate text-sm font-medium text-[var(--oh-muted)]\">\n {t(I18nKey.SIDEBAR$CONVERSATIONS)}\n </span>\n <div className=\"ml-auto flex shrink-0 items-center gap-0.5\">\n <ConversationPanelNewThreadPicker\n backendKind={activeBackend.kind}\n />\n <ConversationPanelFilterMenu\n filterMenuOpen={filterMenuOpen}\n setFilterMenuOpen={setFilterMenuOpen}\n menuRef={filterMenuRef}\n backendKind={activeBackend.kind}\n organizeMode={organizeMode}\n setOrganizeMode={setOrganizeMode}\n conversationSort={conversationSort}\n setConversationSort={setConversationSort}\n threadScope={threadScope}\n setThreadScope={setThreadScope}\n showOlderConversations={showOlderConversations}\n toggleShowOlderConversations={toggleShowOlderConversations}\n showRepoBranchMetadata={showRepoBranchMetadata}\n toggleShowRepoBranchMetadata={toggleShowRepoBranchMetadata}\n showLlmProfiles={showLlmProfiles}\n toggleShowLlmProfiles={toggleShowLlmProfiles}\n totalConversationsCount={conversations.length}\n onRequestDeleteAll={() => setConfirmDeleteAllVisible(true)}\n />\n </div>\n </div>\n </div>\n )}\n\n <div\n ref={scrollContainerRef}\n data-testid=\"conversation-panel-list-scroll\"\n onScroll={(event) => {\n setIsListScrolled(event.currentTarget.scrollTop > 0);\n }}\n className={cn(\n \"flex min-h-0 flex-1 flex-col overflow-y-auto overflow-x-hidden overscroll-contain custom-scrollbar-always\",\n !compact && \"conversation-panel-list-scroll\",\n )}\n >\n {showInitialSkeleton && <ConversationCardSkeleton compact={compact} />}\n\n {!compact && showEmptyState && (\n <div\n data-testid=\"conversation-panel-empty-state\"\n className=\"flex min-h-0 flex-1 flex-col items-center justify-center px-4 py-8\"\n >\n <p className=\"text-xs text-[var(--oh-muted)]\">\n {t(I18nKey.CONVERSATION$NO_CONVERSATIONS)}\n </p>\n </div>\n )}\n\n {/* Render in-progress start tasks first (skipped in compact mode —\n their rich card layout doesn't fit in the icon rail). */}\n {!compact &&\n startTasks?.map((task) => (\n <NavigationLink\n key={task.id}\n to={`/conversations/task-${task.id}`}\n onClick={onClose}\n className=\"block\"\n >\n <StartTaskCard task={task} />\n </NavigationLink>\n ))}\n\n {!showInitialSkeleton && compact\n ? compactVisibleConversations.map(renderConversationCard)\n : null}\n\n {!showInitialSkeleton &&\n !compact &&\n organizeMode === \"grouped\" &&\n conversationGroups &&\n conversationGroups.length > 0 ? (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {conversationGroups.map((group) => {\n const headingId = `thread-folder-${group.id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n const groupTestIdSuffix = group.id.replace(\n /[^a-zA-Z0-9_-]/g,\n \"-\",\n );\n const expanded = !collapsedGroupIds.has(group.id);\n const previewExpanded = expandedGroupPreviewIds.has(group.id);\n const { visibleConversations, isPreviewTruncated, isShowingAll } =\n getGroupConversationPreview(group.conversations, {\n expanded: previewExpanded,\n activeConversationId: currentConversationId,\n });\n return (\n <section key={group.id} aria-labelledby={headingId}>\n <div\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-0.5 rounded-md pl-2 pr-1 text-sm font-normal\",\n \"text-[var(--oh-muted)] transition-colors\",\n \"hover:bg-[var(--oh-surface-raised)] hover:text-white\",\n )}\n >\n <button\n type=\"button\"\n id={headingId}\n aria-expanded={expanded}\n onClick={() => toggleGroupCollapsed(group.id)}\n className=\"flex min-h-8 min-w-0 flex-1 items-center gap-2 rounded-md py-1 text-left text-inherit outline-none transition-colors focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]\"\n >\n <Folder className=\"h-4 w-4 shrink-0\" aria-hidden />\n <span className=\"truncate\">{group.label}</span>\n </button>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md\",\n \"text-inherit transition-colors\",\n \"hover:bg-white/10 hover:text-white\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n disabled={isCreatingConversationFlow}\n aria-label={t(\n I18nKey.CONVERSATION_PANEL$ADD_CONVERSATION_TO_GROUP,\n { label: group.label },\n )}\n data-testid={`add-conversation-to-group-${group.id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n launchFromGroup(group.launch);\n }}\n >\n <Plus\n className=\"h-3.5 w-3.5 shrink-0\"\n aria-hidden\n strokeWidth={2}\n />\n </button>\n </div>\n {expanded ? (\n <div className=\"mt-0.5 space-y-0.5\">\n {visibleConversations.map(renderConversationCard)}\n {isPreviewTruncated ? (\n <div className=\"pl-2\">\n <button\n type=\"button\"\n data-testid={`thread-folder-view-more-${groupTestIdSuffix}`}\n onClick={() => toggleGroupPreviewExpanded(group.id)}\n className=\"ml-[26px] cursor-pointer text-xs text-[var(--oh-text-dim)] hover:text-white\"\n >\n {isShowingAll\n ? t(I18nKey.CONVERSATION_PANEL$LESS)\n : t(I18nKey.CONVERSATION_PANEL$MORE)}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n })}\n </nav>\n ) : null}\n\n {!showInitialSkeleton &&\n !compact &&\n organizeMode === \"chronological\" ? (\n <div className=\"space-y-0.5\">\n {sortedVisibleConversations.map(renderConversationCard)}\n </div>\n ) : null}\n\n {/* Explicit \"Load more\" trigger. Only shown when more pages exist\n *and* the older list is currently visible (or there are no older\n conversations to begin with) — otherwise the next page would be\n populated mostly with conversations the user has chosen to hide. */}\n {showLoadMore && (\n <div className=\"flex justify-center py-4\">\n {isFetchingNextPage ? (\n <LoadingSpinner size=\"small\" />\n ) : (\n <button\n type=\"button\"\n data-testid=\"load-more-conversations\"\n onClick={() => fetchNextPage()}\n className=\"text-xs text-[var(--oh-muted)] hover:text-white\"\n >\n {t(I18nKey.CONVERSATION$LOAD_MORE)}\n </button>\n )}\n </div>\n )}\n </div>\n\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={() => {\n handleConfirmDelete();\n setConfirmDeleteModalVisible(false);\n setSelectedConversationTitle(null);\n }}\n onCancel={() => {\n setConfirmDeleteModalVisible(false);\n setSelectedConversationTitle(null);\n }}\n conversationTitle={selectedConversationTitle ?? undefined}\n />\n )}\n\n {confirmDeleteAllVisible && (\n <ConfirmDeleteModal\n title={t(I18nKey.CONVERSATION$CONFIRM_DELETE_ALL_TITLE)}\n description={t(I18nKey.CONVERSATION$CONFIRM_DELETE_ALL_DESC, {\n count: conversations.length,\n })}\n onConfirm={async () => {\n await handleConfirmDeleteAll();\n setConfirmDeleteAllVisible(false);\n }}\n onCancel={() => setConfirmDeleteAllVisible(false)}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={() => {\n handleConfirmStop();\n setConfirmStopModalVisible(false);\n }}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n\n {confirmExitConversationModalVisible && (\n <ExitConversationModal\n onConfirm={() => {\n onClose?.();\n }}\n onClose={() => setConfirmExitConversationModalVisible(false)}\n onCancel={() => setConfirmExitConversationModalVisible(false)}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-panel.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Folder, Plus } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { usePaginatedConversations } from \"#/hooks/query/use-paginated-conversations\";\nimport { useStartTasks } from \"#/hooks/query/use-start-tasks\";\nimport { useDeleteConversation } from \"#/hooks/mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"#/hooks/mutation/use-unified-stop-conversation\";\nimport { ConfirmDeleteModal } from \"./confirm-delete-modal\";\nimport { ConfirmStopModal } from \"./confirm-stop-modal\";\nimport { LoadingSpinner } from \"#/components/shared/loading-spinner\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { ExitConversationModal } from \"./exit-conversation-modal\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { Provider } from \"#/types/settings\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { isExecutionActive } from \"#/utils/status\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { useIsCreatingConversation } from \"#/hooks/use-is-creating-conversation\";\nimport { ConversationCard } from \"./conversation-card/conversation-card\";\nimport { StartTaskCard } from \"./start-task-card/start-task-card\";\nimport { ConversationCardSkeleton } from \"./conversation-card/conversation-card-skeleton\";\nimport { CompactConversationRow } from \"./compact-conversation-row\";\nimport { useConversationPanelPreferencesStore } from \"#/stores/conversation-panel-preferences-store\";\nimport { cn } from \"#/utils/utils\";\nimport { ConversationPanelFilterMenu } from \"./conversation-panel-filter-menu\";\nimport { ConversationPanelNewThreadPicker } from \"./conversation-panel-new-thread-picker\";\nimport {\n groupConversations,\n getGroupConversationPreview,\n sortConversationsByField,\n type ConversationGroupLaunch,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationPanelProps {\n onClose?: () => void;\n /**\n * Render a minimal icon-only variant of each conversation row (used by the\n * collapsed sidebar). Each row is a single status dot with a hover preview\n * containing the full card content.\n */\n compact?: boolean;\n}\n\nconst noop = () => {};\n\nconst ONE_HOUR_MS = 60 * 60 * 1000;\n\nconst partitionByCutoff = <T extends { updated_at: string }>(\n items: readonly T[],\n): { recent: T[]; older: T[] } => {\n // The cutoff is intentionally relative to \"now\" each time the list is\n // recomputed, so conversations naturally age into the older bucket as the\n // conversations query refreshes.\n const cutoff = Date.now() - ONE_HOUR_MS;\n const recent: T[] = [];\n const older: T[] = [];\n for (const item of items) {\n const updatedAt = item.updated_at ? Date.parse(item.updated_at) : NaN;\n // Missing or unparseable timestamps stay in the \"recent\" bucket so we\n // do not accidentally hide them behind the older-conversations toggle.\n if (Number.isFinite(updatedAt) && updatedAt < cutoff) {\n older.push(item);\n } else {\n recent.push(item);\n }\n }\n return { recent, older };\n};\n\nexport function ConversationPanel({\n onClose,\n compact = false,\n}: ConversationPanelProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend: activeBackend } = useActiveBackend();\n // Click-outside is only relevant in the legacy drawer mode where an\n // onClose handler is provided. When the panel is rendered inline (e.g.\n // as the always-visible conversation list pane), clicking outside should\n // not dismiss the list, so we pass a no-op callback in that case.\n const ref = useClickOutsideElement<HTMLDivElement>(onClose ?? noop);\n\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const [\n confirmExitConversationModalVisible,\n setConfirmExitConversationModalVisible,\n ] = React.useState(false);\n const [confirmDeleteAllVisible, setConfirmDeleteAllVisible] =\n React.useState(false);\n const showOlderConversations = useConversationPanelPreferencesStore(\n (state) => state.showOlderConversations,\n );\n const toggleShowOlderConversations = useConversationPanelPreferencesStore(\n (state) => state.toggleShowOlderConversations,\n );\n const showRepoBranchMetadata = useConversationPanelPreferencesStore(\n (state) => state.showRepoBranchMetadata,\n );\n const toggleShowRepoBranchMetadata = useConversationPanelPreferencesStore(\n (state) => state.toggleShowRepoBranchMetadata,\n );\n const showLlmProfiles = useConversationPanelPreferencesStore(\n (state) => state.showLlmProfiles,\n );\n const toggleShowLlmProfiles = useConversationPanelPreferencesStore(\n (state) => state.toggleShowLlmProfiles,\n );\n const organizeMode = useConversationPanelPreferencesStore(\n (state) => state.organizeMode,\n );\n const setOrganizeMode = useConversationPanelPreferencesStore(\n (state) => state.setOrganizeMode,\n );\n const conversationSort = useConversationPanelPreferencesStore(\n (state) => state.conversationSort,\n );\n const setConversationSort = useConversationPanelPreferencesStore(\n (state) => state.setConversationSort,\n );\n const threadScope = useConversationPanelPreferencesStore(\n (state) => state.threadScope,\n );\n const setThreadScope = useConversationPanelPreferencesStore(\n (state) => state.setThreadScope,\n );\n const [filterMenuOpen, setFilterMenuOpen] = React.useState(false);\n const [isListScrolled, setIsListScrolled] = React.useState(false);\n const filterMenuRef = useClickOutsideElement<HTMLDivElement>(() => {\n setFilterMenuOpen(false);\n });\n const [collapsedGroupIds, setCollapsedGroupIds] = React.useState<\n ReadonlySet<string>\n >(() => new Set());\n const [expandedGroupPreviewIds, setExpandedGroupPreviewIds] = React.useState<\n ReadonlySet<string>\n >(() => new Set());\n\n const toggleGroupCollapsed = React.useCallback((groupId: string) => {\n setCollapsedGroupIds((prev) => {\n const next = new Set(prev);\n if (next.has(groupId)) {\n next.delete(groupId);\n } else {\n next.add(groupId);\n }\n return next;\n });\n }, []);\n\n const toggleGroupPreviewExpanded = React.useCallback((groupId: string) => {\n setExpandedGroupPreviewIds((prev) => {\n const next = new Set(prev);\n if (next.has(groupId)) {\n next.delete(groupId);\n } else {\n next.add(groupId);\n }\n return next;\n });\n }, []);\n\n React.useEffect(() => {\n if (organizeMode !== \"grouped\") {\n setCollapsedGroupIds(new Set());\n setExpandedGroupPreviewIds(new Set());\n }\n }, [organizeMode]);\n\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [selectedConversationId, setSelectedConversationId] = React.useState<\n string | null\n >(null);\n const [selectedConversationTitle, setSelectedConversationTitle] =\n React.useState<string | null>(null);\n const [openContextMenuId, setOpenContextMenuId] = React.useState<\n string | null\n >(null);\n\n const {\n data,\n isLoading,\n isFetched,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = usePaginatedConversations();\n\n // Fetch in-progress start tasks\n const { data: startTasks } = useStartTasks();\n\n const conversations = React.useMemo(\n () => data?.pages.flatMap((page) => page.items) ?? [],\n [data],\n );\n\n const scopedConversations = React.useMemo(() => {\n if (threadScope === \"relevant\") {\n return conversations.filter((c) => isExecutionActive(c.execution_status));\n }\n return conversations;\n }, [conversations, threadScope]);\n\n const { recent: recentScoped, older: olderScoped } = React.useMemo(\n () => partitionByCutoff(scopedConversations),\n [scopedConversations],\n );\n\n // Sort the full visible set as one list. The recent/older partition is\n // still computed (it gates the \"Show older\" toggle and \"Load more\"\n // visibility), but the rendering must not use it as a visual boundary —\n // when sorting by `created`, a stale-but-recently-touched conversation\n // would otherwise land in `recent` and render above an actually-newer-\n // by-`created_at` conversation sitting in `older`.\n const sortedVisibleConversations = React.useMemo(() => {\n const visible = showOlderConversations\n ? [...recentScoped, ...olderScoped]\n : recentScoped;\n return sortConversationsByField(visible, conversationSort);\n }, [recentScoped, olderScoped, showOlderConversations, conversationSort]);\n\n const groupLabels = React.useMemo(\n () => ({\n emptyWorkspace: t(I18nKey.CONVERSATION_PANEL$NO_WORKSPACE),\n emptyRepository: t(I18nKey.CONVERSATION_PANEL$NO_REPOSITORY),\n }),\n [t],\n );\n\n const conversationGroups = React.useMemo(() => {\n if (compact || organizeMode !== \"grouped\") {\n return null;\n }\n // Use the unsorted partitions: groupConversations sorts each bucket\n // internally by `sortField`, so pre-sorting the merged input is wasted\n // work in grouped mode (the per-group sort overrides any global order).\n const merged = [\n ...recentScoped,\n ...(showOlderConversations ? olderScoped : []),\n ];\n return groupConversations(\n merged,\n activeBackend.kind,\n conversationSort,\n groupLabels,\n );\n }, [\n activeBackend.kind,\n compact,\n conversationSort,\n groupLabels,\n olderScoped,\n organizeMode,\n recentScoped,\n showOlderConversations,\n ]);\n\n const compactVisibleConversations = React.useMemo(\n () =>\n sortConversationsByField(\n recentScoped.filter((conversation) =>\n isExecutionActive(conversation.execution_status),\n ),\n conversationSort,\n ),\n [conversationSort, recentScoped],\n );\n\n const visibleFlatCount = sortedVisibleConversations.length;\n\n const visibleGroupedCount = React.useMemo(() => {\n if (!conversationGroups) {\n return 0;\n }\n return conversationGroups.reduce((n, g) => n + g.conversations.length, 0);\n }, [conversationGroups]);\n\n const listIsEffectivelyEmpty =\n organizeMode === \"grouped\" && !compact\n ? visibleGroupedCount === 0\n : visibleFlatCount === 0;\n\n const { mutate: deleteConversation, mutateAsync: deleteConversationAsync } =\n useDeleteConversation();\n const { mutate: pauseConversation } = useUnifiedPauseConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n // The next page of conversations is loaded only via the explicit \"Load\n // more\" link rendered at the end of the list — there is no scroll-driven\n // pagination, which previously caused the panel to feel like it had stray\n // scrollable space at the bottom.\n const olderHidden = olderScoped.length > 0 && !showOlderConversations;\n // Compact mode also hides \"Load more\" — paginating into archived\n // conversations contradicts the \"active only\" intent of the icon rail.\n // Do not show when the visible list is empty (e.g. filters hide every\n // loaded conversation) — that state already shows \"No conversations found\".\n const showLoadMore =\n !!hasNextPage && !olderHidden && !compact && !listIsEffectivelyEmpty;\n\n const { mutate: createConversation } = useCreateConversation();\n const isCreatingConversationFlow = useIsCreatingConversation();\n\n const launchFromGroup = React.useCallback(\n (launch: ConversationGroupLaunch) => {\n if (isCreatingConversationFlow) return;\n createConversation(\n {\n workingDir: launch.workingDir,\n repository: launch.repository,\n },\n {\n onSuccess: (data) => {\n navigate(`/conversations/${data.conversation_id}`);\n },\n },\n );\n },\n [createConversation, isCreatingConversationFlow, navigate],\n );\n\n const handleDeleteProject = React.useCallback(\n (conversationId: string, title: string) => {\n setConfirmDeleteModalVisible(true);\n setSelectedConversationId(conversationId);\n setSelectedConversationTitle(title);\n },\n [],\n );\n\n const handleStopConversation = React.useCallback((conversationId: string) => {\n setConfirmStopModalVisible(true);\n setSelectedConversationId(conversationId);\n }, []);\n\n const handleConversationTitleChange = React.useCallback(\n (conversationId: string, newTitle: string) => {\n updateConversation(\n { conversationId, newTitle },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n },\n [t, updateConversation],\n );\n\n const handleConfirmDelete = () => {\n if (selectedConversationId) {\n deleteConversation(\n { conversationId: selectedConversationId },\n {\n onSuccess: () => {\n if (selectedConversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n };\n\n const handleConfirmStop = () => {\n if (selectedConversationId) {\n pauseConversation({\n conversationId: selectedConversationId,\n });\n }\n };\n\n const handleConfirmDeleteAll = async () => {\n const idsToDelete = conversations.map((c) => c.id);\n const results = await Promise.allSettled(\n idsToDelete.map((conversationId) =>\n deleteConversationAsync({ conversationId }),\n ),\n );\n\n const deletedIds = results.flatMap((result, index) =>\n result.status === \"fulfilled\" ? [idsToDelete[index]] : [],\n );\n const failedCount = results.length - deletedIds.length;\n\n if (\n currentConversationId !== null &&\n deletedIds.includes(currentConversationId)\n ) {\n navigate(\"/conversations\");\n }\n\n if (failedCount > 0) {\n displayErrorToast(\n `${failedCount} conversation${failedCount === 1 ? \"\" : \"s\"} could not be deleted.`,\n );\n }\n };\n\n const renderConversationCard = React.useCallback(\n (conversation: (typeof conversations)[number]) => {\n if (compact) {\n return (\n <CompactConversationRow\n key={conversation.id}\n conversationId={conversation.id}\n title={conversation.title ?? \"\"}\n selectedRepository={{\n selected_repository: conversation.selected_repository,\n selected_branch: conversation.selected_branch,\n git_provider: conversation.git_provider as Provider,\n }}\n executionStatus={conversation.execution_status}\n sandboxStatus={conversation.sandbox_status}\n lastUpdatedAt={conversation.updated_at}\n createdAt={conversation.created_at}\n workspaceWorkingDir={\n conversation.selected_workspace ??\n conversation.workspace?.working_dir\n }\n isActive={conversation.id === currentConversationId}\n onClose={onClose}\n showRepositoryMetadata={showRepoBranchMetadata}\n llmModel={conversation.llm_model}\n showLlmProfiles={showLlmProfiles}\n agentKind={conversation.agent_kind}\n acpServer={conversation.acp_server}\n />\n );\n }\n return (\n <NavigationLink\n key={conversation.id}\n to={`/conversations/${conversation.id}`}\n onClick={onClose}\n className=\"block\"\n >\n <ConversationCard\n onDelete={() =>\n handleDeleteProject(conversation.id, conversation.title ?? \"\")\n }\n onStop={() => handleStopConversation(conversation.id)}\n onChangeTitle={(title) =>\n handleConversationTitleChange(conversation.id, title)\n }\n title={conversation.title ?? \"\"}\n selectedRepository={{\n selected_repository: conversation.selected_repository,\n selected_branch: conversation.selected_branch,\n git_provider: conversation.git_provider as Provider,\n }}\n lastUpdatedAt={conversation.updated_at}\n createdAt={conversation.created_at}\n executionStatus={conversation.execution_status}\n sandboxStatus={conversation.sandbox_status}\n conversationId={conversation.id}\n contextMenuOpen={openContextMenuId === conversation.id}\n onContextMenuToggle={(isOpen) =>\n setOpenContextMenuId(isOpen ? conversation.id : null)\n }\n isActive={conversation.id === currentConversationId}\n workspaceWorkingDir={\n conversation.selected_workspace ??\n conversation.workspace?.working_dir\n }\n showRepositoryMetadata={showRepoBranchMetadata}\n llmModel={conversation.llm_model}\n showLlmProfiles={showLlmProfiles}\n agentKind={conversation.agent_kind}\n acpServer={conversation.acp_server}\n />\n </NavigationLink>\n );\n },\n [\n compact,\n currentConversationId,\n handleConversationTitleChange,\n handleDeleteProject,\n handleStopConversation,\n onClose,\n openContextMenuId,\n showRepoBranchMetadata,\n showLlmProfiles,\n ],\n );\n\n // Standard layout: panel fills its slot in the sidebar; the inner scroll\n // child fills the panel and scrolls when its content overflows. Modals are\n // siblings of the scroll element and are `position: fixed`, so they don't\n // participate in the panel's scroll geometry.\n // Gate on `isLoading` / `!isFetched` (true only until the first fetch settles),\n // not `isFetching` — the latter flips back to true on every 10s background\n // refetch, causing the skeleton/empty-state to flicker when the list is empty.\n const showInitialSkeleton = isLoading || !isFetched;\n const showEmptyState =\n isFetched &&\n !isLoading &&\n !compact &&\n listIsEffectivelyEmpty &&\n !startTasks?.length;\n\n const showConversationHeader = !compact;\n\n return (\n <div\n ref={ref}\n data-testid=\"conversation-panel\"\n className=\"flex h-full min-h-0 w-full flex-col\"\n >\n {showConversationHeader && (\n <div\n className={cn(\n // Pull flush to the sidebar edges: `-ml-2.5` matches aside `pl-2.5`;\n // width extends by that inset on the right now that aside is `pr-0`.\n \"-ml-2.5 w-[calc(100%+0.625rem)] max-w-none box-border border-b\",\n isListScrolled ? \"border-[var(--oh-border)]\" : \"border-transparent\",\n )}\n >\n <div\n data-testid=\"older-conversations-summary\"\n className=\"flex min-w-0 flex-nowrap items-center gap-x-2 py-2 pl-4 pr-2.5 text-[var(--oh-muted)]\"\n >\n <span className=\"min-w-0 truncate text-sm font-medium text-[var(--oh-muted)]\">\n {t(I18nKey.SIDEBAR$CONVERSATIONS)}\n </span>\n <div className=\"ml-auto flex shrink-0 items-center gap-0.5\">\n <ConversationPanelNewThreadPicker\n backendKind={activeBackend.kind}\n />\n <ConversationPanelFilterMenu\n filterMenuOpen={filterMenuOpen}\n setFilterMenuOpen={setFilterMenuOpen}\n menuRef={filterMenuRef}\n backendKind={activeBackend.kind}\n organizeMode={organizeMode}\n setOrganizeMode={setOrganizeMode}\n conversationSort={conversationSort}\n setConversationSort={setConversationSort}\n threadScope={threadScope}\n setThreadScope={setThreadScope}\n showOlderConversations={showOlderConversations}\n toggleShowOlderConversations={toggleShowOlderConversations}\n showRepoBranchMetadata={showRepoBranchMetadata}\n toggleShowRepoBranchMetadata={toggleShowRepoBranchMetadata}\n showLlmProfiles={showLlmProfiles}\n toggleShowLlmProfiles={toggleShowLlmProfiles}\n totalConversationsCount={conversations.length}\n onRequestDeleteAll={() => setConfirmDeleteAllVisible(true)}\n />\n </div>\n </div>\n </div>\n )}\n\n <div\n ref={scrollContainerRef}\n data-testid=\"conversation-panel-list-scroll\"\n onScroll={(event) => {\n setIsListScrolled(event.currentTarget.scrollTop > 0);\n }}\n className={cn(\n \"flex min-h-0 flex-1 flex-col overflow-y-auto overflow-x-hidden overscroll-contain custom-scrollbar-always\",\n !compact && \"conversation-panel-list-scroll\",\n )}\n >\n {showInitialSkeleton && <ConversationCardSkeleton compact={compact} />}\n\n {!compact && showEmptyState && (\n <div\n data-testid=\"conversation-panel-empty-state\"\n className=\"flex min-h-0 flex-1 flex-col items-center justify-center px-4 py-8\"\n >\n <p className=\"text-xs text-[var(--oh-muted)]\">\n {t(I18nKey.CONVERSATION$NO_CONVERSATIONS)}\n </p>\n </div>\n )}\n\n {/* Render in-progress start tasks first (skipped in compact mode —\n their rich card layout doesn't fit in the icon rail). */}\n {!compact &&\n startTasks?.map((task) => (\n <NavigationLink\n key={task.id}\n to={`/conversations/task-${task.id}`}\n onClick={onClose}\n className=\"block\"\n >\n <StartTaskCard task={task} />\n </NavigationLink>\n ))}\n\n {!showInitialSkeleton && compact\n ? compactVisibleConversations.map(renderConversationCard)\n : null}\n\n {!showInitialSkeleton &&\n !compact &&\n organizeMode === \"grouped\" &&\n conversationGroups &&\n conversationGroups.length > 0 ? (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {conversationGroups.map((group) => {\n const headingId = `thread-folder-${group.id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n const groupTestIdSuffix = group.id.replace(\n /[^a-zA-Z0-9_-]/g,\n \"-\",\n );\n const expanded = !collapsedGroupIds.has(group.id);\n const previewExpanded = expandedGroupPreviewIds.has(group.id);\n const { visibleConversations, isPreviewTruncated, isShowingAll } =\n getGroupConversationPreview(group.conversations, {\n expanded: previewExpanded,\n activeConversationId: currentConversationId,\n });\n return (\n <section key={group.id} aria-labelledby={headingId}>\n <div\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-0.5 rounded-md pl-2 pr-1 text-sm font-normal\",\n \"text-[var(--oh-muted)] transition-colors\",\n \"hover:bg-[var(--oh-surface-raised)] hover:text-white\",\n )}\n >\n <button\n type=\"button\"\n id={headingId}\n aria-expanded={expanded}\n onClick={() => toggleGroupCollapsed(group.id)}\n className=\"flex min-h-8 min-w-0 flex-1 items-center gap-2 rounded-md py-1 text-left text-inherit outline-none transition-colors focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]\"\n >\n <Folder className=\"h-4 w-4 shrink-0\" aria-hidden />\n <span className=\"truncate\">{group.label}</span>\n </button>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md\",\n \"text-inherit transition-colors\",\n \"hover:bg-white/10 hover:text-white\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n disabled={isCreatingConversationFlow}\n aria-label={t(\n I18nKey.CONVERSATION_PANEL$ADD_CONVERSATION_TO_GROUP,\n { label: group.label },\n )}\n data-testid={`add-conversation-to-group-${group.id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n launchFromGroup(group.launch);\n }}\n >\n <Plus\n className=\"h-3.5 w-3.5 shrink-0\"\n aria-hidden\n strokeWidth={2}\n />\n </button>\n </div>\n {expanded ? (\n <div className=\"mt-0.5 space-y-0.5\">\n {visibleConversations.map(renderConversationCard)}\n {isPreviewTruncated ? (\n <div className=\"pl-2\">\n <button\n type=\"button\"\n data-testid={`thread-folder-view-more-${groupTestIdSuffix}`}\n onClick={() => toggleGroupPreviewExpanded(group.id)}\n className=\"ml-[26px] cursor-pointer text-xs text-[var(--oh-text-dim)] hover:text-white\"\n >\n {isShowingAll\n ? t(I18nKey.CONVERSATION_PANEL$LESS)\n : t(I18nKey.CONVERSATION_PANEL$MORE)}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n })}\n </nav>\n ) : null}\n\n {!showInitialSkeleton &&\n !compact &&\n organizeMode === \"chronological\" ? (\n <div className=\"space-y-0.5\">\n {sortedVisibleConversations.map(renderConversationCard)}\n </div>\n ) : null}\n\n {/* Explicit \"Load more\" trigger. Only shown when more pages exist\n *and* the older list is currently visible (or there are no older\n conversations to begin with) — otherwise the next page would be\n populated mostly with conversations the user has chosen to hide. */}\n {showLoadMore && (\n <div className=\"flex justify-center py-4\">\n {isFetchingNextPage ? (\n <LoadingSpinner size=\"small\" />\n ) : (\n <button\n type=\"button\"\n data-testid=\"load-more-conversations\"\n onClick={() => fetchNextPage()}\n className=\"text-xs text-[var(--oh-muted)] hover:text-white\"\n >\n {t(I18nKey.CONVERSATION$LOAD_MORE)}\n </button>\n )}\n </div>\n )}\n </div>\n\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={() => {\n handleConfirmDelete();\n setConfirmDeleteModalVisible(false);\n setSelectedConversationTitle(null);\n }}\n onCancel={() => {\n setConfirmDeleteModalVisible(false);\n setSelectedConversationTitle(null);\n }}\n conversationTitle={selectedConversationTitle ?? undefined}\n />\n )}\n\n {confirmDeleteAllVisible && (\n <ConfirmDeleteModal\n title={t(I18nKey.CONVERSATION$CONFIRM_DELETE_ALL_TITLE)}\n description={t(I18nKey.CONVERSATION$CONFIRM_DELETE_ALL_DESC, {\n count: conversations.length,\n })}\n onConfirm={async () => {\n await handleConfirmDeleteAll();\n setConfirmDeleteAllVisible(false);\n }}\n onCancel={() => setConfirmDeleteAllVisible(false)}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={() => {\n handleConfirmStop();\n setConfirmStopModalVisible(false);\n }}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n\n {confirmExitConversationModalVisible && (\n <ExitConversationModal\n onConfirm={() => {\n onClose?.();\n }}\n onClose={() => setConfirmExitConversationModalVisible(false)}\n onCancel={() => setConfirmExitConversationModalVisible(false)}\n />\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(`../../../utils/utils.cjs`),n=require(`../../../utils/form-control-classes.cjs`),r=require(`../../../icons/three-dots-vertical.cjs`);let i=require(`react`);i=e.__toESM(i,1);let a=require(`react/jsx-runtime`);var o=i.default.forwardRef(function({onClick:e,className:i,iconClassName:o,ariaLabel:s,testId:c=`ellipsis-button`},l){return(0,a.jsx)(`button`,{ref:l,"data-testid":c,type:`button`,onClick:e,"aria-label":s,className:t.cn(`p-1 rounded-md cursor-pointer`,n.formControlTransitionClassName,`text-[var(--oh-muted)]
|
|
1
|
+
const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../utils/utils.cjs`),n=require(`../../../utils/form-control-classes.cjs`),r=require(`../../../icons/three-dots-vertical.cjs`);let i=require(`react`);i=e.__toESM(i,1);let a=require(`react/jsx-runtime`);var o=i.default.forwardRef(function({onClick:e,className:i,iconClassName:o,ariaLabel:s,testId:c=`ellipsis-button`},l){return(0,a.jsx)(`button`,{ref:l,"data-testid":c,type:`button`,onClick:e,"aria-label":s,className:t.cn(`p-1 rounded-md cursor-pointer`,n.formControlTransitionClassName,`text-[var(--oh-muted)]`,n.formControlMutedHoverClassName,`flex items-center justify-center`,i),children:(0,a.jsx)(r.default,{className:o??`w-4 h-4`})})});exports.EllipsisButton=o;
|
|
2
2
|
//# sourceMappingURL=ellipsis-button.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ellipsis-button.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/ellipsis-button.tsx"],"sourcesContent":["import React from \"react\";\nimport ThreeDotsVerticalIcon from \"#/icons/three-dots-vertical.svg?react\";\nimport { cn } from \"#/utils/utils\";\nimport {
|
|
1
|
+
{"version":3,"file":"ellipsis-button.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/ellipsis-button.tsx"],"sourcesContent":["import React from \"react\";\nimport ThreeDotsVerticalIcon from \"#/icons/three-dots-vertical.svg?react\";\nimport { cn } from \"#/utils/utils\";\nimport {\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n} from \"#/utils/form-control-classes\";\n\ninterface EllipsisButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /**\n * Optional override classes applied to the button. Use this when a\n * caller needs to customize layout (e.g. translate, flex), not to\n * replace hover treatment which is intentionally shared.\n */\n className?: string;\n /** Icon box; default `w-4 h-4` (use `mobileTopBarIconClassName` in mobile top bars). */\n iconClassName?: string;\n ariaLabel?: string;\n /**\n * Override the default `ellipsis-button` test id. Most callers\n * should leave this unset; provide a custom id only when an\n * existing test suite already targets a specific id (e.g. the\n * `profile-menu-trigger` in LLM profile rows).\n */\n testId?: string;\n}\n\n/**\n * Standardized \"three vertical dots\" overflow trigger.\n *\n * Use this anywhere the chrome needs an inline ellipsis menu trigger\n * (conversation header, conversation cards in the side panel,\n * conversation tabs, settings rows, etc.) so that size, color, and\n * hover treatment stay consistent.\n *\n * The chat input area's overflow button uses its own pill-shaped\n * variant with a custom hover background — do NOT replace that one\n * with this component; it is intentionally different.\n */\nexport const EllipsisButton = React.forwardRef<\n HTMLButtonElement,\n EllipsisButtonProps\n>(function EllipsisButton(\n { onClick, className, iconClassName, ariaLabel, testId = \"ellipsis-button\" },\n ref,\n) {\n return (\n <button\n ref={ref}\n data-testid={testId}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"p-1 rounded-md cursor-pointer\",\n formControlTransitionClassName,\n \"text-[var(--oh-muted)]\",\n formControlMutedHoverClassName,\n \"flex items-center justify-center\",\n className,\n )}\n >\n <ThreeDotsVerticalIcon className={iconClassName ?? \"w-4 h-4\"} />\n </button>\n );\n});\n"],"mappings":"qRAwCA,IAAa,EAAiB,EAAA,QAAM,WAGlC,SACA,CAAE,UAAS,YAAW,gBAAe,YAAW,SAAS,mBACzD,EACA,CACA,OACE,EAAA,EAAA,KAAC,SAAD,CACO,MACL,cAAa,EACb,KAAK,SACI,UACT,aAAY,EACZ,UAAW,EAAA,GACT,gCACA,EAAA,+BACA,yBACA,EAAA,+BACA,mCACA,EACD,WAED,EAAA,EAAA,KAAC,EAAA,QAAD,CAAuB,UAAW,GAAiB,UAAa,CAAA,CACzD,CAAA,EAEX"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { cn as e } from "../../../utils/utils.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { jsx as
|
|
2
|
+
import { formControlMutedHoverClassName as t, formControlTransitionClassName as n } from "../../../utils/form-control-classes.js";
|
|
3
|
+
import r from "../../../icons/three-dots-vertical.js";
|
|
4
|
+
import i from "react";
|
|
5
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/features/conversation-panel/ellipsis-button.tsx
|
|
7
|
-
var
|
|
8
|
-
return /* @__PURE__ */
|
|
9
|
-
ref:
|
|
10
|
-
"data-testid":
|
|
7
|
+
var o = i.forwardRef(function({ onClick: i, className: o, iconClassName: s, ariaLabel: c, testId: l = "ellipsis-button" }, u) {
|
|
8
|
+
return /* @__PURE__ */ a("button", {
|
|
9
|
+
ref: u,
|
|
10
|
+
"data-testid": l,
|
|
11
11
|
type: "button",
|
|
12
|
-
onClick:
|
|
13
|
-
"aria-label":
|
|
14
|
-
className: e("p-1 rounded-md cursor-pointer",
|
|
15
|
-
children: /* @__PURE__ */
|
|
12
|
+
onClick: i,
|
|
13
|
+
"aria-label": c,
|
|
14
|
+
className: e("p-1 rounded-md cursor-pointer", n, "text-[var(--oh-muted)]", t, "flex items-center justify-center", o),
|
|
15
|
+
children: /* @__PURE__ */ a(r, { className: s ?? "w-4 h-4" })
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
18
|
//#endregion
|
|
19
|
-
export {
|
|
19
|
+
export { o as EllipsisButton };
|
|
20
20
|
|
|
21
21
|
//# sourceMappingURL=ellipsis-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ellipsis-button.js","names":[],"sources":["../../../../src/components/features/conversation-panel/ellipsis-button.tsx"],"sourcesContent":["import React from \"react\";\nimport ThreeDotsVerticalIcon from \"#/icons/three-dots-vertical.svg?react\";\nimport { cn } from \"#/utils/utils\";\nimport {
|
|
1
|
+
{"version":3,"file":"ellipsis-button.js","names":[],"sources":["../../../../src/components/features/conversation-panel/ellipsis-button.tsx"],"sourcesContent":["import React from \"react\";\nimport ThreeDotsVerticalIcon from \"#/icons/three-dots-vertical.svg?react\";\nimport { cn } from \"#/utils/utils\";\nimport {\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n} from \"#/utils/form-control-classes\";\n\ninterface EllipsisButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /**\n * Optional override classes applied to the button. Use this when a\n * caller needs to customize layout (e.g. translate, flex), not to\n * replace hover treatment which is intentionally shared.\n */\n className?: string;\n /** Icon box; default `w-4 h-4` (use `mobileTopBarIconClassName` in mobile top bars). */\n iconClassName?: string;\n ariaLabel?: string;\n /**\n * Override the default `ellipsis-button` test id. Most callers\n * should leave this unset; provide a custom id only when an\n * existing test suite already targets a specific id (e.g. the\n * `profile-menu-trigger` in LLM profile rows).\n */\n testId?: string;\n}\n\n/**\n * Standardized \"three vertical dots\" overflow trigger.\n *\n * Use this anywhere the chrome needs an inline ellipsis menu trigger\n * (conversation header, conversation cards in the side panel,\n * conversation tabs, settings rows, etc.) so that size, color, and\n * hover treatment stay consistent.\n *\n * The chat input area's overflow button uses its own pill-shaped\n * variant with a custom hover background — do NOT replace that one\n * with this component; it is intentionally different.\n */\nexport const EllipsisButton = React.forwardRef<\n HTMLButtonElement,\n EllipsisButtonProps\n>(function EllipsisButton(\n { onClick, className, iconClassName, ariaLabel, testId = \"ellipsis-button\" },\n ref,\n) {\n return (\n <button\n ref={ref}\n data-testid={testId}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"p-1 rounded-md cursor-pointer\",\n formControlTransitionClassName,\n \"text-[var(--oh-muted)]\",\n formControlMutedHoverClassName,\n \"flex items-center justify-center\",\n className,\n )}\n >\n <ThreeDotsVerticalIcon className={iconClassName ?? \"w-4 h-4\"} />\n </button>\n );\n});\n"],"mappings":";;;;;;AAwCA,IAAa,IAAiB,EAAM,WAGlC,SACA,EAAE,YAAS,cAAW,kBAAe,cAAW,YAAS,qBACzD,GACA;AACA,QACE,kBAAC,UAAD;EACO;EACL,eAAa;EACb,MAAK;EACI;EACT,cAAY;EACZ,WAAW,EACT,iCACA,GACA,0BACA,GACA,oCACA,EACD;YAED,kBAAC,GAAD,EAAuB,WAAW,KAAiB,WAAa,CAAA;EACzD,CAAA;EAEX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../utils/utils.cjs`),i=require(`../../../context/navigation-context.cjs`),a=require(`../../shared/buttons/styled-tooltip.cjs`),o=require(`../../../hooks/mutation/use-create-conversation.cjs`),s=require(`../../../ui/divider.cjs`),c=require(`../../../icons/repo.cjs`),l=require(`../../../hooks/use-is-creating-conversation.cjs`),u=require(`../../../hooks/mutation/use-local-workspaces-mutations.cjs`),d=require(`../../../hooks/query/use-local-workspaces.cjs`),f=require(`../../../hooks/query/use-resolved-workspaces.cjs`),p=require(`../../../utils/workspaces-compatibility.cjs`),
|
|
1
|
+
const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../utils/utils.cjs`),i=require(`../../../context/navigation-context.cjs`),a=require(`../../shared/buttons/styled-tooltip.cjs`),o=require(`../../../utils/dropdown-classes.cjs`),ee=require(`../../../hooks/mutation/use-create-conversation.cjs`),s=require(`../../../ui/divider.cjs`),c=require(`../../../icons/repo.cjs`),l=require(`../../../hooks/use-is-creating-conversation.cjs`),u=require(`../../../hooks/mutation/use-local-workspaces-mutations.cjs`),d=require(`../../../hooks/query/use-local-workspaces.cjs`),f=require(`../../../hooks/query/use-resolved-workspaces.cjs`),p=require(`../../../utils/workspaces-compatibility.cjs`),te=require(`../home/workspace-dropdown/folder-browser-modal.cjs`),m=require(`../home/workspace-dropdown/manage-workspaces-modal.cjs`),h=require(`./new-conversation-dropdown-styles.cjs`),g=require(`../../../hooks/use-popover-fixed-placement.cjs`);let _=require(`react`);_=e.__toESM(_,1);let v=require(`react/jsx-runtime`);function y({trigger:e,className:y,popoverClassName:b,popoverTestId:x=`new-conversation-popover`,useFixedPlacement:S=!1}){let{t:C}=t.useTranslation(`openhands`),{navigate:w}=i.useNavigation(),[T,E]=_.default.useState(!1),D=_.default.useRef(null),O=_.default.useRef(null),k=g.usePopoverFixedPlacement(O,{open:T,enabled:S}),{data:A,error:j}=d.useLocalWorkspaces(),M=A?.workspaceParents??[],{mutate:N}=u.useAddWorkspaces(),{mutate:P}=u.useRemoveWorkspace(),{mutate:F}=u.useAddWorkspaceParents(),{mutate:I}=u.useRemoveWorkspaceParent(),{workspaces:L}=f.useResolvedWorkspaces(),R=p.getWorkspacesUnsupportedMessage(j,C),[z,B]=_.default.useState(!1),[V,H]=_.default.useState(!1),{mutate:U,isPending:W}=ee.useCreateConversation(),G=l.useIsCreatingConversation(),K=W||G;_.default.useEffect(()=>{if(!T||z||V)return;let e=e=>{D.current&&!D.current.contains(e.target)&&E(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[T,z,V]),_.default.useEffect(()=>{if(!T||z||V)return;let e=e=>{e.key===`Escape`&&E(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[T,z,V]);let q=e=>{K||U({workingDir:e},{onSuccess:e=>{E(!1),w(`/conversations/${e.conversation_id}`)}})},J=o.dropdownMenuRowClassName,Y=_.default.useCallback(e=>{e.preventDefault(),e.stopPropagation()},[]),X=_.default.useCallback(()=>{E(e=>!e)},[]),Z=T&&(!S||k!==null),Q=!!R,ne=S&&k?{position:`fixed`,top:k.top,left:k.left,width:k.width}:void 0,$=(0,v.jsx)(`button`,{type:`button`,"data-testid":`add-workspaces-button`,disabled:Q,onMouseDown:Y,onClick:e=>{e.preventDefault(),e.stopPropagation(),!Q&&B(!0)},className:J,children:C(n.I18nKey.HOME$ADD_WORKSPACES)}),re=R?(0,v.jsx)(a.StyledTooltip,{content:R,placement:`top`,children:(0,v.jsx)(`span`,{className:`block`,children:$})}):$;return(0,v.jsxs)(`div`,{className:r.cn(!S&&`relative`,y),ref:D,children:[(0,v.jsx)(`span`,{ref:O,className:`inline-flex`,children:e({onClick:X,"aria-expanded":T,"aria-haspopup":`menu`,disabled:K})}),Z&&(0,v.jsxs)(`div`,{"data-testid":x,className:r.cn(h.NEW_CONVERSATION_DROPDOWN_SURFACE,!S&&r.cn(`absolute top-full mt-0`,b)),style:ne,children:[(0,v.jsxs)(`ul`,{className:r.cn(`max-h-[40vh] overflow-y-auto sm:max-h-[280px]`,o.dropdownMenuListClassName),children:[(0,v.jsx)(`li`,{children:(0,v.jsx)(`button`,{type:`button`,disabled:K,"data-testid":`launch-no-workspace`,onClick:()=>q(),className:J,children:(0,v.jsx)(`span`,{className:`text-[var(--oh-muted)]`,children:C(n.I18nKey.HOME$NO_WORKSPACE_OPTION)})})}),L.map(e=>(0,v.jsx)(`li`,{children:(0,v.jsxs)(`button`,{type:`button`,disabled:K,"data-testid":`launch-workspace`,"data-workspace-path":e.path,onClick:()=>q(e.path),className:J,children:[(0,v.jsx)(`span`,{className:o.dropdownMenuRowIconWrapperClassName,"aria-hidden":!0,children:(0,v.jsx)(c.default,{width:14,height:14})}),(0,v.jsx)(`span`,{className:`truncate`,children:e.name})]})},e.id))]}),(0,v.jsxs)(`div`,{className:r.cn(`flex flex-col`,o.dropdownMenuListClassName),"data-testid":`new-conversation-menu-footer`,children:[(0,v.jsx)(s.Divider,{inset:`menu`,testId:`new-conversation-menu-footer-divider`}),re,(L.length>0||M.length>0)&&(0,v.jsx)(`button`,{type:`button`,"data-testid":`manage-workspaces-button`,onMouseDown:Y,onClick:e=>{e.preventDefault(),e.stopPropagation(),H(!0)},className:J,children:C(n.I18nKey.HOME$MANAGE_WORKSPACES)})]})]}),(0,v.jsx)(te.FolderBrowserModal,{isOpen:z,onClose:()=>B(!1),onAdd:e=>N(e),onAddParent:e=>F(e)}),(0,v.jsx)(m.ManageWorkspacesModal,{isOpen:V,workspaces:L,workspaceParents:M,onClose:()=>H(!1),onRemove:e=>P(e),onRemoveParent:e=>I(e)})]})}exports.LocalNewConversationMenu=y;
|
|
2
2
|
//# sourceMappingURL=local-new-conversation-menu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-new-conversation-menu.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/local-new-conversation-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useIsCreatingConversation } from \"#/hooks/use-is-creating-conversation\";\nimport {\n useAddWorkspaces,\n useAddWorkspaceParents,\n useRemoveWorkspace,\n useRemoveWorkspaceParent,\n} from \"#/hooks/mutation/use-local-workspaces-mutations\";\nimport { useLocalWorkspaces } from \"#/hooks/query/use-local-workspaces\";\nimport { useResolvedWorkspaces } from \"#/hooks/query/use-resolved-workspaces\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { getWorkspacesUnsupportedMessage } from \"#/utils/workspaces-compatibility\";\nimport RepoIcon from \"#/icons/repo.svg?react\";\n\nimport { FolderBrowserModal } from \"#/components/features/home/workspace-dropdown/folder-browser-modal\";\nimport { ManageWorkspacesModal } from \"#/components/features/home/workspace-dropdown/manage-workspaces-modal\";\n\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { Divider } from \"#/ui/divider\";\nimport { NEW_CONVERSATION_DROPDOWN_SURFACE } from \"./new-conversation-dropdown-styles\";\nimport { usePopoverFixedPlacement } from \"#/hooks/use-popover-fixed-placement\";\n\nexport type LocalNewConversationMenuTriggerProps = {\n onClick: () => void;\n \"aria-expanded\": boolean;\n \"aria-haspopup\": \"menu\";\n disabled?: boolean;\n};\n\nexport interface LocalNewConversationMenuProps {\n trigger: (props: LocalNewConversationMenuTriggerProps) => React.ReactNode;\n /** Root wrapper class (e.g. `relative` + alignment in header row) */\n className?: string;\n /** Panel positioning / dimensions when using absolute placement (sidebar) */\n popoverClassName: string;\n /** Optional test id for the popover surface */\n popoverTestId?: string;\n /**\n * Use `position: fixed` from the trigger rect so the menu is not clipped by\n * sidebar overflow (conversation panel header).\n */\n useFixedPlacement?: boolean;\n}\n\n/**\n * Workspace/repo picker + launch flow for local agent-server backends.\n * Shared by the sidebar \"+ New conversation\" control and the conversation\n * panel \"new thread folder\" control.\n */\nexport function LocalNewConversationMenu({\n trigger,\n className,\n popoverClassName,\n popoverTestId = \"new-conversation-popover\",\n useFixedPlacement = false,\n}: LocalNewConversationMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const { navigate } = useNavigation();\n\n const [open, setOpen] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerWrapRef = React.useRef<HTMLSpanElement>(null);\n const fixedBox = usePopoverFixedPlacement(triggerWrapRef, {\n open,\n enabled: useFixedPlacement,\n });\n\n const { data: workspacesData, error: workspacesError } = useLocalWorkspaces();\n const workspaceParents = workspacesData?.workspaceParents ?? [];\n const { mutate: addWorkspaces } = useAddWorkspaces();\n const { mutate: removeWorkspace } = useRemoveWorkspace();\n const { mutate: addWorkspaceParents } = useAddWorkspaceParents();\n const { mutate: removeWorkspaceParent } = useRemoveWorkspaceParent();\n const { workspaces } = useResolvedWorkspaces();\n const workspacesUnsupportedMessage = getWorkspacesUnsupportedMessage(\n workspacesError,\n t,\n );\n const [browserOpen, setBrowserOpen] = React.useState(false);\n const [manageOpen, setManageOpen] = React.useState(false);\n\n const { mutate: createConversation, isPending } = useCreateConversation();\n const isCreatingElsewhere = useIsCreatingConversation();\n const isCreating = isPending || isCreatingElsewhere;\n\n React.useEffect(() => {\n if (!open || browserOpen || manageOpen) return undefined;\n const onDown = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, browserOpen, manageOpen]);\n\n React.useEffect(() => {\n if (!open || browserOpen || manageOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [open, browserOpen, manageOpen]);\n\n const launch = (workingDir?: string) => {\n if (isCreating) return;\n createConversation(\n { workingDir },\n {\n onSuccess: (data) => {\n setOpen(false);\n navigate(`/conversations/${data.conversation_id}`);\n },\n },\n );\n };\n\n const itemClass = cn(\n \"flex w-full cursor-pointer items-center gap-2 rounded px-2 py-2 text-left text-sm text-white\",\n \"font-normal transition-colors hover:bg-[var(--oh-interactive-hover)]\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n );\n\n const keepPopoverOpenOnMouseDown = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n },\n [],\n );\n\n const toggleOpen = React.useCallback(() => {\n setOpen((o) => !o);\n }, []);\n\n const showPopover = open && (!useFixedPlacement || fixedBox !== null);\n const workspaceActionsDisabled = Boolean(workspacesUnsupportedMessage);\n\n const fixedStyle: React.CSSProperties | undefined =\n useFixedPlacement && fixedBox\n ? {\n position: \"fixed\",\n top: fixedBox.top,\n left: fixedBox.left,\n width: fixedBox.width,\n }\n : undefined;\n\n const addWorkspacesButton = (\n <button\n type=\"button\"\n data-testid=\"add-workspaces-button\"\n disabled={workspaceActionsDisabled}\n onMouseDown={keepPopoverOpenOnMouseDown}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (workspaceActionsDisabled) return;\n setBrowserOpen(true);\n }}\n className={itemClass}\n >\n {t(I18nKey.HOME$ADD_WORKSPACES)}\n </button>\n );\n\n const addWorkspacesControl = workspacesUnsupportedMessage ? (\n <StyledTooltip content={workspacesUnsupportedMessage} placement=\"top\">\n <span className=\"block\">{addWorkspacesButton}</span>\n </StyledTooltip>\n ) : (\n addWorkspacesButton\n );\n\n return (\n <div\n className={cn(!useFixedPlacement && \"relative\", className)}\n ref={popoverRef}\n >\n <span ref={triggerWrapRef} className=\"inline-flex\">\n {trigger({\n onClick: toggleOpen,\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n disabled: isCreating,\n })}\n </span>\n\n {showPopover && (\n <div\n data-testid={popoverTestId}\n className={cn(\n NEW_CONVERSATION_DROPDOWN_SURFACE,\n !useFixedPlacement &&\n cn(\"absolute top-full mt-0\", popoverClassName),\n )}\n style={fixedStyle}\n >\n <ul className=\"flex max-h-[40vh] flex-col overflow-y-auto sm:max-h-[280px]\">\n <li>\n <button\n type=\"button\"\n disabled={isCreating}\n data-testid=\"launch-no-workspace\"\n onClick={() => launch()}\n className={itemClass}\n >\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.HOME$NO_WORKSPACE_OPTION)}\n </span>\n </button>\n </li>\n {workspaces.map((w) => (\n <li key={w.id}>\n <button\n type=\"button\"\n disabled={isCreating}\n data-testid=\"launch-workspace\"\n data-workspace-path={w.path}\n onClick={() => launch(w.path)}\n className={itemClass}\n >\n <RepoIcon width={14} height={14} className=\"shrink-0\" />\n <span className=\"truncate\">{w.name}</span>\n </button>\n </li>\n ))}\n </ul>\n\n <div\n className=\"flex flex-col\"\n data-testid=\"new-conversation-menu-footer\"\n >\n <Divider\n inset=\"menu\"\n testId=\"new-conversation-menu-footer-divider\"\n />\n {addWorkspacesControl}\n {(workspaces.length > 0 || workspaceParents.length > 0) && (\n <button\n type=\"button\"\n data-testid=\"manage-workspaces-button\"\n onMouseDown={keepPopoverOpenOnMouseDown}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setManageOpen(true);\n }}\n className={itemClass}\n >\n {t(I18nKey.HOME$MANAGE_WORKSPACES)}\n </button>\n )}\n </div>\n </div>\n )}\n\n <FolderBrowserModal\n isOpen={browserOpen}\n onClose={() => setBrowserOpen(false)}\n onAdd={(items) => addWorkspaces(items)}\n onAddParent={(items) => addWorkspaceParents(items)}\n />\n\n <ManageWorkspacesModal\n isOpen={manageOpen}\n workspaces={workspaces}\n workspaceParents={workspaceParents}\n onClose={() => setManageOpen(false)}\n onRemove={(path) => removeWorkspace(path)}\n onRemoveParent={(path) => removeWorkspaceParent(path)}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local-new-conversation-menu.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/local-new-conversation-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useIsCreatingConversation } from \"#/hooks/use-is-creating-conversation\";\nimport {\n useAddWorkspaces,\n useAddWorkspaceParents,\n useRemoveWorkspace,\n useRemoveWorkspaceParent,\n} from \"#/hooks/mutation/use-local-workspaces-mutations\";\nimport { useLocalWorkspaces } from \"#/hooks/query/use-local-workspaces\";\nimport { useResolvedWorkspaces } from \"#/hooks/query/use-resolved-workspaces\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownMenuRowClassName,\n dropdownMenuListClassName,\n dropdownMenuRowIconWrapperClassName,\n} from \"#/utils/dropdown-classes\";\nimport { getWorkspacesUnsupportedMessage } from \"#/utils/workspaces-compatibility\";\nimport RepoIcon from \"#/icons/repo.svg?react\";\n\nimport { FolderBrowserModal } from \"#/components/features/home/workspace-dropdown/folder-browser-modal\";\nimport { ManageWorkspacesModal } from \"#/components/features/home/workspace-dropdown/manage-workspaces-modal\";\n\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { Divider } from \"#/ui/divider\";\nimport { NEW_CONVERSATION_DROPDOWN_SURFACE } from \"./new-conversation-dropdown-styles\";\nimport { usePopoverFixedPlacement } from \"#/hooks/use-popover-fixed-placement\";\n\nexport type LocalNewConversationMenuTriggerProps = {\n onClick: () => void;\n \"aria-expanded\": boolean;\n \"aria-haspopup\": \"menu\";\n disabled?: boolean;\n};\n\nexport interface LocalNewConversationMenuProps {\n trigger: (props: LocalNewConversationMenuTriggerProps) => React.ReactNode;\n /** Root wrapper class (e.g. `relative` + alignment in header row) */\n className?: string;\n /** Panel positioning / dimensions when using absolute placement (sidebar) */\n popoverClassName: string;\n /** Optional test id for the popover surface */\n popoverTestId?: string;\n /**\n * Use `position: fixed` from the trigger rect so the menu is not clipped by\n * sidebar overflow (conversation panel header).\n */\n useFixedPlacement?: boolean;\n}\n\n/**\n * Workspace/repo picker + launch flow for local agent-server backends.\n * Shared by the sidebar \"+ New conversation\" control and the conversation\n * panel \"new thread folder\" control.\n */\nexport function LocalNewConversationMenu({\n trigger,\n className,\n popoverClassName,\n popoverTestId = \"new-conversation-popover\",\n useFixedPlacement = false,\n}: LocalNewConversationMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const { navigate } = useNavigation();\n\n const [open, setOpen] = React.useState(false);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerWrapRef = React.useRef<HTMLSpanElement>(null);\n const fixedBox = usePopoverFixedPlacement(triggerWrapRef, {\n open,\n enabled: useFixedPlacement,\n });\n\n const { data: workspacesData, error: workspacesError } = useLocalWorkspaces();\n const workspaceParents = workspacesData?.workspaceParents ?? [];\n const { mutate: addWorkspaces } = useAddWorkspaces();\n const { mutate: removeWorkspace } = useRemoveWorkspace();\n const { mutate: addWorkspaceParents } = useAddWorkspaceParents();\n const { mutate: removeWorkspaceParent } = useRemoveWorkspaceParent();\n const { workspaces } = useResolvedWorkspaces();\n const workspacesUnsupportedMessage = getWorkspacesUnsupportedMessage(\n workspacesError,\n t,\n );\n const [browserOpen, setBrowserOpen] = React.useState(false);\n const [manageOpen, setManageOpen] = React.useState(false);\n\n const { mutate: createConversation, isPending } = useCreateConversation();\n const isCreatingElsewhere = useIsCreatingConversation();\n const isCreating = isPending || isCreatingElsewhere;\n\n React.useEffect(() => {\n if (!open || browserOpen || manageOpen) return undefined;\n const onDown = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, browserOpen, manageOpen]);\n\n React.useEffect(() => {\n if (!open || browserOpen || manageOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [open, browserOpen, manageOpen]);\n\n const launch = (workingDir?: string) => {\n if (isCreating) return;\n createConversation(\n { workingDir },\n {\n onSuccess: (data) => {\n setOpen(false);\n navigate(`/conversations/${data.conversation_id}`);\n },\n },\n );\n };\n\n const itemClass = dropdownMenuRowClassName;\n\n const keepPopoverOpenOnMouseDown = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n },\n [],\n );\n\n const toggleOpen = React.useCallback(() => {\n setOpen((o) => !o);\n }, []);\n\n const showPopover = open && (!useFixedPlacement || fixedBox !== null);\n const workspaceActionsDisabled = Boolean(workspacesUnsupportedMessage);\n\n const fixedStyle: React.CSSProperties | undefined =\n useFixedPlacement && fixedBox\n ? {\n position: \"fixed\",\n top: fixedBox.top,\n left: fixedBox.left,\n width: fixedBox.width,\n }\n : undefined;\n\n const addWorkspacesButton = (\n <button\n type=\"button\"\n data-testid=\"add-workspaces-button\"\n disabled={workspaceActionsDisabled}\n onMouseDown={keepPopoverOpenOnMouseDown}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (workspaceActionsDisabled) return;\n setBrowserOpen(true);\n }}\n className={itemClass}\n >\n {t(I18nKey.HOME$ADD_WORKSPACES)}\n </button>\n );\n\n const addWorkspacesControl = workspacesUnsupportedMessage ? (\n <StyledTooltip content={workspacesUnsupportedMessage} placement=\"top\">\n <span className=\"block\">{addWorkspacesButton}</span>\n </StyledTooltip>\n ) : (\n addWorkspacesButton\n );\n\n return (\n <div\n className={cn(!useFixedPlacement && \"relative\", className)}\n ref={popoverRef}\n >\n <span ref={triggerWrapRef} className=\"inline-flex\">\n {trigger({\n onClick: toggleOpen,\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n disabled: isCreating,\n })}\n </span>\n\n {showPopover && (\n <div\n data-testid={popoverTestId}\n className={cn(\n NEW_CONVERSATION_DROPDOWN_SURFACE,\n !useFixedPlacement &&\n cn(\"absolute top-full mt-0\", popoverClassName),\n )}\n style={fixedStyle}\n >\n <ul\n className={cn(\n \"max-h-[40vh] overflow-y-auto sm:max-h-[280px]\",\n dropdownMenuListClassName,\n )}\n >\n <li>\n <button\n type=\"button\"\n disabled={isCreating}\n data-testid=\"launch-no-workspace\"\n onClick={() => launch()}\n className={itemClass}\n >\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.HOME$NO_WORKSPACE_OPTION)}\n </span>\n </button>\n </li>\n {workspaces.map((w) => (\n <li key={w.id}>\n <button\n type=\"button\"\n disabled={isCreating}\n data-testid=\"launch-workspace\"\n data-workspace-path={w.path}\n onClick={() => launch(w.path)}\n className={itemClass}\n >\n <span\n className={dropdownMenuRowIconWrapperClassName}\n aria-hidden\n >\n <RepoIcon width={14} height={14} />\n </span>\n <span className=\"truncate\">{w.name}</span>\n </button>\n </li>\n ))}\n </ul>\n\n <div\n className={cn(\"flex flex-col\", dropdownMenuListClassName)}\n data-testid=\"new-conversation-menu-footer\"\n >\n <Divider\n inset=\"menu\"\n testId=\"new-conversation-menu-footer-divider\"\n />\n {addWorkspacesControl}\n {(workspaces.length > 0 || workspaceParents.length > 0) && (\n <button\n type=\"button\"\n data-testid=\"manage-workspaces-button\"\n onMouseDown={keepPopoverOpenOnMouseDown}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setManageOpen(true);\n }}\n className={itemClass}\n >\n {t(I18nKey.HOME$MANAGE_WORKSPACES)}\n </button>\n )}\n </div>\n </div>\n )}\n\n <FolderBrowserModal\n isOpen={browserOpen}\n onClose={() => setBrowserOpen(false)}\n onAdd={(items) => addWorkspaces(items)}\n onAddParent={(items) => addWorkspaceParents(items)}\n />\n\n <ManageWorkspacesModal\n isOpen={manageOpen}\n workspaces={workspaces}\n workspaceParents={workspaceParents}\n onClose={() => setManageOpen(false)}\n onRemove={(path) => removeWorkspace(path)}\n onRemoveParent={(path) => removeWorkspaceParent(path)}\n />\n </div>\n );\n}\n"],"mappings":"unCA2DA,SAAgB,EAAyB,CACvC,UACA,YACA,mBACA,gBAAgB,2BAChB,oBAAoB,IACY,CAChC,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,YAAa,EAAA,eAAe,CAE9B,CAAC,EAAM,GAAW,EAAA,QAAM,SAAS,GAAM,CACvC,EAAa,EAAA,QAAM,OAAuB,KAAK,CAC/C,EAAiB,EAAA,QAAM,OAAwB,KAAK,CACpD,EAAW,EAAA,yBAAyB,EAAgB,CACxD,OACA,QAAS,EACV,CAAC,CAEI,CAAE,KAAM,EAAgB,MAAO,GAAoB,EAAA,oBAAoB,CACvE,EAAmB,GAAgB,kBAAoB,EAAE,CACzD,CAAE,OAAQ,GAAkB,EAAA,kBAAkB,CAC9C,CAAE,OAAQ,GAAoB,EAAA,oBAAoB,CAClD,CAAE,OAAQ,GAAwB,EAAA,wBAAwB,CAC1D,CAAE,OAAQ,GAA0B,EAAA,0BAA0B,CAC9D,CAAE,cAAe,EAAA,uBAAuB,CACxC,EAA+B,EAAA,gCACnC,EACA,EACD,CACK,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,GAAM,CACrD,CAAC,EAAY,GAAiB,EAAA,QAAM,SAAS,GAAM,CAEnD,CAAE,OAAQ,EAAoB,aAAc,GAAA,uBAAuB,CACnE,EAAsB,EAAA,2BAA2B,CACjD,EAAa,GAAa,EAEhC,EAAA,QAAM,cAAgB,CACpB,GAAI,CAAC,GAAQ,GAAe,EAAY,OACxC,IAAM,EAAU,GAAkB,CAE9B,EAAW,SACX,CAAC,EAAW,QAAQ,SAAS,EAAE,OAAe,EAE9C,EAAQ,GAAM,EAIlB,OADA,SAAS,iBAAiB,YAAa,EAAO,KACjC,SAAS,oBAAoB,YAAa,EAAO,EAC7D,CAAC,EAAM,EAAa,EAAW,CAAC,CAEnC,EAAA,QAAM,cAAgB,CACpB,GAAI,CAAC,GAAQ,GAAe,EAAY,OACxC,IAAM,EAAa,GAAyB,CACtC,EAAM,MAAQ,UAChB,EAAQ,GAAM,EAIlB,OADA,OAAO,iBAAiB,UAAW,EAAU,KAChC,OAAO,oBAAoB,UAAW,EAAU,EAC5D,CAAC,EAAM,EAAa,EAAW,CAAC,CAEnC,IAAM,EAAU,GAAwB,CAClC,GACJ,EACE,CAAE,aAAY,CACd,CACE,UAAY,GAAS,CACnB,EAAQ,GAAM,CACd,EAAS,kBAAkB,EAAK,kBAAkB,EAErD,CACF,EAGG,EAAY,EAAA,yBAEZ,EAA6B,EAAA,QAAM,YACtC,GAA+C,CAC9C,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,EAEzB,EAAE,CACH,CAEK,EAAa,EAAA,QAAM,gBAAkB,CACzC,EAAS,GAAM,CAAC,EAAE,EACjB,EAAE,CAAC,CAEA,EAAc,IAAS,CAAC,GAAqB,IAAa,MAC1D,EAA2B,EAAQ,EAEnC,GACJ,GAAqB,EACjB,CACE,SAAU,QACV,IAAK,EAAS,IACd,KAAM,EAAS,KACf,MAAO,EAAS,MACjB,CACD,IAAA,GAEA,GACJ,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,cAAY,wBACZ,SAAU,EACV,YAAa,EACb,QAAU,GAAU,CAClB,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,CACnB,IACJ,EAAe,GAAK,EAEtB,UAAW,WAEV,EAAE,EAAA,QAAQ,oBAAoB,CACxB,CAAA,CAGL,GAAuB,GAC3B,EAAA,EAAA,KAAC,EAAA,cAAD,CAAe,QAAS,EAA8B,UAAU,gBAC9D,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iBAAS,EAA2B,CAAA,CACtC,CAAA,CAEhB,EAGF,OACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GAAG,CAAC,GAAqB,WAAY,EAAU,CAC1D,IAAK,WAFP,EAIE,EAAA,EAAA,KAAC,OAAD,CAAM,IAAK,EAAgB,UAAU,uBAClC,EAAQ,CACP,QAAS,EACT,gBAAiB,EACjB,gBAAiB,OACjB,SAAU,EACX,CAAC,CACG,CAAA,CAEN,IACC,EAAA,EAAA,MAAC,MAAD,CACE,cAAa,EACb,UAAW,EAAA,GACT,EAAA,kCACA,CAAC,GACC,EAAA,GAAG,yBAA0B,EAAiB,CACjD,CACD,MAAO,YAPT,EASE,EAAA,EAAA,MAAC,KAAD,CACE,UAAW,EAAA,GACT,gDACA,EAAA,0BACD,UAJH,EAME,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,SAAU,EACV,cAAY,sBACZ,YAAe,GAAQ,CACvB,UAAW,YAEX,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kCACb,EAAE,EAAA,QAAQ,yBAAyB,CAC/B,CAAA,CACA,CAAA,CACN,CAAA,CACJ,EAAW,IAAK,IACf,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,SAAU,EACV,cAAY,mBACZ,sBAAqB,EAAE,KACvB,YAAe,EAAO,EAAE,KAAK,CAC7B,UAAW,WANb,EAQE,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,EAAA,oCACX,cAAA,aAEA,EAAA,EAAA,KAAC,EAAA,QAAD,CAAU,MAAO,GAAI,OAAQ,GAAM,CAAA,CAC9B,CAAA,EACP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oBAAY,EAAE,KAAY,CAAA,CACnC,GACN,CAjBI,EAAE,GAiBN,CACL,CACC,IAEL,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GAAG,gBAAiB,EAAA,0BAA0B,CACzD,cAAY,wCAFd,EAIE,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,MAAM,OACN,OAAO,uCACP,CAAA,CACD,IACC,EAAW,OAAS,GAAK,EAAiB,OAAS,KACnD,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,cAAY,2BACZ,YAAa,EACb,QAAU,GAAU,CAClB,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,CACvB,EAAc,GAAK,EAErB,UAAW,WAEV,EAAE,EAAA,QAAQ,uBAAuB,CAC3B,CAAA,CAEP,GACF,IAGR,EAAA,EAAA,KAAC,GAAA,mBAAD,CACE,OAAQ,EACR,YAAe,EAAe,GAAM,CACpC,MAAQ,GAAU,EAAc,EAAM,CACtC,YAAc,GAAU,EAAoB,EAAM,CAClD,CAAA,EAEF,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,OAAQ,EACI,aACM,mBAClB,YAAe,EAAc,GAAM,CACnC,SAAW,GAAS,EAAgB,EAAK,CACzC,eAAiB,GAAS,EAAsB,EAAK,CACrD,CAAA,CACE"}
|
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
2
|
import { I18nKey as t } from "../../../i18n/declaration.js";
|
|
3
3
|
import { cn as n } from "../../../utils/utils.js";
|
|
4
|
-
import { useNavigation as
|
|
5
|
-
import { StyledTooltip as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
import
|
|
4
|
+
import { useNavigation as ee } from "../../../context/navigation-context.js";
|
|
5
|
+
import { StyledTooltip as r } from "../../shared/buttons/styled-tooltip.js";
|
|
6
|
+
import { dropdownMenuListClassName as i, dropdownMenuRowClassName as te, dropdownMenuRowIconWrapperClassName as ne } from "../../../utils/dropdown-classes.js";
|
|
7
|
+
import { useCreateConversation as a } from "../../../hooks/mutation/use-create-conversation.js";
|
|
8
|
+
import { Divider as o } from "../../../ui/divider.js";
|
|
9
|
+
import s from "../../../icons/repo.js";
|
|
10
|
+
import { useIsCreatingConversation as c } from "../../../hooks/use-is-creating-conversation.js";
|
|
11
|
+
import { useAddWorkspaceParents as l, useAddWorkspaces as u, useRemoveWorkspace as d, useRemoveWorkspaceParent as f } from "../../../hooks/mutation/use-local-workspaces-mutations.js";
|
|
12
|
+
import { useLocalWorkspaces as p } from "../../../hooks/query/use-local-workspaces.js";
|
|
13
|
+
import { useResolvedWorkspaces as re } from "../../../hooks/query/use-resolved-workspaces.js";
|
|
14
|
+
import { getWorkspacesUnsupportedMessage as m } from "../../../utils/workspaces-compatibility.js";
|
|
15
|
+
import { FolderBrowserModal as h } from "../home/workspace-dropdown/folder-browser-modal.js";
|
|
16
|
+
import { ManageWorkspacesModal as g } from "../home/workspace-dropdown/manage-workspaces-modal.js";
|
|
17
|
+
import { NEW_CONVERSATION_DROPDOWN_SURFACE as _ } from "./new-conversation-dropdown-styles.js";
|
|
18
|
+
import { usePopoverFixedPlacement as v } from "../../../hooks/use-popover-fixed-placement.js";
|
|
19
|
+
import y from "react";
|
|
20
|
+
import { jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
20
21
|
//#region src/components/features/conversation-panel/local-new-conversation-menu.tsx
|
|
21
|
-
function
|
|
22
|
-
let { t: T } = e("openhands"), { navigate: E } =
|
|
22
|
+
function S({ trigger: S, className: ie, popoverClassName: ae, popoverTestId: C = "new-conversation-popover", useFixedPlacement: w = !1 }) {
|
|
23
|
+
let { t: T } = e("openhands"), { navigate: E } = ee(), [D, O] = y.useState(!1), k = y.useRef(null), A = y.useRef(null), j = v(A, {
|
|
23
24
|
open: D,
|
|
24
25
|
enabled: w
|
|
25
|
-
}), { data: M, error: N } =
|
|
26
|
-
|
|
26
|
+
}), { data: M, error: N } = p(), P = M?.workspaceParents ?? [], { mutate: F } = u(), { mutate: I } = d(), { mutate: L } = l(), { mutate: R } = f(), { workspaces: z } = re(), B = m(N, T), [V, H] = y.useState(!1), [U, W] = y.useState(!1), { mutate: G, isPending: K } = a(), q = c(), J = K || q;
|
|
27
|
+
y.useEffect(() => {
|
|
27
28
|
if (!D || V || U) return;
|
|
28
29
|
let e = (e) => {
|
|
29
30
|
k.current && !k.current.contains(e.target) && O(!1);
|
|
@@ -33,7 +34,7 @@ function b({ trigger: b, className: x, popoverClassName: S, popoverTestId: C = "
|
|
|
33
34
|
D,
|
|
34
35
|
V,
|
|
35
36
|
U
|
|
36
|
-
]),
|
|
37
|
+
]), y.useEffect(() => {
|
|
37
38
|
if (!D || V || U) return;
|
|
38
39
|
let e = (e) => {
|
|
39
40
|
e.key === "Escape" && O(!1);
|
|
@@ -48,16 +49,16 @@ function b({ trigger: b, className: x, popoverClassName: S, popoverTestId: C = "
|
|
|
48
49
|
J || G({ workingDir: e }, { onSuccess: (e) => {
|
|
49
50
|
O(!1), E(`/conversations/${e.conversation_id}`);
|
|
50
51
|
} });
|
|
51
|
-
}, X =
|
|
52
|
+
}, X = te, Z = y.useCallback((e) => {
|
|
52
53
|
e.preventDefault(), e.stopPropagation();
|
|
53
|
-
}, []),
|
|
54
|
+
}, []), oe = y.useCallback(() => {
|
|
54
55
|
O((e) => !e);
|
|
55
|
-
}, []),
|
|
56
|
+
}, []), se = D && (!w || j !== null), Q = !!B, ce = w && j ? {
|
|
56
57
|
position: "fixed",
|
|
57
58
|
top: j.top,
|
|
58
59
|
left: j.left,
|
|
59
60
|
width: j.width
|
|
60
|
-
} : void 0, $ = /* @__PURE__ */
|
|
61
|
+
} : void 0, $ = /* @__PURE__ */ b("button", {
|
|
61
62
|
type: "button",
|
|
62
63
|
"data-testid": "add-workspaces-button",
|
|
63
64
|
disabled: Q,
|
|
@@ -67,70 +68,73 @@ function b({ trigger: b, className: x, popoverClassName: S, popoverTestId: C = "
|
|
|
67
68
|
},
|
|
68
69
|
className: X,
|
|
69
70
|
children: T(t.HOME$ADD_WORKSPACES)
|
|
70
|
-
}),
|
|
71
|
+
}), le = B ? /* @__PURE__ */ b(r, {
|
|
71
72
|
content: B,
|
|
72
73
|
placement: "top",
|
|
73
|
-
children: /* @__PURE__ */
|
|
74
|
+
children: /* @__PURE__ */ b("span", {
|
|
74
75
|
className: "block",
|
|
75
76
|
children: $
|
|
76
77
|
})
|
|
77
78
|
}) : $;
|
|
78
|
-
return /* @__PURE__ */
|
|
79
|
-
className: n(!w && "relative",
|
|
79
|
+
return /* @__PURE__ */ x("div", {
|
|
80
|
+
className: n(!w && "relative", ie),
|
|
80
81
|
ref: k,
|
|
81
82
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
+
/* @__PURE__ */ b("span", {
|
|
83
84
|
ref: A,
|
|
84
85
|
className: "inline-flex",
|
|
85
|
-
children:
|
|
86
|
-
onClick:
|
|
86
|
+
children: S({
|
|
87
|
+
onClick: oe,
|
|
87
88
|
"aria-expanded": D,
|
|
88
89
|
"aria-haspopup": "menu",
|
|
89
90
|
disabled: J
|
|
90
91
|
})
|
|
91
92
|
}),
|
|
92
|
-
|
|
93
|
+
se && /* @__PURE__ */ x("div", {
|
|
93
94
|
"data-testid": C,
|
|
94
|
-
className: n(
|
|
95
|
-
style:
|
|
96
|
-
children: [/* @__PURE__ */
|
|
97
|
-
className: "
|
|
98
|
-
children: [/* @__PURE__ */
|
|
95
|
+
className: n(_, !w && n("absolute top-full mt-0", ae)),
|
|
96
|
+
style: ce,
|
|
97
|
+
children: [/* @__PURE__ */ x("ul", {
|
|
98
|
+
className: n("max-h-[40vh] overflow-y-auto sm:max-h-[280px]", i),
|
|
99
|
+
children: [/* @__PURE__ */ b("li", { children: /* @__PURE__ */ b("button", {
|
|
99
100
|
type: "button",
|
|
100
101
|
disabled: J,
|
|
101
102
|
"data-testid": "launch-no-workspace",
|
|
102
103
|
onClick: () => Y(),
|
|
103
104
|
className: X,
|
|
104
|
-
children: /* @__PURE__ */
|
|
105
|
+
children: /* @__PURE__ */ b("span", {
|
|
105
106
|
className: "text-[var(--oh-muted)]",
|
|
106
107
|
children: T(t.HOME$NO_WORKSPACE_OPTION)
|
|
107
108
|
})
|
|
108
|
-
}) }), z.map((e) => /* @__PURE__ */
|
|
109
|
+
}) }), z.map((e) => /* @__PURE__ */ b("li", { children: /* @__PURE__ */ x("button", {
|
|
109
110
|
type: "button",
|
|
110
111
|
disabled: J,
|
|
111
112
|
"data-testid": "launch-workspace",
|
|
112
113
|
"data-workspace-path": e.path,
|
|
113
114
|
onClick: () => Y(e.path),
|
|
114
115
|
className: X,
|
|
115
|
-
children: [/* @__PURE__ */
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
children: [/* @__PURE__ */ b("span", {
|
|
117
|
+
className: ne,
|
|
118
|
+
"aria-hidden": !0,
|
|
119
|
+
children: /* @__PURE__ */ b(s, {
|
|
120
|
+
width: 14,
|
|
121
|
+
height: 14
|
|
122
|
+
})
|
|
123
|
+
}), /* @__PURE__ */ b("span", {
|
|
120
124
|
className: "truncate",
|
|
121
125
|
children: e.name
|
|
122
126
|
})]
|
|
123
127
|
}) }, e.id))]
|
|
124
|
-
}), /* @__PURE__ */
|
|
125
|
-
className: "flex flex-col",
|
|
128
|
+
}), /* @__PURE__ */ x("div", {
|
|
129
|
+
className: n("flex flex-col", i),
|
|
126
130
|
"data-testid": "new-conversation-menu-footer",
|
|
127
131
|
children: [
|
|
128
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ b(o, {
|
|
129
133
|
inset: "menu",
|
|
130
134
|
testId: "new-conversation-menu-footer-divider"
|
|
131
135
|
}),
|
|
132
|
-
|
|
133
|
-
(z.length > 0 || P.length > 0) && /* @__PURE__ */
|
|
136
|
+
le,
|
|
137
|
+
(z.length > 0 || P.length > 0) && /* @__PURE__ */ b("button", {
|
|
134
138
|
type: "button",
|
|
135
139
|
"data-testid": "manage-workspaces-button",
|
|
136
140
|
onMouseDown: Z,
|
|
@@ -143,13 +147,13 @@ function b({ trigger: b, className: x, popoverClassName: S, popoverTestId: C = "
|
|
|
143
147
|
]
|
|
144
148
|
})]
|
|
145
149
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ b(h, {
|
|
147
151
|
isOpen: V,
|
|
148
152
|
onClose: () => H(!1),
|
|
149
153
|
onAdd: (e) => F(e),
|
|
150
154
|
onAddParent: (e) => L(e)
|
|
151
155
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ b(g, {
|
|
153
157
|
isOpen: U,
|
|
154
158
|
workspaces: z,
|
|
155
159
|
workspaceParents: P,
|
|
@@ -161,6 +165,6 @@ function b({ trigger: b, className: x, popoverClassName: S, popoverTestId: C = "
|
|
|
161
165
|
});
|
|
162
166
|
}
|
|
163
167
|
//#endregion
|
|
164
|
-
export {
|
|
168
|
+
export { S as LocalNewConversationMenu };
|
|
165
169
|
|
|
166
170
|
//# sourceMappingURL=local-new-conversation-menu.js.map
|