@openhands/agent-canvas 1.12.0 → 1.14.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-CYy8qA2z.js} +1 -1
- package/build/assets/active-backend-context-BZDG15C0.js +2 -0
- package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DGWBBbcp.js} +1 -1
- package/build/assets/agent-profiles-settings-DrkGdf4_.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DK56YPTs.js +86 -0
- package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-DfcSgkLD.js} +2 -2
- package/build/assets/agent-settings-Lrc5-twS.js +1 -0
- package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-BgDHhL7b.js} +1 -1
- package/build/assets/api-error-message-BEIE_yD1.js +1 -0
- package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-DaZnOlVo.js} +1 -1
- package/build/assets/{app-settings-D0OKHB3M.js → app-settings-BG5NAUbC.js} +1 -1
- package/build/assets/automation-detail-D4Hs831Z.js +3 -0
- package/build/assets/automation-export-n0X6FB0C.js +2 -0
- package/build/assets/automation-git-sync-CDrm8WV7.js +1 -0
- package/build/assets/automation-setup-route-CZCl4ONs.js +1 -0
- package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DFF96AdL.js} +1 -1
- package/build/assets/automations-list-Bl-oGOrV.js +1 -0
- package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-H_ThtDA0.js} +1 -1
- package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-CbCemvHt.js} +1 -1
- package/build/assets/backend-not-configured-DP8KLNq_.js +1 -0
- package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-BBASWqsb.js} +1 -1
- package/build/assets/{badge-Dpn3-LTV.js → badge-B-51h-SW.js} +1 -1
- package/build/assets/{base-modal-3NmIOKDm.js → base-modal-BbjycA8X.js} +1 -1
- package/build/assets/bot-CGPCg03p.js +1 -0
- package/build/assets/{brand-button-CJcwjnfb.js → brand-button-Blxv5nww.js} +1 -1
- package/build/assets/browser-CuW0nWvh.js +7 -0
- package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-D5G0ORwt.js} +1 -1
- package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-BD2tii1r.js} +1 -1
- package/build/assets/check-DSuS-lyr.js +1 -0
- package/build/assets/chevron-down-CgGcmtE2.js +1 -0
- package/build/assets/circle-check-CG5-NPw7.js +1 -0
- package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-ASbpB8vN.js} +1 -1
- package/build/assets/cloud-funnel-analytics-GlCUG0gk.js +1 -0
- package/build/assets/cog-CZiR80uT.js +1 -0
- package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-DvpEsh2O.js} +1 -1
- package/build/assets/{command-menu-BKOLj-TC.js → command-menu-DwUQzjYP.js} +1 -1
- package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BptcoiLA.js} +1 -1
- package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-CiEwxZAA.js} +1 -1
- package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-CdcamfM1.js} +1 -1
- package/build/assets/conversation-DREHj4nT.js +1 -0
- package/build/assets/conversation-DotRfiDz.js +90 -0
- package/build/assets/conversation-panel-DREHj4nT.js +1 -0
- package/build/assets/conversation-state-store-DMLtlHbE.js +1 -0
- package/build/assets/conversation-store-Blc5xysY.js +6 -0
- package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-D-puECpY.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-BGxcUbgy.js} +1 -1
- package/build/assets/{device-verify-BIjXeW9N.js → device-verify-CZJfWaJf.js} +1 -1
- package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-tLhpwtxS.js} +1 -1
- package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-D8GnI6GZ.js} +2 -2
- package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-Fk8k60nk.js} +1 -1
- package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-DeztVYuL.js} +1 -1
- package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-Cd6GCYzq.js} +1 -1
- package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-C4sgZg-y.js} +1 -1
- package/build/assets/external-link-C0UpBgsE.js +1 -0
- package/build/assets/{file-text-RecuaId_.js → file-text-C6WYtNdV.js} +1 -1
- package/build/assets/files-tab-BW_qzyAm.js +1 -0
- package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-CGXBLcn1.js} +1 -1
- package/build/assets/format-model-name-BNPKVsIq.js +1 -0
- package/build/assets/format-relative-time-ZhQD4rsl.js +1 -0
- package/build/assets/git-provider-icon-CaQ1yLPi.js +1 -0
- package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-CgXR6M_E.js} +1 -1
- package/build/assets/git-repo-dropdown-D2Uei3CO.js +1 -0
- package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_YOp8Fo.js} +1 -1
- package/build/assets/home-DNzzJcMP.js +1 -0
- package/build/assets/home-aCos-5vc.js +1 -0
- package/build/assets/{home-store-Cubdq0uP.js → home-store-DgzViC3f.js} +1 -1
- package/build/assets/index-home-DNzzJcMP.js +1 -0
- package/build/assets/info-CLoC1LRo.js +1 -0
- package/build/assets/install-server-modal-D7zIqNKz.js +1 -0
- package/build/assets/kebab-menu-item-content-DERMdnDv.js +1 -0
- package/build/assets/{launch-c4GEP8oo.js → launch-5PjKeLak.js} +1 -1
- package/build/assets/{list-todo-CheUtB7F.js → list-todo-BF049YaY.js} +1 -1
- package/build/assets/llm-not-configured-banner-BK9z5eS0.js +27 -0
- package/build/assets/llm-settings-BLAMK2tR.js +1 -0
- package/build/assets/llm-settings-BWsbarGM.js +1 -0
- package/build/assets/llm-subscription-service-SfnEV9Uc.js +1 -0
- package/build/assets/loader-circle-D7IagAyF.js +1 -0
- package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-DBgXgra0.js} +1 -1
- package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-BTqNPhzc.js} +1 -1
- package/build/assets/manifest-abebca3c.js +1 -0
- package/build/assets/manifest-subpage-layout-Rn-glaxV.js +1 -0
- package/build/assets/{map-provider-7Bp2aih5.js → map-provider-BK4HnqYz.js} +1 -1
- package/build/assets/markdown-renderer-Cp6DlHQN.js +8 -0
- package/build/assets/{mcp-Da7wFU7A.js → mcp-BC-Ixn4T.js} +2 -2
- package/build/assets/mcp-marketplace-utils-BJWJgbB6.js +1 -0
- package/build/assets/messages-CzFKrzPG.js +40 -0
- package/build/assets/{modal-body-duRaxj_K.js → modal-body-BdKfD3Hl.js} +1 -1
- package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D5_b5vMi.js} +1 -1
- package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-objukxk_.js} +1 -1
- package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-C_gXyLyD.js} +1 -1
- package/build/assets/{npm-Cswluf6-.js → npm-CHVHV1MC.js} +1 -1
- package/build/assets/{onboarding-BKbTYlW1.js → onboarding-Diw0V51A.js} +1 -1
- package/build/assets/onboarding-modal-Da4yHzsA.js +1 -0
- package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-BztSy69u.js} +1 -1
- package/build/assets/parse-git-remote-url-BkXN9jzl.js +1 -0
- package/build/assets/pencil-49avMHlD.js +1 -0
- package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-CJiSpNax.js} +1 -1
- package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-lHdNKWNU.js} +1 -1
- package/build/assets/plus-C0BagBpV.js +1 -0
- package/build/assets/profiles-service.api-BLr7FXec.js +1 -0
- package/build/assets/providers-CWXnb7S3.js +1 -0
- package/build/assets/{proxy-b4aqL4SX.js → proxy-DYDXxtje.js} +1 -1
- package/build/assets/{puzzle-B3v361yY.js → puzzle-Bt2B1rzf.js} +1 -1
- package/build/assets/recommended-automations-launcher-CcFMfJRR.js +1 -0
- package/build/assets/refresh-cw-nmcesifB.js +1 -0
- package/build/assets/root-CT4t7apy.css +1 -0
- package/build/assets/root-DnRgLKpU.js +2 -0
- package/build/assets/root-layout-2L9tr-BN.js +2 -0
- package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-C59lVZTA.js} +1 -1
- package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-BbBEQQjq.js} +1 -1
- package/build/assets/search-CYSDBczG.js +1 -0
- package/build/assets/secrets-service-BtsgYSlj.js +1 -0
- package/build/assets/secrets-settings-DJ0OKa4_.js +1 -0
- package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DiVfTZuN.js} +1 -1
- package/build/assets/{settings-CZPGNens.js → settings-CDqL_Uqh.js} +1 -1
- package/build/assets/{settings-CWFxymAf.js → settings-DcNPxz0v.js} +1 -1
- package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-Ba1UN5Du.js} +1 -1
- package/build/assets/{settings-index-Dtlegd6s.js → settings-index-Cz2cKt2K.js} +1 -1
- package/build/assets/{settings-input-D61Vzp9e.js → settings-input-CWUEHHvS.js} +1 -1
- package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-DdcLXDGn.js} +1 -1
- package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-nEEK1Kh1.js} +1 -1
- package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api-3yAUFcaP.js} +1 -1
- package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-Dk9hChx1.js} +1 -1
- package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-CxjtCSB3.js} +1 -1
- package/build/assets/shared-conversation-DbAcrx3s.js +1 -0
- package/build/assets/shield-check-CiOTXxV2.js +1 -0
- package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-lrfPooIB.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-KERXfNu1.js} +1 -1
- package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-B8lFD6Cb.js} +1 -1
- package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-u6pUpxJ7.js} +1 -1
- package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-dGIUzr_b.js} +1 -1
- package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-kkOWZ89w.js} +1 -1
- package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-DWN1PBPH.js} +1 -1
- package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-DFjH2Nq6.js} +1 -1
- package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-DIHpl3ol.js} +2 -2
- package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-ntyMLnbj.js} +1 -1
- package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-B6JXcsmL.js} +1 -1
- package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-aEJzEcHD.js} +1 -1
- package/build/assets/{terminal-DRrJo-cR.js → terminal-Dch7Ty5K.js} +1 -1
- package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-B2MLKsgt.js} +1 -1
- package/build/assets/trash-2-yZnDM4Ji.js +1 -0
- package/build/assets/{typography-D9tiHct7.js → typography-DB5HoCk0.js} +1 -1
- package/build/assets/usage-tab-DrEtBmBT.js +1 -0
- package/build/assets/use-acp-credential-form-c8KXAa8A.js +1 -0
- package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-B0p34N3q.js} +1 -1
- package/build/assets/use-agent-profiles-CPIc6wLH.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dz_8Eqkv.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-DvUVqCle.js} +1 -1
- package/build/assets/use-config-C3PO4TBw.js +1 -0
- package/build/assets/use-create-conversation-DVrA_uLD.js +1 -0
- package/build/assets/use-create-secret-DbBIpaCR.js +1 -0
- package/build/assets/use-get-secrets-6PBitf54.js +1 -0
- package/build/assets/use-has-permission-CQ31Cl8j.js +1 -0
- package/build/assets/use-is-authed-2UrDIziV.js +1 -0
- package/build/assets/use-is-creating-conversation-BvYpmb3v.js +1 -0
- 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-diZS4FiN.js +1 -0
- package/build/assets/use-manifest-capabilities-HIWCtIUm.js +1 -0
- package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-Bs8PcXik.js} +1 -1
- package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-BCuNLFsr.js} +1 -1
- package/build/assets/use-save-agent-profile-BaMNSpBV.js +1 -0
- package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-BahvC2Gw.js} +1 -1
- package/build/assets/{use-settings-BmLzQjnC.js → use-settings-C6ZxpBDX.js} +1 -1
- package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-Bqn69Ggw.js} +2 -2
- package/build/assets/use-tracking-Bhu7gk2y.js +3 -0
- package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-BkNXpXrd.js} +1 -1
- package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-c_OmS3lK.js} +1 -1
- package/build/assets/{useMutation-ChpkYxI5.js → useMutation-6ZsQCqAn.js} +1 -1
- package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-xDrGlTO_.js} +1 -1
- package/build/assets/{useQuery-BCnzy4LX.js → useQuery-Bs5NFz2s.js} +1 -1
- package/build/assets/utils-DUD5ScdA.js +1 -0
- package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
- package/build/assets/{vendor~entry.client-CgNUwtQL.js → vendor~entry.client-BFE7Llz9.js} +1 -1
- package/build/assets/{vendor~entry.client-zSIea5EO.js → vendor~entry.client-BaKt_PIp.js} +1 -1
- 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~kepq2zme-D87mAf6K.js} +3 -3
- package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-B6POTS66.js} +1 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js +13 -0
- package/build/assets/vendor~root-layout-DeQACFVA.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-bv7ooVgH.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-e8pX05xf.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-BvS6PCK2.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-DOPLJMH9.js} +2 -2
- 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~iw7io29p-Dz8NQve5.js} +1 -1
- package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-COueVXmM.js} +1 -1
- package/build/assets/{wrench-B1_H-tL1.js → wrench-C95ujnYo.js} +1 -1
- package/build/assets/x-86ZCfxKY.js +1 -0
- package/build/assets/zap-DRa-r-Tf.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +88 -3
- package/build/locales/ca/openhands.json +88 -3
- package/build/locales/de/openhands.json +88 -3
- package/build/locales/en/openhands.json +88 -3
- package/build/locales/es/openhands.json +88 -3
- package/build/locales/fr/openhands.json +88 -3
- package/build/locales/it/openhands.json +88 -3
- package/build/locales/ja/openhands.json +88 -3
- package/build/locales/ko-KR/openhands.json +88 -3
- package/build/locales/no/openhands.json +88 -3
- package/build/locales/pt/openhands.json +88 -3
- package/build/locales/tr/openhands.json +88 -3
- package/build/locales/uk/openhands.json +88 -3
- package/build/locales/zh-CN/openhands.json +88 -3
- package/build/locales/zh-TW/openhands.json +88 -3
- 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/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +10 -0
- package/dist/api/automation-service/automation-service.api.js +42 -0
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +9 -0
- package/dist/api/cloud/conversation-service.api.js +11 -1
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.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/api/profiles-service/profiles-service.api.cjs +1 -1
- package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
- package/dist/api/profiles-service/profiles-service.api.d.ts +15 -2
- package/dist/api/profiles-service/profiles-service.api.js +25 -2
- package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
- package/dist/api/secrets-service.cjs +1 -1
- package/dist/api/secrets-service.cjs.map +1 -1
- package/dist/api/secrets-service.d.ts +5 -0
- package/dist/api/secrets-service.js +12 -6
- package/dist/api/secrets-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/event-message-components/index.d.ts +0 -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/git-sync/git-sync-activity-row.d.ts +15 -0
- package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
- package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
- package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
- package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
- package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
- package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
- package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
- package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
- package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +177 -176
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.js +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/error-message-banner.cjs +1 -1
- package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
- package/dist/components/features/chat/error-message-banner.d.ts +3 -1
- package/dist/components/features/chat/error-message-banner.js +64 -58
- package/dist/components/features/chat/error-message-banner.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/compact-conversation-row.cjs +1 -1
- package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
- 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 +240 -175
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +22 -25
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
- package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
- 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 +227 -219
- 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-commit-changes.cjs +1 -1
- package/dist/hooks/query/use-commit-changes.js +4 -4
- 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-git-sync.d.ts +19 -0
- 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/query/use-task-polling.cjs +1 -1
- package/dist/hooks/query/use-task-polling.cjs.map +1 -1
- package/dist/hooks/query/use-task-polling.js +12 -10
- package/dist/hooks/query/use-task-polling.js.map +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
- package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
- package/dist/hooks/query/use-unified-git-commits.js +4 -4
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.js +4 -4
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-files.d.ts +14 -4
- package/dist/hooks/query/use-workspace-files.js +45 -32
- package/dist/hooks/query/use-workspace-files.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-responder-url-secret.d.ts +5 -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/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +6 -0
- package/dist/hooks/use-tracking.js +6 -0
- package/dist/hooks/use-tracking.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 +86 -1
- 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 +1475 -30
- 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 +88 -3
- package/dist/locales/ca/openhands.json +88 -3
- package/dist/locales/de/openhands.json +88 -3
- package/dist/locales/en/openhands.json +88 -3
- package/dist/locales/es/openhands.json +88 -3
- package/dist/locales/fr/openhands.json +88 -3
- package/dist/locales/it/openhands.json +88 -3
- package/dist/locales/ja/openhands.json +88 -3
- package/dist/locales/ko-KR/openhands.json +88 -3
- package/dist/locales/no/openhands.json +88 -3
- package/dist/locales/pt/openhands.json +88 -3
- package/dist/locales/tr/openhands.json +88 -3
- package/dist/locales/uk/openhands.json +88 -3
- package/dist/locales/zh-CN/openhands.json +88 -3
- package/dist/locales/zh-TW/openhands.json +88 -3
- 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/circle-alert.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.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/files-tab.cjs +1 -1
- package/dist/routes/files-tab.js +11 -11
- package/dist/routes/files-tab.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/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +2 -2
- package/dist/services/settings.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.js +47 -51
- package/dist/services/telemetry.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/error-message-store.cjs +1 -1
- package/dist/stores/error-message-store.cjs.map +1 -1
- package/dist/stores/error-message-store.d.ts +3 -1
- package/dist/stores/error-message-store.js +5 -3
- package/dist/stores/error-message-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/types/git-sync.d.ts +51 -0
- 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/error-handler.cjs +1 -1
- package/dist/utils/error-handler.cjs.map +1 -1
- package/dist/utils/error-handler.d.ts +3 -2
- package/dist/utils/error-handler.js +18 -5
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +1 -0
- package/dist/utils/format-model-name.js +1 -0
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-token-count.cjs +2 -0
- package/dist/utils/format-token-count.cjs.map +1 -0
- package/dist/utils/format-token-count.d.ts +3 -0
- package/dist/utils/format-token-count.js +19 -0
- package/dist/utils/format-token-count.js.map +1 -0
- package/dist/utils/hover-reveal-classes.cjs +2 -0
- package/dist/utils/hover-reveal-classes.cjs.map +1 -0
- package/dist/utils/hover-reveal-classes.d.ts +34 -0
- package/dist/utils/hover-reveal-classes.js +41 -0
- package/dist/utils/hover-reveal-classes.js.map +1 -0
- package/dist/utils/is-markdown-file-path.cjs +2 -0
- package/dist/utils/is-markdown-file-path.cjs.map +1 -0
- package/dist/utils/is-markdown-file-path.d.ts +4 -0
- package/dist/utils/is-markdown-file-path.js +14 -0
- package/dist/utils/is-markdown-file-path.js.map +1 -0
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
- package/dist/utils/mcp-marketplace-utils.js +19 -16
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/transcript-export/index.cjs +3 -3
- package/dist/utils/transcript-export/index.cjs.map +1 -1
- package/dist/utils/transcript-export/index.js +12 -12
- package/dist/utils/transcript-export/index.js.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.js +25 -17
- 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/check-translation-completeness.cjs +3 -0
- package/scripts/dev-process-utils.mjs +6 -1
- package/scripts/dev-safe.mjs +57 -2
- package/scripts/dev-with-automation.mjs +98 -9
- 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/automation-detail-C0SxWTnQ.js +0 -3
- package/build/assets/automation-export-BjQa_fT6.js +0 -2
- package/build/assets/automation-setup-route-BzCNpljP.js +0 -1
- package/build/assets/automations-list-dZg8zOCl.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/cloud-funnel-analytics-CcSez21r.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-state-store-CtgILxWF.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/format-model-name-BN_rx1Y3.js +0 -1
- package/build/assets/format-relative-time-BerVamGl.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/home-Y0aDou-a.js +0 -1
- package/build/assets/index-home-DqyeeFA_.js +0 -1
- package/build/assets/info-C9lpK5pw.js +0 -1
- package/build/assets/install-server-modal-DW6dSyGr.js +0 -1
- package/build/assets/kebab-menu-item-content-CKydZrbH.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/manifest-subpage-layout-Ds7G5GZ8.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/onboarding-modal-DrrGlEQq.js +0 -1
- package/build/assets/pencil-Bl3GWhgq.js +0 -1
- package/build/assets/plus-CtzlyAoF.js +0 -1
- package/build/assets/profiles-service.api-vcE_jJCe.js +0 -1
- package/build/assets/providers-CdrPPm0z.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-CBBi6IAe.js +0 -2
- 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/secrets-service-BHF4fxML.js +0 -1
- package/build/assets/secrets-settings-aBGXtQhX.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-acp-credential-form-DGyo0QvL.js +0 -1
- package/build/assets/use-agent-profiles-B37XWDLq.js +0 -1
- package/build/assets/use-config-DapX3pjC.js +0 -1
- package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
- package/build/assets/use-create-secret-DcpT3RPw.js +0 -1
- package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
- package/build/assets/use-is-creating-conversation-CVefC9Ns.js +0 -1
- package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
- package/build/assets/use-manifest-capabilities-zihHDbMW.js +0 -1
- package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
- package/build/assets/use-tracking-salbPJxT.js +0 -3
- 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/api/cloud/suggestions-service.api.d.ts +0 -8
- package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
- package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
- package/dist/components/conversation-events/index.d.ts +0 -1
- package/dist/components/features/automations/metadata-chip.d.ts +0 -6
- package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
- package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
- package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
- package/dist/components/features/controls/tools.d.ts +0 -2
- 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/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
- package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
- package/dist/components/features/home/home-header/home-header.d.ts +0 -1
- package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
- package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
- package/dist/components/features/home/new-conversation.d.ts +0 -1
- package/dist/components/features/home/tasks/task-card.d.ts +0 -6
- package/dist/components/features/home/tasks/task-group.d.ts +0 -7
- package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
- package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
- package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
- package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
- package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
- package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
- package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
- package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
- package/dist/hooks/use-should-show-user-features.d.ts +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/dist/ui/card-title.d.ts +0 -16
- package/dist/ui/card.d.ts +0 -14
- package/dist/utils/group-suggested-tasks.d.ts +0 -7
- /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~dcc51rps-rfV8mQ9m.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
- /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BOVIFA_g.js} +0 -0
- /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C0JXQb_q.js} +0 -0
package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-card.cjs","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.cjs","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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"}
|
package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts
CHANGED
|
@@ -5,6 +5,13 @@ import { RepositorySelection } from "#/api/open-hands.types";
|
|
|
5
5
|
interface ConversationCardProps {
|
|
6
6
|
onClick?: () => void;
|
|
7
7
|
onDelete?: () => void;
|
|
8
|
+
onArchive?: () => void;
|
|
9
|
+
/**
|
|
10
|
+
* Restores an archived conversation. The panel passes this instead of
|
|
11
|
+
* `onArchive` for rows that are already archived, so the menu offers exactly
|
|
12
|
+
* one of the two directions.
|
|
13
|
+
*/
|
|
14
|
+
onUnarchive?: () => void;
|
|
8
15
|
onStop?: () => void;
|
|
9
16
|
onChangeTitle?: (title: string) => void;
|
|
10
17
|
showOptions?: boolean;
|
|
@@ -27,10 +34,11 @@ interface ConversationCardProps {
|
|
|
27
34
|
tags?: Record<string, string> | null;
|
|
28
35
|
/** Gates the tag-chip row; wired to the panel's "Tags" metadata toggle. */
|
|
29
36
|
showTags?: boolean;
|
|
37
|
+
isArchived?: boolean;
|
|
30
38
|
isPinned?: boolean;
|
|
31
39
|
onTogglePin?: () => void;
|
|
32
40
|
/** When true and pinned, keep the pin icon visible without hovering. */
|
|
33
41
|
alwaysShowPinIcon?: boolean;
|
|
34
42
|
}
|
|
35
|
-
export declare function ConversationCard({ onClick, onDelete, onStop, onChangeTitle, showOptions, title, selectedRepository, lastUpdatedAt, createdAt, conversationId, executionStatus, sandboxStatus, contextMenuOpen, onContextMenuToggle, isActive, workspaceWorkingDir, showRepositoryMetadata, llmModel, showLlmProfiles, agentKind, acpServer, tags, showTags, isPinned, onTogglePin, alwaysShowPinIcon, }: ConversationCardProps): React.JSX.Element;
|
|
43
|
+
export declare function ConversationCard({ onClick, onDelete, onArchive, onUnarchive, onStop, onChangeTitle, showOptions, title, selectedRepository, lastUpdatedAt, createdAt, conversationId, executionStatus, sandboxStatus, contextMenuOpen, onContextMenuToggle, isActive, workspaceWorkingDir, showRepositoryMetadata, llmModel, showLlmProfiles, agentKind, acpServer, tags, showTags, isArchived, isPinned, onTogglePin, alwaysShowPinIcon, }: ConversationCardProps): React.JSX.Element;
|
|
36
44
|
export {};
|
|
@@ -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":";;;;;;;;;;;;;;;;;AAkDA,SAAgB,EAAiB,EAC/B,YACA,aACA,WACA,kBACA,gBACA,UACA,uBACA,kBACA,cACA,mBACA,oBACA,kBACA,qBAAkB,IAClB,wBACA,cAAW,IACX,wBACA,4BAAyB,IACzB,cAAW,MACX,qBAAkB,IAClB,eAAY,MACZ,eAAY,MACZ,UAAO,MACP,cAAW,IACX,cAAW,IACX,gBACA,uBAAoB,MACI;CACxB,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,wCAAqC,GAAY,GACnD,CAAC,GAAW,KAAgB,EAAM,SAA0B,MAAM,GAClE,EAAE,aAAa,MAAyB,GAAwB,GAEhE,KAAe,MAAqB;EAIxC,AAHI,MAAa,MAAM,MAAa,KAClC,IAAgB,CAAQ,GAE1B,EAAa,MAAM;CACrB,GAEM,KAAgB,MAA+C;EAInE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAW,GACX,IAAsB,EAAK;CAC7B,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAS,GACT,IAAsB,EAAK;CAC7B,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAa,MAAM,GACnB,IAAsB,EAAK;CAC7B,GAEM,IAA0B,OAC9B,MACG;EAMH,IALA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAiC,GAG7B,GACF,IAAI;GACF,IAAM,IAAO,MAAM,GAAoB,aAAa,CAAc;GAClE,IAAI,EAAK,YAAY;IACnB,IAAM,IAAiB,EAAmB,EAAK,UAAU;IACzD,AAAI,KACF,OAAO,KAAK,GAAgB,QAAQ;GAExC;EAEF,QAAQ,CAER;EAGF,IAAsB,EAAK;CAC7B,GAEM,IAA6B,OACjC,MACG;EAOH,AANA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAElB,KACF,MAAM,EAAqB,CAAc,GAE3C,IAAsB,EAAK;CAC7B,GAEM,MAAmB,MAA+C;EAGtE,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAc;CAChB,GAEM,WACJ,kBAAC,UAAD;EACE,MAAK;EACL,eACE,IACI,2BAA2B,MAC3B;EAEN,gBAAc;EACd,cAEM,EADJ,IACM,EAAQ,wCACR,EAAQ,mCAAmC;EAEnD,SAAS;EACT,WAAW,EACT,2EACA,2DACF;YAEA,kBAAC,GAAD;GACE,WAAW,EAAG,eAAe,KAAY,cAAc;GACvD,eAAA;EACD,CAAA;CACK,CAAA,GAGJ,IAAiB,CAAC,EAAE,KAAY,KAAiB,IACjD,IAAkB,KAAkB,CAAC,CAAC,GACtC,IAAwB,KAAqB,KAAY,CAAC,CAAC,GAC3D,KACJ,KACC,MAAoB,MAAc,SAAS,CAAC,CAAC,MAC7C,KAAY,EAA2B,CAAI,EAAE,SAAS;CAEzD,OACE,kBAAC,OAAD;EACE,eAAY;EACZ,0BAAwB,EAAgB,SAAS;EACjD,eAAa,IAAW,SAAS;EACxB;EACT,WAAW,EACT,2FACA,CAAC,KAAmB,iCACnB,KAAY,MAAoB,wBACnC;YATF,CAWE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACS;KACI;KACE;KACI;KACF;IAChB,CAAA,GACA,MAAkB,WAAW,kBAAC,GAAD,CAA2B,CAAA,CACtD;OAEL,kBAAC,OAAD;IACE,WAAW,EACT,gEAKA,IACI,oBACA,KACE,kEACN,KAAmB,iBACrB;cAZF,CAcG,CAAC,MAA0B,KAAa,MACvC,kBAAC,KAAD;KACE,WAAW,EACT,mGACA,KACE,sDACF,KAAmB,WACrB;eAEA,kBAAC,QAAD,EAAA,UAAO,EAAgB,KAAiB,CAAS,EAAQ,CAAA;IACxD,CAAA,GAGJ,IACC,kBAAC,OAAD;KACE,WAAW,EACT,0FACA,IACI,4CACA,EACE,2CACA,+EACA,kGACF,GACJ,KAAmB,yCACrB;eAXF;MAaG,IAAc,GAAgB,IAAI;MAClC,MACA,KAAa,MACd,IACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QACE,WAAW,EACT,CAAC,KACC,qJACJ;kBAEA,kBAAC,GAAD;SACmB;SACjB,qBAAqB,YAA8B,CAAC;SACpD,UAAU,KAAY;SACtB,QAAQ,KAAU;SAClB,QAAQ,KAAiB;SACzB,qBAAqB;SACrB,wBAAwB;SACP;SACD;SACH;QACd,CAAA;OACE,CAAA,GACL,kBAAC,KAAD;QACE,WAAW,EACT,sEACA,qEACA,gDACA,KAAmB,QACrB;kBAEA,kBAAC,QAAD,EAAA,UAAO,EAAgB,KAAiB,CAAS,EAAQ,CAAA;OACxD,CAAA,CACA;WACH;MACH,CAAC,KAAyB,IACzB,kBAAC,GAAD;OACmB;OACjB,qBAAqB,YAA8B,CAAC;OACpD,UAAU,KAAY;OACtB,QAAQ,KAAU;OAClB,QAAQ,KAAiB;OACzB,qBAAqB;OACrB,wBAAwB;OACP;OACD;OACH;MACd,CAAA,IACC;KACD;SACH,IACD;KACF;MAEJ,MACC,kBAAC,GAAD;GACsB;GACL;GACJ;GACM;GACI;GACG;GACxB,eAAe;GACL;GACV,eAAe;GACJ;GACA;GACL;GACI;EACX,CAAA,CAEA;;AAET"}
|
|
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":";;;;;;;;;;;;;;;;;;AAgEA,SAAgB,EAAiB,EAC/B,YACA,aACA,cACA,gBACA,WACA,kBACA,gBACA,UACA,wBACA,kBACA,cACA,mBACA,oBACA,kBACA,qBAAkB,IAClB,wBACA,cAAW,IACX,wBACA,4BAAyB,IACzB,cAAW,MACX,qBAAkB,IAClB,eAAY,MACZ,eAAY,MACZ,UAAO,MACP,cAAW,IACX,gBAAa,IACb,cAAW,IACX,gBACA,uBAAoB,MACI;CACxB,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,wCAAqC,GAAY,GACnD,CAAC,GAAW,KAAgB,EAAM,SAA0B,MAAM,GAClE,EAAE,aAAa,OAAyB,EAAwB,GAEhE,MAAe,MAAqB;EAIxC,AAHI,MAAa,MAAM,MAAa,KAClC,IAAgB,CAAQ,GAE1B,EAAa,MAAM;CACrB,GAEM,KAAgB,MAA+C;EAInE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAW,GACX,IAAsB,EAAK;CAC7B,GAEM,KAAiB,MAA+C;EAIpE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAY,GACZ,IAAsB,EAAK;CAC7B,GAEM,KAAmB,MAA+C;EAItE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAc,GACd,IAAsB,EAAK;CAC7B,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAS,GACT,IAAsB,EAAK;CAC7B,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAa,MAAM,GACnB,IAAsB,EAAK;CAC7B,GAEM,IAA0B,OAC9B,MACG;EAMH,IALA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAiC,GAG7B,GACF,IAAI;GACF,IAAM,IAAO,MAAM,GAAoB,aAAa,CAAc;GAClE,IAAI,EAAK,YAAY;IACnB,IAAM,IAAiB,GAAmB,EAAK,UAAU;IACzD,AAAI,KACF,OAAO,KAAK,GAAgB,QAAQ;GAExC;EAEF,QAAQ,CAER;EAGF,IAAsB,EAAK;CAC7B,GAEM,IAA6B,OACjC,MACG;EAOH,AANA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAElB,KACF,MAAM,GAAqB,CAAc,GAE3C,IAAsB,EAAK;CAC7B,GAEM,MAAmB,MAA+C;EAGtE,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,IAAc;CAChB,GAEM,WACJ,kBAAC,UAAD;EACE,MAAK;EACL,eACE,IACI,2BAA2B,MAC3B;EAEN,gBAAc;EACd,cAEM,EADJ,IACM,EAAQ,wCACR,EAAQ,mCAAmC;EAEnD,SAAS;EACT,WAAW,EACT,2EACA,2DACF;YAEA,kBAAC,IAAD;GACE,WAAW,EAAG,eAAe,KAAY,cAAc;GACvD,eAAA;EACD,CAAA;CACK,CAAA,GAGJ,IAAiB,CAAC,EACtB,KACA,KACA,KACA,KACA,IAEI,IAAkB,KAAkB,CAAC,CAAC,GACtC,IAAwB,KAAqB,KAAY,CAAC,CAAC,GAC3D,KACJ,KACA,KACC,MAAoB,MAAc,SAAS,CAAC,CAAC,MAC7C,KAAY,GAA2B,CAAI,EAAE,SAAS;CAEzD,OACE,kBAAC,OAAD;EACE,eAAY;EACZ,0BAAwB,EAAgB,SAAS;EACjD,eAAa,IAAW,SAAS;EACxB;EACT,WAAW,EACT,2FACA,CAAC,KAAmB,iCACnB,KAAY,MAAoB,wBACnC;YATF,CAWE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,IAAD;KACS;KACI;KACE;KACI;KACF;IAChB,CAAA,GACA,MAAkB,WAAW,kBAAC,GAAD,CAA2B,CAAA,CACtD;OAEL,kBAAC,OAAD;IACE,WAAW,EACT,gEAOA,IACI,oBACA,KAAmB,GAA4B,CAAe,CACpE;cAZF,CAcG,CAAC,MAA0B,KAAa,MACvC,kBAAC,KAAD;KACE,WAAW,EACT,mGACA,KAAmB,GAA0B,CAAe,CAC9D;eAEA,kBAAC,QAAD,EAAA,UAAO,EAAgB,KAAiB,CAAS,EAAQ,CAAA;IACxD,CAAA,GAGJ,IACC,kBAAC,OAAD;KACE,WAAW,EACT,0FACA,IACI,4CACA,EAA2B,CAAe,CAChD;eANF;MAQG,IAAc,GAAgB,IAAI;MAClC,MACA,KAAa,MACd,IACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAW,EAA2B,CAAe;kBACxD,kBAAC,GAAD;SACmB;SACjB,qBAAqB,YAA8B,CAAC;SACpD,UAAU,KAAY;SACtB,WAAW,KAAa;SACxB,aAAa,KAAe;SAC5B,QAAQ,KAAU;SAClB,QAAQ,KAAiB;SACzB,qBAAqB;SACrB,wBAAwB;SACP;SACD;SACH;QACd,CAAA;OACE,CAAA,GACL,kBAAC,KAAD;QACE,WAAW,EACT,iEACA,qEACA,EAAoC,CAAe,CACrD;kBAEA,kBAAC,QAAD,EAAA,UAAO,EAAgB,KAAiB,CAAS,EAAQ,CAAA;OACxD,CAAA,CACA;WACH;MACH,CAAC,KAAyB,IACzB,kBAAC,GAAD;OACmB;OACjB,qBAAqB,YAA8B,CAAC;OACpD,UAAU,KAAY;OACtB,WAAW,KAAa;OACxB,aAAa,KAAe;OAC5B,QAAQ,KAAU;OAClB,QAAQ,KAAiB;OACzB,qBAAqB;OACrB,wBAAwB;OACP;OACD;OACH;MACd,CAAA,IACC;KACD;SACH,IACD;KACF;MAEJ,MACC,kBAAC,IAAD;GACsB;GACL;GACJ;GACM;GACI;GACG;GACxB,eAAe;GACL;GACV,eAAe;GACJ;GACA;GACL;GACI;GACE;EACb,CAAA,CAEA;;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("./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
|
}
|