@openhands/agent-canvas 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
  4. package/build/assets/active-backend-context-IqOjobNK.js +2 -0
  5. package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DMrObcIS.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
  8. package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-BJVk92PU.js} +1 -1
  9. package/build/assets/agent-settings-COfJsQ1d.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-D8Fade_-.js} +1 -1
  12. package/build/assets/{app-settings-D0OKHB3M.js → app-settings-CpyGB3AT.js} +1 -1
  13. package/build/assets/{automation-detail-C0SxWTnQ.js → automation-detail-B-jQ39Mm.js} +1 -1
  14. package/build/assets/{automation-export-BjQa_fT6.js → automation-export-B1dywoqk.js} +1 -1
  15. package/build/assets/{automation-setup-route-BzCNpljP.js → automation-setup-route-C-bWUZBi.js} +1 -1
  16. package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DgpCGOJV.js} +1 -1
  17. package/build/assets/{automations-list-dZg8zOCl.js → automations-list-DnMxlxsL.js} +1 -1
  18. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
  19. package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-DiVrD4Cm.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
  21. package/build/assets/{badge-Dpn3-LTV.js → badge-CpYmcVZV.js} +1 -1
  22. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
  23. package/build/assets/bot-BQZx8e2i.js +1 -0
  24. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
  25. package/build/assets/browser-B9AbV6kG.js +7 -0
  26. package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-zAY12m_i.js} +1 -1
  27. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
  28. package/build/assets/check-WAFXrrs_.js +1 -0
  29. package/build/assets/chevron-down-CifNWzme.js +1 -0
  30. package/build/assets/circle-check-CtnimJa8.js +1 -0
  31. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
  32. package/build/assets/{cloud-funnel-analytics-CcSez21r.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
  33. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
  34. package/build/assets/{command-menu-BKOLj-TC.js → command-menu-BXy03FBl.js} +1 -1
  35. package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BmZa0ui_.js} +1 -1
  36. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
  37. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
  38. package/build/assets/conversation-BPo8SvLN.js +1 -0
  39. package/build/assets/conversation-CPCVsCUY.js +90 -0
  40. package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
  41. package/build/assets/{conversation-state-store-CtgILxWF.js → conversation-state-store-C5YpjMNy.js} +1 -1
  42. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  43. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
  44. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
  45. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
  46. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
  47. package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-CxFjRYqH.js} +2 -2
  48. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
  49. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
  50. package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-BqUINAhp.js} +1 -1
  51. package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-lraj88Wk.js} +1 -1
  52. package/build/assets/external-link-CgtpA_a1.js +1 -0
  53. package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
  54. package/build/assets/files-tab-DV0L-lFE.js +1 -0
  55. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
  56. package/build/assets/{format-relative-time-BerVamGl.js → format-relative-time-DSErAuVr.js} +1 -1
  57. package/build/assets/git-provider-icon-BvlLAche.js +1 -0
  58. package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-ByMzpNko.js} +1 -1
  59. package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
  60. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
  61. package/build/assets/{home-Y0aDou-a.js → home-BOrlwLqG.js} +1 -1
  62. package/build/assets/home-BvMNC6E-.js +1 -0
  63. package/build/assets/{home-store-Cubdq0uP.js → home-store-CxqsY9Fi.js} +1 -1
  64. package/build/assets/index-home-BvMNC6E-.js +1 -0
  65. package/build/assets/info-BRVcJAUg.js +1 -0
  66. package/build/assets/{install-server-modal-DW6dSyGr.js → install-server-modal-Bl4G1zF4.js} +1 -1
  67. package/build/assets/{kebab-menu-item-content-CKydZrbH.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
  68. package/build/assets/{launch-c4GEP8oo.js → launch-CkqiSCqi.js} +1 -1
  69. package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
  70. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
  71. package/build/assets/llm-settings-B-pkVCrt.js +1 -0
  72. package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
  73. package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
  74. package/build/assets/loader-circle-B47W9XqT.js +1 -0
  75. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
  76. package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-DhGk5mJt.js} +1 -1
  77. package/build/assets/manifest-653b89aa.js +1 -0
  78. package/build/assets/{manifest-subpage-layout-Ds7G5GZ8.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
  79. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
  80. package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
  81. package/build/assets/{mcp-Da7wFU7A.js → mcp-DCkvl6K0.js} +2 -2
  82. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
  83. package/build/assets/messages-DSXvyc21.js +40 -0
  84. package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
  85. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
  86. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
  87. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
  88. package/build/assets/{npm-Cswluf6-.js → npm-DLckoeJc.js} +1 -1
  89. package/build/assets/{onboarding-BKbTYlW1.js → onboarding-D7WDG66N.js} +1 -1
  90. package/build/assets/{onboarding-modal-DrrGlEQq.js → onboarding-modal-C_xVrFNv.js} +1 -1
  91. package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-D-s9z18a.js} +1 -1
  92. package/build/assets/pencil-BGOCPRyu.js +1 -0
  93. package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-AKaXIIfg.js} +1 -1
  94. package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-wtmY4QQw.js} +1 -1
  95. package/build/assets/plus-zNEL8rcX.js +1 -0
  96. package/build/assets/{profiles-service.api-vcE_jJCe.js → profiles-service.api-DCMYxHMi.js} +1 -1
  97. package/build/assets/{providers-CdrPPm0z.js → providers-BjrtjX4L.js} +1 -1
  98. package/build/assets/{proxy-b4aqL4SX.js → proxy-9Z_WZggZ.js} +1 -1
  99. package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
  100. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
  101. package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
  102. package/build/assets/root-CanxKlNV.css +1 -0
  103. package/build/assets/{root-CBBi6IAe.js → root-DkfG_UWR.js} +2 -2
  104. package/build/assets/root-layout-D75LHYhh.js +2 -0
  105. package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-OnM5Uob_.js} +1 -1
  106. package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-m5WQm2sy.js} +1 -1
  107. package/build/assets/search-CycosyjN.js +1 -0
  108. package/build/assets/{secrets-service-BHF4fxML.js → secrets-service-B26R61C1.js} +1 -1
  109. package/build/assets/{secrets-settings-aBGXtQhX.js → secrets-settings-CbLYCKOX.js} +1 -1
  110. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
  111. package/build/assets/{settings-CZPGNens.js → settings-BJQI_iBM.js} +1 -1
  112. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
  113. package/build/assets/{settings-index-Dtlegd6s.js → settings-index-BiTqJoH7.js} +1 -1
  114. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
  115. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
  116. package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-BIrIVn97.js} +1 -1
  117. package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api--rJmnuLa.js} +1 -1
  118. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
  119. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
  120. package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
  121. package/build/assets/shield-check-T3JsDJiM.js +1 -0
  122. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
  123. package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
  124. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
  125. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
  126. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
  127. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
  128. package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-Dc3JPW-8.js} +1 -1
  129. package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-CpTV27n3.js} +1 -1
  130. package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-CSW__IW4.js} +1 -1
  131. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
  132. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
  133. package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-mAHMOkUz.js} +1 -1
  134. package/build/assets/{terminal-DRrJo-cR.js → terminal-BzxBaHx2.js} +1 -1
  135. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
  136. package/build/assets/trash-2-C0xNVp9c.js +1 -0
  137. package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
  138. package/build/assets/usage-tab-tEmVN0KD.js +1 -0
  139. package/build/assets/{use-acp-credential-form-DGyo0QvL.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
  140. package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
  141. package/build/assets/{use-agent-profiles-B37XWDLq.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
  142. package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
  143. package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
  144. package/build/assets/{use-config-DapX3pjC.js → use-config-DKAMiI5R.js} +1 -1
  145. package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
  146. package/build/assets/{use-create-secret-DcpT3RPw.js → use-create-secret-2zBlCDsF.js} +1 -1
  147. package/build/assets/use-is-authed-C52-ivnB.js +1 -0
  148. package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
  149. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  150. package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
  151. package/build/assets/{use-manifest-capabilities-zihHDbMW.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
  152. package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
  153. package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-CEiak69h.js} +1 -1
  154. package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
  155. package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-DNmnbG6f.js} +1 -1
  156. package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
  157. package/build/assets/{use-settings-BmLzQjnC.js → use-settings-wCwPaSIv.js} +1 -1
  158. package/build/assets/{use-tracking-salbPJxT.js → use-tracking-CVwPmhlX.js} +1 -1
  159. package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-DVtfg0B_.js} +1 -1
  160. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
  161. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
  162. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
  163. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
  164. package/build/assets/utils-zxEjKE70.js +1 -0
  165. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  166. 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
  167. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
  168. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
  169. package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
  170. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
  171. 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
  172. 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
  173. 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
  174. 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
  175. package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-B8UMQ7MG.js} +1 -1
  176. package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
  177. package/build/assets/x-BWKA2Ver.js +1 -0
  178. package/build/assets/zap-DHddTPc0.js +1 -0
  179. package/build/index.html +4 -4
  180. package/build/locales/ar/openhands.json +28 -1
  181. package/build/locales/ca/openhands.json +28 -1
  182. package/build/locales/de/openhands.json +28 -1
  183. package/build/locales/en/openhands.json +28 -1
  184. package/build/locales/es/openhands.json +28 -1
  185. package/build/locales/fr/openhands.json +28 -1
  186. package/build/locales/it/openhands.json +28 -1
  187. package/build/locales/ja/openhands.json +28 -1
  188. package/build/locales/ko-KR/openhands.json +28 -1
  189. package/build/locales/no/openhands.json +28 -1
  190. package/build/locales/pt/openhands.json +28 -1
  191. package/build/locales/tr/openhands.json +28 -1
  192. package/build/locales/uk/openhands.json +28 -1
  193. package/build/locales/zh-CN/openhands.json +28 -1
  194. package/build/locales/zh-TW/openhands.json +28 -1
  195. package/config/defaults.json +3 -3
  196. package/dist/api/agent-server-compatibility.cjs +1 -1
  197. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  198. package/dist/api/agent-server-compatibility.js +1 -1
  199. package/dist/api/agent-server-compatibility.js.map +1 -1
  200. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  201. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  202. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  203. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  204. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  205. package/dist/api/llm-balance-service.cjs +2 -0
  206. package/dist/api/llm-balance-service.cjs.map +1 -0
  207. package/dist/api/llm-balance-service.d.ts +33 -0
  208. package/dist/api/llm-balance-service.js +53 -0
  209. package/dist/api/llm-balance-service.js.map +1 -0
  210. package/dist/api/llm-subscription-service.cjs +1 -1
  211. package/dist/api/llm-subscription-service.cjs.map +1 -1
  212. package/dist/api/llm-subscription-service.js +42 -34
  213. package/dist/api/llm-subscription-service.js.map +1 -1
  214. package/dist/components/conversation/index.cjs +1 -1
  215. package/dist/components/conversation/index.d.ts +0 -1
  216. package/dist/components/conversation/index.js +0 -1
  217. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  218. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  219. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  221. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  222. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  223. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  224. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  225. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  226. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  227. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  228. package/dist/components/conversation-events/chat/group-events.js +27 -26
  229. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  230. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  231. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  232. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  233. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  234. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  235. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  236. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  237. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  238. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  239. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  240. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  241. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  242. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  243. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  244. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  245. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  246. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  247. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  248. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  249. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  250. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  251. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  252. package/dist/components/features/chat/custom-chat-input.js +68 -67
  253. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  254. package/dist/components/features/chat/path-component.cjs +1 -1
  255. package/dist/components/features/chat/path-component.cjs.map +1 -1
  256. package/dist/components/features/chat/path-component.js +9 -6
  257. package/dist/components/features/chat/path-component.js.map +1 -1
  258. package/dist/components/features/chat/plan-preview.cjs +1 -1
  259. package/dist/components/features/chat/plan-preview.js +4 -4
  260. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  261. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  262. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  263. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  264. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  265. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  266. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  267. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  268. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  269. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  270. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  271. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  272. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  273. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  274. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  275. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  276. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  277. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  278. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  279. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  280. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  281. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  282. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  283. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  284. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  285. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  286. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  287. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  288. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  289. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  290. package/dist/components/features/conversation/conversation-name.js +69 -71
  291. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  292. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  293. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  294. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  295. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  296. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  297. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  298. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  299. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  300. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  301. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  302. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  303. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  304. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  305. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  306. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  307. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  308. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  309. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  310. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  311. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  312. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  313. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  314. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  315. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  316. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  317. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  318. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  319. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  320. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  321. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  322. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  323. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  324. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  325. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  326. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  327. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  328. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  329. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  330. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  331. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  332. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  333. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  334. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  335. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  336. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  337. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  338. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  339. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  340. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  341. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  342. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  343. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  344. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  345. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  346. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  347. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  348. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  349. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  350. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  351. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  352. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  353. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  354. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  355. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  356. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  357. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  358. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  359. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  360. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  361. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  362. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  363. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +25 -17
  364. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  365. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  366. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  367. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  368. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  369. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  370. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  371. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  372. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  373. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  374. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  375. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  376. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  377. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  378. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  379. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  380. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  381. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  382. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  383. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  384. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  386. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  387. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  388. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  389. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  391. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  392. package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
  393. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  394. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  395. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  396. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  397. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  398. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  399. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  400. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  401. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  402. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  403. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  404. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  405. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  406. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  407. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  408. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  409. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  410. package/dist/config/defaults.cjs +1 -1
  411. package/dist/config/defaults.cjs.map +1 -1
  412. package/dist/config/defaults.js +3 -3
  413. package/dist/config/defaults.js.map +1 -1
  414. package/dist/constants/llm-balance.cjs +2 -0
  415. package/dist/constants/llm-balance.cjs.map +1 -0
  416. package/dist/constants/llm-balance.d.ts +13 -0
  417. package/dist/constants/llm-balance.js +6 -0
  418. package/dist/constants/llm-balance.js.map +1 -0
  419. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  420. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  421. package/dist/contexts/conversation-websocket-context.js +217 -209
  422. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  423. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  424. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  425. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  426. package/dist/hooks/chat/use-grip-resize.js +39 -30
  427. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  428. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  429. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  430. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  431. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  432. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  433. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  434. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  435. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  436. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  437. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  438. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  439. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  440. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  441. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  442. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  443. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  444. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  445. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  446. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  447. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  448. package/dist/hooks/query/use-llm-balance.js +24 -0
  449. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  450. package/dist/hooks/query/use-search-providers.cjs +1 -1
  451. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  452. package/dist/hooks/query/use-search-providers.js +1 -1
  453. package/dist/hooks/query/use-search-providers.js.map +1 -1
  454. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  455. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  456. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  457. package/dist/hooks/use-await-context-compaction.js +61 -0
  458. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  459. package/dist/hooks/use-compact-context-action.cjs +2 -0
  460. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  461. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  462. package/dist/hooks/use-compact-context-action.js +61 -0
  463. package/dist/hooks/use-compact-context-action.js.map +1 -0
  464. package/dist/hooks/use-context-window-usage.cjs +2 -0
  465. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  466. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  467. package/dist/hooks/use-context-window-usage.js +20 -0
  468. package/dist/hooks/use-context-window-usage.js.map +1 -0
  469. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  470. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  471. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  472. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  473. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  474. package/dist/hooks/use-drag-resize.cjs +1 -1
  475. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  476. package/dist/hooks/use-drag-resize.d.ts +8 -0
  477. package/dist/hooks/use-drag-resize.js +21 -18
  478. package/dist/hooks/use-drag-resize.js.map +1 -1
  479. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  480. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  481. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  482. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  483. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  484. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  485. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  486. package/dist/hooks/use-select-conversation-tab.js +2 -2
  487. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  488. package/dist/i18n/declaration.cjs +1 -1
  489. package/dist/i18n/declaration.cjs.map +1 -1
  490. package/dist/i18n/declaration.d.ts +27 -0
  491. package/dist/i18n/declaration.js +1 -1
  492. package/dist/i18n/declaration.js.map +1 -1
  493. package/dist/i18n/translation.cjs +2 -2
  494. package/dist/i18n/translation.cjs.map +1 -1
  495. package/dist/i18n/translation.js +474 -15
  496. package/dist/i18n/translation.js.map +1 -1
  497. package/dist/index.cjs +1 -1
  498. package/dist/index.js +28 -29
  499. package/dist/lib/index.cjs +1 -1
  500. package/dist/lib/index.js +0 -1
  501. package/dist/locales/ar/openhands.json +28 -1
  502. package/dist/locales/ca/openhands.json +28 -1
  503. package/dist/locales/de/openhands.json +28 -1
  504. package/dist/locales/en/openhands.json +28 -1
  505. package/dist/locales/es/openhands.json +28 -1
  506. package/dist/locales/fr/openhands.json +28 -1
  507. package/dist/locales/it/openhands.json +28 -1
  508. package/dist/locales/ja/openhands.json +28 -1
  509. package/dist/locales/ko-KR/openhands.json +28 -1
  510. package/dist/locales/no/openhands.json +28 -1
  511. package/dist/locales/pt/openhands.json +28 -1
  512. package/dist/locales/tr/openhands.json +28 -1
  513. package/dist/locales/uk/openhands.json +28 -1
  514. package/dist/locales/zh-CN/openhands.json +28 -1
  515. package/dist/locales/zh-TW/openhands.json +28 -1
  516. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  517. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  518. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  519. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  520. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  522. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  523. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  524. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  525. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  526. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  527. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  528. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  529. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  530. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  531. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  532. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  533. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  534. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  535. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  536. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  537. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  538. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  539. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  540. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  541. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  542. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  543. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  544. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  545. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  546. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  547. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  548. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  549. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  550. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  551. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  552. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  553. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  554. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  557. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  558. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  559. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  560. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  561. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  562. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  563. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  564. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  565. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  566. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  567. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  568. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  569. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  570. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  571. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  572. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  573. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  574. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  575. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  576. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  577. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  578. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  579. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  580. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  581. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  582. package/dist/package.cjs +1 -1
  583. package/dist/package.cjs.map +1 -1
  584. package/dist/package.js +17 -16
  585. package/dist/package.js.map +1 -1
  586. package/dist/routes/usage-tab.cjs +2 -0
  587. package/dist/routes/usage-tab.cjs.map +1 -0
  588. package/dist/routes/usage-tab.d.ts +2 -0
  589. package/dist/routes/usage-tab.js +10 -0
  590. package/dist/routes/usage-tab.js.map +1 -0
  591. package/dist/services/child-conversation-launch.cjs +1 -1
  592. package/dist/services/child-conversation-launch.cjs.map +1 -1
  593. package/dist/services/child-conversation-launch.js +11 -5
  594. package/dist/services/child-conversation-launch.js.map +1 -1
  595. package/dist/stores/archived-conversations-store.cjs +2 -0
  596. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  597. package/dist/stores/archived-conversations-store.d.ts +24 -0
  598. package/dist/stores/archived-conversations-store.js +33 -0
  599. package/dist/stores/archived-conversations-store.js.map +1 -0
  600. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  601. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  602. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  603. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  604. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  605. package/dist/stores/conversation-store.cjs.map +1 -1
  606. package/dist/stores/conversation-store.d.ts +1 -1
  607. package/dist/stores/conversation-store.js.map +1 -1
  608. package/dist/stores/metrics-store.cjs +1 -1
  609. package/dist/stores/metrics-store.cjs.map +1 -1
  610. package/dist/stores/metrics-store.d.ts +1 -0
  611. package/dist/stores/metrics-store.js +7 -4
  612. package/dist/stores/metrics-store.js.map +1 -1
  613. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  614. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  615. package/dist/types/agent-server/type-guards.cjs +1 -1
  616. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  617. package/dist/types/agent-server/type-guards.d.ts +5 -0
  618. package/dist/types/agent-server/type-guards.js +3 -3
  619. package/dist/types/agent-server/type-guards.js.map +1 -1
  620. package/dist/utils/conversation-local-storage.cjs +1 -1
  621. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  622. package/dist/utils/conversation-local-storage.js +2 -1
  623. package/dist/utils/conversation-local-storage.js.map +1 -1
  624. package/dist/utils/format-token-count.cjs +2 -0
  625. package/dist/utils/format-token-count.cjs.map +1 -0
  626. package/dist/utils/format-token-count.d.ts +3 -0
  627. package/dist/utils/format-token-count.js +19 -0
  628. package/dist/utils/format-token-count.js.map +1 -0
  629. package/dist/utils/hover-reveal-classes.cjs +2 -0
  630. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  631. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  632. package/dist/utils/hover-reveal-classes.js +41 -0
  633. package/dist/utils/hover-reveal-classes.js.map +1 -0
  634. package/dist/utils/is-markdown-file-path.cjs +2 -0
  635. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  636. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  637. package/dist/utils/is-markdown-file-path.js +14 -0
  638. package/dist/utils/is-markdown-file-path.js.map +1 -0
  639. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  640. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  641. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  642. package/dist/utils/mcp-marketplace-utils.js +19 -16
  643. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  644. package/dist/utils/transcript-export/index.cjs +3 -3
  645. package/dist/utils/transcript-export/index.cjs.map +1 -1
  646. package/dist/utils/transcript-export/index.js +12 -12
  647. package/dist/utils/transcript-export/index.js.map +1 -1
  648. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  649. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  650. package/dist/utils/transcript-export/load-complete-events.js +4 -4
  651. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  652. package/dist/utils/workspace-relative-path.cjs +2 -0
  653. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  654. package/dist/utils/workspace-relative-path.d.ts +10 -0
  655. package/dist/utils/workspace-relative-path.js +22 -0
  656. package/dist/utils/workspace-relative-path.js.map +1 -0
  657. package/package.json +17 -16
  658. package/scripts/check-sdk-version-sync.mjs +6 -6
  659. package/scripts/dev-process-utils.mjs +6 -1
  660. package/scripts/dev-safe.mjs +57 -2
  661. package/build/assets/active-backend-context-B_bg5h9O.js +0 -2
  662. package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
  663. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
  664. package/build/assets/agent-settings-D_SVrWhI.js +0 -1
  665. package/build/assets/bot-DuN83i3p.js +0 -1
  666. package/build/assets/browser--eoQOo4M.js +0 -6
  667. package/build/assets/check-DLOKoFU9.js +0 -1
  668. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  669. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  670. package/build/assets/conversation-Cmyw9bFh.js +0 -90
  671. package/build/assets/conversation-CvoGZ5vC.js +0 -1
  672. package/build/assets/conversation-panel-CvoGZ5vC.js +0 -1
  673. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  674. package/build/assets/external-link-zWbg5KXS.js +0 -1
  675. package/build/assets/files-tab-D5zuU5TY.js +0 -1
  676. package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
  677. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
  678. package/build/assets/home-DqyeeFA_.js +0 -1
  679. package/build/assets/index-home-DqyeeFA_.js +0 -1
  680. package/build/assets/info-C9lpK5pw.js +0 -1
  681. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
  682. package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
  683. package/build/assets/llm-settings-D9ko42Pi.js +0 -1
  684. package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
  685. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  686. package/build/assets/manifest-e1c3bc3b.js +0 -1
  687. package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
  688. package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
  689. package/build/assets/messages-B2l0qLVk.js +0 -40
  690. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  691. package/build/assets/plus-CtzlyAoF.js +0 -1
  692. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +0 -1
  693. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  694. package/build/assets/root-CRK9fOFd.css +0 -1
  695. package/build/assets/root-layout-BFN2rCOy.js +0 -2
  696. package/build/assets/search-CYaiKHRp.js +0 -1
  697. package/build/assets/shared-conversation-BIAcuORk.js +0 -1
  698. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  699. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  700. package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
  701. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  702. package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
  703. package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
  704. package/build/assets/utils-DPQfkd-7.js +0 -1
  705. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  706. package/build/assets/x-RYDBg-e2.js +0 -1
  707. package/build/assets/zap-tbKDzCe3.js +0 -1
  708. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  709. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  710. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  711. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  712. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  713. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  714. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  715. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  716. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  717. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  718. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  719. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  720. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  721. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  722. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  723. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  724. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  725. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  726. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  727. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  728. package/dist/icons/u-credit-card.cjs +0 -2
  729. package/dist/icons/u-credit-card.cjs.map +0 -1
  730. package/dist/icons/u-credit-card.js +0 -21
  731. package/dist/icons/u-credit-card.js.map +0 -1
  732. /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,61 @@
