@openhands/agent-canvas 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (899) 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-CYy8qA2z.js} +1 -1
  4. package/build/assets/active-backend-context-BZDG15C0.js +2 -0
  5. package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DGWBBbcp.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DrkGdf4_.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DK56YPTs.js +86 -0
  8. package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-DfcSgkLD.js} +2 -2
  9. package/build/assets/agent-settings-Lrc5-twS.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-BgDHhL7b.js} +1 -1
  11. package/build/assets/api-error-message-BEIE_yD1.js +1 -0
  12. package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-DaZnOlVo.js} +1 -1
  13. package/build/assets/{app-settings-D0OKHB3M.js → app-settings-BG5NAUbC.js} +1 -1
  14. package/build/assets/automation-detail-D4Hs831Z.js +3 -0
  15. package/build/assets/automation-export-n0X6FB0C.js +2 -0
  16. package/build/assets/automation-git-sync-CDrm8WV7.js +1 -0
  17. package/build/assets/automation-setup-route-CZCl4ONs.js +1 -0
  18. package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DFF96AdL.js} +1 -1
  19. package/build/assets/automations-list-Bl-oGOrV.js +1 -0
  20. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-H_ThtDA0.js} +1 -1
  21. package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-CbCemvHt.js} +1 -1
  22. package/build/assets/backend-not-configured-DP8KLNq_.js +1 -0
  23. package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-BBASWqsb.js} +1 -1
  24. package/build/assets/{badge-Dpn3-LTV.js → badge-B-51h-SW.js} +1 -1
  25. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-BbjycA8X.js} +1 -1
  26. package/build/assets/bot-CGPCg03p.js +1 -0
  27. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-Blxv5nww.js} +1 -1
  28. package/build/assets/browser-CuW0nWvh.js +7 -0
  29. package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-D5G0ORwt.js} +1 -1
  30. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-BD2tii1r.js} +1 -1
  31. package/build/assets/check-DSuS-lyr.js +1 -0
  32. package/build/assets/chevron-down-CgGcmtE2.js +1 -0
  33. package/build/assets/circle-check-CG5-NPw7.js +1 -0
  34. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-ASbpB8vN.js} +1 -1
  35. package/build/assets/cloud-funnel-analytics-GlCUG0gk.js +1 -0
  36. package/build/assets/cog-CZiR80uT.js +1 -0
  37. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-DvpEsh2O.js} +1 -1
  38. package/build/assets/{command-menu-BKOLj-TC.js → command-menu-DwUQzjYP.js} +1 -1
  39. package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BptcoiLA.js} +1 -1
  40. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-CiEwxZAA.js} +1 -1
  41. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-CdcamfM1.js} +1 -1
  42. package/build/assets/conversation-DREHj4nT.js +1 -0
  43. package/build/assets/conversation-DotRfiDz.js +90 -0
  44. package/build/assets/conversation-panel-DREHj4nT.js +1 -0
  45. package/build/assets/conversation-state-store-DMLtlHbE.js +1 -0
  46. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  47. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-D-puECpY.js} +1 -1
  48. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-BGxcUbgy.js} +1 -1
  49. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-CZJfWaJf.js} +1 -1
  50. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-tLhpwtxS.js} +1 -1
  51. package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-D8GnI6GZ.js} +2 -2
  52. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-Fk8k60nk.js} +1 -1
  53. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-DeztVYuL.js} +1 -1
  54. package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-Cd6GCYzq.js} +1 -1
  55. package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-C4sgZg-y.js} +1 -1
  56. package/build/assets/external-link-C0UpBgsE.js +1 -0
  57. package/build/assets/{file-text-RecuaId_.js → file-text-C6WYtNdV.js} +1 -1
  58. package/build/assets/files-tab-BW_qzyAm.js +1 -0
  59. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-CGXBLcn1.js} +1 -1
  60. package/build/assets/format-model-name-BNPKVsIq.js +1 -0
  61. package/build/assets/format-relative-time-ZhQD4rsl.js +1 -0
  62. package/build/assets/git-provider-icon-CaQ1yLPi.js +1 -0
  63. package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-CgXR6M_E.js} +1 -1
  64. package/build/assets/git-repo-dropdown-D2Uei3CO.js +1 -0
  65. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_YOp8Fo.js} +1 -1
  66. package/build/assets/home-DNzzJcMP.js +1 -0
  67. package/build/assets/home-aCos-5vc.js +1 -0
  68. package/build/assets/{home-store-Cubdq0uP.js → home-store-DgzViC3f.js} +1 -1
  69. package/build/assets/index-home-DNzzJcMP.js +1 -0
  70. package/build/assets/info-CLoC1LRo.js +1 -0
  71. package/build/assets/install-server-modal-D7zIqNKz.js +1 -0
  72. package/build/assets/kebab-menu-item-content-DERMdnDv.js +1 -0
  73. package/build/assets/{launch-c4GEP8oo.js → launch-5PjKeLak.js} +1 -1
  74. package/build/assets/{list-todo-CheUtB7F.js → list-todo-BF049YaY.js} +1 -1
  75. package/build/assets/llm-not-configured-banner-BK9z5eS0.js +27 -0
  76. package/build/assets/llm-settings-BLAMK2tR.js +1 -0
  77. package/build/assets/llm-settings-BWsbarGM.js +1 -0
  78. package/build/assets/llm-subscription-service-SfnEV9Uc.js +1 -0
  79. package/build/assets/loader-circle-D7IagAyF.js +1 -0
  80. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-DBgXgra0.js} +1 -1
  81. package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-BTqNPhzc.js} +1 -1
  82. package/build/assets/manifest-abebca3c.js +1 -0
  83. package/build/assets/manifest-subpage-layout-Rn-glaxV.js +1 -0
  84. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-BK4HnqYz.js} +1 -1
  85. package/build/assets/markdown-renderer-Cp6DlHQN.js +8 -0
  86. package/build/assets/{mcp-Da7wFU7A.js → mcp-BC-Ixn4T.js} +2 -2
  87. package/build/assets/mcp-marketplace-utils-BJWJgbB6.js +1 -0
  88. package/build/assets/messages-CzFKrzPG.js +40 -0
  89. package/build/assets/{modal-body-duRaxj_K.js → modal-body-BdKfD3Hl.js} +1 -1
  90. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D5_b5vMi.js} +1 -1
  91. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-objukxk_.js} +1 -1
  92. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-C_gXyLyD.js} +1 -1
  93. package/build/assets/{npm-Cswluf6-.js → npm-CHVHV1MC.js} +1 -1
  94. package/build/assets/{onboarding-BKbTYlW1.js → onboarding-Diw0V51A.js} +1 -1
  95. package/build/assets/onboarding-modal-Da4yHzsA.js +1 -0
  96. package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-BztSy69u.js} +1 -1
  97. package/build/assets/parse-git-remote-url-BkXN9jzl.js +1 -0
  98. package/build/assets/pencil-49avMHlD.js +1 -0
  99. package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-CJiSpNax.js} +1 -1
  100. package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-lHdNKWNU.js} +1 -1
  101. package/build/assets/plus-C0BagBpV.js +1 -0
  102. package/build/assets/profiles-service.api-BLr7FXec.js +1 -0
  103. package/build/assets/providers-CWXnb7S3.js +1 -0
  104. package/build/assets/{proxy-b4aqL4SX.js → proxy-DYDXxtje.js} +1 -1
  105. package/build/assets/{puzzle-B3v361yY.js → puzzle-Bt2B1rzf.js} +1 -1
  106. package/build/assets/recommended-automations-launcher-CcFMfJRR.js +1 -0
  107. package/build/assets/refresh-cw-nmcesifB.js +1 -0
  108. package/build/assets/root-CT4t7apy.css +1 -0
  109. package/build/assets/root-DnRgLKpU.js +2 -0
  110. package/build/assets/root-layout-2L9tr-BN.js +2 -0
  111. package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-C59lVZTA.js} +1 -1
  112. package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-BbBEQQjq.js} +1 -1
  113. package/build/assets/search-CYSDBczG.js +1 -0
  114. package/build/assets/secrets-service-BtsgYSlj.js +1 -0
  115. package/build/assets/secrets-settings-DJ0OKa4_.js +1 -0
  116. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DiVfTZuN.js} +1 -1
  117. package/build/assets/{settings-CZPGNens.js → settings-CDqL_Uqh.js} +1 -1
  118. package/build/assets/{settings-CWFxymAf.js → settings-DcNPxz0v.js} +1 -1
  119. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-Ba1UN5Du.js} +1 -1
  120. package/build/assets/{settings-index-Dtlegd6s.js → settings-index-Cz2cKt2K.js} +1 -1
  121. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-CWUEHHvS.js} +1 -1
  122. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-DdcLXDGn.js} +1 -1
  123. package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-nEEK1Kh1.js} +1 -1
  124. package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api-3yAUFcaP.js} +1 -1
  125. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-Dk9hChx1.js} +1 -1
  126. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-CxjtCSB3.js} +1 -1
  127. package/build/assets/shared-conversation-DbAcrx3s.js +1 -0
  128. package/build/assets/shield-check-CiOTXxV2.js +1 -0
  129. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-lrfPooIB.js} +1 -1
  130. package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-KERXfNu1.js} +1 -1
  131. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-B8lFD6Cb.js} +1 -1
  132. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-u6pUpxJ7.js} +1 -1
  133. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-dGIUzr_b.js} +1 -1
  134. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-kkOWZ89w.js} +1 -1
  135. package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-DWN1PBPH.js} +1 -1
  136. package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-DFjH2Nq6.js} +1 -1
  137. package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-DIHpl3ol.js} +2 -2
  138. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-ntyMLnbj.js} +1 -1
  139. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-B6JXcsmL.js} +1 -1
  140. package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-aEJzEcHD.js} +1 -1
  141. package/build/assets/{terminal-DRrJo-cR.js → terminal-Dch7Ty5K.js} +1 -1
  142. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-B2MLKsgt.js} +1 -1
  143. package/build/assets/trash-2-yZnDM4Ji.js +1 -0
  144. package/build/assets/{typography-D9tiHct7.js → typography-DB5HoCk0.js} +1 -1
  145. package/build/assets/usage-tab-DrEtBmBT.js +1 -0
  146. package/build/assets/use-acp-credential-form-c8KXAa8A.js +1 -0
  147. package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-B0p34N3q.js} +1 -1
  148. package/build/assets/use-agent-profiles-CPIc6wLH.js +1 -0
  149. package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dz_8Eqkv.js} +1 -1
  150. package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-DvUVqCle.js} +1 -1
  151. package/build/assets/use-config-C3PO4TBw.js +1 -0
  152. package/build/assets/use-create-conversation-DVrA_uLD.js +1 -0
  153. package/build/assets/use-create-secret-DbBIpaCR.js +1 -0
  154. package/build/assets/use-get-secrets-6PBitf54.js +1 -0
  155. package/build/assets/use-has-permission-CQ31Cl8j.js +1 -0
  156. package/build/assets/use-is-authed-2UrDIziV.js +1 -0
  157. package/build/assets/use-is-creating-conversation-BvYpmb3v.js +1 -0
  158. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  159. package/build/assets/use-llm-profiles-diZS4FiN.js +1 -0
  160. package/build/assets/use-manifest-capabilities-HIWCtIUm.js +1 -0
  161. package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-Bs8PcXik.js} +1 -1
  162. package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-BCuNLFsr.js} +1 -1
  163. package/build/assets/use-save-agent-profile-BaMNSpBV.js +1 -0
  164. package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-BahvC2Gw.js} +1 -1
  165. package/build/assets/{use-settings-BmLzQjnC.js → use-settings-C6ZxpBDX.js} +1 -1
  166. package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-Bqn69Ggw.js} +2 -2
  167. package/build/assets/use-tracking-Bhu7gk2y.js +3 -0
  168. package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-BkNXpXrd.js} +1 -1
  169. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-c_OmS3lK.js} +1 -1
  170. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-6ZsQCqAn.js} +1 -1
  171. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-xDrGlTO_.js} +1 -1
  172. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-Bs5NFz2s.js} +1 -1
  173. package/build/assets/utils-DUD5ScdA.js +1 -0
  174. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  175. package/build/assets/{vendor~entry.client-CgNUwtQL.js → vendor~entry.client-BFE7Llz9.js} +1 -1
  176. package/build/assets/{vendor~entry.client-zSIea5EO.js → vendor~entry.client-BaKt_PIp.js} +1 -1
  177. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-D87mAf6K.js} +3 -3
  178. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-B6POTS66.js} +1 -1
  179. package/build/assets/vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js +13 -0
  180. package/build/assets/vendor~root-layout-DeQACFVA.js +1 -0
  181. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-bv7ooVgH.js} +1 -1
  182. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-e8pX05xf.js} +1 -1
  183. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-BvS6PCK2.js} +1 -1
  184. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-DOPLJMH9.js} +2 -2
  185. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz8NQve5.js} +1 -1
  186. package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-COueVXmM.js} +1 -1
  187. package/build/assets/{wrench-B1_H-tL1.js → wrench-C95ujnYo.js} +1 -1
  188. package/build/assets/x-86ZCfxKY.js +1 -0
  189. package/build/assets/zap-DRa-r-Tf.js +1 -0
  190. package/build/index.html +4 -4
  191. package/build/locales/ar/openhands.json +88 -3
  192. package/build/locales/ca/openhands.json +88 -3
  193. package/build/locales/de/openhands.json +88 -3
  194. package/build/locales/en/openhands.json +88 -3
  195. package/build/locales/es/openhands.json +88 -3
  196. package/build/locales/fr/openhands.json +88 -3
  197. package/build/locales/it/openhands.json +88 -3
  198. package/build/locales/ja/openhands.json +88 -3
  199. package/build/locales/ko-KR/openhands.json +88 -3
  200. package/build/locales/no/openhands.json +88 -3
  201. package/build/locales/pt/openhands.json +88 -3
  202. package/build/locales/tr/openhands.json +88 -3
  203. package/build/locales/uk/openhands.json +88 -3
  204. package/build/locales/zh-CN/openhands.json +88 -3
  205. package/build/locales/zh-TW/openhands.json +88 -3
  206. package/config/defaults.json +3 -3
  207. package/dist/api/agent-server-compatibility.cjs +1 -1
  208. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  209. package/dist/api/agent-server-compatibility.js +1 -1
  210. package/dist/api/agent-server-compatibility.js.map +1 -1
  211. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  212. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  213. package/dist/api/automation-service/automation-service.api.d.ts +10 -0
  214. package/dist/api/automation-service/automation-service.api.js +42 -0
  215. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  216. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  217. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  218. package/dist/api/cloud/conversation-service.api.d.ts +9 -0
  219. package/dist/api/cloud/conversation-service.api.js +11 -1
  220. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  221. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  222. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  223. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  224. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  225. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  226. package/dist/api/llm-balance-service.cjs +2 -0
  227. package/dist/api/llm-balance-service.cjs.map +1 -0
  228. package/dist/api/llm-balance-service.d.ts +33 -0
  229. package/dist/api/llm-balance-service.js +53 -0
  230. package/dist/api/llm-balance-service.js.map +1 -0
  231. package/dist/api/llm-subscription-service.cjs +1 -1
  232. package/dist/api/llm-subscription-service.cjs.map +1 -1
  233. package/dist/api/llm-subscription-service.js +42 -34
  234. package/dist/api/llm-subscription-service.js.map +1 -1
  235. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  236. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  237. package/dist/api/profiles-service/profiles-service.api.d.ts +15 -2
  238. package/dist/api/profiles-service/profiles-service.api.js +25 -2
  239. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  240. package/dist/api/secrets-service.cjs +1 -1
  241. package/dist/api/secrets-service.cjs.map +1 -1
  242. package/dist/api/secrets-service.d.ts +5 -0
  243. package/dist/api/secrets-service.js +12 -6
  244. package/dist/api/secrets-service.js.map +1 -1
  245. package/dist/components/conversation/index.cjs +1 -1
  246. package/dist/components/conversation/index.d.ts +0 -1
  247. package/dist/components/conversation/index.js +0 -1
  248. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  249. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  250. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  251. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  252. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  253. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  254. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  255. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  256. package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
  257. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  258. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  259. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  260. package/dist/components/conversation-events/chat/group-events.js +27 -26
  261. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  262. package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
  263. package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
  264. package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
  265. package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
  266. package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
  267. package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
  268. package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
  269. package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
  270. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  271. package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
  272. package/dist/components/features/chat/chat-interface.cjs +2 -2
  273. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  274. package/dist/components/features/chat/chat-interface.js +177 -176
  275. package/dist/components/features/chat/chat-interface.js.map +1 -1
  276. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  277. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  278. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  279. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  280. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  281. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  282. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  283. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  284. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  285. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  286. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  287. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  288. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  289. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  290. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  291. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  292. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  293. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  294. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  295. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  296. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  297. package/dist/components/features/chat/custom-chat-input.js +68 -67
  298. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  299. package/dist/components/features/chat/error-message-banner.cjs +1 -1
  300. package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
  301. package/dist/components/features/chat/error-message-banner.d.ts +3 -1
  302. package/dist/components/features/chat/error-message-banner.js +64 -58
  303. package/dist/components/features/chat/error-message-banner.js.map +1 -1
  304. package/dist/components/features/chat/path-component.cjs +1 -1
  305. package/dist/components/features/chat/path-component.cjs.map +1 -1
  306. package/dist/components/features/chat/path-component.js +9 -6
  307. package/dist/components/features/chat/path-component.js.map +1 -1
  308. package/dist/components/features/chat/plan-preview.cjs +1 -1
  309. package/dist/components/features/chat/plan-preview.js +4 -4
  310. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  311. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  312. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  313. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  314. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  315. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  316. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  317. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  318. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  319. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  320. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  321. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  322. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  323. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  324. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  325. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  326. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  327. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  328. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  329. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  330. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  331. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  332. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  333. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  334. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  335. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  336. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  337. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  338. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  339. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  340. package/dist/components/features/conversation/conversation-name.js +69 -71
  341. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  342. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  343. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  344. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  345. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  346. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  347. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  348. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  349. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  350. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  351. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  352. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  353. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  354. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  355. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  356. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  357. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  358. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  359. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  360. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  361. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  362. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  363. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  364. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  365. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  366. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  367. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  368. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  369. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  370. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  371. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  372. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  373. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  374. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  375. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  376. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  377. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  378. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  379. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  380. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  381. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  382. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  383. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  384. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  385. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  386. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  387. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  388. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  389. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  390. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  391. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  392. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  393. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  394. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  395. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  396. package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
  397. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  398. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  399. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  400. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  401. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  402. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  403. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  404. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  405. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  406. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  407. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  408. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  409. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  410. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  411. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  412. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  413. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  414. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  415. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +25 -17
  416. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  417. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  425. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  426. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  427. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  428. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  429. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  430. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  431. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  432. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  433. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  434. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  435. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  436. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  437. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  438. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  439. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  440. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  441. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  442. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  443. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/conversation-panel.js +240 -175
  445. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  446. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  447. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  448. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  449. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  450. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  451. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  452. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  453. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  454. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
  455. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  456. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  457. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  458. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  459. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  460. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  461. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  462. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  463. package/dist/config/defaults.cjs +1 -1
  464. package/dist/config/defaults.cjs.map +1 -1
  465. package/dist/config/defaults.js +3 -3
  466. package/dist/config/defaults.js.map +1 -1
  467. package/dist/constants/llm-balance.cjs +2 -0
  468. package/dist/constants/llm-balance.cjs.map +1 -0
  469. package/dist/constants/llm-balance.d.ts +13 -0
  470. package/dist/constants/llm-balance.js +6 -0
  471. package/dist/constants/llm-balance.js.map +1 -0
  472. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  473. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  474. package/dist/contexts/conversation-websocket-context.js +227 -219
  475. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  476. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  477. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  478. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  479. package/dist/hooks/chat/use-grip-resize.js +39 -30
  480. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  481. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  482. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  483. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  484. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  485. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  486. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  487. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  488. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  489. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  490. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  491. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  492. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  493. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  494. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  495. package/dist/hooks/query/use-commit-changes.js +4 -4
  496. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  497. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  498. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  499. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  500. package/dist/hooks/query/use-git-sync.d.ts +19 -0
  501. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  502. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  503. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  504. package/dist/hooks/query/use-llm-balance.js +24 -0
  505. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  506. package/dist/hooks/query/use-search-providers.cjs +1 -1
  507. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  508. package/dist/hooks/query/use-search-providers.js +1 -1
  509. package/dist/hooks/query/use-search-providers.js.map +1 -1
  510. package/dist/hooks/query/use-task-polling.cjs +1 -1
  511. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  512. package/dist/hooks/query/use-task-polling.js +12 -10
  513. package/dist/hooks/query/use-task-polling.js.map +1 -1
  514. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  515. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  516. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  517. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  518. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  519. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  520. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  521. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  522. package/dist/hooks/query/use-workspace-files.d.ts +14 -4
  523. package/dist/hooks/query/use-workspace-files.js +45 -32
  524. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  525. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  526. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  527. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  528. package/dist/hooks/use-await-context-compaction.js +61 -0
  529. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  530. package/dist/hooks/use-compact-context-action.cjs +2 -0
  531. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  532. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  533. package/dist/hooks/use-compact-context-action.js +61 -0
  534. package/dist/hooks/use-compact-context-action.js.map +1 -0
  535. package/dist/hooks/use-context-window-usage.cjs +2 -0
  536. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  537. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  538. package/dist/hooks/use-context-window-usage.js +20 -0
  539. package/dist/hooks/use-context-window-usage.js.map +1 -0
  540. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  541. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  542. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  543. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  544. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  545. package/dist/hooks/use-drag-resize.cjs +1 -1
  546. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  547. package/dist/hooks/use-drag-resize.d.ts +8 -0
  548. package/dist/hooks/use-drag-resize.js +21 -18
  549. package/dist/hooks/use-drag-resize.js.map +1 -1
  550. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  551. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  552. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  553. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  554. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  555. package/dist/hooks/use-responder-url-secret.d.ts +5 -0
  556. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  557. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  558. package/dist/hooks/use-select-conversation-tab.js +2 -2
  559. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  560. package/dist/hooks/use-tracking.cjs +1 -1
  561. package/dist/hooks/use-tracking.cjs.map +1 -1
  562. package/dist/hooks/use-tracking.d.ts +6 -0
  563. package/dist/hooks/use-tracking.js +6 -0
  564. package/dist/hooks/use-tracking.js.map +1 -1
  565. package/dist/i18n/declaration.cjs +1 -1
  566. package/dist/i18n/declaration.cjs.map +1 -1
  567. package/dist/i18n/declaration.d.ts +86 -1
  568. package/dist/i18n/declaration.js +1 -1
  569. package/dist/i18n/declaration.js.map +1 -1
  570. package/dist/i18n/translation.cjs +2 -2
  571. package/dist/i18n/translation.cjs.map +1 -1
  572. package/dist/i18n/translation.js +1475 -30
  573. package/dist/i18n/translation.js.map +1 -1
  574. package/dist/index.cjs +1 -1
  575. package/dist/index.js +28 -29
  576. package/dist/lib/index.cjs +1 -1
  577. package/dist/lib/index.js +0 -1
  578. package/dist/locales/ar/openhands.json +88 -3
  579. package/dist/locales/ca/openhands.json +88 -3
  580. package/dist/locales/de/openhands.json +88 -3
  581. package/dist/locales/en/openhands.json +88 -3
  582. package/dist/locales/es/openhands.json +88 -3
  583. package/dist/locales/fr/openhands.json +88 -3
  584. package/dist/locales/it/openhands.json +88 -3
  585. package/dist/locales/ja/openhands.json +88 -3
  586. package/dist/locales/ko-KR/openhands.json +88 -3
  587. package/dist/locales/no/openhands.json +88 -3
  588. package/dist/locales/pt/openhands.json +88 -3
  589. package/dist/locales/tr/openhands.json +88 -3
  590. package/dist/locales/uk/openhands.json +88 -3
  591. package/dist/locales/zh-CN/openhands.json +88 -3
  592. package/dist/locales/zh-TW/openhands.json +88 -3
  593. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  594. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  595. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  596. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  597. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  598. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  599. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  600. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  601. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  602. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  603. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  604. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  605. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  606. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  607. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  608. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  609. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  610. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  611. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  612. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  613. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  614. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  615. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  616. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  617. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  618. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  619. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  620. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  621. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  622. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  623. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  624. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  625. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  626. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  627. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  628. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  629. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  630. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  631. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  632. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  633. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  634. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  635. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  636. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  637. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  638. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  639. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  640. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  641. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  642. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  643. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  644. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  645. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  646. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  647. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
  648. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
  649. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
  650. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  651. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  652. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  653. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  654. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  655. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  656. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  657. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  658. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  659. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  660. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  661. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  662. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  663. package/dist/package.cjs +1 -1
  664. package/dist/package.cjs.map +1 -1
  665. package/dist/package.js +17 -16
  666. package/dist/package.js.map +1 -1
  667. package/dist/routes/files-tab.cjs +1 -1
  668. package/dist/routes/files-tab.js +11 -11
  669. package/dist/routes/files-tab.js.map +1 -1
  670. package/dist/routes/usage-tab.cjs +2 -0
  671. package/dist/routes/usage-tab.cjs.map +1 -0
  672. package/dist/routes/usage-tab.d.ts +2 -0
  673. package/dist/routes/usage-tab.js +10 -0
  674. package/dist/routes/usage-tab.js.map +1 -0
  675. package/dist/services/child-conversation-launch.cjs +1 -1
  676. package/dist/services/child-conversation-launch.cjs.map +1 -1
  677. package/dist/services/child-conversation-launch.js +11 -5
  678. package/dist/services/child-conversation-launch.js.map +1 -1
  679. package/dist/services/settings.cjs +1 -1
  680. package/dist/services/settings.cjs.map +1 -1
  681. package/dist/services/settings.js +2 -2
  682. package/dist/services/settings.js.map +1 -1
  683. package/dist/services/telemetry.cjs +1 -1
  684. package/dist/services/telemetry.cjs.map +1 -1
  685. package/dist/services/telemetry.js +47 -51
  686. package/dist/services/telemetry.js.map +1 -1
  687. package/dist/stores/archived-conversations-store.cjs +2 -0
  688. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  689. package/dist/stores/archived-conversations-store.d.ts +24 -0
  690. package/dist/stores/archived-conversations-store.js +33 -0
  691. package/dist/stores/archived-conversations-store.js.map +1 -0
  692. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  693. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  694. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  695. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  696. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  697. package/dist/stores/conversation-store.cjs.map +1 -1
  698. package/dist/stores/conversation-store.d.ts +1 -1
  699. package/dist/stores/conversation-store.js.map +1 -1
  700. package/dist/stores/error-message-store.cjs +1 -1
  701. package/dist/stores/error-message-store.cjs.map +1 -1
  702. package/dist/stores/error-message-store.d.ts +3 -1
  703. package/dist/stores/error-message-store.js +5 -3
  704. package/dist/stores/error-message-store.js.map +1 -1
  705. package/dist/stores/metrics-store.cjs +1 -1
  706. package/dist/stores/metrics-store.cjs.map +1 -1
  707. package/dist/stores/metrics-store.d.ts +1 -0
  708. package/dist/stores/metrics-store.js +7 -4
  709. package/dist/stores/metrics-store.js.map +1 -1
  710. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  711. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  712. package/dist/types/agent-server/type-guards.cjs +1 -1
  713. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  714. package/dist/types/agent-server/type-guards.d.ts +5 -0
  715. package/dist/types/agent-server/type-guards.js +3 -3
  716. package/dist/types/agent-server/type-guards.js.map +1 -1
  717. package/dist/types/git-sync.d.ts +51 -0
  718. package/dist/utils/conversation-local-storage.cjs +1 -1
  719. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  720. package/dist/utils/conversation-local-storage.js +2 -1
  721. package/dist/utils/conversation-local-storage.js.map +1 -1
  722. package/dist/utils/error-handler.cjs +1 -1
  723. package/dist/utils/error-handler.cjs.map +1 -1
  724. package/dist/utils/error-handler.d.ts +3 -2
  725. package/dist/utils/error-handler.js +18 -5
  726. package/dist/utils/error-handler.js.map +1 -1
  727. package/dist/utils/format-model-name.cjs +1 -1
  728. package/dist/utils/format-model-name.cjs.map +1 -1
  729. package/dist/utils/format-model-name.d.ts +1 -0
  730. package/dist/utils/format-model-name.js +1 -0
  731. package/dist/utils/format-model-name.js.map +1 -1
  732. package/dist/utils/format-token-count.cjs +2 -0
  733. package/dist/utils/format-token-count.cjs.map +1 -0
  734. package/dist/utils/format-token-count.d.ts +3 -0
  735. package/dist/utils/format-token-count.js +19 -0
  736. package/dist/utils/format-token-count.js.map +1 -0
  737. package/dist/utils/hover-reveal-classes.cjs +2 -0
  738. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  739. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  740. package/dist/utils/hover-reveal-classes.js +41 -0
  741. package/dist/utils/hover-reveal-classes.js.map +1 -0
  742. package/dist/utils/is-markdown-file-path.cjs +2 -0
  743. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  744. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  745. package/dist/utils/is-markdown-file-path.js +14 -0
  746. package/dist/utils/is-markdown-file-path.js.map +1 -0
  747. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  748. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  749. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  750. package/dist/utils/mcp-marketplace-utils.js +19 -16
  751. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  752. package/dist/utils/transcript-export/index.cjs +3 -3
  753. package/dist/utils/transcript-export/index.cjs.map +1 -1
  754. package/dist/utils/transcript-export/index.js +12 -12
  755. package/dist/utils/transcript-export/index.js.map +1 -1
  756. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  757. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  758. package/dist/utils/transcript-export/load-complete-events.js +25 -17
  759. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  760. package/dist/utils/workspace-relative-path.cjs +2 -0
  761. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  762. package/dist/utils/workspace-relative-path.d.ts +10 -0
  763. package/dist/utils/workspace-relative-path.js +22 -0
  764. package/dist/utils/workspace-relative-path.js.map +1 -0
  765. package/package.json +17 -16
  766. package/scripts/check-sdk-version-sync.mjs +6 -6
  767. package/scripts/check-translation-completeness.cjs +3 -0
  768. package/scripts/dev-process-utils.mjs +6 -1
  769. package/scripts/dev-safe.mjs +57 -2
  770. package/scripts/dev-with-automation.mjs +98 -9
  771. package/build/assets/active-backend-context-B_bg5h9O.js +0 -2
  772. package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
  773. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
  774. package/build/assets/agent-settings-D_SVrWhI.js +0 -1
  775. package/build/assets/automation-detail-C0SxWTnQ.js +0 -3
  776. package/build/assets/automation-export-BjQa_fT6.js +0 -2
  777. package/build/assets/automation-setup-route-BzCNpljP.js +0 -1
  778. package/build/assets/automations-list-dZg8zOCl.js +0 -1
  779. package/build/assets/bot-DuN83i3p.js +0 -1
  780. package/build/assets/browser--eoQOo4M.js +0 -6
  781. package/build/assets/check-DLOKoFU9.js +0 -1
  782. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  783. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  784. package/build/assets/cloud-funnel-analytics-CcSez21r.js +0 -1
  785. package/build/assets/conversation-Cmyw9bFh.js +0 -90
  786. package/build/assets/conversation-CvoGZ5vC.js +0 -1
  787. package/build/assets/conversation-panel-CvoGZ5vC.js +0 -1
  788. package/build/assets/conversation-state-store-CtgILxWF.js +0 -1
  789. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  790. package/build/assets/external-link-zWbg5KXS.js +0 -1
  791. package/build/assets/files-tab-D5zuU5TY.js +0 -1
  792. package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
  793. package/build/assets/format-relative-time-BerVamGl.js +0 -1
  794. package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
  795. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
  796. package/build/assets/home-DqyeeFA_.js +0 -1
  797. package/build/assets/home-Y0aDou-a.js +0 -1
  798. package/build/assets/index-home-DqyeeFA_.js +0 -1
  799. package/build/assets/info-C9lpK5pw.js +0 -1
  800. package/build/assets/install-server-modal-DW6dSyGr.js +0 -1
  801. package/build/assets/kebab-menu-item-content-CKydZrbH.js +0 -1
  802. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
  803. package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
  804. package/build/assets/llm-settings-D9ko42Pi.js +0 -1
  805. package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
  806. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  807. package/build/assets/manifest-e1c3bc3b.js +0 -1
  808. package/build/assets/manifest-subpage-layout-Ds7G5GZ8.js +0 -1
  809. package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
  810. package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
  811. package/build/assets/messages-B2l0qLVk.js +0 -40
  812. package/build/assets/onboarding-modal-DrrGlEQq.js +0 -1
  813. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  814. package/build/assets/plus-CtzlyAoF.js +0 -1
  815. package/build/assets/profiles-service.api-vcE_jJCe.js +0 -1
  816. package/build/assets/providers-CdrPPm0z.js +0 -1
  817. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +0 -1
  818. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  819. package/build/assets/root-CBBi6IAe.js +0 -2
  820. package/build/assets/root-CRK9fOFd.css +0 -1
  821. package/build/assets/root-layout-BFN2rCOy.js +0 -2
  822. package/build/assets/search-CYaiKHRp.js +0 -1
  823. package/build/assets/secrets-service-BHF4fxML.js +0 -1
  824. package/build/assets/secrets-settings-aBGXtQhX.js +0 -1
  825. package/build/assets/shared-conversation-BIAcuORk.js +0 -1
  826. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  827. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  828. package/build/assets/use-acp-credential-form-DGyo0QvL.js +0 -1
  829. package/build/assets/use-agent-profiles-B37XWDLq.js +0 -1
  830. package/build/assets/use-config-DapX3pjC.js +0 -1
  831. package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
  832. package/build/assets/use-create-secret-DcpT3RPw.js +0 -1
  833. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  834. package/build/assets/use-is-creating-conversation-CVefC9Ns.js +0 -1
  835. package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
  836. package/build/assets/use-manifest-capabilities-zihHDbMW.js +0 -1
  837. package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
  838. package/build/assets/use-tracking-salbPJxT.js +0 -3
  839. package/build/assets/utils-DPQfkd-7.js +0 -1
  840. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  841. package/build/assets/x-RYDBg-e2.js +0 -1
  842. package/build/assets/zap-tbKDzCe3.js +0 -1
  843. package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
  844. package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
  845. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
  846. package/dist/components/conversation-events/index.d.ts +0 -1
  847. package/dist/components/features/automations/metadata-chip.d.ts +0 -6
  848. package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
  849. package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
  850. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
  851. package/dist/components/features/controls/tools.d.ts +0 -2
  852. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  853. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  854. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  855. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  856. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  857. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  858. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  859. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  860. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  861. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  862. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  863. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  864. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  865. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  866. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  867. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  868. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  869. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  870. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  871. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  872. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
  873. package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
  874. package/dist/components/features/home/home-header/home-header.d.ts +0 -1
  875. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
  876. package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
  877. package/dist/components/features/home/new-conversation.d.ts +0 -1
  878. package/dist/components/features/home/tasks/task-card.d.ts +0 -6
  879. package/dist/components/features/home/tasks/task-group.d.ts +0 -7
  880. package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
  881. package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
  882. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
  883. package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
  884. package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
  885. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
  886. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
  887. package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
  888. package/dist/hooks/use-should-show-user-features.d.ts +0 -1
  889. package/dist/icons/u-credit-card.cjs +0 -2
  890. package/dist/icons/u-credit-card.cjs.map +0 -1
  891. package/dist/icons/u-credit-card.js +0 -21
  892. package/dist/icons/u-credit-card.js.map +0 -1
  893. package/dist/ui/card-title.d.ts +0 -16
  894. package/dist/ui/card.d.ts +0 -14
  895. package/dist/utils/group-suggested-tasks.d.ts +0 -7
  896. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dcc51rps-rfV8mQ9m.js} +0 -0
  897. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
  898. /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BOVIFA_g.js} +0 -0
  899. /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C0JXQb_q.js} +0 -0
