@openhands/agent-canvas 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
  4. package/build/assets/active-backend-context-IqOjobNK.js +2 -0
  5. package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DMrObcIS.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
  8. package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-BJVk92PU.js} +1 -1
  9. package/build/assets/agent-settings-COfJsQ1d.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-D8Fade_-.js} +1 -1
  12. package/build/assets/{app-settings-D0OKHB3M.js → app-settings-CpyGB3AT.js} +1 -1
  13. package/build/assets/{automation-detail-C0SxWTnQ.js → automation-detail-B-jQ39Mm.js} +1 -1
  14. package/build/assets/{automation-export-BjQa_fT6.js → automation-export-B1dywoqk.js} +1 -1
  15. package/build/assets/{automation-setup-route-BzCNpljP.js → automation-setup-route-C-bWUZBi.js} +1 -1
  16. package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DgpCGOJV.js} +1 -1
  17. package/build/assets/{automations-list-dZg8zOCl.js → automations-list-DnMxlxsL.js} +1 -1
  18. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
  19. package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-DiVrD4Cm.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
  21. package/build/assets/{badge-Dpn3-LTV.js → badge-CpYmcVZV.js} +1 -1
  22. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
  23. package/build/assets/bot-BQZx8e2i.js +1 -0
  24. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
  25. package/build/assets/browser-B9AbV6kG.js +7 -0
  26. package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-zAY12m_i.js} +1 -1
  27. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
  28. package/build/assets/check-WAFXrrs_.js +1 -0
  29. package/build/assets/chevron-down-CifNWzme.js +1 -0
  30. package/build/assets/circle-check-CtnimJa8.js +1 -0
  31. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
  32. package/build/assets/{cloud-funnel-analytics-CcSez21r.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
  33. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
  34. package/build/assets/{command-menu-BKOLj-TC.js → command-menu-BXy03FBl.js} +1 -1
  35. package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BmZa0ui_.js} +1 -1
  36. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
  37. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
  38. package/build/assets/conversation-BPo8SvLN.js +1 -0
  39. package/build/assets/conversation-CPCVsCUY.js +90 -0
  40. package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
  41. package/build/assets/{conversation-state-store-CtgILxWF.js → conversation-state-store-C5YpjMNy.js} +1 -1
  42. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  43. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
  44. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
  45. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
  46. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
  47. package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-CxFjRYqH.js} +2 -2
  48. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
  49. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
  50. package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-BqUINAhp.js} +1 -1
  51. package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-lraj88Wk.js} +1 -1
  52. package/build/assets/external-link-CgtpA_a1.js +1 -0
  53. package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
  54. package/build/assets/files-tab-DV0L-lFE.js +1 -0
  55. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
  56. package/build/assets/{format-relative-time-BerVamGl.js → format-relative-time-DSErAuVr.js} +1 -1
  57. package/build/assets/git-provider-icon-BvlLAche.js +1 -0
  58. package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-ByMzpNko.js} +1 -1
  59. package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
  60. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
  61. package/build/assets/{home-Y0aDou-a.js → home-BOrlwLqG.js} +1 -1
  62. package/build/assets/home-BvMNC6E-.js +1 -0
  63. package/build/assets/{home-store-Cubdq0uP.js → home-store-CxqsY9Fi.js} +1 -1
  64. package/build/assets/index-home-BvMNC6E-.js +1 -0
  65. package/build/assets/info-BRVcJAUg.js +1 -0
  66. package/build/assets/{install-server-modal-DW6dSyGr.js → install-server-modal-Bl4G1zF4.js} +1 -1
  67. package/build/assets/{kebab-menu-item-content-CKydZrbH.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
  68. package/build/assets/{launch-c4GEP8oo.js → launch-CkqiSCqi.js} +1 -1
  69. package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
  70. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
  71. package/build/assets/llm-settings-B-pkVCrt.js +1 -0
  72. package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
  73. package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
  74. package/build/assets/loader-circle-B47W9XqT.js +1 -0
  75. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
  76. package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-DhGk5mJt.js} +1 -1
  77. package/build/assets/manifest-653b89aa.js +1 -0
  78. package/build/assets/{manifest-subpage-layout-Ds7G5GZ8.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
  79. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
  80. package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
  81. package/build/assets/{mcp-Da7wFU7A.js → mcp-DCkvl6K0.js} +2 -2
  82. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
  83. package/build/assets/messages-DSXvyc21.js +40 -0
  84. package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
  85. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
  86. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
  87. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
  88. package/build/assets/{npm-Cswluf6-.js → npm-DLckoeJc.js} +1 -1
  89. package/build/assets/{onboarding-BKbTYlW1.js → onboarding-D7WDG66N.js} +1 -1
  90. package/build/assets/{onboarding-modal-DrrGlEQq.js → onboarding-modal-C_xVrFNv.js} +1 -1
  91. package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-D-s9z18a.js} +1 -1
  92. package/build/assets/pencil-BGOCPRyu.js +1 -0
  93. package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-AKaXIIfg.js} +1 -1
  94. package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-wtmY4QQw.js} +1 -1
  95. package/build/assets/plus-zNEL8rcX.js +1 -0
  96. package/build/assets/{profiles-service.api-vcE_jJCe.js → profiles-service.api-DCMYxHMi.js} +1 -1
  97. package/build/assets/{providers-CdrPPm0z.js → providers-BjrtjX4L.js} +1 -1
  98. package/build/assets/{proxy-b4aqL4SX.js → proxy-9Z_WZggZ.js} +1 -1
  99. package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
  100. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
  101. package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
  102. package/build/assets/root-CanxKlNV.css +1 -0
  103. package/build/assets/{root-CBBi6IAe.js → root-DkfG_UWR.js} +2 -2
  104. package/build/assets/root-layout-D75LHYhh.js +2 -0
  105. package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-OnM5Uob_.js} +1 -1
  106. package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-m5WQm2sy.js} +1 -1
  107. package/build/assets/search-CycosyjN.js +1 -0
  108. package/build/assets/{secrets-service-BHF4fxML.js → secrets-service-B26R61C1.js} +1 -1
  109. package/build/assets/{secrets-settings-aBGXtQhX.js → secrets-settings-CbLYCKOX.js} +1 -1
  110. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
  111. package/build/assets/{settings-CZPGNens.js → settings-BJQI_iBM.js} +1 -1
  112. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
  113. package/build/assets/{settings-index-Dtlegd6s.js → settings-index-BiTqJoH7.js} +1 -1
  114. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
  115. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
  116. package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-BIrIVn97.js} +1 -1
  117. package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api--rJmnuLa.js} +1 -1
  118. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
  119. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
  120. package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
  121. package/build/assets/shield-check-T3JsDJiM.js +1 -0
  122. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
  123. package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
  124. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
  125. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
  126. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
  127. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
  128. package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-Dc3JPW-8.js} +1 -1
  129. package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-CpTV27n3.js} +1 -1
  130. package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-CSW__IW4.js} +1 -1
  131. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
  132. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
  133. package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-mAHMOkUz.js} +1 -1
  134. package/build/assets/{terminal-DRrJo-cR.js → terminal-BzxBaHx2.js} +1 -1
  135. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
  136. package/build/assets/trash-2-C0xNVp9c.js +1 -0
  137. package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
  138. package/build/assets/usage-tab-tEmVN0KD.js +1 -0
  139. package/build/assets/{use-acp-credential-form-DGyo0QvL.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
  140. package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
  141. package/build/assets/{use-agent-profiles-B37XWDLq.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
  142. package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
  143. package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
  144. package/build/assets/{use-config-DapX3pjC.js → use-config-DKAMiI5R.js} +1 -1
  145. package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
  146. package/build/assets/{use-create-secret-DcpT3RPw.js → use-create-secret-2zBlCDsF.js} +1 -1
  147. package/build/assets/use-is-authed-C52-ivnB.js +1 -0
  148. package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
  149. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  150. package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
  151. package/build/assets/{use-manifest-capabilities-zihHDbMW.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
  152. package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
  153. package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-CEiak69h.js} +1 -1
  154. package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
  155. package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-DNmnbG6f.js} +1 -1
  156. package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
  157. package/build/assets/{use-settings-BmLzQjnC.js → use-settings-wCwPaSIv.js} +1 -1
  158. package/build/assets/{use-tracking-salbPJxT.js → use-tracking-CVwPmhlX.js} +1 -1
  159. package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-DVtfg0B_.js} +1 -1
  160. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
  161. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
  162. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
  163. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
  164. package/build/assets/utils-zxEjKE70.js +1 -0
  165. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  166. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js} +3 -3
  167. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
  168. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
  169. package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
  170. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
  171. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js} +1 -1
  172. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js} +1 -1
  173. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js} +1 -1
  174. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js} +2 -2
  175. package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-B8UMQ7MG.js} +1 -1
  176. package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
  177. package/build/assets/x-BWKA2Ver.js +1 -0
  178. package/build/assets/zap-DHddTPc0.js +1 -0
  179. package/build/index.html +4 -4
  180. package/build/locales/ar/openhands.json +28 -1
  181. package/build/locales/ca/openhands.json +28 -1
  182. package/build/locales/de/openhands.json +28 -1
  183. package/build/locales/en/openhands.json +28 -1
  184. package/build/locales/es/openhands.json +28 -1
  185. package/build/locales/fr/openhands.json +28 -1
  186. package/build/locales/it/openhands.json +28 -1
  187. package/build/locales/ja/openhands.json +28 -1
  188. package/build/locales/ko-KR/openhands.json +28 -1
  189. package/build/locales/no/openhands.json +28 -1
  190. package/build/locales/pt/openhands.json +28 -1
  191. package/build/locales/tr/openhands.json +28 -1
  192. package/build/locales/uk/openhands.json +28 -1
  193. package/build/locales/zh-CN/openhands.json +28 -1
  194. package/build/locales/zh-TW/openhands.json +28 -1
  195. package/config/defaults.json +3 -3
  196. package/dist/api/agent-server-compatibility.cjs +1 -1
  197. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  198. package/dist/api/agent-server-compatibility.js +1 -1
  199. package/dist/api/agent-server-compatibility.js.map +1 -1
  200. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  201. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  202. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  203. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  204. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  205. package/dist/api/llm-balance-service.cjs +2 -0
  206. package/dist/api/llm-balance-service.cjs.map +1 -0
  207. package/dist/api/llm-balance-service.d.ts +33 -0
  208. package/dist/api/llm-balance-service.js +53 -0
  209. package/dist/api/llm-balance-service.js.map +1 -0
  210. package/dist/api/llm-subscription-service.cjs +1 -1
  211. package/dist/api/llm-subscription-service.cjs.map +1 -1
  212. package/dist/api/llm-subscription-service.js +42 -34
  213. package/dist/api/llm-subscription-service.js.map +1 -1
  214. package/dist/components/conversation/index.cjs +1 -1
  215. package/dist/components/conversation/index.d.ts +0 -1
  216. package/dist/components/conversation/index.js +0 -1
  217. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  218. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  219. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  221. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  222. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  223. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  224. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  225. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  226. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  227. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  228. package/dist/components/conversation-events/chat/group-events.js +27 -26
  229. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  230. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  231. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  232. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  233. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  234. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  235. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  236. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  237. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  238. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  239. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  240. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  241. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  242. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  243. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  244. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  245. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  246. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  247. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  248. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  249. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  250. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  251. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  252. package/dist/components/features/chat/custom-chat-input.js +68 -67
  253. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  254. package/dist/components/features/chat/path-component.cjs +1 -1
  255. package/dist/components/features/chat/path-component.cjs.map +1 -1
  256. package/dist/components/features/chat/path-component.js +9 -6
  257. package/dist/components/features/chat/path-component.js.map +1 -1
  258. package/dist/components/features/chat/plan-preview.cjs +1 -1
  259. package/dist/components/features/chat/plan-preview.js +4 -4
  260. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  261. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  262. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  263. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  264. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  265. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  266. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  267. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  268. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  269. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  270. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  271. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  272. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  273. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  274. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  275. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  276. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  277. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  278. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  279. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  280. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  281. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  282. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  283. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  284. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  285. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  286. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  287. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  288. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  289. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  290. package/dist/components/features/conversation/conversation-name.js +69 -71
  291. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  292. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  293. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  294. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  295. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  296. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  297. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  298. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  299. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  300. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  301. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  302. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  303. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  304. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  305. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  306. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  307. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  308. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  309. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  310. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  311. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  312. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  313. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  314. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  315. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  316. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  317. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  318. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  319. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  320. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  321. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  322. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  323. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  324. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  325. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  326. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  327. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  328. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  329. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  330. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  331. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  332. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  333. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  334. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  335. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  336. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  337. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  338. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  339. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  340. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  341. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  342. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  343. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  344. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  345. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  346. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  347. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  348. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  349. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  350. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  351. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  352. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  353. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  354. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  355. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  356. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  357. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  358. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  359. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  360. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  361. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  362. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  363. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +25 -17
  364. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  365. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  366. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  367. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  368. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  369. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  370. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  371. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  372. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  373. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  374. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  375. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  376. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  377. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  378. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  379. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  380. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  381. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  382. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  383. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  384. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  386. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  387. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  388. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  389. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  391. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  392. package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
  393. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  394. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  395. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  396. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  397. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  398. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  399. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  400. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  401. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  402. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  403. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  404. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  405. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  406. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  407. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  408. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  409. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  410. package/dist/config/defaults.cjs +1 -1
  411. package/dist/config/defaults.cjs.map +1 -1
  412. package/dist/config/defaults.js +3 -3
  413. package/dist/config/defaults.js.map +1 -1
  414. package/dist/constants/llm-balance.cjs +2 -0
  415. package/dist/constants/llm-balance.cjs.map +1 -0
  416. package/dist/constants/llm-balance.d.ts +13 -0
  417. package/dist/constants/llm-balance.js +6 -0
  418. package/dist/constants/llm-balance.js.map +1 -0
  419. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  420. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  421. package/dist/contexts/conversation-websocket-context.js +217 -209
  422. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  423. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  424. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  425. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  426. package/dist/hooks/chat/use-grip-resize.js +39 -30
  427. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  428. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  429. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  430. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  431. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  432. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  433. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  434. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  435. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  436. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  437. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  438. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  439. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  440. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  441. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  442. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  443. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  444. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  445. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  446. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  447. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  448. package/dist/hooks/query/use-llm-balance.js +24 -0
  449. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  450. package/dist/hooks/query/use-search-providers.cjs +1 -1
  451. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  452. package/dist/hooks/query/use-search-providers.js +1 -1
  453. package/dist/hooks/query/use-search-providers.js.map +1 -1
  454. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  455. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  456. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  457. package/dist/hooks/use-await-context-compaction.js +61 -0
  458. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  459. package/dist/hooks/use-compact-context-action.cjs +2 -0
  460. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  461. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  462. package/dist/hooks/use-compact-context-action.js +61 -0
  463. package/dist/hooks/use-compact-context-action.js.map +1 -0
  464. package/dist/hooks/use-context-window-usage.cjs +2 -0
  465. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  466. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  467. package/dist/hooks/use-context-window-usage.js +20 -0
  468. package/dist/hooks/use-context-window-usage.js.map +1 -0
  469. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  470. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  471. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  472. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  473. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  474. package/dist/hooks/use-drag-resize.cjs +1 -1
  475. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  476. package/dist/hooks/use-drag-resize.d.ts +8 -0
  477. package/dist/hooks/use-drag-resize.js +21 -18
  478. package/dist/hooks/use-drag-resize.js.map +1 -1
  479. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  480. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  481. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  482. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  483. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  484. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  485. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  486. package/dist/hooks/use-select-conversation-tab.js +2 -2
  487. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  488. package/dist/i18n/declaration.cjs +1 -1
  489. package/dist/i18n/declaration.cjs.map +1 -1
  490. package/dist/i18n/declaration.d.ts +27 -0
  491. package/dist/i18n/declaration.js +1 -1
  492. package/dist/i18n/declaration.js.map +1 -1
  493. package/dist/i18n/translation.cjs +2 -2
  494. package/dist/i18n/translation.cjs.map +1 -1
  495. package/dist/i18n/translation.js +474 -15
  496. package/dist/i18n/translation.js.map +1 -1
  497. package/dist/index.cjs +1 -1
  498. package/dist/index.js +28 -29
  499. package/dist/lib/index.cjs +1 -1
  500. package/dist/lib/index.js +0 -1
  501. package/dist/locales/ar/openhands.json +28 -1
  502. package/dist/locales/ca/openhands.json +28 -1
  503. package/dist/locales/de/openhands.json +28 -1
  504. package/dist/locales/en/openhands.json +28 -1
  505. package/dist/locales/es/openhands.json +28 -1
  506. package/dist/locales/fr/openhands.json +28 -1
  507. package/dist/locales/it/openhands.json +28 -1
  508. package/dist/locales/ja/openhands.json +28 -1
  509. package/dist/locales/ko-KR/openhands.json +28 -1
  510. package/dist/locales/no/openhands.json +28 -1
  511. package/dist/locales/pt/openhands.json +28 -1
  512. package/dist/locales/tr/openhands.json +28 -1
  513. package/dist/locales/uk/openhands.json +28 -1
  514. package/dist/locales/zh-CN/openhands.json +28 -1
  515. package/dist/locales/zh-TW/openhands.json +28 -1
  516. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  517. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  518. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  519. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  520. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  522. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  523. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  524. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  525. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  526. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  527. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  528. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  529. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  530. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  531. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  532. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  533. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  534. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  535. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  536. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  537. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  538. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  539. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  540. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  541. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  542. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  543. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  544. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  545. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  546. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  547. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  548. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  549. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  550. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  551. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  552. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  553. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  554. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  557. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  558. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  559. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  560. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  561. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  562. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  563. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  564. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  565. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  566. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  567. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  568. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  569. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  570. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  571. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  572. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  573. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  574. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  575. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  576. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  577. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  578. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  579. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  580. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  581. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  582. package/dist/package.cjs +1 -1
  583. package/dist/package.cjs.map +1 -1
  584. package/dist/package.js +17 -16
  585. package/dist/package.js.map +1 -1
  586. package/dist/routes/usage-tab.cjs +2 -0
  587. package/dist/routes/usage-tab.cjs.map +1 -0
  588. package/dist/routes/usage-tab.d.ts +2 -0
  589. package/dist/routes/usage-tab.js +10 -0
  590. package/dist/routes/usage-tab.js.map +1 -0
  591. package/dist/services/child-conversation-launch.cjs +1 -1
  592. package/dist/services/child-conversation-launch.cjs.map +1 -1
  593. package/dist/services/child-conversation-launch.js +11 -5
  594. package/dist/services/child-conversation-launch.js.map +1 -1
  595. package/dist/stores/archived-conversations-store.cjs +2 -0
  596. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  597. package/dist/stores/archived-conversations-store.d.ts +24 -0
  598. package/dist/stores/archived-conversations-store.js +33 -0
  599. package/dist/stores/archived-conversations-store.js.map +1 -0
  600. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  601. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  602. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  603. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  604. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  605. package/dist/stores/conversation-store.cjs.map +1 -1
  606. package/dist/stores/conversation-store.d.ts +1 -1
  607. package/dist/stores/conversation-store.js.map +1 -1
  608. package/dist/stores/metrics-store.cjs +1 -1
  609. package/dist/stores/metrics-store.cjs.map +1 -1
  610. package/dist/stores/metrics-store.d.ts +1 -0
  611. package/dist/stores/metrics-store.js +7 -4
  612. package/dist/stores/metrics-store.js.map +1 -1
  613. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  614. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  615. package/dist/types/agent-server/type-guards.cjs +1 -1
  616. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  617. package/dist/types/agent-server/type-guards.d.ts +5 -0
  618. package/dist/types/agent-server/type-guards.js +3 -3
  619. package/dist/types/agent-server/type-guards.js.map +1 -1
  620. package/dist/utils/conversation-local-storage.cjs +1 -1
  621. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  622. package/dist/utils/conversation-local-storage.js +2 -1
  623. package/dist/utils/conversation-local-storage.js.map +1 -1
  624. package/dist/utils/format-token-count.cjs +2 -0
  625. package/dist/utils/format-token-count.cjs.map +1 -0
  626. package/dist/utils/format-token-count.d.ts +3 -0
  627. package/dist/utils/format-token-count.js +19 -0
  628. package/dist/utils/format-token-count.js.map +1 -0
  629. package/dist/utils/hover-reveal-classes.cjs +2 -0
  630. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  631. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  632. package/dist/utils/hover-reveal-classes.js +41 -0
  633. package/dist/utils/hover-reveal-classes.js.map +1 -0
  634. package/dist/utils/is-markdown-file-path.cjs +2 -0
  635. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  636. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  637. package/dist/utils/is-markdown-file-path.js +14 -0
  638. package/dist/utils/is-markdown-file-path.js.map +1 -0
  639. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  640. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  641. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  642. package/dist/utils/mcp-marketplace-utils.js +19 -16
  643. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  644. package/dist/utils/transcript-export/index.cjs +3 -3
  645. package/dist/utils/transcript-export/index.cjs.map +1 -1
  646. package/dist/utils/transcript-export/index.js +12 -12
  647. package/dist/utils/transcript-export/index.js.map +1 -1
  648. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  649. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  650. package/dist/utils/transcript-export/load-complete-events.js +4 -4
  651. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  652. package/dist/utils/workspace-relative-path.cjs +2 -0
  653. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  654. package/dist/utils/workspace-relative-path.d.ts +10 -0
  655. package/dist/utils/workspace-relative-path.js +22 -0
  656. package/dist/utils/workspace-relative-path.js.map +1 -0
  657. package/package.json +17 -16
  658. package/scripts/check-sdk-version-sync.mjs +6 -6
  659. package/scripts/dev-process-utils.mjs +6 -1
  660. package/scripts/dev-safe.mjs +57 -2
  661. package/build/assets/active-backend-context-B_bg5h9O.js +0 -2
  662. package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
  663. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
  664. package/build/assets/agent-settings-D_SVrWhI.js +0 -1
  665. package/build/assets/bot-DuN83i3p.js +0 -1
  666. package/build/assets/browser--eoQOo4M.js +0 -6
  667. package/build/assets/check-DLOKoFU9.js +0 -1
  668. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  669. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  670. package/build/assets/conversation-Cmyw9bFh.js +0 -90
  671. package/build/assets/conversation-CvoGZ5vC.js +0 -1
  672. package/build/assets/conversation-panel-CvoGZ5vC.js +0 -1
  673. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  674. package/build/assets/external-link-zWbg5KXS.js +0 -1
  675. package/build/assets/files-tab-D5zuU5TY.js +0 -1
  676. package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
  677. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
  678. package/build/assets/home-DqyeeFA_.js +0 -1
  679. package/build/assets/index-home-DqyeeFA_.js +0 -1
  680. package/build/assets/info-C9lpK5pw.js +0 -1
  681. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
  682. package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
  683. package/build/assets/llm-settings-D9ko42Pi.js +0 -1
  684. package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
  685. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  686. package/build/assets/manifest-e1c3bc3b.js +0 -1
  687. package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
  688. package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
  689. package/build/assets/messages-B2l0qLVk.js +0 -40
  690. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  691. package/build/assets/plus-CtzlyAoF.js +0 -1
  692. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +0 -1
  693. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  694. package/build/assets/root-CRK9fOFd.css +0 -1
  695. package/build/assets/root-layout-BFN2rCOy.js +0 -2
  696. package/build/assets/search-CYaiKHRp.js +0 -1
  697. package/build/assets/shared-conversation-BIAcuORk.js +0 -1
  698. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  699. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  700. package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
  701. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  702. package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
  703. package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
  704. package/build/assets/utils-DPQfkd-7.js +0 -1
  705. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  706. package/build/assets/x-RYDBg-e2.js +0 -1
  707. package/build/assets/zap-tbKDzCe3.js +0 -1
  708. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  709. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  710. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  711. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  712. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  713. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  714. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  715. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  716. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  717. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  718. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  719. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  720. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  721. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  722. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  723. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  724. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  725. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  726. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  727. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  728. package/dist/icons/u-credit-card.cjs +0 -2
  729. package/dist/icons/u-credit-card.cjs.map +0 -1
  730. package/dist/icons/u-credit-card.js +0 -21
  731. package/dist/icons/u-credit-card.js.map +0 -1
  732. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js} +0 -0
