@openhands/agent-canvas 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
- package/build/assets/active-backend-context-IqOjobNK.js +2 -0
- package/build/assets/{agent-context-settings-Bno1nwPL.js → agent-context-settings-DMrObcIS.js} +1 -1
- package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
- package/build/assets/{agent-settings-h8hQz-IU.js → agent-settings-BJVk92PU.js} +1 -1
- package/build/assets/agent-settings-COfJsQ1d.js +1 -0
- package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
- package/build/assets/{api-key-entry-screen-Qsb83VX1.js → api-key-entry-screen-D8Fade_-.js} +1 -1
- package/build/assets/app-settings-CpyGB3AT.js +1 -0
- package/build/assets/{automation-detail-7LkL91j9.js → automation-detail-B-jQ39Mm.js} +1 -1
- package/build/assets/{automation-export-U2QNyNy6.js → automation-export-B1dywoqk.js} +1 -1
- package/build/assets/{automation-setup-route-Bel9_Lue.js → automation-setup-route-C-bWUZBi.js} +1 -1
- package/build/assets/{automation-templates-CRLDssaI.js → automation-templates-DgpCGOJV.js} +1 -1
- package/build/assets/{automations-list-B2iV3ZKW.js → automations-list-DnMxlxsL.js} +1 -1
- package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
- package/build/assets/backend-form-modal-DiVrD4Cm.js +1 -0
- package/build/assets/{backend-synced-settings-badge-DB4717Iu.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
- package/build/assets/{badge-yR53enbU.js → badge-CpYmcVZV.js} +1 -1
- package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
- package/build/assets/bot-BQZx8e2i.js +1 -0
- package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
- package/build/assets/browser-B9AbV6kG.js +7 -0
- package/build/assets/{browser-tab-A94o33Vn.js → browser-tab-zAY12m_i.js} +1 -1
- package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
- package/build/assets/check-WAFXrrs_.js +1 -0
- package/build/assets/chevron-down-CifNWzme.js +1 -0
- package/build/assets/circle-check-CtnimJa8.js +1 -0
- package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-CBQdPZl_.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
- package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
- package/build/assets/{command-menu-PsRXVBz2.js → command-menu-BXy03FBl.js} +1 -1
- package/build/assets/{condenser-settings-w7L3EFvm.js → condenser-settings-BmZa0ui_.js} +1 -1
- package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
- package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
- package/build/assets/conversation-BPo8SvLN.js +1 -0
- package/build/assets/conversation-CPCVsCUY.js +90 -0
- package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
- package/build/assets/{conversation-state-store-Bs8gA263.js → conversation-state-store-C5YpjMNy.js} +1 -1
- package/build/assets/conversation-store-Blc5xysY.js +6 -0
- package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
- package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
- package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
- package/build/assets/{entry.client-DzbDyLkV.js → entry.client-CxFjRYqH.js} +2 -2
- package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
- package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
- package/build/assets/{extensions-hub-DOmHPGTA.js → extensions-hub-BqUINAhp.js} +1 -1
- package/build/assets/{extensions-navigation-6zU5M1pa.js → extensions-navigation-lraj88Wk.js} +1 -1
- package/build/assets/external-link-CgtpA_a1.js +1 -0
- package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
- package/build/assets/files-tab-DV0L-lFE.js +1 -0
- package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
- package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
- package/build/assets/{format-relative-time-DGPQlPx0.js → format-relative-time-DSErAuVr.js} +1 -1
- package/build/assets/git-provider-icon-BvlLAche.js +1 -0
- package/build/assets/{git-repo-dropdown-B7RvO70z.js → git-repo-dropdown-ByMzpNko.js} +1 -1
- package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
- package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
- package/build/assets/{home-DEZaZqYv.js → home-BOrlwLqG.js} +1 -1
- package/build/assets/home-BvMNC6E-.js +1 -0
- package/build/assets/{home-store-D7CjMN_-.js → home-store-CxqsY9Fi.js} +1 -1
- package/build/assets/index-home-BvMNC6E-.js +1 -0
- package/build/assets/info-BRVcJAUg.js +1 -0
- package/build/assets/{install-server-modal-BTwK5lbi.js → install-server-modal-Bl4G1zF4.js} +1 -1
- package/build/assets/{kebab-menu-item-content-C4CkeiJO.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
- package/build/assets/{launch-DVlx4v9o.js → launch-CkqiSCqi.js} +1 -1
- package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
- package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
- package/build/assets/llm-settings-B-pkVCrt.js +1 -0
- package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
- package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
- package/build/assets/loader-circle-B47W9XqT.js +1 -0
- package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
- package/build/assets/{manage-backends-modal-HNWKLYhq.js → manage-backends-modal-DhGk5mJt.js} +1 -1
- package/build/assets/manifest-653b89aa.js +1 -0
- package/build/assets/{manifest-subpage-layout-D-m-h8_t.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
- package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
- package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
- package/build/assets/{mcp-gLgPP7AS.js → mcp-DCkvl6K0.js} +2 -2
- package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
- package/build/assets/messages-DSXvyc21.js +40 -0
- package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
- package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
- package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
- package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
- package/build/assets/{npm-DRzJF5Zn.js → npm-DLckoeJc.js} +1 -1
- package/build/assets/{onboarding-DSr8hOpk.js → onboarding-D7WDG66N.js} +1 -1
- package/build/assets/{onboarding-modal-C6Euf7N4.js → onboarding-modal-C_xVrFNv.js} +1 -1
- package/build/assets/{organization-service.api-C4GYWwj9.js → organization-service.api-D-s9z18a.js} +1 -1
- package/build/assets/pencil-BGOCPRyu.js +1 -0
- package/build/assets/{planner-tab-CZcguxTK.js → planner-tab-AKaXIIfg.js} +1 -1
- package/build/assets/{plugins-management-service-BmDzOQsd.js → plugins-management-service-wtmY4QQw.js} +1 -1
- package/build/assets/plus-zNEL8rcX.js +1 -0
- package/build/assets/{profiles-service.api-CoLTwjc1.js → profiles-service.api-DCMYxHMi.js} +1 -1
- package/build/assets/{providers-tBzTpz1w.js → providers-BjrtjX4L.js} +1 -1
- package/build/assets/{proxy-DCI9S-LA.js → proxy-9Z_WZggZ.js} +1 -1
- package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
- package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
- package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
- package/build/assets/root-CanxKlNV.css +1 -0
- package/build/assets/root-DkfG_UWR.js +2 -0
- package/build/assets/root-layout-D75LHYhh.js +2 -0
- package/build/assets/{schema-field-zhsVDllR.js → schema-field-OnM5Uob_.js} +1 -1
- package/build/assets/{sdk-section-page-CS4GWn0y.js → sdk-section-page-m5WQm2sy.js} +1 -1
- package/build/assets/search-CycosyjN.js +1 -0
- package/build/assets/{secrets-service-DjgGduXk.js → secrets-service-B26R61C1.js} +1 -1
- package/build/assets/{secrets-settings-f-qahfbi.js → secrets-settings-CbLYCKOX.js} +1 -1
- package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
- package/build/assets/{settings-DQd0xLEw.js → settings-BJQI_iBM.js} +1 -1
- package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
- package/build/assets/{settings-index-BVwy9JEp.js → settings-index-BiTqJoH7.js} +1 -1
- package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
- package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
- package/build/assets/{settings-modal-D6D5ngET.js → settings-modal-BIrIVn97.js} +1 -1
- package/build/assets/{settings-service.api-DZp7E7A9.js → settings-service.api--rJmnuLa.js} +1 -1
- package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
- package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
- package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
- package/build/assets/shield-check-T3JsDJiM.js +1 -0
- package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-OoZBHxaT.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
- package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
- package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
- package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
- package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
- package/build/assets/{skill-scope-B1Per5XI.js → skill-scope-Dc3JPW-8.js} +1 -1
- package/build/assets/{skills-plugins-B3AO6sMz.js → skills-plugins-CpTV27n3.js} +1 -1
- package/build/assets/{skills-settings-DmmgJ6CT.js → skills-settings-CSW__IW4.js} +1 -1
- package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
- package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
- package/build/assets/{task-list-tab-C19Q_JNf.js → task-list-tab-mAHMOkUz.js} +1 -1
- package/build/assets/{terminal-CbuMRYal.js → terminal-BzxBaHx2.js} +1 -1
- package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
- package/build/assets/trash-2-C0xNVp9c.js +1 -0
- package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
- package/build/assets/usage-tab-tEmVN0KD.js +1 -0
- package/build/assets/{use-acp-credential-form-DJmmJKMo.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
- package/build/assets/{use-activate-agent-profile-CeFfYwu_.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
- package/build/assets/{use-agent-profiles-BHLkLbRR.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-Bu4y8gSx.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-QD9x3ySO.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
- package/build/assets/{use-config-CPwqciXN.js → use-config-DKAMiI5R.js} +1 -1
- package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
- package/build/assets/{use-create-secret-BsOfOLvg.js → use-create-secret-2zBlCDsF.js} +1 -1
- package/build/assets/use-is-authed-C52-ivnB.js +1 -0
- package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
- package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
- package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
- package/build/assets/{use-manifest-capabilities-DBYPjyV6.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
- package/build/assets/{use-onboarding-completion-CtNJxkXG.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
- package/build/assets/{use-plugins-marketplace-ZEA-gyM9.js → use-plugins-marketplace-CEiak69h.js} +1 -1
- package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
- package/build/assets/{use-save-settings-pSjRhD_m.js → use-save-settings-DNmnbG6f.js} +1 -1
- package/build/assets/{use-settings-nav-items-CQgkxUbV.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
- package/build/assets/{use-settings-BHWsOcIG.js → use-settings-wCwPaSIv.js} +1 -1
- package/build/assets/{use-tracking-CGCsBWhg.js → use-tracking-CVwPmhlX.js} +1 -1
- package/build/assets/{use-user-conversation-DRfEU8x0.js → use-user-conversation-DVtfg0B_.js} +1 -1
- package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
- package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
- package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
- package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
- package/build/assets/utils-zxEjKE70.js +1 -0
- package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js} +3 -3
- package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
- package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js} +2 -2
- package/build/assets/{verification-settings-BItwt998.js → verification-settings-B8UMQ7MG.js} +1 -1
- package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
- package/build/assets/x-BWKA2Ver.js +1 -0
- package/build/assets/zap-DHddTPc0.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +28 -1
- package/build/locales/ca/openhands.json +28 -1
- package/build/locales/de/openhands.json +28 -1
- package/build/locales/en/openhands.json +28 -1
- package/build/locales/es/openhands.json +28 -1
- package/build/locales/fr/openhands.json +28 -1
- package/build/locales/it/openhands.json +28 -1
- package/build/locales/ja/openhands.json +28 -1
- package/build/locales/ko-KR/openhands.json +28 -1
- package/build/locales/no/openhands.json +28 -1
- package/build/locales/pt/openhands.json +28 -1
- package/build/locales/tr/openhands.json +28 -1
- package/build/locales/uk/openhands.json +28 -1
- package/build/locales/zh-CN/openhands.json +28 -1
- package/build/locales/zh-TW/openhands.json +28 -1
- package/config/defaults.json +3 -3
- 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.js +1 -1
- package/dist/api/agent-server-compatibility.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.d.ts +24 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/llm-balance-service.cjs +2 -0
- package/dist/api/llm-balance-service.cjs.map +1 -0
- package/dist/api/llm-balance-service.d.ts +33 -0
- package/dist/api/llm-balance-service.js +53 -0
- package/dist/api/llm-balance-service.js.map +1 -0
- package/dist/api/llm-subscription-service.cjs +1 -1
- package/dist/api/llm-subscription-service.cjs.map +1 -1
- package/dist/api/llm-subscription-service.js +42 -34
- package/dist/api/llm-subscription-service.js.map +1 -1
- package/dist/components/conversation/index.cjs +1 -1
- package/dist/components/conversation/index.d.ts +0 -1
- package/dist/components/conversation/index.js +0 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
- package/dist/components/conversation-events/chat/group-events.cjs +1 -1
- package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
- package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
- package/dist/components/conversation-events/chat/group-events.js +27 -26
- package/dist/components/conversation-events/chat/group-events.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
- 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 +123 -118
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-grip.js +7 -7
- package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
- package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
- package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
- package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
- package/dist/components/features/chat/components/context-window-meter.js +131 -0
- package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
- package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
- package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
- package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
- package/dist/components/features/chat/components/context-window-ring.js +45 -0
- package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
- package/dist/components/features/chat/custom-chat-input.cjs +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
- package/dist/components/features/chat/custom-chat-input.js +68 -67
- package/dist/components/features/chat/custom-chat-input.js.map +1 -1
- package/dist/components/features/chat/model-messages.cjs +1 -1
- package/dist/components/features/chat/model-messages.cjs.map +1 -1
- package/dist/components/features/chat/model-messages.js +26 -25
- package/dist/components/features/chat/model-messages.js.map +1 -1
- package/dist/components/features/chat/path-component.cjs +1 -1
- package/dist/components/features/chat/path-component.cjs.map +1 -1
- package/dist/components/features/chat/path-component.js +9 -6
- package/dist/components/features/chat/path-component.js.map +1 -1
- package/dist/components/features/chat/plan-preview.cjs +1 -1
- package/dist/components/features/chat/plan-preview.js +4 -4
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
- package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
- package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
- package/dist/components/features/controls/server-status-context-menu.js +8 -8
- package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
- package/dist/components/features/conversation/conversation-name-context-menu.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.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
- package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name.js +69 -71
- package/dist/components/features/conversation/conversation-name.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
- 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 +92 -86
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
- package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
- package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
- package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
- package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
- package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
- package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.js +10 -13
- package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
- package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
- package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
- 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.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- 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.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +28 -20
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
- package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
- package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
- 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.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.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 +230 -165
- package/dist/components/features/conversation-panel/conversation-panel.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 +22 -25
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
- package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
- package/dist/components/shared/buttons/conversation-confirmation-buttons.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 +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +154 -98
- package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/llm-balance.cjs +2 -0
- package/dist/constants/llm-balance.cjs.map +1 -0
- package/dist/constants/llm-balance.d.ts +13 -0
- package/dist/constants/llm-balance.js +6 -0
- package/dist/constants/llm-balance.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +2 -2
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +217 -209
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/chat/use-grip-resize.cjs +1 -1
- package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
- package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
- package/dist/hooks/chat/use-grip-resize.js +39 -30
- package/dist/hooks/chat/use-grip-resize.js.map +1 -1
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +61 -60
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
- package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
- package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
- package/dist/hooks/mutation/use-condense-conversation.js +17 -0
- package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +30 -21
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.js +1 -1
- package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
- package/dist/hooks/query/use-llm-balance.cjs +2 -0
- package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
- package/dist/hooks/query/use-llm-balance.d.ts +10 -0
- package/dist/hooks/query/use-llm-balance.js +24 -0
- package/dist/hooks/query/use-llm-balance.js.map +1 -0
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +1 -1
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/use-await-context-compaction.cjs +2 -0
- package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
- package/dist/hooks/use-await-context-compaction.d.ts +38 -0
- package/dist/hooks/use-await-context-compaction.js +61 -0
- package/dist/hooks/use-await-context-compaction.js.map +1 -0
- package/dist/hooks/use-compact-context-action.cjs +2 -0
- package/dist/hooks/use-compact-context-action.cjs.map +1 -0
- package/dist/hooks/use-compact-context-action.d.ts +10 -0
- package/dist/hooks/use-compact-context-action.js +61 -0
- package/dist/hooks/use-compact-context-action.js.map +1 -0
- package/dist/hooks/use-context-window-usage.cjs +2 -0
- package/dist/hooks/use-context-window-usage.cjs.map +1 -0
- package/dist/hooks/use-context-window-usage.d.ts +5 -0
- package/dist/hooks/use-context-window-usage.js +20 -0
- package/dist/hooks/use-context-window-usage.js.map +1 -0
- package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
- package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
- package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
- package/dist/hooks/use-conversation-name-context-menu.js +54 -57
- package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
- package/dist/hooks/use-drag-resize.cjs +1 -1
- package/dist/hooks/use-drag-resize.cjs.map +1 -1
- package/dist/hooks/use-drag-resize.d.ts +8 -0
- package/dist/hooks/use-drag-resize.js +21 -18
- package/dist/hooks/use-drag-resize.js.map +1 -1
- package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
- package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
- package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
- package/dist/hooks/use-live-conversation-metrics.js +37 -0
- package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
- package/dist/hooks/use-select-conversation-tab.cjs +1 -1
- package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
- package/dist/hooks/use-select-conversation-tab.js +2 -2
- package/dist/hooks/use-select-conversation-tab.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +27 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +474 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +28 -29
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.js +0 -1
- package/dist/locales/ar/openhands.json +28 -1
- package/dist/locales/ca/openhands.json +28 -1
- package/dist/locales/de/openhands.json +28 -1
- package/dist/locales/en/openhands.json +28 -1
- package/dist/locales/es/openhands.json +28 -1
- package/dist/locales/fr/openhands.json +28 -1
- package/dist/locales/it/openhands.json +28 -1
- package/dist/locales/ja/openhands.json +28 -1
- package/dist/locales/ko-KR/openhands.json +28 -1
- package/dist/locales/no/openhands.json +28 -1
- package/dist/locales/pt/openhands.json +28 -1
- package/dist/locales/tr/openhands.json +28 -1
- package/dist/locales/uk/openhands.json +28 -1
- package/dist/locales/zh-CN/openhands.json +28 -1
- package/dist/locales/zh-TW/openhands.json +28 -1
- package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
- package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
- package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
- package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
- package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
- package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
- package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
- package/dist/node_modules/zustand/esm/middleware.js +33 -31
- package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +17 -16
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +94 -93
- package/dist/routes/app-settings.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 +131 -119
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/usage-tab.cjs +2 -0
- package/dist/routes/usage-tab.cjs.map +1 -0
- package/dist/routes/usage-tab.d.ts +2 -0
- package/dist/routes/usage-tab.js +10 -0
- package/dist/routes/usage-tab.js.map +1 -0
- package/dist/services/child-conversation-launch.cjs +1 -1
- package/dist/services/child-conversation-launch.cjs.map +1 -1
- package/dist/services/child-conversation-launch.js +11 -5
- package/dist/services/child-conversation-launch.js.map +1 -1
- package/dist/stores/archived-conversations-store.cjs +2 -0
- package/dist/stores/archived-conversations-store.cjs.map +1 -0
- package/dist/stores/archived-conversations-store.d.ts +24 -0
- package/dist/stores/archived-conversations-store.js +33 -0
- package/dist/stores/archived-conversations-store.js.map +1 -0
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
- package/dist/stores/conversation-panel-preferences-store.js +4 -0
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +1 -1
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/metrics-store.cjs +1 -1
- package/dist/stores/metrics-store.cjs.map +1 -1
- package/dist/stores/metrics-store.d.ts +1 -0
- package/dist/stores/metrics-store.js +7 -4
- package/dist/stores/metrics-store.js.map +1 -1
- package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
- package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +5 -0
- package/dist/types/agent-server/type-guards.js +3 -3
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/utils/conversation-local-storage.cjs +1 -1
- package/dist/utils/conversation-local-storage.cjs.map +1 -1
- package/dist/utils/conversation-local-storage.js +2 -1
- package/dist/utils/conversation-local-storage.js.map +1 -1
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +11 -0
- package/dist/utils/format-model-name.js +11 -3
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-token-count.cjs +2 -0
- package/dist/utils/format-token-count.cjs.map +1 -0
- package/dist/utils/format-token-count.d.ts +3 -0
- package/dist/utils/format-token-count.js +19 -0
- package/dist/utils/format-token-count.js.map +1 -0
- package/dist/utils/hover-reveal-classes.cjs +2 -0
- package/dist/utils/hover-reveal-classes.cjs.map +1 -0
- package/dist/utils/hover-reveal-classes.d.ts +34 -0
- package/dist/utils/hover-reveal-classes.js +41 -0
- package/dist/utils/hover-reveal-classes.js.map +1 -0
- package/dist/utils/is-markdown-file-path.cjs +2 -0
- package/dist/utils/is-markdown-file-path.cjs.map +1 -0
- package/dist/utils/is-markdown-file-path.d.ts +4 -0
- package/dist/utils/is-markdown-file-path.js +14 -0
- package/dist/utils/is-markdown-file-path.js.map +1 -0
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
- package/dist/utils/mcp-marketplace-utils.js +19 -16
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/transcript-export/index.cjs +3 -3
- package/dist/utils/transcript-export/index.cjs.map +1 -1
- package/dist/utils/transcript-export/index.js +12 -12
- package/dist/utils/transcript-export/index.js.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.js +4 -4
- package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
- package/dist/utils/workspace-relative-path.cjs +2 -0
- package/dist/utils/workspace-relative-path.cjs.map +1 -0
- package/dist/utils/workspace-relative-path.d.ts +10 -0
- package/dist/utils/workspace-relative-path.js +22 -0
- package/dist/utils/workspace-relative-path.js.map +1 -0
- package/package.json +17 -16
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-process-utils.mjs +6 -1
- package/scripts/dev-safe.mjs +57 -2
- package/build/assets/active-backend-context-BBvP-bI2.js +0 -2
- package/build/assets/agent-profiles-settings-DqoS7RL3.js +0 -1
- package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +0 -86
- package/build/assets/agent-settings-BJHryp65.js +0 -1
- package/build/assets/app-settings-r1RUbgGi.js +0 -1
- package/build/assets/backend-form-modal-OroTqnAv.js +0 -1
- package/build/assets/bot-DuN83i3p.js +0 -1
- package/build/assets/browser--eoQOo4M.js +0 -6
- package/build/assets/check-DLOKoFU9.js +0 -1
- package/build/assets/chevron-down-CnIbtM6i.js +0 -1
- package/build/assets/circle-check-CxCYJrpZ.js +0 -1
- package/build/assets/conversation-BUzBZAc-.js +0 -90
- package/build/assets/conversation-panel-pzAKsSDb.js +0 -1
- package/build/assets/conversation-pzAKsSDb.js +0 -1
- package/build/assets/conversation-store-B8Eahyeg.js +0 -6
- package/build/assets/external-link-zWbg5KXS.js +0 -1
- package/build/assets/files-tab-BzofBmF4.js +0 -1
- package/build/assets/git-provider-icon-BLMlwy02.js +0 -1
- package/build/assets/git-repo-dropdown-B_PTq4ol.js +0 -1
- package/build/assets/home-r89Vj2td.js +0 -1
- package/build/assets/index-home-r89Vj2td.js +0 -1
- package/build/assets/llm-not-configured-banner-CwKu8C6g.js +0 -27
- package/build/assets/llm-settings-BJotLQND.js +0 -1
- package/build/assets/llm-settings-CDM-5H2A.js +0 -1
- package/build/assets/llm-subscription-service-7eVfDIE1.js +0 -1
- package/build/assets/loader-circle-C5AnEN8r.js +0 -1
- package/build/assets/manifest-2a36a8f8.js +0 -1
- package/build/assets/markdown-renderer-BiiiIznl.js +0 -8
- package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +0 -1
- package/build/assets/messages-D1cbVhRK.js +0 -40
- package/build/assets/pencil-Bl3GWhgq.js +0 -1
- package/build/assets/plus-CtzlyAoF.js +0 -1
- package/build/assets/recommended-automations-launcher-BbJAJVED.js +0 -1
- package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
- package/build/assets/root-BfM_kC_d.css +0 -1
- package/build/assets/root-gstBEjty.js +0 -2
- package/build/assets/root-layout-BIAFLP9p.js +0 -2
- package/build/assets/search-CYaiKHRp.js +0 -1
- package/build/assets/shared-conversation-DIxZjElr.js +0 -1
- package/build/assets/shield-check-D2cpEpv3.js +0 -1
- package/build/assets/trash-2-CzDVN-Iw.js +0 -1
- package/build/assets/use-create-conversation-DWaSVUOB.js +0 -1
- package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
- package/build/assets/use-llm-profiles-CU8ah1pz.js +0 -1
- package/build/assets/use-save-agent-profile-DgI_Uz9a.js +0 -1
- package/build/assets/utils-DPQfkd-7.js +0 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
- package/build/assets/x-RYDBg-e2.js +0 -1
- package/build/assets/zap-tbKDzCe3.js +0 -1
- package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
- package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
- package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
- package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
- package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
- package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
- package/dist/icons/u-credit-card.cjs +0 -2
- package/dist/icons/u-credit-card.cjs.map +0 -1
- package/dist/icons/u-credit-card.js +0 -21
- package/dist/icons/u-credit-card.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-name.cjs","names":[],"sources":["../../../../src/components/features/conversation/conversation-name.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationNameContextMenu } from \"#/hooks/use-conversation-name-context-menu\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { EllipsisButton } from \"../conversation-panel/ellipsis-button\";\nimport { ConversationNameContextMenu } from \"./conversation-name-context-menu\";\nimport { SystemMessageModal } from \"../conversation-panel/system-message-modal\";\nimport { SkillsModal } from \"../conversation-panel/skills-modal\";\nimport { HooksModal } from \"../conversation-panel/hooks-modal\";\nimport { ConfirmDeleteModal } from \"../conversation-panel/confirm-delete-modal\";\nimport { ConfirmStopModal } from \"../conversation-panel/confirm-stop-modal\";\nimport { MetricsModal } from \"./metrics-modal/metrics-modal\";\nimport { TranscriptExportModal } from \"./transcript-export-modal\";\n\nexport function ConversationName() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { data: conversation } = useActiveConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const [contextMenuOpen, setContextMenuOpen] = React.useState(false);\n const [transcriptExportModalVisible, setTranscriptExportModalVisible] =\n React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const ellipsisAnchorRef = React.useRef<HTMLDivElement>(null);\n\n // Use the custom hook for context menu handlers\n const {\n handleDelete,\n handleStop,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n metricsModalVisible,\n setMetricsModalVisible,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n systemMessage,\n shouldShowStop,\n shouldShowDownloadConversation,\n shouldShowDisplayCost,\n shouldShowAgentTools,\n shouldShowSkills,\n shouldShowHooks,\n } = useConversationNameContextMenu({\n conversationId,\n executionStatus: conversation?.execution_status,\n showOptions: true,\n onContextMenuToggle: setContextMenuOpen,\n });\n\n const handleDoubleClick = () => {\n setTitleMode(\"edit\");\n };\n\n const handleBlur = () => {\n if (inputRef.current?.value && conversationId) {\n const trimmed = inputRef.current.value.trim();\n if (trimmed !== conversation?.title) {\n updateConversation(\n { conversationId, newTitle: trimmed },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n }\n } else if (inputRef.current) {\n // reset the value if it's empty\n inputRef.current.value = conversation?.title ?? \"\";\n }\n\n setTitleMode(\"view\");\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Ignore Enter key during IME composition (e.g., Chinese, Japanese, Korean input)\n if (event.nativeEvent.isComposing) {\n return;\n }\n if (event.key === \"Enter\") {\n event.currentTarget.blur();\n }\n };\n\n const handleInputClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (titleMode === \"edit\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n const handleEllipsisClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleRename = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n setContextMenuOpen(false);\n };\n\n const handleExportTranscript = (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setTranscriptExportModalVisible(true);\n setContextMenuOpen(false);\n };\n\n React.useEffect(() => {\n if (titleMode === \"edit\") {\n inputRef.current?.focus();\n }\n }, [titleMode]);\n\n if (!conversation) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"flex items-center gap-2 h-[22px] text-base font-normal text-left pl-0 lg:pl-1 min-w-0\"\n data-testid=\"conversation-name\"\n >\n {titleMode === \"edit\" ? (\n <input\n ref={inputRef}\n data-testid=\"conversation-name-input\"\n onClick={handleInputClick}\n onBlur={handleBlur}\n onKeyUp={handleKeyUp}\n type=\"text\"\n defaultValue={conversation.title || \"\"}\n className=\"text-white leading-5 bg-transparent border-none outline-none text-base font-normal w-fit max-w-fit field-sizing-content\"\n />\n ) : (\n <div\n className=\"text-white leading-5 truncate\"\n data-testid=\"conversation-name-title\"\n onDoubleClick={handleDoubleClick}\n title={conversation.title || \"\"}\n >\n {conversation.title}\n </div>\n )}\n\n {titleMode !== \"edit\" && (\n <div\n ref={ellipsisAnchorRef}\n className=\"relative flex items-center shrink-0\"\n >\n <EllipsisButton onClick={handleEllipsisClick} />\n {contextMenuOpen && (\n <ConversationNameContextMenu\n onClose={() => setContextMenuOpen(false)}\n onRename={handleRename}\n onDelete={handleDelete}\n onStop={shouldShowStop ? handleStop : undefined}\n onDisplayCost={\n shouldShowDisplayCost ? handleDisplayCost : undefined\n }\n onShowAgentTools={\n shouldShowAgentTools ? handleShowAgentTools : undefined\n }\n onShowSkills={shouldShowSkills ? handleShowSkills : undefined}\n onShowHooks={shouldShowHooks ? handleShowHooks : undefined}\n onTogglePublic={handleTogglePublic}\n onCopyShareLink={handleCopyShareLink}\n shareUrl={shareUrl}\n onExportTranscript={handleExportTranscript}\n onDownloadConversation={\n shouldShowDownloadConversation\n ? handleDownloadConversation\n : undefined\n }\n position=\"bottom\"\n anchorRef={ellipsisAnchorRef}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Metrics Modal */}\n <MetricsModal\n isOpen={metricsModalVisible}\n onOpenChange={setMetricsModalVisible}\n />\n\n {transcriptExportModalVisible && conversationId && (\n <TranscriptExportModal\n conversationId={conversationId}\n conversationUrl={conversation.conversation_url}\n sessionApiKey={conversation.session_api_key}\n conversationTitle={conversation.title}\n model={conversation.llm_model}\n onClose={() => setTranscriptExportModalVisible(false)}\n />\n )}\n\n {/* System Message Modal */}\n <SystemMessageModal\n isOpen={systemModalVisible}\n onClose={() => setSystemModalVisible(false)}\n systemMessage={systemMessage || null}\n />\n\n {/* Skills Modal */}\n {skillsModalVisible && (\n <SkillsModal onClose={() => setSkillsModalVisible(false)} />\n )}\n\n {/* Hooks Modal */}\n {hooksModalVisible && (\n <HooksModal onClose={() => setHooksModalVisible(false)} />\n )}\n\n {/* Confirm Delete Modal */}\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={handleConfirmDelete}\n onCancel={() => setConfirmDeleteModalVisible(false)}\n conversationTitle={conversation?.title || \"\"}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={handleConfirmStop}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-name.cjs","names":[],"sources":["../../../../src/components/features/conversation/conversation-name.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationNameContextMenu } from \"#/hooks/use-conversation-name-context-menu\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { EllipsisButton } from \"../conversation-panel/ellipsis-button\";\nimport { ConversationNameContextMenu } from \"./conversation-name-context-menu\";\nimport { SystemMessageModal } from \"../conversation-panel/system-message-modal\";\nimport { SkillsModal } from \"../conversation-panel/skills-modal\";\nimport { HooksModal } from \"../conversation-panel/hooks-modal\";\nimport { ConfirmDeleteModal } from \"../conversation-panel/confirm-delete-modal\";\nimport { ConfirmStopModal } from \"../conversation-panel/confirm-stop-modal\";\nimport { TranscriptExportModal } from \"./transcript-export-modal\";\n\nexport function ConversationName() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { data: conversation } = useActiveConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const [contextMenuOpen, setContextMenuOpen] = React.useState(false);\n const [transcriptExportModalVisible, setTranscriptExportModalVisible] =\n React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const ellipsisAnchorRef = React.useRef<HTMLDivElement>(null);\n\n // Use the custom hook for context menu handlers\n const {\n handleDelete,\n handleStop,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n systemMessage,\n shouldShowStop,\n shouldShowDownloadConversation,\n shouldShowDisplayCost,\n shouldShowAgentTools,\n shouldShowSkills,\n shouldShowHooks,\n } = useConversationNameContextMenu({\n conversationId,\n executionStatus: conversation?.execution_status,\n showOptions: true,\n onContextMenuToggle: setContextMenuOpen,\n });\n\n const handleDoubleClick = () => {\n setTitleMode(\"edit\");\n };\n\n const handleBlur = () => {\n if (inputRef.current?.value && conversationId) {\n const trimmed = inputRef.current.value.trim();\n if (trimmed !== conversation?.title) {\n updateConversation(\n { conversationId, newTitle: trimmed },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n }\n } else if (inputRef.current) {\n // reset the value if it's empty\n inputRef.current.value = conversation?.title ?? \"\";\n }\n\n setTitleMode(\"view\");\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Ignore Enter key during IME composition (e.g., Chinese, Japanese, Korean input)\n if (event.nativeEvent.isComposing) {\n return;\n }\n if (event.key === \"Enter\") {\n event.currentTarget.blur();\n }\n };\n\n const handleInputClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (titleMode === \"edit\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n const handleEllipsisClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleRename = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n setContextMenuOpen(false);\n };\n\n const handleExportTranscript = (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setTranscriptExportModalVisible(true);\n setContextMenuOpen(false);\n };\n\n React.useEffect(() => {\n if (titleMode === \"edit\") {\n inputRef.current?.focus();\n }\n }, [titleMode]);\n\n if (!conversation) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"flex items-center gap-2 h-[22px] text-base font-normal text-left pl-0 lg:pl-1 min-w-0\"\n data-testid=\"conversation-name\"\n >\n {titleMode === \"edit\" ? (\n <input\n ref={inputRef}\n data-testid=\"conversation-name-input\"\n onClick={handleInputClick}\n onBlur={handleBlur}\n onKeyUp={handleKeyUp}\n type=\"text\"\n defaultValue={conversation.title || \"\"}\n className=\"text-white leading-5 bg-transparent border-none outline-none text-base font-normal w-fit max-w-fit field-sizing-content\"\n />\n ) : (\n <div\n className=\"text-white leading-5 truncate\"\n data-testid=\"conversation-name-title\"\n onDoubleClick={handleDoubleClick}\n title={conversation.title || \"\"}\n >\n {conversation.title}\n </div>\n )}\n\n {titleMode !== \"edit\" && (\n <div\n ref={ellipsisAnchorRef}\n className=\"relative flex items-center shrink-0\"\n >\n <EllipsisButton\n onClick={handleEllipsisClick}\n ariaLabel={t(I18nKey.COMMON$MORE_OPTIONS)}\n />\n {contextMenuOpen && (\n <ConversationNameContextMenu\n onClose={() => setContextMenuOpen(false)}\n onRename={handleRename}\n onDelete={handleDelete}\n onStop={shouldShowStop ? handleStop : undefined}\n onDisplayCost={\n shouldShowDisplayCost ? handleDisplayCost : undefined\n }\n onShowAgentTools={\n shouldShowAgentTools ? handleShowAgentTools : undefined\n }\n onShowSkills={shouldShowSkills ? handleShowSkills : undefined}\n onShowHooks={shouldShowHooks ? handleShowHooks : undefined}\n onTogglePublic={handleTogglePublic}\n onCopyShareLink={handleCopyShareLink}\n shareUrl={shareUrl}\n onExportTranscript={handleExportTranscript}\n onDownloadConversation={\n shouldShowDownloadConversation\n ? handleDownloadConversation\n : undefined\n }\n position=\"bottom\"\n anchorRef={ellipsisAnchorRef}\n />\n )}\n </div>\n )}\n </div>\n\n {transcriptExportModalVisible && conversationId && (\n <TranscriptExportModal\n conversationId={conversationId}\n conversationUrl={conversation.conversation_url}\n sessionApiKey={conversation.session_api_key}\n conversationTitle={conversation.title}\n model={conversation.llm_model}\n onClose={() => setTranscriptExportModalVisible(false)}\n />\n )}\n\n {/* System Message Modal */}\n <SystemMessageModal\n isOpen={systemModalVisible}\n onClose={() => setSystemModalVisible(false)}\n systemMessage={systemMessage || null}\n />\n\n {/* Skills Modal */}\n {skillsModalVisible && (\n <SkillsModal onClose={() => setSkillsModalVisible(false)} />\n )}\n\n {/* Hooks Modal */}\n {hooksModalVisible && (\n <HooksModal onClose={() => setHooksModalVisible(false)} />\n )}\n\n {/* Confirm Delete Modal */}\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={handleConfirmDelete}\n onCancel={() => setConfirmDeleteModalVisible(false)}\n conversationTitle={conversation?.title || \"\"}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={handleConfirmStop}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -12,115 +12,113 @@ import { EllipsisButton as u } from "../conversation-panel/ellipsis-button.js";
|
|
|
12
12
|
import { ConversationNameContextMenu as d } from "./conversation-name-context-menu.js";
|
|
13
13
|
import { ConfirmDeleteModal as f } from "../conversation-panel/confirm-delete-modal.js";
|
|
14
14
|
import { ConfirmStopModal as p } from "../conversation-panel/confirm-stop-modal.js";
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
import g from "react";
|
|
18
|
-
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
15
|
+
import { TranscriptExportModal as m } from "./transcript-export-modal.js";
|
|
16
|
+
import h from "react";
|
|
17
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
19
18
|
//#region src/components/features/conversation/conversation-name.tsx
|
|
20
|
-
function
|
|
21
|
-
let { t:
|
|
22
|
-
conversationId:
|
|
23
|
-
executionStatus:
|
|
19
|
+
function y() {
|
|
20
|
+
let { t: y } = e("openhands"), { conversationId: b } = n(), { data: x } = i(), { mutate: S } = l(), [C, w] = h.useState("view"), [T, E] = h.useState(!1), [D, O] = h.useState(!1), k = h.useRef(null), A = h.useRef(null), { handleDelete: j, handleStop: M, handleDownloadConversation: N, handleDisplayCost: P, handleShowAgentTools: F, handleShowSkills: ee, handleShowHooks: I, handleTogglePublic: L, handleCopyShareLink: R, shareUrl: z, handleConfirmDelete: B, handleConfirmStop: V, systemModalVisible: H, setSystemModalVisible: U, skillsModalVisible: W, setSkillsModalVisible: G, hooksModalVisible: K, setHooksModalVisible: q, confirmDeleteModalVisible: J, setConfirmDeleteModalVisible: Y, confirmStopModalVisible: X, setConfirmStopModalVisible: Z, systemMessage: Q, shouldShowStop: $, shouldShowDownloadConversation: te, shouldShowDisplayCost: ne, shouldShowAgentTools: re, shouldShowSkills: ie, shouldShowHooks: ae } = a({
|
|
21
|
+
conversationId: b,
|
|
22
|
+
executionStatus: x?.execution_status,
|
|
24
23
|
showOptions: !0,
|
|
25
|
-
onContextMenuToggle:
|
|
24
|
+
onContextMenuToggle: E
|
|
26
25
|
});
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
}, [
|
|
30
|
-
/* @__PURE__ */
|
|
26
|
+
return h.useEffect(() => {
|
|
27
|
+
C === "edit" && k.current?.focus();
|
|
28
|
+
}, [C]), x ? /* @__PURE__ */ v(g, { children: [
|
|
29
|
+
/* @__PURE__ */ v("div", {
|
|
31
30
|
className: "flex items-center gap-2 h-[22px] text-base font-normal text-left pl-0 lg:pl-1 min-w-0",
|
|
32
31
|
"data-testid": "conversation-name",
|
|
33
|
-
children: [
|
|
34
|
-
ref:
|
|
32
|
+
children: [C === "edit" ? /* @__PURE__ */ _("input", {
|
|
33
|
+
ref: k,
|
|
35
34
|
"data-testid": "conversation-name-input",
|
|
36
35
|
onClick: (e) => {
|
|
37
|
-
|
|
36
|
+
C === "edit" && (e.preventDefault(), e.stopPropagation());
|
|
38
37
|
},
|
|
39
38
|
onBlur: () => {
|
|
40
|
-
if (
|
|
41
|
-
let e =
|
|
42
|
-
e !==
|
|
43
|
-
conversationId:
|
|
39
|
+
if (k.current?.value && b) {
|
|
40
|
+
let e = k.current.value.trim();
|
|
41
|
+
e !== x?.title && S({
|
|
42
|
+
conversationId: b,
|
|
44
43
|
newTitle: e
|
|
45
44
|
}, { onSuccess: () => {
|
|
46
|
-
r(
|
|
45
|
+
r(y(t.CONVERSATION$TITLE_UPDATED));
|
|
47
46
|
} });
|
|
48
|
-
} else
|
|
49
|
-
|
|
47
|
+
} else k.current && (k.current.value = x?.title ?? "");
|
|
48
|
+
w("view");
|
|
50
49
|
},
|
|
51
50
|
onKeyUp: (e) => {
|
|
52
51
|
e.nativeEvent.isComposing || e.key === "Enter" && e.currentTarget.blur();
|
|
53
52
|
},
|
|
54
53
|
type: "text",
|
|
55
|
-
defaultValue:
|
|
54
|
+
defaultValue: x.title || "",
|
|
56
55
|
className: "text-white leading-5 bg-transparent border-none outline-none text-base font-normal w-fit max-w-fit field-sizing-content"
|
|
57
|
-
}) : /* @__PURE__ */
|
|
56
|
+
}) : /* @__PURE__ */ _("div", {
|
|
58
57
|
className: "text-white leading-5 truncate",
|
|
59
58
|
"data-testid": "conversation-name-title",
|
|
60
59
|
onDoubleClick: () => {
|
|
61
|
-
|
|
60
|
+
w("edit");
|
|
62
61
|
},
|
|
63
|
-
title:
|
|
64
|
-
children:
|
|
65
|
-
}),
|
|
66
|
-
ref:
|
|
62
|
+
title: x.title || "",
|
|
63
|
+
children: x.title
|
|
64
|
+
}), C !== "edit" && /* @__PURE__ */ v("div", {
|
|
65
|
+
ref: A,
|
|
67
66
|
className: "relative flex items-center shrink-0",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
children: [/* @__PURE__ */ _(u, {
|
|
68
|
+
onClick: (e) => {
|
|
69
|
+
e.preventDefault(), e.stopPropagation(), E(!T);
|
|
70
|
+
},
|
|
71
|
+
ariaLabel: y(t.COMMON$MORE_OPTIONS)
|
|
72
|
+
}), T && /* @__PURE__ */ _(d, {
|
|
73
|
+
onClose: () => E(!1),
|
|
72
74
|
onRename: (e) => {
|
|
73
|
-
e.preventDefault(), e.stopPropagation(),
|
|
75
|
+
e.preventDefault(), e.stopPropagation(), w("edit"), E(!1);
|
|
74
76
|
},
|
|
75
|
-
onDelete:
|
|
76
|
-
onStop:
|
|
77
|
-
onDisplayCost:
|
|
78
|
-
onShowAgentTools:
|
|
79
|
-
onShowSkills:
|
|
80
|
-
onShowHooks:
|
|
81
|
-
onTogglePublic:
|
|
82
|
-
onCopyShareLink:
|
|
83
|
-
shareUrl:
|
|
77
|
+
onDelete: j,
|
|
78
|
+
onStop: $ ? M : void 0,
|
|
79
|
+
onDisplayCost: ne ? P : void 0,
|
|
80
|
+
onShowAgentTools: re ? F : void 0,
|
|
81
|
+
onShowSkills: ie ? ee : void 0,
|
|
82
|
+
onShowHooks: ae ? I : void 0,
|
|
83
|
+
onTogglePublic: L,
|
|
84
|
+
onCopyShareLink: R,
|
|
85
|
+
shareUrl: z,
|
|
84
86
|
onExportTranscript: (e) => {
|
|
85
|
-
e.preventDefault(), e.stopPropagation(),
|
|
87
|
+
e.preventDefault(), e.stopPropagation(), O(!0), E(!1);
|
|
86
88
|
},
|
|
87
|
-
onDownloadConversation:
|
|
89
|
+
onDownloadConversation: te ? N : void 0,
|
|
88
90
|
position: "bottom",
|
|
89
|
-
anchorRef:
|
|
91
|
+
anchorRef: A
|
|
90
92
|
})]
|
|
91
93
|
})]
|
|
92
94
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
D && b && /* @__PURE__ */ _(m, {
|
|
96
|
+
conversationId: b,
|
|
97
|
+
conversationUrl: x.conversation_url,
|
|
98
|
+
sessionApiKey: x.session_api_key,
|
|
99
|
+
conversationTitle: x.title,
|
|
100
|
+
model: x.llm_model,
|
|
101
|
+
onClose: () => O(!1)
|
|
96
102
|
}),
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
conversationTitle: S.title,
|
|
102
|
-
model: S.llm_model,
|
|
103
|
-
onClose: () => k(!1)
|
|
103
|
+
/* @__PURE__ */ _(o, {
|
|
104
|
+
isOpen: H,
|
|
105
|
+
onClose: () => U(!1),
|
|
106
|
+
systemMessage: Q || null
|
|
104
107
|
}),
|
|
105
|
-
/* @__PURE__ */
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
W && /* @__PURE__ */ _(s, { onClose: () => G(!1) }),
|
|
109
|
+
K && /* @__PURE__ */ _(c, { onClose: () => q(!1) }),
|
|
110
|
+
J && /* @__PURE__ */ _(f, {
|
|
111
|
+
onConfirm: B,
|
|
112
|
+
onCancel: () => Y(!1),
|
|
113
|
+
conversationTitle: x?.title || ""
|
|
109
114
|
}),
|
|
110
|
-
|
|
111
|
-
Y && /* @__PURE__ */ v(c, { onClose: () => X(!1) }),
|
|
112
|
-
Z && /* @__PURE__ */ v(f, {
|
|
115
|
+
X && /* @__PURE__ */ _(p, {
|
|
113
116
|
onConfirm: V,
|
|
114
|
-
onCancel: () =>
|
|
115
|
-
conversationTitle: S?.title || ""
|
|
116
|
-
}),
|
|
117
|
-
$ && /* @__PURE__ */ v(p, {
|
|
118
|
-
onConfirm: H,
|
|
119
|
-
onCancel: () => te(!1)
|
|
117
|
+
onCancel: () => Z(!1)
|
|
120
118
|
})
|
|
121
119
|
] }) : null;
|
|
122
120
|
}
|
|
123
121
|
//#endregion
|
|
124
|
-
export {
|
|
122
|
+
export { y as ConversationName };
|
|
125
123
|
|
|
126
124
|
//# sourceMappingURL=conversation-name.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-name.js","names":[],"sources":["../../../../src/components/features/conversation/conversation-name.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationNameContextMenu } from \"#/hooks/use-conversation-name-context-menu\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { EllipsisButton } from \"../conversation-panel/ellipsis-button\";\nimport { ConversationNameContextMenu } from \"./conversation-name-context-menu\";\nimport { SystemMessageModal } from \"../conversation-panel/system-message-modal\";\nimport { SkillsModal } from \"../conversation-panel/skills-modal\";\nimport { HooksModal } from \"../conversation-panel/hooks-modal\";\nimport { ConfirmDeleteModal } from \"../conversation-panel/confirm-delete-modal\";\nimport { ConfirmStopModal } from \"../conversation-panel/confirm-stop-modal\";\nimport { MetricsModal } from \"./metrics-modal/metrics-modal\";\nimport { TranscriptExportModal } from \"./transcript-export-modal\";\n\nexport function ConversationName() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { data: conversation } = useActiveConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const [contextMenuOpen, setContextMenuOpen] = React.useState(false);\n const [transcriptExportModalVisible, setTranscriptExportModalVisible] =\n React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const ellipsisAnchorRef = React.useRef<HTMLDivElement>(null);\n\n // Use the custom hook for context menu handlers\n const {\n handleDelete,\n handleStop,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n metricsModalVisible,\n setMetricsModalVisible,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n systemMessage,\n shouldShowStop,\n shouldShowDownloadConversation,\n shouldShowDisplayCost,\n shouldShowAgentTools,\n shouldShowSkills,\n shouldShowHooks,\n } = useConversationNameContextMenu({\n conversationId,\n executionStatus: conversation?.execution_status,\n showOptions: true,\n onContextMenuToggle: setContextMenuOpen,\n });\n\n const handleDoubleClick = () => {\n setTitleMode(\"edit\");\n };\n\n const handleBlur = () => {\n if (inputRef.current?.value && conversationId) {\n const trimmed = inputRef.current.value.trim();\n if (trimmed !== conversation?.title) {\n updateConversation(\n { conversationId, newTitle: trimmed },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n }\n } else if (inputRef.current) {\n // reset the value if it's empty\n inputRef.current.value = conversation?.title ?? \"\";\n }\n\n setTitleMode(\"view\");\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Ignore Enter key during IME composition (e.g., Chinese, Japanese, Korean input)\n if (event.nativeEvent.isComposing) {\n return;\n }\n if (event.key === \"Enter\") {\n event.currentTarget.blur();\n }\n };\n\n const handleInputClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (titleMode === \"edit\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n const handleEllipsisClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleRename = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n setContextMenuOpen(false);\n };\n\n const handleExportTranscript = (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setTranscriptExportModalVisible(true);\n setContextMenuOpen(false);\n };\n\n React.useEffect(() => {\n if (titleMode === \"edit\") {\n inputRef.current?.focus();\n }\n }, [titleMode]);\n\n if (!conversation) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"flex items-center gap-2 h-[22px] text-base font-normal text-left pl-0 lg:pl-1 min-w-0\"\n data-testid=\"conversation-name\"\n >\n {titleMode === \"edit\" ? (\n <input\n ref={inputRef}\n data-testid=\"conversation-name-input\"\n onClick={handleInputClick}\n onBlur={handleBlur}\n onKeyUp={handleKeyUp}\n type=\"text\"\n defaultValue={conversation.title || \"\"}\n className=\"text-white leading-5 bg-transparent border-none outline-none text-base font-normal w-fit max-w-fit field-sizing-content\"\n />\n ) : (\n <div\n className=\"text-white leading-5 truncate\"\n data-testid=\"conversation-name-title\"\n onDoubleClick={handleDoubleClick}\n title={conversation.title || \"\"}\n >\n {conversation.title}\n </div>\n )}\n\n {titleMode !== \"edit\" && (\n <div\n ref={ellipsisAnchorRef}\n className=\"relative flex items-center shrink-0\"\n >\n <EllipsisButton onClick={handleEllipsisClick} />\n {contextMenuOpen && (\n <ConversationNameContextMenu\n onClose={() => setContextMenuOpen(false)}\n onRename={handleRename}\n onDelete={handleDelete}\n onStop={shouldShowStop ? handleStop : undefined}\n onDisplayCost={\n shouldShowDisplayCost ? handleDisplayCost : undefined\n }\n onShowAgentTools={\n shouldShowAgentTools ? handleShowAgentTools : undefined\n }\n onShowSkills={shouldShowSkills ? handleShowSkills : undefined}\n onShowHooks={shouldShowHooks ? handleShowHooks : undefined}\n onTogglePublic={handleTogglePublic}\n onCopyShareLink={handleCopyShareLink}\n shareUrl={shareUrl}\n onExportTranscript={handleExportTranscript}\n onDownloadConversation={\n shouldShowDownloadConversation\n ? handleDownloadConversation\n : undefined\n }\n position=\"bottom\"\n anchorRef={ellipsisAnchorRef}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Metrics Modal */}\n <MetricsModal\n isOpen={metricsModalVisible}\n onOpenChange={setMetricsModalVisible}\n />\n\n {transcriptExportModalVisible && conversationId && (\n <TranscriptExportModal\n conversationId={conversationId}\n conversationUrl={conversation.conversation_url}\n sessionApiKey={conversation.session_api_key}\n conversationTitle={conversation.title}\n model={conversation.llm_model}\n onClose={() => setTranscriptExportModalVisible(false)}\n />\n )}\n\n {/* System Message Modal */}\n <SystemMessageModal\n isOpen={systemModalVisible}\n onClose={() => setSystemModalVisible(false)}\n systemMessage={systemMessage || null}\n />\n\n {/* Skills Modal */}\n {skillsModalVisible && (\n <SkillsModal onClose={() => setSkillsModalVisible(false)} />\n )}\n\n {/* Hooks Modal */}\n {hooksModalVisible && (\n <HooksModal onClose={() => setHooksModalVisible(false)} />\n )}\n\n {/* Confirm Delete Modal */}\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={handleConfirmDelete}\n onCancel={() => setConfirmDeleteModalVisible(false)}\n conversationTitle={conversation?.title || \"\"}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={handleConfirmStop}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,SAAgB,IAAmB;CACjC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,sBAAmB,EAAkB,GACvC,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,QAAQ,MAAuB,EAAsB,GAEvD,CAAC,GAAW,KAAgB,EAAM,SAA0B,MAAM,GAClE,CAAC,GAAiB,KAAsB,EAAM,SAAS,EAAK,GAC5D,CAAC,GAA8B,KACnC,EAAM,SAAS,EAAK,GAChB,IAAW,EAAM,OAAyB,IAAI,GAC9C,IAAoB,EAAM,OAAuB,IAAI,GAGrD,EACJ,iBACA,eACA,+BACA,sBACA,yBACA,qBACA,oBACA,wBACA,wBACA,aACA,wBACA,sBACA,wBACA,2BACA,uBACA,0BACA,uBACA,0BACA,sBACA,yBACA,8BACA,iCACA,4BACA,gCACA,mBACA,oBACA,oCACA,2BACA,0BACA,sBACA,wBACE,EAA+B;EACjC;EACA,iBAAiB,GAAc;EAC/B,aAAa;EACb,qBAAqB;CACvB,CAAC;CA4ED,OAVA,EAAM,gBAAgB;EACpB,AAAI,MAAc,UAChB,EAAS,SAAS,MAAM;CAE5B,GAAG,CAAC,CAAS,CAAC,GAET,IAKH,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GACE,WAAU;GACV,eAAY;aAFd,CAIG,MAAc,SACb,kBAAC,SAAD;IACE,KAAK;IACL,eAAY;IACZ,UAjDgB,MAA8C;KACtE,AAAI,MAAc,WAChB,EAAM,eAAe,GACrB,EAAM,gBAAgB;IAE1B;IA6CU,cAjFe;KACvB,IAAI,EAAS,SAAS,SAAS,GAAgB;MAC7C,IAAM,IAAU,EAAS,QAAQ,MAAM,KAAK;MAC5C,AAAI,MAAY,GAAc,SAC5B,EACE;OAAE;OAAgB,UAAU;MAAQ,GACpC,EACE,iBAAiB;OACf,EAAoB,EAAE,EAAQ,0BAA0B,CAAC;MAC3D,EACF,CACF;KAEJ,OAAO,AAAI,EAAS,YAElB,EAAS,QAAQ,QAAQ,GAAc,SAAS;KAGlD,EAAa,MAAM;IACrB;IA+DU,UA7DW,MAAiD;KAEhE,EAAM,YAAY,eAGlB,EAAM,QAAQ,WAChB,EAAM,cAAc,KAAK;IAE7B;IAsDU,MAAK;IACL,cAAc,EAAa,SAAS;IACpC,WAAU;GACX,CAAA,IAED,kBAAC,OAAD;IACE,WAAU;IACV,eAAY;IACZ,qBA/FsB;KAC9B,EAAa,MAAM;IACrB;IA8FU,OAAO,EAAa,SAAS;cAE5B,EAAa;GACX,CAAA,GAGN,MAAc,UACb,kBAAC,OAAD;IACE,KAAK;IACL,WAAU;cAFZ,CAIE,kBAAC,GAAD,EAAgB,UAjEG,MAA+C;KAG1E,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAmB,CAAC,CAAe;IACrC,EA6DyD,CAAA,GAC9C,KACC,kBAAC,GAAD;KACE,eAAe,EAAmB,EAAK;KACvC,WA/DQ,MAA+C;MAInE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAa,MAAM,GACnB,EAAmB,EAAK;KAC1B;KA2Dc,UAAU;KACV,QAAQ,KAAiB,IAAa,KAAA;KACtC,eACE,KAAwB,IAAoB,KAAA;KAE9C,kBACE,KAAuB,IAAuB,KAAA;KAEhD,cAAc,KAAmB,IAAmB,KAAA;KACpD,aAAa,KAAkB,IAAkB,KAAA;KACjD,gBAAgB;KAChB,iBAAiB;KACP;KACV,qBArEZ,MACG;MAIH,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAgC,EAAI,GACpC,EAAmB,EAAK;KAC1B;KAgEc,wBACE,KACI,IACA,KAAA;KAEN,UAAS;KACT,WAAW;IACZ,CAAA,CAEA;KAEJ;;EAGL,kBAAC,GAAD;GACE,QAAQ;GACR,cAAc;EACf,CAAA;EAEA,KAAgC,KAC/B,kBAAC,GAAD;GACkB;GAChB,iBAAiB,EAAa;GAC9B,eAAe,EAAa;GAC5B,mBAAmB,EAAa;GAChC,OAAO,EAAa;GACpB,eAAe,EAAgC,EAAK;EACrD,CAAA;EAIH,kBAAC,GAAD;GACE,QAAQ;GACR,eAAe,EAAsB,EAAK;GAC1C,eAAe,MAAiB;EACjC,CAAA;EAGA,KACC,kBAAC,GAAD,EAAa,eAAe,EAAsB,EAAK,EAAI,CAAA;EAI5D,KACC,kBAAC,GAAD,EAAY,eAAe,EAAqB,EAAK,EAAI,CAAA;EAI1D,KACC,kBAAC,GAAD;GACE,WAAW;GACX,gBAAgB,EAA6B,EAAK;GAClD,mBAAmB,GAAc,SAAS;EAC3C,CAAA;EAGF,KACC,kBAAC,GAAD;GACE,WAAW;GACX,gBAAgB,GAA2B,EAAK;EACjD,CAAA;CAEH,EAAA,CAAA,IArHK;AAuHX"}
|
|
1
|
+
{"version":3,"file":"conversation-name.js","names":[],"sources":["../../../../src/components/features/conversation/conversation-name.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUpdateConversation } from \"#/hooks/mutation/use-update-conversation\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationNameContextMenu } from \"#/hooks/use-conversation-name-context-menu\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { EllipsisButton } from \"../conversation-panel/ellipsis-button\";\nimport { ConversationNameContextMenu } from \"./conversation-name-context-menu\";\nimport { SystemMessageModal } from \"../conversation-panel/system-message-modal\";\nimport { SkillsModal } from \"../conversation-panel/skills-modal\";\nimport { HooksModal } from \"../conversation-panel/hooks-modal\";\nimport { ConfirmDeleteModal } from \"../conversation-panel/confirm-delete-modal\";\nimport { ConfirmStopModal } from \"../conversation-panel/confirm-stop-modal\";\nimport { TranscriptExportModal } from \"./transcript-export-modal\";\n\nexport function ConversationName() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { data: conversation } = useActiveConversation();\n const { mutate: updateConversation } = useUpdateConversation();\n\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const [contextMenuOpen, setContextMenuOpen] = React.useState(false);\n const [transcriptExportModalVisible, setTranscriptExportModalVisible] =\n React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const ellipsisAnchorRef = React.useRef<HTMLDivElement>(null);\n\n // Use the custom hook for context menu handlers\n const {\n handleDelete,\n handleStop,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n systemMessage,\n shouldShowStop,\n shouldShowDownloadConversation,\n shouldShowDisplayCost,\n shouldShowAgentTools,\n shouldShowSkills,\n shouldShowHooks,\n } = useConversationNameContextMenu({\n conversationId,\n executionStatus: conversation?.execution_status,\n showOptions: true,\n onContextMenuToggle: setContextMenuOpen,\n });\n\n const handleDoubleClick = () => {\n setTitleMode(\"edit\");\n };\n\n const handleBlur = () => {\n if (inputRef.current?.value && conversationId) {\n const trimmed = inputRef.current.value.trim();\n if (trimmed !== conversation?.title) {\n updateConversation(\n { conversationId, newTitle: trimmed },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.CONVERSATION$TITLE_UPDATED));\n },\n },\n );\n }\n } else if (inputRef.current) {\n // reset the value if it's empty\n inputRef.current.value = conversation?.title ?? \"\";\n }\n\n setTitleMode(\"view\");\n };\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Ignore Enter key during IME composition (e.g., Chinese, Japanese, Korean input)\n if (event.nativeEvent.isComposing) {\n return;\n }\n if (event.key === \"Enter\") {\n event.currentTarget.blur();\n }\n };\n\n const handleInputClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (titleMode === \"edit\") {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n const handleEllipsisClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleRename = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n setContextMenuOpen(false);\n };\n\n const handleExportTranscript = (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setTranscriptExportModalVisible(true);\n setContextMenuOpen(false);\n };\n\n React.useEffect(() => {\n if (titleMode === \"edit\") {\n inputRef.current?.focus();\n }\n }, [titleMode]);\n\n if (!conversation) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"flex items-center gap-2 h-[22px] text-base font-normal text-left pl-0 lg:pl-1 min-w-0\"\n data-testid=\"conversation-name\"\n >\n {titleMode === \"edit\" ? (\n <input\n ref={inputRef}\n data-testid=\"conversation-name-input\"\n onClick={handleInputClick}\n onBlur={handleBlur}\n onKeyUp={handleKeyUp}\n type=\"text\"\n defaultValue={conversation.title || \"\"}\n className=\"text-white leading-5 bg-transparent border-none outline-none text-base font-normal w-fit max-w-fit field-sizing-content\"\n />\n ) : (\n <div\n className=\"text-white leading-5 truncate\"\n data-testid=\"conversation-name-title\"\n onDoubleClick={handleDoubleClick}\n title={conversation.title || \"\"}\n >\n {conversation.title}\n </div>\n )}\n\n {titleMode !== \"edit\" && (\n <div\n ref={ellipsisAnchorRef}\n className=\"relative flex items-center shrink-0\"\n >\n <EllipsisButton\n onClick={handleEllipsisClick}\n ariaLabel={t(I18nKey.COMMON$MORE_OPTIONS)}\n />\n {contextMenuOpen && (\n <ConversationNameContextMenu\n onClose={() => setContextMenuOpen(false)}\n onRename={handleRename}\n onDelete={handleDelete}\n onStop={shouldShowStop ? handleStop : undefined}\n onDisplayCost={\n shouldShowDisplayCost ? handleDisplayCost : undefined\n }\n onShowAgentTools={\n shouldShowAgentTools ? handleShowAgentTools : undefined\n }\n onShowSkills={shouldShowSkills ? handleShowSkills : undefined}\n onShowHooks={shouldShowHooks ? handleShowHooks : undefined}\n onTogglePublic={handleTogglePublic}\n onCopyShareLink={handleCopyShareLink}\n shareUrl={shareUrl}\n onExportTranscript={handleExportTranscript}\n onDownloadConversation={\n shouldShowDownloadConversation\n ? handleDownloadConversation\n : undefined\n }\n position=\"bottom\"\n anchorRef={ellipsisAnchorRef}\n />\n )}\n </div>\n )}\n </div>\n\n {transcriptExportModalVisible && conversationId && (\n <TranscriptExportModal\n conversationId={conversationId}\n conversationUrl={conversation.conversation_url}\n sessionApiKey={conversation.session_api_key}\n conversationTitle={conversation.title}\n model={conversation.llm_model}\n onClose={() => setTranscriptExportModalVisible(false)}\n />\n )}\n\n {/* System Message Modal */}\n <SystemMessageModal\n isOpen={systemModalVisible}\n onClose={() => setSystemModalVisible(false)}\n systemMessage={systemMessage || null}\n />\n\n {/* Skills Modal */}\n {skillsModalVisible && (\n <SkillsModal onClose={() => setSkillsModalVisible(false)} />\n )}\n\n {/* Hooks Modal */}\n {hooksModalVisible && (\n <HooksModal onClose={() => setHooksModalVisible(false)} />\n )}\n\n {/* Confirm Delete Modal */}\n {confirmDeleteModalVisible && (\n <ConfirmDeleteModal\n onConfirm={handleConfirmDelete}\n onCancel={() => setConfirmDeleteModalVisible(false)}\n conversationTitle={conversation?.title || \"\"}\n />\n )}\n\n {confirmStopModalVisible && (\n <ConfirmStopModal\n onConfirm={handleConfirmStop}\n onCancel={() => setConfirmStopModalVisible(false)}\n />\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../../hooks/use-conversation-id.cjs"),t=require("../../../../../stores/conversation-store.cjs"),n=require("./tab-wrapper.cjs"),r=require("./tab-container.cjs"),i=require("./tab-content-area.cjs"),a=require("./conversation-tab-content-crossfade.cjs");let o=require("react"),s=require("react/jsx-runtime");var c=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/files-tab.cjs"))),l=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/browser-tab.cjs"))),u=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/planner-tab.cjs"))),d=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/task-list-tab.cjs"))),f=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../terminal/terminal.cjs"))),
|
|
1
|
+
require("../../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../../hooks/use-conversation-id.cjs"),t=require("../../../../../stores/conversation-store.cjs"),n=require("./tab-wrapper.cjs"),r=require("./tab-container.cjs"),i=require("./tab-content-area.cjs"),a=require("./conversation-tab-content-crossfade.cjs");let o=require("react"),s=require("react/jsx-runtime");var c=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/files-tab.cjs"))),l=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/browser-tab.cjs"))),u=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/planner-tab.cjs"))),d=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/task-list-tab.cjs"))),f=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../../../routes/usage-tab.cjs"))),p=(0,o.lazy)(()=>Promise.resolve().then(()=>require("../../../terminal/terminal.cjs"))),m={tasklist:{component:d},files:{component:c},browser:{component:l},terminal:{component:p},planner:{component:u},usage:{component:f}};function h(){let{selectedTab:c,shouldShownAgentLoading:l}=t.useConversationStore(),{conversationId:u}=e.useConversationId(),d=(0,o.useMemo)(()=>m[c]??m.files,[c]).component,f=c===`terminal`?`${c}-${u}`:c??`files`;return(0,s.jsx)(r.TabContainer,{children:(0,s.jsx)(i.TabContentArea,{children:(0,s.jsx)(a.ConversationTabContentCrossfade,{showAgentLoading:l,tabKey:f,children:(0,s.jsx)(n.TabWrapper,{children:(0,s.jsx)(d,{})},f)})})})}exports.ConversationTabContent=h;
|
|
2
2
|
//# sourceMappingURL=conversation-tab-content.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-tab-content.cjs","names":[],"sources":["../../../../../../src/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.tsx"],"sourcesContent":["import { lazy, useMemo } from \"react\";\nimport { TabWrapper } from \"./tab-wrapper\";\nimport { TabContainer } from \"./tab-container\";\nimport { TabContentArea } from \"./tab-content-area\";\nimport { ConversationTabContentCrossfade } from \"./conversation-tab-content-crossfade\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\n\n// Lazy load all tab components, including the terminal — xterm + addon-fit +\n// xterm.css are large enough that we don't want them in the conversation\n// route's eager graph just because the terminal tab might be selected later.\nconst FilesTab = lazy(() => import(\"#/routes/files-tab\"));\nconst BrowserTab = lazy(() => import(\"#/routes/browser-tab\"));\nconst PlannerTab = lazy(() => import(\"#/routes/planner-tab\"));\nconst TaskListTab = lazy(() => import(\"#/routes/task-list-tab\"));\nconst Terminal = lazy(() => import(\"#/components/features/terminal/terminal\"));\n\nconst TAB_CONFIG = {\n tasklist: { component: TaskListTab },\n files: { component: FilesTab },\n browser: { component: BrowserTab },\n terminal: { component: Terminal },\n planner: { component: PlannerTab },\n};\n\nexport function ConversationTabContent() {\n const { selectedTab, shouldShownAgentLoading } = useConversationStore();\n const { conversationId } = useConversationId();\n\n const activeTab = useMemo(\n () =>\n TAB_CONFIG[selectedTab as keyof typeof TAB_CONFIG] ?? TAB_CONFIG.files,\n [selectedTab],\n );\n\n const ActiveComponent = activeTab.component;\n\n const tabWrapperKey =\n selectedTab === \"terminal\"\n ? `${selectedTab}-${conversationId}`\n : (selectedTab ?? \"files\");\n\n return (\n <TabContainer>\n <TabContentArea>\n <ConversationTabContentCrossfade\n showAgentLoading={shouldShownAgentLoading}\n tabKey={tabWrapperKey}\n >\n <TabWrapper key={tabWrapperKey}>\n <ActiveComponent />\n </TabWrapper>\n </ConversationTabContentCrossfade>\n </TabContentArea>\n </TabContainer>\n );\n}\n"],"mappings":"mYAWA,IAAM,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAsB,qCAAA,CAAA,CAA4B,EAClD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAwB,uCAAA,CAAA,CAA8B,EACtD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAwB,uCAAA,CAAA,CAA8B,EACtD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAyB,yCAAA,CAAA,CAAgC,EACzD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAsB,gCAAA,CAAA,CAAiD,EAEvE,EAAa,CACjB,SAAU,CAAE,UAAW,CAAY,EACnC,MAAO,CAAE,UAAW,CAAS,EAC7B,QAAS,CAAE,UAAW,CAAW,EACjC,SAAU,CAAE,UAAW,CAAS,EAChC,QAAS,CAAE,UAAW,CAAW,
|
|
1
|
+
{"version":3,"file":"conversation-tab-content.cjs","names":[],"sources":["../../../../../../src/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.tsx"],"sourcesContent":["import { lazy, useMemo } from \"react\";\nimport { TabWrapper } from \"./tab-wrapper\";\nimport { TabContainer } from \"./tab-container\";\nimport { TabContentArea } from \"./tab-content-area\";\nimport { ConversationTabContentCrossfade } from \"./conversation-tab-content-crossfade\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\n\n// Lazy load all tab components, including the terminal — xterm + addon-fit +\n// xterm.css are large enough that we don't want them in the conversation\n// route's eager graph just because the terminal tab might be selected later.\nconst FilesTab = lazy(() => import(\"#/routes/files-tab\"));\nconst BrowserTab = lazy(() => import(\"#/routes/browser-tab\"));\nconst PlannerTab = lazy(() => import(\"#/routes/planner-tab\"));\nconst TaskListTab = lazy(() => import(\"#/routes/task-list-tab\"));\nconst UsageTab = lazy(() => import(\"#/routes/usage-tab\"));\nconst Terminal = lazy(() => import(\"#/components/features/terminal/terminal\"));\n\nconst TAB_CONFIG = {\n tasklist: { component: TaskListTab },\n files: { component: FilesTab },\n browser: { component: BrowserTab },\n terminal: { component: Terminal },\n planner: { component: PlannerTab },\n usage: { component: UsageTab },\n};\n\nexport function ConversationTabContent() {\n const { selectedTab, shouldShownAgentLoading } = useConversationStore();\n const { conversationId } = useConversationId();\n\n const activeTab = useMemo(\n () =>\n TAB_CONFIG[selectedTab as keyof typeof TAB_CONFIG] ?? TAB_CONFIG.files,\n [selectedTab],\n );\n\n const ActiveComponent = activeTab.component;\n\n const tabWrapperKey =\n selectedTab === \"terminal\"\n ? `${selectedTab}-${conversationId}`\n : (selectedTab ?? \"files\");\n\n return (\n <TabContainer>\n <TabContentArea>\n <ConversationTabContentCrossfade\n showAgentLoading={shouldShownAgentLoading}\n tabKey={tabWrapperKey}\n >\n <TabWrapper key={tabWrapperKey}>\n <ActiveComponent />\n </TabWrapper>\n </ConversationTabContentCrossfade>\n </TabContentArea>\n </TabContainer>\n );\n}\n"],"mappings":"mYAWA,IAAM,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAsB,qCAAA,CAAA,CAA4B,EAClD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAwB,uCAAA,CAAA,CAA8B,EACtD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAwB,uCAAA,CAAA,CAA8B,EACtD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAyB,yCAAA,CAAA,CAAgC,EACzD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAsB,qCAAA,CAAA,CAA4B,EAClD,GAAA,EAAA,EAAA,UAAA,QAAA,QAAA,EAAA,SAAA,QAAsB,gCAAA,CAAA,CAAiD,EAEvE,EAAa,CACjB,SAAU,CAAE,UAAW,CAAY,EACnC,MAAO,CAAE,UAAW,CAAS,EAC7B,QAAS,CAAE,UAAW,CAAW,EACjC,SAAU,CAAE,UAAW,CAAS,EAChC,QAAS,CAAE,UAAW,CAAW,EACjC,MAAO,CAAE,UAAW,CAAS,CAC/B,EAEA,SAAgB,GAAyB,CACvC,GAAM,CAAE,cAAa,2BAA4B,EAAA,qBAAqB,EAChE,CAAE,kBAAmB,EAAA,kBAAkB,EAQvC,GAAA,EAAA,EAAA,aAJF,EAAW,IAA2C,EAAW,MACnE,CAAC,CAAW,CAGU,EAAU,UAE5B,EACJ,IAAgB,WACZ,GAAG,EAAY,GAAG,IACjB,GAAe,QAEtB,OACE,EAAA,EAAA,KAAC,EAAA,aAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAA,eAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAA,gCAAD,CACE,iBAAkB,EAClB,OAAQ,YAER,EAAA,EAAA,KAAC,EAAA,WAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CAAkB,CAAA,CACR,EAFK,CAEL,CACmB,CAAA,CACnB,CAAA,CACJ,CAAA,CAElB"}
|
|
@@ -7,15 +7,16 @@ import { ConversationTabContentCrossfade as a } from "./conversation-tab-content
|
|
|
7
7
|
import { lazy as o, useMemo as s } from "react";
|
|
8
8
|
import { jsx as c } from "react/jsx-runtime";
|
|
9
9
|
//#region src/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.tsx
|
|
10
|
-
var l = o(() => import("../../../../../routes/files-tab.js")), u = o(() => import("../../../../../routes/browser-tab.js")), d = o(() => import("../../../../../routes/planner-tab.js")), f = o(() => import("../../../../../routes/task-list-tab.js")), p = o(() => import("../../../terminal/terminal.js")),
|
|
10
|
+
var l = o(() => import("../../../../../routes/files-tab.js")), u = o(() => import("../../../../../routes/browser-tab.js")), d = o(() => import("../../../../../routes/planner-tab.js")), f = o(() => import("../../../../../routes/task-list-tab.js")), p = o(() => import("../../../../../routes/usage-tab.js")), m = o(() => import("../../../terminal/terminal.js")), h = {
|
|
11
11
|
tasklist: { component: f },
|
|
12
12
|
files: { component: l },
|
|
13
13
|
browser: { component: u },
|
|
14
|
-
terminal: { component:
|
|
15
|
-
planner: { component: d }
|
|
14
|
+
terminal: { component: m },
|
|
15
|
+
planner: { component: d },
|
|
16
|
+
usage: { component: p }
|
|
16
17
|
};
|
|
17
|
-
function
|
|
18
|
-
let { selectedTab: o, shouldShownAgentLoading: l } = t(), { conversationId: u } = e(), d = s(() =>
|
|
18
|
+
function g() {
|
|
19
|
+
let { selectedTab: o, shouldShownAgentLoading: l } = t(), { conversationId: u } = e(), d = s(() => h[o] ?? h.files, [o]).component, f = o === "terminal" ? `${o}-${u}` : o ?? "files";
|
|
19
20
|
return /* @__PURE__ */ c(r, { children: /* @__PURE__ */ c(i, { children: /* @__PURE__ */ c(a, {
|
|
20
21
|
showAgentLoading: l,
|
|
21
22
|
tabKey: f,
|
|
@@ -23,6 +24,6 @@ function h() {
|
|
|
23
24
|
}) }) });
|
|
24
25
|
}
|
|
25
26
|
//#endregion
|
|
26
|
-
export {
|
|
27
|
+
export { g as ConversationTabContent };
|
|
27
28
|
|
|
28
29
|
//# sourceMappingURL=conversation-tab-content.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-tab-content.js","names":[],"sources":["../../../../../../src/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.tsx"],"sourcesContent":["import { lazy, useMemo } from \"react\";\nimport { TabWrapper } from \"./tab-wrapper\";\nimport { TabContainer } from \"./tab-container\";\nimport { TabContentArea } from \"./tab-content-area\";\nimport { ConversationTabContentCrossfade } from \"./conversation-tab-content-crossfade\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\n\n// Lazy load all tab components, including the terminal — xterm + addon-fit +\n// xterm.css are large enough that we don't want them in the conversation\n// route's eager graph just because the terminal tab might be selected later.\nconst FilesTab = lazy(() => import(\"#/routes/files-tab\"));\nconst BrowserTab = lazy(() => import(\"#/routes/browser-tab\"));\nconst PlannerTab = lazy(() => import(\"#/routes/planner-tab\"));\nconst TaskListTab = lazy(() => import(\"#/routes/task-list-tab\"));\nconst Terminal = lazy(() => import(\"#/components/features/terminal/terminal\"));\n\nconst TAB_CONFIG = {\n tasklist: { component: TaskListTab },\n files: { component: FilesTab },\n browser: { component: BrowserTab },\n terminal: { component: Terminal },\n planner: { component: PlannerTab },\n};\n\nexport function ConversationTabContent() {\n const { selectedTab, shouldShownAgentLoading } = useConversationStore();\n const { conversationId } = useConversationId();\n\n const activeTab = useMemo(\n () =>\n TAB_CONFIG[selectedTab as keyof typeof TAB_CONFIG] ?? TAB_CONFIG.files,\n [selectedTab],\n );\n\n const ActiveComponent = activeTab.component;\n\n const tabWrapperKey =\n selectedTab === \"terminal\"\n ? `${selectedTab}-${conversationId}`\n : (selectedTab ?? \"files\");\n\n return (\n <TabContainer>\n <TabContentArea>\n <ConversationTabContentCrossfade\n showAgentLoading={shouldShownAgentLoading}\n tabKey={tabWrapperKey}\n >\n <TabWrapper key={tabWrapperKey}>\n <ActiveComponent />\n </TabWrapper>\n </ConversationTabContentCrossfade>\n </TabContentArea>\n </TabContainer>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,IAAW,QAAW,OAAO,qCAAqB,GAClD,IAAa,QAAW,OAAO,uCAAuB,GACtD,IAAa,QAAW,OAAO,uCAAuB,GACtD,IAAc,QAAW,OAAO,yCAAyB,GACzD,IAAW,QAAW,OAAO,gCAA0C,GAEvE,IAAa;CACjB,UAAU,EAAE,WAAW,EAAY;CACnC,OAAO,EAAE,WAAW,EAAS;CAC7B,SAAS,EAAE,WAAW,EAAW;CACjC,UAAU,EAAE,WAAW,EAAS;CAChC,SAAS,EAAE,WAAW,EAAW;
|
|
1
|
+
{"version":3,"file":"conversation-tab-content.js","names":[],"sources":["../../../../../../src/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.tsx"],"sourcesContent":["import { lazy, useMemo } from \"react\";\nimport { TabWrapper } from \"./tab-wrapper\";\nimport { TabContainer } from \"./tab-container\";\nimport { TabContentArea } from \"./tab-content-area\";\nimport { ConversationTabContentCrossfade } from \"./conversation-tab-content-crossfade\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\n\n// Lazy load all tab components, including the terminal — xterm + addon-fit +\n// xterm.css are large enough that we don't want them in the conversation\n// route's eager graph just because the terminal tab might be selected later.\nconst FilesTab = lazy(() => import(\"#/routes/files-tab\"));\nconst BrowserTab = lazy(() => import(\"#/routes/browser-tab\"));\nconst PlannerTab = lazy(() => import(\"#/routes/planner-tab\"));\nconst TaskListTab = lazy(() => import(\"#/routes/task-list-tab\"));\nconst UsageTab = lazy(() => import(\"#/routes/usage-tab\"));\nconst Terminal = lazy(() => import(\"#/components/features/terminal/terminal\"));\n\nconst TAB_CONFIG = {\n tasklist: { component: TaskListTab },\n files: { component: FilesTab },\n browser: { component: BrowserTab },\n terminal: { component: Terminal },\n planner: { component: PlannerTab },\n usage: { component: UsageTab },\n};\n\nexport function ConversationTabContent() {\n const { selectedTab, shouldShownAgentLoading } = useConversationStore();\n const { conversationId } = useConversationId();\n\n const activeTab = useMemo(\n () =>\n TAB_CONFIG[selectedTab as keyof typeof TAB_CONFIG] ?? TAB_CONFIG.files,\n [selectedTab],\n );\n\n const ActiveComponent = activeTab.component;\n\n const tabWrapperKey =\n selectedTab === \"terminal\"\n ? `${selectedTab}-${conversationId}`\n : (selectedTab ?? \"files\");\n\n return (\n <TabContainer>\n <TabContentArea>\n <ConversationTabContentCrossfade\n showAgentLoading={shouldShownAgentLoading}\n tabKey={tabWrapperKey}\n >\n <TabWrapper key={tabWrapperKey}>\n <ActiveComponent />\n </TabWrapper>\n </ConversationTabContentCrossfade>\n </TabContentArea>\n </TabContainer>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,IAAW,QAAW,OAAO,qCAAqB,GAClD,IAAa,QAAW,OAAO,uCAAuB,GACtD,IAAa,QAAW,OAAO,uCAAuB,GACtD,IAAc,QAAW,OAAO,yCAAyB,GACzD,IAAW,QAAW,OAAO,qCAAqB,GAClD,IAAW,QAAW,OAAO,gCAA0C,GAEvE,IAAa;CACjB,UAAU,EAAE,WAAW,EAAY;CACnC,OAAO,EAAE,WAAW,EAAS;CAC7B,SAAS,EAAE,WAAW,EAAW;CACjC,UAAU,EAAE,WAAW,EAAS;CAChC,SAAS,EAAE,WAAW,EAAW;CACjC,OAAO,EAAE,WAAW,EAAS;AAC/B;AAEA,SAAgB,IAAyB;CACvC,IAAM,EAAE,gBAAa,+BAA4B,EAAqB,GAChE,EAAE,sBAAmB,EAAkB,GAQvC,IANY,QAEd,EAAW,MAA2C,EAAW,OACnE,CAAC,CAAW,CAGU,EAAU,WAE5B,IACJ,MAAgB,aACZ,GAAG,EAAY,GAAG,MACjB,KAAe;CAEtB,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,kBAAkB;EAClB,QAAQ;YAER,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,CAAkB,CAAA,EACR,GAFK,CAEL;CACmB,CAAA,EACnB,CAAA,EACJ,CAAA;AAElB"}
|
package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs
CHANGED
|
@@ -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("../../../../node_modules/lucide-react/dist/esm/icons/
|
|
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("../../../../node_modules/lucide-react/dist/esm/icons/gauge.cjs"),i=require("../../../../node_modules/lucide-react/dist/esm/icons/globe.cjs"),a=require("../../../../node_modules/lucide-react/dist/esm/icons/list-todo.cjs"),o=require("../../../../node_modules/lucide-react/dist/esm/icons/square-chevron-right.cjs"),s=require("../../../../utils/utils.cjs"),c=require("../../../../hooks/use-conversation-id.cjs"),l=require("../../../../utils/conversation-local-storage.cjs"),u=require("../../../../stores/conversation-store.cjs"),d=require("../../../../contexts/active-backend-context.cjs"),f=require("../../../../utils/dropdown-classes.cjs"),p=require("../../../../ui/context-menu.cjs"),m=require("../../../../hooks/use-click-outside-element.cjs"),h=require("../../../../hooks/use-select-conversation-tab.cjs"),g=require("../../../../icons/document.cjs"),_=require("../../context-menu/archived-disabled-tooltip.cjs"),v=require("../../../../hooks/use-is-archived-conversation.cjs"),y=require("../../../../icons/double-check.cjs"),b=require("../../../../icons/pill.cjs"),x=require("../../../../icons/pill-fill.cjs"),S=require("../../../../hooks/use-task-list.cjs");let C=require("react");C=e.__toESM(C,1);let w=require("react/jsx-runtime"),T=require("react-dom");T=e.__toESM(T,1);function E({isOpen:e,onClose:E,ignoreOutsideClickRef:D,anchorRef:O}){let k=m.useClickOutsideElement(E,D),[A,j]=(0,C.useState)();(0,C.useLayoutEffect)(()=>{if(!e||!O?.current){j(void 0);return}let t=()=>{let e=O.current?.getBoundingClientRect();e&&j({position:`fixed`,zIndex:9999,top:e.bottom+8,left:e.left})};return t(),window.addEventListener(`resize`,t),window.addEventListener(`scroll`,t,!0),()=>{window.removeEventListener(`resize`,t),window.removeEventListener(`scroll`,t,!0)}},[e,O]);let{t:M}=t.useTranslation(`openhands`),{conversationId:N}=c.useConversationId(),{state:P,setUnpinnedTabs:F,setSelectedTab:I}=l.useConversationLocalStorageState(N),{selectedTab:L,isRightPanelShown:R,setSelectedTab:z}=u.useConversationStore(),{navigateToTab:B}=h.useSelectConversationTab(),{hasTaskList:V}=S.useTaskList(),{backend:H}=d.useActiveBackend(),U=v.useIsArchivedConversation(),W=[{tab:`planner`,icon:a.ListTodo,i18nKey:n.I18nKey.COMMON$PLANNER},{tab:`files`,icon:g.default,i18nKey:n.I18nKey.COMMON$FILES},{tab:`terminal`,icon:o.SquareChevronRight,i18nKey:n.I18nKey.COMMON$TERMINAL},{tab:`browser`,icon:i.Globe,i18nKey:n.I18nKey.COMMON$BROWSER},{tab:`usage`,icon:r.Gauge,i18nKey:n.I18nKey.COMMON$USAGE}];V&&W.unshift({tab:`tasklist`,icon:y.default,i18nKey:n.I18nKey.COMMON$TASK_LIST});let G=W.filter(({tab:e})=>e!==`planner`||H.kind===`cloud`),K=e=>{U||(B(e),E())},q=(e,t)=>{if(U){t.preventDefault(),t.stopPropagation();return}if(t.preventDefault(),t.stopPropagation(),P.unpinnedTabs.includes(e))F(P.unpinnedTabs.filter(t=>t!==e));else{let t=[...P.unpinnedTabs,e];if(F(t),L===e&&R){let n=G.find(({tab:n})=>n!==e&&!t.includes(n));n&&(z(n.tab),I(n.tab))}}};if(!e)return null;let J=!!(O?.current&&A),Y=(0,w.jsx)(p.ContextMenu,{ref:k,theme:J?`popover`:`default`,position:J?`none`:`bottom`,alignment:J?`none`:`left`,spacing:J?`none`:`default`,className:s.cn(`z-[9999] w-fit`,J?`mt-0`:`mt-2`),children:G.map(({tab:e,icon:t,i18nKey:r})=>{let i=!P.unpinnedTabs.includes(e);return(0,w.jsx)(`li`,{className:`list-none`,children:(0,w.jsx)(_.ArchivedDisabledTooltip,{isDisabled:U,children:(0,w.jsxs)(`div`,{className:s.cn(`group flex h-[30px] w-full min-w-0 items-stretch rounded`,!U&&`hover:bg-[var(--oh-interactive-hover)]`,U&&`opacity-50`),children:[(0,w.jsxs)(`button`,{type:`button`,"data-testid":`conversation-tabs-menu-open-${e}`,disabled:U,className:s.cn(`flex min-w-0 flex-1 items-center gap-2 rounded-l p-2 text-start text-white`,f.dropdownInstantColorClassName,U?`cursor-not-allowed`:`cursor-pointer`),onClick:()=>K(e),children:[(0,w.jsx)(`span`,{className:f.dropdownMenuRowIconWrapperClassName,"aria-hidden":!0,children:(0,w.jsx)(t,{className:`h-4 w-4`})}),(0,w.jsx)(`span`,{className:`text-sm`,children:M(r)})]}),(0,w.jsx)(`button`,{type:`button`,"data-testid":`conversation-tabs-menu-pin-${e}`,disabled:U,className:s.cn(`flex shrink-0 items-center justify-center rounded-r px-2 text-white`,f.dropdownInstantColorClassName,U?`cursor-not-allowed`:`cursor-pointer hover:bg-white/10`),"aria-pressed":i,"aria-label":M(i?n.I18nKey.CONVERSATION$UNPIN_TAB:n.I18nKey.CONVERSATION$PIN_TAB),onClick:t=>q(e,t),children:i?(0,w.jsx)(`span`,{className:s.cn(`-mr-[5px] ml-auto`,f.dropdownMenuRowIconWrapperClassName),"aria-hidden":!0,children:(0,w.jsx)(x.default,{className:`h-7 w-7`})}):(0,w.jsx)(`span`,{className:s.cn(`ml-auto`,f.dropdownMenuRowIconWrapperClassName),"aria-hidden":!0,children:(0,w.jsx)(b.default,{className:`h-4.5 w-4.5`})})})]})})},e)})});return J&&A&&typeof document<`u`?T.default.createPortal((0,w.jsx)(`div`,{style:A,children:Y}),document.body):Y}exports.ConversationTabsContextMenu=E;
|
|
2
2
|
//# sourceMappingURL=conversation-tabs-context-menu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-tabs-context-menu.cjs","names":[],"sources":["../../../../../src/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.tsx"],"sourcesContent":["import React, { useLayoutEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { ContextMenu } from \"#/ui/context-menu\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationLocalStorageState } from \"#/utils/conversation-local-storage\";\nimport {\n useConversationStore,\n type ConversationTab,\n} from \"#/stores/conversation-store\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Globe, ListTodo, SquareChevronRight } from \"lucide-react\";\nimport DocumentIcon from \"#/icons/document.svg?react\";\nimport PillIcon from \"#/icons/pill.svg?react\";\nimport PillFillIcon from \"#/icons/pill-fill.svg?react\";\nimport DoubleCheckIcon from \"#/icons/double-check.svg?react\";\nimport { useTaskList } from \"#/hooks/use-task-list\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useSelectConversationTab } from \"#/hooks/use-select-conversation-tab\";\nimport { useIsArchivedConversation } from \"#/hooks/use-is-archived-conversation\";\nimport { ArchivedDisabledTooltip } from \"../../context-menu/archived-disabled-tooltip\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuRowIconWrapperClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface ConversationTabsContextMenuProps {\n isOpen: boolean;\n onClose: () => void;\n ignoreOutsideClickRef?: React.RefObject<HTMLElement | null>;\n /** Portal anchor so the menu is not clipped by drawer overflow. */\n anchorRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport function ConversationTabsContextMenu({\n isOpen,\n onClose,\n ignoreOutsideClickRef,\n anchorRef,\n}: ConversationTabsContextMenuProps) {\n const ref = useClickOutsideElement<HTMLUListElement>(\n onClose,\n ignoreOutsideClickRef,\n );\n const [portalStyle, setPortalStyle] = useState<React.CSSProperties>();\n\n useLayoutEffect(() => {\n if (!isOpen || !anchorRef?.current) {\n setPortalStyle(undefined);\n return undefined;\n }\n\n const updatePosition = () => {\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const gap = 8;\n setPortalStyle({\n position: \"fixed\",\n zIndex: 9999,\n top: rect.bottom + gap,\n left: rect.left,\n });\n };\n\n updatePosition();\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [isOpen, anchorRef]);\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const {\n state,\n setUnpinnedTabs,\n setSelectedTab: setPersistedSelectedTab,\n } = useConversationLocalStorageState(conversationId);\n const { selectedTab, isRightPanelShown, setSelectedTab } =\n useConversationStore();\n\n const { navigateToTab } = useSelectConversationTab();\n\n const { hasTaskList } = useTaskList();\n const { backend } = useActiveBackend();\n const isArchivedConversation = useIsArchivedConversation();\n\n const tabConfig = [\n {\n tab: \"planner\",\n icon: ListTodo,\n i18nKey: I18nKey.COMMON$PLANNER,\n },\n { tab: \"files\", icon: DocumentIcon, i18nKey: I18nKey.COMMON$FILES },\n {\n tab: \"terminal\",\n icon: SquareChevronRight,\n i18nKey: I18nKey.COMMON$TERMINAL,\n },\n { tab: \"browser\", icon: Globe, i18nKey: I18nKey.COMMON$BROWSER },\n ];\n\n if (hasTaskList) {\n tabConfig.unshift({\n tab: \"tasklist\",\n icon: DoubleCheckIcon,\n i18nKey: I18nKey.COMMON$TASK_LIST,\n });\n }\n\n const visibleTabConfig = tabConfig.filter(\n ({ tab }) => tab !== \"planner\" || backend.kind === \"cloud\",\n );\n\n const handleOpenTab = (tab: string) => {\n if (isArchivedConversation) {\n return;\n }\n navigateToTab(tab as ConversationTab);\n onClose();\n };\n\n const handlePinToggle = (tab: string, e: React.MouseEvent) => {\n if (isArchivedConversation) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n if (state.unpinnedTabs.includes(tab)) {\n setUnpinnedTabs(state.unpinnedTabs.filter((item) => item !== tab));\n } else {\n const newUnpinnedTabs = [...state.unpinnedTabs, tab];\n setUnpinnedTabs(newUnpinnedTabs);\n\n if (selectedTab === tab && isRightPanelShown) {\n const nextPinnedTab = visibleTabConfig.find(\n ({ tab: tabKey }) =>\n tabKey !== tab && !newUnpinnedTabs.includes(tabKey),\n );\n\n if (nextPinnedTab) {\n setSelectedTab(nextPinnedTab.tab as ConversationTab);\n setPersistedSelectedTab(nextPinnedTab.tab as ConversationTab);\n }\n }\n }\n };\n\n if (!isOpen) return null;\n\n const isPortaled = Boolean(anchorRef?.current && portalStyle);\n\n const menu = (\n <ContextMenu\n ref={ref}\n theme={isPortaled ? \"popover\" : \"default\"}\n position={isPortaled ? \"none\" : \"bottom\"}\n alignment={isPortaled ? \"none\" : \"left\"}\n spacing={isPortaled ? \"none\" : \"default\"}\n className={cn(\"z-[9999] w-fit\", isPortaled ? \"mt-0\" : \"mt-2\")}\n >\n {visibleTabConfig.map(({ tab, icon: Icon, i18nKey }) => {\n const pinned = !state.unpinnedTabs.includes(tab);\n return (\n <li key={tab} className=\"list-none\">\n <ArchivedDisabledTooltip isDisabled={isArchivedConversation}>\n <div\n className={cn(\n \"group flex h-[30px] w-full min-w-0 items-stretch rounded\",\n !isArchivedConversation &&\n \"hover:bg-[var(--oh-interactive-hover)]\",\n isArchivedConversation && \"opacity-50\",\n )}\n >\n <button\n type=\"button\"\n data-testid={`conversation-tabs-menu-open-${tab}`}\n disabled={isArchivedConversation}\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-2 rounded-l p-2 text-start text-white\",\n dropdownInstantColorClassName,\n isArchivedConversation\n ? \"cursor-not-allowed\"\n : \"cursor-pointer\",\n )}\n onClick={() => handleOpenTab(tab)}\n >\n <span\n className={dropdownMenuRowIconWrapperClassName}\n aria-hidden\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"text-sm\">{t(i18nKey)}</span>\n </button>\n <button\n type=\"button\"\n data-testid={`conversation-tabs-menu-pin-${tab}`}\n disabled={isArchivedConversation}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-r px-2 text-white\",\n dropdownInstantColorClassName,\n isArchivedConversation\n ? \"cursor-not-allowed\"\n : \"cursor-pointer hover:bg-white/10\",\n )}\n aria-pressed={pinned}\n aria-label={\n pinned\n ? t(I18nKey.CONVERSATION$UNPIN_TAB)\n : t(I18nKey.CONVERSATION$PIN_TAB)\n }\n onClick={(e) => handlePinToggle(tab, e)}\n >\n {pinned ? (\n <span\n className={cn(\n \"-mr-[5px] ml-auto\",\n dropdownMenuRowIconWrapperClassName,\n )}\n aria-hidden\n >\n <PillFillIcon className=\"h-7 w-7\" />\n </span>\n ) : (\n <span\n className={cn(\n \"ml-auto\",\n dropdownMenuRowIconWrapperClassName,\n )}\n aria-hidden\n >\n <PillIcon className=\"h-4.5 w-4.5\" />\n </span>\n )}\n </button>\n </div>\n </ArchivedDisabledTooltip>\n </li>\n );\n })}\n </ContextMenu>\n );\n\n if (isPortaled && portalStyle && typeof document !== \"undefined\") {\n return ReactDOM.createPortal(\n <div style={portalStyle}>{menu}</div>,\n document.body,\n );\n }\n\n return menu;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-tabs-context-menu.cjs","names":[],"sources":["../../../../../src/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.tsx"],"sourcesContent":["import React, { useLayoutEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { ContextMenu } from \"#/ui/context-menu\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationLocalStorageState } from \"#/utils/conversation-local-storage\";\nimport {\n useConversationStore,\n type ConversationTab,\n} from \"#/stores/conversation-store\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Gauge, Globe, ListTodo, SquareChevronRight } from \"lucide-react\";\nimport DocumentIcon from \"#/icons/document.svg?react\";\nimport PillIcon from \"#/icons/pill.svg?react\";\nimport PillFillIcon from \"#/icons/pill-fill.svg?react\";\nimport DoubleCheckIcon from \"#/icons/double-check.svg?react\";\nimport { useTaskList } from \"#/hooks/use-task-list\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useSelectConversationTab } from \"#/hooks/use-select-conversation-tab\";\nimport { useIsArchivedConversation } from \"#/hooks/use-is-archived-conversation\";\nimport { ArchivedDisabledTooltip } from \"../../context-menu/archived-disabled-tooltip\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuRowIconWrapperClassName,\n} from \"#/utils/dropdown-classes\";\n\ninterface ConversationTabsContextMenuProps {\n isOpen: boolean;\n onClose: () => void;\n ignoreOutsideClickRef?: React.RefObject<HTMLElement | null>;\n /** Portal anchor so the menu is not clipped by drawer overflow. */\n anchorRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport function ConversationTabsContextMenu({\n isOpen,\n onClose,\n ignoreOutsideClickRef,\n anchorRef,\n}: ConversationTabsContextMenuProps) {\n const ref = useClickOutsideElement<HTMLUListElement>(\n onClose,\n ignoreOutsideClickRef,\n );\n const [portalStyle, setPortalStyle] = useState<React.CSSProperties>();\n\n useLayoutEffect(() => {\n if (!isOpen || !anchorRef?.current) {\n setPortalStyle(undefined);\n return undefined;\n }\n\n const updatePosition = () => {\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const gap = 8;\n setPortalStyle({\n position: \"fixed\",\n zIndex: 9999,\n top: rect.bottom + gap,\n left: rect.left,\n });\n };\n\n updatePosition();\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [isOpen, anchorRef]);\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const {\n state,\n setUnpinnedTabs,\n setSelectedTab: setPersistedSelectedTab,\n } = useConversationLocalStorageState(conversationId);\n const { selectedTab, isRightPanelShown, setSelectedTab } =\n useConversationStore();\n\n const { navigateToTab } = useSelectConversationTab();\n\n const { hasTaskList } = useTaskList();\n const { backend } = useActiveBackend();\n const isArchivedConversation = useIsArchivedConversation();\n\n const tabConfig = [\n {\n tab: \"planner\",\n icon: ListTodo,\n i18nKey: I18nKey.COMMON$PLANNER,\n },\n { tab: \"files\", icon: DocumentIcon, i18nKey: I18nKey.COMMON$FILES },\n {\n tab: \"terminal\",\n icon: SquareChevronRight,\n i18nKey: I18nKey.COMMON$TERMINAL,\n },\n { tab: \"browser\", icon: Globe, i18nKey: I18nKey.COMMON$BROWSER },\n { tab: \"usage\", icon: Gauge, i18nKey: I18nKey.COMMON$USAGE },\n ];\n\n if (hasTaskList) {\n tabConfig.unshift({\n tab: \"tasklist\",\n icon: DoubleCheckIcon,\n i18nKey: I18nKey.COMMON$TASK_LIST,\n });\n }\n\n const visibleTabConfig = tabConfig.filter(\n ({ tab }) => tab !== \"planner\" || backend.kind === \"cloud\",\n );\n\n const handleOpenTab = (tab: string) => {\n if (isArchivedConversation) {\n return;\n }\n navigateToTab(tab as ConversationTab);\n onClose();\n };\n\n const handlePinToggle = (tab: string, e: React.MouseEvent) => {\n if (isArchivedConversation) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n if (state.unpinnedTabs.includes(tab)) {\n setUnpinnedTabs(state.unpinnedTabs.filter((item) => item !== tab));\n } else {\n const newUnpinnedTabs = [...state.unpinnedTabs, tab];\n setUnpinnedTabs(newUnpinnedTabs);\n\n if (selectedTab === tab && isRightPanelShown) {\n const nextPinnedTab = visibleTabConfig.find(\n ({ tab: tabKey }) =>\n tabKey !== tab && !newUnpinnedTabs.includes(tabKey),\n );\n\n if (nextPinnedTab) {\n setSelectedTab(nextPinnedTab.tab as ConversationTab);\n setPersistedSelectedTab(nextPinnedTab.tab as ConversationTab);\n }\n }\n }\n };\n\n if (!isOpen) return null;\n\n const isPortaled = Boolean(anchorRef?.current && portalStyle);\n\n const menu = (\n <ContextMenu\n ref={ref}\n theme={isPortaled ? \"popover\" : \"default\"}\n position={isPortaled ? \"none\" : \"bottom\"}\n alignment={isPortaled ? \"none\" : \"left\"}\n spacing={isPortaled ? \"none\" : \"default\"}\n className={cn(\"z-[9999] w-fit\", isPortaled ? \"mt-0\" : \"mt-2\")}\n >\n {visibleTabConfig.map(({ tab, icon: Icon, i18nKey }) => {\n const pinned = !state.unpinnedTabs.includes(tab);\n return (\n <li key={tab} className=\"list-none\">\n <ArchivedDisabledTooltip isDisabled={isArchivedConversation}>\n <div\n className={cn(\n \"group flex h-[30px] w-full min-w-0 items-stretch rounded\",\n !isArchivedConversation &&\n \"hover:bg-[var(--oh-interactive-hover)]\",\n isArchivedConversation && \"opacity-50\",\n )}\n >\n <button\n type=\"button\"\n data-testid={`conversation-tabs-menu-open-${tab}`}\n disabled={isArchivedConversation}\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-2 rounded-l p-2 text-start text-white\",\n dropdownInstantColorClassName,\n isArchivedConversation\n ? \"cursor-not-allowed\"\n : \"cursor-pointer\",\n )}\n onClick={() => handleOpenTab(tab)}\n >\n <span\n className={dropdownMenuRowIconWrapperClassName}\n aria-hidden\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"text-sm\">{t(i18nKey)}</span>\n </button>\n <button\n type=\"button\"\n data-testid={`conversation-tabs-menu-pin-${tab}`}\n disabled={isArchivedConversation}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-r px-2 text-white\",\n dropdownInstantColorClassName,\n isArchivedConversation\n ? \"cursor-not-allowed\"\n : \"cursor-pointer hover:bg-white/10\",\n )}\n aria-pressed={pinned}\n aria-label={\n pinned\n ? t(I18nKey.CONVERSATION$UNPIN_TAB)\n : t(I18nKey.CONVERSATION$PIN_TAB)\n }\n onClick={(e) => handlePinToggle(tab, e)}\n >\n {pinned ? (\n <span\n className={cn(\n \"-mr-[5px] ml-auto\",\n dropdownMenuRowIconWrapperClassName,\n )}\n aria-hidden\n >\n <PillFillIcon className=\"h-7 w-7\" />\n </span>\n ) : (\n <span\n className={cn(\n \"ml-auto\",\n dropdownMenuRowIconWrapperClassName,\n )}\n aria-hidden\n >\n <PillIcon className=\"h-4.5 w-4.5\" />\n </span>\n )}\n </button>\n </div>\n </ArchivedDisabledTooltip>\n </li>\n );\n })}\n </ContextMenu>\n );\n\n if (isPortaled && portalStyle && typeof document !== \"undefined\") {\n return ReactDOM.createPortal(\n <div style={portalStyle}>{menu}</div>,\n document.body,\n );\n }\n\n return menu;\n}\n"],"mappings":"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"}
|