1
+ import { isCondensationEvent as e } from "../types/agent-server/type-guards.js";
2
+ import { useEventStore as t } from "../stores/use-event-store.js";
3
+ import n from "../stores/metrics-store.js";
4
+ import { useEffect as r, useRef as i } from "react";
5
+ //#region src/hooks/use-await-context-compaction.ts
6
+ var a = 2500, o = 9e4;
7
+ function s(e, t, n) {
8
+ return {
9
+ beforeToken: e,
10
+ afterToken: t,
11
+ savedToken: Math.max(0, e - t),
12
+ outcome: n
13
+ };
14
+ }
15
+ function c({ beforeToken: c, baselineEventIds: l, onComplete: u, timeoutMs: d = o }) {
16
+ let f = i(u);
17
+ f.current = u, r(() => {
18
+ if (c === null) return;
19
+ let r = !1, i = !1, o, u = l ? new Set(l) : new Set(t.getState().eventIds), p = () => n.getState().usage?.per_turn_token ?? c, m = (e, t) => {
20
+ r || (r = !0, f.current(s(c, e, t)));
21
+ }, h = () => {
22
+ let e = p();
23
+ return i && e < c ? (m(e, "compacted"), !0) : !1;
24
+ }, g = () => {
25
+ clearTimeout(o), o = setTimeout(() => {
26
+ m(p(), "no_change");
27
+ }, a);
28
+ }, _ = () => {
29
+ for (let n of t.getState().events) {
30
+ let t = "id" in n ? n.id : void 0;
31
+ if (t !== void 0) {
32
+ if (u.has(t)) continue;
33
+ u.add(t);
34
+ }
35
+ if (e(n)) {
36
+ i = !0, h() || g();
37
+ return;
38
+ }
39
+ }
40
+ };
41
+ _();
42
+ let v = t.subscribe(() => {
43
+ r || _();
44
+ }), y = n.subscribe(() => {
45
+ r || h() && clearTimeout(o);
46
+ }), b = setTimeout(() => {
47
+ m(p(), i ? "no_change" : "timeout");
48
+ }, d);
49
+ return () => {
50
+ r = !0, v(), y(), clearTimeout(o), clearTimeout(b);
51
+ };
52
+ }, [
53
+ c,
54
+ l,
55
+ d
56
+ ]);
57
+ }
58
+ //#endregion
59
+ export { c as useAwaitContextCompaction };
60
+
61
+ //# sourceMappingURL=use-await-context-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-await-context-compaction.js","names":[],"sources":["../../src/hooks/use-await-context-compaction.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { isCondensationEvent } from \"#/types/agent-server/type-guards\";\n\n/** How long to wait after a Condensation event for a lower per_turn_token. */\nconst METRICS_SETTLE_MS = 2_500;\n/** Give up waiting for condensation / metrics and surface whatever we have. */\nconst DEFAULT_TIMEOUT_MS = 90_000;\n\nexport type ContextCompactionOutcome = \"compacted\" | \"no_change\" | \"timeout\";\n\nexport interface ContextCompactionResult {\n beforeToken: number;\n afterToken: number;\n savedToken: number;\n /**\n * \"compacted\" — a Condensation event landed and per_turn_token dropped.\n * \"no_change\" — a Condensation event landed but no token drop was measured.\n * \"timeout\" — no Condensation event arrived in time; compaction did not\n * happen (or was never processed), so this is a failure, not a no-op.\n */\n outcome: ContextCompactionOutcome;\n}\n\nexport function buildContextCompactionResult(\n beforeToken: number,\n afterToken: number,\n outcome: ContextCompactionOutcome,\n): ContextCompactionResult {\n return {\n beforeToken,\n afterToken,\n savedToken: Math.max(0, beforeToken - afterToken),\n outcome,\n };\n}\n\ninterface UseAwaitContextCompactionOptions {\n /**\n * Snapshot of `per_turn_token` taken when compaction was requested.\n * Pass `null` when not awaiting a result.\n */\n beforeToken: number | null;\n /**\n * Event ids that predate the compaction *request*. The condense POST can\n * return only after the server already emitted its Condensation event, so\n * snapshotting \"known\" ids when this effect starts would miss fast\n * condensations; the baseline must be captured before the request fires.\n * When omitted, falls back to the ids present when the effect starts.\n */\n baselineEventIds?: Set<string | number> | null;\n onComplete: (result: ContextCompactionResult) => void;\n timeoutMs?: number;\n}\n\n/**\n * Waits for a post-request Condensation event (and ideally a lower\n * `per_turn_token` in the live metrics store), then reports how many tokens\n * were freed. The HTTP `/condense` ack only means work *started*.\n */\nexport function useAwaitContextCompaction({\n beforeToken,\n baselineEventIds,\n onComplete,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n}: UseAwaitContextCompactionOptions) {\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n\n useEffect(() => {\n if (beforeToken === null) {\n return undefined;\n }\n\n let completed = false;\n let sawCondensation = false;\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const knownEventIds = baselineEventIds\n ? new Set(baselineEventIds)\n : new Set(useEventStore.getState().eventIds);\n\n const readAfterToken = () =>\n useMetricsStore.getState().usage?.per_turn_token ?? beforeToken;\n\n const finish = (afterToken: number, outcome: ContextCompactionOutcome) => {\n if (completed) {\n return;\n }\n completed = true;\n onCompleteRef.current(\n buildContextCompactionResult(beforeToken, afterToken, outcome),\n );\n };\n\n const finishFromMetricsIfReady = () => {\n const afterToken = readAfterToken();\n if (sawCondensation && afterToken < beforeToken) {\n finish(afterToken, \"compacted\");\n return true;\n }\n return false;\n };\n\n const scheduleSettleFinish = () => {\n clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n finish(readAfterToken(), \"no_change\");\n }, METRICS_SETTLE_MS);\n };\n\n const scanForNewCondensation = () => {\n for (const event of useEventStore.getState().events) {\n const eventId = \"id\" in event ? event.id : undefined;\n if (eventId !== undefined) {\n if (knownEventIds.has(eventId)) {\n continue;\n }\n knownEventIds.add(eventId);\n }\n if (!isCondensationEvent(event)) {\n continue;\n }\n sawCondensation = true;\n if (!finishFromMetricsIfReady()) {\n scheduleSettleFinish();\n }\n return;\n }\n };\n\n scanForNewCondensation();\n\n const unsubscribeEvents = useEventStore.subscribe(() => {\n if (completed) {\n return;\n }\n scanForNewCondensation();\n });\n\n const unsubscribeMetrics = useMetricsStore.subscribe(() => {\n if (completed) {\n return;\n }\n if (finishFromMetricsIfReady()) {\n clearTimeout(settleTimer);\n }\n });\n\n const timeoutTimer = setTimeout(() => {\n // No Condensation event in time means the compaction never landed —\n // a failure, not a \"nothing to compact\" no-op.\n finish(readAfterToken(), sawCondensation ? \"no_change\" : \"timeout\");\n }, timeoutMs);\n\n return () => {\n completed = true;\n unsubscribeEvents();\n unsubscribeMetrics();\n clearTimeout(settleTimer);\n clearTimeout(timeoutTimer);\n };\n }, [beforeToken, baselineEventIds, timeoutMs]);\n}\n"],"mappings":";;;;;AAMA,IAAM,IAAoB,MAEpB,IAAqB;AAiB3B,SAAgB,EACd,GACA,GACA,GACyB;CACzB,OAAO;EACL;EACA;EACA,YAAY,KAAK,IAAI,GAAG,IAAc,CAAU;EAChD;CACF;AACF;AAyBA,SAAgB,EAA0B,EACxC,gBACA,qBACA,eACA,eAAY,KACuB;CACnC,IAAM,IAAgB,EAAO,CAAU;CAGvC,AAFA,EAAc,UAAU,GAExB,QAAgB;EACd,IAAI,MAAgB,MAClB;EAGF,IAAI,IAAY,IACZ,IAAkB,IAClB,GACE,IAAgB,IAClB,IAAI,IAAI,CAAgB,IACxB,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvC,UACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB,GAEhD,KAAU,GAAoB,MAAsC;GACpE,MAGJ,IAAY,IACZ,EAAc,QACZ,EAA6B,GAAa,GAAY,CAAO,CAC/D;EACF,GAEM,UAAiC;GACrC,IAAM,IAAa,EAAe;GAKlC,OAJI,KAAmB,IAAa,KAClC,EAAO,GAAY,WAAW,GACvB,MAEF;EACT,GAEM,UAA6B;GAEjC,AADA,aAAa,CAAW,GACxB,IAAc,iBAAiB;IAC7B,EAAO,EAAe,GAAG,WAAW;GACtC,GAAG,CAAiB;EACtB,GAEM,UAA+B;GACnC,KAAK,IAAM,KAAS,EAAc,SAAS,EAAE,QAAQ;IACnD,IAAM,IAAU,QAAQ,IAAQ,EAAM,KAAK,KAAA;IAC3C,IAAI,MAAY,KAAA,GAAW;KACzB,IAAI,EAAc,IAAI,CAAO,GAC3B;KAEF,EAAc,IAAI,CAAO;IAC3B;IACK,MAAoB,CAAK,GAI9B;KADA,IAAkB,IACb,EAAyB,KAC5B,EAAqB;KAEvB;IAFuB;GAGzB;EACF;EAEA,EAAuB;EAEvB,IAAM,IAAoB,EAAc,gBAAgB;GAClD,KAGJ,EAAuB;EACzB,CAAC,GAEK,IAAqB,EAAgB,gBAAgB;GACrD,KAGA,EAAyB,KAC3B,aAAa,CAAW;EAE5B,CAAC,GAEK,IAAe,iBAAiB;GAGpC,EAAO,EAAe,GAAG,IAAkB,cAAc,SAAS;EACpE,GAAG,CAAS;EAEZ,aAAa;GAKX,AAJA,IAAY,IACZ,EAAkB,GAClB,EAAmB,GACnB,aAAa,CAAW,GACxB,aAAa,CAAY;EAC3B;CACF,GAAG;EAAC;EAAa;EAAkB;CAAS,CAAC;AAC/C"}
@@ -0,0 +1,2 @@
1
+ const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../i18n/declaration.cjs"),r=require("../types/agent-state.cjs"),i=require("../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),a=require("../utils/retrieve-axios-error-message.cjs"),o=require("../utils/custom-toast-handlers.cjs"),s=require("../stores/use-event-store.cjs"),c=require("../stores/metrics-store.cjs"),l=require("./query/use-active-conversation.cjs"),u=require("./use-agent-state.cjs"),d=require("./mutation/use-condense-conversation.cjs"),f=require("./use-await-context-compaction.cjs"),p=require("../utils/format-token-count.cjs");let m=require("react");m=e.__toESM(m,1);function h(e=0){let{t:h}=t.useTranslation(`openhands`),g=i.useQueryClient(),{data:_}=l.useActiveConversation(),{curAgentState:v}=u.useAgentState(),{mutate:y,isPending:b}=d.useCondenseConversation(),[x,S]=m.default.useState(null),C=m.default.useRef(null),w=v===r.AgentState.RUNNING||v===r.AgentState.LOADING,T=b||x!==null,E=!_?.id||w||T,D=h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION),O=m.default.useEffectEvent(e=>{if(S(null),C.current=null,_?.id&&g.invalidateQueries({queryKey:[`conversation-metrics`,_.id]}),e.outcome===`timeout`){o.displayErrorToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));return}if(e.savedToken>0){o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE,{saved:p.formatCompactTokenCount(e.savedToken),before:p.formatCompactTokenCount(e.beforeToken),after:p.formatCompactTokenCount(e.afterToken)}));return}o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE))});return f.useAwaitContextCompaction({beforeToken:x,baselineEventIds:x===null?null:C.current,onComplete:O}),{handleCompact:()=>{if(!_?.id||T)return;let t=c.default.getState().usage?.per_turn_token??e;C.current=new Set(s.useEventStore.getState().eventIds),y({conversationId:_.id,conversationUrl:_.conversation_url,sessionApiKey:_.session_api_key},{onSuccess:()=>{S(t),o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED))},onError:e=>{S(null),C.current=null,o.displayErrorToast(a.retrieveAxiosErrorMessage(e)||h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED))}})},isCompacting:T,isDisabled:E,description:D}}exports.useCompactContextAction=h;
2
+ //# sourceMappingURL=use-compact-context-action.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-compact-context-action.cjs","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":"wuBAyBA,SAAgB,EAAwB,EAAuB,EAAG,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAc,EAAA,eAAe,EAC7B,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,CAAE,iBAAkB,EAAA,cAAc,EAClC,CAAE,OAAQ,EAAU,aAAc,EAAA,wBAAwB,EAC1D,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAwB,IAAI,EAClE,EAAsB,EAAA,QAAM,OAAoC,IAAI,EAEpE,EACJ,IAAkB,EAAA,WAAW,SAC7B,IAAkB,EAAA,WAAW,QACzB,EAAe,GAAa,IAAgB,KAC5C,EAAa,CAAC,GAAc,IAAM,GAAe,EACjD,EAAc,EAAE,EAAA,QAAQ,wCAAwC,EAEhE,EAA2B,EAAA,QAAM,eACpC,GAAoC,CASnC,GARA,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC1B,GAAc,IAChB,EAAY,kBAAkB,CAC5B,SAAU,CAAC,uBAAwB,EAAa,EAAE,CACpD,CAAC,EAGC,EAAO,UAAY,UAAW,CAChC,EAAA,kBAAkB,EAAE,EAAA,QAAQ,mCAAmC,CAAC,EAChE,MACF,CAEA,GAAI,EAAO,WAAa,EAAG,CACzB,EAAA,oBACE,EAAE,EAAA,QAAQ,sCAAuC,CAC/C,MAAO,EAAA,wBAAwB,EAAO,UAAU,EAChD,OAAQ,EAAA,wBAAwB,EAAO,WAAW,EAClD,MAAO,EAAA,wBAAwB,EAAO,UAAU,CAClD,CAAC,CACH,EACA,MACF,CAEA,EAAA,oBACE,EAAE,EAAA,QAAQ,+CAA+C,CAC3D,CACF,CACF,EAyCA,OAvCA,EAAA,0BAA0B,CACxB,cACA,iBAAkB,IAAgB,KAAqC,KAA9B,EAAoB,QAC7D,WAAY,CACd,CAAC,EAmCM,CACL,kBAlC0B,CAC1B,GAAI,CAAC,GAAc,IAAM,EAAc,OAEvC,IAAM,EACJ,EAAA,QAAgB,SAAS,EAAE,OAAO,gBAAkB,EAItD,EAAoB,QAAU,IAAI,IAAI,EAAA,cAAc,SAAS,EAAE,QAAQ,EAEvE,EACE,CACE,eAAgB,EAAa,GAC7B,gBAAiB,EAAa,iBAC9B,cAAe,EAAa,eAC9B,EACA,CACE,cAAiB,CACf,EAAe,CAAQ,EACvB,EAAA,oBAAoB,EAAE,EAAA,QAAQ,oCAAoC,CAAC,CACrE,EACA,QAAU,GAAU,CAClB,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC9B,EAAA,kBACE,EAAA,0BAA0B,CAAK,GAC7B,EAAE,EAAA,QAAQ,mCAAmC,CACjD,CACF,CACF,CACF,CACF,EAIE,eACA,aACA,aACF,CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared compact/condense action used by the Usage panel CTA and the
3
+ * composer context-window popover.
4
+ */
5
+ export declare function useCompactContextAction(perTurnToken?: number): {
6
+ handleCompact: () => void;
7
+ isCompacting: boolean;
8
+ isDisabled: boolean;
9
+ description: string;
10
+ };
@@ -0,0 +1,61 @@
1
+ import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../i18n/declaration.js";
3
+ import { AgentState as n } from "../types/agent-state.js";
4
+ import { useQueryClient as r } from "../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
5
+ import { retrieveAxiosErrorMessage as i } from "../utils/retrieve-axios-error-message.js";
6
+ import { displayErrorToast as a, displaySuccessToast as o } from "../utils/custom-toast-handlers.js";
7
+ import { useEventStore as s } from "../stores/use-event-store.js";
8
+ import c from "../stores/metrics-store.js";
9
+ import { useActiveConversation as l } from "./query/use-active-conversation.js";
10
+ import { useAgentState as u } from "./use-agent-state.js";
11
+ import { useCondenseConversation as d } from "./mutation/use-condense-conversation.js";
12
+ import { useAwaitContextCompaction as f } from "./use-await-context-compaction.js";
13
+ import { formatCompactTokenCount as p } from "../utils/format-token-count.js";
14
+ import m from "react";
15
+ //#region src/hooks/use-compact-context-action.ts
16
+ function h(h = 0) {
17
+ let { t: g } = e("openhands"), _ = r(), { data: v } = l(), { curAgentState: y } = u(), { mutate: b, isPending: x } = d(), [S, C] = m.useState(null), w = m.useRef(null), T = y === n.RUNNING || y === n.LOADING, E = x || S !== null, D = !v?.id || T || E, O = g(t.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION), k = m.useEffectEvent((e) => {
18
+ if (C(null), w.current = null, v?.id && _.invalidateQueries({ queryKey: ["conversation-metrics", v.id] }), e.outcome === "timeout") {
19
+ a(g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
20
+ return;
21
+ }
22
+ if (e.savedToken > 0) {
23
+ o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {
24
+ saved: p(e.savedToken),
25
+ before: p(e.beforeToken),
26
+ after: p(e.afterToken)
27
+ }));
28
+ return;
29
+ }
30
+ o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE));
31
+ });
32
+ return f({
33
+ beforeToken: S,
34
+ baselineEventIds: S === null ? null : w.current,
35
+ onComplete: k
36
+ }), {
37
+ handleCompact: () => {
38
+ if (!v?.id || E) return;
39
+ let e = c.getState().usage?.per_turn_token ?? h;
40
+ w.current = new Set(s.getState().eventIds), b({
41
+ conversationId: v.id,
42
+ conversationUrl: v.conversation_url,
43
+ sessionApiKey: v.session_api_key
44
+ }, {
45
+ onSuccess: () => {
46
+ C(e), o(g(t.CONVERSATION$COMPACT_CONTEXT_STARTED));
47
+ },
48
+ onError: (e) => {
49
+ C(null), w.current = null, a(i(e) || g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
50
+ }
51
+ });
52
+ },
53
+ isCompacting: E,
54
+ isDisabled: D,
55
+ description: O
56
+ };
57
+ }
58
+ //#endregion
59
+ export { h as useCompactContextAction };
60
+
61
+ //# sourceMappingURL=use-compact-context-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-compact-context-action.js","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,SAAgB,EAAwB,IAAuB,GAAG;CAChE,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAe,GAC7B,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,qBAAkB,EAAc,GAClC,EAAE,QAAQ,GAAU,iBAAc,EAAwB,GAC1D,CAAC,GAAa,KAAkB,EAAM,SAAwB,IAAI,GAClE,IAAsB,EAAM,OAAoC,IAAI,GAEpE,IACJ,MAAkB,EAAW,WAC7B,MAAkB,EAAW,SACzB,IAAe,KAAa,MAAgB,MAC5C,IAAa,CAAC,GAAc,MAAM,KAAe,GACjD,IAAc,EAAE,EAAQ,wCAAwC,GAEhE,IAA2B,EAAM,gBACpC,MAAoC;EASnC,IARA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC1B,GAAc,MAChB,EAAY,kBAAkB,EAC5B,UAAU,CAAC,wBAAwB,EAAa,EAAE,EACpD,CAAC,GAGC,EAAO,YAAY,WAAW;GAChC,EAAkB,EAAE,EAAQ,mCAAmC,CAAC;GAChE;EACF;EAEA,IAAI,EAAO,aAAa,GAAG;GACzB,EACE,EAAE,EAAQ,uCAAuC;IAC/C,OAAO,EAAwB,EAAO,UAAU;IAChD,QAAQ,EAAwB,EAAO,WAAW;IAClD,OAAO,EAAwB,EAAO,UAAU;GAClD,CAAC,CACH;GACA;EACF;EAEA,EACE,EAAE,EAAQ,+CAA+C,CAC3D;CACF,CACF;CAyCA,OAvCA,EAA0B;EACxB;EACA,kBAAkB,MAAgB,OAAqC,OAA9B,EAAoB;EAC7D,YAAY;CACd,CAAC,GAmCM;EACL,qBAlC0B;GAC1B,IAAI,CAAC,GAAc,MAAM,GAAc;GAEvC,IAAM,IACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB;GAMtD,AAFA,EAAoB,UAAU,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvE,EACE;IACE,gBAAgB,EAAa;IAC7B,iBAAiB,EAAa;IAC9B,eAAe,EAAa;GAC9B,GACA;IACE,iBAAiB;KAEf,AADA,EAAe,CAAQ,GACvB,EAAoB,EAAE,EAAQ,oCAAoC,CAAC;IACrE;IACA,UAAU,MAAU;KAGlB,AAFA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC9B,EACE,EAA0B,CAAK,KAC7B,EAAE,EAAQ,mCAAmC,CACjD;IACF;GACF,CACF;EACF;EAIE;EACA;EACA;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../stores/metrics-store.cjs"),t=require("./query/use-active-conversation.cjs"),n=require("./query/use-conversation-metrics.cjs");let r=require("react");function i(e){let t=e?.context_window??0;return t<=0?null:{perTurnToken:e?.per_turn_token??0,contextWindow:t}}function a(){let a=e.default(e=>e.usage),{data:o}=t.useActiveConversation(),{data:s}=n.useConversationMetrics(o?.id,o?.conversation_url,o?.session_api_key,!!o?.id);return(0,r.useMemo)(()=>i(a)||i(s?.accumulated_token_usage??null),[a,s])}exports.useContextWindowUsage=a;
2
+ //# sourceMappingURL=use-context-window-usage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-context-window-usage.cjs","names":[],"sources":["../../src/hooks/use-context-window-usage.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\nexport interface ContextWindowUsage {\n perTurnToken: number;\n contextWindow: number;\n}\n\nfunction toContextWindowUsage(\n usage:\n | {\n per_turn_token?: number | null;\n context_window?: number | null;\n }\n | null\n | undefined,\n): ContextWindowUsage | null {\n const contextWindow = usage?.context_window ?? 0;\n if (contextWindow <= 0) {\n return null;\n }\n\n return {\n perTurnToken: usage?.per_turn_token ?? 0,\n contextWindow,\n };\n}\n\nexport function useContextWindowUsage(): ContextWindowUsage | null {\n const storeUsage = useMetricsStore((state) => state.usage);\n const { data: conversation } = useActiveConversation();\n\n const { data: conversationMetrics } = useConversationMetrics(\n conversation?.id,\n conversation?.conversation_url,\n conversation?.session_api_key,\n Boolean(conversation?.id),\n );\n\n return useMemo(() => {\n const fromStore = toContextWindowUsage(storeUsage);\n if (fromStore) {\n return fromStore;\n }\n\n return toContextWindowUsage(\n conversationMetrics?.accumulated_token_usage ?? null,\n );\n }, [storeUsage, conversationMetrics]);\n}\n"],"mappings":"sNAUA,SAAS,EACP,EAO2B,CAC3B,IAAM,EAAgB,GAAO,gBAAkB,EAK/C,OAJI,GAAiB,EACZ,KAGF,CACL,aAAc,GAAO,gBAAkB,EACvC,eACF,CACF,CAEA,SAAgB,GAAmD,CACjE,IAAM,EAAa,EAAA,QAAiB,GAAU,EAAM,KAAK,EACnD,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAE/C,CAAE,KAAM,GAAwB,EAAA,uBACpC,GAAc,GACd,GAAc,iBACd,GAAc,gBACd,EAAQ,GAAc,EACxB,EAEA,OAAA,EAAA,EAAA,aACoB,EAAqB,CACnC,GAIG,EACL,GAAqB,yBAA2B,IAClD,EACC,CAAC,EAAY,CAAmB,CAAC,CACtC"}
@@ -0,0 +1,5 @@
1
+ export interface ContextWindowUsage {
2
+ perTurnToken: number;
3
+ contextWindow: number;
4
+ }
5
+ export declare function useContextWindowUsage(): ContextWindowUsage | null;
@@ -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"),n=require("../i18n/declaration.cjs"),r=require("../utils/status.cjs"),ee=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("../stores/metrics-store.cjs"),te=require("./query/use-active-conversation.cjs"),l=require("./mutation/use-delete-conversation.cjs"),u=require("./mutation/use-unified-stop-conversation.cjs"),d=require("./mutation/use-update-conversation-public-flag.cjs"),f=require("./use-download-conversation.cjs"),p=require("../utils/system-message-adapter.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}=ee.useNavigation(),{backend:x}=a.useActiveBackend(),S=o.useEventStore(e=>e.events),{mutate:C}=l.useDeleteConversation(),{mutate:w}=u.useUnifiedPauseConversation(),{mutate:T}=d.useUpdateConversationPublicFlag(),{data:E}=te.useActiveConversation(),D=c.default(),[O,k]=m.default.useState(!1),[A,j]=m.default.useState(!1),[M,N]=m.default.useState(!1),[P,F]=m.default.useState(!1),[I,L]=m.default.useState(!1),[R,z]=m.default.useState(!1),[B,V]=m.default.useState(!1),{mutateAsync:H}=f.useDownloadConversation(),U=p.adaptSystemMessage(S),W=e=>{e.preventDefault(),e.stopPropagation(),z(!0),_?.(!1)},G=e=>{e.preventDefault(),e.stopPropagation(),V(!0),_?.(!1)},K=()=>{e&&C({conversationId:e},{onSuccess:()=>{e===y&&b(`/conversations`)}}),z(!1)},q=()=>{e&&w({conversationId:e}),V(!1)},J=e=>{e.preventDefault(),e.stopPropagation(),_?.(!1)},Y=async t=>{t.preventDefault(),t.stopPropagation(),e&&await H(e),_?.(!1)},X=e=>{e.stopPropagation(),k(!0),_?.(!1)},Z=e=>{e.stopPropagation(),j(!0),_?.(!1)},Q=e=>{e.stopPropagation(),N(!0),_?.(!1)},ne=e=>{e.stopPropagation(),F(!0),_?.(!1)},re=e=>{e.stopPropagation(),L(!0),_?.(!1)},ie=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:W,handleStop:G,handleEdit:J,handleDownloadConversation:Y,handleDisplayCost:X,handleShowAgentTools:Z,handleShowSkills:Q,handleShowPlugins:ne,handleShowHooks:re,handleTogglePublic:ie,handleCopyShareLink:e=>{if(e.preventDefault(),e.stopPropagation(),!$){_?.(!1);return}navigator.clipboard.writeText($),i.displaySuccessToast(v(n.I18nKey.CONVERSATION$LINK_COPIED))},shareUrl:$,handleConfirmDelete:K,handleConfirmStop:q,metricsModalVisible:O,setMetricsModalVisible:k,systemModalVisible:A,setSystemModalVisible:j,skillsModalVisible:M,setSkillsModalVisible:N,pluginsModalVisible:P,setPluginsModalVisible:F,hooksModalVisible:I,setHooksModalVisible:L,confirmDeleteModalVisible:R,setConfirmDeleteModalVisible:z,confirmStopModalVisible:B,setConfirmStopModalVisible:V,metrics:D,systemMessage:U,shouldShowStop:r.isExecutionActive(h),shouldShowDownloadConversation:!!(e&&g),shouldShowDisplayCost:g,shouldShowAgentTools:!!(g&&U),shouldShowSkills:!!(g&&e),shouldShowPlugins:!!(g&&e&&(s.getStoredConversationMetadata(e)?.plugins?.length??0)>0),shouldShowHooks:!!(g&&e&&r.isExecutionActive(h))}}exports.useConversationNameContextMenu=h;
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 r } from "../context/navigation-context.js";
5
- import { displaySuccessToast as ee } from "../utils/custom-toast-handlers.js";
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 "../stores/metrics-store.js";
10
- import { useActiveConversation as c } from "./query/use-active-conversation.js";
11
- import { useDeleteConversation as te } from "./mutation/use-delete-conversation.js";
12
- import { useUnifiedPauseConversation as l } from "./mutation/use-unified-stop-conversation.js";
13
- import { useUpdateConversationPublicFlag as u } from "./mutation/use-update-conversation-public-flag.js";
14
- import { useDownloadConversation as d } from "./use-download-conversation.js";
15
- import { adaptSystemMessage as f } from "../utils/system-message-adapter.js";
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 } = r(), { backend: x } = i(), S = a((e) => e.events), { mutate: C } = te(), { mutate: w } = l(), { mutate: T } = u(), { data: E } = c(), D = s(), [O, k] = p.useState(!1), [A, j] = p.useState(!1), [M, N] = p.useState(!1), [P, F] = p.useState(!1), [I, L] = p.useState(!1), [R, z] = p.useState(!1), [B, V] = p.useState(!1), { mutateAsync: H } = d(), U = f(S), W = (e) => {
20
- e.preventDefault(), e.stopPropagation(), z(!0), _?.(!1);
21
- }, G = (e) => {
22
- e.preventDefault(), e.stopPropagation(), V(!0), _?.(!1);
23
- }, K = () => {
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
- } }), z(!1);
27
- }, q = () => {
28
- m && w({ conversationId: m }), V(!1);
29
- }, J = (e) => {
26
+ } }), I(!1);
27
+ }, G = () => {
28
+ m && w({ conversationId: m }), R(!1);
29
+ }, K = (e) => {
30
30
  e.preventDefault(), e.stopPropagation(), _?.(!1);
31
- }, Y = async (e) => {
32
- e.preventDefault(), e.stopPropagation(), m && await H(m), _?.(!1);
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(), k(!0), _?.(!1);
38
+ e.stopPropagation(), A(!0), _?.(!1);
35
39
  }, Z = (e) => {
36
- e.stopPropagation(), j(!0), _?.(!1);
40
+ e.stopPropagation(), M(!0), _?.(!1);
37
41
  }, Q = (e) => {
38
- e.stopPropagation(), N(!0), _?.(!1);
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: W,
55
- handleStop: G,
56
- handleEdit: J,
57
- handleDownloadConversation: Y,
58
- handleDisplayCost: X,
59
- handleShowAgentTools: Z,
60
- handleShowSkills: Q,
61
- handleShowPlugins: ne,
62
- handleShowHooks: re,
63
- handleTogglePublic: ie,
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($), ee(v(t.CONVERSATION$LINK_COPIED));
69
+ navigator.clipboard.writeText($), r(v(t.CONVERSATION$LINK_COPIED));
70
70
  },