@@ -1,58 +1,59 @@
1
1
  import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../i18n/declaration.js";
3
- import { Bot as n } from "../../../node_modules/lucide-react/dist/esm/icons/bot.js";
4
- import { CalendarArrowDown as r } from "../../../node_modules/lucide-react/dist/esm/icons/calendar-arrow-down.js";
5
- import { Clock3 as i } from "../../../node_modules/lucide-react/dist/esm/icons/clock-3.js";
6
- import { ClockArrowDown as a } from "../../../node_modules/lucide-react/dist/esm/icons/clock-arrow-down.js";
7
- import { EyeOff as o } from "../../../node_modules/lucide-react/dist/esm/icons/eye-off.js";
8
- import { Eye as ee } from "../../../node_modules/lucide-react/dist/esm/icons/eye.js";
9
- import { Folder as s } from "../../../node_modules/lucide-react/dist/esm/icons/folder.js";
10
- import { GitBranch as c } from "../../../node_modules/lucide-react/dist/esm/icons/git-branch.js";
11
- import { ListFilter as te } from "../../../node_modules/lucide-react/dist/esm/icons/list-filter.js";
12
- import { MessageCircle as l } from "../../../node_modules/lucide-react/dist/esm/icons/message-circle.js";
13
- import { MousePointerClick as ne } from "../../../node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js";
14
- import { Star as re } from "../../../node_modules/lucide-react/dist/esm/icons/star.js";
15
- import { Tag as u } from "../../../node_modules/lucide-react/dist/esm/icons/tag.js";
16
- import { Trash2 as d } from "../../../node_modules/lucide-react/dist/esm/icons/trash-2.js";
17
- import { Workflow as f } from "../../../node_modules/lucide-react/dist/esm/icons/workflow.js";
18
- import { cn as p } from "../../../utils/utils.js";
19
- import { dropdownInstantColorClassName as m, dropdownMenuListClassName as h, dropdownMenuViewportScrollClassName as g } from "../../../utils/dropdown-classes.js";
3
+ import { Archive as n } from "../../../node_modules/lucide-react/dist/esm/icons/archive.js";
4
+ import { Bot as r } from "../../../node_modules/lucide-react/dist/esm/icons/bot.js";
5
+ import { CalendarArrowDown as i } from "../../../node_modules/lucide-react/dist/esm/icons/calendar-arrow-down.js";
6
+ import { Clock3 as a } from "../../../node_modules/lucide-react/dist/esm/icons/clock-3.js";
7
+ import { ClockArrowDown as o } from "../../../node_modules/lucide-react/dist/esm/icons/clock-arrow-down.js";
8
+ import { EyeOff as s } from "../../../node_modules/lucide-react/dist/esm/icons/eye-off.js";
9
+ import { Eye as c } from "../../../node_modules/lucide-react/dist/esm/icons/eye.js";
10
+ import { Folder as l } from "../../../node_modules/lucide-react/dist/esm/icons/folder.js";
11
+ import { GitBranch as u } from "../../../node_modules/lucide-react/dist/esm/icons/git-branch.js";
12
+ import { ListFilter as d } from "../../../node_modules/lucide-react/dist/esm/icons/list-filter.js";
13
+ import { MessageCircle as f } from "../../../node_modules/lucide-react/dist/esm/icons/message-circle.js";
14
+ import { MousePointerClick as p } from "../../../node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js";
15
+ import { Star as m } from "../../../node_modules/lucide-react/dist/esm/icons/star.js";
16
+ import { Tag as h } from "../../../node_modules/lucide-react/dist/esm/icons/tag.js";
17
+ import { Trash2 as ee } from "../../../node_modules/lucide-react/dist/esm/icons/trash-2.js";
18
+ import { Workflow as g } from "../../../node_modules/lucide-react/dist/esm/icons/workflow.js";
19
+ import { cn as _ } from "../../../utils/utils.js";
20
+ import { dropdownInstantColorClassName as te, dropdownMenuListClassName as ne, dropdownMenuViewportScrollClassName as v } from "../../../utils/dropdown-classes.js";
20
21
  import "./conversation-panel-list-helpers.js";
