@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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { isCondensationEvent as e } from "../types/agent-server/type-guards.js";
|
|
2
|
+
import { useEventStore as t } from "../stores/use-event-store.js";
|
|
3
|
+
import n from "../stores/metrics-store.js";
|
|
4
|
+
import { useEffect as r, useRef as i } from "react";
|
|
5
|
+
//#region src/hooks/use-await-context-compaction.ts
|
|
6
|
+
var a = 2500, o = 9e4;
|
|
7
|
+
function s(e, t, n) {
|
|
8
|
+
return {
|
|
9
|
+
beforeToken: e,
|
|
10
|
+
afterToken: t,
|
|
11
|
+
savedToken: Math.max(0, e - t),
|
|
12
|
+
outcome: n
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function c({ beforeToken: c, baselineEventIds: l, onComplete: u, timeoutMs: d = o }) {
|
|
16
|
+
let f = i(u);
|
|
17
|
+
f.current = u, r(() => {
|
|
18
|
+
if (c === null) return;
|
|
19
|
+
let r = !1, i = !1, o, u = l ? new Set(l) : new Set(t.getState().eventIds), p = () => n.getState().usage?.per_turn_token ?? c, m = (e, t) => {
|
|
20
|
+
r || (r = !0, f.current(s(c, e, t)));
|
|
21
|
+
}, h = () => {
|
|
22
|
+
let e = p();
|
|
23
|
+
return i && e < c ? (m(e, "compacted"), !0) : !1;
|
|
24
|
+
}, g = () => {
|
|
25
|
+
clearTimeout(o), o = setTimeout(() => {
|
|
26
|
+
m(p(), "no_change");
|
|
27
|
+
}, a);
|
|
28
|
+
}, _ = () => {
|
|
29
|
+
for (let n of t.getState().events) {
|
|
30
|
+
let t = "id" in n ? n.id : void 0;
|
|
31
|
+
if (t !== void 0) {
|
|
32
|
+
if (u.has(t)) continue;
|
|
33
|
+
u.add(t);
|
|
34
|
+
}
|
|
35
|
+
if (e(n)) {
|
|
36
|
+
i = !0, h() || g();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
_();
|
|
42
|
+
let v = t.subscribe(() => {
|
|
43
|
+
r || _();
|
|
44
|
+
}), y = n.subscribe(() => {
|
|
45
|
+
r || h() && clearTimeout(o);
|
|
46
|
+
}), b = setTimeout(() => {
|
|
47
|
+
m(p(), i ? "no_change" : "timeout");
|
|
48
|
+
}, d);
|
|
49
|
+
return () => {
|
|
50
|
+
r = !0, v(), y(), clearTimeout(o), clearTimeout(b);
|
|
51
|
+
};
|
|
52
|
+
}, [
|
|
53
|
+
c,
|
|
54
|
+
l,
|
|
55
|
+
d
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { c as useAwaitContextCompaction };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=use-await-context-compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-await-context-compaction.js","names":[],"sources":["../../src/hooks/use-await-context-compaction.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { isCondensationEvent } from \"#/types/agent-server/type-guards\";\n\n/** How long to wait after a Condensation event for a lower per_turn_token. */\nconst METRICS_SETTLE_MS = 2_500;\n/** Give up waiting for condensation / metrics and surface whatever we have. */\nconst DEFAULT_TIMEOUT_MS = 90_000;\n\nexport type ContextCompactionOutcome = \"compacted\" | \"no_change\" | \"timeout\";\n\nexport interface ContextCompactionResult {\n beforeToken: number;\n afterToken: number;\n savedToken: number;\n /**\n * \"compacted\" — a Condensation event landed and per_turn_token dropped.\n * \"no_change\" — a Condensation event landed but no token drop was measured.\n * \"timeout\" — no Condensation event arrived in time; compaction did not\n * happen (or was never processed), so this is a failure, not a no-op.\n */\n outcome: ContextCompactionOutcome;\n}\n\nexport function buildContextCompactionResult(\n beforeToken: number,\n afterToken: number,\n outcome: ContextCompactionOutcome,\n): ContextCompactionResult {\n return {\n beforeToken,\n afterToken,\n savedToken: Math.max(0, beforeToken - afterToken),\n outcome,\n };\n}\n\ninterface UseAwaitContextCompactionOptions {\n /**\n * Snapshot of `per_turn_token` taken when compaction was requested.\n * Pass `null` when not awaiting a result.\n */\n beforeToken: number | null;\n /**\n * Event ids that predate the compaction *request*. The condense POST can\n * return only after the server already emitted its Condensation event, so\n * snapshotting \"known\" ids when this effect starts would miss fast\n * condensations; the baseline must be captured before the request fires.\n * When omitted, falls back to the ids present when the effect starts.\n */\n baselineEventIds?: Set<string | number> | null;\n onComplete: (result: ContextCompactionResult) => void;\n timeoutMs?: number;\n}\n\n/**\n * Waits for a post-request Condensation event (and ideally a lower\n * `per_turn_token` in the live metrics store), then reports how many tokens\n * were freed. The HTTP `/condense` ack only means work *started*.\n */\nexport function useAwaitContextCompaction({\n beforeToken,\n baselineEventIds,\n onComplete,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n}: UseAwaitContextCompactionOptions) {\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n\n useEffect(() => {\n if (beforeToken === null) {\n return undefined;\n }\n\n let completed = false;\n let sawCondensation = false;\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const knownEventIds = baselineEventIds\n ? new Set(baselineEventIds)\n : new Set(useEventStore.getState().eventIds);\n\n const readAfterToken = () =>\n useMetricsStore.getState().usage?.per_turn_token ?? beforeToken;\n\n const finish = (afterToken: number, outcome: ContextCompactionOutcome) => {\n if (completed) {\n return;\n }\n completed = true;\n onCompleteRef.current(\n buildContextCompactionResult(beforeToken, afterToken, outcome),\n );\n };\n\n const finishFromMetricsIfReady = () => {\n const afterToken = readAfterToken();\n if (sawCondensation && afterToken < beforeToken) {\n finish(afterToken, \"compacted\");\n return true;\n }\n return false;\n };\n\n const scheduleSettleFinish = () => {\n clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n finish(readAfterToken(), \"no_change\");\n }, METRICS_SETTLE_MS);\n };\n\n const scanForNewCondensation = () => {\n for (const event of useEventStore.getState().events) {\n const eventId = \"id\" in event ? event.id : undefined;\n if (eventId !== undefined) {\n if (knownEventIds.has(eventId)) {\n continue;\n }\n knownEventIds.add(eventId);\n }\n if (!isCondensationEvent(event)) {\n continue;\n }\n sawCondensation = true;\n if (!finishFromMetricsIfReady()) {\n scheduleSettleFinish();\n }\n return;\n }\n };\n\n scanForNewCondensation();\n\n const unsubscribeEvents = useEventStore.subscribe(() => {\n if (completed) {\n return;\n }\n scanForNewCondensation();\n });\n\n const unsubscribeMetrics = useMetricsStore.subscribe(() => {\n if (completed) {\n return;\n }\n if (finishFromMetricsIfReady()) {\n clearTimeout(settleTimer);\n }\n });\n\n const timeoutTimer = setTimeout(() => {\n // No Condensation event in time means the compaction never landed —\n // a failure, not a \"nothing to compact\" no-op.\n finish(readAfterToken(), sawCondensation ? \"no_change\" : \"timeout\");\n }, timeoutMs);\n\n return () => {\n completed = true;\n unsubscribeEvents();\n unsubscribeMetrics();\n clearTimeout(settleTimer);\n clearTimeout(timeoutTimer);\n };\n }, [beforeToken, baselineEventIds, timeoutMs]);\n}\n"],"mappings":";;;;;AAMA,IAAM,IAAoB,MAEpB,IAAqB;AAiB3B,SAAgB,EACd,GACA,GACA,GACyB;CACzB,OAAO;EACL;EACA;EACA,YAAY,KAAK,IAAI,GAAG,IAAc,CAAU;EAChD;CACF;AACF;AAyBA,SAAgB,EAA0B,EACxC,gBACA,qBACA,eACA,eAAY,KACuB;CACnC,IAAM,IAAgB,EAAO,CAAU;CAGvC,AAFA,EAAc,UAAU,GAExB,QAAgB;EACd,IAAI,MAAgB,MAClB;EAGF,IAAI,IAAY,IACZ,IAAkB,IAClB,GACE,IAAgB,IAClB,IAAI,IAAI,CAAgB,IACxB,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvC,UACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB,GAEhD,KAAU,GAAoB,MAAsC;GACpE,MAGJ,IAAY,IACZ,EAAc,QACZ,EAA6B,GAAa,GAAY,CAAO,CAC/D;EACF,GAEM,UAAiC;GACrC,IAAM,IAAa,EAAe;GAKlC,OAJI,KAAmB,IAAa,KAClC,EAAO,GAAY,WAAW,GACvB,MAEF;EACT,GAEM,UAA6B;GAEjC,AADA,aAAa,CAAW,GACxB,IAAc,iBAAiB;IAC7B,EAAO,EAAe,GAAG,WAAW;GACtC,GAAG,CAAiB;EACtB,GAEM,UAA+B;GACnC,KAAK,IAAM,KAAS,EAAc,SAAS,EAAE,QAAQ;IACnD,IAAM,IAAU,QAAQ,IAAQ,EAAM,KAAK,KAAA;IAC3C,IAAI,MAAY,KAAA,GAAW;KACzB,IAAI,EAAc,IAAI,CAAO,GAC3B;KAEF,EAAc,IAAI,CAAO;IAC3B;IACK,MAAoB,CAAK,GAI9B;KADA,IAAkB,IACb,EAAyB,KAC5B,EAAqB;KAEvB;IAFuB;GAGzB;EACF;EAEA,EAAuB;EAEvB,IAAM,IAAoB,EAAc,gBAAgB;GAClD,KAGJ,EAAuB;EACzB,CAAC,GAEK,IAAqB,EAAgB,gBAAgB;GACrD,KAGA,EAAyB,KAC3B,aAAa,CAAW;EAE5B,CAAC,GAEK,IAAe,iBAAiB;GAGpC,EAAO,EAAe,GAAG,IAAkB,cAAc,SAAS;EACpE,GAAG,CAAS;EAEZ,aAAa;GAKX,AAJA,IAAY,IACZ,EAAkB,GAClB,EAAmB,GACnB,aAAa,CAAW,GACxB,aAAa,CAAY;EAC3B;CACF,GAAG;EAAC;EAAa;EAAkB;CAAS,CAAC;AAC/C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../i18n/declaration.cjs"),r=require("../types/agent-state.cjs"),i=require("../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),a=require("../utils/retrieve-axios-error-message.cjs"),o=require("../utils/custom-toast-handlers.cjs"),s=require("../stores/use-event-store.cjs"),c=require("../stores/metrics-store.cjs"),l=require("./query/use-active-conversation.cjs"),u=require("./use-agent-state.cjs"),d=require("./mutation/use-condense-conversation.cjs"),f=require("./use-await-context-compaction.cjs"),p=require("../utils/format-token-count.cjs");let m=require("react");m=e.__toESM(m,1);function h(e=0){let{t:h}=t.useTranslation(`openhands`),g=i.useQueryClient(),{data:_}=l.useActiveConversation(),{curAgentState:v}=u.useAgentState(),{mutate:y,isPending:b}=d.useCondenseConversation(),[x,S]=m.default.useState(null),C=m.default.useRef(null),w=v===r.AgentState.RUNNING||v===r.AgentState.LOADING,T=b||x!==null,E=!_?.id||w||T,D=h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION),O=m.default.useEffectEvent(e=>{if(S(null),C.current=null,_?.id&&g.invalidateQueries({queryKey:[`conversation-metrics`,_.id]}),e.outcome===`timeout`){o.displayErrorToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));return}if(e.savedToken>0){o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE,{saved:p.formatCompactTokenCount(e.savedToken),before:p.formatCompactTokenCount(e.beforeToken),after:p.formatCompactTokenCount(e.afterToken)}));return}o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE))});return f.useAwaitContextCompaction({beforeToken:x,baselineEventIds:x===null?null:C.current,onComplete:O}),{handleCompact:()=>{if(!_?.id||T)return;let t=c.default.getState().usage?.per_turn_token??e;C.current=new Set(s.useEventStore.getState().eventIds),y({conversationId:_.id,conversationUrl:_.conversation_url,sessionApiKey:_.session_api_key},{onSuccess:()=>{S(t),o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED))},onError:e=>{S(null),C.current=null,o.displayErrorToast(a.retrieveAxiosErrorMessage(e)||h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED))}})},isCompacting:T,isDisabled:E,description:D}}exports.useCompactContextAction=h;
|
|
2
|
+
//# sourceMappingURL=use-compact-context-action.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-compact-context-action.cjs","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":"wuBAyBA,SAAgB,EAAwB,EAAuB,EAAG,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAc,EAAA,eAAe,EAC7B,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,CAAE,iBAAkB,EAAA,cAAc,EAClC,CAAE,OAAQ,EAAU,aAAc,EAAA,wBAAwB,EAC1D,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAwB,IAAI,EAClE,EAAsB,EAAA,QAAM,OAAoC,IAAI,EAEpE,EACJ,IAAkB,EAAA,WAAW,SAC7B,IAAkB,EAAA,WAAW,QACzB,EAAe,GAAa,IAAgB,KAC5C,EAAa,CAAC,GAAc,IAAM,GAAe,EACjD,EAAc,EAAE,EAAA,QAAQ,wCAAwC,EAEhE,EAA2B,EAAA,QAAM,eACpC,GAAoC,CASnC,GARA,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC1B,GAAc,IAChB,EAAY,kBAAkB,CAC5B,SAAU,CAAC,uBAAwB,EAAa,EAAE,CACpD,CAAC,EAGC,EAAO,UAAY,UAAW,CAChC,EAAA,kBAAkB,EAAE,EAAA,QAAQ,mCAAmC,CAAC,EAChE,MACF,CAEA,GAAI,EAAO,WAAa,EAAG,CACzB,EAAA,oBACE,EAAE,EAAA,QAAQ,sCAAuC,CAC/C,MAAO,EAAA,wBAAwB,EAAO,UAAU,EAChD,OAAQ,EAAA,wBAAwB,EAAO,WAAW,EAClD,MAAO,EAAA,wBAAwB,EAAO,UAAU,CAClD,CAAC,CACH,EACA,MACF,CAEA,EAAA,oBACE,EAAE,EAAA,QAAQ,+CAA+C,CAC3D,CACF,CACF,EAyCA,OAvCA,EAAA,0BAA0B,CACxB,cACA,iBAAkB,IAAgB,KAAqC,KAA9B,EAAoB,QAC7D,WAAY,CACd,CAAC,EAmCM,CACL,kBAlC0B,CAC1B,GAAI,CAAC,GAAc,IAAM,EAAc,OAEvC,IAAM,EACJ,EAAA,QAAgB,SAAS,EAAE,OAAO,gBAAkB,EAItD,EAAoB,QAAU,IAAI,IAAI,EAAA,cAAc,SAAS,EAAE,QAAQ,EAEvE,EACE,CACE,eAAgB,EAAa,GAC7B,gBAAiB,EAAa,iBAC9B,cAAe,EAAa,eAC9B,EACA,CACE,cAAiB,CACf,EAAe,CAAQ,EACvB,EAAA,oBAAoB,EAAE,EAAA,QAAQ,oCAAoC,CAAC,CACrE,EACA,QAAU,GAAU,CAClB,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC9B,EAAA,kBACE,EAAA,0BAA0B,CAAK,GAC7B,EAAE,EAAA,QAAQ,mCAAmC,CACjD,CACF,CACF,CACF,CACF,EAIE,eACA,aACA,aACF,CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared compact/condense action used by the Usage panel CTA and the
|
|
3
|
+
* composer context-window popover.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useCompactContextAction(perTurnToken?: number): {
|
|
6
|
+
handleCompact: () => void;
|
|
7
|
+
isCompacting: boolean;
|
|
8
|
+
isDisabled: boolean;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
|
+
import { I18nKey as t } from "../i18n/declaration.js";
|
|
3
|
+
import { AgentState as n } from "../types/agent-state.js";
|
|
4
|
+
import { useQueryClient as r } from "../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
|
|
5
|
+
import { retrieveAxiosErrorMessage as i } from "../utils/retrieve-axios-error-message.js";
|
|
6
|
+
import { displayErrorToast as a, displaySuccessToast as o } from "../utils/custom-toast-handlers.js";
|
|
7
|
+
import { useEventStore as s } from "../stores/use-event-store.js";
|
|
8
|
+
import c from "../stores/metrics-store.js";
|
|
9
|
+
import { useActiveConversation as l } from "./query/use-active-conversation.js";
|
|
10
|
+
import { useAgentState as u } from "./use-agent-state.js";
|
|
11
|
+
import { useCondenseConversation as d } from "./mutation/use-condense-conversation.js";
|
|
12
|
+
import { useAwaitContextCompaction as f } from "./use-await-context-compaction.js";
|
|
13
|
+
import { formatCompactTokenCount as p } from "../utils/format-token-count.js";
|
|
14
|
+
import m from "react";
|
|
15
|
+
//#region src/hooks/use-compact-context-action.ts
|
|
16
|
+
function h(h = 0) {
|
|
17
|
+
let { t: g } = e("openhands"), _ = r(), { data: v } = l(), { curAgentState: y } = u(), { mutate: b, isPending: x } = d(), [S, C] = m.useState(null), w = m.useRef(null), T = y === n.RUNNING || y === n.LOADING, E = x || S !== null, D = !v?.id || T || E, O = g(t.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION), k = m.useEffectEvent((e) => {
|
|
18
|
+
if (C(null), w.current = null, v?.id && _.invalidateQueries({ queryKey: ["conversation-metrics", v.id] }), e.outcome === "timeout") {
|
|
19
|
+
a(g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (e.savedToken > 0) {
|
|
23
|
+
o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {
|
|
24
|
+
saved: p(e.savedToken),
|
|
25
|
+
before: p(e.beforeToken),
|
|
26
|
+
after: p(e.afterToken)
|
|
27
|
+
}));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE));
|
|
31
|
+
});
|
|
32
|
+
return f({
|
|
33
|
+
beforeToken: S,
|
|
34
|
+
baselineEventIds: S === null ? null : w.current,
|
|
35
|
+
onComplete: k
|
|
36
|
+
}), {
|
|
37
|
+
handleCompact: () => {
|
|
38
|
+
if (!v?.id || E) return;
|
|
39
|
+
let e = c.getState().usage?.per_turn_token ?? h;
|
|
40
|
+
w.current = new Set(s.getState().eventIds), b({
|
|
41
|
+
conversationId: v.id,
|
|
42
|
+
conversationUrl: v.conversation_url,
|
|
43
|
+
sessionApiKey: v.session_api_key
|
|
44
|
+
}, {
|
|
45
|
+
onSuccess: () => {
|
|
46
|
+
C(e), o(g(t.CONVERSATION$COMPACT_CONTEXT_STARTED));
|
|
47
|
+
},
|
|
48
|
+
onError: (e) => {
|
|
49
|
+
C(null), w.current = null, a(i(e) || g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
isCompacting: E,
|
|
54
|
+
isDisabled: D,
|
|
55
|
+
description: O
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { h as useCompactContextAction };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=use-compact-context-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-compact-context-action.js","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,SAAgB,EAAwB,IAAuB,GAAG;CAChE,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAe,GAC7B,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,qBAAkB,EAAc,GAClC,EAAE,QAAQ,GAAU,iBAAc,EAAwB,GAC1D,CAAC,GAAa,KAAkB,EAAM,SAAwB,IAAI,GAClE,IAAsB,EAAM,OAAoC,IAAI,GAEpE,IACJ,MAAkB,EAAW,WAC7B,MAAkB,EAAW,SACzB,IAAe,KAAa,MAAgB,MAC5C,IAAa,CAAC,GAAc,MAAM,KAAe,GACjD,IAAc,EAAE,EAAQ,wCAAwC,GAEhE,IAA2B,EAAM,gBACpC,MAAoC;EASnC,IARA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC1B,GAAc,MAChB,EAAY,kBAAkB,EAC5B,UAAU,CAAC,wBAAwB,EAAa,EAAE,EACpD,CAAC,GAGC,EAAO,YAAY,WAAW;GAChC,EAAkB,EAAE,EAAQ,mCAAmC,CAAC;GAChE;EACF;EAEA,IAAI,EAAO,aAAa,GAAG;GACzB,EACE,EAAE,EAAQ,uCAAuC;IAC/C,OAAO,EAAwB,EAAO,UAAU;IAChD,QAAQ,EAAwB,EAAO,WAAW;IAClD,OAAO,EAAwB,EAAO,UAAU;GAClD,CAAC,CACH;GACA;EACF;EAEA,EACE,EAAE,EAAQ,+CAA+C,CAC3D;CACF,CACF;CAyCA,OAvCA,EAA0B;EACxB;EACA,kBAAkB,MAAgB,OAAqC,OAA9B,EAAoB;EAC7D,YAAY;CACd,CAAC,GAmCM;EACL,qBAlC0B;GAC1B,IAAI,CAAC,GAAc,MAAM,GAAc;GAEvC,IAAM,IACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB;GAMtD,AAFA,EAAoB,UAAU,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvE,EACE;IACE,gBAAgB,EAAa;IAC7B,iBAAiB,EAAa;IAC9B,eAAe,EAAa;GAC9B,GACA;IACE,iBAAiB;KAEf,AADA,EAAe,CAAQ,GACvB,EAAoB,EAAE,EAAQ,oCAAoC,CAAC;IACrE;IACA,UAAU,MAAU;KAGlB,AAFA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC9B,EACE,EAA0B,CAAK,KAC7B,EAAE,EAAQ,mCAAmC,CACjD;IACF;GACF,CACF;EACF;EAIE;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../stores/metrics-store.cjs"),t=require("./query/use-active-conversation.cjs"),n=require("./query/use-conversation-metrics.cjs");let r=require("react");function i(e){let t=e?.context_window??0;return t<=0?null:{perTurnToken:e?.per_turn_token??0,contextWindow:t}}function a(){let a=e.default(e=>e.usage),{data:o}=t.useActiveConversation(),{data:s}=n.useConversationMetrics(o?.id,o?.conversation_url,o?.session_api_key,!!o?.id);return(0,r.useMemo)(()=>i(a)||i(s?.accumulated_token_usage??null),[a,s])}exports.useContextWindowUsage=a;
|
|
2
|
+
//# sourceMappingURL=use-context-window-usage.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-context-window-usage.cjs","names":[],"sources":["../../src/hooks/use-context-window-usage.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\nexport interface ContextWindowUsage {\n perTurnToken: number;\n contextWindow: number;\n}\n\nfunction toContextWindowUsage(\n usage:\n | {\n per_turn_token?: number | null;\n context_window?: number | null;\n }\n | null\n | undefined,\n): ContextWindowUsage | null {\n const contextWindow = usage?.context_window ?? 0;\n if (contextWindow <= 0) {\n return null;\n }\n\n return {\n perTurnToken: usage?.per_turn_token ?? 0,\n contextWindow,\n };\n}\n\nexport function useContextWindowUsage(): ContextWindowUsage | null {\n const storeUsage = useMetricsStore((state) => state.usage);\n const { data: conversation } = useActiveConversation();\n\n const { data: conversationMetrics } = useConversationMetrics(\n conversation?.id,\n conversation?.conversation_url,\n conversation?.session_api_key,\n Boolean(conversation?.id),\n );\n\n return useMemo(() => {\n const fromStore = toContextWindowUsage(storeUsage);\n if (fromStore) {\n return fromStore;\n }\n\n return toContextWindowUsage(\n conversationMetrics?.accumulated_token_usage ?? null,\n );\n }, [storeUsage, conversationMetrics]);\n}\n"],"mappings":"sNAUA,SAAS,EACP,EAO2B,CAC3B,IAAM,EAAgB,GAAO,gBAAkB,EAK/C,OAJI,GAAiB,EACZ,KAGF,CACL,aAAc,GAAO,gBAAkB,EACvC,eACF,CACF,CAEA,SAAgB,GAAmD,CACjE,IAAM,EAAa,EAAA,QAAiB,GAAU,EAAM,KAAK,EACnD,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAE/C,CAAE,KAAM,GAAwB,EAAA,uBACpC,GAAc,GACd,GAAc,iBACd,GAAc,gBACd,EAAQ,GAAc,EACxB,EAEA,OAAA,EAAA,EAAA,aACoB,EAAqB,CACnC,GAIG,EACL,GAAqB,yBAA2B,IAClD,EACC,CAAC,EAAY,CAAmB,CAAC,CACtC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import e from "../stores/metrics-store.js";
|
|
2
|
+
import { useActiveConversation as t } from "./query/use-active-conversation.js";
|
|
3
|
+
import { useConversationMetrics as n } from "./query/use-conversation-metrics.js";
|
|
4
|
+
import { useMemo as r } from "react";
|
|
5
|
+
//#region src/hooks/use-context-window-usage.ts
|
|
6
|
+
function i(e) {
|
|
7
|
+
let t = e?.context_window ?? 0;
|
|
8
|
+
return t <= 0 ? null : {
|
|
9
|
+
perTurnToken: e?.per_turn_token ?? 0,
|
|
10
|
+
contextWindow: t
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function a() {
|
|
14
|
+
let a = e((e) => e.usage), { data: o } = t(), { data: s } = n(o?.id, o?.conversation_url, o?.session_api_key, !!o?.id);
|
|
15
|
+
return r(() => i(a) || i(s?.accumulated_token_usage ?? null), [a, s]);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { a as useContextWindowUsage };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=use-context-window-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-context-window-usage.js","names":[],"sources":["../../src/hooks/use-context-window-usage.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\nexport interface ContextWindowUsage {\n perTurnToken: number;\n contextWindow: number;\n}\n\nfunction toContextWindowUsage(\n usage:\n | {\n per_turn_token?: number | null;\n context_window?: number | null;\n }\n | null\n | undefined,\n): ContextWindowUsage | null {\n const contextWindow = usage?.context_window ?? 0;\n if (contextWindow <= 0) {\n return null;\n }\n\n return {\n perTurnToken: usage?.per_turn_token ?? 0,\n contextWindow,\n };\n}\n\nexport function useContextWindowUsage(): ContextWindowUsage | null {\n const storeUsage = useMetricsStore((state) => state.usage);\n const { data: conversation } = useActiveConversation();\n\n const { data: conversationMetrics } = useConversationMetrics(\n conversation?.id,\n conversation?.conversation_url,\n conversation?.session_api_key,\n Boolean(conversation?.id),\n );\n\n return useMemo(() => {\n const fromStore = toContextWindowUsage(storeUsage);\n if (fromStore) {\n return fromStore;\n }\n\n return toContextWindowUsage(\n conversationMetrics?.accumulated_token_usage ?? null,\n );\n }, [storeUsage, conversationMetrics]);\n}\n"],"mappings":";;;;;AAUA,SAAS,EACP,GAO2B;CAC3B,IAAM,IAAgB,GAAO,kBAAkB;CAK/C,OAJI,KAAiB,IACZ,OAGF;EACL,cAAc,GAAO,kBAAkB;EACvC;CACF;AACF;AAEA,SAAgB,IAAmD;CACjE,IAAM,IAAa,GAAiB,MAAU,EAAM,KAAK,GACnD,EAAE,MAAM,MAAiB,EAAsB,GAE/C,EAAE,MAAM,MAAwB,EACpC,GAAc,IACd,GAAc,kBACd,GAAc,iBACd,EAAQ,GAAc,EACxB;CAEA,OAAO,QACa,EAAqB,CACnC,KAIG,EACL,GAAqB,2BAA2B,IAClD,GACC,CAAC,GAAY,CAAmB,CAAC;AACtC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),ee=require("../i18n/declaration.cjs"),n=require("../utils/status.cjs"),r=require("../context/navigation-context.cjs"),i=require("../utils/custom-toast-handlers.cjs"),a=require("../contexts/active-backend-context.cjs"),o=require("../stores/use-event-store.cjs"),s=require("../api/conversation-metadata-store.cjs"),c=require("./query/use-active-conversation.cjs"),te=require("./mutation/use-delete-conversation.cjs"),l=require("./mutation/use-unified-stop-conversation.cjs"),u=require("./mutation/use-update-conversation-public-flag.cjs"),d=require("./use-download-conversation.cjs"),f=require("../utils/system-message-adapter.cjs"),p=require("./use-select-conversation-tab.cjs");let m=require("react");m=e.__toESM(m,1);function h({conversationId:e,executionStatus:h,showOptions:g=!1,onContextMenuToggle:_}){let{t:v}=t.useTranslation(),{conversationId:y,navigate:b}=r.useNavigation(),{backend:x}=a.useActiveBackend(),S=o.useEventStore(e=>e.events),{mutate:C}=te.useDeleteConversation(),{mutate:w}=l.useUnifiedPauseConversation(),{mutate:T}=u.useUpdateConversationPublicFlag(),{data:E}=c.useActiveConversation(),[D,O]=m.default.useState(!1),[k,A]=m.default.useState(!1),[j,M]=m.default.useState(!1),[N,P]=m.default.useState(!1),[F,I]=m.default.useState(!1),[L,R]=m.default.useState(!1),{mutateAsync:z}=d.useDownloadConversation(),{navigateToTab:B}=p.useSelectConversationTab(),V=f.adaptSystemMessage(S),H=e=>{e.preventDefault(),e.stopPropagation(),I(!0),_?.(!1)},U=e=>{e.preventDefault(),e.stopPropagation(),R(!0),_?.(!1)},W=()=>{e&&C({conversationId:e},{onSuccess:()=>{e===y&&b(`/conversations`)}}),I(!1)},G=()=>{e&&w({conversationId:e}),R(!1)},K=e=>{e.preventDefault(),e.stopPropagation(),_?.(!1)},q=async t=>{t.preventDefault(),t.stopPropagation(),e&&await z(e),_?.(!1)},J=e=>{e.stopPropagation(),B(`usage`),_?.(!1)},Y=e=>{e.stopPropagation(),O(!0),_?.(!1)},X=e=>{e.stopPropagation(),A(!0),_?.(!1)},Z=e=>{e.stopPropagation(),M(!0),_?.(!1)},Q=e=>{e.stopPropagation(),P(!0),_?.(!1)},ne=t=>{e&&E&&T({conversationId:e,isPublic:t??!E.public})},$=m.default.useMemo(()=>e?`${x.kind===`cloud`?x.host.replace(/\/+$/,``):window.location.origin}/shared/conversations/${e}`:``,[e,x.kind,x.host]);return{handleDelete:H,handleStop:U,handleEdit:K,handleDownloadConversation:q,handleDisplayCost:J,handleShowAgentTools:Y,handleShowSkills:X,handleShowPlugins:Z,handleShowHooks:Q,handleTogglePublic:ne,handleCopyShareLink:e=>{if(e.preventDefault(),e.stopPropagation(),!$){_?.(!1);return}navigator.clipboard.writeText($),i.displaySuccessToast(v(ee.I18nKey.CONVERSATION$LINK_COPIED))},shareUrl:$,handleConfirmDelete:W,handleConfirmStop:G,systemModalVisible:D,setSystemModalVisible:O,skillsModalVisible:k,setSkillsModalVisible:A,pluginsModalVisible:j,setPluginsModalVisible:M,hooksModalVisible:N,setHooksModalVisible:P,confirmDeleteModalVisible:F,setConfirmDeleteModalVisible:I,confirmStopModalVisible:L,setConfirmStopModalVisible:R,systemMessage:V,shouldShowStop:n.isExecutionActive(h),shouldShowDownloadConversation:!!(e&&g),shouldShowDisplayCost:g,shouldShowAgentTools:!!(g&&V),shouldShowSkills:!!(g&&e),shouldShowPlugins:!!(g&&e&&(s.getStoredConversationMetadata(e)?.plugins?.length??0)>0),shouldShowHooks:!!(g&&e&&n.isExecutionActive(h))}}exports.useConversationNameContextMenu=h;
|
|
2
2
|
//# sourceMappingURL=use-conversation-name-context-menu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-name-context-menu.cjs","names":[],"sources":["../../src/hooks/use-conversation-name-context-menu.ts"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useDeleteConversation } from \"./mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"./mutation/use-unified-stop-conversation\";\nimport { useUpdateConversationPublicFlag } from \"./mutation/use-update-conversation-public-flag\";\nimport { useActiveConversation } from \"./query/use-active-conversation\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\n\nimport { useDownloadConversation } from \"./use-download-conversation\";\nimport {\n adaptSystemMessage,\n SystemMessageForModal,\n} from \"#/utils/system-message-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionActive } from \"#/utils/status\";\n\ninterface UseConversationNameContextMenuProps {\n conversationId?: string;\n executionStatus?: ExecutionStatus | null;\n showOptions?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n}\n\nexport function useConversationNameContextMenu({\n conversationId,\n executionStatus,\n showOptions = false,\n onContextMenuToggle,\n}: UseConversationNameContextMenuProps) {\n const { t } = useTranslation();\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend } = useActiveBackend();\n const events = useEventStore((state) => state.events);\n const { mutate: deleteConversation } = useDeleteConversation();\n const { mutate: stopConversation } = useUnifiedPauseConversation();\n const { mutate: updatePublicFlag } = useUpdateConversationPublicFlag();\n const { data: conversation } = useActiveConversation();\n const metrics = useMetricsStore();\n\n const [metricsModalVisible, setMetricsModalVisible] = React.useState(false);\n const [systemModalVisible, setSystemModalVisible] = React.useState(false);\n const [skillsModalVisible, setSkillsModalVisible] = React.useState(false);\n const [pluginsModalVisible, setPluginsModalVisible] = React.useState(false);\n const [hooksModalVisible, setHooksModalVisible] = React.useState(false);\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const systemMessage: SystemMessageForModal | null =\n adaptSystemMessage(events);\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmDeleteModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmStopModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleConfirmDelete = () => {\n if (conversationId) {\n deleteConversation(\n { conversationId },\n {\n onSuccess: () => {\n if (conversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n setConfirmDeleteModalVisible(false);\n };\n\n const handleConfirmStop = () => {\n if (conversationId) {\n stopConversation({ conversationId });\n }\n setConfirmStopModalVisible(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n // This will be handled by the parent component to switch to edit mode\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleDisplayCost = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setMetricsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowAgentTools = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSystemModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowSkills = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSkillsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowPlugins = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setPluginsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowHooks = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setHooksModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePublic = (nextIsPublic?: boolean) => {\n if (conversationId && conversation) {\n updatePublicFlag({\n conversationId,\n isPublic: nextIsPublic ?? !conversation.public,\n });\n }\n // Intentionally don't close the menu — let the user see the toggle flip.\n };\n\n const shareUrl = React.useMemo(() => {\n if (!conversationId) return \"\";\n // On cloud backends, the shareable URL must point at the cloud\n // environment's host (e.g. the cloud app domain) rather than the local\n // dev origin so the link works for anyone the user shares it with.\n const origin =\n backend.kind === \"cloud\"\n ? backend.host.replace(/\\/+$/, \"\")\n : window.location.origin;\n return `${origin}/shared/conversations/${conversationId}`;\n }, [conversationId, backend.kind, backend.host]);\n\n const handleCopyShareLink = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!shareUrl) {\n onContextMenuToggle?.(false);\n return;\n }\n\n navigator.clipboard.writeText(shareUrl);\n displaySuccessToast(t(I18nKey.CONVERSATION$LINK_COPIED));\n };\n\n return {\n // Handlers\n handleDelete,\n handleStop,\n handleEdit,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowPlugins,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n\n // Modal states\n metricsModalVisible,\n setMetricsModalVisible,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n pluginsModalVisible,\n setPluginsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n\n // Data\n metrics,\n systemMessage,\n\n shouldShowStop: isExecutionActive(executionStatus),\n shouldShowDownloadConversation: Boolean(conversationId && showOptions),\n shouldShowDisplayCost: showOptions,\n shouldShowAgentTools: Boolean(showOptions && systemMessage),\n shouldShowSkills: Boolean(showOptions && conversationId),\n shouldShowPlugins: Boolean(\n showOptions &&\n conversationId &&\n (getStoredConversationMetadata(conversationId)?.plugins?.length ?? 0) > 0,\n ),\n shouldShowHooks: Boolean(\n showOptions && conversationId && isExecutionActive(executionStatus),\n ),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-conversation-name-context-menu.cjs","names":[],"sources":["../../src/hooks/use-conversation-name-context-menu.ts"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useDeleteConversation } from \"./mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"./mutation/use-unified-stop-conversation\";\nimport { useUpdateConversationPublicFlag } from \"./mutation/use-update-conversation-public-flag\";\nimport { useActiveConversation } from \"./query/use-active-conversation\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\n\nimport { useDownloadConversation } from \"./use-download-conversation\";\nimport {\n adaptSystemMessage,\n SystemMessageForModal,\n} from \"#/utils/system-message-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionActive } from \"#/utils/status\";\nimport { useSelectConversationTab } from \"./use-select-conversation-tab\";\n\ninterface UseConversationNameContextMenuProps {\n conversationId?: string;\n executionStatus?: ExecutionStatus | null;\n showOptions?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n}\n\nexport function useConversationNameContextMenu({\n conversationId,\n executionStatus,\n showOptions = false,\n onContextMenuToggle,\n}: UseConversationNameContextMenuProps) {\n const { t } = useTranslation();\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend } = useActiveBackend();\n const events = useEventStore((state) => state.events);\n const { mutate: deleteConversation } = useDeleteConversation();\n const { mutate: stopConversation } = useUnifiedPauseConversation();\n const { mutate: updatePublicFlag } = useUpdateConversationPublicFlag();\n const { data: conversation } = useActiveConversation();\n const [systemModalVisible, setSystemModalVisible] = React.useState(false);\n const [skillsModalVisible, setSkillsModalVisible] = React.useState(false);\n const [pluginsModalVisible, setPluginsModalVisible] = React.useState(false);\n const [hooksModalVisible, setHooksModalVisible] = React.useState(false);\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n const { navigateToTab } = useSelectConversationTab();\n\n const systemMessage: SystemMessageForModal | null =\n adaptSystemMessage(events);\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmDeleteModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmStopModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleConfirmDelete = () => {\n if (conversationId) {\n deleteConversation(\n { conversationId },\n {\n onSuccess: () => {\n if (conversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n setConfirmDeleteModalVisible(false);\n };\n\n const handleConfirmStop = () => {\n if (conversationId) {\n stopConversation({ conversationId });\n }\n setConfirmStopModalVisible(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n // This will be handled by the parent component to switch to edit mode\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleDisplayCost = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n navigateToTab(\"usage\");\n onContextMenuToggle?.(false);\n };\n\n const handleShowAgentTools = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSystemModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowSkills = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSkillsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowPlugins = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setPluginsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowHooks = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setHooksModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePublic = (nextIsPublic?: boolean) => {\n if (conversationId && conversation) {\n updatePublicFlag({\n conversationId,\n isPublic: nextIsPublic ?? !conversation.public,\n });\n }\n // Intentionally don't close the menu — let the user see the toggle flip.\n };\n\n const shareUrl = React.useMemo(() => {\n if (!conversationId) return \"\";\n // On cloud backends, the shareable URL must point at the cloud\n // environment's host (e.g. the cloud app domain) rather than the local\n // dev origin so the link works for anyone the user shares it with.\n const origin =\n backend.kind === \"cloud\"\n ? backend.host.replace(/\\/+$/, \"\")\n : window.location.origin;\n return `${origin}/shared/conversations/${conversationId}`;\n }, [conversationId, backend.kind, backend.host]);\n\n const handleCopyShareLink = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!shareUrl) {\n onContextMenuToggle?.(false);\n return;\n }\n\n navigator.clipboard.writeText(shareUrl);\n displaySuccessToast(t(I18nKey.CONVERSATION$LINK_COPIED));\n };\n\n return {\n // Handlers\n handleDelete,\n handleStop,\n handleEdit,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowPlugins,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n\n // Modal states\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n pluginsModalVisible,\n setPluginsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n\n // Data\n systemMessage,\n\n shouldShowStop: isExecutionActive(executionStatus),\n shouldShowDownloadConversation: Boolean(conversationId && showOptions),\n shouldShowDisplayCost: showOptions,\n shouldShowAgentTools: Boolean(showOptions && systemMessage),\n shouldShowSkills: Boolean(showOptions && conversationId),\n shouldShowPlugins: Boolean(\n showOptions &&\n conversationId &&\n (getStoredConversationMetadata(conversationId)?.plugins?.length ?? 0) > 0,\n ),\n shouldShowHooks: Boolean(\n showOptions && conversationId && isExecutionActive(executionStatus),\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -22,8 +22,6 @@ export declare function useConversationNameContextMenu({ conversationId, executi
|
|
|
22
22
|
shareUrl: string;
|
|
23
23
|
handleConfirmDelete: () => void;
|
|
24
24
|
handleConfirmStop: () => void;
|
|
25
|
-
metricsModalVisible: boolean;
|
|
26
|
-
setMetricsModalVisible: React.Dispatch<React.SetStateAction<boolean>>;
|
|
27
25
|
systemModalVisible: boolean;
|
|
28
26
|
setSystemModalVisible: React.Dispatch<React.SetStateAction<boolean>>;
|
|
29
27
|
skillsModalVisible: boolean;
|
|
@@ -36,7 +34,6 @@ export declare function useConversationNameContextMenu({ conversationId, executi
|
|
|
36
34
|
setConfirmDeleteModalVisible: React.Dispatch<React.SetStateAction<boolean>>;
|
|
37
35
|
confirmStopModalVisible: boolean;
|
|
38
36
|
setConfirmStopModalVisible: React.Dispatch<React.SetStateAction<boolean>>;
|
|
39
|
-
metrics: import("#/stores/metrics-store").MetricsStore;
|
|
40
37
|
systemMessage: SystemMessageForModal | null;
|
|
41
38
|
shouldShowStop: boolean;
|
|
42
39
|
shouldShowDownloadConversation: boolean;
|
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
2
|
import { I18nKey as t } from "../i18n/declaration.js";
|
|
3
3
|
import { isExecutionActive as n } from "../utils/status.js";
|
|
4
|
-
import { useNavigation as
|
|
5
|
-
import { displaySuccessToast as
|
|
4
|
+
import { useNavigation as ee } from "../context/navigation-context.js";
|
|
5
|
+
import { displaySuccessToast as r } from "../utils/custom-toast-handlers.js";
|
|
6
6
|
import { useActiveBackend as i } from "../contexts/active-backend-context.js";
|
|
7
7
|
import { useEventStore as a } from "../stores/use-event-store.js";
|
|
8
8
|
import { getStoredConversationMetadata as o } from "../api/conversation-metadata-store.js";
|
|
9
|
-
import s from "
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
9
|
+
import { useActiveConversation as s } from "./query/use-active-conversation.js";
|
|
10
|
+
import { useDeleteConversation as c } from "./mutation/use-delete-conversation.js";
|
|
11
|
+
import { useUnifiedPauseConversation as te } from "./mutation/use-unified-stop-conversation.js";
|
|
12
|
+
import { useUpdateConversationPublicFlag as l } from "./mutation/use-update-conversation-public-flag.js";
|
|
13
|
+
import { useDownloadConversation as u } from "./use-download-conversation.js";
|
|
14
|
+
import { adaptSystemMessage as d } from "../utils/system-message-adapter.js";
|
|
15
|
+
import { useSelectConversationTab as f } from "./use-select-conversation-tab.js";
|
|
16
16
|
import p from "react";
|
|
17
17
|
//#region src/hooks/use-conversation-name-context-menu.ts
|
|
18
18
|
function m({ conversationId: m, executionStatus: h, showOptions: g = !1, onContextMenuToggle: _ }) {
|
|
19
|
-
let { t: v } = e(), { conversationId: y, navigate: b } =
|
|
20
|
-
e.preventDefault(), e.stopPropagation(),
|
|
21
|
-
},
|
|
22
|
-
e.preventDefault(), e.stopPropagation(),
|
|
23
|
-
},
|
|
19
|
+
let { t: v } = e(), { conversationId: y, navigate: b } = ee(), { backend: x } = i(), S = a((e) => e.events), { mutate: C } = c(), { mutate: w } = te(), { mutate: T } = l(), { data: E } = s(), [D, O] = p.useState(!1), [k, A] = p.useState(!1), [j, M] = p.useState(!1), [N, P] = p.useState(!1), [F, I] = p.useState(!1), [L, R] = p.useState(!1), { mutateAsync: z } = u(), { navigateToTab: B } = f(), V = d(S), H = (e) => {
|
|
20
|
+
e.preventDefault(), e.stopPropagation(), I(!0), _?.(!1);
|
|
21
|
+
}, U = (e) => {
|
|
22
|
+
e.preventDefault(), e.stopPropagation(), R(!0), _?.(!1);
|
|
23
|
+
}, W = () => {
|
|
24
24
|
m && C({ conversationId: m }, { onSuccess: () => {
|
|
25
25
|
m === y && b("/conversations");
|
|
26
|
-
} }),
|
|
27
|
-
},
|
|
28
|
-
m && w({ conversationId: m }),
|
|
29
|
-
},
|
|
26
|
+
} }), I(!1);
|
|
27
|
+
}, G = () => {
|
|
28
|
+
m && w({ conversationId: m }), R(!1);
|
|
29
|
+
}, K = (e) => {
|
|
30
30
|
e.preventDefault(), e.stopPropagation(), _?.(!1);
|
|
31
|
-
},
|
|
32
|
-
e.preventDefault(), e.stopPropagation(), m && await
|
|
31
|
+
}, q = async (e) => {
|
|
32
|
+
e.preventDefault(), e.stopPropagation(), m && await z(m), _?.(!1);
|
|
33
|
+
}, J = (e) => {
|
|
34
|
+
e.stopPropagation(), B("usage"), _?.(!1);
|
|
35
|
+
}, Y = (e) => {
|
|
36
|
+
e.stopPropagation(), O(!0), _?.(!1);
|
|
33
37
|
}, X = (e) => {
|
|
34
|
-
e.stopPropagation(),
|
|
38
|
+
e.stopPropagation(), A(!0), _?.(!1);
|
|
35
39
|
}, Z = (e) => {
|
|
36
|
-
e.stopPropagation(),
|
|
40
|
+
e.stopPropagation(), M(!0), _?.(!1);
|
|
37
41
|
}, Q = (e) => {
|
|
38
|
-
e.stopPropagation(),
|
|
42
|
+
e.stopPropagation(), P(!0), _?.(!1);
|
|
39
43
|
}, ne = (e) => {
|
|
40
|
-
e.stopPropagation(), F(!0), _?.(!1);
|
|
41
|
-
}, re = (e) => {
|
|
42
|
-
e.stopPropagation(), L(!0), _?.(!1);
|
|
43
|
-
}, ie = (e) => {
|
|
44
44
|
m && E && T({
|
|
45
45
|
conversationId: m,
|
|
46
46
|
isPublic: e ?? !E.public
|
|
@@ -51,46 +51,43 @@ function m({ conversationId: m, executionStatus: h, showOptions: g = !1, onConte
|
|
|
51
51
|
x.host
|
|
52
52
|
]);
|
|
53
53
|
return {
|
|
54
|
-
handleDelete:
|
|
55
|
-
handleStop:
|
|
56
|
-
handleEdit:
|
|
57
|
-
handleDownloadConversation:
|
|
58
|
-
handleDisplayCost:
|
|
59
|
-
handleShowAgentTools:
|
|
60
|
-
handleShowSkills:
|
|
61
|
-
handleShowPlugins:
|
|
62
|
-
handleShowHooks:
|
|
63
|
-
handleTogglePublic:
|
|
54
|
+
handleDelete: H,
|
|
55
|
+
handleStop: U,
|
|
56
|
+
handleEdit: K,
|
|
57
|
+
handleDownloadConversation: q,
|
|
58
|
+
handleDisplayCost: J,
|
|
59
|
+
handleShowAgentTools: Y,
|
|
60
|
+
handleShowSkills: X,
|
|
61
|
+
handleShowPlugins: Z,
|
|
62
|
+
handleShowHooks: Q,
|
|
63
|
+
handleTogglePublic: ne,
|
|
64
64
|
handleCopyShareLink: (e) => {
|
|
65
65
|
if (e.preventDefault(), e.stopPropagation(), !$) {
|
|
66
66
|
_?.(!1);
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
|
-
navigator.clipboard.writeText($),
|
|
69
|
+
navigator.clipboard.writeText($), r(v(t.CONVERSATION$LINK_COPIED));
|
|
70
70
|
},
|
|
71
71
|
shareUrl: $,
|
|
72
|
-
handleConfirmDelete:
|
|
73
|
-
handleConfirmStop:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
setConfirmStopModalVisible: V,
|
|
88
|
-
metrics: D,
|
|
89
|
-
systemMessage: U,
|
|
72
|
+
handleConfirmDelete: W,
|
|
73
|
+
handleConfirmStop: G,
|
|
74
|
+
systemModalVisible: D,
|
|
75
|
+
setSystemModalVisible: O,
|
|
76
|
+
skillsModalVisible: k,
|
|
77
|
+
setSkillsModalVisible: A,
|
|
78
|
+
pluginsModalVisible: j,
|
|
79
|
+
setPluginsModalVisible: M,
|
|
80
|
+
hooksModalVisible: N,
|
|
81
|
+
setHooksModalVisible: P,
|
|
82
|
+
confirmDeleteModalVisible: F,
|
|
83
|
+
setConfirmDeleteModalVisible: I,
|
|
84
|
+
confirmStopModalVisible: L,
|
|
85
|
+
setConfirmStopModalVisible: R,
|
|
86
|
+
systemMessage: V,
|
|
90
87
|
shouldShowStop: n(h),
|
|
91
88
|
shouldShowDownloadConversation: !!(m && g),
|
|
92
89
|
shouldShowDisplayCost: g,
|
|
93
|
-
shouldShowAgentTools: !!(g &&
|
|
90
|
+
shouldShowAgentTools: !!(g && V),
|
|
94
91
|
shouldShowSkills: !!(g && m),
|
|
95
92
|
shouldShowPlugins: !!(g && m && (o(m)?.plugins?.length ?? 0) > 0),
|
|
96
93
|
shouldShowHooks: !!(g && m && n(h))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-name-context-menu.js","names":[],"sources":["../../src/hooks/use-conversation-name-context-menu.ts"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useDeleteConversation } from \"./mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"./mutation/use-unified-stop-conversation\";\nimport { useUpdateConversationPublicFlag } from \"./mutation/use-update-conversation-public-flag\";\nimport { useActiveConversation } from \"./query/use-active-conversation\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\n\nimport { useDownloadConversation } from \"./use-download-conversation\";\nimport {\n adaptSystemMessage,\n SystemMessageForModal,\n} from \"#/utils/system-message-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionActive } from \"#/utils/status\";\n\ninterface UseConversationNameContextMenuProps {\n conversationId?: string;\n executionStatus?: ExecutionStatus | null;\n showOptions?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n}\n\nexport function useConversationNameContextMenu({\n conversationId,\n executionStatus,\n showOptions = false,\n onContextMenuToggle,\n}: UseConversationNameContextMenuProps) {\n const { t } = useTranslation();\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend } = useActiveBackend();\n const events = useEventStore((state) => state.events);\n const { mutate: deleteConversation } = useDeleteConversation();\n const { mutate: stopConversation } = useUnifiedPauseConversation();\n const { mutate: updatePublicFlag } = useUpdateConversationPublicFlag();\n const { data: conversation } = useActiveConversation();\n const metrics = useMetricsStore();\n\n const [metricsModalVisible, setMetricsModalVisible] = React.useState(false);\n const [systemModalVisible, setSystemModalVisible] = React.useState(false);\n const [skillsModalVisible, setSkillsModalVisible] = React.useState(false);\n const [pluginsModalVisible, setPluginsModalVisible] = React.useState(false);\n const [hooksModalVisible, setHooksModalVisible] = React.useState(false);\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const systemMessage: SystemMessageForModal | null =\n adaptSystemMessage(events);\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmDeleteModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmStopModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleConfirmDelete = () => {\n if (conversationId) {\n deleteConversation(\n { conversationId },\n {\n onSuccess: () => {\n if (conversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n setConfirmDeleteModalVisible(false);\n };\n\n const handleConfirmStop = () => {\n if (conversationId) {\n stopConversation({ conversationId });\n }\n setConfirmStopModalVisible(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n // This will be handled by the parent component to switch to edit mode\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleDisplayCost = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setMetricsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowAgentTools = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSystemModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowSkills = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSkillsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowPlugins = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setPluginsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowHooks = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setHooksModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePublic = (nextIsPublic?: boolean) => {\n if (conversationId && conversation) {\n updatePublicFlag({\n conversationId,\n isPublic: nextIsPublic ?? !conversation.public,\n });\n }\n // Intentionally don't close the menu — let the user see the toggle flip.\n };\n\n const shareUrl = React.useMemo(() => {\n if (!conversationId) return \"\";\n // On cloud backends, the shareable URL must point at the cloud\n // environment's host (e.g. the cloud app domain) rather than the local\n // dev origin so the link works for anyone the user shares it with.\n const origin =\n backend.kind === \"cloud\"\n ? backend.host.replace(/\\/+$/, \"\")\n : window.location.origin;\n return `${origin}/shared/conversations/${conversationId}`;\n }, [conversationId, backend.kind, backend.host]);\n\n const handleCopyShareLink = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!shareUrl) {\n onContextMenuToggle?.(false);\n return;\n }\n\n navigator.clipboard.writeText(shareUrl);\n displaySuccessToast(t(I18nKey.CONVERSATION$LINK_COPIED));\n };\n\n return {\n // Handlers\n handleDelete,\n handleStop,\n handleEdit,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowPlugins,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n\n // Modal states\n metricsModalVisible,\n setMetricsModalVisible,\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n pluginsModalVisible,\n setPluginsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n\n // Data\n metrics,\n systemMessage,\n\n shouldShowStop: isExecutionActive(executionStatus),\n shouldShowDownloadConversation: Boolean(conversationId && showOptions),\n shouldShowDisplayCost: showOptions,\n shouldShowAgentTools: Boolean(showOptions && systemMessage),\n shouldShowSkills: Boolean(showOptions && conversationId),\n shouldShowPlugins: Boolean(\n showOptions &&\n conversationId &&\n (getStoredConversationMetadata(conversationId)?.plugins?.length ?? 0) > 0,\n ),\n shouldShowHooks: Boolean(\n showOptions && conversationId && isExecutionActive(executionStatus),\n ),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA6BA,SAAgB,EAA+B,EAC7C,mBACA,oBACA,iBAAc,IACd,0BACsC;CACtC,IAAM,EAAE,SAAM,EAAe,GACvB,EAAE,gBAAgB,GAAuB,gBAAa,EAAc,GACpE,EAAE,eAAY,EAAiB,GAC/B,IAAS,GAAe,MAAU,EAAM,MAAM,GAC9C,EAAE,QAAQ,MAAuB,GAAsB,GACvD,EAAE,QAAQ,MAAqB,EAA4B,GAC3D,EAAE,QAAQ,MAAqB,EAAgC,GAC/D,EAAE,MAAM,MAAiB,EAAsB,GAC/C,IAAU,EAAgB,GAE1B,CAAC,GAAqB,KAA0B,EAAM,SAAS,EAAK,GACpE,CAAC,GAAoB,KAAyB,EAAM,SAAS,EAAK,GAClE,CAAC,GAAoB,KAAyB,EAAM,SAAS,EAAK,GAClE,CAAC,GAAqB,KAA0B,EAAM,SAAS,EAAK,GACpE,CAAC,GAAmB,KAAwB,EAAM,SAAS,EAAK,GAChE,CAAC,GAA2B,KAChC,EAAM,SAAS,EAAK,GAChB,CAAC,GAAyB,KAC9B,EAAM,SAAS,EAAK,GAChB,EAAE,aAAa,MAAyB,EAAwB,GAEhE,IACJ,EAAmB,CAAM,GAErB,KAAgB,MAA+C;EAInE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAA6B,EAAI,GACjC,IAAsB,EAAK;CAC7B,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAA2B,EAAI,GAC/B,IAAsB,EAAK;CAC7B,GAEM,UAA4B;EAahC,AAZI,KACF,EACE,EAAE,kBAAe,GACjB,EACE,iBAAiB;GACf,AAAI,MAAmB,KACrB,EAAS,gBAAgB;EAE7B,EACF,CACF,GAEF,EAA6B,EAAK;CACpC,GAEM,UAA0B;EAI9B,AAHI,KACF,EAAiB,EAAE,kBAAe,CAAC,GAErC,EAA2B,EAAK;CAClC,GAEM,KAAc,MAA+C;EAIjE,AAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAEtB,IAAsB,EAAK;CAC7B,GAEM,IAA6B,OACjC,MACG;EAMH,AALA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAClB,KACF,MAAM,EAAqB,CAAc,GAE3C,IAAsB,EAAK;CAC7B,GAEM,KAAqB,MAA+C;EAGxE,AAFA,EAAM,gBAAgB,GACtB,EAAuB,EAAI,GAC3B,IAAsB,EAAK;CAC7B,GAEM,KAAwB,MAA+C;EAG3E,AAFA,EAAM,gBAAgB,GACtB,EAAsB,EAAI,GAC1B,IAAsB,EAAK;CAC7B,GAEM,KAAoB,MAA+C;EAGvE,AAFA,EAAM,gBAAgB,GACtB,EAAsB,EAAI,GAC1B,IAAsB,EAAK;CAC7B,GAEM,MAAqB,MAA+C;EAGxE,AAFA,EAAM,gBAAgB,GACtB,EAAuB,EAAI,GAC3B,IAAsB,EAAK;CAC7B,GAEM,MAAmB,MAA+C;EAGtE,AAFA,EAAM,gBAAgB,GACtB,EAAqB,EAAI,GACzB,IAAsB,EAAK;CAC7B,GAEM,MAAsB,MAA2B;EACrD,AAAI,KAAkB,KACpB,EAAiB;GACf;GACA,UAAU,KAAgB,CAAC,EAAa;EAC1C,CAAC;CAGL,GAEM,IAAW,EAAM,cAChB,IAQE,GAHL,EAAQ,SAAS,UACb,EAAQ,KAAK,QAAQ,QAAQ,EAAE,IAC/B,OAAO,SAAS,OACL,wBAAwB,MARb,IAS3B;EAAC;EAAgB,EAAQ;EAAM,EAAQ;CAAI,CAAC;CAe/C,OAAO;EAEL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,sBAzB2B,MAA+C;GAI1E,IAHA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAElB,CAAC,GAAU;IACb,IAAsB,EAAK;IAC3B;GACF;GAGA,AADA,UAAU,UAAU,UAAU,CAAQ,GACtC,GAAoB,EAAE,EAAQ,wBAAwB,CAAC;EACzD;EAeE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAEA,gBAAgB,EAAkB,CAAe;EACjD,gCAAgC,GAAQ,KAAkB;EAC1D,uBAAuB;EACvB,sBAAsB,GAAQ,KAAe;EAC7C,kBAAkB,GAAQ,KAAe;EACzC,mBAAmB,GACjB,KACA,MACC,EAA8B,CAAc,GAAG,SAAS,UAAU,KAAK;EAE1E,iBAAiB,GACf,KAAe,KAAkB,EAAkB,CAAe;CAEtE;AACF"}
|
|
1
|
+
{"version":3,"file":"use-conversation-name-context-menu.js","names":[],"sources":["../../src/hooks/use-conversation-name-context-menu.ts"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useDeleteConversation } from \"./mutation/use-delete-conversation\";\nimport { useUnifiedPauseConversation } from \"./mutation/use-unified-stop-conversation\";\nimport { useUpdateConversationPublicFlag } from \"./mutation/use-update-conversation-public-flag\";\nimport { useActiveConversation } from \"./query/use-active-conversation\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\n\nimport { useDownloadConversation } from \"./use-download-conversation\";\nimport {\n adaptSystemMessage,\n SystemMessageForModal,\n} from \"#/utils/system-message-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionActive } from \"#/utils/status\";\nimport { useSelectConversationTab } from \"./use-select-conversation-tab\";\n\ninterface UseConversationNameContextMenuProps {\n conversationId?: string;\n executionStatus?: ExecutionStatus | null;\n showOptions?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n}\n\nexport function useConversationNameContextMenu({\n conversationId,\n executionStatus,\n showOptions = false,\n onContextMenuToggle,\n}: UseConversationNameContextMenuProps) {\n const { t } = useTranslation();\n const { conversationId: currentConversationId, navigate } = useNavigation();\n const { backend } = useActiveBackend();\n const events = useEventStore((state) => state.events);\n const { mutate: deleteConversation } = useDeleteConversation();\n const { mutate: stopConversation } = useUnifiedPauseConversation();\n const { mutate: updatePublicFlag } = useUpdateConversationPublicFlag();\n const { data: conversation } = useActiveConversation();\n const [systemModalVisible, setSystemModalVisible] = React.useState(false);\n const [skillsModalVisible, setSkillsModalVisible] = React.useState(false);\n const [pluginsModalVisible, setPluginsModalVisible] = React.useState(false);\n const [hooksModalVisible, setHooksModalVisible] = React.useState(false);\n const [confirmDeleteModalVisible, setConfirmDeleteModalVisible] =\n React.useState(false);\n const [confirmStopModalVisible, setConfirmStopModalVisible] =\n React.useState(false);\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n const { navigateToTab } = useSelectConversationTab();\n\n const systemMessage: SystemMessageForModal | null =\n adaptSystemMessage(events);\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmDeleteModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConfirmStopModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleConfirmDelete = () => {\n if (conversationId) {\n deleteConversation(\n { conversationId },\n {\n onSuccess: () => {\n if (conversationId === currentConversationId) {\n navigate(\"/conversations\");\n }\n },\n },\n );\n }\n setConfirmDeleteModalVisible(false);\n };\n\n const handleConfirmStop = () => {\n if (conversationId) {\n stopConversation({ conversationId });\n }\n setConfirmStopModalVisible(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n // This will be handled by the parent component to switch to edit mode\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleDisplayCost = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n navigateToTab(\"usage\");\n onContextMenuToggle?.(false);\n };\n\n const handleShowAgentTools = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSystemModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowSkills = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setSkillsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowPlugins = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setPluginsModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleShowHooks = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setHooksModalVisible(true);\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePublic = (nextIsPublic?: boolean) => {\n if (conversationId && conversation) {\n updatePublicFlag({\n conversationId,\n isPublic: nextIsPublic ?? !conversation.public,\n });\n }\n // Intentionally don't close the menu — let the user see the toggle flip.\n };\n\n const shareUrl = React.useMemo(() => {\n if (!conversationId) return \"\";\n // On cloud backends, the shareable URL must point at the cloud\n // environment's host (e.g. the cloud app domain) rather than the local\n // dev origin so the link works for anyone the user shares it with.\n const origin =\n backend.kind === \"cloud\"\n ? backend.host.replace(/\\/+$/, \"\")\n : window.location.origin;\n return `${origin}/shared/conversations/${conversationId}`;\n }, [conversationId, backend.kind, backend.host]);\n\n const handleCopyShareLink = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!shareUrl) {\n onContextMenuToggle?.(false);\n return;\n }\n\n navigator.clipboard.writeText(shareUrl);\n displaySuccessToast(t(I18nKey.CONVERSATION$LINK_COPIED));\n };\n\n return {\n // Handlers\n handleDelete,\n handleStop,\n handleEdit,\n handleDownloadConversation,\n handleDisplayCost,\n handleShowAgentTools,\n handleShowSkills,\n handleShowPlugins,\n handleShowHooks,\n handleTogglePublic,\n handleCopyShareLink,\n shareUrl,\n handleConfirmDelete,\n handleConfirmStop,\n\n // Modal states\n systemModalVisible,\n setSystemModalVisible,\n skillsModalVisible,\n setSkillsModalVisible,\n pluginsModalVisible,\n setPluginsModalVisible,\n hooksModalVisible,\n setHooksModalVisible,\n confirmDeleteModalVisible,\n setConfirmDeleteModalVisible,\n confirmStopModalVisible,\n setConfirmStopModalVisible,\n\n // Data\n systemMessage,\n\n shouldShowStop: isExecutionActive(executionStatus),\n shouldShowDownloadConversation: Boolean(conversationId && showOptions),\n shouldShowDisplayCost: showOptions,\n shouldShowAgentTools: Boolean(showOptions && systemMessage),\n shouldShowSkills: Boolean(showOptions && conversationId),\n shouldShowPlugins: Boolean(\n showOptions &&\n conversationId &&\n (getStoredConversationMetadata(conversationId)?.plugins?.length ?? 0) > 0,\n ),\n shouldShowHooks: Boolean(\n showOptions && conversationId && isExecutionActive(executionStatus),\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs"),require("../utils/constants.cjs");const e=require("../utils/utils.cjs");var t=2,n=({elementRef:n,minHeight:
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs"),require("../utils/constants.cjs");const e=require("../utils/utils.cjs");var t=2,n=120,r=()=>{let e=document.getElementById(`resize-grip`)?.parentElement??null;return e?e.getBoundingClientRect().bottom>=window.innerHeight-n:!0},i=({elementRef:n,minHeight:i,maxHeight:a,onGripDragStart:o,onGripDragEnd:s,onHeightChange:c,onReachedMinHeight:l})=>{let u=e=>`touches`in e&&e.touches.length>0?e.touches[0].clientY:e.clientY,d=(e,t)=>{let n=document.getElementById(`resize-grip`);n&&(n.addEventListener(`touchmove`,e,{passive:!1,capture:!0}),n.addEventListener(`touchend`,t,{capture:!0}))},f=(e,t)=>{document.addEventListener(`mousemove`,e),document.addEventListener(`mouseup`,t)},p=r=>{let p=e.isMobileDevice(),m=n.current?.offsetHeight||i,h=!1,g=e=>{if(e.preventDefault(),!h){let n=u(e);if(Math.abs(n-r)<t)return;h=!0,o?.()}let s=u(e)-r,d=Math.max(i,Math.min(a,m-s)),f=n.current;if(!f)return;f.style.height=`${d}px`;let p=f.scrollHeight>d||d>=a;f.style.overflowY=p?`auto`:`hidden`,c&&c(d),l&&Math.abs(d-i)<=1.5&&l()},_=()=>{if(h&&s?.(),p){let e=document.getElementById(`resize-grip`);if(!e)return;e.removeEventListener(`mousemove`,g),e.removeEventListener(`mouseup`,_),e.removeEventListener(`touchmove`,g),e.removeEventListener(`touchend`,_)}else document.removeEventListener(`mousemove`,g),document.removeEventListener(`mouseup`,_),document.removeEventListener(`touchmove`,g),document.removeEventListener(`touchend`,_)};p?d(g,_):f(g,_)};return{handleGripMouseDown:e=>{e.preventDefault(),r()&&p(e.clientY)},handleGripTouchStart:e=>{e.preventDefault(),r()&&p(e.touches[0].clientY)}}};exports.isBottomAnchored=r,exports.useDragResize=i;
|
|
2
2
|
//# sourceMappingURL=use-drag-resize.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-drag-resize.cjs","names":[],"sources":["../../src/hooks/use-drag-resize.ts"],"sourcesContent":["import type {\n RefObject,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { EPS } from \"#/utils/constants\";\nimport { isMobileDevice } from \"#/utils/utils\";\n\n/** Movement required before a pointer gesture is treated as a resize drag. */\nconst DRAG_COMMIT_PX = 2;\n\n// Drag handling hook\ninterface UseDragResizeOptions {\n elementRef: RefObject<HTMLElement | null>;\n minHeight: number;\n maxHeight: number;\n onGripDragStart?: () => void;\n onGripDragEnd?: () => void;\n onHeightChange?: (height: number) => void;\n onReachedMinHeight?: () => void; // Notify when user drags to minimum height\n}\n\nexport const useDragResize = ({\n elementRef,\n minHeight,\n maxHeight,\n onGripDragStart,\n onGripDragEnd,\n onHeightChange,\n onReachedMinHeight,\n}: UseDragResizeOptions) => {\n const getClientY = (event: MouseEvent | TouchEvent): number => {\n if (\"touches\" in event && event.touches.length > 0) {\n return event.touches[0].clientY;\n }\n return (event as MouseEvent).clientY;\n };\n\n // Setup event listeners for mobile devices\n const setupMobileEventListeners = (\n handleDragMove: (event: MouseEvent | TouchEvent) => void,\n handleDragEnd: () => void,\n ) => {\n const resizeGrip = document.getElementById(\"resize-grip\");\n\n if (!resizeGrip) {\n return;\n }\n\n resizeGrip.addEventListener(\"touchmove\", handleDragMove, {\n passive: false,\n capture: true,\n });\n resizeGrip.addEventListener(\"touchend\", handleDragEnd, {\n capture: true,\n });\n };\n\n // Setup event listeners for desktop devices\n const setupDesktopEventListeners = (\n handleDragMove: (event: MouseEvent | TouchEvent) => void,\n handleDragEnd: () => void,\n ) => {\n document.addEventListener(\"mousemove\", handleDragMove);\n document.addEventListener(\"mouseup\", handleDragEnd);\n };\n\n // Start drag operation\n const startDrag = (startY: number) => {\n const isMobile = isMobileDevice();\n const startHeight = elementRef.current?.offsetHeight || minHeight;\n let dragCommitted = false;\n\n const handleDragMove = (moveEvent: MouseEvent | TouchEvent) => {\n moveEvent.preventDefault();\n\n if (!dragCommitted) {\n const y = getClientY(moveEvent);\n if (Math.abs(y - startY) < DRAG_COMMIT_PX) {\n return;\n }\n dragCommitted = true;\n onGripDragStart?.();\n }\n\n const deltaY = getClientY(moveEvent) - startY;\n // Invert deltaY so moving up increases height and moving down decreases height\n const newHeight = Math.max(\n minHeight,\n Math.min(maxHeight, startHeight - deltaY),\n );\n\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n element.style.height = `${newHeight}px`;\n\n // Check if content exceeds the new height to determine scrollbar visibility\n const contentHeight = element.scrollHeight;\n const shouldShowScrollbar =\n contentHeight > newHeight || newHeight >= maxHeight;\n element.style.overflowY = shouldShowScrollbar ? \"auto\" : \"hidden\";\n\n // Call the height change callback if provided\n if (onHeightChange) {\n onHeightChange(newHeight);\n }\n\n // Notify when dragged to minimum height to clear manual mode\n if (onReachedMinHeight && Math.abs(newHeight - minHeight) <= EPS) {\n onReachedMinHeight();\n }\n };\n\n const handleDragEnd = () => {\n if (dragCommitted) {\n onGripDragEnd?.();\n }\n\n if (isMobile) {\n const resizeGrip = document.getElementById(\"resize-grip\");\n if (!resizeGrip) {\n return;\n }\n\n // Remove both mouse and touch event listeners\n resizeGrip.removeEventListener(\"mousemove\", handleDragMove);\n resizeGrip.removeEventListener(\"mouseup\", handleDragEnd);\n resizeGrip.removeEventListener(\"touchmove\", handleDragMove);\n resizeGrip.removeEventListener(\"touchend\", handleDragEnd);\n } else {\n document.removeEventListener(\"mousemove\", handleDragMove);\n document.removeEventListener(\"mouseup\", handleDragEnd);\n document.removeEventListener(\"touchmove\", handleDragMove);\n document.removeEventListener(\"touchend\", handleDragEnd);\n }\n };\n\n // Setup event listeners based on device type\n if (isMobile) {\n setupMobileEventListeners(handleDragMove, handleDragEnd);\n } else {\n setupDesktopEventListeners(handleDragMove, handleDragEnd);\n }\n };\n\n // Handle mouse down on grip for manual resizing\n const handleGripMouseDown = (e: ReactMouseEvent) => {\n e.preventDefault();\n startDrag(e.clientY);\n };\n\n // Handle touch start on grip for manual resizing\n const handleGripTouchStart = (e: ReactTouchEvent) => {\n e.preventDefault();\n startDrag(e.touches[0].clientY);\n };\n\n return {\n handleGripMouseDown,\n handleGripTouchStart,\n };\n};\n"],"mappings":"qHASA,IAAM,EAAiB,
|
|
1
|
+
{"version":3,"file":"use-drag-resize.cjs","names":[],"sources":["../../src/hooks/use-drag-resize.ts"],"sourcesContent":["import type {\n RefObject,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n} from \"react\";\nimport { EPS } from \"#/utils/constants\";\nimport { isMobileDevice } from \"#/utils/utils\";\n\n/** Movement required before a pointer gesture is treated as a resize drag. */\nconst DRAG_COMMIT_PX = 2;\n\n/**\n * Distance (px) from the viewport bottom within which we consider the chat\n * input to be \"bottom-anchored\" by its parent's flexbox. When the input is\n * bottom-anchored (e.g. the conversation page), dragging the top grip makes\n * the box grow upward — the expected behaviour. When it is NOT\n * bottom-anchored (e.g. the home page where the input sits in the centre of\n * the screen), the same drag would make the box grow downward, which is\n * confusing, so we disable manual resizing entirely in that case.\n */\nconst BOTTOM_ANCHORED_THRESHOLD = 120;\n\n/**\n * Determine whether the chat input is anchored to the bottom of the viewport\n * by its parent layout (e.g. the conversation page uses a flex column with a\n * growing scroll area above the input). When true, dragging the top grip\n * makes the box grow upward, which is the expected behaviour. When false,\n * the drag would grow the box downward, so we disable it.\n */\nexport const isBottomAnchored = (): boolean => {\n const grip = document.getElementById(\"resize-grip\");\n const wrapper = grip?.parentElement ?? null;\n if (!wrapper) return true; // fall back to allowing the drag\n const rect = wrapper.getBoundingClientRect();\n return rect.bottom >= window.innerHeight - BOTTOM_ANCHORED_THRESHOLD;\n};\n\n// Drag handling hook\ninterface UseDragResizeOptions {\n elementRef: RefObject<HTMLElement | null>;\n minHeight: number;\n maxHeight: number;\n onGripDragStart?: () => void;\n onGripDragEnd?: () => void;\n onHeightChange?: (height: number) => void;\n onReachedMinHeight?: () => void; // Notify when user drags to minimum height\n}\n\nexport const useDragResize = ({\n elementRef,\n minHeight,\n maxHeight,\n onGripDragStart,\n onGripDragEnd,\n onHeightChange,\n onReachedMinHeight,\n}: UseDragResizeOptions) => {\n const getClientY = (event: MouseEvent | TouchEvent): number => {\n if (\"touches\" in event && event.touches.length > 0) {\n return event.touches[0].clientY;\n }\n return (event as MouseEvent).clientY;\n };\n\n // Setup event listeners for mobile devices\n const setupMobileEventListeners = (\n handleDragMove: (event: MouseEvent | TouchEvent) => void,\n handleDragEnd: () => void,\n ) => {\n const resizeGrip = document.getElementById(\"resize-grip\");\n\n if (!resizeGrip) {\n return;\n }\n\n resizeGrip.addEventListener(\"touchmove\", handleDragMove, {\n passive: false,\n capture: true,\n });\n resizeGrip.addEventListener(\"touchend\", handleDragEnd, {\n capture: true,\n });\n };\n\n // Setup event listeners for desktop devices\n const setupDesktopEventListeners = (\n handleDragMove: (event: MouseEvent | TouchEvent) => void,\n handleDragEnd: () => void,\n ) => {\n document.addEventListener(\"mousemove\", handleDragMove);\n document.addEventListener(\"mouseup\", handleDragEnd);\n };\n\n // Start drag operation\n const startDrag = (startY: number) => {\n const isMobile = isMobileDevice();\n const startHeight = elementRef.current?.offsetHeight || minHeight;\n let dragCommitted = false;\n\n const handleDragMove = (moveEvent: MouseEvent | TouchEvent) => {\n moveEvent.preventDefault();\n\n if (!dragCommitted) {\n const y = getClientY(moveEvent);\n if (Math.abs(y - startY) < DRAG_COMMIT_PX) {\n return;\n }\n dragCommitted = true;\n onGripDragStart?.();\n }\n\n const deltaY = getClientY(moveEvent) - startY;\n // Invert deltaY so moving up increases height and moving down decreases height\n const newHeight = Math.max(\n minHeight,\n Math.min(maxHeight, startHeight - deltaY),\n );\n\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n element.style.height = `${newHeight}px`;\n\n // Check if content exceeds the new height to determine scrollbar visibility\n const contentHeight = element.scrollHeight;\n const shouldShowScrollbar =\n contentHeight > newHeight || newHeight >= maxHeight;\n element.style.overflowY = shouldShowScrollbar ? \"auto\" : \"hidden\";\n\n // Call the height change callback if provided\n if (onHeightChange) {\n onHeightChange(newHeight);\n }\n\n // Notify when dragged to minimum height to clear manual mode\n if (onReachedMinHeight && Math.abs(newHeight - minHeight) <= EPS) {\n onReachedMinHeight();\n }\n };\n\n const handleDragEnd = () => {\n if (dragCommitted) {\n onGripDragEnd?.();\n }\n\n if (isMobile) {\n const resizeGrip = document.getElementById(\"resize-grip\");\n if (!resizeGrip) {\n return;\n }\n\n // Remove both mouse and touch event listeners\n resizeGrip.removeEventListener(\"mousemove\", handleDragMove);\n resizeGrip.removeEventListener(\"mouseup\", handleDragEnd);\n resizeGrip.removeEventListener(\"touchmove\", handleDragMove);\n resizeGrip.removeEventListener(\"touchend\", handleDragEnd);\n } else {\n document.removeEventListener(\"mousemove\", handleDragMove);\n document.removeEventListener(\"mouseup\", handleDragEnd);\n document.removeEventListener(\"touchmove\", handleDragMove);\n document.removeEventListener(\"touchend\", handleDragEnd);\n }\n };\n\n // Setup event listeners based on device type\n if (isMobile) {\n setupMobileEventListeners(handleDragMove, handleDragEnd);\n } else {\n setupDesktopEventListeners(handleDragMove, handleDragEnd);\n }\n };\n\n // Handle mouse down on grip for manual resizing\n const handleGripMouseDown = (e: ReactMouseEvent) => {\n e.preventDefault();\n // Only allow manual resizing when the input is bottom-anchored (e.g. the\n // conversation page). On the home page the input is centred and dragging\n // the top grip would grow the box downward, which is confusing.\n if (!isBottomAnchored()) return;\n startDrag(e.clientY);\n };\n\n // Handle touch start on grip for manual resizing\n const handleGripTouchStart = (e: ReactTouchEvent) => {\n e.preventDefault();\n if (!isBottomAnchored()) return;\n startDrag(e.touches[0].clientY);\n };\n\n return {\n handleGripMouseDown,\n handleGripTouchStart,\n };\n};\n"],"mappings":"qHASA,IAAM,EAAiB,EAWjB,EAA4B,IASrB,MAAkC,CAE7C,IAAM,EADO,SAAS,eAAe,aACrB,GAAM,eAAiB,KAGvC,OAFK,EACQ,EAAQ,sBACd,EAAK,QAAU,OAAO,YAAc,EAFtB,EAGvB,EAaa,GAAiB,CAC5B,aACA,YACA,YACA,kBACA,gBACA,iBACA,wBAC0B,CAC1B,IAAM,EAAc,GACd,YAAa,GAAS,EAAM,QAAQ,OAAS,EACxC,EAAM,QAAQ,GAAG,QAElB,EAAqB,QAIzB,GACJ,EACA,IACG,CACH,IAAM,EAAa,SAAS,eAAe,aAAa,EAEnD,IAIL,EAAW,iBAAiB,YAAa,EAAgB,CACvD,QAAS,GACT,QAAS,EACX,CAAC,EACD,EAAW,iBAAiB,WAAY,EAAe,CACrD,QAAS,EACX,CAAC,EACH,EAGM,GACJ,EACA,IACG,CACH,SAAS,iBAAiB,YAAa,CAAc,EACrD,SAAS,iBAAiB,UAAW,CAAa,CACpD,EAGM,EAAa,GAAmB,CACpC,IAAM,EAAW,EAAA,eAAe,EAC1B,EAAc,EAAW,SAAS,cAAgB,EACpD,EAAgB,GAEd,EAAkB,GAAuC,CAG7D,GAFA,EAAU,eAAe,EAErB,CAAC,EAAe,CAClB,IAAM,EAAI,EAAW,CAAS,EAC9B,GAAI,KAAK,IAAI,EAAI,CAAM,EAAI,EACzB,OAEF,EAAgB,GAChB,IAAkB,CACpB,CAEA,IAAM,EAAS,EAAW,CAAS,EAAI,EAEjC,EAAY,KAAK,IACrB,EACA,KAAK,IAAI,EAAW,EAAc,CAAM,CAC1C,EAEM,EAAU,EAAW,QAE3B,GAAI,CAAC,EACH,OAGF,EAAQ,MAAM,OAAS,GAAG,EAAU,IAIpC,IAAM,EADgB,EAAQ,aAEZ,GAAa,GAAa,EAC5C,EAAQ,MAAM,UAAY,EAAsB,OAAS,SAGrD,GACF,EAAe,CAAS,EAItB,GAAsB,KAAK,IAAI,EAAY,CAAS,GAAA,KACtD,EAAmB,CAEvB,EAEM,MAAsB,CAK1B,GAJI,GACF,IAAgB,EAGd,EAAU,CACZ,IAAM,EAAa,SAAS,eAAe,aAAa,EACxD,GAAI,CAAC,EACH,OAIF,EAAW,oBAAoB,YAAa,CAAc,EAC1D,EAAW,oBAAoB,UAAW,CAAa,EACvD,EAAW,oBAAoB,YAAa,CAAc,EAC1D,EAAW,oBAAoB,WAAY,CAAa,CAC1D,MACE,SAAS,oBAAoB,YAAa,CAAc,EACxD,SAAS,oBAAoB,UAAW,CAAa,EACrD,SAAS,oBAAoB,YAAa,CAAc,EACxD,SAAS,oBAAoB,WAAY,CAAa,CAE1D,EAGI,EACF,EAA0B,EAAgB,CAAa,EAEvD,EAA2B,EAAgB,CAAa,CAE5D,EAmBA,MAAO,CACL,oBAjB2B,GAAuB,CAClD,EAAE,eAAe,EAIZ,EAAiB,GACtB,EAAU,EAAE,OAAO,CACrB,EAWE,qBAR4B,GAAuB,CACnD,EAAE,eAAe,EACZ,EAAiB,GACtB,EAAU,EAAE,QAAQ,GAAG,OAAO,CAChC,CAKA,CACF"}
|