@openhands/agent-canvas 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
- package/build/assets/active-backend-context-IqOjobNK.js +2 -0
- package/build/assets/{agent-context-settings-Bno1nwPL.js → agent-context-settings-DMrObcIS.js} +1 -1
- package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
- package/build/assets/{agent-settings-h8hQz-IU.js → agent-settings-BJVk92PU.js} +1 -1
- package/build/assets/agent-settings-COfJsQ1d.js +1 -0
- package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
- package/build/assets/{api-key-entry-screen-Qsb83VX1.js → api-key-entry-screen-D8Fade_-.js} +1 -1
- package/build/assets/app-settings-CpyGB3AT.js +1 -0
- package/build/assets/{automation-detail-7LkL91j9.js → automation-detail-B-jQ39Mm.js} +1 -1
- package/build/assets/{automation-export-U2QNyNy6.js → automation-export-B1dywoqk.js} +1 -1
- package/build/assets/{automation-setup-route-Bel9_Lue.js → automation-setup-route-C-bWUZBi.js} +1 -1
- package/build/assets/{automation-templates-CRLDssaI.js → automation-templates-DgpCGOJV.js} +1 -1
- package/build/assets/{automations-list-B2iV3ZKW.js → automations-list-DnMxlxsL.js} +1 -1
- package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
- package/build/assets/backend-form-modal-DiVrD4Cm.js +1 -0
- package/build/assets/{backend-synced-settings-badge-DB4717Iu.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
- package/build/assets/{badge-yR53enbU.js → badge-CpYmcVZV.js} +1 -1
- package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
- package/build/assets/bot-BQZx8e2i.js +1 -0
- package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
- package/build/assets/browser-B9AbV6kG.js +7 -0
- package/build/assets/{browser-tab-A94o33Vn.js → browser-tab-zAY12m_i.js} +1 -1
- package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
- package/build/assets/check-WAFXrrs_.js +1 -0
- package/build/assets/chevron-down-CifNWzme.js +1 -0
- package/build/assets/circle-check-CtnimJa8.js +1 -0
- package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-CBQdPZl_.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
- package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
- package/build/assets/{command-menu-PsRXVBz2.js → command-menu-BXy03FBl.js} +1 -1
- package/build/assets/{condenser-settings-w7L3EFvm.js → condenser-settings-BmZa0ui_.js} +1 -1
- package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
- package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
- package/build/assets/conversation-BPo8SvLN.js +1 -0
- package/build/assets/conversation-CPCVsCUY.js +90 -0
- package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
- package/build/assets/{conversation-state-store-Bs8gA263.js → conversation-state-store-C5YpjMNy.js} +1 -1
- package/build/assets/conversation-store-Blc5xysY.js +6 -0
- package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
- package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
- package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
- package/build/assets/{entry.client-DzbDyLkV.js → entry.client-CxFjRYqH.js} +2 -2
- package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
- package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
- package/build/assets/{extensions-hub-DOmHPGTA.js → extensions-hub-BqUINAhp.js} +1 -1
- package/build/assets/{extensions-navigation-6zU5M1pa.js → extensions-navigation-lraj88Wk.js} +1 -1
- package/build/assets/external-link-CgtpA_a1.js +1 -0
- package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
- package/build/assets/files-tab-DV0L-lFE.js +1 -0
- package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
- package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
- package/build/assets/{format-relative-time-DGPQlPx0.js → format-relative-time-DSErAuVr.js} +1 -1
- package/build/assets/git-provider-icon-BvlLAche.js +1 -0
- package/build/assets/{git-repo-dropdown-B7RvO70z.js → git-repo-dropdown-ByMzpNko.js} +1 -1
- package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
- package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
- package/build/assets/{home-DEZaZqYv.js → home-BOrlwLqG.js} +1 -1
- package/build/assets/home-BvMNC6E-.js +1 -0
- package/build/assets/{home-store-D7CjMN_-.js → home-store-CxqsY9Fi.js} +1 -1
- package/build/assets/index-home-BvMNC6E-.js +1 -0
- package/build/assets/info-BRVcJAUg.js +1 -0
- package/build/assets/{install-server-modal-BTwK5lbi.js → install-server-modal-Bl4G1zF4.js} +1 -1
- package/build/assets/{kebab-menu-item-content-C4CkeiJO.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
- package/build/assets/{launch-DVlx4v9o.js → launch-CkqiSCqi.js} +1 -1
- package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
- package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
- package/build/assets/llm-settings-B-pkVCrt.js +1 -0
- package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
- package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
- package/build/assets/loader-circle-B47W9XqT.js +1 -0
- package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
- package/build/assets/{manage-backends-modal-HNWKLYhq.js → manage-backends-modal-DhGk5mJt.js} +1 -1
- package/build/assets/manifest-653b89aa.js +1 -0
- package/build/assets/{manifest-subpage-layout-D-m-h8_t.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
- package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
- package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
- package/build/assets/{mcp-gLgPP7AS.js → mcp-DCkvl6K0.js} +2 -2
- package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
- package/build/assets/messages-DSXvyc21.js +40 -0
- package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
- package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
- package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
- package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
- package/build/assets/{npm-DRzJF5Zn.js → npm-DLckoeJc.js} +1 -1
- package/build/assets/{onboarding-DSr8hOpk.js → onboarding-D7WDG66N.js} +1 -1
- package/build/assets/{onboarding-modal-C6Euf7N4.js → onboarding-modal-C_xVrFNv.js} +1 -1
- package/build/assets/{organization-service.api-C4GYWwj9.js → organization-service.api-D-s9z18a.js} +1 -1
- package/build/assets/pencil-BGOCPRyu.js +1 -0
- package/build/assets/{planner-tab-CZcguxTK.js → planner-tab-AKaXIIfg.js} +1 -1
- package/build/assets/{plugins-management-service-BmDzOQsd.js → plugins-management-service-wtmY4QQw.js} +1 -1
- package/build/assets/plus-zNEL8rcX.js +1 -0
- package/build/assets/{profiles-service.api-CoLTwjc1.js → profiles-service.api-DCMYxHMi.js} +1 -1
- package/build/assets/{providers-tBzTpz1w.js → providers-BjrtjX4L.js} +1 -1
- package/build/assets/{proxy-DCI9S-LA.js → proxy-9Z_WZggZ.js} +1 -1
- package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
- package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
- package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
- package/build/assets/root-CanxKlNV.css +1 -0
- package/build/assets/root-DkfG_UWR.js +2 -0
- package/build/assets/root-layout-D75LHYhh.js +2 -0
- package/build/assets/{schema-field-zhsVDllR.js → schema-field-OnM5Uob_.js} +1 -1
- package/build/assets/{sdk-section-page-CS4GWn0y.js → sdk-section-page-m5WQm2sy.js} +1 -1
- package/build/assets/search-CycosyjN.js +1 -0
- package/build/assets/{secrets-service-DjgGduXk.js → secrets-service-B26R61C1.js} +1 -1
- package/build/assets/{secrets-settings-f-qahfbi.js → secrets-settings-CbLYCKOX.js} +1 -1
- package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
- package/build/assets/{settings-DQd0xLEw.js → settings-BJQI_iBM.js} +1 -1
- package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
- package/build/assets/{settings-index-BVwy9JEp.js → settings-index-BiTqJoH7.js} +1 -1
- package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
- package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
- package/build/assets/{settings-modal-D6D5ngET.js → settings-modal-BIrIVn97.js} +1 -1
- package/build/assets/{settings-service.api-DZp7E7A9.js → settings-service.api--rJmnuLa.js} +1 -1
- package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
- package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
- package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
- package/build/assets/shield-check-T3JsDJiM.js +1 -0
- package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-OoZBHxaT.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
- package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
- package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
- package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
- package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
- package/build/assets/{skill-scope-B1Per5XI.js → skill-scope-Dc3JPW-8.js} +1 -1
- package/build/assets/{skills-plugins-B3AO6sMz.js → skills-plugins-CpTV27n3.js} +1 -1
- package/build/assets/{skills-settings-DmmgJ6CT.js → skills-settings-CSW__IW4.js} +1 -1
- package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
- package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
- package/build/assets/{task-list-tab-C19Q_JNf.js → task-list-tab-mAHMOkUz.js} +1 -1
- package/build/assets/{terminal-CbuMRYal.js → terminal-BzxBaHx2.js} +1 -1
- package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
- package/build/assets/trash-2-C0xNVp9c.js +1 -0
- package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
- package/build/assets/usage-tab-tEmVN0KD.js +1 -0
- package/build/assets/{use-acp-credential-form-DJmmJKMo.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
- package/build/assets/{use-activate-agent-profile-CeFfYwu_.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
- package/build/assets/{use-agent-profiles-BHLkLbRR.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-Bu4y8gSx.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-QD9x3ySO.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
- package/build/assets/{use-config-CPwqciXN.js → use-config-DKAMiI5R.js} +1 -1
- package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
- package/build/assets/{use-create-secret-BsOfOLvg.js → use-create-secret-2zBlCDsF.js} +1 -1
- package/build/assets/use-is-authed-C52-ivnB.js +1 -0
- package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
- package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
- package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
- package/build/assets/{use-manifest-capabilities-DBYPjyV6.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
- package/build/assets/{use-onboarding-completion-CtNJxkXG.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
- package/build/assets/{use-plugins-marketplace-ZEA-gyM9.js → use-plugins-marketplace-CEiak69h.js} +1 -1
- package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
- package/build/assets/{use-save-settings-pSjRhD_m.js → use-save-settings-DNmnbG6f.js} +1 -1
- package/build/assets/{use-settings-nav-items-CQgkxUbV.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
- package/build/assets/{use-settings-BHWsOcIG.js → use-settings-wCwPaSIv.js} +1 -1
- package/build/assets/{use-tracking-CGCsBWhg.js → use-tracking-CVwPmhlX.js} +1 -1
- package/build/assets/{use-user-conversation-DRfEU8x0.js → use-user-conversation-DVtfg0B_.js} +1 -1
- package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
- package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
- package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
- package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
- package/build/assets/utils-zxEjKE70.js +1 -0
- package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js} +3 -3
- package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
- package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js} +2 -2
- package/build/assets/{verification-settings-BItwt998.js → verification-settings-B8UMQ7MG.js} +1 -1
- package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
- package/build/assets/x-BWKA2Ver.js +1 -0
- package/build/assets/zap-DHddTPc0.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +28 -1
- package/build/locales/ca/openhands.json +28 -1
- package/build/locales/de/openhands.json +28 -1
- package/build/locales/en/openhands.json +28 -1
- package/build/locales/es/openhands.json +28 -1
- package/build/locales/fr/openhands.json +28 -1
- package/build/locales/it/openhands.json +28 -1
- package/build/locales/ja/openhands.json +28 -1
- package/build/locales/ko-KR/openhands.json +28 -1
- package/build/locales/no/openhands.json +28 -1
- package/build/locales/pt/openhands.json +28 -1
- package/build/locales/tr/openhands.json +28 -1
- package/build/locales/uk/openhands.json +28 -1
- package/build/locales/zh-CN/openhands.json +28 -1
- package/build/locales/zh-TW/openhands.json +28 -1
- package/config/defaults.json +3 -3
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.js +1 -1
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/llm-balance-service.cjs +2 -0
- package/dist/api/llm-balance-service.cjs.map +1 -0
- package/dist/api/llm-balance-service.d.ts +33 -0
- package/dist/api/llm-balance-service.js +53 -0
- package/dist/api/llm-balance-service.js.map +1 -0
- package/dist/api/llm-subscription-service.cjs +1 -1
- package/dist/api/llm-subscription-service.cjs.map +1 -1
- package/dist/api/llm-subscription-service.js +42 -34
- package/dist/api/llm-subscription-service.js.map +1 -1
- package/dist/components/conversation/index.cjs +1 -1
- package/dist/components/conversation/index.d.ts +0 -1
- package/dist/components/conversation/index.js +0 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
- package/dist/components/conversation-events/chat/group-events.cjs +1 -1
- package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
- package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
- package/dist/components/conversation-events/chat/group-events.js +27 -26
- package/dist/components/conversation-events/chat/group-events.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.js +123 -118
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-grip.js +7 -7
- package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
- package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
- package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
- package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
- package/dist/components/features/chat/components/context-window-meter.js +131 -0
- package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
- package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
- package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
- package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
- package/dist/components/features/chat/components/context-window-ring.js +45 -0
- package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
- package/dist/components/features/chat/custom-chat-input.cjs +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
- package/dist/components/features/chat/custom-chat-input.js +68 -67
- package/dist/components/features/chat/custom-chat-input.js.map +1 -1
- package/dist/components/features/chat/model-messages.cjs +1 -1
- package/dist/components/features/chat/model-messages.cjs.map +1 -1
- package/dist/components/features/chat/model-messages.js +26 -25
- package/dist/components/features/chat/model-messages.js.map +1 -1
- package/dist/components/features/chat/path-component.cjs +1 -1
- package/dist/components/features/chat/path-component.cjs.map +1 -1
- package/dist/components/features/chat/path-component.js +9 -6
- package/dist/components/features/chat/path-component.js.map +1 -1
- package/dist/components/features/chat/plan-preview.cjs +1 -1
- package/dist/components/features/chat/plan-preview.js +4 -4
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
- package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
- package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
- package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
- package/dist/components/features/controls/server-status-context-menu.js +8 -8
- package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
- package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
- package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name.js +69 -71
- package/dist/components/features/conversation/conversation-name.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
- package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
- package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
- package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
- package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
- package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
- package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
- package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
- package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
- package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
- package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
- package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.js +10 -13
- package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
- package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
- package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
- package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +28 -20
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
- package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
- package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +22 -25
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
- package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +154 -98
- package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/llm-balance.cjs +2 -0
- package/dist/constants/llm-balance.cjs.map +1 -0
- package/dist/constants/llm-balance.d.ts +13 -0
- package/dist/constants/llm-balance.js +6 -0
- package/dist/constants/llm-balance.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +2 -2
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +217 -209
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/chat/use-grip-resize.cjs +1 -1
- package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
- package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
- package/dist/hooks/chat/use-grip-resize.js +39 -30
- package/dist/hooks/chat/use-grip-resize.js.map +1 -1
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +61 -60
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
- package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
- package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
- package/dist/hooks/mutation/use-condense-conversation.js +17 -0
- package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +30 -21
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.js +1 -1
- package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
- package/dist/hooks/query/use-llm-balance.cjs +2 -0
- package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
- package/dist/hooks/query/use-llm-balance.d.ts +10 -0
- package/dist/hooks/query/use-llm-balance.js +24 -0
- package/dist/hooks/query/use-llm-balance.js.map +1 -0
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +1 -1
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/use-await-context-compaction.cjs +2 -0
- package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
- package/dist/hooks/use-await-context-compaction.d.ts +38 -0
- package/dist/hooks/use-await-context-compaction.js +61 -0
- package/dist/hooks/use-await-context-compaction.js.map +1 -0
- package/dist/hooks/use-compact-context-action.cjs +2 -0
- package/dist/hooks/use-compact-context-action.cjs.map +1 -0
- package/dist/hooks/use-compact-context-action.d.ts +10 -0
- package/dist/hooks/use-compact-context-action.js +61 -0
- package/dist/hooks/use-compact-context-action.js.map +1 -0
- package/dist/hooks/use-context-window-usage.cjs +2 -0
- package/dist/hooks/use-context-window-usage.cjs.map +1 -0
- package/dist/hooks/use-context-window-usage.d.ts +5 -0
- package/dist/hooks/use-context-window-usage.js +20 -0
- package/dist/hooks/use-context-window-usage.js.map +1 -0
- package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
- package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
- package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
- package/dist/hooks/use-conversation-name-context-menu.js +54 -57
- package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
- package/dist/hooks/use-drag-resize.cjs +1 -1
- package/dist/hooks/use-drag-resize.cjs.map +1 -1
- package/dist/hooks/use-drag-resize.d.ts +8 -0
- package/dist/hooks/use-drag-resize.js +21 -18
- package/dist/hooks/use-drag-resize.js.map +1 -1
- package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
- package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
- package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
- package/dist/hooks/use-live-conversation-metrics.js +37 -0
- package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
- package/dist/hooks/use-select-conversation-tab.cjs +1 -1
- package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
- package/dist/hooks/use-select-conversation-tab.js +2 -2
- package/dist/hooks/use-select-conversation-tab.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +27 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +474 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +28 -29
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.js +0 -1
- package/dist/locales/ar/openhands.json +28 -1
- package/dist/locales/ca/openhands.json +28 -1
- package/dist/locales/de/openhands.json +28 -1
- package/dist/locales/en/openhands.json +28 -1
- package/dist/locales/es/openhands.json +28 -1
- package/dist/locales/fr/openhands.json +28 -1
- package/dist/locales/it/openhands.json +28 -1
- package/dist/locales/ja/openhands.json +28 -1
- package/dist/locales/ko-KR/openhands.json +28 -1
- package/dist/locales/no/openhands.json +28 -1
- package/dist/locales/pt/openhands.json +28 -1
- package/dist/locales/tr/openhands.json +28 -1
- package/dist/locales/uk/openhands.json +28 -1
- package/dist/locales/zh-CN/openhands.json +28 -1
- package/dist/locales/zh-TW/openhands.json +28 -1
- package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
- package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
- package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
- package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
- package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
- package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
- package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
- package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
- package/dist/node_modules/zustand/esm/middleware.js +33 -31
- package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +17 -16
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +94 -93
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.js +131 -119
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/usage-tab.cjs +2 -0
- package/dist/routes/usage-tab.cjs.map +1 -0
- package/dist/routes/usage-tab.d.ts +2 -0
- package/dist/routes/usage-tab.js +10 -0
- package/dist/routes/usage-tab.js.map +1 -0
- package/dist/services/child-conversation-launch.cjs +1 -1
- package/dist/services/child-conversation-launch.cjs.map +1 -1
- package/dist/services/child-conversation-launch.js +11 -5
- package/dist/services/child-conversation-launch.js.map +1 -1
- package/dist/stores/archived-conversations-store.cjs +2 -0
- package/dist/stores/archived-conversations-store.cjs.map +1 -0
- package/dist/stores/archived-conversations-store.d.ts +24 -0
- package/dist/stores/archived-conversations-store.js +33 -0
- package/dist/stores/archived-conversations-store.js.map +1 -0
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
- package/dist/stores/conversation-panel-preferences-store.js +4 -0
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +1 -1
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/metrics-store.cjs +1 -1
- package/dist/stores/metrics-store.cjs.map +1 -1
- package/dist/stores/metrics-store.d.ts +1 -0
- package/dist/stores/metrics-store.js +7 -4
- package/dist/stores/metrics-store.js.map +1 -1
- package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
- package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +5 -0
- package/dist/types/agent-server/type-guards.js +3 -3
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/utils/conversation-local-storage.cjs +1 -1
- package/dist/utils/conversation-local-storage.cjs.map +1 -1
- package/dist/utils/conversation-local-storage.js +2 -1
- package/dist/utils/conversation-local-storage.js.map +1 -1
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +11 -0
- package/dist/utils/format-model-name.js +11 -3
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-token-count.cjs +2 -0
- package/dist/utils/format-token-count.cjs.map +1 -0
- package/dist/utils/format-token-count.d.ts +3 -0
- package/dist/utils/format-token-count.js +19 -0
- package/dist/utils/format-token-count.js.map +1 -0
- package/dist/utils/hover-reveal-classes.cjs +2 -0
- package/dist/utils/hover-reveal-classes.cjs.map +1 -0
- package/dist/utils/hover-reveal-classes.d.ts +34 -0
- package/dist/utils/hover-reveal-classes.js +41 -0
- package/dist/utils/hover-reveal-classes.js.map +1 -0
- package/dist/utils/is-markdown-file-path.cjs +2 -0
- package/dist/utils/is-markdown-file-path.cjs.map +1 -0
- package/dist/utils/is-markdown-file-path.d.ts +4 -0
- package/dist/utils/is-markdown-file-path.js +14 -0
- package/dist/utils/is-markdown-file-path.js.map +1 -0
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
- package/dist/utils/mcp-marketplace-utils.js +19 -16
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/transcript-export/index.cjs +3 -3
- package/dist/utils/transcript-export/index.cjs.map +1 -1
- package/dist/utils/transcript-export/index.js +12 -12
- package/dist/utils/transcript-export/index.js.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.js +4 -4
- package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
- package/dist/utils/workspace-relative-path.cjs +2 -0
- package/dist/utils/workspace-relative-path.cjs.map +1 -0
- package/dist/utils/workspace-relative-path.d.ts +10 -0
- package/dist/utils/workspace-relative-path.js +22 -0
- package/dist/utils/workspace-relative-path.js.map +1 -0
- package/package.json +17 -16
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-process-utils.mjs +6 -1
- package/scripts/dev-safe.mjs +57 -2
- package/build/assets/active-backend-context-BBvP-bI2.js +0 -2
- package/build/assets/agent-profiles-settings-DqoS7RL3.js +0 -1
- package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +0 -86
- package/build/assets/agent-settings-BJHryp65.js +0 -1
- package/build/assets/app-settings-r1RUbgGi.js +0 -1
- package/build/assets/backend-form-modal-OroTqnAv.js +0 -1
- package/build/assets/bot-DuN83i3p.js +0 -1
- package/build/assets/browser--eoQOo4M.js +0 -6
- package/build/assets/check-DLOKoFU9.js +0 -1
- package/build/assets/chevron-down-CnIbtM6i.js +0 -1
- package/build/assets/circle-check-CxCYJrpZ.js +0 -1
- package/build/assets/conversation-BUzBZAc-.js +0 -90
- package/build/assets/conversation-panel-pzAKsSDb.js +0 -1
- package/build/assets/conversation-pzAKsSDb.js +0 -1
- package/build/assets/conversation-store-B8Eahyeg.js +0 -6
- package/build/assets/external-link-zWbg5KXS.js +0 -1
- package/build/assets/files-tab-BzofBmF4.js +0 -1
- package/build/assets/git-provider-icon-BLMlwy02.js +0 -1
- package/build/assets/git-repo-dropdown-B_PTq4ol.js +0 -1
- package/build/assets/home-r89Vj2td.js +0 -1
- package/build/assets/index-home-r89Vj2td.js +0 -1
- package/build/assets/llm-not-configured-banner-CwKu8C6g.js +0 -27
- package/build/assets/llm-settings-BJotLQND.js +0 -1
- package/build/assets/llm-settings-CDM-5H2A.js +0 -1
- package/build/assets/llm-subscription-service-7eVfDIE1.js +0 -1
- package/build/assets/loader-circle-C5AnEN8r.js +0 -1
- package/build/assets/manifest-2a36a8f8.js +0 -1
- package/build/assets/markdown-renderer-BiiiIznl.js +0 -8
- package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +0 -1
- package/build/assets/messages-D1cbVhRK.js +0 -40
- package/build/assets/pencil-Bl3GWhgq.js +0 -1
- package/build/assets/plus-CtzlyAoF.js +0 -1
- package/build/assets/recommended-automations-launcher-BbJAJVED.js +0 -1
- package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
- package/build/assets/root-BfM_kC_d.css +0 -1
- package/build/assets/root-gstBEjty.js +0 -2
- package/build/assets/root-layout-BIAFLP9p.js +0 -2
- package/build/assets/search-CYaiKHRp.js +0 -1
- package/build/assets/shared-conversation-DIxZjElr.js +0 -1
- package/build/assets/shield-check-D2cpEpv3.js +0 -1
- package/build/assets/trash-2-CzDVN-Iw.js +0 -1
- package/build/assets/use-create-conversation-DWaSVUOB.js +0 -1
- package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
- package/build/assets/use-llm-profiles-CU8ah1pz.js +0 -1
- package/build/assets/use-save-agent-profile-DgI_Uz9a.js +0 -1
- package/build/assets/utils-DPQfkd-7.js +0 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
- package/build/assets/x-RYDBg-e2.js +0 -1
- package/build/assets/zap-tbKDzCe3.js +0 -1
- package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
- package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
- package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
- package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
- package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
- package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
- package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
- package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
- package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
- package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
- package/dist/icons/u-credit-card.cjs +0 -2
- package/dist/icons/u-credit-card.cjs.map +0 -1
- package/dist/icons/u-credit-card.js +0 -21
- package/dist/icons/u-credit-card.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js} +0 -0
|
@@ -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"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { RefObject, MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Determine whether the chat input is anchored to the bottom of the viewport
|
|
4
|
+
* by its parent layout (e.g. the conversation page uses a flex column with a
|
|
5
|
+
* growing scroll area above the input). When true, dragging the top grip
|
|
6
|
+
* makes the box grow upward, which is the expected behaviour. When false,
|
|
7
|
+
* the drag would grow the box downward, so we disable it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const isBottomAnchored: () => boolean;
|
|
2
10
|
interface UseDragResizeOptions {
|
|
3
11
|
elementRef: RefObject<HTMLElement | null>;
|
|
4
12
|
minHeight: number;
|
|
@@ -1,46 +1,49 @@
|
|
|
1
1
|
import "../utils/constants.js";
|
|
2
2
|
import { isMobileDevice as e } from "../utils/utils.js";
|
|
3
3
|
//#region src/hooks/use-drag-resize.ts
|
|
4
|
-
var t = 2, n =
|
|
5
|
-
let
|
|
4
|
+
var t = 2, n = 120, r = () => {
|
|
5
|
+
let e = document.getElementById("resize-grip")?.parentElement ?? null;
|
|
6
|
+
return e ? e.getBoundingClientRect().bottom >= window.innerHeight - n : !0;
|
|
7
|
+
}, i = ({ elementRef: n, minHeight: i, maxHeight: a, onGripDragStart: o, onGripDragEnd: s, onHeightChange: c, onReachedMinHeight: l }) => {
|
|
8
|
+
let u = (e) => "touches" in e && e.touches.length > 0 ? e.touches[0].clientY : e.clientY, d = (e, t) => {
|
|
6
9
|
let n = document.getElementById("resize-grip");
|
|
7
10
|
n && (n.addEventListener("touchmove", e, {
|
|
8
11
|
passive: !1,
|
|
9
12
|
capture: !0
|
|
10
13
|
}), n.addEventListener("touchend", t, { capture: !0 }));
|
|
11
|
-
},
|
|
14
|
+
}, f = (e, t) => {
|
|
12
15
|
document.addEventListener("mousemove", e), document.addEventListener("mouseup", t);
|
|
13
|
-
},
|
|
14
|
-
let p = e(), m = n.current?.offsetHeight ||
|
|
16
|
+
}, p = (r) => {
|
|
17
|
+
let p = e(), m = n.current?.offsetHeight || i, h = !1, g = (e) => {
|
|
15
18
|
if (e.preventDefault(), !h) {
|
|
16
|
-
let n =
|
|
17
|
-
if (Math.abs(n -
|
|
18
|
-
h = !0,
|
|
19
|
+
let n = u(e);
|
|
20
|
+
if (Math.abs(n - r) < t) return;
|
|
21
|
+
h = !0, o?.();
|
|
19
22
|
}
|
|
20
|
-
let
|
|
21
|
-
if (!
|
|
22
|
-
|
|
23
|
-
let p =
|
|
24
|
-
|
|
23
|
+
let s = u(e) - r, d = Math.max(i, Math.min(a, m - s)), f = n.current;
|
|
24
|
+
if (!f) return;
|
|
25
|
+
f.style.height = `${d}px`;
|
|
26
|
+
let p = f.scrollHeight > d || d >= a;
|
|
27
|
+
f.style.overflowY = p ? "auto" : "hidden", c && c(d), l && Math.abs(d - i) <= 1.5 && l();
|
|
25
28
|
}, _ = () => {
|
|
26
|
-
if (h &&
|
|
29
|
+
if (h && s?.(), p) {
|
|
27
30
|
let e = document.getElementById("resize-grip");
|
|
28
31
|
if (!e) return;
|
|
29
32
|
e.removeEventListener("mousemove", g), e.removeEventListener("mouseup", _), e.removeEventListener("touchmove", g), e.removeEventListener("touchend", _);
|
|
30
33
|
} else document.removeEventListener("mousemove", g), document.removeEventListener("mouseup", _), document.removeEventListener("touchmove", g), document.removeEventListener("touchend", _);
|
|
31
34
|
};
|
|
32
|
-
p ?
|
|
35
|
+
p ? d(g, _) : f(g, _);
|
|
33
36
|
};
|
|
34
37
|
return {
|
|
35
38
|
handleGripMouseDown: (e) => {
|
|
36
|
-
e.preventDefault(),
|
|
39
|
+
e.preventDefault(), r() && p(e.clientY);
|
|
37
40
|
},
|
|
38
41
|
handleGripTouchStart: (e) => {
|
|
39
|
-
e.preventDefault(),
|
|
42
|
+
e.preventDefault(), r() && p(e.touches[0].clientY);
|
|
40
43
|
}
|
|
41
44
|
};
|
|
42
45
|
};
|
|
43
46
|
//#endregion
|
|
44
|
-
export {
|
|
47
|
+
export { r as isBottomAnchored, i as useDragResize };
|
|
45
48
|
|
|
46
49
|
//# sourceMappingURL=use-drag-resize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-drag-resize.js","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":";;;AASA,IAAM,IAAiB,
|
|
1
|
+
{"version":3,"file":"use-drag-resize.js","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":";;;AASA,IAAM,IAAiB,GAWjB,IAA4B,KASrB,UAAkC;CAE7C,IAAM,IADO,SAAS,eAAe,aACrB,GAAM,iBAAiB;CAGvC,OAFK,IACQ,EAAQ,sBACd,EAAK,UAAU,OAAO,cAAc,IAFtB;AAGvB,GAaa,KAAiB,EAC5B,eACA,cACA,cACA,oBACA,kBACA,mBACA,4BAC0B;CAC1B,IAAM,KAAc,MACd,aAAa,KAAS,EAAM,QAAQ,SAAS,IACxC,EAAM,QAAQ,GAAG,UAElB,EAAqB,SAIzB,KACJ,GACA,MACG;EACH,IAAM,IAAa,SAAS,eAAe,aAAa;EAEnD,MAIL,EAAW,iBAAiB,aAAa,GAAgB;GACvD,SAAS;GACT,SAAS;EACX,CAAC,GACD,EAAW,iBAAiB,YAAY,GAAe,EACrD,SAAS,GACX,CAAC;CACH,GAGM,KACJ,GACA,MACG;EAEH,AADA,SAAS,iBAAiB,aAAa,CAAc,GACrD,SAAS,iBAAiB,WAAW,CAAa;CACpD,GAGM,KAAa,MAAmB;EACpC,IAAM,IAAW,EAAe,GAC1B,IAAc,EAAW,SAAS,gBAAgB,GACpD,IAAgB,IAEd,KAAkB,MAAuC;GAG7D,IAFA,EAAU,eAAe,GAErB,CAAC,GAAe;IAClB,IAAM,IAAI,EAAW,CAAS;IAC9B,IAAI,KAAK,IAAI,IAAI,CAAM,IAAI,GACzB;IAGF,AADA,IAAgB,IAChB,IAAkB;GACpB;GAEA,IAAM,IAAS,EAAW,CAAS,IAAI,GAEjC,IAAY,KAAK,IACrB,GACA,KAAK,IAAI,GAAW,IAAc,CAAM,CAC1C,GAEM,IAAU,EAAW;GAE3B,IAAI,CAAC,GACH;GAGF,EAAQ,MAAM,SAAS,GAAG,EAAU;GAIpC,IAAM,IADgB,EAAQ,eAEZ,KAAa,KAAa;GAS5C,AARA,EAAQ,MAAM,YAAY,IAAsB,SAAS,UAGrD,KACF,EAAe,CAAS,GAItB,KAAsB,KAAK,IAAI,IAAY,CAAS,KAAA,OACtD,EAAmB;EAEvB,GAEM,UAAsB;GAK1B,IAJI,KACF,IAAgB,GAGd,GAAU;IACZ,IAAM,IAAa,SAAS,eAAe,aAAa;IACxD,IAAI,CAAC,GACH;IAOF,AAHA,EAAW,oBAAoB,aAAa,CAAc,GAC1D,EAAW,oBAAoB,WAAW,CAAa,GACvD,EAAW,oBAAoB,aAAa,CAAc,GAC1D,EAAW,oBAAoB,YAAY,CAAa;GAC1D,OAIE,AAHA,SAAS,oBAAoB,aAAa,CAAc,GACxD,SAAS,oBAAoB,WAAW,CAAa,GACrD,SAAS,oBAAoB,aAAa,CAAc,GACxD,SAAS,oBAAoB,YAAY,CAAa;EAE1D;EAGA,AAAI,IACF,EAA0B,GAAgB,CAAa,IAEvD,EAA2B,GAAgB,CAAa;CAE5D;CAmBA,OAAO;EACL,sBAjB2B,MAAuB;GAClD,EAAE,eAAe,GAIZ,EAAiB,KACtB,EAAU,EAAE,OAAO;EACrB;EAWE,uBAR4B,MAAuB;GACnD,EAAE,eAAe,GACZ,EAAiB,KACtB,EAAU,EAAE,QAAQ,GAAG,OAAO;EAChC;CAKA;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(i=!0){let a=e.default(e=>e.cost),o=e.default(e=>e.max_budget_per_task),s=e.default(e=>e.usage),{data:c}=t.useActiveConversation(),{data:l}=n.useConversationMetrics(c?.id,c?.conversation_url,c?.session_api_key,i);return(0,r.useMemo)(()=>a!==null||s!==null?{cost:a,max_budget_per_task:o,usage:s}:l?{cost:l.accumulated_cost,max_budget_per_task:l.max_budget_per_task,usage:l.accumulated_token_usage?{prompt_tokens:l.accumulated_token_usage.prompt_tokens??0,completion_tokens:l.accumulated_token_usage.completion_tokens??0,cache_read_tokens:l.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:l.accumulated_token_usage.cache_write_tokens??0,context_window:l.accumulated_token_usage.context_window??0,per_turn_token:l.accumulated_token_usage.per_turn_token??0}:null}:{cost:null,max_budget_per_task:null,usage:null},[l,a,o,s])}exports.useLiveConversationMetrics=i;
|
|
2
|
+
//# sourceMappingURL=use-live-conversation-metrics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-live-conversation-metrics.cjs","names":[],"sources":["../../src/hooks/use-live-conversation-metrics.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore, { type MetricsState } from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\n/**\n * Combined cost/token metrics for the active conversation.\n *\n * Prefers the live WebSocket metrics store, which updates in real time as\n * agent events stream in, and falls back to the REST snapshot\n * (`GET /api/conversations/{id}` stats, combined across all usage ids and\n * refreshed on a 30s interval by {@link useConversationMetrics}) before the\n * first stats arrive. The store is reset on conversation switch (see\n * `ConversationWebSocketProvider`), so its contents always belong to the\n * active conversation — preferring it cannot leak a previous\n * conversation's figures, and preferring REST would lag the display up to\n * a poll interval behind what the user just watched happen.\n *\n * Pass `enabled: false` to pause the REST polling while the consumer is\n * hidden (e.g. a closed modal).\n */\nexport function useLiveConversationMetrics(\n enabled: boolean = true,\n): MetricsState {\n // Per-field selectors rather than a bare `useMetricsStore()`: subscribing to\n // the whole store re-runs this hook on any store write, including the action\n // identity, and matches how `useContextWindowUsage` reads the same store.\n const storeCost = useMetricsStore((state) => state.cost);\n const storeMaxBudgetPerTask = useMetricsStore(\n (state) => state.max_budget_per_task,\n );\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 enabled,\n );\n\n return useMemo(() => {\n // Live store first: real-time and (post-reset) always the active\n // conversation's data. Any non-null field counts as data.\n if (storeCost !== null || storeUsage !== null) {\n return {\n cost: storeCost,\n max_budget_per_task: storeMaxBudgetPerTask,\n usage: storeUsage,\n };\n }\n\n if (conversationMetrics) {\n return {\n cost: conversationMetrics.accumulated_cost,\n max_budget_per_task: conversationMetrics.max_budget_per_task,\n usage: conversationMetrics.accumulated_token_usage\n ? {\n prompt_tokens:\n conversationMetrics.accumulated_token_usage.prompt_tokens ?? 0,\n completion_tokens:\n conversationMetrics.accumulated_token_usage.completion_tokens ??\n 0,\n cache_read_tokens:\n conversationMetrics.accumulated_token_usage.cache_read_tokens ??\n 0,\n cache_write_tokens:\n conversationMetrics.accumulated_token_usage\n .cache_write_tokens ?? 0,\n context_window:\n conversationMetrics.accumulated_token_usage.context_window ?? 0,\n per_turn_token:\n conversationMetrics.accumulated_token_usage.per_turn_token ?? 0,\n }\n : null,\n };\n }\n\n return {\n cost: null,\n max_budget_per_task: null,\n usage: null,\n };\n }, [conversationMetrics, storeCost, storeMaxBudgetPerTask, storeUsage]);\n}\n"],"mappings":"sNAqBA,SAAgB,EACd,EAAmB,GACL,CAId,IAAM,EAAY,EAAA,QAAiB,GAAU,EAAM,IAAI,EACjD,EAAwB,EAAA,QAC3B,GAAU,EAAM,mBACnB,EACM,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,CACF,EAEA,OAAA,EAAA,EAAA,aAGM,IAAc,MAAQ,IAAe,KAChC,CACL,KAAM,EACN,oBAAqB,EACrB,MAAO,CACT,EAGE,EACK,CACL,KAAM,EAAoB,iBAC1B,oBAAqB,EAAoB,oBACzC,MAAO,EAAoB,wBACvB,CACE,cACE,EAAoB,wBAAwB,eAAiB,EAC/D,kBACE,EAAoB,wBAAwB,mBAC5C,EACF,kBACE,EAAoB,wBAAwB,mBAC5C,EACF,mBACE,EAAoB,wBACjB,oBAAsB,EAC3B,eACE,EAAoB,wBAAwB,gBAAkB,EAChE,eACE,EAAoB,wBAAwB,gBAAkB,CAClE,EACA,IACN,EAGK,CACL,KAAM,KACN,oBAAqB,KACrB,MAAO,IACT,EACC,CAAC,EAAqB,EAAW,EAAuB,CAAU,CAAC,CACxE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MetricsState } from "#/stores/metrics-store";
|
|
2
|
+
/**
|
|
3
|
+
* Combined cost/token metrics for the active conversation.
|
|
4
|
+
*
|
|
5
|
+
* Prefers the live WebSocket metrics store, which updates in real time as
|
|
6
|
+
* agent events stream in, and falls back to the REST snapshot
|
|
7
|
+
* (`GET /api/conversations/{id}` stats, combined across all usage ids and
|
|
8
|
+
* refreshed on a 30s interval by {@link useConversationMetrics}) before the
|
|
9
|
+
* first stats arrive. The store is reset on conversation switch (see
|
|
10
|
+
* `ConversationWebSocketProvider`), so its contents always belong to the
|
|
11
|
+
* active conversation — preferring it cannot leak a previous
|
|
12
|
+
* conversation's figures, and preferring REST would lag the display up to
|
|
13
|
+
* a poll interval behind what the user just watched happen.
|
|
14
|
+
*
|
|
15
|
+
* Pass `enabled: false` to pause the REST polling while the consumer is
|
|
16
|
+
* hidden (e.g. a closed modal).
|
|
17
|
+
*/
|
|
18
|
+
export declare function useLiveConversationMetrics(enabled?: boolean): MetricsState;
|
|
@@ -0,0 +1,37 @@
|
|
|
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-live-conversation-metrics.ts
|
|
6
|
+
function i(i = !0) {
|
|
7
|
+
let a = e((e) => e.cost), o = e((e) => e.max_budget_per_task), s = e((e) => e.usage), { data: c } = t(), { data: l } = n(c?.id, c?.conversation_url, c?.session_api_key, i);
|
|
8
|
+
return r(() => a !== null || s !== null ? {
|
|
9
|
+
cost: a,
|
|
10
|
+
max_budget_per_task: o,
|
|
11
|
+
usage: s
|
|
12
|
+
} : l ? {
|
|
13
|
+
cost: l.accumulated_cost,
|
|
14
|
+
max_budget_per_task: l.max_budget_per_task,
|
|
15
|
+
usage: l.accumulated_token_usage ? {
|
|
16
|
+
prompt_tokens: l.accumulated_token_usage.prompt_tokens ?? 0,
|
|
17
|
+
completion_tokens: l.accumulated_token_usage.completion_tokens ?? 0,
|
|
18
|
+
cache_read_tokens: l.accumulated_token_usage.cache_read_tokens ?? 0,
|
|
19
|
+
cache_write_tokens: l.accumulated_token_usage.cache_write_tokens ?? 0,
|
|
20
|
+
context_window: l.accumulated_token_usage.context_window ?? 0,
|
|
21
|
+
per_turn_token: l.accumulated_token_usage.per_turn_token ?? 0
|
|
22
|
+
} : null
|
|
23
|
+
} : {
|
|
24
|
+
cost: null,
|
|
25
|
+
max_budget_per_task: null,
|
|
26
|
+
usage: null
|
|
27
|
+
}, [
|
|
28
|
+
l,
|
|
29
|
+
a,
|
|
30
|
+
o,
|
|
31
|
+
s
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { i as useLiveConversationMetrics };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=use-live-conversation-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-live-conversation-metrics.js","names":[],"sources":["../../src/hooks/use-live-conversation-metrics.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore, { type MetricsState } from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\n/**\n * Combined cost/token metrics for the active conversation.\n *\n * Prefers the live WebSocket metrics store, which updates in real time as\n * agent events stream in, and falls back to the REST snapshot\n * (`GET /api/conversations/{id}` stats, combined across all usage ids and\n * refreshed on a 30s interval by {@link useConversationMetrics}) before the\n * first stats arrive. The store is reset on conversation switch (see\n * `ConversationWebSocketProvider`), so its contents always belong to the\n * active conversation — preferring it cannot leak a previous\n * conversation's figures, and preferring REST would lag the display up to\n * a poll interval behind what the user just watched happen.\n *\n * Pass `enabled: false` to pause the REST polling while the consumer is\n * hidden (e.g. a closed modal).\n */\nexport function useLiveConversationMetrics(\n enabled: boolean = true,\n): MetricsState {\n // Per-field selectors rather than a bare `useMetricsStore()`: subscribing to\n // the whole store re-runs this hook on any store write, including the action\n // identity, and matches how `useContextWindowUsage` reads the same store.\n const storeCost = useMetricsStore((state) => state.cost);\n const storeMaxBudgetPerTask = useMetricsStore(\n (state) => state.max_budget_per_task,\n );\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 enabled,\n );\n\n return useMemo(() => {\n // Live store first: real-time and (post-reset) always the active\n // conversation's data. Any non-null field counts as data.\n if (storeCost !== null || storeUsage !== null) {\n return {\n cost: storeCost,\n max_budget_per_task: storeMaxBudgetPerTask,\n usage: storeUsage,\n };\n }\n\n if (conversationMetrics) {\n return {\n cost: conversationMetrics.accumulated_cost,\n max_budget_per_task: conversationMetrics.max_budget_per_task,\n usage: conversationMetrics.accumulated_token_usage\n ? {\n prompt_tokens:\n conversationMetrics.accumulated_token_usage.prompt_tokens ?? 0,\n completion_tokens:\n conversationMetrics.accumulated_token_usage.completion_tokens ??\n 0,\n cache_read_tokens:\n conversationMetrics.accumulated_token_usage.cache_read_tokens ??\n 0,\n cache_write_tokens:\n conversationMetrics.accumulated_token_usage\n .cache_write_tokens ?? 0,\n context_window:\n conversationMetrics.accumulated_token_usage.context_window ?? 0,\n per_turn_token:\n conversationMetrics.accumulated_token_usage.per_turn_token ?? 0,\n }\n : null,\n };\n }\n\n return {\n cost: null,\n max_budget_per_task: null,\n usage: null,\n };\n }, [conversationMetrics, storeCost, storeMaxBudgetPerTask, storeUsage]);\n}\n"],"mappings":";;;;;AAqBA,SAAgB,EACd,IAAmB,IACL;CAId,IAAM,IAAY,GAAiB,MAAU,EAAM,IAAI,GACjD,IAAwB,GAC3B,MAAU,EAAM,mBACnB,GACM,IAAa,GAAiB,MAAU,EAAM,KAAK,GACnD,EAAE,MAAM,MAAiB,EAAsB,GAE/C,EAAE,MAAM,MAAwB,EACpC,GAAc,IACd,GAAc,kBACd,GAAc,iBACd,CACF;CAEA,OAAO,QAGD,MAAc,QAAQ,MAAe,OAChC;EACL,MAAM;EACN,qBAAqB;EACrB,OAAO;CACT,IAGE,IACK;EACL,MAAM,EAAoB;EAC1B,qBAAqB,EAAoB;EACzC,OAAO,EAAoB,0BACvB;GACE,eACE,EAAoB,wBAAwB,iBAAiB;GAC/D,mBACE,EAAoB,wBAAwB,qBAC5C;GACF,mBACE,EAAoB,wBAAwB,qBAC5C;GACF,oBACE,EAAoB,wBACjB,sBAAsB;GAC3B,gBACE,EAAoB,wBAAwB,kBAAkB;GAChE,gBACE,EAAoB,wBAAwB,kBAAkB;EAClE,IACA;CACN,IAGK;EACL,MAAM;EACN,qBAAqB;EACrB,OAAO;CACT,GACC;EAAC;EAAqB;EAAW;EAAuB;CAAU,CAAC;AACxE"}
|