21
- import { MenuHeading as _ } from "./menu-heading.js";
22
- import { MenuSeparator as v } from "./menu-separator.js";
23
- import { MenuRow as y } from "./menu-row.js";
24
- import b from "react";
25
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
22
+ import { MenuHeading as y } from "./menu-heading.js";
23
+ import { MenuSeparator as b } from "./menu-separator.js";
24
+ import { MenuRow as x } from "./menu-row.js";
25
+ import S from "react";
26
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
26
27
  //#region src/components/features/conversation-panel/conversation-panel-filter-menu.tsx
27
- var C = (e) => e.length > 0 ? e.charAt(0).toUpperCase() + e.slice(1) : e;
28
- function w({ filterMenuOpen: w, setFilterMenuOpen: T, menuRef: E, backendKind: D, organizeMode: O, setOrganizeMode: k, conversationSort: A, setConversationSort: j, threadScope: M, setThreadScope: N, automationFilterMode: P, setAutomationFilterMode: F, selectedAutomationNames: I, onToggleAutomationName: L, automationNameFacets: R, showOlderConversations: z, toggleShowOlderConversations: B, showRepoBranchMetadata: V, toggleShowRepoBranchMetadata: H, showLlmProfiles: U, toggleShowLlmProfiles: W, showTagsMetadata: G, toggleShowTagsMetadata: K, showHoverMetadata: q, toggleShowHoverMetadata: J, totalConversationsCount: Y, onRequestDeleteAll: ie }) {
29
- let { t: X } = e("openhands"), ae = X(D === "local" ? t.CONVERSATION_PANEL$BY_WORKSPACE : t.CONVERSATION_PANEL$BY_REPOSITORY), Z = b.useRef(null), Q = b.useRef(null), $ = b.useRef(w);
30
- return b.useEffect(() => {
31
- w ? (Q.current?.querySelector("[role=\"menuitem\"], [role=\"menuitemradio\"]"))?.focus() : $.current && Z.current?.focus(), $.current = w;
32
- }, [w]), /* @__PURE__ */ S("div", {
33
- ref: E,
28
+ var T = (e) => e.length > 0 ? e.charAt(0).toUpperCase() + e.slice(1) : e;
29
+ function E({ filterMenuOpen: E, setFilterMenuOpen: D, menuRef: re, backendKind: ie, organizeMode: O, setOrganizeMode: k, conversationSort: A, setConversationSort: j, threadScope: M, setThreadScope: N, automationFilterMode: P, setAutomationFilterMode: F, selectedAutomationNames: I, onToggleAutomationName: L, automationNameFacets: R, showOlderConversations: z, showArchivedConversations: B, toggleShowArchivedConversations: V, toggleShowOlderConversations: H, showRepoBranchMetadata: U, toggleShowRepoBranchMetadata: W, showLlmProfiles: G, toggleShowLlmProfiles: K, showTagsMetadata: q, toggleShowTagsMetadata: J, showHoverMetadata: ae, toggleShowHoverMetadata: oe, totalConversationsCount: Y, onRequestDeleteAll: se }) {
30
+ let { t: X } = e("openhands"), ce = X(ie === "local" ? t.CONVERSATION_PANEL$BY_WORKSPACE : t.CONVERSATION_PANEL$BY_REPOSITORY), Z = S.useRef(null), Q = S.useRef(null), $ = S.useRef(E);
31
+ return S.useEffect(() => {
32
+ E ? (Q.current?.querySelector("[role=\"menuitem\"], [role=\"menuitemradio\"]"))?.focus() : $.current && Z.current?.focus(), $.current = E;
33
+ }, [E]), /* @__PURE__ */ w("div", {
34
+ ref: re,
34
35
  className: "relative shrink-0 pr-0.5",
35
- children: [/* @__PURE__ */ S("button", {
36
+ children: [/* @__PURE__ */ w("button", {
36
37
  ref: Z,
37
38
  type: "button",
38
39
  "data-testid": "older-conversations-filter-toggle",
39
40
  "aria-label": X(t.CONVERSATION_PANEL$FILTER_LABEL),
40
41
  "aria-haspopup": "menu",
41
- "aria-expanded": w,
42
- onClick: () => T(!w),
43
- className: p("relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]", m),
44
- children: [/* @__PURE__ */ x(te, {
42
+ "aria-expanded": E,
43
+ onClick: () => D(!E),
44
+ className: _("relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]", te),
45
+ children: [/* @__PURE__ */ C(d, {
45
46
  className: "lucide lucide-list-filter shrink-0",
46
47
  width: 14,
47
48
  height: 14,
48
49
  strokeWidth: 2,
49
50
  "aria-hidden": !0
50
- }), P === "all" ? null : /* @__PURE__ */ x("span", {
51
+ }), P === "all" ? null : /* @__PURE__ */ C("span", {
51
52
  "aria-hidden": !0,
52
53
  "data-testid": "automation-filter-active-indicator",
53
54
  className: "absolute right-0.5 top-0.5 h-1.5 w-1.5 rounded-full bg-[var(--oh-accent)]"
54
55
  })]
55
- }), w ? /* @__PURE__ */ S("div", {
56
+ }), E ? /* @__PURE__ */ w("div", {
56
57
  ref: Q,
57
58
  role: "menu",
58
59
  "aria-orientation": "vertical",
@@ -61,7 +62,7 @@ function w({ filterMenuOpen: w, setFilterMenuOpen: T, menuRef: E, backendKind: D
61
62
  "data-testid": "older-conversations-filter-menu",
62
63
  onKeyDown: (e) => {
63
64
  if (e.key === "Escape") {
64
- e.preventDefault(), T(!1);
65
+ e.preventDefault(), D(!1);
65
66
  return;
66
67
  }
67
68
  if (e.key !== "ArrowDown" && e.key !== "ArrowUp") return;
@@ -72,159 +73,168 @@ function w({ filterMenuOpen: w, setFilterMenuOpen: T, menuRef: E, backendKind: D
72
73
  let r = n.indexOf(document.activeElement), i = e.key === "ArrowDown" ? 1 : -1, a = ((r === -1 ? 0 : r) + i + n.length) % n.length;
73
74
  e.preventDefault(), n[a]?.focus();
74
75
  },
75
- className: p("absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg", h, g),
76
+ className: _("absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg", ne, v),
76
77
  children: [
77
- /* @__PURE__ */ x(_, { children: X(t.CONVERSATION_PANEL$ORGANIZE) }),
78
- /* @__PURE__ */ x(y, {
79
- icon: s,
80
- label: ae,
78
+ /* @__PURE__ */ C(y, { children: X(t.CONVERSATION_PANEL$ORGANIZE) }),
79
+ /* @__PURE__ */ C(x, {
80
+ icon: l,
81
+ label: ce,
81
82
  selected: O === "grouped",
82
83
  onClick: () => {
83
- k("grouped"), T(!1);
84
+ k("grouped"), D(!1);
84
85
  }
85
86
  }),
86
- /* @__PURE__ */ x(y, {
87
- icon: i,
87
+ /* @__PURE__ */ C(x, {
88
+ icon: a,
88
89
  label: X(t.CONVERSATION_PANEL$CHRONOLOGICAL),
89
90
  selected: O === "chronological",
90
91
  onClick: () => {
91
- k("chronological"), T(!1);
92
+ k("chronological"), D(!1);
92
93
  }
93
94
  }),
94
- /* @__PURE__ */ x(v, {}),
95
- /* @__PURE__ */ x(_, { children: X(t.CONVERSATION_PANEL$SORT_BY) }),
96
- /* @__PURE__ */ x(y, {
97
- icon: r,
95
+ /* @__PURE__ */ C(b, {}),
96
+ /* @__PURE__ */ C(y, { children: X(t.CONVERSATION_PANEL$SORT_BY) }),
97
+ /* @__PURE__ */ C(x, {
98
+ icon: i,
98
99
  label: X(t.CONVERSATION_PANEL$SORT_CREATED),
99
100
  selected: A === "created",
100
101
  onClick: () => {
101
- j("created"), T(!1);
102
+ j("created"), D(!1);
102
103
  }
103
104
  }),
104
- /* @__PURE__ */ x(y, {
105
- icon: a,
105
+ /* @__PURE__ */ C(x, {
106
+ icon: o,
106
107
  label: X(t.CONVERSATION_PANEL$SORT_UPDATED),
107
108
  selected: A === "updated",
108
109
  onClick: () => {
109
- j("updated"), T(!1);
110
+ j("updated"), D(!1);
110
111
  }
111
112
  }),
112
- /* @__PURE__ */ x(v, {}),
113
- /* @__PURE__ */ x(_, { children: X(t.CONVERSATION_PANEL$SHOW) }),
114
- /* @__PURE__ */ x(y, {
115
- icon: l,
113
+ /* @__PURE__ */ C(b, {}),
114
+ /* @__PURE__ */ C(y, { children: X(t.CONVERSATION_PANEL$SHOW) }),
115
+ /* @__PURE__ */ C(x, {
116
+ icon: f,
116
117
  label: X(t.CONVERSATION_PANEL$ALL_THREADS),
117
118
  selected: M === "all",
118
119
  onClick: () => {
119
- N("all"), T(!1);
120
+ N("all"), D(!1);
120
121
  }
121
122
  }),
122
- /* @__PURE__ */ x(y, {
123
- icon: re,
123
+ /* @__PURE__ */ C(x, {
124
+ icon: m,
124
125
  label: X(t.CONVERSATION_PANEL$RELEVANT_THREADS),
125
126
  selected: M === "relevant",
126
127
  onClick: () => {
127
- N("relevant"), T(!1);
128
+ N("relevant"), D(!1);
128
129
  }
129
130
  }),
130
- /* @__PURE__ */ x(v, {}),
131
- /* @__PURE__ */ x(_, { children: X(t.CONVERSATION_PANEL$AUTOMATIONS) }),
132
- /* @__PURE__ */ x(y, {
133
- icon: l,
131
+ /* @__PURE__ */ C(x, {
132
+ icon: n,
133
+ label: X(t.CONVERSATION_PANEL$SHOW_ARCHIVED),
134
+ selected: B,
135
+ testId: "toggle-show-archived",
136
+ onClick: () => {
137
+ V(), D(!1);
138
+ }
139
+ }),
140
+ /* @__PURE__ */ C(b, {}),
141
+ /* @__PURE__ */ C(y, { children: X(t.CONVERSATION_PANEL$AUTOMATIONS) }),
142
+ /* @__PURE__ */ C(x, {
143
+ icon: f,
134
144
  label: X(t.CONVERSATION_PANEL$AUTOMATIONS_ALL),
135
145
  selected: P === "all",
136
146
  testId: "automation-filter-all",
137
147
  onClick: () => {
138
- F("all"), T(!1);
148
+ F("all"), D(!1);
139
149
  }
140
150
  }),
141
- /* @__PURE__ */ x(y, {
142
- icon: o,
151
+ /* @__PURE__ */ C(x, {
152
+ icon: s,
143
153
  label: X(t.CONVERSATION_PANEL$AUTOMATIONS_HIDE),
144
154
  selected: P === "hide-automations",
145
155
  testId: "automation-filter-hide",
146
156
  onClick: () => {
147
- F("hide-automations"), T(!1);
157
+ F("hide-automations"), D(!1);
148
158
  }
149
159
  }),
150
- /* @__PURE__ */ x(y, {
151
- icon: f,
160
+ /* @__PURE__ */ C(x, {
161
+ icon: g,
152
162
  label: X(t.CONVERSATION_PANEL$AUTOMATIONS_ONLY),
153
163
  selected: P === "only-automations",
154
164
  testId: "automation-filter-only",
155
165
  onClick: () => {
156
- F("only-automations"), T(!1);
166
+ F("only-automations"), D(!1);
157
167
  }
158
168
  }),
159
- P === "only-automations" ? R.map((e) => /* @__PURE__ */ x(y, {
160
- icon: u,
169
+ P === "only-automations" ? R.map((e) => /* @__PURE__ */ C(x, {
170
+ icon: h,
161
171
  label: e === "__unnamed__" ? X(t.CONVERSATION_PANEL$AUTOMATION_UNNAMED) : e,
162
172
  selected: I.includes(e),
163
173
  testId: `automation-name-filter-${e}`,
164
174
  onClick: () => L(e)
165
175
  }, e)) : null,
166
- /* @__PURE__ */ x(v, {}),
167
- /* @__PURE__ */ x(_, { children: X(t.CONVERSATION_PANEL$METADATA) }),
168
- /* @__PURE__ */ x(y, {
169
- icon: c,
176
+ /* @__PURE__ */ C(b, {}),
177
+ /* @__PURE__ */ C(y, { children: X(t.CONVERSATION_PANEL$METADATA) }),
178
+ /* @__PURE__ */ C(x, {
179
+ icon: u,
170
180
  label: X(t.CONVERSATION_PANEL$REPO_BRANCH),
171
- selected: V,
181
+ selected: U,
172
182
  testId: "toggle-repo-branch-metadata",
173
183
  onClick: () => {
174
- H(), T(!1);
184
+ W(), D(!1);
175
185
  }
176
186
  }),
177
- /* @__PURE__ */ x(y, {
178
- icon: n,
187
+ /* @__PURE__ */ C(x, {
188
+ icon: r,
179
189
  label: X(t.CONVERSATION_PANEL$LLM_MODEL),
180
- selected: U,
190
+ selected: G,
181
191
  testId: "toggle-llm-profiles",
182
192
  onClick: () => {
183
- W(), T(!1);
193
+ K(), D(!1);
184
194
  }
185
195
  }),
186
- /* @__PURE__ */ x(y, {
187
- icon: u,
196
+ /* @__PURE__ */ C(x, {
197
+ icon: h,
188
198
  label: X(t.CONVERSATION_PANEL$TAGS),
189
- selected: G,
199
+ selected: q,
190
200
  testId: "toggle-tags-metadata",
191
201
  onClick: () => {
192
- K(), T(!1);
202
+ J(), D(!1);
193
203
  }
194
204
  }),
195
- /* @__PURE__ */ x(y, {
196
- icon: ne,
205
+ /* @__PURE__ */ C(x, {
206
+ icon: p,
197
207
  label: X(t.CONVERSATION_PANEL$HOVER_METADATA),
198
- selected: q,
208
+ selected: ae,
199
209
  testId: "toggle-hover-metadata",
200
210
  onClick: () => {
201
- J(), T(!1);
211
+ oe(), D(!1);
202
212
  }
203
213
  }),
204
- /* @__PURE__ */ x(v, {}),
205
- /* @__PURE__ */ x(_, {
206
- suffix: /* @__PURE__ */ x("span", {
214
+ /* @__PURE__ */ C(b, {}),
215
+ /* @__PURE__ */ C(y, {
216
+ suffix: /* @__PURE__ */ C("span", {
207
217
  className: "shrink-0 text-right text-[10px] font-medium normal-case tracking-normal text-[var(--oh-muted)]/70",
208
218
  children: X(t.CONVERSATION_PANEL$OLDER_OVER_ONE_HOUR)
209
219
  }),
210
220
  children: X(t.CONVERSATION_PANEL$OLDER_SECTION)
211
221
  }),
212
- /* @__PURE__ */ x(y, {
222
+ /* @__PURE__ */ C(x, {
213
223
  testId: "toggle-older-conversations",
214
- icon: z ? o : ee,
215
- label: C(X(z ? t.CONVERSATION$HIDE : t.CONVERSATION$SHOW_ALL)),
224
+ icon: z ? s : c,
225
+ label: T(X(z ? t.CONVERSATION$HIDE : t.CONVERSATION$SHOW_ALL)),
216
226
  onClick: () => {
217
- B(), T(!1);
227
+ H(), D(!1);
218
228
  }
219
229
  }),
220
- /* @__PURE__ */ x(v, {}),
221
- /* @__PURE__ */ x(y, {
230
+ /* @__PURE__ */ C(b, {}),
231
+ /* @__PURE__ */ C(x, {
222
232
  testId: "delete-all-conversations",
223
- icon: d,
224
- label: C(X(t.CONVERSATION$DELETE_ALL)),
233
+ icon: ee,
234
+ label: T(X(t.CONVERSATION$DELETE_ALL)),
225
235
  disabled: Y === 0,
226
236
  onClick: () => {
227
- Y !== 0 && (ie(), T(!1));
237
+ Y !== 0 && (se(), D(!1));
228
238
  }
229
239
  })
230
240
  ]
@@ -232,6 +242,6 @@ function w({ filterMenuOpen: w, setFilterMenuOpen: T, menuRef: E, backendKind: D
232
242
  });
233
243
  }
234
244
  //#endregion
235
- export { w as ConversationPanelFilterMenu };
245
+ export { E as ConversationPanelFilterMenu };
236
246
 
237
247
  //# sourceMappingURL=conversation-panel-filter-menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-panel-filter-menu.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-filter-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Bot,\n CalendarArrowDown,\n Clock3,\n ClockArrowDown,\n Eye,\n EyeOff,\n Folder,\n GitBranch,\n ListFilter,\n MessageCircle,\n MousePointerClick,\n Star,\n Tag,\n Trash2,\n Workflow,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n UNNAMED_AUTOMATION_FACET,\n type AutomationFilterMode,\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n\nexport interface ConversationPanelFilterMenuProps {\n filterMenuOpen: boolean;\n setFilterMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n organizeMode: OrganizeMode;\n setOrganizeMode: (mode: OrganizeMode) => void;\n conversationSort: ConversationSortField;\n setConversationSort: (sort: ConversationSortField) => void;\n threadScope: ThreadScope;\n setThreadScope: (scope: ThreadScope) => void;\n automationFilterMode: AutomationFilterMode;\n setAutomationFilterMode: (mode: AutomationFilterMode) => void;\n selectedAutomationNames: string[];\n onToggleAutomationName: (name: string) => void;\n automationNameFacets: string[];\n showOlderConversations: boolean;\n toggleShowOlderConversations: () => void;\n showRepoBranchMetadata: boolean;\n toggleShowRepoBranchMetadata: () => void;\n showLlmProfiles: boolean;\n toggleShowLlmProfiles: () => void;\n showTagsMetadata: boolean;\n toggleShowTagsMetadata: () => void;\n showHoverMetadata: boolean;\n toggleShowHoverMetadata: () => void;\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationPanelFilterMenu({\n filterMenuOpen,\n setFilterMenuOpen,\n menuRef,\n backendKind,\n organizeMode,\n setOrganizeMode,\n conversationSort,\n setConversationSort,\n threadScope,\n setThreadScope,\n automationFilterMode,\n setAutomationFilterMode,\n selectedAutomationNames,\n onToggleAutomationName,\n automationNameFacets,\n showOlderConversations,\n toggleShowOlderConversations,\n showRepoBranchMetadata,\n toggleShowRepoBranchMetadata,\n showLlmProfiles,\n toggleShowLlmProfiles,\n showTagsMetadata,\n toggleShowTagsMetadata,\n showHoverMetadata,\n toggleShowHoverMetadata,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationPanelFilterMenuProps) {\n const { t } = useTranslation(\"openhands\");\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // When the menu opens, move keyboard focus into it so screen-reader /\n // keyboard-only users can interact with the options immediately. When\n // it closes, return focus to the trigger so Tab order picks up where\n // the user left off.\n const wasOpenRef = React.useRef(filterMenuOpen);\n React.useEffect(() => {\n if (filterMenuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n // Only return focus on a real open→close transition (not the\n // mount-with-open=false case).\n triggerRef.current?.focus();\n }\n wasOpenRef.current = filterMenuOpen;\n }, [filterMenuOpen]);\n\n // Roving Arrow Up/Down + Escape across the menu items. Tab still works\n // natively; Escape closes the menu and returns focus to the trigger\n // (via the effect above).\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setFilterMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"older-conversations-filter-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL)}\n aria-haspopup=\"menu\"\n aria-expanded={filterMenuOpen}\n onClick={() => setFilterMenuOpen(!filterMenuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"lucide lucide-list-filter shrink-0\"\n width={14}\n height={14}\n strokeWidth={2}\n aria-hidden\n />\n {automationFilterMode !== \"all\" ? (\n <span\n aria-hidden\n data-testid=\"automation-filter-active-indicator\"\n className=\"absolute right-0.5 top-0.5 h-1.5 w-1.5 rounded-full bg-[var(--oh-accent)]\"\n />\n ) : null}\n </button>\n\n {filterMenuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL)}\n // `role=\"menu\"` is an interactive ARIA role, so the container\n // must be focusable to satisfy jsx-a11y. `-1` keeps it out of\n // the natural Tab order (the menu items themselves are\n // `<button>`s and tabbable on their own) but still allows the\n // open-effect to focus it / its children programmatically.\n tabIndex={-1}\n data-testid=\"older-conversations-filter-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$ORGANIZE)}</MenuHeading>\n <MenuRow\n icon={Folder}\n label={groupedLabel}\n selected={organizeMode === \"grouped\"}\n onClick={() => {\n setOrganizeMode(\"grouped\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Clock3}\n label={t(I18nKey.CONVERSATION_PANEL$CHRONOLOGICAL)}\n selected={organizeMode === \"chronological\"}\n onClick={() => {\n setOrganizeMode(\"chronological\");\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$SORT_BY)}</MenuHeading>\n <MenuRow\n icon={CalendarArrowDown}\n label={t(I18nKey.CONVERSATION_PANEL$SORT_CREATED)}\n selected={conversationSort === \"created\"}\n onClick={() => {\n setConversationSort(\"created\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={ClockArrowDown}\n label={t(I18nKey.CONVERSATION_PANEL$SORT_UPDATED)}\n selected={conversationSort === \"updated\"}\n onClick={() => {\n setConversationSort(\"updated\");\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$SHOW)}</MenuHeading>\n <MenuRow\n icon={MessageCircle}\n label={t(I18nKey.CONVERSATION_PANEL$ALL_THREADS)}\n selected={threadScope === \"all\"}\n onClick={() => {\n setThreadScope(\"all\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Star}\n label={t(I18nKey.CONVERSATION_PANEL$RELEVANT_THREADS)}\n selected={threadScope === \"relevant\"}\n onClick={() => {\n setThreadScope(\"relevant\");\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS)}</MenuHeading>\n <MenuRow\n icon={MessageCircle}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_ALL)}\n selected={automationFilterMode === \"all\"}\n testId=\"automation-filter-all\"\n onClick={() => {\n setAutomationFilterMode(\"all\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={EyeOff}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_HIDE)}\n selected={automationFilterMode === \"hide-automations\"}\n testId=\"automation-filter-hide\"\n onClick={() => {\n setAutomationFilterMode(\"hide-automations\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Workflow}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_ONLY)}\n selected={automationFilterMode === \"only-automations\"}\n testId=\"automation-filter-only\"\n onClick={() => {\n setAutomationFilterMode(\"only-automations\");\n setFilterMenuOpen(false);\n }}\n />\n {automationFilterMode === \"only-automations\"\n ? automationNameFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={\n facet === UNNAMED_AUTOMATION_FACET\n ? t(I18nKey.CONVERSATION_PANEL$AUTOMATION_UNNAMED)\n : facet\n }\n selected={selectedAutomationNames.includes(facet)}\n testId={`automation-name-filter-${facet}`}\n // Multi-select name rows keep the menu open (unlike the\n // mode radios above) so several names can be toggled in\n // one visit.\n onClick={() => onToggleAutomationName(facet)}\n />\n ))\n : null}\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$METADATA)}</MenuHeading>\n <MenuRow\n icon={GitBranch}\n label={t(I18nKey.CONVERSATION_PANEL$REPO_BRANCH)}\n selected={showRepoBranchMetadata}\n testId=\"toggle-repo-branch-metadata\"\n onClick={() => {\n toggleShowRepoBranchMetadata();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Bot}\n label={t(I18nKey.CONVERSATION_PANEL$LLM_MODEL)}\n selected={showLlmProfiles}\n testId=\"toggle-llm-profiles\"\n onClick={() => {\n toggleShowLlmProfiles();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAGS)}\n selected={showTagsMetadata}\n testId=\"toggle-tags-metadata\"\n onClick={() => {\n toggleShowTagsMetadata();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={MousePointerClick}\n label={t(I18nKey.CONVERSATION_PANEL$HOVER_METADATA)}\n selected={showHoverMetadata}\n testId=\"toggle-hover-metadata\"\n onClick={() => {\n toggleShowHoverMetadata();\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading\n suffix={\n <span className=\"shrink-0 text-right text-[10px] font-medium normal-case tracking-normal text-[var(--oh-muted)]/70\">\n {t(I18nKey.CONVERSATION_PANEL$OLDER_OVER_ONE_HOUR)}\n </span>\n }\n >\n {t(I18nKey.CONVERSATION_PANEL$OLDER_SECTION)}\n </MenuHeading>\n <MenuRow\n testId=\"toggle-older-conversations\"\n icon={showOlderConversations ? EyeOff : Eye}\n label={\n showOlderConversations\n ? capitalizeLabel(t(I18nKey.CONVERSATION$HIDE))\n : capitalizeLabel(t(I18nKey.CONVERSATION$SHOW_ALL))\n }\n onClick={() => {\n toggleShowOlderConversations();\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setFilterMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-panel-filter-menu.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-filter-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Archive,\n Bot,\n CalendarArrowDown,\n Clock3,\n ClockArrowDown,\n Eye,\n EyeOff,\n Folder,\n GitBranch,\n ListFilter,\n MessageCircle,\n MousePointerClick,\n Star,\n Tag,\n Trash2,\n Workflow,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n UNNAMED_AUTOMATION_FACET,\n type AutomationFilterMode,\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n\nexport interface ConversationPanelFilterMenuProps {\n filterMenuOpen: boolean;\n setFilterMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n organizeMode: OrganizeMode;\n setOrganizeMode: (mode: OrganizeMode) => void;\n conversationSort: ConversationSortField;\n setConversationSort: (sort: ConversationSortField) => void;\n threadScope: ThreadScope;\n setThreadScope: (scope: ThreadScope) => void;\n automationFilterMode: AutomationFilterMode;\n setAutomationFilterMode: (mode: AutomationFilterMode) => void;\n selectedAutomationNames: string[];\n onToggleAutomationName: (name: string) => void;\n automationNameFacets: string[];\n showOlderConversations: boolean;\n showArchivedConversations: boolean;\n toggleShowArchivedConversations: () => void;\n toggleShowOlderConversations: () => void;\n showRepoBranchMetadata: boolean;\n toggleShowRepoBranchMetadata: () => void;\n showLlmProfiles: boolean;\n toggleShowLlmProfiles: () => void;\n showTagsMetadata: boolean;\n toggleShowTagsMetadata: () => void;\n showHoverMetadata: boolean;\n toggleShowHoverMetadata: () => void;\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationPanelFilterMenu({\n filterMenuOpen,\n setFilterMenuOpen,\n menuRef,\n backendKind,\n organizeMode,\n setOrganizeMode,\n conversationSort,\n setConversationSort,\n threadScope,\n setThreadScope,\n automationFilterMode,\n setAutomationFilterMode,\n selectedAutomationNames,\n onToggleAutomationName,\n automationNameFacets,\n showOlderConversations,\n showArchivedConversations,\n toggleShowArchivedConversations,\n toggleShowOlderConversations,\n showRepoBranchMetadata,\n toggleShowRepoBranchMetadata,\n showLlmProfiles,\n toggleShowLlmProfiles,\n showTagsMetadata,\n toggleShowTagsMetadata,\n showHoverMetadata,\n toggleShowHoverMetadata,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationPanelFilterMenuProps) {\n const { t } = useTranslation(\"openhands\");\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // When the menu opens, move keyboard focus into it so screen-reader /\n // keyboard-only users can interact with the options immediately. When\n // it closes, return focus to the trigger so Tab order picks up where\n // the user left off.\n const wasOpenRef = React.useRef(filterMenuOpen);\n React.useEffect(() => {\n if (filterMenuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n // Only return focus on a real open→close transition (not the\n // mount-with-open=false case).\n triggerRef.current?.focus();\n }\n wasOpenRef.current = filterMenuOpen;\n }, [filterMenuOpen]);\n\n // Roving Arrow Up/Down + Escape across the menu items. Tab still works\n // natively; Escape closes the menu and returns focus to the trigger\n // (via the effect above).\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setFilterMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"older-conversations-filter-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL)}\n aria-haspopup=\"menu\"\n aria-expanded={filterMenuOpen}\n onClick={() => setFilterMenuOpen(!filterMenuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"lucide lucide-list-filter shrink-0\"\n width={14}\n height={14}\n strokeWidth={2}\n aria-hidden\n />\n {automationFilterMode !== \"all\" ? (\n <span\n aria-hidden\n data-testid=\"automation-filter-active-indicator\"\n className=\"absolute right-0.5 top-0.5 h-1.5 w-1.5 rounded-full bg-[var(--oh-accent)]\"\n />\n ) : null}\n </button>\n\n {filterMenuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$FILTER_LABEL)}\n // `role=\"menu\"` is an interactive ARIA role, so the container\n // must be focusable to satisfy jsx-a11y. `-1` keeps it out of\n // the natural Tab order (the menu items themselves are\n // `<button>`s and tabbable on their own) but still allows the\n // open-effect to focus it / its children programmatically.\n tabIndex={-1}\n data-testid=\"older-conversations-filter-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$ORGANIZE)}</MenuHeading>\n <MenuRow\n icon={Folder}\n label={groupedLabel}\n selected={organizeMode === \"grouped\"}\n onClick={() => {\n setOrganizeMode(\"grouped\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Clock3}\n label={t(I18nKey.CONVERSATION_PANEL$CHRONOLOGICAL)}\n selected={organizeMode === \"chronological\"}\n onClick={() => {\n setOrganizeMode(\"chronological\");\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$SORT_BY)}</MenuHeading>\n <MenuRow\n icon={CalendarArrowDown}\n label={t(I18nKey.CONVERSATION_PANEL$SORT_CREATED)}\n selected={conversationSort === \"created\"}\n onClick={() => {\n setConversationSort(\"created\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={ClockArrowDown}\n label={t(I18nKey.CONVERSATION_PANEL$SORT_UPDATED)}\n selected={conversationSort === \"updated\"}\n onClick={() => {\n setConversationSort(\"updated\");\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$SHOW)}</MenuHeading>\n <MenuRow\n icon={MessageCircle}\n label={t(I18nKey.CONVERSATION_PANEL$ALL_THREADS)}\n selected={threadScope === \"all\"}\n onClick={() => {\n setThreadScope(\"all\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Star}\n label={t(I18nKey.CONVERSATION_PANEL$RELEVANT_THREADS)}\n selected={threadScope === \"relevant\"}\n onClick={() => {\n setThreadScope(\"relevant\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Archive}\n label={t(I18nKey.CONVERSATION_PANEL$SHOW_ARCHIVED)}\n selected={showArchivedConversations}\n testId=\"toggle-show-archived\"\n onClick={() => {\n toggleShowArchivedConversations();\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS)}</MenuHeading>\n <MenuRow\n icon={MessageCircle}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_ALL)}\n selected={automationFilterMode === \"all\"}\n testId=\"automation-filter-all\"\n onClick={() => {\n setAutomationFilterMode(\"all\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={EyeOff}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_HIDE)}\n selected={automationFilterMode === \"hide-automations\"}\n testId=\"automation-filter-hide\"\n onClick={() => {\n setAutomationFilterMode(\"hide-automations\");\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Workflow}\n label={t(I18nKey.CONVERSATION_PANEL$AUTOMATIONS_ONLY)}\n selected={automationFilterMode === \"only-automations\"}\n testId=\"automation-filter-only\"\n onClick={() => {\n setAutomationFilterMode(\"only-automations\");\n setFilterMenuOpen(false);\n }}\n />\n {automationFilterMode === \"only-automations\"\n ? automationNameFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={\n facet === UNNAMED_AUTOMATION_FACET\n ? t(I18nKey.CONVERSATION_PANEL$AUTOMATION_UNNAMED)\n : facet\n }\n selected={selectedAutomationNames.includes(facet)}\n testId={`automation-name-filter-${facet}`}\n // Multi-select name rows keep the menu open (unlike the\n // mode radios above) so several names can be toggled in\n // one visit.\n onClick={() => onToggleAutomationName(facet)}\n />\n ))\n : null}\n\n <MenuSeparator />\n <MenuHeading>{t(I18nKey.CONVERSATION_PANEL$METADATA)}</MenuHeading>\n <MenuRow\n icon={GitBranch}\n label={t(I18nKey.CONVERSATION_PANEL$REPO_BRANCH)}\n selected={showRepoBranchMetadata}\n testId=\"toggle-repo-branch-metadata\"\n onClick={() => {\n toggleShowRepoBranchMetadata();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Bot}\n label={t(I18nKey.CONVERSATION_PANEL$LLM_MODEL)}\n selected={showLlmProfiles}\n testId=\"toggle-llm-profiles\"\n onClick={() => {\n toggleShowLlmProfiles();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAGS)}\n selected={showTagsMetadata}\n testId=\"toggle-tags-metadata\"\n onClick={() => {\n toggleShowTagsMetadata();\n setFilterMenuOpen(false);\n }}\n />\n <MenuRow\n icon={MousePointerClick}\n label={t(I18nKey.CONVERSATION_PANEL$HOVER_METADATA)}\n selected={showHoverMetadata}\n testId=\"toggle-hover-metadata\"\n onClick={() => {\n toggleShowHoverMetadata();\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuHeading\n suffix={\n <span className=\"shrink-0 text-right text-[10px] font-medium normal-case tracking-normal text-[var(--oh-muted)]/70\">\n {t(I18nKey.CONVERSATION_PANEL$OLDER_OVER_ONE_HOUR)}\n </span>\n }\n >\n {t(I18nKey.CONVERSATION_PANEL$OLDER_SECTION)}\n </MenuHeading>\n <MenuRow\n testId=\"toggle-older-conversations\"\n icon={showOlderConversations ? EyeOff : Eye}\n label={\n showOlderConversations\n ? capitalizeLabel(t(I18nKey.CONVERSATION$HIDE))\n : capitalizeLabel(t(I18nKey.CONVERSATION$SHOW_ALL))\n }\n onClick={() => {\n toggleShowOlderConversations();\n setFilterMenuOpen(false);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setFilterMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");function t(e,t){let n=t.limit??5;if(t.expanded||e.length<=n)return{visibleConversations:[...e],isPreviewTruncated:e.length>n,isShowingAll:!0};let r=t.activeConversationId==null?-1:e.findIndex(e=>e.id===t.activeConversationId);if(r>=n){let t=e[r];return{visibleConversations:[...e.slice(0,n-1),t],isPreviewTruncated:!0,isShowingAll:!1}}return{visibleConversations:e.slice(0,n),isPreviewTruncated:e.length>n,isShowingAll:!1}}function n(e,t){let n=new Map(t.map(e=>[e.id,e]));return e.map(e=>n.get(e)).filter(e=>e!=null)}function r(e,t){if(t.length===0)return[...e];let n=new Set(t);return e.filter(e=>!n.has(e.id))}var i=`__unnamed__`;function a(t){if(t.trigger===`automation`)return!0;let n=t.tags;return n?e.AUTOMATION_TAG_KEYS.some(e=>!!n[e]):!1}function o(e){return e.tags?.automationname?.trim()||`__unnamed__`}function s(e){let t=new Set,n=!1;for(let r of e){if(!a(r))continue;let e=o(r);e===`__unnamed__`?n=!0:t.add(e)}let r=[...t].sort((e,t)=>e.localeCompare(t));return n&&r.push(i),r}function c(e,t,n,r){if(t===`all`)return[...e];if(t===`hide-automations`)return e.filter(e=>!a(e));let i=new Set(r),s=n.filter(e=>i.has(e)),c=s.length>0?new Set(s):null;return e.filter(e=>a(e)?c===null||c.has(o(e)):!1)}function l(e,t,n){if(t===`local`)return e===`__none_workspace`?{}:e.startsWith(`ws:`)?{workingDir:e.slice(3)}:{};if(e===`__none_repo`)return{};if(e.startsWith(`repo:`)){let t=e.slice(5),r=n[0];return{repository:{name:t,gitProvider:r?.git_provider??`github`,branch:r?.selected_branch??`main`}}}return{}}function u(e){if(!e)return 0;let t=Date.parse(e);return Number.isFinite(t)?t:0}function d(e,t){let n=t===`created`?`created_at`:`updated_at`;return[...e].sort((e,t)=>u(t[n])-u(e[n]))}function f(e){let t=e.selected_workspace?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_workspace`,label:``};let n=t.split(`/`).filter(Boolean).pop()??t;return{id:`ws:${t}`,label:n}}function p(e){let t=e.selected_repository?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_repo`,label:``};let n=t.split(`/`).filter(Boolean),r=n.length?(n[n.length-1]??t).replace(/\.git$/,``):t.replace(/\.git$/,``);return{id:`repo:${t}`,label:r}}function m(e,t,n,r){let i=new Map;for(let n of e){let{id:e,label:a}=t===`local`?f(n):p(n),o=e===`__none_workspace`?r.emptyWorkspace:e===`__none_repo`?r.emptyRepository:a,s=i.get(e);s?s.conversations.push(n):i.set(e,{label:o,conversations:[n]})}let a=[...i.entries()].map(([e,r])=>{let i=d(r.conversations,n);return{id:e,label:r.label,conversations:i,launch:l(e,t,i)}}),o=e=>e.conversations.reduce((e,t)=>Math.max(e,u(n===`created`?t.created_at:t.updated_at)),0);return a.sort((e,t)=>o(t)-o(e)),a}function h(e,t){if(t.length===0)return[...e];let n=new Map(e.map(e=>[e.id,e])),r=[],i=new Set;for(let e of t){let t=n.get(e);t&&(r.push(t),i.add(e))}for(let t of e)i.has(t.id)||r.push(t);return r}function g(e,t,n,r,i=`after`){if(n===r)return[...e];let a=h(t.map(e=>({id:e})),e).map(e=>e.id),o=a.indexOf(n),s=a.indexOf(r);if(o<0||s<0)return[...e];let c=[...a];c.splice(o,1);let l=c.indexOf(r),u=i===`before`?l:l+1;return c.splice(u,0,n),c}exports.UNNAMED_AUTOMATION_FACET=i,exports.applyAutomationConversationFilter=c,exports.applyGroupFolderOrder=h,exports.collectAutomationNameFacets=s,exports.filterOutPinnedConversations=r,exports.getGroupConversationPreview=t,exports.groupConversations=m,exports.moveGroupFolderOrder=g,exports.resolvePinnedConversations=n,exports.sortConversationsByField=d;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");function t(e,t,n){if(!t)return[...e];let r=e.filter(e=>t.has(e.id));if(n!=null&&!r.some(e=>e.id===n)){let t=e.find(e=>e.id===n);t&&r.push(t)}return r}function n(e,n){let r=n.limit??5,i=t(e,n.discoveryConversationIds,n.activeConversationId),a;if(i.length<=r)a=i;else{let e=n.activeConversationId==null?-1:i.findIndex(e=>e.id===n.activeConversationId);a=e>=r?[...i.slice(0,r-1),i[e]]:i.slice(0,r)}let o=a.length<e.length;return n.expanded?{visibleConversations:[...e],isPreviewTruncated:o,isShowingAll:!0}:{visibleConversations:a,isPreviewTruncated:o,isShowingAll:!o}}function r(e,t){let n=new Map(t.map(e=>[e.id,e]));return e.map(e=>n.get(e)).filter(e=>e!=null)}function i(e,t){if(t.length===0)return[...e];let n=new Set(t);return e.filter(e=>!n.has(e.id))}var a=`__unnamed__`;function o(t){if(t.trigger===`automation`)return!0;let n=t.tags;return n?e.AUTOMATION_TAG_KEYS.some(e=>!!n[e]):!1}function s(e){return e.tags?.automationname?.trim()||`__unnamed__`}function c(e){let t=new Set,n=!1;for(let r of e){if(!o(r))continue;let e=s(r);e===`__unnamed__`?n=!0:t.add(e)}let r=[...t].sort((e,t)=>e.localeCompare(t));return n&&r.push(a),r}function l(e,t,n,r){if(t===`all`)return[...e];if(t===`hide-automations`)return e.filter(e=>!o(e));let i=new Set(r),a=n.filter(e=>i.has(e)),c=a.length>0?new Set(a):null;return e.filter(e=>o(e)?c===null||c.has(s(e)):!1)}function u(e,t,n){if(t===`local`)return e===`__none_workspace`?{}:e.startsWith(`ws:`)?{workingDir:e.slice(3)}:{};if(e===`__none_repo`)return{};if(e.startsWith(`repo:`)){let t=e.slice(5),r=n[0];return{repository:{name:t,gitProvider:r?.git_provider??`github`,branch:r?.selected_branch??`main`}}}return{}}function d(e){if(!e)return 0;let t=Date.parse(e);return Number.isFinite(t)?t:0}function f(e,t){let n=t===`created`?`created_at`:`updated_at`;return[...e].sort((e,t)=>d(t[n])-d(e[n]))}function p(e){let t=e.selected_workspace?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_workspace`,label:``};let n=t.split(`/`).filter(Boolean).pop()??t;return{id:`ws:${t}`,label:n}}function m(e){let t=e.selected_repository?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_repo`,label:``};let n=t.split(`/`).filter(Boolean),r=n.length?(n[n.length-1]??t).replace(/\.git$/,``):t.replace(/\.git$/,``);return{id:`repo:${t}`,label:r}}function h(e,t){return t===`local`?p(e):m(e)}function g(e,t,n,r){let i=e.map(e=>({conversationId:e.id,groupId:h(e,n).id,page:t.get(e.id)??0})),a=new Map;for(let{groupId:e,page:t}of i){let n=a.get(e);(n===void 0||t<n)&&a.set(e,t)}let o=new Set;for(let{conversationId:e,groupId:t,page:n}of i)n===a.get(t)&&o.add(e);let s=r?.forceIncludeConversationId;return s!=null&&e.some(e=>e.id===s)&&o.add(s),o}function _(e,t,n,r){let i=new Map;for(let n of e){let{id:e,label:a}=h(n,t),o=e===`__none_workspace`?r.emptyWorkspace:e===`__none_repo`?r.emptyRepository:a,s=i.get(e);s?s.conversations.push(n):i.set(e,{label:o,conversations:[n]})}let a=[...i.entries()].map(([e,r])=>{let i=f(r.conversations,n);return{id:e,label:r.label,conversations:i,launch:u(e,t,i)}}),o=e=>e.conversations.reduce((e,t)=>Math.max(e,d(n===`created`?t.created_at:t.updated_at)),0);return a.sort((e,t)=>o(t)-o(e)),a}function v(e,t){if(t.length===0)return[...e];let n=new Map(e.map(e=>[e.id,e])),r=[],i=new Set;for(let e of t){let t=n.get(e);t&&(r.push(t),i.add(e))}for(let t of e)i.has(t.id)||r.push(t);return r}function y(e,t,n,r,i=`after`){if(n===r)return[...e];let a=v(t.map(e=>({id:e})),e).map(e=>e.id),o=a.indexOf(n),s=a.indexOf(r);if(o<0||s<0)return[...e];let c=[...a];c.splice(o,1);let l=c.indexOf(r),u=i===`before`?l:l+1;return c.splice(u,0,n),c}exports.UNNAMED_AUTOMATION_FACET=a,exports.applyAutomationConversationFilter=l,exports.applyGroupFolderOrder=v,exports.collectAutomationNameFacets=c,exports.filterOutPinnedConversations=i,exports.getGroupConversationPreview=n,exports.getGroupDiscoveryConversationIds=g,exports.groupConversations=_,exports.moveGroupFolderOrder=y,exports.resolvePinnedConversations=r,exports.sortConversationsByField=f;
2
2
  //# sourceMappingURL=conversation-panel-list-helpers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-panel-list-helpers.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-list-helpers.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { Provider } from \"#/types/settings\";\nimport {\n AUTOMATION_NAME_TAG_KEY,\n AUTOMATION_TAG_KEYS,\n} from \"#/api/agent-server-adapter\";\n\nexport type ConversationSortField = \"created\" | \"updated\";\nexport type ThreadScope = \"all\" | \"relevant\";\nexport type OrganizeMode = \"grouped\" | \"chronological\";\nexport type AutomationFilterMode =\n | \"all\"\n | \"hide-automations\"\n | \"only-automations\";\n\n/** Max conversations shown under a workspace/repo folder before \"View more\". */\nexport const GROUP_CONVERSATIONS_PREVIEW_LIMIT = 5;\n\ninterface GroupConversationPreviewOptions {\n limit?: number;\n expanded: boolean;\n activeConversationId?: string | null;\n}\n\nexport function getGroupConversationPreview(\n conversations: readonly AppConversation[],\n options: GroupConversationPreviewOptions,\n): {\n visibleConversations: AppConversation[];\n isPreviewTruncated: boolean;\n isShowingAll: boolean;\n} {\n const limit = options.limit ?? GROUP_CONVERSATIONS_PREVIEW_LIMIT;\n\n if (options.expanded || conversations.length <= limit) {\n return {\n visibleConversations: [...conversations],\n isPreviewTruncated: conversations.length > limit,\n isShowingAll: true,\n };\n }\n\n const activeIndex =\n options.activeConversationId != null\n ? conversations.findIndex((c) => c.id === options.activeConversationId)\n : -1;\n\n if (activeIndex >= limit) {\n const activeConversation = conversations[activeIndex];\n return {\n visibleConversations: [\n ...conversations.slice(0, limit - 1),\n activeConversation,\n ],\n isPreviewTruncated: true,\n isShowingAll: false,\n };\n }\n\n return {\n visibleConversations: conversations.slice(0, limit),\n isPreviewTruncated: conversations.length > limit,\n isShowingAll: false,\n };\n}\n\nexport function resolvePinnedConversations(\n pinnedIds: readonly string[],\n conversations: readonly AppConversation[],\n): AppConversation[] {\n const byId = new Map(\n conversations.map((conversation) => [conversation.id, conversation]),\n );\n return pinnedIds\n .map((id) => byId.get(id))\n .filter(\n (conversation): conversation is AppConversation => conversation != null,\n );\n}\n\nexport function filterOutPinnedConversations(\n conversations: readonly AppConversation[],\n pinnedIds: readonly string[],\n): AppConversation[] {\n if (pinnedIds.length === 0) {\n return [...conversations];\n }\n\n const pinnedSet = new Set(pinnedIds);\n return conversations.filter(\n (conversation) => !pinnedSet.has(conversation.id),\n );\n}\n\n/**\n * Facet bucket for automation-born conversations that carry no\n * `automationname` tag (double-underscore prefix mirrors the\n * `__none_workspace` group-id idiom).\n */\nexport const UNNAMED_AUTOMATION_FACET = \"__unnamed__\";\n\n/**\n * Whether a conversation was created by an automation run: the cloud backend\n * stamps `trigger: \"automation\"`, while local agent-server conversations are\n * recognized by the automation tags the SDK workspace attaches at creation.\n */\nexport function isAutomationConversation(\n conversation: AppConversation,\n): boolean {\n if (conversation.trigger === \"automation\") {\n return true;\n }\n const tags = conversation.tags;\n if (!tags) {\n return false;\n }\n return AUTOMATION_TAG_KEYS.some((key) => Boolean(tags[key]));\n}\n\nexport function getAutomationNameFacet(conversation: AppConversation): string {\n const name = conversation.tags?.[AUTOMATION_NAME_TAG_KEY]?.trim();\n return name || UNNAMED_AUTOMATION_FACET;\n}\n\n/**\n * Unique automation names among the given conversations, sorted for stable\n * menu order; the unnamed bucket (if present) is appended last.\n */\nexport function collectAutomationNameFacets(\n conversations: readonly AppConversation[],\n): string[] {\n const names = new Set<string>();\n let hasUnnamed = false;\n for (const conversation of conversations) {\n if (!isAutomationConversation(conversation)) {\n continue;\n }\n const facet = getAutomationNameFacet(conversation);\n if (facet === UNNAMED_AUTOMATION_FACET) {\n hasUnnamed = true;\n } else {\n names.add(facet);\n }\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n if (hasUnnamed) {\n sorted.push(UNNAMED_AUTOMATION_FACET);\n }\n return sorted;\n}\n\nexport function applyAutomationConversationFilter(\n conversations: readonly AppConversation[],\n mode: AutomationFilterMode,\n selectedNames: readonly string[],\n availableFacets: readonly string[],\n): AppConversation[] {\n if (mode === \"all\") {\n return [...conversations];\n }\n if (mode === \"hide-automations\") {\n return conversations.filter(\n (conversation) => !isAutomationConversation(conversation),\n );\n }\n // \"only-automations\": an empty selection means every automation run, and a\n // selection that no longer intersects the available facets (stale names\n // persisted from another backend, renamed automations) degrades the same\n // way instead of yielding an unfillable empty list.\n const facetSet = new Set(availableFacets);\n const effectiveNames = selectedNames.filter((name) => facetSet.has(name));\n const narrowing = effectiveNames.length > 0 ? new Set(effectiveNames) : null;\n return conversations.filter((conversation) => {\n if (!isAutomationConversation(conversation)) {\n return false;\n }\n return (\n narrowing === null || narrowing.has(getAutomationNameFacet(conversation))\n );\n });\n}\n\n/** Subset of `useCreateConversation` variables for launching from a group row */\nexport type ConversationGroupLaunch = {\n workingDir?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n};\n\nfunction buildGroupLaunch(\n id: string,\n backendKind: BackendKind,\n conversations: AppConversation[],\n): ConversationGroupLaunch {\n if (backendKind === \"local\") {\n if (id === \"__none_workspace\") {\n return {};\n }\n if (id.startsWith(\"ws:\")) {\n return { workingDir: id.slice(3) };\n }\n return {};\n }\n\n if (id === \"__none_repo\") {\n return {};\n }\n if (id.startsWith(\"repo:\")) {\n const name = id.slice(5);\n const sample = conversations[0];\n const gitProvider = (sample?.git_provider ?? \"github\") as Provider;\n const branch = sample?.selected_branch ?? \"main\";\n return {\n repository: {\n name,\n gitProvider,\n branch,\n },\n };\n }\n\n return {};\n}\n\nexport function parseConversationTimeMs(iso: string | undefined): number {\n if (!iso) return 0;\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : 0;\n}\n\nexport function sortConversationsByField(\n items: readonly AppConversation[],\n field: ConversationSortField,\n): AppConversation[] {\n const key = field === \"created\" ? \"created_at\" : \"updated_at\";\n return [...items].sort(\n (a, b) => parseConversationTimeMs(b[key]) - parseConversationTimeMs(a[key]),\n );\n}\n\nfunction workspaceGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Group by the user-selected workspace (a stable identifier shared by\n // every conversation launched from the same picker selection), not\n // `workspace.working_dir` — that field holds the per-conversation\n // worktree path the agent-server creates, which is unique per\n // conversation and would fragment the grouping.\n //\n // Normalize first, then check emptiness: inputs like \"/\", \"///\", or\n // \" ///\" trim+strip to \"\" and must fall back to the \"no workspace\"\n // bucket rather than producing a stray `ws:` group with no label.\n const normalized = conversation.selected_workspace\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_workspace\", label: \"\" };\n }\n const label = normalized.split(\"/\").filter(Boolean).pop() ?? normalized;\n return { id: `ws:${normalized}`, label };\n}\n\nfunction repositoryGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Mirror `workspaceGroup`'s normalize-then-check order so \"/\", \"///\",\n // and trailing-slash variants of the same repo all collapse to one\n // group instead of producing a stray `repo:/` bucket.\n const normalized = conversation.selected_repository\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_repo\", label: \"\" };\n }\n const parts = normalized.split(\"/\").filter(Boolean);\n const label = parts.length\n ? (parts[parts.length - 1] ?? normalized).replace(/\\.git$/, \"\")\n : normalized.replace(/\\.git$/, \"\");\n return { id: `repo:${normalized}`, label };\n}\n\nexport function groupConversations(\n items: readonly AppConversation[],\n backendKind: BackendKind,\n sortField: ConversationSortField,\n labels: { emptyWorkspace: string; emptyRepository: string },\n): {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}[] {\n const byId = new Map<\n string,\n { label: string; conversations: AppConversation[] }\n >();\n\n for (const c of items) {\n const { id, label: rawLabel } =\n backendKind === \"local\" ? workspaceGroup(c) : repositoryGroup(c);\n const label =\n id === \"__none_workspace\"\n ? labels.emptyWorkspace\n : id === \"__none_repo\"\n ? labels.emptyRepository\n : rawLabel;\n const bucket = byId.get(id);\n if (bucket) {\n bucket.conversations.push(c);\n } else {\n byId.set(id, { label, conversations: [c] });\n }\n }\n\n const groups = [...byId.entries()].map(([id, g]) => {\n const conversations = sortConversationsByField(g.conversations, sortField);\n return {\n id,\n label: g.label,\n conversations,\n launch: buildGroupLaunch(id, backendKind, conversations),\n };\n });\n\n // Use reduce instead of `Math.max(...arr)` — the spread form would push\n // every conversation onto the call stack as a separate argument, which\n // hits JS engines' ~100k-arg limit on very large buckets.\n const groupOrderKey = (g: (typeof groups)[number]) =>\n g.conversations.reduce(\n (max, c) =>\n Math.max(\n max,\n parseConversationTimeMs(\n sortField === \"created\" ? c.created_at : c.updated_at,\n ),\n ),\n 0,\n );\n\n groups.sort((a, b) => groupOrderKey(b) - groupOrderKey(a));\n return groups;\n}\n\nexport function applyGroupFolderOrder<T extends { id: string }>(\n groups: readonly T[],\n order: readonly string[],\n): T[] {\n if (order.length === 0) {\n return [...groups];\n }\n\n const byId = new Map(groups.map((group) => [group.id, group]));\n const ordered: T[] = [];\n const seen = new Set<string>();\n\n for (const id of order) {\n const group = byId.get(id);\n if (group) {\n ordered.push(group);\n seen.add(id);\n }\n }\n\n for (const group of groups) {\n if (!seen.has(group.id)) {\n ordered.push(group);\n }\n }\n\n return ordered;\n}\n\nexport type GroupFolderDropPosition = \"before\" | \"after\";\n\nexport function moveGroupFolderOrder(\n order: readonly string[],\n groupIds: readonly string[],\n activeGroupId: string,\n targetGroupId: string,\n position: GroupFolderDropPosition = \"after\",\n): string[] {\n if (activeGroupId === targetGroupId) {\n return [...order];\n }\n\n const effectiveOrder = applyGroupFolderOrder(\n groupIds.map((id) => ({ id })),\n order,\n ).map((group) => group.id);\n const fromIndex = effectiveOrder.indexOf(activeGroupId);\n const toIndex = effectiveOrder.indexOf(targetGroupId);\n if (fromIndex < 0 || toIndex < 0) {\n return [...order];\n }\n\n const nextOrder = [...effectiveOrder];\n nextOrder.splice(fromIndex, 1);\n const adjustedTargetIndex = nextOrder.indexOf(targetGroupId);\n const insertIndex =\n position === \"before\" ? adjustedTargetIndex : adjustedTargetIndex + 1;\n nextOrder.splice(insertIndex, 0, activeGroupId);\n return nextOrder;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-panel-list-helpers.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-list-helpers.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { Provider } from \"#/types/settings\";\nimport {\n AUTOMATION_NAME_TAG_KEY,\n AUTOMATION_TAG_KEYS,\n} from \"#/api/agent-server-adapter\";\n\nexport type ConversationSortField = \"created\" | \"updated\";\nexport type ThreadScope = \"all\" | \"relevant\";\nexport type OrganizeMode = \"grouped\" | \"chronological\";\nexport type AutomationFilterMode =\n | \"all\"\n | \"hide-automations\"\n | \"only-automations\";\n\n/** Max conversations shown under a workspace/repo folder before \"View more\". */\nexport const GROUP_CONVERSATIONS_PREVIEW_LIMIT = 5;\n\ninterface GroupConversationPreviewOptions {\n limit?: number;\n expanded: boolean;\n activeConversationId?: string | null;\n /**\n * When set, the collapsed preview is drawn only from these conversation IDs\n * (plus the active conversation when it belongs to the group). Expanding\n * still reveals every loaded conversation in `conversations`.\n */\n discoveryConversationIds?: ReadonlySet<string>;\n}\n\n/**\n * Builds the frozen collapsed-preview pool for a folder.\n *\n * Global \"Load more\" may fetch later pages that add conversations to an\n * already-visible folder; those rows stay out of the collapsed preview so the\n * folder's first impression stays stable until the user expands it.\n */\nfunction resolveCollapsedPreviewPool(\n conversations: readonly AppConversation[],\n discoveryConversationIds: ReadonlySet<string> | undefined,\n activeConversationId: string | null | undefined,\n): AppConversation[] {\n if (!discoveryConversationIds) {\n return [...conversations];\n }\n\n const pool = conversations.filter((conversation) =>\n discoveryConversationIds.has(conversation.id),\n );\n\n // The load-bearing active-conversation guarantee lives in\n // `getGroupDiscoveryConversationIds` (`forceIncludeConversationId`); this\n // fallback only covers callers that pass a discovery set built without it.\n if (\n activeConversationId != null &&\n !pool.some((conversation) => conversation.id === activeConversationId)\n ) {\n const activeConversation = conversations.find(\n (conversation) => conversation.id === activeConversationId,\n );\n if (activeConversation) {\n pool.push(activeConversation);\n }\n }\n\n return pool;\n}\n\nexport function getGroupConversationPreview(\n conversations: readonly AppConversation[],\n options: GroupConversationPreviewOptions,\n): {\n visibleConversations: AppConversation[];\n isPreviewTruncated: boolean;\n isShowingAll: boolean;\n} {\n const limit = options.limit ?? GROUP_CONVERSATIONS_PREVIEW_LIMIT;\n const pool = resolveCollapsedPreviewPool(\n conversations,\n options.discoveryConversationIds,\n options.activeConversationId,\n );\n\n let collapsedVisible: AppConversation[];\n if (pool.length <= limit) {\n collapsedVisible = pool;\n } else {\n const activeIndex =\n options.activeConversationId != null\n ? pool.findIndex(\n (conversation) => conversation.id === options.activeConversationId,\n )\n : -1;\n\n if (activeIndex >= limit) {\n collapsedVisible = [...pool.slice(0, limit - 1), pool[activeIndex]];\n } else {\n collapsedVisible = pool.slice(0, limit);\n }\n }\n\n const collapsedHidesSomething =\n collapsedVisible.length < conversations.length;\n\n if (options.expanded) {\n return {\n visibleConversations: [...conversations],\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: true,\n };\n }\n\n return {\n visibleConversations: collapsedVisible,\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: !collapsedHidesSomething,\n };\n}\n\nexport function resolvePinnedConversations(\n pinnedIds: readonly string[],\n conversations: readonly AppConversation[],\n): AppConversation[] {\n const byId = new Map(\n conversations.map((conversation) => [conversation.id, conversation]),\n );\n return pinnedIds\n .map((id) => byId.get(id))\n .filter(\n (conversation): conversation is AppConversation => conversation != null,\n );\n}\n\nexport function filterOutPinnedConversations(\n conversations: readonly AppConversation[],\n pinnedIds: readonly string[],\n): AppConversation[] {\n if (pinnedIds.length === 0) {\n return [...conversations];\n }\n\n const pinnedSet = new Set(pinnedIds);\n return conversations.filter(\n (conversation) => !pinnedSet.has(conversation.id),\n );\n}\n\n/**\n * Facet bucket for automation-born conversations that carry no\n * `automationname` tag (double-underscore prefix mirrors the\n * `__none_workspace` group-id idiom).\n */\nexport const UNNAMED_AUTOMATION_FACET = \"__unnamed__\";\n\n/**\n * Whether a conversation was created by an automation run: the cloud backend\n * stamps `trigger: \"automation\"`, while local agent-server conversations are\n * recognized by the automation tags the SDK workspace attaches at creation.\n */\nexport function isAutomationConversation(\n conversation: AppConversation,\n): boolean {\n if (conversation.trigger === \"automation\") {\n return true;\n }\n const tags = conversation.tags;\n if (!tags) {\n return false;\n }\n return AUTOMATION_TAG_KEYS.some((key) => Boolean(tags[key]));\n}\n\nexport function getAutomationNameFacet(conversation: AppConversation): string {\n const name = conversation.tags?.[AUTOMATION_NAME_TAG_KEY]?.trim();\n return name || UNNAMED_AUTOMATION_FACET;\n}\n\n/**\n * Unique automation names among the given conversations, sorted for stable\n * menu order; the unnamed bucket (if present) is appended last.\n */\nexport function collectAutomationNameFacets(\n conversations: readonly AppConversation[],\n): string[] {\n const names = new Set<string>();\n let hasUnnamed = false;\n for (const conversation of conversations) {\n if (!isAutomationConversation(conversation)) {\n continue;\n }\n const facet = getAutomationNameFacet(conversation);\n if (facet === UNNAMED_AUTOMATION_FACET) {\n hasUnnamed = true;\n } else {\n names.add(facet);\n }\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n if (hasUnnamed) {\n sorted.push(UNNAMED_AUTOMATION_FACET);\n }\n return sorted;\n}\n\nexport function applyAutomationConversationFilter(\n conversations: readonly AppConversation[],\n mode: AutomationFilterMode,\n selectedNames: readonly string[],\n availableFacets: readonly string[],\n): AppConversation[] {\n if (mode === \"all\") {\n return [...conversations];\n }\n if (mode === \"hide-automations\") {\n return conversations.filter(\n (conversation) => !isAutomationConversation(conversation),\n );\n }\n // \"only-automations\": an empty selection means every automation run, and a\n // selection that no longer intersects the available facets (stale names\n // persisted from another backend, renamed automations) degrades the same\n // way instead of yielding an unfillable empty list.\n const facetSet = new Set(availableFacets);\n const effectiveNames = selectedNames.filter((name) => facetSet.has(name));\n const narrowing = effectiveNames.length > 0 ? new Set(effectiveNames) : null;\n return conversations.filter((conversation) => {\n if (!isAutomationConversation(conversation)) {\n return false;\n }\n return (\n narrowing === null || narrowing.has(getAutomationNameFacet(conversation))\n );\n });\n}\n\n/** Subset of `useCreateConversation` variables for launching from a group row */\nexport type ConversationGroupLaunch = {\n workingDir?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n};\n\nfunction buildGroupLaunch(\n id: string,\n backendKind: BackendKind,\n conversations: AppConversation[],\n): ConversationGroupLaunch {\n if (backendKind === \"local\") {\n if (id === \"__none_workspace\") {\n return {};\n }\n if (id.startsWith(\"ws:\")) {\n return { workingDir: id.slice(3) };\n }\n return {};\n }\n\n if (id === \"__none_repo\") {\n return {};\n }\n if (id.startsWith(\"repo:\")) {\n const name = id.slice(5);\n const sample = conversations[0];\n const gitProvider = (sample?.git_provider ?? \"github\") as Provider;\n const branch = sample?.selected_branch ?? \"main\";\n return {\n repository: {\n name,\n gitProvider,\n branch,\n },\n };\n }\n\n return {};\n}\n\nexport function parseConversationTimeMs(iso: string | undefined): number {\n if (!iso) return 0;\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : 0;\n}\n\nexport function sortConversationsByField(\n items: readonly AppConversation[],\n field: ConversationSortField,\n): AppConversation[] {\n const key = field === \"created\" ? \"created_at\" : \"updated_at\";\n return [...items].sort(\n (a, b) => parseConversationTimeMs(b[key]) - parseConversationTimeMs(a[key]),\n );\n}\n\nfunction workspaceGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Group by the user-selected workspace (a stable identifier shared by\n // every conversation launched from the same picker selection), not\n // `workspace.working_dir` — that field holds the per-conversation\n // worktree path the agent-server creates, which is unique per\n // conversation and would fragment the grouping.\n //\n // Normalize first, then check emptiness: inputs like \"/\", \"///\", or\n // \" ///\" trim+strip to \"\" and must fall back to the \"no workspace\"\n // bucket rather than producing a stray `ws:` group with no label.\n const normalized = conversation.selected_workspace\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_workspace\", label: \"\" };\n }\n const label = normalized.split(\"/\").filter(Boolean).pop() ?? normalized;\n return { id: `ws:${normalized}`, label };\n}\n\nfunction repositoryGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Mirror `workspaceGroup`'s normalize-then-check order so \"/\", \"///\",\n // and trailing-slash variants of the same repo all collapse to one\n // group instead of producing a stray `repo:/` bucket.\n const normalized = conversation.selected_repository\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_repo\", label: \"\" };\n }\n const parts = normalized.split(\"/\").filter(Boolean);\n const label = parts.length\n ? (parts[parts.length - 1] ?? normalized).replace(/\\.git$/, \"\")\n : normalized.replace(/\\.git$/, \"\");\n return { id: `repo:${normalized}`, label };\n}\n\n/**\n * Resolves the stable folder identity used by grouped conversation views.\n *\n * Keeping this shared with `groupConversations` lets pagination reason about\n * folder discovery without duplicating workspace/repository normalization.\n */\nfunction getConversationGroupIdentity(\n conversation: AppConversation,\n backendKind: BackendKind,\n): { id: string; label: string } {\n return backendKind === \"local\"\n ? workspaceGroup(conversation)\n : repositoryGroup(conversation);\n}\n\n/**\n * Max backend pages fetched for a single grouped \"Load more\" click. The\n * driver walks past pages that only deepen already-visible folders looking\n * for a new folder, and this cap prevents one click from walking the entire\n * remaining cursor when no undiscovered folder exists. Chronological mode is\n * not capped — it keeps its pre-existing fetch-until-visible behavior.\n */\nexport const MAX_PAGES_PER_LOAD_MORE_CLICK = 3;\n\n/**\n * Conversation IDs that belong on each folder's discovery page — the first\n * backend page where that folder appeared.\n *\n * Global \"Load more\" still discovers folders from later pages, but the\n * collapsed preview for an already-visible folder stays frozen to this set.\n * Expanding the folder reads the full grouped `conversations` array instead.\n * `forceIncludeConversationId` keeps the active thread in the preview even\n * when it landed on a non-discovery page.\n */\nexport function getGroupDiscoveryConversationIds(\n items: readonly AppConversation[],\n pageByConversationId: ReadonlyMap<string, number>,\n backendKind: BackendKind,\n options?: { forceIncludeConversationId?: string | null },\n): Set<string> {\n // Resolve each conversation's folder identity exactly once; both passes\n // below (finding each folder's discovery page, then collecting the ids on\n // that page) read from this record instead of re-running the\n // workspace/repository normalization.\n const resolved = items.map((conversation) => ({\n conversationId: conversation.id,\n groupId: getConversationGroupIdentity(conversation, backendKind).id,\n page: pageByConversationId.get(conversation.id) ?? 0,\n }));\n\n const discoveryPageByGroupId = new Map<string, number>();\n for (const { groupId, page } of resolved) {\n const currentDiscoveryPage = discoveryPageByGroupId.get(groupId);\n if (currentDiscoveryPage === undefined || page < currentDiscoveryPage) {\n discoveryPageByGroupId.set(groupId, page);\n }\n }\n\n const discoveryIds = new Set<string>();\n for (const { conversationId, groupId, page } of resolved) {\n if (page === discoveryPageByGroupId.get(groupId)) {\n discoveryIds.add(conversationId);\n }\n }\n\n const forceIncludeId = options?.forceIncludeConversationId;\n if (\n forceIncludeId != null &&\n items.some((conversation) => conversation.id === forceIncludeId)\n ) {\n discoveryIds.add(forceIncludeId);\n }\n\n return discoveryIds;\n}\n\nexport function groupConversations(\n items: readonly AppConversation[],\n backendKind: BackendKind,\n sortField: ConversationSortField,\n labels: { emptyWorkspace: string; emptyRepository: string },\n): {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}[] {\n const byId = new Map<\n string,\n { label: string; conversations: AppConversation[] }\n >();\n\n for (const c of items) {\n const { id, label: rawLabel } = getConversationGroupIdentity(\n c,\n backendKind,\n );\n const label =\n id === \"__none_workspace\"\n ? labels.emptyWorkspace\n : id === \"__none_repo\"\n ? labels.emptyRepository\n : rawLabel;\n const bucket = byId.get(id);\n if (bucket) {\n bucket.conversations.push(c);\n } else {\n byId.set(id, { label, conversations: [c] });\n }\n }\n\n const groups = [...byId.entries()].map(([id, g]) => {\n const conversations = sortConversationsByField(g.conversations, sortField);\n return {\n id,\n label: g.label,\n conversations,\n launch: buildGroupLaunch(id, backendKind, conversations),\n };\n });\n\n // Use reduce instead of `Math.max(...arr)` — the spread form would push\n // every conversation onto the call stack as a separate argument, which\n // hits JS engines' ~100k-arg limit on very large buckets.\n const groupOrderKey = (g: (typeof groups)[number]) =>\n g.conversations.reduce(\n (max, c) =>\n Math.max(\n max,\n parseConversationTimeMs(\n sortField === \"created\" ? c.created_at : c.updated_at,\n ),\n ),\n 0,\n );\n\n groups.sort((a, b) => groupOrderKey(b) - groupOrderKey(a));\n return groups;\n}\n\nexport function applyGroupFolderOrder<T extends { id: string }>(\n groups: readonly T[],\n order: readonly string[],\n): T[] {\n if (order.length === 0) {\n return [...groups];\n }\n\n const byId = new Map(groups.map((group) => [group.id, group]));\n const ordered: T[] = [];\n const seen = new Set<string>();\n\n for (const id of order) {\n const group = byId.get(id);\n if (group) {\n ordered.push(group);\n seen.add(id);\n }\n }\n\n for (const group of groups) {\n if (!seen.has(group.id)) {\n ordered.push(group);\n }\n }\n\n return ordered;\n}\n\nexport type GroupFolderDropPosition = \"before\" | \"after\";\n\nexport function moveGroupFolderOrder(\n order: readonly string[],\n groupIds: readonly string[],\n activeGroupId: string,\n targetGroupId: string,\n position: GroupFolderDropPosition = \"after\",\n): string[] {\n if (activeGroupId === targetGroupId) {\n return [...order];\n }\n\n const effectiveOrder = applyGroupFolderOrder(\n groupIds.map((id) => ({ id })),\n order,\n ).map((group) => group.id);\n const fromIndex = effectiveOrder.indexOf(activeGroupId);\n const toIndex = effectiveOrder.indexOf(targetGroupId);\n if (fromIndex < 0 || toIndex < 0) {\n return [...order];\n }\n\n const nextOrder = [...effectiveOrder];\n nextOrder.splice(fromIndex, 1);\n const adjustedTargetIndex = nextOrder.indexOf(targetGroupId);\n const insertIndex =\n position === \"before\" ? adjustedTargetIndex : adjustedTargetIndex + 1;\n nextOrder.splice(insertIndex, 0, activeGroupId);\n return nextOrder;\n}\n"],"mappings":"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"}
@@ -11,6 +11,12 @@ interface GroupConversationPreviewOptions {
11
11
  limit?: number;
12
12
  expanded: boolean;
13
13
  activeConversationId?: string | null;
14
+ /**
15
+ * When set, the collapsed preview is drawn only from these conversation IDs
16
+ * (plus the active conversation when it belongs to the group). Expanding
17
+ * still reveals every loaded conversation in `conversations`.
18
+ */
19
+ discoveryConversationIds?: ReadonlySet<string>;
14
20
  }
15
21
  export declare function getGroupConversationPreview(conversations: readonly AppConversation[], options: GroupConversationPreviewOptions): {
16
22
  visibleConversations: AppConversation[];
@@ -49,6 +55,27 @@ export type ConversationGroupLaunch = {
49
55
  };
50
56
  export declare function parseConversationTimeMs(iso: string | undefined): number;
51
57
  export declare function sortConversationsByField(items: readonly AppConversation[], field: ConversationSortField): AppConversation[];
58
+ /**
59
+ * Max backend pages fetched for a single grouped "Load more" click. The
60
+ * driver walks past pages that only deepen already-visible folders looking
61
+ * for a new folder, and this cap prevents one click from walking the entire
62
+ * remaining cursor when no undiscovered folder exists. Chronological mode is
63
+ * not capped — it keeps its pre-existing fetch-until-visible behavior.
64
+ */
65
+ export declare const MAX_PAGES_PER_LOAD_MORE_CLICK = 3;
66
+ /**
67
+ * Conversation IDs that belong on each folder's discovery page — the first
68
+ * backend page where that folder appeared.
69
+ *
70
+ * Global "Load more" still discovers folders from later pages, but the
71
+ * collapsed preview for an already-visible folder stays frozen to this set.
72
+ * Expanding the folder reads the full grouped `conversations` array instead.
73
+ * `forceIncludeConversationId` keeps the active thread in the preview even
74
+ * when it landed on a non-discovery page.
75
+ */
76
+ export declare function getGroupDiscoveryConversationIds(items: readonly AppConversation[], pageByConversationId: ReadonlyMap<string, number>, backendKind: BackendKind, options?: {
77
+ forceIncludeConversationId?: string | null;
78
+ }): Set<string>;
52
79
  export declare function groupConversations(items: readonly AppConversation[], backendKind: BackendKind, sortField: ConversationSortField, labels: {
53
80
  emptyWorkspace: string;
54
81
  emptyRepository: string;