@@ -0,0 +1,61 @@
1
+ import { isCondensationEvent as e } from "../types/agent-server/type-guards.js";
2
+ import { useEventStore as t } from "../stores/use-event-store.js";
3
+ import n from "../stores/metrics-store.js";
4
+ import { useEffect as r, useRef as i } from "react";
5
+ //#region src/hooks/use-await-context-compaction.ts
6
+ var a = 2500, o = 9e4;
7
+ function s(e, t, n) {
8
+ return {
9
+ beforeToken: e,
10
+ afterToken: t,
11
+ savedToken: Math.max(0, e - t),
12
+ outcome: n
13
+ };
14
+ }
15
+ function c({ beforeToken: c, baselineEventIds: l, onComplete: u, timeoutMs: d = o }) {
16
+ let f = i(u);
17
+ f.current = u, r(() => {
18
+ if (c === null) return;
19
+ let r = !1, i = !1, o, u = l ? new Set(l) : new Set(t.getState().eventIds), p = () => n.getState().usage?.per_turn_token ?? c, m = (e, t) => {
20
+ r || (r = !0, f.current(s(c, e, t)));
21
+ }, h = () => {
22
+ let e = p();
23
+ return i && e < c ? (m(e, "compacted"), !0) : !1;
24
+ }, g = () => {
25
+ clearTimeout(o), o = setTimeout(() => {
26
+ m(p(), "no_change");
27
+ }, a);
28
+ }, _ = () => {
29
+ for (let n of t.getState().events) {
30
+ let t = "id" in n ? n.id : void 0;
31
+ if (t !== void 0) {
32
+ if (u.has(t)) continue;
33
+ u.add(t);
34
+ }
35
+ if (e(n)) {
36
+ i = !0, h() || g();
37
+ return;
38
+ }
39
+ }
40
+ };
41
+ _();
42
+ let v = t.subscribe(() => {
43
+ r || _();
44
+ }), y = n.subscribe(() => {
45
+ r || h() && clearTimeout(o);
46
+ }), b = setTimeout(() => {
47
+ m(p(), i ? "no_change" : "timeout");
48
+ }, d);
49
+ return () => {
50
+ r = !0, v(), y(), clearTimeout(o), clearTimeout(b);
51
+ };
52
+ }, [
53
+ c,
54
+ l,
55
+ d
56
+ ]);
57
+ }
58
+ //#endregion
59
+ export { c as useAwaitContextCompaction };
60
+
61
+ //# sourceMappingURL=use-await-context-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-await-context-compaction.js","names":[],"sources":["../../src/hooks/use-await-context-compaction.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport { isCondensationEvent } from \"#/types/agent-server/type-guards\";\n\n/** How long to wait after a Condensation event for a lower per_turn_token. */\nconst METRICS_SETTLE_MS = 2_500;\n/** Give up waiting for condensation / metrics and surface whatever we have. */\nconst DEFAULT_TIMEOUT_MS = 90_000;\n\nexport type ContextCompactionOutcome = \"compacted\" | \"no_change\" | \"timeout\";\n\nexport interface ContextCompactionResult {\n beforeToken: number;\n afterToken: number;\n savedToken: number;\n /**\n * \"compacted\" — a Condensation event landed and per_turn_token dropped.\n * \"no_change\" — a Condensation event landed but no token drop was measured.\n * \"timeout\" — no Condensation event arrived in time; compaction did not\n * happen (or was never processed), so this is a failure, not a no-op.\n */\n outcome: ContextCompactionOutcome;\n}\n\nexport function buildContextCompactionResult(\n beforeToken: number,\n afterToken: number,\n outcome: ContextCompactionOutcome,\n): ContextCompactionResult {\n return {\n beforeToken,\n afterToken,\n savedToken: Math.max(0, beforeToken - afterToken),\n outcome,\n };\n}\n\ninterface UseAwaitContextCompactionOptions {\n /**\n * Snapshot of `per_turn_token` taken when compaction was requested.\n * Pass `null` when not awaiting a result.\n */\n beforeToken: number | null;\n /**\n * Event ids that predate the compaction *request*. The condense POST can\n * return only after the server already emitted its Condensation event, so\n * snapshotting \"known\" ids when this effect starts would miss fast\n * condensations; the baseline must be captured before the request fires.\n * When omitted, falls back to the ids present when the effect starts.\n */\n baselineEventIds?: Set<string | number> | null;\n onComplete: (result: ContextCompactionResult) => void;\n timeoutMs?: number;\n}\n\n/**\n * Waits for a post-request Condensation event (and ideally a lower\n * `per_turn_token` in the live metrics store), then reports how many tokens\n * were freed. The HTTP `/condense` ack only means work *started*.\n */\nexport function useAwaitContextCompaction({\n beforeToken,\n baselineEventIds,\n onComplete,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n}: UseAwaitContextCompactionOptions) {\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n\n useEffect(() => {\n if (beforeToken === null) {\n return undefined;\n }\n\n let completed = false;\n let sawCondensation = false;\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const knownEventIds = baselineEventIds\n ? new Set(baselineEventIds)\n : new Set(useEventStore.getState().eventIds);\n\n const readAfterToken = () =>\n useMetricsStore.getState().usage?.per_turn_token ?? beforeToken;\n\n const finish = (afterToken: number, outcome: ContextCompactionOutcome) => {\n if (completed) {\n return;\n }\n completed = true;\n onCompleteRef.current(\n buildContextCompactionResult(beforeToken, afterToken, outcome),\n );\n };\n\n const finishFromMetricsIfReady = () => {\n const afterToken = readAfterToken();\n if (sawCondensation && afterToken < beforeToken) {\n finish(afterToken, \"compacted\");\n return true;\n }\n return false;\n };\n\n const scheduleSettleFinish = () => {\n clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n finish(readAfterToken(), \"no_change\");\n }, METRICS_SETTLE_MS);\n };\n\n const scanForNewCondensation = () => {\n for (const event of useEventStore.getState().events) {\n const eventId = \"id\" in event ? event.id : undefined;\n if (eventId !== undefined) {\n if (knownEventIds.has(eventId)) {\n continue;\n }\n knownEventIds.add(eventId);\n }\n if (!isCondensationEvent(event)) {\n continue;\n }\n sawCondensation = true;\n if (!finishFromMetricsIfReady()) {\n scheduleSettleFinish();\n }\n return;\n }\n };\n\n scanForNewCondensation();\n\n const unsubscribeEvents = useEventStore.subscribe(() => {\n if (completed) {\n return;\n }\n scanForNewCondensation();\n });\n\n const unsubscribeMetrics = useMetricsStore.subscribe(() => {\n if (completed) {\n return;\n }\n if (finishFromMetricsIfReady()) {\n clearTimeout(settleTimer);\n }\n });\n\n const timeoutTimer = setTimeout(() => {\n // No Condensation event in time means the compaction never landed —\n // a failure, not a \"nothing to compact\" no-op.\n finish(readAfterToken(), sawCondensation ? \"no_change\" : \"timeout\");\n }, timeoutMs);\n\n return () => {\n completed = true;\n unsubscribeEvents();\n unsubscribeMetrics();\n clearTimeout(settleTimer);\n clearTimeout(timeoutTimer);\n };\n }, [beforeToken, baselineEventIds, timeoutMs]);\n}\n"],"mappings":";;;;;AAMA,IAAM,IAAoB,MAEpB,IAAqB;AAiB3B,SAAgB,EACd,GACA,GACA,GACyB;CACzB,OAAO;EACL;EACA;EACA,YAAY,KAAK,IAAI,GAAG,IAAc,CAAU;EAChD;CACF;AACF;AAyBA,SAAgB,EAA0B,EACxC,gBACA,qBACA,eACA,eAAY,KACuB;CACnC,IAAM,IAAgB,EAAO,CAAU;CAGvC,AAFA,EAAc,UAAU,GAExB,QAAgB;EACd,IAAI,MAAgB,MAClB;EAGF,IAAI,IAAY,IACZ,IAAkB,IAClB,GACE,IAAgB,IAClB,IAAI,IAAI,CAAgB,IACxB,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvC,UACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB,GAEhD,KAAU,GAAoB,MAAsC;GACpE,MAGJ,IAAY,IACZ,EAAc,QACZ,EAA6B,GAAa,GAAY,CAAO,CAC/D;EACF,GAEM,UAAiC;GACrC,IAAM,IAAa,EAAe;GAKlC,OAJI,KAAmB,IAAa,KAClC,EAAO,GAAY,WAAW,GACvB,MAEF;EACT,GAEM,UAA6B;GAEjC,AADA,aAAa,CAAW,GACxB,IAAc,iBAAiB;IAC7B,EAAO,EAAe,GAAG,WAAW;GACtC,GAAG,CAAiB;EACtB,GAEM,UAA+B;GACnC,KAAK,IAAM,KAAS,EAAc,SAAS,EAAE,QAAQ;IACnD,IAAM,IAAU,QAAQ,IAAQ,EAAM,KAAK,KAAA;IAC3C,IAAI,MAAY,KAAA,GAAW;KACzB,IAAI,EAAc,IAAI,CAAO,GAC3B;KAEF,EAAc,IAAI,CAAO;IAC3B;IACK,MAAoB,CAAK,GAI9B;KADA,IAAkB,IACb,EAAyB,KAC5B,EAAqB;KAEvB;IAFuB;GAGzB;EACF;EAEA,EAAuB;EAEvB,IAAM,IAAoB,EAAc,gBAAgB;GAClD,KAGJ,EAAuB;EACzB,CAAC,GAEK,IAAqB,EAAgB,gBAAgB;GACrD,KAGA,EAAyB,KAC3B,aAAa,CAAW;EAE5B,CAAC,GAEK,IAAe,iBAAiB;GAGpC,EAAO,EAAe,GAAG,IAAkB,cAAc,SAAS;EACpE,GAAG,CAAS;EAEZ,aAAa;GAKX,AAJA,IAAY,IACZ,EAAkB,GAClB,EAAmB,GACnB,aAAa,CAAW,GACxB,aAAa,CAAY;EAC3B;CACF,GAAG;EAAC;EAAa;EAAkB;CAAS,CAAC;AAC/C"}
@@ -0,0 +1,2 @@
1
+ const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../i18n/declaration.cjs"),r=require("../types/agent-state.cjs"),i=require("../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),a=require("../utils/retrieve-axios-error-message.cjs"),o=require("../utils/custom-toast-handlers.cjs"),s=require("../stores/use-event-store.cjs"),c=require("../stores/metrics-store.cjs"),l=require("./query/use-active-conversation.cjs"),u=require("./use-agent-state.cjs"),d=require("./mutation/use-condense-conversation.cjs"),f=require("./use-await-context-compaction.cjs"),p=require("../utils/format-token-count.cjs");let m=require("react");m=e.__toESM(m,1);function h(e=0){let{t:h}=t.useTranslation(`openhands`),g=i.useQueryClient(),{data:_}=l.useActiveConversation(),{curAgentState:v}=u.useAgentState(),{mutate:y,isPending:b}=d.useCondenseConversation(),[x,S]=m.default.useState(null),C=m.default.useRef(null),w=v===r.AgentState.RUNNING||v===r.AgentState.LOADING,T=b||x!==null,E=!_?.id||w||T,D=h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION),O=m.default.useEffectEvent(e=>{if(S(null),C.current=null,_?.id&&g.invalidateQueries({queryKey:[`conversation-metrics`,_.id]}),e.outcome===`timeout`){o.displayErrorToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));return}if(e.savedToken>0){o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE,{saved:p.formatCompactTokenCount(e.savedToken),before:p.formatCompactTokenCount(e.beforeToken),after:p.formatCompactTokenCount(e.afterToken)}));return}o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE))});return f.useAwaitContextCompaction({beforeToken:x,baselineEventIds:x===null?null:C.current,onComplete:O}),{handleCompact:()=>{if(!_?.id||T)return;let t=c.default.getState().usage?.per_turn_token??e;C.current=new Set(s.useEventStore.getState().eventIds),y({conversationId:_.id,conversationUrl:_.conversation_url,sessionApiKey:_.session_api_key},{onSuccess:()=>{S(t),o.displaySuccessToast(h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED))},onError:e=>{S(null),C.current=null,o.displayErrorToast(a.retrieveAxiosErrorMessage(e)||h(n.I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED))}})},isCompacting:T,isDisabled:E,description:D}}exports.useCompactContextAction=h;
2
+ //# sourceMappingURL=use-compact-context-action.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-compact-context-action.cjs","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":"wuBAyBA,SAAgB,EAAwB,EAAuB,EAAG,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAc,EAAA,eAAe,EAC7B,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,CAAE,iBAAkB,EAAA,cAAc,EAClC,CAAE,OAAQ,EAAU,aAAc,EAAA,wBAAwB,EAC1D,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAwB,IAAI,EAClE,EAAsB,EAAA,QAAM,OAAoC,IAAI,EAEpE,EACJ,IAAkB,EAAA,WAAW,SAC7B,IAAkB,EAAA,WAAW,QACzB,EAAe,GAAa,IAAgB,KAC5C,EAAa,CAAC,GAAc,IAAM,GAAe,EACjD,EAAc,EAAE,EAAA,QAAQ,wCAAwC,EAEhE,EAA2B,EAAA,QAAM,eACpC,GAAoC,CASnC,GARA,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC1B,GAAc,IAChB,EAAY,kBAAkB,CAC5B,SAAU,CAAC,uBAAwB,EAAa,EAAE,CACpD,CAAC,EAGC,EAAO,UAAY,UAAW,CAChC,EAAA,kBAAkB,EAAE,EAAA,QAAQ,mCAAmC,CAAC,EAChE,MACF,CAEA,GAAI,EAAO,WAAa,EAAG,CACzB,EAAA,oBACE,EAAE,EAAA,QAAQ,sCAAuC,CAC/C,MAAO,EAAA,wBAAwB,EAAO,UAAU,EAChD,OAAQ,EAAA,wBAAwB,EAAO,WAAW,EAClD,MAAO,EAAA,wBAAwB,EAAO,UAAU,CAClD,CAAC,CACH,EACA,MACF,CAEA,EAAA,oBACE,EAAE,EAAA,QAAQ,+CAA+C,CAC3D,CACF,CACF,EAyCA,OAvCA,EAAA,0BAA0B,CACxB,cACA,iBAAkB,IAAgB,KAAqC,KAA9B,EAAoB,QAC7D,WAAY,CACd,CAAC,EAmCM,CACL,kBAlC0B,CAC1B,GAAI,CAAC,GAAc,IAAM,EAAc,OAEvC,IAAM,EACJ,EAAA,QAAgB,SAAS,EAAE,OAAO,gBAAkB,EAItD,EAAoB,QAAU,IAAI,IAAI,EAAA,cAAc,SAAS,EAAE,QAAQ,EAEvE,EACE,CACE,eAAgB,EAAa,GAC7B,gBAAiB,EAAa,iBAC9B,cAAe,EAAa,eAC9B,EACA,CACE,cAAiB,CACf,EAAe,CAAQ,EACvB,EAAA,oBAAoB,EAAE,EAAA,QAAQ,oCAAoC,CAAC,CACrE,EACA,QAAU,GAAU,CAClB,EAAe,IAAI,EACnB,EAAoB,QAAU,KAC9B,EAAA,kBACE,EAAA,0BAA0B,CAAK,GAC7B,EAAE,EAAA,QAAQ,mCAAmC,CACjD,CACF,CACF,CACF,CACF,EAIE,eACA,aACA,aACF,CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared compact/condense action used by the Usage panel CTA and the
3
+ * composer context-window popover.
4
+ */
5
+ export declare function useCompactContextAction(perTurnToken?: number): {
6
+ handleCompact: () => void;
7
+ isCompacting: boolean;
8
+ isDisabled: boolean;
9
+ description: string;
10
+ };
@@ -0,0 +1,61 @@
1
+ import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../i18n/declaration.js";
3
+ import { AgentState as n } from "../types/agent-state.js";
4
+ import { useQueryClient as r } from "../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
5
+ import { retrieveAxiosErrorMessage as i } from "../utils/retrieve-axios-error-message.js";
6
+ import { displayErrorToast as a, displaySuccessToast as o } from "../utils/custom-toast-handlers.js";
7
+ import { useEventStore as s } from "../stores/use-event-store.js";
8
+ import c from "../stores/metrics-store.js";
9
+ import { useActiveConversation as l } from "./query/use-active-conversation.js";
10
+ import { useAgentState as u } from "./use-agent-state.js";
11
+ import { useCondenseConversation as d } from "./mutation/use-condense-conversation.js";
12
+ import { useAwaitContextCompaction as f } from "./use-await-context-compaction.js";
13
+ import { formatCompactTokenCount as p } from "../utils/format-token-count.js";
14
+ import m from "react";
15
+ //#region src/hooks/use-compact-context-action.ts
16
+ function h(h = 0) {
17
+ let { t: g } = e("openhands"), _ = r(), { data: v } = l(), { curAgentState: y } = u(), { mutate: b, isPending: x } = d(), [S, C] = m.useState(null), w = m.useRef(null), T = y === n.RUNNING || y === n.LOADING, E = x || S !== null, D = !v?.id || T || E, O = g(t.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION), k = m.useEffectEvent((e) => {
18
+ if (C(null), w.current = null, v?.id && _.invalidateQueries({ queryKey: ["conversation-metrics", v.id] }), e.outcome === "timeout") {
19
+ a(g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
20
+ return;
21
+ }
22
+ if (e.savedToken > 0) {
23
+ o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {
24
+ saved: p(e.savedToken),
25
+ before: p(e.beforeToken),
26
+ after: p(e.afterToken)
27
+ }));
28
+ return;
29
+ }
30
+ o(g(t.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE));
31
+ });
32
+ return f({
33
+ beforeToken: S,
34
+ baselineEventIds: S === null ? null : w.current,
35
+ onComplete: k
36
+ }), {
37
+ handleCompact: () => {
38
+ if (!v?.id || E) return;
39
+ let e = c.getState().usage?.per_turn_token ?? h;
40
+ w.current = new Set(s.getState().eventIds), b({
41
+ conversationId: v.id,
42
+ conversationUrl: v.conversation_url,
43
+ sessionApiKey: v.session_api_key
44
+ }, {
45
+ onSuccess: () => {
46
+ C(e), o(g(t.CONVERSATION$COMPACT_CONTEXT_STARTED));
47
+ },
48
+ onError: (e) => {
49
+ C(null), w.current = null, a(i(e) || g(t.CONVERSATION$COMPACT_CONTEXT_FAILED));
50
+ }
51
+ });
52
+ },
53
+ isCompacting: E,
54
+ isDisabled: D,
55
+ description: O
56
+ };
57
+ }
58
+ //#endregion
59
+ export { h as useCompactContextAction };
60
+
61
+ //# sourceMappingURL=use-compact-context-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-compact-context-action.js","names":[],"sources":["../../src/hooks/use-compact-context-action.ts"],"sourcesContent":["import React from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useCondenseConversation } from \"#/hooks/mutation/use-condense-conversation\";\nimport {\n type ContextCompactionResult,\n useAwaitContextCompaction,\n} from \"#/hooks/use-await-context-compaction\";\nimport { AgentState } from \"#/types/agent-state\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useEventStore } from \"#/stores/use-event-store\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { formatCompactTokenCount } from \"#/utils/format-token-count\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\n\n/**\n * Shared compact/condense action used by the Usage panel CTA and the\n * composer context-window popover.\n */\nexport function useCompactContextAction(perTurnToken: number = 0) {\n const { t } = useTranslation(\"openhands\");\n const queryClient = useQueryClient();\n const { data: conversation } = useActiveConversation();\n const { curAgentState } = useAgentState();\n const { mutate: condense, isPending } = useCondenseConversation();\n const [beforeToken, setBeforeToken] = React.useState<number | null>(null);\n const baselineEventIdsRef = React.useRef<Set<string | number> | null>(null);\n\n const isAgentBusy =\n curAgentState === AgentState.RUNNING ||\n curAgentState === AgentState.LOADING;\n const isCompacting = isPending || beforeToken !== null;\n const isDisabled = !conversation?.id || isAgentBusy || isCompacting;\n const description = t(I18nKey.CONVERSATION$COMPACT_CONTEXT_DESCRIPTION);\n\n const handleCompactionComplete = React.useEffectEvent(\n (result: ContextCompactionResult) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n if (conversation?.id) {\n queryClient.invalidateQueries({\n queryKey: [\"conversation-metrics\", conversation.id],\n });\n }\n\n if (result.outcome === \"timeout\") {\n displayErrorToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED));\n return;\n }\n\n if (result.savedToken > 0) {\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE, {\n saved: formatCompactTokenCount(result.savedToken),\n before: formatCompactTokenCount(result.beforeToken),\n after: formatCompactTokenCount(result.afterToken),\n }),\n );\n return;\n }\n\n displaySuccessToast(\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_COMPLETE_NO_CHANGE),\n );\n },\n );\n\n useAwaitContextCompaction({\n beforeToken,\n baselineEventIds: beforeToken !== null ? baselineEventIdsRef.current : null,\n onComplete: handleCompactionComplete,\n });\n\n const handleCompact = () => {\n if (!conversation?.id || isCompacting) return;\n\n const snapshot =\n useMetricsStore.getState().usage?.per_turn_token ?? perTurnToken;\n // The condense POST can return only after the server already emitted its\n // Condensation event, so the await baseline must be captured *before* the\n // request fires, not when the post-ack effect starts.\n baselineEventIdsRef.current = new Set(useEventStore.getState().eventIds);\n\n condense(\n {\n conversationId: conversation.id,\n conversationUrl: conversation.conversation_url,\n sessionApiKey: conversation.session_api_key,\n },\n {\n onSuccess: () => {\n setBeforeToken(snapshot);\n displaySuccessToast(t(I18nKey.CONVERSATION$COMPACT_CONTEXT_STARTED));\n },\n onError: (error) => {\n setBeforeToken(null);\n baselineEventIdsRef.current = null;\n displayErrorToast(\n retrieveAxiosErrorMessage(error) ||\n t(I18nKey.CONVERSATION$COMPACT_CONTEXT_FAILED),\n );\n },\n },\n );\n };\n\n return {\n handleCompact,\n isCompacting,\n isDisabled,\n description,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,SAAgB,EAAwB,IAAuB,GAAG;CAChE,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAe,GAC7B,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,qBAAkB,EAAc,GAClC,EAAE,QAAQ,GAAU,iBAAc,EAAwB,GAC1D,CAAC,GAAa,KAAkB,EAAM,SAAwB,IAAI,GAClE,IAAsB,EAAM,OAAoC,IAAI,GAEpE,IACJ,MAAkB,EAAW,WAC7B,MAAkB,EAAW,SACzB,IAAe,KAAa,MAAgB,MAC5C,IAAa,CAAC,GAAc,MAAM,KAAe,GACjD,IAAc,EAAE,EAAQ,wCAAwC,GAEhE,IAA2B,EAAM,gBACpC,MAAoC;EASnC,IARA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC1B,GAAc,MAChB,EAAY,kBAAkB,EAC5B,UAAU,CAAC,wBAAwB,EAAa,EAAE,EACpD,CAAC,GAGC,EAAO,YAAY,WAAW;GAChC,EAAkB,EAAE,EAAQ,mCAAmC,CAAC;GAChE;EACF;EAEA,IAAI,EAAO,aAAa,GAAG;GACzB,EACE,EAAE,EAAQ,uCAAuC;IAC/C,OAAO,EAAwB,EAAO,UAAU;IAChD,QAAQ,EAAwB,EAAO,WAAW;IAClD,OAAO,EAAwB,EAAO,UAAU;GAClD,CAAC,CACH;GACA;EACF;EAEA,EACE,EAAE,EAAQ,+CAA+C,CAC3D;CACF,CACF;CAyCA,OAvCA,EAA0B;EACxB;EACA,kBAAkB,MAAgB,OAAqC,OAA9B,EAAoB;EAC7D,YAAY;CACd,CAAC,GAmCM;EACL,qBAlC0B;GAC1B,IAAI,CAAC,GAAc,MAAM,GAAc;GAEvC,IAAM,IACJ,EAAgB,SAAS,EAAE,OAAO,kBAAkB;GAMtD,AAFA,EAAoB,UAAU,IAAI,IAAI,EAAc,SAAS,EAAE,QAAQ,GAEvE,EACE;IACE,gBAAgB,EAAa;IAC7B,iBAAiB,EAAa;IAC9B,eAAe,EAAa;GAC9B,GACA;IACE,iBAAiB;KAEf,AADA,EAAe,CAAQ,GACvB,EAAoB,EAAE,EAAQ,oCAAoC,CAAC;IACrE;IACA,UAAU,MAAU;KAGlB,AAFA,EAAe,IAAI,GACnB,EAAoB,UAAU,MAC9B,EACE,EAA0B,CAAK,KAC7B,EAAE,EAAQ,mCAAmC,CACjD;IACF;GACF,CACF;EACF;EAIE;EACA;EACA;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../stores/metrics-store.cjs"),t=require("./query/use-active-conversation.cjs"),n=require("./query/use-conversation-metrics.cjs");let r=require("react");function i(e){let t=e?.context_window??0;return t<=0?null:{perTurnToken:e?.per_turn_token??0,contextWindow:t}}function a(){let a=e.default(e=>e.usage),{data:o}=t.useActiveConversation(),{data:s}=n.useConversationMetrics(o?.id,o?.conversation_url,o?.session_api_key,!!o?.id);return(0,r.useMemo)(()=>i(a)||i(s?.accumulated_token_usage??null),[a,s])}exports.useContextWindowUsage=a;
2
+ //# sourceMappingURL=use-context-window-usage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-context-window-usage.cjs","names":[],"sources":["../../src/hooks/use-context-window-usage.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport useMetricsStore from \"#/stores/metrics-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationMetrics } from \"#/hooks/query/use-conversation-metrics\";\n\nexport interface ContextWindowUsage {\n perTurnToken: number;\n contextWindow: number;\n}\n\nfunction toContextWindowUsage(\n usage:\n | {\n per_turn_token?: number | null;\n context_window?: number | null;\n }\n | null\n | undefined,\n): ContextWindowUsage | null {\n const contextWindow = usage?.context_window ?? 0;\n if (contextWindow <= 0) {\n return null;\n }\n\n return {\n perTurnToken: usage?.per_turn_token ?? 0,\n contextWindow,\n };\n}\n\nexport function useContextWindowUsage(): ContextWindowUsage | null {\n const storeUsage = useMetricsStore((state) => state.usage);\n const { data: conversation } = useActiveConversation();\n\n const { data: conversationMetrics } = useConversationMetrics(\n conversation?.id,\n conversation?.conversation_url,\n conversation?.session_api_key,\n Boolean(conversation?.id),\n );\n\n return useMemo(() => {\n const fromStore = toContextWindowUsage(storeUsage);\n if (fromStore) {\n return fromStore;\n }\n\n return toContextWindowUsage(\n conversationMetrics?.accumulated_token_usage ?? null,\n );\n }, [storeUsage, conversationMetrics]);\n}\n"],"mappings":"sNAUA,SAAS,EACP,EAO2B,CAC3B,IAAM,EAAgB,GAAO,gBAAkB,EAK/C,OAJI,GAAiB,EACZ,KAGF,CACL,aAAc,GAAO,gBAAkB,EACvC,eACF,CACF,CAEA,SAAgB,GAAmD,CACjE,IAAM,EAAa,EAAA,QAAiB,GAAU,EAAM,KAAK,EACnD,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAE/C,CAAE,KAAM,GAAwB,EAAA,uBACpC,GAAc,GACd,GAAc,iBACd,GAAc,gBACd,EAAQ,GAAc,EACxB,EAEA,OAAA,EAAA,EAAA,aACoB,EAAqB,CACnC,GAIG,EACL,GAAqB,yBAA2B,IAClD,EACC,CAAC,EAAY,CAAmB,CAAC,CACtC"}
@@ -0,0 +1,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"}