@openhands/agent-canvas 1.12.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-CzWS1DgR.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-D2J1dKVd.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-D70oJj2c.js → api-key-entry-screen-D8Fade_-.js} +1 -1
- package/build/assets/{app-settings-D0OKHB3M.js → app-settings-CpyGB3AT.js} +1 -1
- package/build/assets/{automation-detail-C0SxWTnQ.js → automation-detail-B-jQ39Mm.js} +1 -1
- package/build/assets/{automation-export-BjQa_fT6.js → automation-export-B1dywoqk.js} +1 -1
- package/build/assets/{automation-setup-route-BzCNpljP.js → automation-setup-route-C-bWUZBi.js} +1 -1
- package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DgpCGOJV.js} +1 -1
- package/build/assets/{automations-list-dZg8zOCl.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-HwclKrUS.js → backend-form-modal-DiVrD4Cm.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
- package/build/assets/{badge-Dpn3-LTV.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-4CPdj3J3.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-CcSez21r.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-BKOLj-TC.js → command-menu-BXy03FBl.js} +1 -1
- package/build/assets/{condenser-settings-DLQogFnB.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-CtgILxWF.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-EBn3ZtNP.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-BZ3HYztk.js → extensions-hub-BqUINAhp.js} +1 -1
- package/build/assets/{extensions-navigation-Bnx32WAb.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-relative-time-BerVamGl.js → format-relative-time-DSErAuVr.js} +1 -1
- package/build/assets/git-provider-icon-BvlLAche.js +1 -0
- package/build/assets/{git-repo-dropdown-B5VnMftu.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-Y0aDou-a.js → home-BOrlwLqG.js} +1 -1
- package/build/assets/home-BvMNC6E-.js +1 -0
- package/build/assets/{home-store-Cubdq0uP.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-DW6dSyGr.js → install-server-modal-Bl4G1zF4.js} +1 -1
- package/build/assets/{kebab-menu-item-content-CKydZrbH.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
- package/build/assets/{launch-c4GEP8oo.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-DTCME_Pu.js → manage-backends-modal-DhGk5mJt.js} +1 -1
- package/build/assets/manifest-653b89aa.js +1 -0
- package/build/assets/{manifest-subpage-layout-Ds7G5GZ8.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-Da7wFU7A.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-Cswluf6-.js → npm-DLckoeJc.js} +1 -1
- package/build/assets/{onboarding-BKbTYlW1.js → onboarding-D7WDG66N.js} +1 -1
- package/build/assets/{onboarding-modal-DrrGlEQq.js → onboarding-modal-C_xVrFNv.js} +1 -1
- package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-D-s9z18a.js} +1 -1
- package/build/assets/pencil-BGOCPRyu.js +1 -0
- package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-AKaXIIfg.js} +1 -1
- package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-wtmY4QQw.js} +1 -1
- package/build/assets/plus-zNEL8rcX.js +1 -0
- package/build/assets/{profiles-service.api-vcE_jJCe.js → profiles-service.api-DCMYxHMi.js} +1 -1
- package/build/assets/{providers-CdrPPm0z.js → providers-BjrtjX4L.js} +1 -1
- package/build/assets/{proxy-b4aqL4SX.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-CBBi6IAe.js → root-DkfG_UWR.js} +2 -2
- package/build/assets/root-layout-D75LHYhh.js +2 -0
- package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-OnM5Uob_.js} +1 -1
- package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-m5WQm2sy.js} +1 -1
- package/build/assets/search-CycosyjN.js +1 -0
- package/build/assets/{secrets-service-BHF4fxML.js → secrets-service-B26R61C1.js} +1 -1
- package/build/assets/{secrets-settings-aBGXtQhX.js → secrets-settings-CbLYCKOX.js} +1 -1
- package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
- package/build/assets/{settings-CZPGNens.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-Dtlegd6s.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-CalzJP2l.js → settings-modal-BIrIVn97.js} +1 -1
- package/build/assets/{settings-service.api-DfPYaxZJ.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-C6HpQ55l.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-Dt1V5X2p.js → skill-scope-Dc3JPW-8.js} +1 -1
- package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-CpTV27n3.js} +1 -1
- package/build/assets/{skills-settings-DthdIDUb.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-BTde81Iu.js → task-list-tab-mAHMOkUz.js} +1 -1
- package/build/assets/{terminal-DRrJo-cR.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-DGyo0QvL.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
- package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
- package/build/assets/{use-agent-profiles-B37XWDLq.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
- package/build/assets/{use-config-DapX3pjC.js → use-config-DKAMiI5R.js} +1 -1
- package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
- package/build/assets/{use-create-secret-DcpT3RPw.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-zihHDbMW.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
- package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
- package/build/assets/{use-plugins-marketplace-CqkR8kLE.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-DIEurJ3D.js → use-save-settings-DNmnbG6f.js} +1 -1
- package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
- package/build/assets/{use-settings-BmLzQjnC.js → use-settings-wCwPaSIv.js} +1 -1
- package/build/assets/{use-tracking-salbPJxT.js → use-tracking-CVwPmhlX.js} +1 -1
- package/build/assets/{use-user-conversation-Dt-W6uNw.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-oi54wEc1.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/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/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 +25 -17
- 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/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/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/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/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-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-B_bg5h9O.js +0 -2
- package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
- package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
- package/build/assets/agent-settings-D_SVrWhI.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-Cmyw9bFh.js +0 -90
- package/build/assets/conversation-CvoGZ5vC.js +0 -1
- package/build/assets/conversation-panel-CvoGZ5vC.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-D5zuU5TY.js +0 -1
- package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
- package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
- package/build/assets/home-DqyeeFA_.js +0 -1
- package/build/assets/index-home-DqyeeFA_.js +0 -1
- package/build/assets/info-C9lpK5pw.js +0 -1
- package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
- package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
- package/build/assets/llm-settings-D9ko42Pi.js +0 -1
- package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
- package/build/assets/loader-circle-C5AnEN8r.js +0 -1
- package/build/assets/manifest-e1c3bc3b.js +0 -1
- package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
- package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
- package/build/assets/messages-B2l0qLVk.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-DIYgUdMm.js +0 -1
- package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
- package/build/assets/root-CRK9fOFd.css +0 -1
- package/build/assets/root-layout-BFN2rCOy.js +0 -2
- package/build/assets/search-CYaiKHRp.js +0 -1
- package/build/assets/shared-conversation-BIAcuORk.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-CRf1dCm5.js +0 -1
- package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
- package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
- package/build/assets/use-save-agent-profile-CH9_EXQG.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,134 +1,144 @@
|
|
|
1
1
|
import { useTranslation as e } from "../../../../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
2
|
import { I18nKey as t } from "../../../../i18n/declaration.js";
|
|
3
|
-
import { Pin as
|
|
4
|
-
import { cn as
|
|
5
|
-
import { getDisplayConversationTags as
|
|
6
|
-
import
|
|
7
|
-
import { useTracking as
|
|
8
|
-
import { useDownloadConversation as
|
|
9
|
-
import { transformVSCodeUrl as
|
|
10
|
-
import { formatTimeDelta as
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
16
|
-
import
|
|
3
|
+
import { Pin as ee } from "../../../../node_modules/lucide-react/dist/esm/icons/pin.js";
|
|
4
|
+
import { cn as n } from "../../../../utils/utils.js";
|
|
5
|
+
import { getDisplayConversationTags as te } from "../../../../api/agent-server-adapter.js";
|
|
6
|
+
import ne from "../../../../api/conversation-service/conversation-service.api.js";
|
|
7
|
+
import { useTracking as re } from "../../../../hooks/use-tracking.js";
|
|
8
|
+
import { useDownloadConversation as r } from "../../../../hooks/use-download-conversation.js";
|
|
9
|
+
import { transformVSCodeUrl as ie } from "../../../../utils/vscode-url-helper.js";
|
|
10
|
+
import { formatTimeDelta as i } from "../../../../utils/format-time-delta.js";
|
|
11
|
+
import { hoverRevealActionClassName as a, hoverRevealPinnedTimestampClassName as o, hoverRevealReserveClassName as ae, hoverRevealYieldClassName as oe } from "../../../../utils/hover-reveal-classes.js";
|
|
12
|
+
import { ConversationCardHeader as se } from "./conversation-card-header.js";
|
|
13
|
+
import { ConversationCardActions as s } from "./conversation-card-actions.js";
|
|
14
|
+
import { ConversationCardFooter as ce } from "./conversation-card-footer.js";
|
|
15
|
+
import { ConversationStatusBadges as c } from "./conversation-status-badges.js";
|
|
16
|
+
import l from "react";
|
|
17
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
17
18
|
//#region src/components/features/conversation-panel/conversation-card/conversation-card.tsx
|
|
18
|
-
function
|
|
19
|
-
let { t: B } = e("openhands"), { trackDownloadVsCodeButtonClicked: V } =
|
|
19
|
+
function f({ onClick: f, onDelete: p, onArchive: m, onUnarchive: h, onStop: g, onChangeTitle: _, showOptions: v, title: y, selectedRepository: le, lastUpdatedAt: b, createdAt: x, conversationId: S, executionStatus: C, sandboxStatus: w, contextMenuOpen: T = !1, onContextMenuToggle: E, isActive: D = !1, workspaceWorkingDir: O, showRepositoryMetadata: k = !0, llmModel: A = null, showLlmProfiles: j = !1, agentKind: M = null, acpServer: N = null, tags: P = null, showTags: F = !1, isArchived: I = !1, isPinned: L = !1, onTogglePin: R, alwaysShowPinIcon: z = !1 }) {
|
|
20
|
+
let { t: B } = e("openhands"), { trackDownloadVsCodeButtonClicked: V } = re(), [H, U] = l.useState("view"), { mutateAsync: ue } = r(), de = (e) => {
|
|
20
21
|
e !== "" && e !== y && _?.(e), U("view");
|
|
22
|
+
}, W = (e) => {
|
|
23
|
+
e.preventDefault(), e.stopPropagation(), p?.(), E?.(!1);
|
|
24
|
+
}, G = (e) => {
|
|
25
|
+
e.preventDefault(), e.stopPropagation(), m?.(), E?.(!1);
|
|
21
26
|
}, K = (e) => {
|
|
22
|
-
e.preventDefault(), e.stopPropagation(), h?.(),
|
|
27
|
+
e.preventDefault(), e.stopPropagation(), h?.(), E?.(!1);
|
|
23
28
|
}, q = (e) => {
|
|
24
|
-
e.preventDefault(), e.stopPropagation(), g?.(),
|
|
29
|
+
e.preventDefault(), e.stopPropagation(), g?.(), E?.(!1);
|
|
25
30
|
}, J = (e) => {
|
|
26
|
-
e.preventDefault(), e.stopPropagation(), U("edit"),
|
|
31
|
+
e.preventDefault(), e.stopPropagation(), U("edit"), E?.(!1);
|
|
27
32
|
}, Y = async (e) => {
|
|
28
|
-
if (e.preventDefault(), e.stopPropagation(), V(),
|
|
29
|
-
let e = await
|
|
33
|
+
if (e.preventDefault(), e.stopPropagation(), V(), S) try {
|
|
34
|
+
let e = await ne.getVSCodeUrl(S);
|
|
30
35
|
if (e.vscode_url) {
|
|
31
|
-
let t =
|
|
36
|
+
let t = ie(e.vscode_url);
|
|
32
37
|
t && window.open(t, "_blank");
|
|
33
38
|
}
|
|
34
39
|
} catch {}
|
|
35
|
-
|
|
40
|
+
E?.(!1);
|
|
36
41
|
}, X = async (e) => {
|
|
37
|
-
e.preventDefault(), e.stopPropagation(),
|
|
38
|
-
},
|
|
42
|
+
e.preventDefault(), e.stopPropagation(), S && await ue(S), E?.(!1);
|
|
43
|
+
}, fe = (e) => {
|
|
39
44
|
e.preventDefault(), e.stopPropagation(), R?.();
|
|
40
|
-
},
|
|
45
|
+
}, pe = () => /* @__PURE__ */ u("button", {
|
|
41
46
|
type: "button",
|
|
42
|
-
"data-testid":
|
|
47
|
+
"data-testid": S ? `conversation-pin-toggle-${S}` : "conversation-pin-toggle",
|
|
43
48
|
"aria-pressed": L,
|
|
44
49
|
"aria-label": B(L ? t.CONVERSATION_PANEL$UNPIN_CONVERSATION : t.CONVERSATION_PANEL$PIN_CONVERSATION),
|
|
45
|
-
onClick:
|
|
46
|
-
className:
|
|
47
|
-
children: /* @__PURE__ */
|
|
48
|
-
className:
|
|
50
|
+
onClick: fe,
|
|
51
|
+
className: n("flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1", "text-[var(--oh-muted)] hover:bg-white/10 hover:text-white"),
|
|
52
|
+
children: /* @__PURE__ */ u(ee, {
|
|
53
|
+
className: n("h-3.5 w-3.5", L && "fill-current"),
|
|
49
54
|
"aria-hidden": !0
|
|
50
55
|
})
|
|
51
|
-
}), Z = !!(h || _ || v), Q = Z || !!R, $ = z && L && !!R,
|
|
52
|
-
return /* @__PURE__ */
|
|
56
|
+
}), Z = !!(p || m || h || _ || v), Q = Z || !!R, $ = z && L && !!R, me = k || I || j && (M === "acp" || !!A) || F && te(P).length > 0;
|
|
57
|
+
return /* @__PURE__ */ d("div", {
|
|
53
58
|
"data-testid": "conversation-card",
|
|
54
|
-
"data-context-menu-open":
|
|
55
|
-
"data-active":
|
|
56
|
-
onClick:
|
|
57
|
-
className:
|
|
58
|
-
children: [/* @__PURE__ */
|
|
59
|
+
"data-context-menu-open": T.toString(),
|
|
60
|
+
"data-active": D ? "true" : "false",
|
|
61
|
+
onClick: f,
|
|
62
|
+
className: n("group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors", !T && "hover:bg-[var(--oh-surface)]", (D || T) && "bg-[var(--oh-surface)]"),
|
|
63
|
+
children: [/* @__PURE__ */ d("div", {
|
|
59
64
|
className: "flex items-center w-full min-w-0",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
65
|
+
children: [/* @__PURE__ */ d("div", {
|
|
61
66
|
className: "flex items-center gap-2 flex-1 min-w-0 overflow-hidden",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ u(se, {
|
|
63
68
|
title: y,
|
|
64
69
|
titleMode: H,
|
|
65
|
-
onTitleSave:
|
|
66
|
-
executionStatus:
|
|
67
|
-
sandboxStatus:
|
|
68
|
-
}),
|
|
69
|
-
}), /* @__PURE__ */
|
|
70
|
-
className:
|
|
71
|
-
children: [!$ && (
|
|
72
|
-
className:
|
|
73
|
-
children: /* @__PURE__ */
|
|
74
|
-
}), Q ? /* @__PURE__ */
|
|
75
|
-
className:
|
|
70
|
+
onTitleSave: de,
|
|
71
|
+
executionStatus: C,
|
|
72
|
+
sandboxStatus: w
|
|
73
|
+
}), w === "ERROR" && /* @__PURE__ */ u(c, {})]
|
|
74
|
+
}), /* @__PURE__ */ d("div", {
|
|
75
|
+
className: n("relative ml-auto pl-2 flex items-center justify-end shrink-0", $ ? "min-w-[3.75rem]" : Q && ae(T)),
|
|
76
|
+
children: [!$ && (x ?? b) && /* @__PURE__ */ u("p", {
|
|
77
|
+
className: n("text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5", Q && oe(T)),
|
|
78
|
+
children: /* @__PURE__ */ u("time", { children: i(b ?? x) })
|
|
79
|
+
}), Q ? /* @__PURE__ */ d("div", {
|
|
80
|
+
className: n("absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity", $ ? "pointer-events-auto visible opacity-100" : a(T)),
|
|
76
81
|
children: [
|
|
77
|
-
R ?
|
|
78
|
-
$ && (
|
|
82
|
+
R ? pe() : null,
|
|
83
|
+
$ && (x ?? b) && Z ? /* @__PURE__ */ d("div", {
|
|
79
84
|
className: "relative shrink-0",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
81
|
-
className:
|
|
82
|
-
children: /* @__PURE__ */
|
|
83
|
-
contextMenuOpen:
|
|
84
|
-
onContextMenuToggle:
|
|
85
|
-
onDelete:
|
|
85
|
+
children: [/* @__PURE__ */ u("div", {
|
|
86
|
+
className: a(T),
|
|
87
|
+
children: /* @__PURE__ */ u(s, {
|
|
88
|
+
contextMenuOpen: T,
|
|
89
|
+
onContextMenuToggle: E || (() => {}),
|
|
90
|
+
onDelete: p && W,
|
|
91
|
+
onArchive: m && G,
|
|
92
|
+
onUnarchive: h && K,
|
|
86
93
|
onStop: g && q,
|
|
87
94
|
onEdit: _ && J,
|
|
88
95
|
onDownloadViaVSCode: Y,
|
|
89
96
|
onDownloadConversation: X,
|
|
90
|
-
executionStatus:
|
|
91
|
-
conversationId:
|
|
97
|
+
executionStatus: C,
|
|
98
|
+
conversationId: S,
|
|
92
99
|
showOptions: v
|
|
93
100
|
})
|
|
94
|
-
}), /* @__PURE__ */
|
|
95
|
-
className:
|
|
96
|
-
children: /* @__PURE__ */
|
|
101
|
+
}), /* @__PURE__ */ u("p", {
|
|
102
|
+
className: n("pointer-events-none absolute inset-0 items-center justify-end", "text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5", o(T)),
|
|
103
|
+
children: /* @__PURE__ */ u("time", { children: i(b ?? x) })
|
|
97
104
|
})]
|
|
98
105
|
}) : null,
|
|
99
|
-
!$ && Z ? /* @__PURE__ */
|
|
100
|
-
contextMenuOpen:
|
|
101
|
-
onContextMenuToggle:
|
|
102
|
-
onDelete:
|
|
106
|
+
!$ && Z ? /* @__PURE__ */ u(s, {
|
|
107
|
+
contextMenuOpen: T,
|
|
108
|
+
onContextMenuToggle: E || (() => {}),
|
|
109
|
+
onDelete: p && W,
|
|
110
|
+
onArchive: m && G,
|
|
111
|
+
onUnarchive: h && K,
|
|
103
112
|
onStop: g && q,
|
|
104
113
|
onEdit: _ && J,
|
|
105
114
|
onDownloadViaVSCode: Y,
|
|
106
115
|
onDownloadConversation: X,
|
|
107
|
-
executionStatus:
|
|
108
|
-
conversationId:
|
|
116
|
+
executionStatus: C,
|
|
117
|
+
conversationId: S,
|
|
109
118
|
showOptions: v
|
|
110
119
|
}) : null
|
|
111
120
|
]
|
|
112
121
|
}) : null]
|
|
113
122
|
})]
|
|
114
|
-
}),
|
|
115
|
-
selectedRepository:
|
|
116
|
-
lastUpdatedAt:
|
|
117
|
-
createdAt:
|
|
118
|
-
executionStatus:
|
|
119
|
-
workspaceWorkingDir:
|
|
120
|
-
showRepositoryMetadata:
|
|
123
|
+
}), me && /* @__PURE__ */ u(ce, {
|
|
124
|
+
selectedRepository: le,
|
|
125
|
+
lastUpdatedAt: b,
|
|
126
|
+
createdAt: x,
|
|
127
|
+
executionStatus: C,
|
|
128
|
+
workspaceWorkingDir: O,
|
|
129
|
+
showRepositoryMetadata: k,
|
|
121
130
|
showTimestamp: !1,
|
|
122
|
-
llmModel:
|
|
123
|
-
showAgentChip:
|
|
124
|
-
agentKind:
|
|
125
|
-
acpServer:
|
|
126
|
-
tags:
|
|
127
|
-
showTags:
|
|
131
|
+
llmModel: A,
|
|
132
|
+
showAgentChip: j,
|
|
133
|
+
agentKind: M,
|
|
134
|
+
acpServer: N,
|
|
135
|
+
tags: P,
|
|
136
|
+
showTags: F,
|
|
137
|
+
isArchived: I
|
|
128
138
|
})]
|
|
129
139
|
});
|
|
130
140
|
}
|
|
131
141
|
//#endregion
|
|
132
|
-
export {
|
|
142
|
+
export { f as ConversationCard };
|
|
133
143
|
|
|
134
144
|
//# sourceMappingURL=conversation-card.js.map
|
package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-card.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { Pin } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { transformVSCodeUrl } from \"#/utils/vscode-url-helper\";\nimport ConversationService from \"#/api/conversation-service/conversation-service.api\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { SandboxStatus } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { ConversationCardHeader } from \"./conversation-card-header\";\nimport { ConversationCardActions } from \"./conversation-card-actions\";\nimport { ConversationCardFooter } from \"./conversation-card-footer\";\nimport { ConversationStatusBadges } from \"./conversation-status-badges\";\nimport { useDownloadConversation } from \"#/hooks/use-download-conversation\";\n\ninterface ConversationCardProps {\n onClick?: () => void;\n onDelete?: () => void;\n onStop?: () => void;\n onChangeTitle?: (title: string) => void;\n showOptions?: boolean;\n title: string;\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n sandboxStatus?: SandboxStatus | null;\n conversationId?: string;\n contextMenuOpen?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n isActive?: boolean;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n llmModel?: string | null;\n showLlmProfiles?: boolean;\n agentKind?: \"openhands\" | \"acp\" | null;\n acpServer?: string | null;\n tags?: Record<string, string> | null;\n /** Gates the tag-chip row; wired to the panel's \"Tags\" metadata toggle. */\n showTags?: boolean;\n isPinned?: boolean;\n onTogglePin?: () => void;\n /** When true and pinned, keep the pin icon visible without hovering. */\n alwaysShowPinIcon?: boolean;\n}\n\nexport function ConversationCard({\n onClick,\n onDelete,\n onStop,\n onChangeTitle,\n showOptions,\n title,\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n conversationId,\n executionStatus,\n sandboxStatus,\n contextMenuOpen = false,\n onContextMenuToggle,\n isActive = false,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n llmModel = null,\n showLlmProfiles = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isPinned = false,\n onTogglePin,\n alwaysShowPinIcon = false,\n}: ConversationCardProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackDownloadVsCodeButtonClicked } = useTracking();\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const onTitleSave = (newTitle: string) => {\n if (newTitle !== \"\" && newTitle !== title) {\n onChangeTitle?.(newTitle);\n }\n setTitleMode(\"view\");\n };\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onDelete?.();\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onStop?.();\n onContextMenuToggle?.(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadViaVSCode = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n trackDownloadVsCodeButtonClicked();\n\n // Fetch the VS Code URL from the API\n if (conversationId) {\n try {\n const data = await ConversationService.getVSCodeUrl(conversationId);\n if (data.vscode_url) {\n const transformedUrl = transformVSCodeUrl(data.vscode_url);\n if (transformedUrl) {\n window.open(transformedUrl, \"_blank\");\n }\n }\n // VS Code URL not available\n } catch {\n // Failed to fetch VS Code URL\n }\n }\n\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePin = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin?.();\n };\n\n const renderPinButton = () => (\n <button\n type=\"button\"\n data-testid={\n conversationId\n ? `conversation-pin-toggle-${conversationId}`\n : \"conversation-pin-toggle\"\n }\n aria-pressed={isPinned}\n aria-label={\n isPinned\n ? t(I18nKey.CONVERSATION_PANEL$UNPIN_CONVERSATION)\n : t(I18nKey.CONVERSATION_PANEL$PIN_CONVERSATION)\n }\n onClick={handleTogglePin}\n className={cn(\n \"flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)] hover:bg-white/10 hover:text-white\",\n )}\n >\n <Pin\n className={cn(\"h-3.5 w-3.5\", isPinned && \"fill-current\")}\n aria-hidden\n />\n </button>\n );\n\n const hasContextMenu = !!(onDelete || onChangeTitle || showOptions);\n const hasHoverActions = hasContextMenu || !!onTogglePin;\n const showPersistentPinIcon = alwaysShowPinIcon && isPinned && !!onTogglePin;\n const shouldRenderFooter =\n showRepositoryMetadata ||\n (showLlmProfiles && (agentKind === \"acp\" || !!llmModel)) ||\n (showTags && getDisplayConversationTags(tags).length > 0);\n\n return (\n <div\n data-testid=\"conversation-card\"\n data-context-menu-open={contextMenuOpen.toString()}\n data-active={isActive ? \"true\" : \"false\"}\n onClick={onClick}\n className={cn(\n \"group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors\",\n !contextMenuOpen && \"hover:bg-[var(--oh-surface)]\",\n (isActive || contextMenuOpen) && \"bg-[var(--oh-surface)]\",\n )}\n >\n <div className=\"flex items-center w-full min-w-0\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0 overflow-hidden\">\n <ConversationCardHeader\n title={title}\n titleMode={titleMode}\n onTitleSave={onTitleSave}\n executionStatus={executionStatus}\n sandboxStatus={sandboxStatus}\n />\n {sandboxStatus === \"ERROR\" && <ConversationStatusBadges />}\n </div>\n\n <div\n className={cn(\n \"relative ml-auto pl-2 flex items-center justify-end shrink-0\",\n // The hover action overlay (pin + ellipsis) is absolutely\n // positioned, so reserve its width so the flex-1 title truncates\n // instead of colliding with the buttons. Pinned cards keep the pin\n // visible at rest, so reserve the width always for those.\n showPersistentPinIcon\n ? \"min-w-[3.75rem]\"\n : hasHoverActions &&\n \"group-hover:min-w-[3.75rem] group-focus-within:min-w-[3.75rem]\",\n contextMenuOpen && \"min-w-[3.75rem]\",\n )}\n >\n {!showPersistentPinIcon && (createdAt ?? lastUpdatedAt) && (\n <p\n className={cn(\n \"text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5\",\n hasHoverActions &&\n \"group-hover:opacity-0 group-focus-within:opacity-0\",\n contextMenuOpen && \"opacity-0\",\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n )}\n\n {hasHoverActions ? (\n <div\n className={cn(\n \"absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity\",\n showPersistentPinIcon\n ? \"pointer-events-auto visible opacity-100\"\n : cn(\n \"pointer-events-none opacity-0 invisible\",\n \"group-hover:pointer-events-auto group-hover:opacity-100 group-hover:visible\",\n \"group-focus-within:pointer-events-auto group-focus-within:opacity-100 group-focus-within:visible\",\n ),\n contextMenuOpen && \"pointer-events-auto visible opacity-100\",\n )}\n >\n {onTogglePin ? renderPinButton() : null}\n {showPersistentPinIcon &&\n (createdAt ?? lastUpdatedAt) &&\n hasContextMenu ? (\n <div className=\"relative shrink-0\">\n <div\n className={cn(\n !contextMenuOpen &&\n \"invisible pointer-events-none group-hover:visible group-hover:pointer-events-auto group-focus-within:visible group-focus-within:pointer-events-auto\",\n )}\n >\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n </div>\n <p\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-end\",\n \"text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5\",\n \"group-hover:hidden group-focus-within:hidden\",\n contextMenuOpen && \"hidden\",\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n </div>\n ) : null}\n {!showPersistentPinIcon && hasContextMenu ? (\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {shouldRenderFooter && (\n <ConversationCardFooter\n selectedRepository={selectedRepository}\n lastUpdatedAt={lastUpdatedAt}\n createdAt={createdAt}\n executionStatus={executionStatus}\n workspaceWorkingDir={workspaceWorkingDir}\n showRepositoryMetadata={showRepositoryMetadata}\n showTimestamp={false}\n llmModel={llmModel}\n showAgentChip={showLlmProfiles}\n agentKind={agentKind}\n acpServer={acpServer}\n tags={tags}\n showTags={showTags}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-card.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { Pin } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { transformVSCodeUrl } from \"#/utils/vscode-url-helper\";\nimport ConversationService from \"#/api/conversation-service/conversation-service.api\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { SandboxStatus } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport {\n hoverRevealActionClassName,\n hoverRevealPinnedTimestampClassName,\n hoverRevealReserveClassName,\n hoverRevealYieldClassName,\n} from \"#/utils/hover-reveal-classes\";\nimport { ConversationCardHeader } from \"./conversation-card-header\";\nimport { ConversationCardActions } from \"./conversation-card-actions\";\nimport { ConversationCardFooter } from \"./conversation-card-footer\";\nimport { ConversationStatusBadges } from \"./conversation-status-badges\";\nimport { useDownloadConversation } from \"#/hooks/use-download-conversation\";\n\ninterface ConversationCardProps {\n onClick?: () => void;\n onDelete?: () => void;\n onArchive?: () => void;\n /**\n * Restores an archived conversation. The panel passes this instead of\n * `onArchive` for rows that are already archived, so the menu offers exactly\n * one of the two directions.\n */\n onUnarchive?: () => void;\n onStop?: () => void;\n onChangeTitle?: (title: string) => void;\n showOptions?: boolean;\n title: string;\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n sandboxStatus?: SandboxStatus | null;\n conversationId?: string;\n contextMenuOpen?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n isActive?: boolean;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n llmModel?: string | null;\n showLlmProfiles?: boolean;\n agentKind?: \"openhands\" | \"acp\" | null;\n acpServer?: string | null;\n tags?: Record<string, string> | null;\n /** Gates the tag-chip row; wired to the panel's \"Tags\" metadata toggle. */\n showTags?: boolean;\n isArchived?: boolean;\n isPinned?: boolean;\n onTogglePin?: () => void;\n /** When true and pinned, keep the pin icon visible without hovering. */\n alwaysShowPinIcon?: boolean;\n}\n\nexport function ConversationCard({\n onClick,\n onDelete,\n onArchive,\n onUnarchive,\n onStop,\n onChangeTitle,\n showOptions,\n title,\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n conversationId,\n executionStatus,\n sandboxStatus,\n contextMenuOpen = false,\n onContextMenuToggle,\n isActive = false,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n llmModel = null,\n showLlmProfiles = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n isPinned = false,\n onTogglePin,\n alwaysShowPinIcon = false,\n}: ConversationCardProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackDownloadVsCodeButtonClicked } = useTracking();\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const onTitleSave = (newTitle: string) => {\n if (newTitle !== \"\" && newTitle !== title) {\n onChangeTitle?.(newTitle);\n }\n setTitleMode(\"view\");\n };\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onDelete?.();\n onContextMenuToggle?.(false);\n };\n\n const handleArchive = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onArchive?.();\n onContextMenuToggle?.(false);\n };\n\n const handleUnarchive = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onUnarchive?.();\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onStop?.();\n onContextMenuToggle?.(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadViaVSCode = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n trackDownloadVsCodeButtonClicked();\n\n // Fetch the VS Code URL from the API\n if (conversationId) {\n try {\n const data = await ConversationService.getVSCodeUrl(conversationId);\n if (data.vscode_url) {\n const transformedUrl = transformVSCodeUrl(data.vscode_url);\n if (transformedUrl) {\n window.open(transformedUrl, \"_blank\");\n }\n }\n // VS Code URL not available\n } catch {\n // Failed to fetch VS Code URL\n }\n }\n\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePin = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin?.();\n };\n\n const renderPinButton = () => (\n <button\n type=\"button\"\n data-testid={\n conversationId\n ? `conversation-pin-toggle-${conversationId}`\n : \"conversation-pin-toggle\"\n }\n aria-pressed={isPinned}\n aria-label={\n isPinned\n ? t(I18nKey.CONVERSATION_PANEL$UNPIN_CONVERSATION)\n : t(I18nKey.CONVERSATION_PANEL$PIN_CONVERSATION)\n }\n onClick={handleTogglePin}\n className={cn(\n \"flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)] hover:bg-white/10 hover:text-white\",\n )}\n >\n <Pin\n className={cn(\"h-3.5 w-3.5\", isPinned && \"fill-current\")}\n aria-hidden\n />\n </button>\n );\n\n const hasContextMenu = !!(\n onDelete ||\n onArchive ||\n onUnarchive ||\n onChangeTitle ||\n showOptions\n );\n const hasHoverActions = hasContextMenu || !!onTogglePin;\n const showPersistentPinIcon = alwaysShowPinIcon && isPinned && !!onTogglePin;\n const shouldRenderFooter =\n showRepositoryMetadata ||\n isArchived ||\n (showLlmProfiles && (agentKind === \"acp\" || !!llmModel)) ||\n (showTags && getDisplayConversationTags(tags).length > 0);\n\n return (\n <div\n data-testid=\"conversation-card\"\n data-context-menu-open={contextMenuOpen.toString()}\n data-active={isActive ? \"true\" : \"false\"}\n onClick={onClick}\n className={cn(\n \"group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors\",\n !contextMenuOpen && \"hover:bg-[var(--oh-surface)]\",\n (isActive || contextMenuOpen) && \"bg-[var(--oh-surface)]\",\n )}\n >\n <div className=\"flex items-center w-full min-w-0\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0 overflow-hidden\">\n <ConversationCardHeader\n title={title}\n titleMode={titleMode}\n onTitleSave={onTitleSave}\n executionStatus={executionStatus}\n sandboxStatus={sandboxStatus}\n />\n {sandboxStatus === \"ERROR\" && <ConversationStatusBadges />}\n </div>\n\n <div\n className={cn(\n \"relative ml-auto pl-2 flex items-center justify-end shrink-0\",\n // The hover action overlay (pin + ellipsis) is absolutely\n // positioned, so reserve its width so the flex-1 title truncates\n // instead of colliding with the buttons. Pinned cards keep the pin\n // visible at rest, so reserve the width always for those. Touch /\n // coarse-pointer devices also keep the reserve so the ellipsis stays\n // clickable without a hover pass.\n showPersistentPinIcon\n ? \"min-w-[3.75rem]\"\n : hasHoverActions && hoverRevealReserveClassName(contextMenuOpen),\n )}\n >\n {!showPersistentPinIcon && (createdAt ?? lastUpdatedAt) && (\n <p\n className={cn(\n \"text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5\",\n hasHoverActions && hoverRevealYieldClassName(contextMenuOpen),\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n )}\n\n {hasHoverActions ? (\n <div\n className={cn(\n \"absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity\",\n showPersistentPinIcon\n ? \"pointer-events-auto visible opacity-100\"\n : hoverRevealActionClassName(contextMenuOpen),\n )}\n >\n {onTogglePin ? renderPinButton() : null}\n {showPersistentPinIcon &&\n (createdAt ?? lastUpdatedAt) &&\n hasContextMenu ? (\n <div className=\"relative shrink-0\">\n <div className={hoverRevealActionClassName(contextMenuOpen)}>\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onArchive={onArchive && handleArchive}\n onUnarchive={onUnarchive && handleUnarchive}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n </div>\n <p\n className={cn(\n \"pointer-events-none absolute inset-0 items-center justify-end\",\n \"text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5\",\n hoverRevealPinnedTimestampClassName(contextMenuOpen),\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n </div>\n ) : null}\n {!showPersistentPinIcon && hasContextMenu ? (\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onArchive={onArchive && handleArchive}\n onUnarchive={onUnarchive && handleUnarchive}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {shouldRenderFooter && (\n <ConversationCardFooter\n selectedRepository={selectedRepository}\n lastUpdatedAt={lastUpdatedAt}\n createdAt={createdAt}\n executionStatus={executionStatus}\n workspaceWorkingDir={workspaceWorkingDir}\n showRepositoryMetadata={showRepositoryMetadata}\n showTimestamp={false}\n llmModel={llmModel}\n showAgentChip={showLlmProfiles}\n agentKind={agentKind}\n acpServer={acpServer}\n tags={tags}\n showTags={showTags}\n isArchived={isArchived}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./conversation-panel-list-helpers.cjs"),r=require("./conversation-group-folder-row.cjs");let i=require("react"),a=require("react/jsx-runtime");function o({groups:o,groupIds:s,groupFolderOrder:c,setGroupFolderOrder:l,collapsedGroupIds:u,expandedGroupPreviewIds:d,
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./conversation-panel-list-helpers.cjs"),r=require("./conversation-group-folder-row.cjs");let i=require("react"),a=require("react/jsx-runtime");function o({groups:o,groupIds:s,groupFolderOrder:c,setGroupFolderOrder:l,collapsedGroupIds:u,expandedGroupPreviewIds:d,discoveryConversationIds:f,onToggleGroupCollapsed:p,onToggleGroupPreviewExpanded:m,isCreatingConversationFlow:h,activeConversationId:g,onLaunchFromGroup:_,renderConversationCard:v}){let{t:y}=e.useTranslation(`openhands`),[b,x]=(0,i.useState)(null),[S,C]=(0,i.useState)(null),[w,T]=(0,i.useState)(null),[E,D]=(0,i.useState)(!1),O=(0,i.useRef)(null);(0,i.useEffect)(()=>()=>{O.current&&clearTimeout(O.current)},[]);let k=(0,i.useCallback)(()=>{O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{D(!1),O.current=null},300)},[]),A=(0,i.useCallback)(()=>{x(null),C(null),T(null)},[]),j=(0,i.useCallback)(e=>{let t=e.currentTarget.getBoundingClientRect();return e.clientY<t.top+t.height/2?`before`:`after`},[]),M=(0,i.useCallback)((e,t)=>{if(!b||b===e){A(),k();return}l(n.moveGroupFolderOrder(c,s,b,e,t)),A(),k()},[b,c,s,A,l,k]);return(0,a.jsx)(`nav`,{"aria-label":y(t.I18nKey.SIDEBAR$CONVERSATIONS),className:`space-y-1 md:space-y-0.5 pb-1`,children:o.map(e=>(0,a.jsx)(r.ConversationGroupFolderRow,{group:e,expanded:!u.has(e.id),previewExpanded:d.has(e.id),isDragging:b===e.id,dropIndicatorPosition:S===e.id&&b!==e.id?w:null,animateLayout:E,isCreatingConversationFlow:h,activeConversationId:g,discoveryConversationIds:f,onToggleExpanded:()=>p(e.id),onDragStart:()=>{D(!0),x(e.id)},onDragEnd:()=>{A(),k()},onDragOver:t=>{t.preventDefault();let{dataTransfer:n}=t;n&&(n.dropEffect=`move`),C(e.id),T(j(t))},onDragLeave:()=>{C(t=>t===e.id?null:t)},onDrop:t=>{t.preventDefault(),M(e.id,j(t))},onTogglePreviewExpanded:()=>m(e.id),onLaunchFromGroup:()=>_(e.launch),renderConversationCard:v},e.id))})}exports.ConversationGroupFolderList=o;
|
|
2
2
|
//# sourceMappingURL=conversation-group-folder-list.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-group-folder-list.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation-group-folder-list.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n discoveryConversationIds: ReadonlySet<string> | null;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n discoveryConversationIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n discoveryConversationIds={discoveryConversationIds}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":"0UAyCA,SAAgB,EAA4B,CAC1C,SACA,WACA,mBACA,sBACA,oBACA,0BACA,2BACA,yBACA,+BACA,6BACA,uBACA,oBACA,0BACmC,CACnC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA6C,IAAI,EAClE,CAAC,EAAmB,IAAA,EAAA,EAAA,UACxB,IACF,EACM,CAAC,EAAc,IAAA,EAAA,EAAA,UACsB,IAAI,EAGzC,CAAC,EAAe,IAAA,EAAA,EAAA,UAA6B,EAAK,EAClD,GAAA,EAAA,EAAA,QACJ,IACF,GAEA,EAAA,EAAA,mBACc,CACN,EAAwB,SAC1B,aAAa,EAAwB,OAAO,CAEhD,EACA,CAAC,CACH,EAEA,IAAM,GAAA,EAAA,EAAA,iBAA4C,CAC5C,EAAwB,SAC1B,aAAa,EAAwB,OAAO,EAE9C,EAAwB,QAAU,eAAiB,CACjD,EAAiB,EAAK,EACtB,EAAwB,QAAU,IACpC,EAAG,GAAG,CACR,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,iBAAmC,CACvC,EAAkB,IAAI,EACtB,EAAqB,IAAI,EACzB,EAAgB,IAAI,CACtB,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,aACH,GAA2D,CAC1D,IAAM,EAAO,EAAM,cAAc,sBAAsB,EACvD,OAAO,EAAM,QAAU,EAAK,IAAM,EAAK,OAAS,EAAI,SAAW,OACjE,EACA,CAAC,CACH,EAEM,GAAA,EAAA,EAAA,cACH,EAAuB,IAAsC,CAC5D,GAAI,CAAC,GAAkB,IAAmB,EAAe,CACvD,EAAe,EACf,EAAwB,EACxB,MACF,CAEA,EACE,EAAA,qBACE,EACA,EACA,EACA,EACA,CACF,CACF,EACA,EAAe,EAGf,EAAwB,CAC1B,EACA,CACE,EACA,EACA,EACA,EACA,EACA,CACF,CACF,EAEA,OACE,EAAA,EAAA,KAAC,MAAD,CACE,aAAY,EAAE,EAAA,QAAQ,qBAAqB,EAC3C,UAAU,yCAET,EAAO,IAAK,IACX,EAAA,EAAA,KAAC,EAAA,2BAAD,CAES,QACP,SAAU,CAAC,EAAkB,IAAI,EAAM,EAAE,EACzC,gBAAiB,EAAwB,IAAI,EAAM,EAAE,EACrD,WAAY,IAAmB,EAAM,GACrC,sBACE,IAAsB,EAAM,IAAM,IAAmB,EAAM,GACvD,EACA,KAES,gBACa,6BACN,uBACI,2BAC1B,qBAAwB,EAAuB,EAAM,EAAE,EACvD,gBAAmB,CACjB,EAAiB,EAAI,EACrB,EAAkB,EAAM,EAAE,CAC5B,EACA,cAAiB,CACf,EAAe,EACf,EAAwB,CAC1B,EACA,WAAa,GAAU,CACrB,EAAM,eAAe,EACrB,GAAM,CAAE,gBAAiB,EACrB,IACF,EAAa,WAAa,QAE5B,EAAqB,EAAM,EAAE,EAC7B,EAAgB,EAAoB,CAAK,CAAC,CAC5C,EACA,gBAAmB,CACjB,EAAsB,GACpB,IAAY,EAAM,GAAK,KAAO,CAChC,CACF,EACA,OAAS,GAAU,CACjB,EAAM,eAAe,EACrB,EAAW,EAAM,GAAI,EAAoB,CAAK,CAAC,CACjD,EACA,4BAA+B,EAA6B,EAAM,EAAE,EACpE,sBAAyB,EAAkB,EAAM,MAAM,EAC/B,wBACzB,EA5CM,EAAM,EA4CZ,CACF,CACE,CAAA,CAET"}
|
|
@@ -14,6 +14,7 @@ interface ConversationGroupFolderListProps {
|
|
|
14
14
|
setGroupFolderOrder: (order: readonly string[]) => void;
|
|
15
15
|
collapsedGroupIds: ReadonlySet<string>;
|
|
16
16
|
expandedGroupPreviewIds: ReadonlySet<string>;
|
|
17
|
+
discoveryConversationIds: ReadonlySet<string> | null;
|
|
17
18
|
onToggleGroupCollapsed: (groupId: string) => void;
|
|
18
19
|
onToggleGroupPreviewExpanded: (groupId: string) => void;
|
|
19
20
|
isCreatingConversationFlow: boolean;
|
|
@@ -21,5 +22,5 @@ interface ConversationGroupFolderListProps {
|
|
|
21
22
|
onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;
|
|
22
23
|
renderConversationCard: (conversation: AppConversation) => ReactNode;
|
|
23
24
|
}
|
|
24
|
-
export declare function ConversationGroupFolderList({ groups, groupIds, groupFolderOrder, setGroupFolderOrder, collapsedGroupIds, expandedGroupPreviewIds, onToggleGroupCollapsed, onToggleGroupPreviewExpanded, isCreatingConversationFlow, activeConversationId, onLaunchFromGroup, renderConversationCard, }: ConversationGroupFolderListProps): import("react").JSX.Element;
|
|
25
|
+
export declare function ConversationGroupFolderList({ groups, groupIds, groupFolderOrder, setGroupFolderOrder, collapsedGroupIds, expandedGroupPreviewIds, discoveryConversationIds, onToggleGroupCollapsed, onToggleGroupPreviewExpanded, isCreatingConversationFlow, activeConversationId, onLaunchFromGroup, renderConversationCard, }: ConversationGroupFolderListProps): import("react").JSX.Element;
|
|
25
26
|
export {};
|
|
@@ -5,67 +5,68 @@ import { ConversationGroupFolderRow as r } from "./conversation-group-folder-row
|
|
|
5
5
|
import { useCallback as i, useEffect as a, useRef as o, useState as s } from "react";
|
|
6
6
|
import { jsx as c } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/features/conversation-panel/conversation-group-folder-list.tsx
|
|
8
|
-
function l({ groups: l, groupIds: u, groupFolderOrder: d, setGroupFolderOrder: f, collapsedGroupIds: p, expandedGroupPreviewIds: m,
|
|
9
|
-
let { t:
|
|
8
|
+
function l({ groups: l, groupIds: u, groupFolderOrder: d, setGroupFolderOrder: f, collapsedGroupIds: p, expandedGroupPreviewIds: m, discoveryConversationIds: h, onToggleGroupCollapsed: g, onToggleGroupPreviewExpanded: _, isCreatingConversationFlow: v, activeConversationId: y, onLaunchFromGroup: b, renderConversationCard: x }) {
|
|
9
|
+
let { t: S } = e("openhands"), [C, w] = s(null), [T, E] = s(null), [D, O] = s(null), [k, A] = s(!1), j = o(null);
|
|
10
10
|
a(() => () => {
|
|
11
|
-
|
|
11
|
+
j.current && clearTimeout(j.current);
|
|
12
12
|
}, []);
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
let M = i(() => {
|
|
14
|
+
j.current && clearTimeout(j.current), j.current = setTimeout(() => {
|
|
15
|
+
A(!1), j.current = null;
|
|
16
16
|
}, 300);
|
|
17
|
-
}, []),
|
|
18
|
-
|
|
19
|
-
}, []),
|
|
17
|
+
}, []), N = i(() => {
|
|
18
|
+
w(null), E(null), O(null);
|
|
19
|
+
}, []), P = i((e) => {
|
|
20
20
|
let t = e.currentTarget.getBoundingClientRect();
|
|
21
21
|
return e.clientY < t.top + t.height / 2 ? "before" : "after";
|
|
22
|
-
}, []),
|
|
23
|
-
if (!
|
|
24
|
-
|
|
22
|
+
}, []), F = i((e, t) => {
|
|
23
|
+
if (!C || C === e) {
|
|
24
|
+
N(), M();
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
f(n(d, u,
|
|
27
|
+
f(n(d, u, C, e, t)), N(), M();
|
|
28
28
|
}, [
|
|
29
|
-
|
|
29
|
+
C,
|
|
30
30
|
d,
|
|
31
31
|
u,
|
|
32
|
-
|
|
32
|
+
N,
|
|
33
33
|
f,
|
|
34
|
-
|
|
34
|
+
M
|
|
35
35
|
]);
|
|
36
36
|
return /* @__PURE__ */ c("nav", {
|
|
37
|
-
"aria-label":
|
|
37
|
+
"aria-label": S(t.SIDEBAR$CONVERSATIONS),
|
|
38
38
|
className: "space-y-1 md:space-y-0.5 pb-1",
|
|
39
39
|
children: l.map((e) => /* @__PURE__ */ c(r, {
|
|
40
40
|
group: e,
|
|
41
41
|
expanded: !p.has(e.id),
|
|
42
42
|
previewExpanded: m.has(e.id),
|
|
43
|
-
isDragging:
|
|
44
|
-
dropIndicatorPosition:
|
|
45
|
-
animateLayout:
|
|
46
|
-
isCreatingConversationFlow:
|
|
47
|
-
activeConversationId:
|
|
48
|
-
|
|
43
|
+
isDragging: C === e.id,
|
|
44
|
+
dropIndicatorPosition: T === e.id && C !== e.id ? D : null,
|
|
45
|
+
animateLayout: k,
|
|
46
|
+
isCreatingConversationFlow: v,
|
|
47
|
+
activeConversationId: y,
|
|
48
|
+
discoveryConversationIds: h,
|
|
49
|
+
onToggleExpanded: () => g(e.id),
|
|
49
50
|
onDragStart: () => {
|
|
50
|
-
|
|
51
|
+
A(!0), w(e.id);
|
|
51
52
|
},
|
|
52
53
|
onDragEnd: () => {
|
|
53
|
-
|
|
54
|
+
N(), M();
|
|
54
55
|
},
|
|
55
56
|
onDragOver: (t) => {
|
|
56
57
|
t.preventDefault();
|
|
57
58
|
let { dataTransfer: n } = t;
|
|
58
|
-
n && (n.dropEffect = "move"),
|
|
59
|
+
n && (n.dropEffect = "move"), E(e.id), O(P(t));
|
|
59
60
|
},
|
|
60
61
|
onDragLeave: () => {
|
|
61
|
-
|
|
62
|
+
E((t) => t === e.id ? null : t);
|
|
62
63
|
},
|
|
63
64
|
onDrop: (t) => {
|
|
64
|
-
t.preventDefault(),
|
|
65
|
+
t.preventDefault(), F(e.id, P(t));
|
|
65
66
|
},
|
|
66
|
-
onTogglePreviewExpanded: () =>
|
|
67
|
-
onLaunchFromGroup: () =>
|
|
68
|
-
renderConversationCard:
|
|
67
|
+
onTogglePreviewExpanded: () => _(e.id),
|
|
68
|
+
onLaunchFromGroup: () => b(e.launch),
|
|
69
|
+
renderConversationCard: x
|
|
69
70
|
}, e.id))
|
|
70
71
|
});
|
|
71
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-group-folder-list.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"conversation-group-folder-list.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n discoveryConversationIds: ReadonlySet<string> | null;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n discoveryConversationIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n discoveryConversationIds={discoveryConversationIds}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAyCA,SAAgB,EAA4B,EAC1C,WACA,aACA,qBACA,wBACA,sBACA,4BACA,6BACA,2BACA,iCACA,+BACA,yBACA,sBACA,6BACmC;CACnC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAgB,KAAqB,EAAwB,IAAI,GAClE,CAAC,GAAmB,KAAwB,EAChD,IACF,GACM,CAAC,GAAc,KACnB,EAAyC,IAAI,GAGzC,CAAC,GAAe,KAAoB,EAAS,EAAK,GAClD,IAA0B,EAC9B,IACF;CAEA,cACc;EACV,AAAI,EAAwB,WAC1B,aAAa,EAAwB,OAAO;CAEhD,GACA,CAAC,CACH;CAEA,IAAM,IAA0B,QAAkB;EAIhD,AAHI,EAAwB,WAC1B,aAAa,EAAwB,OAAO,GAE9C,EAAwB,UAAU,iBAAiB;GAEjD,AADA,EAAiB,EAAK,GACtB,EAAwB,UAAU;EACpC,GAAG,GAAG;CACR,GAAG,CAAC,CAAC,GAEC,IAAiB,QAAkB;EAGvC,AAFA,EAAkB,IAAI,GACtB,EAAqB,IAAI,GACzB,EAAgB,IAAI;CACtB,GAAG,CAAC,CAAC,GAEC,IAAsB,GACzB,MAA2D;EAC1D,IAAM,IAAO,EAAM,cAAc,sBAAsB;EACvD,OAAO,EAAM,UAAU,EAAK,MAAM,EAAK,SAAS,IAAI,WAAW;CACjE,GACA,CAAC,CACH,GAEM,IAAa,GAChB,GAAuB,MAAsC;EAC5D,IAAI,CAAC,KAAkB,MAAmB,GAAe;GAEvD,AADA,EAAe,GACf,EAAwB;GACxB;EACF;EAcA,AAZA,EACE,EACE,GACA,GACA,GACA,GACA,CACF,CACF,GACA,EAAe,GAGf,EAAwB;CAC1B,GACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,OAAD;EACE,cAAY,EAAE,EAAQ,qBAAqB;EAC3C,WAAU;YAET,EAAO,KAAK,MACX,kBAAC,GAAD;GAES;GACP,UAAU,CAAC,EAAkB,IAAI,EAAM,EAAE;GACzC,iBAAiB,EAAwB,IAAI,EAAM,EAAE;GACrD,YAAY,MAAmB,EAAM;GACrC,uBACE,MAAsB,EAAM,MAAM,MAAmB,EAAM,KACvD,IACA;GAES;GACa;GACN;GACI;GAC1B,wBAAwB,EAAuB,EAAM,EAAE;GACvD,mBAAmB;IAEjB,AADA,EAAiB,EAAI,GACrB,EAAkB,EAAM,EAAE;GAC5B;GACA,iBAAiB;IAEf,AADA,EAAe,GACf,EAAwB;GAC1B;GACA,aAAa,MAAU;IACrB,EAAM,eAAe;IACrB,IAAM,EAAE,oBAAiB;IAKzB,AAJI,MACF,EAAa,aAAa,SAE5B,EAAqB,EAAM,EAAE,GAC7B,EAAgB,EAAoB,CAAK,CAAC;GAC5C;GACA,mBAAmB;IACjB,GAAsB,MACpB,MAAY,EAAM,KAAK,OAAO,CAChC;GACF;GACA,SAAS,MAAU;IAEjB,AADA,EAAM,eAAe,GACrB,EAAW,EAAM,IAAI,EAAoB,CAAK,CAAC;GACjD;GACA,+BAA+B,EAA6B,EAAM,EAAE;GACpE,yBAAyB,EAAkB,EAAM,MAAM;GAC/B;EACzB,GA5CM,EAAM,EA4CZ,CACF;CACE,CAAA;AAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/folder-open.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/plus.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.cjs"),s=require("./conversation-panel-list-helpers.cjs");let c=require("react"),l=require("react/jsx-runtime");function u({group:u,expanded:d,previewExpanded:f,isDragging:p,dropIndicatorPosition:m,animateLayout:h,isCreatingConversationFlow:g,activeConversationId:_,
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/folder-open.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/plus.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.cjs"),s=require("./conversation-panel-list-helpers.cjs");let c=require("react"),l=require("react/jsx-runtime");function u({group:u,expanded:d,previewExpanded:f,isDragging:p,dropIndicatorPosition:m,animateLayout:h,isCreatingConversationFlow:g,activeConversationId:_,discoveryConversationIds:v,onToggleExpanded:y,onDragStart:b,onDragEnd:x,onDragOver:S,onDragLeave:C,onDrop:w,onTogglePreviewExpanded:T,onLaunchFromGroup:E,renderConversationCard:D}){let{t:O}=e.useTranslation(`openhands`),k=(0,c.useRef)(null),A=`thread-folder-${u.id.replace(/[^a-zA-Z0-9_-]/g,`-`)}`,j=u.id.replace(/[^a-zA-Z0-9_-]/g,`-`),{visibleConversations:M,isPreviewTruncated:N,isShowingAll:P}=s.getGroupConversationPreview(u.conversations,{expanded:f,activeConversationId:_,discoveryConversationIds:v??void 0});return(0,l.jsxs)(o.motion.section,{ref:k,layout:h?`position`:!1,transition:{type:`spring`,stiffness:600,damping:45},"aria-labelledby":A,"data-testid":`thread-folder-${j}`,onDragOver:S,onDragLeave:C,onDrop:w,className:`relative rounded-md`,children:[m?(0,l.jsx)(`div`,{"aria-hidden":!0,"data-testid":`thread-folder-drop-indicator-${j}`,className:a.cn(`pointer-events-none absolute inset-x-0 z-10 h-0.5 rounded-full bg-[var(--oh-accent)]`,m===`before`?`-top-0.5`:`-bottom-0.5`)}):null,(0,l.jsxs)(`div`,{className:a.cn(p&&`opacity-0`),children:[(0,l.jsxs)(`div`,{className:a.cn(`flex h-8 w-full min-w-0 items-center gap-0.5 rounded-md pl-2 pr-1 text-sm font-normal`,`text-[var(--oh-muted)] transition-colors hover:bg-[var(--oh-surface-raised)] hover:text-white`),children:[(0,l.jsxs)(`button`,{type:`button`,draggable:!0,id:A,"aria-expanded":d,"aria-controls":`thread-folder-content-${j}`,"data-testid":`thread-folder-drag-${j}`,"aria-label":O(d?t.I18nKey.CONVERSATION_PANEL$COLLAPSE_FOLDER:t.I18nKey.CONVERSATION_PANEL$EXPAND_FOLDER,{label:u.label}),onClick:y,onDragStart:e=>{e.stopPropagation();let{dataTransfer:t}=e;if(t){t.effectAllowed=`move`,t.setData(`text/plain`,u.id);let n=k.current;if(n&&typeof t.setDragImage==`function`){let r=n.getBoundingClientRect(),i=n.cloneNode(!0);i.style.position=`fixed`,i.style.top=`0`,i.style.left=`-9999px`,i.style.width=`${r.width}px`,i.style.margin=`0`,i.style.pointerEvents=`none`,i.style.borderRadius=`0.5rem`,i.style.padding=`0.25rem`,i.style.backgroundColor=`var(--oh-surface-raised)`,i.style.boxShadow=`0 8px 24px rgba(0, 0, 0, 0.35)`,document.body.appendChild(i),t.setDragImage(i,e.clientX-r.left,e.clientY-r.top),window.setTimeout(()=>i.remove(),0)}}b()},onDragEnd:e=>{e.stopPropagation(),x()},className:a.cn(`group/folder flex min-h-8 min-w-0 flex-1 cursor-grab items-center gap-2 rounded-md py-1 text-left text-inherit outline-none active:cursor-grabbing`,`focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`),children:[(0,l.jsx)(r.Folder,{className:a.cn(`h-4 w-4 shrink-0`,d?`hidden group-hover/folder:block`:`block group-hover/folder:hidden`),"aria-hidden":!0}),(0,l.jsx)(n.FolderOpen,{className:a.cn(`h-4 w-4 shrink-0`,d?`block group-hover/folder:hidden`:`hidden group-hover/folder:block`),"aria-hidden":!0}),(0,l.jsx)(`span`,{className:`truncate`,children:u.label})]}),(0,l.jsx)(`button`,{type:`button`,className:a.cn(`inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md`,`text-inherit transition-colors`,`hover:bg-white/10 hover:text-white`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`,`disabled:cursor-not-allowed disabled:opacity-50`),disabled:g,"aria-label":O(t.I18nKey.CONVERSATION_PANEL$ADD_CONVERSATION_TO_GROUP,{label:u.label}),"data-testid":`add-conversation-to-group-${j}`,onClick:e=>{e.preventDefault(),e.stopPropagation(),E()},children:(0,l.jsx)(i.Plus,{className:`h-3.5 w-3.5 shrink-0`,"aria-hidden":!0,strokeWidth:2})})]}),d?(0,l.jsxs)(`div`,{id:`thread-folder-content-${j}`,className:`mt-0.5 space-y-0.5`,children:[M.map(D),N?(0,l.jsx)(`div`,{className:`pl-2`,children:(0,l.jsx)(`button`,{type:`button`,"data-testid":`thread-folder-view-more-${j}`,onClick:T,className:`cursor-pointer text-xs text-[var(--oh-text-dim)] hover:text-white`,children:O(P?t.I18nKey.CONVERSATION_PANEL$LESS:t.I18nKey.CONVERSATION_PANEL$MORE)})}):null]}):null]})]})}exports.ConversationGroupFolderRow=u;
|
|
2
2
|
//# sourceMappingURL=conversation-group-folder-row.cjs.map
|