71
71
  shareUrl: $,
72
- handleConfirmDelete: K,
73
- handleConfirmStop: q,
74
- metricsModalVisible: O,
75
- setMetricsModalVisible: k,
76
- systemModalVisible: A,
77
- setSystemModalVisible: j,
78
- skillsModalVisible: M,
79
- setSkillsModalVisible: N,
80
- pluginsModalVisible: P,
81
- setPluginsModalVisible: F,
82
- hooksModalVisible: I,
83
- setHooksModalVisible: L,
84
- confirmDeleteModalVisible: R,
85
- setConfirmDeleteModalVisible: z,
86
- confirmStopModalVisible: B,
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 && U),
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":"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"}
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:r,maxHeight:i,onGripDragStart:a,onGripDragEnd:o,onHeightChange:s,onReachedMinHeight:c})=>{let l=e=>`touches`in e&&e.touches.length>0?e.touches[0].clientY:e.clientY,u=(e,t)=>{let n=document.getElementById(`resize-grip`);n&&(n.addEventListener(`touchmove`,e,{passive:!1,capture:!0}),n.addEventListener(`touchend`,t,{capture:!0}))},d=(e,t)=>{document.addEventListener(`mousemove`,e),document.addEventListener(`mouseup`,t)},f=f=>{let p=e.isMobileDevice(),m=n.current?.offsetHeight||r,h=!1,g=e=>{if(e.preventDefault(),!h){let n=l(e);if(Math.abs(n-f)<t)return;h=!0,a?.()}let o=l(e)-f,u=Math.max(r,Math.min(i,m-o)),d=n.current;if(!d)return;d.style.height=`${u}px`;let p=d.scrollHeight>u||u>=i;d.style.overflowY=p?`auto`:`hidden`,s&&s(u),c&&Math.abs(u-r)<=1.5&&c()},_=()=>{if(h&&o?.(),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?u(g,_):d(g,_)};return{handleGripMouseDown:e=>{e.preventDefault(),f(e.clientY)},handleGripTouchStart:e=>{e.preventDefault(),f(e.touches[0].clientY)}}};exports.useDragResize=n;
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,EAaV,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,EAcA,MAAO,CACL,oBAZ2B,GAAuB,CAClD,EAAE,eAAe,EACjB,EAAU,EAAE,OAAO,CACrB,EAUE,qBAP4B,GAAuB,CACnD,EAAE,eAAe,EACjB,EAAU,EAAE,QAAQ,GAAG,OAAO,CAChC,CAKA,CACF"}
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"}