@openhands/agent-canvas 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (766) 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-Bno1nwPL.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-h8hQz-IU.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-Qsb83VX1.js → api-key-entry-screen-D8Fade_-.js} +1 -1
  12. package/build/assets/app-settings-CpyGB3AT.js +1 -0
  13. package/build/assets/{automation-detail-7LkL91j9.js → automation-detail-B-jQ39Mm.js} +1 -1
  14. package/build/assets/{automation-export-U2QNyNy6.js → automation-export-B1dywoqk.js} +1 -1
  15. package/build/assets/{automation-setup-route-Bel9_Lue.js → automation-setup-route-C-bWUZBi.js} +1 -1
  16. package/build/assets/{automation-templates-CRLDssaI.js → automation-templates-DgpCGOJV.js} +1 -1
  17. package/build/assets/{automations-list-B2iV3ZKW.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-DiVrD4Cm.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-DB4717Iu.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
  21. package/build/assets/{badge-yR53enbU.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-A94o33Vn.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-CBQdPZl_.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-PsRXVBz2.js → command-menu-BXy03FBl.js} +1 -1
  35. package/build/assets/{condenser-settings-w7L3EFvm.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-Bs8gA263.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-DzbDyLkV.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-DOmHPGTA.js → extensions-hub-BqUINAhp.js} +1 -1
  51. package/build/assets/{extensions-navigation-6zU5M1pa.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-model-name-BN_rx1Y3.js +1 -0
  57. package/build/assets/{format-relative-time-DGPQlPx0.js → format-relative-time-DSErAuVr.js} +1 -1
  58. package/build/assets/git-provider-icon-BvlLAche.js +1 -0
  59. package/build/assets/{git-repo-dropdown-B7RvO70z.js → git-repo-dropdown-ByMzpNko.js} +1 -1
  60. package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
  61. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
  62. package/build/assets/{home-DEZaZqYv.js → home-BOrlwLqG.js} +1 -1
  63. package/build/assets/home-BvMNC6E-.js +1 -0
  64. package/build/assets/{home-store-D7CjMN_-.js → home-store-CxqsY9Fi.js} +1 -1
  65. package/build/assets/index-home-BvMNC6E-.js +1 -0
  66. package/build/assets/info-BRVcJAUg.js +1 -0
  67. package/build/assets/{install-server-modal-BTwK5lbi.js → install-server-modal-Bl4G1zF4.js} +1 -1
  68. package/build/assets/{kebab-menu-item-content-C4CkeiJO.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
  69. package/build/assets/{launch-DVlx4v9o.js → launch-CkqiSCqi.js} +1 -1
  70. package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
  71. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
  72. package/build/assets/llm-settings-B-pkVCrt.js +1 -0
  73. package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
  74. package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
  75. package/build/assets/loader-circle-B47W9XqT.js +1 -0
  76. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
  77. package/build/assets/{manage-backends-modal-HNWKLYhq.js → manage-backends-modal-DhGk5mJt.js} +1 -1
  78. package/build/assets/manifest-653b89aa.js +1 -0
  79. package/build/assets/{manifest-subpage-layout-D-m-h8_t.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
  80. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
  81. package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
  82. package/build/assets/{mcp-gLgPP7AS.js → mcp-DCkvl6K0.js} +2 -2
  83. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
  84. package/build/assets/messages-DSXvyc21.js +40 -0
  85. package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
  86. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
  87. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
  88. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
  89. package/build/assets/{npm-DRzJF5Zn.js → npm-DLckoeJc.js} +1 -1
  90. package/build/assets/{onboarding-DSr8hOpk.js → onboarding-D7WDG66N.js} +1 -1
  91. package/build/assets/{onboarding-modal-C6Euf7N4.js → onboarding-modal-C_xVrFNv.js} +1 -1
  92. package/build/assets/{organization-service.api-C4GYWwj9.js → organization-service.api-D-s9z18a.js} +1 -1
  93. package/build/assets/pencil-BGOCPRyu.js +1 -0
  94. package/build/assets/{planner-tab-CZcguxTK.js → planner-tab-AKaXIIfg.js} +1 -1
  95. package/build/assets/{plugins-management-service-BmDzOQsd.js → plugins-management-service-wtmY4QQw.js} +1 -1
  96. package/build/assets/plus-zNEL8rcX.js +1 -0
  97. package/build/assets/{profiles-service.api-CoLTwjc1.js → profiles-service.api-DCMYxHMi.js} +1 -1
  98. package/build/assets/{providers-tBzTpz1w.js → providers-BjrtjX4L.js} +1 -1
  99. package/build/assets/{proxy-DCI9S-LA.js → proxy-9Z_WZggZ.js} +1 -1
  100. package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
  101. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
  102. package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
  103. package/build/assets/root-CanxKlNV.css +1 -0
  104. package/build/assets/root-DkfG_UWR.js +2 -0
  105. package/build/assets/root-layout-D75LHYhh.js +2 -0
  106. package/build/assets/{schema-field-zhsVDllR.js → schema-field-OnM5Uob_.js} +1 -1
  107. package/build/assets/{sdk-section-page-CS4GWn0y.js → sdk-section-page-m5WQm2sy.js} +1 -1
  108. package/build/assets/search-CycosyjN.js +1 -0
  109. package/build/assets/{secrets-service-DjgGduXk.js → secrets-service-B26R61C1.js} +1 -1
  110. package/build/assets/{secrets-settings-f-qahfbi.js → secrets-settings-CbLYCKOX.js} +1 -1
  111. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
  112. package/build/assets/{settings-DQd0xLEw.js → settings-BJQI_iBM.js} +1 -1
  113. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
  114. package/build/assets/{settings-index-BVwy9JEp.js → settings-index-BiTqJoH7.js} +1 -1
  115. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
  116. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
  117. package/build/assets/{settings-modal-D6D5ngET.js → settings-modal-BIrIVn97.js} +1 -1
  118. package/build/assets/{settings-service.api-DZp7E7A9.js → settings-service.api--rJmnuLa.js} +1 -1
  119. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
  120. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
  121. package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
  122. package/build/assets/shield-check-T3JsDJiM.js +1 -0
  123. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
  124. package/build/assets/{sidebar-mobile-menu-toggle-OoZBHxaT.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
  125. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
  126. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
  127. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
  128. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
  129. package/build/assets/{skill-scope-B1Per5XI.js → skill-scope-Dc3JPW-8.js} +1 -1
  130. package/build/assets/{skills-plugins-B3AO6sMz.js → skills-plugins-CpTV27n3.js} +1 -1
  131. package/build/assets/{skills-settings-DmmgJ6CT.js → skills-settings-CSW__IW4.js} +1 -1
  132. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
  133. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
  134. package/build/assets/{task-list-tab-C19Q_JNf.js → task-list-tab-mAHMOkUz.js} +1 -1
  135. package/build/assets/{terminal-CbuMRYal.js → terminal-BzxBaHx2.js} +1 -1
  136. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
  137. package/build/assets/trash-2-C0xNVp9c.js +1 -0
  138. package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
  139. package/build/assets/usage-tab-tEmVN0KD.js +1 -0
  140. package/build/assets/{use-acp-credential-form-DJmmJKMo.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
  141. package/build/assets/{use-activate-agent-profile-CeFfYwu_.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
  142. package/build/assets/{use-agent-profiles-BHLkLbRR.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
  143. package/build/assets/{use-can-manage-org-profiles-Bu4y8gSx.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
  144. package/build/assets/{use-cloud-current-user-id-QD9x3ySO.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
  145. package/build/assets/{use-config-CPwqciXN.js → use-config-DKAMiI5R.js} +1 -1
  146. package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
  147. package/build/assets/{use-create-secret-BsOfOLvg.js → use-create-secret-2zBlCDsF.js} +1 -1
  148. package/build/assets/use-is-authed-C52-ivnB.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  151. package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
  152. package/build/assets/{use-manifest-capabilities-DBYPjyV6.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
  153. package/build/assets/{use-onboarding-completion-CtNJxkXG.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
  154. package/build/assets/{use-plugins-marketplace-ZEA-gyM9.js → use-plugins-marketplace-CEiak69h.js} +1 -1
  155. package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
  156. package/build/assets/{use-save-settings-pSjRhD_m.js → use-save-settings-DNmnbG6f.js} +1 -1
  157. package/build/assets/{use-settings-nav-items-CQgkxUbV.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
  158. package/build/assets/{use-settings-BHWsOcIG.js → use-settings-wCwPaSIv.js} +1 -1
  159. package/build/assets/{use-tracking-CGCsBWhg.js → use-tracking-CVwPmhlX.js} +1 -1
  160. package/build/assets/{use-user-conversation-DRfEU8x0.js → use-user-conversation-DVtfg0B_.js} +1 -1
  161. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
  162. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
  163. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
  164. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
  165. package/build/assets/utils-zxEjKE70.js +1 -0
  166. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  167. 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
  168. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
  169. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
  170. package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
  171. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
  172. 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
  173. 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
  174. 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
  175. 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
  176. package/build/assets/{verification-settings-BItwt998.js → verification-settings-B8UMQ7MG.js} +1 -1
  177. package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
  178. package/build/assets/x-BWKA2Ver.js +1 -0
  179. package/build/assets/zap-DHddTPc0.js +1 -0
  180. package/build/index.html +4 -4
  181. package/build/locales/ar/openhands.json +28 -1
  182. package/build/locales/ca/openhands.json +28 -1
  183. package/build/locales/de/openhands.json +28 -1
  184. package/build/locales/en/openhands.json +28 -1
  185. package/build/locales/es/openhands.json +28 -1
  186. package/build/locales/fr/openhands.json +28 -1
  187. package/build/locales/it/openhands.json +28 -1
  188. package/build/locales/ja/openhands.json +28 -1
  189. package/build/locales/ko-KR/openhands.json +28 -1
  190. package/build/locales/no/openhands.json +28 -1
  191. package/build/locales/pt/openhands.json +28 -1
  192. package/build/locales/tr/openhands.json +28 -1
  193. package/build/locales/uk/openhands.json +28 -1
  194. package/build/locales/zh-CN/openhands.json +28 -1
  195. package/build/locales/zh-TW/openhands.json +28 -1
  196. package/config/defaults.json +3 -3
  197. package/dist/api/agent-server-compatibility.cjs +1 -1
  198. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  199. package/dist/api/agent-server-compatibility.js +1 -1
  200. package/dist/api/agent-server-compatibility.js.map +1 -1
  201. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  202. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  203. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  204. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  205. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  206. package/dist/api/llm-balance-service.cjs +2 -0
  207. package/dist/api/llm-balance-service.cjs.map +1 -0
  208. package/dist/api/llm-balance-service.d.ts +33 -0
  209. package/dist/api/llm-balance-service.js +53 -0
  210. package/dist/api/llm-balance-service.js.map +1 -0
  211. package/dist/api/llm-subscription-service.cjs +1 -1
  212. package/dist/api/llm-subscription-service.cjs.map +1 -1
  213. package/dist/api/llm-subscription-service.js +42 -34
  214. package/dist/api/llm-subscription-service.js.map +1 -1
  215. package/dist/components/conversation/index.cjs +1 -1
  216. package/dist/components/conversation/index.d.ts +0 -1
  217. package/dist/components/conversation/index.js +0 -1
  218. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  219. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  221. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  222. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  223. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  224. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  225. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  226. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  227. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  228. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  229. package/dist/components/conversation-events/chat/group-events.js +27 -26
  230. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  231. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  232. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  233. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  234. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  235. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  236. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  237. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  238. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  239. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  240. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  241. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  242. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  243. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
  244. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  245. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  246. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  247. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  248. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  249. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  250. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  251. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  252. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  253. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  254. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  255. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  256. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  257. package/dist/components/features/chat/custom-chat-input.js +68 -67
  258. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  259. package/dist/components/features/chat/model-messages.cjs +1 -1
  260. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  261. package/dist/components/features/chat/model-messages.js +26 -25
  262. package/dist/components/features/chat/model-messages.js.map +1 -1
  263. package/dist/components/features/chat/path-component.cjs +1 -1
  264. package/dist/components/features/chat/path-component.cjs.map +1 -1
  265. package/dist/components/features/chat/path-component.js +9 -6
  266. package/dist/components/features/chat/path-component.js.map +1 -1
  267. package/dist/components/features/chat/plan-preview.cjs +1 -1
  268. package/dist/components/features/chat/plan-preview.js +4 -4
  269. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  270. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  271. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  272. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  273. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  274. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  275. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  276. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  277. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  278. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  279. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  280. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  281. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  282. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  283. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  284. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  285. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  286. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  287. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  288. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  289. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  290. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  291. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  292. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  293. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  294. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  295. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  296. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  297. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  298. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  299. package/dist/components/features/conversation/conversation-name.js +69 -71
  300. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  301. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  302. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  303. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  304. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  305. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  306. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  307. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  308. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  309. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  310. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  311. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  312. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  313. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  314. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  315. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  316. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  317. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  318. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  319. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  320. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  321. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  322. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  323. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  324. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  325. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  326. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  327. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  328. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  329. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  330. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  331. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  332. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  333. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  334. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  335. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  336. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  337. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  338. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  339. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  340. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  341. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  342. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  343. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  344. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  345. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  346. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  347. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  348. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  349. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  350. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  351. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  352. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  353. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  354. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  355. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  356. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  357. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  358. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  359. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  360. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  361. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  362. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  363. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  364. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  365. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  366. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  367. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  368. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  369. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  370. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  371. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  372. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +28 -20
  373. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  374. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  375. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  376. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  377. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  378. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  379. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  380. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  381. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  382. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  383. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  384. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  385. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  386. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  387. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  388. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  389. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  390. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  391. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  392. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  393. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  394. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  395. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  396. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  397. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  398. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  399. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  400. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  401. package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
  402. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  403. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  404. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  405. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  406. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  407. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  408. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  409. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  410. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  411. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  412. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
  413. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  414. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  415. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  416. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  417. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  418. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  419. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  420. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  421. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  422. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  423. package/dist/components/shared/modals/settings/model-selector.js +154 -98
  424. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  425. package/dist/config/defaults.cjs +1 -1
  426. package/dist/config/defaults.cjs.map +1 -1
  427. package/dist/config/defaults.js +3 -3
  428. package/dist/config/defaults.js.map +1 -1
  429. package/dist/constants/llm-balance.cjs +2 -0
  430. package/dist/constants/llm-balance.cjs.map +1 -0
  431. package/dist/constants/llm-balance.d.ts +13 -0
  432. package/dist/constants/llm-balance.js +6 -0
  433. package/dist/constants/llm-balance.js.map +1 -0
  434. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  435. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  436. package/dist/contexts/conversation-websocket-context.js +217 -209
  437. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  438. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  439. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  440. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  441. package/dist/hooks/chat/use-grip-resize.js +39 -30
  442. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  443. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  444. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  445. package/dist/hooks/chat/use-slash-command.js +61 -60
  446. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  447. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  448. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  449. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  450. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  451. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  452. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  453. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  454. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  455. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  456. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  457. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  458. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  459. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  460. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  461. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  462. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  463. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  464. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  465. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  466. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  467. package/dist/hooks/query/use-llm-balance.js +24 -0
  468. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  469. package/dist/hooks/query/use-search-providers.cjs +1 -1
  470. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  471. package/dist/hooks/query/use-search-providers.js +1 -1
  472. package/dist/hooks/query/use-search-providers.js.map +1 -1
  473. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  474. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  475. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  476. package/dist/hooks/use-await-context-compaction.js +61 -0
  477. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  478. package/dist/hooks/use-compact-context-action.cjs +2 -0
  479. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  480. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  481. package/dist/hooks/use-compact-context-action.js +61 -0
  482. package/dist/hooks/use-compact-context-action.js.map +1 -0
  483. package/dist/hooks/use-context-window-usage.cjs +2 -0
  484. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  485. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  486. package/dist/hooks/use-context-window-usage.js +20 -0
  487. package/dist/hooks/use-context-window-usage.js.map +1 -0
  488. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  489. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  490. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  491. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  492. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  493. package/dist/hooks/use-drag-resize.cjs +1 -1
  494. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  495. package/dist/hooks/use-drag-resize.d.ts +8 -0
  496. package/dist/hooks/use-drag-resize.js +21 -18
  497. package/dist/hooks/use-drag-resize.js.map +1 -1
  498. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  499. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  500. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  501. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  502. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  503. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  504. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  505. package/dist/hooks/use-select-conversation-tab.js +2 -2
  506. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  507. package/dist/i18n/declaration.cjs +1 -1
  508. package/dist/i18n/declaration.cjs.map +1 -1
  509. package/dist/i18n/declaration.d.ts +27 -0
  510. package/dist/i18n/declaration.js +1 -1
  511. package/dist/i18n/declaration.js.map +1 -1
  512. package/dist/i18n/translation.cjs +2 -2
  513. package/dist/i18n/translation.cjs.map +1 -1
  514. package/dist/i18n/translation.js +474 -15
  515. package/dist/i18n/translation.js.map +1 -1
  516. package/dist/index.cjs +1 -1
  517. package/dist/index.js +28 -29
  518. package/dist/lib/index.cjs +1 -1
  519. package/dist/lib/index.js +0 -1
  520. package/dist/locales/ar/openhands.json +28 -1
  521. package/dist/locales/ca/openhands.json +28 -1
  522. package/dist/locales/de/openhands.json +28 -1
  523. package/dist/locales/en/openhands.json +28 -1
  524. package/dist/locales/es/openhands.json +28 -1
  525. package/dist/locales/fr/openhands.json +28 -1
  526. package/dist/locales/it/openhands.json +28 -1
  527. package/dist/locales/ja/openhands.json +28 -1
  528. package/dist/locales/ko-KR/openhands.json +28 -1
  529. package/dist/locales/no/openhands.json +28 -1
  530. package/dist/locales/pt/openhands.json +28 -1
  531. package/dist/locales/tr/openhands.json +28 -1
  532. package/dist/locales/uk/openhands.json +28 -1
  533. package/dist/locales/zh-CN/openhands.json +28 -1
  534. package/dist/locales/zh-TW/openhands.json +28 -1
  535. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  536. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  537. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  538. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  539. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  540. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  541. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  542. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  543. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  544. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  545. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  546. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  547. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  548. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  549. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  550. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  551. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  552. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  553. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  554. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  557. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  558. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  559. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  560. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  561. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  562. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  563. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  564. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  565. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  566. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  567. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  568. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  569. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  570. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  571. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  572. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  573. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  574. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  575. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  576. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  577. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  578. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  579. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  580. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  581. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  582. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  583. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  584. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  585. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  586. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  587. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  588. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  589. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  590. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  591. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  592. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  593. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  594. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  595. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  596. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  597. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  598. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  599. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  600. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  601. package/dist/package.cjs +1 -1
  602. package/dist/package.cjs.map +1 -1
  603. package/dist/package.js +17 -16
  604. package/dist/package.js.map +1 -1
  605. package/dist/routes/app-settings.cjs +1 -1
  606. package/dist/routes/app-settings.cjs.map +1 -1
  607. package/dist/routes/app-settings.js +94 -93
  608. package/dist/routes/app-settings.js.map +1 -1
  609. package/dist/routes/llm-settings.cjs +1 -1
  610. package/dist/routes/llm-settings.cjs.map +1 -1
  611. package/dist/routes/llm-settings.js +131 -119
  612. package/dist/routes/llm-settings.js.map +1 -1
  613. package/dist/routes/usage-tab.cjs +2 -0
  614. package/dist/routes/usage-tab.cjs.map +1 -0
  615. package/dist/routes/usage-tab.d.ts +2 -0
  616. package/dist/routes/usage-tab.js +10 -0
  617. package/dist/routes/usage-tab.js.map +1 -0
  618. package/dist/services/child-conversation-launch.cjs +1 -1
  619. package/dist/services/child-conversation-launch.cjs.map +1 -1
  620. package/dist/services/child-conversation-launch.js +11 -5
  621. package/dist/services/child-conversation-launch.js.map +1 -1
  622. package/dist/stores/archived-conversations-store.cjs +2 -0
  623. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  624. package/dist/stores/archived-conversations-store.d.ts +24 -0
  625. package/dist/stores/archived-conversations-store.js +33 -0
  626. package/dist/stores/archived-conversations-store.js.map +1 -0
  627. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  628. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  629. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  630. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  631. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  632. package/dist/stores/conversation-store.cjs.map +1 -1
  633. package/dist/stores/conversation-store.d.ts +1 -1
  634. package/dist/stores/conversation-store.js.map +1 -1
  635. package/dist/stores/metrics-store.cjs +1 -1
  636. package/dist/stores/metrics-store.cjs.map +1 -1
  637. package/dist/stores/metrics-store.d.ts +1 -0
  638. package/dist/stores/metrics-store.js +7 -4
  639. package/dist/stores/metrics-store.js.map +1 -1
  640. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  641. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  642. package/dist/types/agent-server/type-guards.cjs +1 -1
  643. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  644. package/dist/types/agent-server/type-guards.d.ts +5 -0
  645. package/dist/types/agent-server/type-guards.js +3 -3
  646. package/dist/types/agent-server/type-guards.js.map +1 -1
  647. package/dist/utils/conversation-local-storage.cjs +1 -1
  648. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  649. package/dist/utils/conversation-local-storage.js +2 -1
  650. package/dist/utils/conversation-local-storage.js.map +1 -1
  651. package/dist/utils/format-model-name.cjs +1 -1
  652. package/dist/utils/format-model-name.cjs.map +1 -1
  653. package/dist/utils/format-model-name.d.ts +11 -0
  654. package/dist/utils/format-model-name.js +11 -3
  655. package/dist/utils/format-model-name.js.map +1 -1
  656. package/dist/utils/format-token-count.cjs +2 -0
  657. package/dist/utils/format-token-count.cjs.map +1 -0
  658. package/dist/utils/format-token-count.d.ts +3 -0
  659. package/dist/utils/format-token-count.js +19 -0
  660. package/dist/utils/format-token-count.js.map +1 -0
  661. package/dist/utils/hover-reveal-classes.cjs +2 -0
  662. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  663. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  664. package/dist/utils/hover-reveal-classes.js +41 -0
  665. package/dist/utils/hover-reveal-classes.js.map +1 -0
  666. package/dist/utils/is-markdown-file-path.cjs +2 -0
  667. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  668. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  669. package/dist/utils/is-markdown-file-path.js +14 -0
  670. package/dist/utils/is-markdown-file-path.js.map +1 -0
  671. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  672. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  673. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  674. package/dist/utils/mcp-marketplace-utils.js +19 -16
  675. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  676. package/dist/utils/transcript-export/index.cjs +3 -3
  677. package/dist/utils/transcript-export/index.cjs.map +1 -1
  678. package/dist/utils/transcript-export/index.js +12 -12
  679. package/dist/utils/transcript-export/index.js.map +1 -1
  680. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  681. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  682. package/dist/utils/transcript-export/load-complete-events.js +4 -4
  683. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  684. package/dist/utils/workspace-relative-path.cjs +2 -0
  685. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  686. package/dist/utils/workspace-relative-path.d.ts +10 -0
  687. package/dist/utils/workspace-relative-path.js +22 -0
  688. package/dist/utils/workspace-relative-path.js.map +1 -0
  689. package/package.json +17 -16
  690. package/scripts/check-sdk-version-sync.mjs +6 -6
  691. package/scripts/dev-process-utils.mjs +6 -1
  692. package/scripts/dev-safe.mjs +57 -2
  693. package/build/assets/active-backend-context-BBvP-bI2.js +0 -2
  694. package/build/assets/agent-profiles-settings-DqoS7RL3.js +0 -1
  695. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +0 -86
  696. package/build/assets/agent-settings-BJHryp65.js +0 -1
  697. package/build/assets/app-settings-r1RUbgGi.js +0 -1
  698. package/build/assets/backend-form-modal-OroTqnAv.js +0 -1
  699. package/build/assets/bot-DuN83i3p.js +0 -1
  700. package/build/assets/browser--eoQOo4M.js +0 -6
  701. package/build/assets/check-DLOKoFU9.js +0 -1
  702. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  703. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  704. package/build/assets/conversation-BUzBZAc-.js +0 -90
  705. package/build/assets/conversation-panel-pzAKsSDb.js +0 -1
  706. package/build/assets/conversation-pzAKsSDb.js +0 -1
  707. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  708. package/build/assets/external-link-zWbg5KXS.js +0 -1
  709. package/build/assets/files-tab-BzofBmF4.js +0 -1
  710. package/build/assets/git-provider-icon-BLMlwy02.js +0 -1
  711. package/build/assets/git-repo-dropdown-B_PTq4ol.js +0 -1
  712. package/build/assets/home-r89Vj2td.js +0 -1
  713. package/build/assets/index-home-r89Vj2td.js +0 -1
  714. package/build/assets/llm-not-configured-banner-CwKu8C6g.js +0 -27
  715. package/build/assets/llm-settings-BJotLQND.js +0 -1
  716. package/build/assets/llm-settings-CDM-5H2A.js +0 -1
  717. package/build/assets/llm-subscription-service-7eVfDIE1.js +0 -1
  718. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  719. package/build/assets/manifest-2a36a8f8.js +0 -1
  720. package/build/assets/markdown-renderer-BiiiIznl.js +0 -8
  721. package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +0 -1
  722. package/build/assets/messages-D1cbVhRK.js +0 -40
  723. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  724. package/build/assets/plus-CtzlyAoF.js +0 -1
  725. package/build/assets/recommended-automations-launcher-BbJAJVED.js +0 -1
  726. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  727. package/build/assets/root-BfM_kC_d.css +0 -1
  728. package/build/assets/root-gstBEjty.js +0 -2
  729. package/build/assets/root-layout-BIAFLP9p.js +0 -2
  730. package/build/assets/search-CYaiKHRp.js +0 -1
  731. package/build/assets/shared-conversation-DIxZjElr.js +0 -1
  732. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  733. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  734. package/build/assets/use-create-conversation-DWaSVUOB.js +0 -1
  735. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  736. package/build/assets/use-llm-profiles-CU8ah1pz.js +0 -1
  737. package/build/assets/use-save-agent-profile-DgI_Uz9a.js +0 -1
  738. package/build/assets/utils-DPQfkd-7.js +0 -1
  739. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  740. package/build/assets/x-RYDBg-e2.js +0 -1
  741. package/build/assets/zap-tbKDzCe3.js +0 -1
  742. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  743. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  744. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  745. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  746. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  747. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  748. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  749. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  750. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  751. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  752. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  753. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  754. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  755. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  756. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  757. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  758. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  759. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  760. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  761. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  762. package/dist/icons/u-credit-card.cjs +0 -2
  763. package/dist/icons/u-credit-card.cjs.map +0 -1
  764. package/dist/icons/u-credit-card.js +0 -21
  765. package/dist/icons/u-credit-card.js.map +0 -1
  766. /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,134 +1,144 @@
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 { Pin as n } from "../../../../node_modules/lucide-react/dist/esm/icons/pin.js";
4
- import { cn as r } from "../../../../utils/utils.js";
5
- import { getDisplayConversationTags as i } from "../../../../api/agent-server-adapter.js";
6
- import ee from "../../../../api/conversation-service/conversation-service.api.js";
7
- import { useTracking as te } from "../../../../hooks/use-tracking.js";
8
- import { useDownloadConversation as ne } from "../../../../hooks/use-download-conversation.js";
9
- import { transformVSCodeUrl as a } from "../../../../utils/vscode-url-helper.js";
10
- import { formatTimeDelta as o } from "../../../../utils/format-time-delta.js";
11
- import { ConversationCardHeader as s } from "./conversation-card-header.js";
12
- import { ConversationCardActions as c } from "./conversation-card-actions.js";
13
- import { ConversationCardFooter as l } from "./conversation-card-footer.js";
14
- import { ConversationStatusBadges as u } from "./conversation-status-badges.js";
15
- import d from "react";
16
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
3
+ import { Pin as ee } from "../../../../node_modules/lucide-react/dist/esm/icons/pin.js";
4
+ import { cn as n } from "../../../../utils/utils.js";
5
+ import { getDisplayConversationTags as te } from "../../../../api/agent-server-adapter.js";
6
+ import ne from "../../../../api/conversation-service/conversation-service.api.js";
7
+ import { useTracking as re } from "../../../../hooks/use-tracking.js";
8
+ import { useDownloadConversation as r } from "../../../../hooks/use-download-conversation.js";
9
+ import { transformVSCodeUrl as ie } from "../../../../utils/vscode-url-helper.js";
10
+ import { formatTimeDelta as i } from "../../../../utils/format-time-delta.js";
11
+ import { hoverRevealActionClassName as a, hoverRevealPinnedTimestampClassName as o, hoverRevealReserveClassName as ae, hoverRevealYieldClassName as oe } from "../../../../utils/hover-reveal-classes.js";
12
+ import { ConversationCardHeader as se } from "./conversation-card-header.js";
13
+ import { ConversationCardActions as s } from "./conversation-card-actions.js";
14
+ import { ConversationCardFooter as ce } from "./conversation-card-footer.js";
15
+ import { ConversationStatusBadges as c } from "./conversation-status-badges.js";
16
+ import l from "react";
17
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
17
18
  //#region src/components/features/conversation-panel/conversation-card/conversation-card.tsx
18
- function m({ onClick: m, onDelete: h, onStop: g, onChangeTitle: _, showOptions: v, title: y, selectedRepository: b, lastUpdatedAt: x, createdAt: S, conversationId: C, executionStatus: w, sandboxStatus: T, contextMenuOpen: E = !1, onContextMenuToggle: D, isActive: O = !1, workspaceWorkingDir: k, showRepositoryMetadata: A = !0, llmModel: j = null, showLlmProfiles: M = !1, agentKind: N = null, acpServer: P = null, tags: F = null, showTags: I = !1, isPinned: L = !1, onTogglePin: R, alwaysShowPinIcon: z = !1 }) {
19
- let { t: B } = e("openhands"), { trackDownloadVsCodeButtonClicked: V } = te(), [H, U] = d.useState("view"), { mutateAsync: W } = ne(), G = (e) => {
19
+ function f({ onClick: f, onDelete: p, onArchive: m, onUnarchive: h, onStop: g, onChangeTitle: _, showOptions: v, title: y, selectedRepository: le, lastUpdatedAt: b, createdAt: x, conversationId: S, executionStatus: C, sandboxStatus: w, contextMenuOpen: T = !1, onContextMenuToggle: E, isActive: D = !1, workspaceWorkingDir: O, showRepositoryMetadata: k = !0, llmModel: A = null, showLlmProfiles: j = !1, agentKind: M = null, acpServer: N = null, tags: P = null, showTags: F = !1, isArchived: I = !1, isPinned: L = !1, onTogglePin: R, alwaysShowPinIcon: z = !1 }) {
20
+ let { t: B } = e("openhands"), { trackDownloadVsCodeButtonClicked: V } = re(), [H, U] = l.useState("view"), { mutateAsync: ue } = r(), de = (e) => {
20
21
  e !== "" && e !== y && _?.(e), U("view");
22
+ }, W = (e) => {
23
+ e.preventDefault(), e.stopPropagation(), p?.(), E?.(!1);
24
+ }, G = (e) => {
25
+ e.preventDefault(), e.stopPropagation(), m?.(), E?.(!1);
21
26
  }, K = (e) => {
22
- e.preventDefault(), e.stopPropagation(), h?.(), D?.(!1);
27
+ e.preventDefault(), e.stopPropagation(), h?.(), E?.(!1);
23
28
  }, q = (e) => {
24
- e.preventDefault(), e.stopPropagation(), g?.(), D?.(!1);
29
+ e.preventDefault(), e.stopPropagation(), g?.(), E?.(!1);
25
30
  }, J = (e) => {
26
- e.preventDefault(), e.stopPropagation(), U("edit"), D?.(!1);
31
+ e.preventDefault(), e.stopPropagation(), U("edit"), E?.(!1);
27
32
  }, Y = async (e) => {
28
- if (e.preventDefault(), e.stopPropagation(), V(), C) try {
29
- let e = await ee.getVSCodeUrl(C);
33
+ if (e.preventDefault(), e.stopPropagation(), V(), S) try {
34
+ let e = await ne.getVSCodeUrl(S);
30
35
  if (e.vscode_url) {
31
- let t = a(e.vscode_url);
36
+ let t = ie(e.vscode_url);
32
37
  t && window.open(t, "_blank");
33
38
  }
34
39
  } catch {}
35
- D?.(!1);
40
+ E?.(!1);
36
41
  }, X = async (e) => {
37
- e.preventDefault(), e.stopPropagation(), C && await W(C), D?.(!1);
38
- }, re = (e) => {
42
+ e.preventDefault(), e.stopPropagation(), S && await ue(S), E?.(!1);
43
+ }, fe = (e) => {
39
44
  e.preventDefault(), e.stopPropagation(), R?.();
40
- }, ie = () => /* @__PURE__ */ f("button", {
45
+ }, pe = () => /* @__PURE__ */ u("button", {
41
46
  type: "button",
42
- "data-testid": C ? `conversation-pin-toggle-${C}` : "conversation-pin-toggle",
47
+ "data-testid": S ? `conversation-pin-toggle-${S}` : "conversation-pin-toggle",
43
48
  "aria-pressed": L,
44
49
  "aria-label": B(L ? t.CONVERSATION_PANEL$UNPIN_CONVERSATION : t.CONVERSATION_PANEL$PIN_CONVERSATION),
45
- onClick: re,
46
- className: r("flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1", "text-[var(--oh-muted)] hover:bg-white/10 hover:text-white"),
47
- children: /* @__PURE__ */ f(n, {
48
- className: r("h-3.5 w-3.5", L && "fill-current"),
50
+ onClick: fe,
51
+ className: n("flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1", "text-[var(--oh-muted)] hover:bg-white/10 hover:text-white"),
52
+ children: /* @__PURE__ */ u(ee, {
53
+ className: n("h-3.5 w-3.5", L && "fill-current"),
49
54
  "aria-hidden": !0
50
55
  })
51
- }), Z = !!(h || _ || v), Q = Z || !!R, $ = z && L && !!R, ae = A || M && (N === "acp" || !!j) || I && i(F).length > 0;
52
- return /* @__PURE__ */ p("div", {
56
+ }), Z = !!(p || m || h || _ || v), Q = Z || !!R, $ = z && L && !!R, me = k || I || j && (M === "acp" || !!A) || F && te(P).length > 0;
57
+ return /* @__PURE__ */ d("div", {
53
58
  "data-testid": "conversation-card",
54
- "data-context-menu-open": E.toString(),
55
- "data-active": O ? "true" : "false",
56
- onClick: m,
57
- className: r("group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors", !E && "hover:bg-[var(--oh-surface)]", (O || E) && "bg-[var(--oh-surface)]"),
58
- children: [/* @__PURE__ */ p("div", {
59
+ "data-context-menu-open": T.toString(),
60
+ "data-active": D ? "true" : "false",
61
+ onClick: f,
62
+ className: n("group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors", !T && "hover:bg-[var(--oh-surface)]", (D || T) && "bg-[var(--oh-surface)]"),
63
+ children: [/* @__PURE__ */ d("div", {
59
64
  className: "flex items-center w-full min-w-0",
60
- children: [/* @__PURE__ */ p("div", {
65
+ children: [/* @__PURE__ */ d("div", {
61
66
  className: "flex items-center gap-2 flex-1 min-w-0 overflow-hidden",
62
- children: [/* @__PURE__ */ f(s, {
67
+ children: [/* @__PURE__ */ u(se, {
63
68
  title: y,
64
69
  titleMode: H,
65
- onTitleSave: G,
66
- executionStatus: w,
67
- sandboxStatus: T
68
- }), T === "ERROR" && /* @__PURE__ */ f(u, {})]
69
- }), /* @__PURE__ */ p("div", {
70
- className: r("relative ml-auto pl-2 flex items-center justify-end shrink-0", $ ? "min-w-[3.75rem]" : Q && "group-hover:min-w-[3.75rem] group-focus-within:min-w-[3.75rem]", E && "min-w-[3.75rem]"),
71
- children: [!$ && (S ?? x) && /* @__PURE__ */ f("p", {
72
- className: r("text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5", Q && "group-hover:opacity-0 group-focus-within:opacity-0", E && "opacity-0"),
73
- children: /* @__PURE__ */ f("time", { children: o(x ?? S) })
74
- }), Q ? /* @__PURE__ */ p("div", {
75
- className: r("absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity", $ ? "pointer-events-auto visible opacity-100" : r("pointer-events-none opacity-0 invisible", "group-hover:pointer-events-auto group-hover:opacity-100 group-hover:visible", "group-focus-within:pointer-events-auto group-focus-within:opacity-100 group-focus-within:visible"), E && "pointer-events-auto visible opacity-100"),
70
+ onTitleSave: de,
71
+ executionStatus: C,
72
+ sandboxStatus: w
73
+ }), w === "ERROR" && /* @__PURE__ */ u(c, {})]
74
+ }), /* @__PURE__ */ d("div", {
75
+ className: n("relative ml-auto pl-2 flex items-center justify-end shrink-0", $ ? "min-w-[3.75rem]" : Q && ae(T)),
76
+ children: [!$ && (x ?? b) && /* @__PURE__ */ u("p", {
77
+ className: n("text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5", Q && oe(T)),
78
+ children: /* @__PURE__ */ u("time", { children: i(b ?? x) })
79
+ }), Q ? /* @__PURE__ */ d("div", {
80
+ className: n("absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity", $ ? "pointer-events-auto visible opacity-100" : a(T)),
76
81
  children: [
77
- R ? ie() : null,
78
- $ && (S ?? x) && Z ? /* @__PURE__ */ p("div", {
82
+ R ? pe() : null,
83
+ $ && (x ?? b) && Z ? /* @__PURE__ */ d("div", {
79
84
  className: "relative shrink-0",
80
- children: [/* @__PURE__ */ f("div", {
81
- className: r(!E && "invisible pointer-events-none group-hover:visible group-hover:pointer-events-auto group-focus-within:visible group-focus-within:pointer-events-auto"),
82
- children: /* @__PURE__ */ f(c, {
83
- contextMenuOpen: E,
84
- onContextMenuToggle: D || (() => {}),
85
- onDelete: h && K,
85
+ children: [/* @__PURE__ */ u("div", {
86
+ className: a(T),
87
+ children: /* @__PURE__ */ u(s, {
88
+ contextMenuOpen: T,
89
+ onContextMenuToggle: E || (() => {}),
90
+ onDelete: p && W,
91
+ onArchive: m && G,
92
+ onUnarchive: h && K,
86
93
  onStop: g && q,
87
94
  onEdit: _ && J,
88
95
  onDownloadViaVSCode: Y,
89
96
  onDownloadConversation: X,
90
- executionStatus: w,
91
- conversationId: C,
97
+ executionStatus: C,
98
+ conversationId: S,
92
99
  showOptions: v
93
100
  })
94
- }), /* @__PURE__ */ f("p", {
95
- className: r("pointer-events-none absolute inset-0 flex items-center justify-end", "text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5", "group-hover:hidden group-focus-within:hidden", E && "hidden"),
96
- children: /* @__PURE__ */ f("time", { children: o(x ?? S) })
101
+ }), /* @__PURE__ */ u("p", {
102
+ className: n("pointer-events-none absolute inset-0 items-center justify-end", "text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5", o(T)),
103
+ children: /* @__PURE__ */ u("time", { children: i(b ?? x) })
97
104
  })]
98
105
  }) : null,
99
- !$ && Z ? /* @__PURE__ */ f(c, {
100
- contextMenuOpen: E,
101
- onContextMenuToggle: D || (() => {}),
102
- onDelete: h && K,
106
+ !$ && Z ? /* @__PURE__ */ u(s, {
107
+ contextMenuOpen: T,
108
+ onContextMenuToggle: E || (() => {}),
109
+ onDelete: p && W,
110
+ onArchive: m && G,
111
+ onUnarchive: h && K,
103
112
  onStop: g && q,
104
113
  onEdit: _ && J,
105
114
  onDownloadViaVSCode: Y,
106
115
  onDownloadConversation: X,
107
- executionStatus: w,
108
- conversationId: C,
116
+ executionStatus: C,
117
+ conversationId: S,
109
118
  showOptions: v
110
119
  }) : null
111
120
  ]
112
121
  }) : null]
113
122
  })]
114
- }), ae && /* @__PURE__ */ f(l, {
115
- selectedRepository: b,
116
- lastUpdatedAt: x,
117
- createdAt: S,
118
- executionStatus: w,
119
- workspaceWorkingDir: k,
120
- showRepositoryMetadata: A,
123
+ }), me && /* @__PURE__ */ u(ce, {
124
+ selectedRepository: le,
125
+ lastUpdatedAt: b,
126
+ createdAt: x,
127
+ executionStatus: C,
128
+ workspaceWorkingDir: O,
129
+ showRepositoryMetadata: k,
121
130
  showTimestamp: !1,
122
- llmModel: j,
123
- showAgentChip: M,
124
- agentKind: N,
125
- acpServer: P,
126
- tags: F,
127
- showTags: I
131
+ llmModel: A,
132
+ showAgentChip: j,
133
+ agentKind: M,
134
+ acpServer: N,
135
+ tags: P,
136
+ showTags: F,
137
+ isArchived: I
128
138
  })]
129
139
  });
130
140
  }
131
141
  //#endregion
132
- export { m as ConversationCard };
142
+ export { f as ConversationCard };
133
143
 
134
144
  //# sourceMappingURL=conversation-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-card.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { Pin } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { transformVSCodeUrl } from \"#/utils/vscode-url-helper\";\nimport ConversationService from \"#/api/conversation-service/conversation-service.api\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { SandboxStatus } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { ConversationCardHeader } from \"./conversation-card-header\";\nimport { ConversationCardActions } from \"./conversation-card-actions\";\nimport { ConversationCardFooter } from \"./conversation-card-footer\";\nimport { ConversationStatusBadges } from \"./conversation-status-badges\";\nimport { useDownloadConversation } from \"#/hooks/use-download-conversation\";\n\ninterface ConversationCardProps {\n onClick?: () => void;\n onDelete?: () => void;\n onStop?: () => void;\n onChangeTitle?: (title: string) => void;\n showOptions?: boolean;\n title: string;\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n sandboxStatus?: SandboxStatus | null;\n conversationId?: string;\n contextMenuOpen?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n isActive?: boolean;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n llmModel?: string | null;\n showLlmProfiles?: boolean;\n agentKind?: \"openhands\" | \"acp\" | null;\n acpServer?: string | null;\n tags?: Record<string, string> | null;\n /** Gates the tag-chip row; wired to the panel's \"Tags\" metadata toggle. */\n showTags?: boolean;\n isPinned?: boolean;\n onTogglePin?: () => void;\n /** When true and pinned, keep the pin icon visible without hovering. */\n alwaysShowPinIcon?: boolean;\n}\n\nexport function ConversationCard({\n onClick,\n onDelete,\n onStop,\n onChangeTitle,\n showOptions,\n title,\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n conversationId,\n executionStatus,\n sandboxStatus,\n contextMenuOpen = false,\n onContextMenuToggle,\n isActive = false,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n llmModel = null,\n showLlmProfiles = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isPinned = false,\n onTogglePin,\n alwaysShowPinIcon = false,\n}: ConversationCardProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackDownloadVsCodeButtonClicked } = useTracking();\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const onTitleSave = (newTitle: string) => {\n if (newTitle !== \"\" && newTitle !== title) {\n onChangeTitle?.(newTitle);\n }\n setTitleMode(\"view\");\n };\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onDelete?.();\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onStop?.();\n onContextMenuToggle?.(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadViaVSCode = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n trackDownloadVsCodeButtonClicked();\n\n // Fetch the VS Code URL from the API\n if (conversationId) {\n try {\n const data = await ConversationService.getVSCodeUrl(conversationId);\n if (data.vscode_url) {\n const transformedUrl = transformVSCodeUrl(data.vscode_url);\n if (transformedUrl) {\n window.open(transformedUrl, \"_blank\");\n }\n }\n // VS Code URL not available\n } catch {\n // Failed to fetch VS Code URL\n }\n }\n\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePin = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin?.();\n };\n\n const renderPinButton = () => (\n <button\n type=\"button\"\n data-testid={\n conversationId\n ? `conversation-pin-toggle-${conversationId}`\n : \"conversation-pin-toggle\"\n }\n aria-pressed={isPinned}\n aria-label={\n isPinned\n ? t(I18nKey.CONVERSATION_PANEL$UNPIN_CONVERSATION)\n : t(I18nKey.CONVERSATION_PANEL$PIN_CONVERSATION)\n }\n onClick={handleTogglePin}\n className={cn(\n \"flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)] hover:bg-white/10 hover:text-white\",\n )}\n >\n <Pin\n className={cn(\"h-3.5 w-3.5\", isPinned && \"fill-current\")}\n aria-hidden\n />\n </button>\n );\n\n const hasContextMenu = !!(onDelete || onChangeTitle || showOptions);\n const hasHoverActions = hasContextMenu || !!onTogglePin;\n const showPersistentPinIcon = alwaysShowPinIcon && isPinned && !!onTogglePin;\n const shouldRenderFooter =\n showRepositoryMetadata ||\n (showLlmProfiles && (agentKind === \"acp\" || !!llmModel)) ||\n (showTags && getDisplayConversationTags(tags).length > 0);\n\n return (\n <div\n data-testid=\"conversation-card\"\n data-context-menu-open={contextMenuOpen.toString()}\n data-active={isActive ? \"true\" : \"false\"}\n onClick={onClick}\n className={cn(\n \"group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors\",\n !contextMenuOpen && \"hover:bg-[var(--oh-surface)]\",\n (isActive || contextMenuOpen) && \"bg-[var(--oh-surface)]\",\n )}\n >\n <div className=\"flex items-center w-full min-w-0\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0 overflow-hidden\">\n <ConversationCardHeader\n title={title}\n titleMode={titleMode}\n onTitleSave={onTitleSave}\n executionStatus={executionStatus}\n sandboxStatus={sandboxStatus}\n />\n {sandboxStatus === \"ERROR\" && <ConversationStatusBadges />}\n </div>\n\n <div\n className={cn(\n \"relative ml-auto pl-2 flex items-center justify-end shrink-0\",\n // The hover action overlay (pin + ellipsis) is absolutely\n // positioned, so reserve its width so the flex-1 title truncates\n // instead of colliding with the buttons. Pinned cards keep the pin\n // visible at rest, so reserve the width always for those.\n showPersistentPinIcon\n ? \"min-w-[3.75rem]\"\n : hasHoverActions &&\n \"group-hover:min-w-[3.75rem] group-focus-within:min-w-[3.75rem]\",\n contextMenuOpen && \"min-w-[3.75rem]\",\n )}\n >\n {!showPersistentPinIcon && (createdAt ?? lastUpdatedAt) && (\n <p\n className={cn(\n \"text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5\",\n hasHoverActions &&\n \"group-hover:opacity-0 group-focus-within:opacity-0\",\n contextMenuOpen && \"opacity-0\",\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n )}\n\n {hasHoverActions ? (\n <div\n className={cn(\n \"absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity\",\n showPersistentPinIcon\n ? \"pointer-events-auto visible opacity-100\"\n : cn(\n \"pointer-events-none opacity-0 invisible\",\n \"group-hover:pointer-events-auto group-hover:opacity-100 group-hover:visible\",\n \"group-focus-within:pointer-events-auto group-focus-within:opacity-100 group-focus-within:visible\",\n ),\n contextMenuOpen && \"pointer-events-auto visible opacity-100\",\n )}\n >\n {onTogglePin ? renderPinButton() : null}\n {showPersistentPinIcon &&\n (createdAt ?? lastUpdatedAt) &&\n hasContextMenu ? (\n <div className=\"relative shrink-0\">\n <div\n className={cn(\n !contextMenuOpen &&\n \"invisible pointer-events-none group-hover:visible group-hover:pointer-events-auto group-focus-within:visible group-focus-within:pointer-events-auto\",\n )}\n >\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n </div>\n <p\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-end\",\n \"text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5\",\n \"group-hover:hidden group-focus-within:hidden\",\n contextMenuOpen && \"hidden\",\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n </div>\n ) : null}\n {!showPersistentPinIcon && hasContextMenu ? (\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {shouldRenderFooter && (\n <ConversationCardFooter\n selectedRepository={selectedRepository}\n lastUpdatedAt={lastUpdatedAt}\n createdAt={createdAt}\n executionStatus={executionStatus}\n workspaceWorkingDir={workspaceWorkingDir}\n showRepositoryMetadata={showRepositoryMetadata}\n showTimestamp={false}\n llmModel={llmModel}\n showAgentChip={showLlmProfiles}\n agentKind={agentKind}\n acpServer={acpServer}\n tags={tags}\n showTags={showTags}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-card.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card.tsx"],"sourcesContent":["import React from \"react\";\nimport { Pin } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { transformVSCodeUrl } from \"#/utils/vscode-url-helper\";\nimport ConversationService from \"#/api/conversation-service/conversation-service.api\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { SandboxStatus } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport {\n hoverRevealActionClassName,\n hoverRevealPinnedTimestampClassName,\n hoverRevealReserveClassName,\n hoverRevealYieldClassName,\n} from \"#/utils/hover-reveal-classes\";\nimport { ConversationCardHeader } from \"./conversation-card-header\";\nimport { ConversationCardActions } from \"./conversation-card-actions\";\nimport { ConversationCardFooter } from \"./conversation-card-footer\";\nimport { ConversationStatusBadges } from \"./conversation-status-badges\";\nimport { useDownloadConversation } from \"#/hooks/use-download-conversation\";\n\ninterface ConversationCardProps {\n onClick?: () => void;\n onDelete?: () => void;\n onArchive?: () => void;\n /**\n * Restores an archived conversation. The panel passes this instead of\n * `onArchive` for rows that are already archived, so the menu offers exactly\n * one of the two directions.\n */\n onUnarchive?: () => void;\n onStop?: () => void;\n onChangeTitle?: (title: string) => void;\n showOptions?: boolean;\n title: string;\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n sandboxStatus?: SandboxStatus | null;\n conversationId?: string;\n contextMenuOpen?: boolean;\n onContextMenuToggle?: (isOpen: boolean) => void;\n isActive?: boolean;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n llmModel?: string | null;\n showLlmProfiles?: boolean;\n agentKind?: \"openhands\" | \"acp\" | null;\n acpServer?: string | null;\n tags?: Record<string, string> | null;\n /** Gates the tag-chip row; wired to the panel's \"Tags\" metadata toggle. */\n showTags?: boolean;\n isArchived?: boolean;\n isPinned?: boolean;\n onTogglePin?: () => void;\n /** When true and pinned, keep the pin icon visible without hovering. */\n alwaysShowPinIcon?: boolean;\n}\n\nexport function ConversationCard({\n onClick,\n onDelete,\n onArchive,\n onUnarchive,\n onStop,\n onChangeTitle,\n showOptions,\n title,\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n conversationId,\n executionStatus,\n sandboxStatus,\n contextMenuOpen = false,\n onContextMenuToggle,\n isActive = false,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n llmModel = null,\n showLlmProfiles = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n isPinned = false,\n onTogglePin,\n alwaysShowPinIcon = false,\n}: ConversationCardProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackDownloadVsCodeButtonClicked } = useTracking();\n const [titleMode, setTitleMode] = React.useState<\"view\" | \"edit\">(\"view\");\n const { mutateAsync: downloadConversation } = useDownloadConversation();\n\n const onTitleSave = (newTitle: string) => {\n if (newTitle !== \"\" && newTitle !== title) {\n onChangeTitle?.(newTitle);\n }\n setTitleMode(\"view\");\n };\n\n const handleDelete = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onDelete?.();\n onContextMenuToggle?.(false);\n };\n\n const handleArchive = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onArchive?.();\n onContextMenuToggle?.(false);\n };\n\n const handleUnarchive = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onUnarchive?.();\n onContextMenuToggle?.(false);\n };\n\n const handleStop = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onStop?.();\n onContextMenuToggle?.(false);\n };\n\n const handleEdit = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setTitleMode(\"edit\");\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadViaVSCode = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n trackDownloadVsCodeButtonClicked();\n\n // Fetch the VS Code URL from the API\n if (conversationId) {\n try {\n const data = await ConversationService.getVSCodeUrl(conversationId);\n if (data.vscode_url) {\n const transformedUrl = transformVSCodeUrl(data.vscode_url);\n if (transformedUrl) {\n window.open(transformedUrl, \"_blank\");\n }\n }\n // VS Code URL not available\n } catch {\n // Failed to fetch VS Code URL\n }\n }\n\n onContextMenuToggle?.(false);\n };\n\n const handleDownloadConversation = async (\n event: React.MouseEvent<HTMLButtonElement>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (conversationId) {\n await downloadConversation(conversationId);\n }\n onContextMenuToggle?.(false);\n };\n\n const handleTogglePin = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n onTogglePin?.();\n };\n\n const renderPinButton = () => (\n <button\n type=\"button\"\n data-testid={\n conversationId\n ? `conversation-pin-toggle-${conversationId}`\n : \"conversation-pin-toggle\"\n }\n aria-pressed={isPinned}\n aria-label={\n isPinned\n ? t(I18nKey.CONVERSATION_PANEL$UNPIN_CONVERSATION)\n : t(I18nKey.CONVERSATION_PANEL$PIN_CONVERSATION)\n }\n onClick={handleTogglePin}\n className={cn(\n \"flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)] hover:bg-white/10 hover:text-white\",\n )}\n >\n <Pin\n className={cn(\"h-3.5 w-3.5\", isPinned && \"fill-current\")}\n aria-hidden\n />\n </button>\n );\n\n const hasContextMenu = !!(\n onDelete ||\n onArchive ||\n onUnarchive ||\n onChangeTitle ||\n showOptions\n );\n const hasHoverActions = hasContextMenu || !!onTogglePin;\n const showPersistentPinIcon = alwaysShowPinIcon && isPinned && !!onTogglePin;\n const shouldRenderFooter =\n showRepositoryMetadata ||\n isArchived ||\n (showLlmProfiles && (agentKind === \"acp\" || !!llmModel)) ||\n (showTags && getDisplayConversationTags(tags).length > 0);\n\n return (\n <div\n data-testid=\"conversation-card\"\n data-context-menu-open={contextMenuOpen.toString()}\n data-active={isActive ? \"true\" : \"false\"}\n onClick={onClick}\n className={cn(\n \"group relative h-auto w-full cursor-pointer rounded-md py-1 pl-2 pr-1 transition-colors\",\n !contextMenuOpen && \"hover:bg-[var(--oh-surface)]\",\n (isActive || contextMenuOpen) && \"bg-[var(--oh-surface)]\",\n )}\n >\n <div className=\"flex items-center w-full min-w-0\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0 overflow-hidden\">\n <ConversationCardHeader\n title={title}\n titleMode={titleMode}\n onTitleSave={onTitleSave}\n executionStatus={executionStatus}\n sandboxStatus={sandboxStatus}\n />\n {sandboxStatus === \"ERROR\" && <ConversationStatusBadges />}\n </div>\n\n <div\n className={cn(\n \"relative ml-auto pl-2 flex items-center justify-end shrink-0\",\n // The hover action overlay (pin + ellipsis) is absolutely\n // positioned, so reserve its width so the flex-1 title truncates\n // instead of colliding with the buttons. Pinned cards keep the pin\n // visible at rest, so reserve the width always for those. Touch /\n // coarse-pointer devices also keep the reserve so the ellipsis stays\n // clickable without a hover pass.\n showPersistentPinIcon\n ? \"min-w-[3.75rem]\"\n : hasHoverActions && hoverRevealReserveClassName(contextMenuOpen),\n )}\n >\n {!showPersistentPinIcon && (createdAt ?? lastUpdatedAt) && (\n <p\n className={cn(\n \"text-xs text-[var(--oh-muted)] text-right whitespace-nowrap transition-opacity -translate-x-1.5\",\n hasHoverActions && hoverRevealYieldClassName(contextMenuOpen),\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n )}\n\n {hasHoverActions ? (\n <div\n className={cn(\n \"absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-0.5 transition-opacity\",\n showPersistentPinIcon\n ? \"pointer-events-auto visible opacity-100\"\n : hoverRevealActionClassName(contextMenuOpen),\n )}\n >\n {onTogglePin ? renderPinButton() : null}\n {showPersistentPinIcon &&\n (createdAt ?? lastUpdatedAt) &&\n hasContextMenu ? (\n <div className=\"relative shrink-0\">\n <div className={hoverRevealActionClassName(contextMenuOpen)}>\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onArchive={onArchive && handleArchive}\n onUnarchive={onUnarchive && handleUnarchive}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n </div>\n <p\n className={cn(\n \"pointer-events-none absolute inset-0 items-center justify-end\",\n \"text-xs text-[var(--oh-muted)] whitespace-nowrap -translate-x-1.5\",\n hoverRevealPinnedTimestampClassName(contextMenuOpen),\n )}\n >\n <time>{formatTimeDelta(lastUpdatedAt ?? createdAt)}</time>\n </p>\n </div>\n ) : null}\n {!showPersistentPinIcon && hasContextMenu ? (\n <ConversationCardActions\n contextMenuOpen={contextMenuOpen}\n onContextMenuToggle={onContextMenuToggle || (() => {})}\n onDelete={onDelete && handleDelete}\n onArchive={onArchive && handleArchive}\n onUnarchive={onUnarchive && handleUnarchive}\n onStop={onStop && handleStop}\n onEdit={onChangeTitle && handleEdit}\n onDownloadViaVSCode={handleDownloadViaVSCode}\n onDownloadConversation={handleDownloadConversation}\n executionStatus={executionStatus}\n conversationId={conversationId}\n showOptions={showOptions}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {shouldRenderFooter && (\n <ConversationCardFooter\n selectedRepository={selectedRepository}\n lastUpdatedAt={lastUpdatedAt}\n createdAt={createdAt}\n executionStatus={executionStatus}\n workspaceWorkingDir={workspaceWorkingDir}\n showRepositoryMetadata={showRepositoryMetadata}\n showTimestamp={false}\n llmModel={llmModel}\n showAgentChip={showLlmProfiles}\n agentKind={agentKind}\n acpServer={acpServer}\n tags={tags}\n showTags={showTags}\n isArchived={isArchived}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./conversation-panel-list-helpers.cjs"),r=require("./conversation-group-folder-row.cjs");let i=require("react"),a=require("react/jsx-runtime");function o({groups:o,groupIds:s,groupFolderOrder:c,setGroupFolderOrder:l,collapsedGroupIds:u,expandedGroupPreviewIds:d,onToggleGroupCollapsed:f,onToggleGroupPreviewExpanded:p,isCreatingConversationFlow:m,activeConversationId:h,onLaunchFromGroup:g,renderConversationCard:_}){let{t:v}=e.useTranslation(`openhands`),[y,b]=(0,i.useState)(null),[x,S]=(0,i.useState)(null),[C,w]=(0,i.useState)(null),[T,E]=(0,i.useState)(!1),D=(0,i.useRef)(null);(0,i.useEffect)(()=>()=>{D.current&&clearTimeout(D.current)},[]);let O=(0,i.useCallback)(()=>{D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{E(!1),D.current=null},300)},[]),k=(0,i.useCallback)(()=>{b(null),S(null),w(null)},[]),A=(0,i.useCallback)(e=>{let t=e.currentTarget.getBoundingClientRect();return e.clientY<t.top+t.height/2?`before`:`after`},[]),j=(0,i.useCallback)((e,t)=>{if(!y||y===e){k(),O();return}l(n.moveGroupFolderOrder(c,s,y,e,t)),k(),O()},[y,c,s,k,l,O]);return(0,a.jsx)(`nav`,{"aria-label":v(t.I18nKey.SIDEBAR$CONVERSATIONS),className:`space-y-1 md:space-y-0.5 pb-1`,children:o.map(e=>(0,a.jsx)(r.ConversationGroupFolderRow,{group:e,expanded:!u.has(e.id),previewExpanded:d.has(e.id),isDragging:y===e.id,dropIndicatorPosition:x===e.id&&y!==e.id?C:null,animateLayout:T,isCreatingConversationFlow:m,activeConversationId:h,onToggleExpanded:()=>f(e.id),onDragStart:()=>{E(!0),b(e.id)},onDragEnd:()=>{k(),O()},onDragOver:t=>{t.preventDefault();let{dataTransfer:n}=t;n&&(n.dropEffect=`move`),S(e.id),w(A(t))},onDragLeave:()=>{S(t=>t===e.id?null:t)},onDrop:t=>{t.preventDefault(),j(e.id,A(t))},onTogglePreviewExpanded:()=>p(e.id),onLaunchFromGroup:()=>g(e.launch),renderConversationCard:_},e.id))})}exports.ConversationGroupFolderList=o;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("./conversation-panel-list-helpers.cjs"),r=require("./conversation-group-folder-row.cjs");let i=require("react"),a=require("react/jsx-runtime");function o({groups:o,groupIds:s,groupFolderOrder:c,setGroupFolderOrder:l,collapsedGroupIds:u,expandedGroupPreviewIds:d,discoveryConversationIds:f,onToggleGroupCollapsed:p,onToggleGroupPreviewExpanded:m,isCreatingConversationFlow:h,activeConversationId:g,onLaunchFromGroup:_,renderConversationCard:v}){let{t:y}=e.useTranslation(`openhands`),[b,x]=(0,i.useState)(null),[S,C]=(0,i.useState)(null),[w,T]=(0,i.useState)(null),[E,D]=(0,i.useState)(!1),O=(0,i.useRef)(null);(0,i.useEffect)(()=>()=>{O.current&&clearTimeout(O.current)},[]);let k=(0,i.useCallback)(()=>{O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{D(!1),O.current=null},300)},[]),A=(0,i.useCallback)(()=>{x(null),C(null),T(null)},[]),j=(0,i.useCallback)(e=>{let t=e.currentTarget.getBoundingClientRect();return e.clientY<t.top+t.height/2?`before`:`after`},[]),M=(0,i.useCallback)((e,t)=>{if(!b||b===e){A(),k();return}l(n.moveGroupFolderOrder(c,s,b,e,t)),A(),k()},[b,c,s,A,l,k]);return(0,a.jsx)(`nav`,{"aria-label":y(t.I18nKey.SIDEBAR$CONVERSATIONS),className:`space-y-1 md:space-y-0.5 pb-1`,children:o.map(e=>(0,a.jsx)(r.ConversationGroupFolderRow,{group:e,expanded:!u.has(e.id),previewExpanded:d.has(e.id),isDragging:b===e.id,dropIndicatorPosition:S===e.id&&b!==e.id?w:null,animateLayout:E,isCreatingConversationFlow:h,activeConversationId:g,discoveryConversationIds:f,onToggleExpanded:()=>p(e.id),onDragStart:()=>{D(!0),x(e.id)},onDragEnd:()=>{A(),k()},onDragOver:t=>{t.preventDefault();let{dataTransfer:n}=t;n&&(n.dropEffect=`move`),C(e.id),T(j(t))},onDragLeave:()=>{C(t=>t===e.id?null:t)},onDrop:t=>{t.preventDefault(),M(e.id,j(t))},onTogglePreviewExpanded:()=>m(e.id),onLaunchFromGroup:()=>_(e.launch),renderConversationCard:v},e.id))})}exports.ConversationGroupFolderList=o;
2
2
  //# sourceMappingURL=conversation-group-folder-list.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-group-folder-list.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":"0UAwCA,SAAgB,EAA4B,CAC1C,SACA,WACA,mBACA,sBACA,oBACA,0BACA,yBACA,+BACA,6BACA,uBACA,oBACA,0BACmC,CACnC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA6C,IAAI,EAClE,CAAC,EAAmB,IAAA,EAAA,EAAA,UACxB,IACF,EACM,CAAC,EAAc,IAAA,EAAA,EAAA,UACsB,IAAI,EAGzC,CAAC,EAAe,IAAA,EAAA,EAAA,UAA6B,EAAK,EAClD,GAAA,EAAA,EAAA,QACJ,IACF,GAEA,EAAA,EAAA,mBACc,CACN,EAAwB,SAC1B,aAAa,EAAwB,OAAO,CAEhD,EACA,CAAC,CACH,EAEA,IAAM,GAAA,EAAA,EAAA,iBAA4C,CAC5C,EAAwB,SAC1B,aAAa,EAAwB,OAAO,EAE9C,EAAwB,QAAU,eAAiB,CACjD,EAAiB,EAAK,EACtB,EAAwB,QAAU,IACpC,EAAG,GAAG,CACR,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,iBAAmC,CACvC,EAAkB,IAAI,EACtB,EAAqB,IAAI,EACzB,EAAgB,IAAI,CACtB,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,aACH,GAA2D,CAC1D,IAAM,EAAO,EAAM,cAAc,sBAAsB,EACvD,OAAO,EAAM,QAAU,EAAK,IAAM,EAAK,OAAS,EAAI,SAAW,OACjE,EACA,CAAC,CACH,EAEM,GAAA,EAAA,EAAA,cACH,EAAuB,IAAsC,CAC5D,GAAI,CAAC,GAAkB,IAAmB,EAAe,CACvD,EAAe,EACf,EAAwB,EACxB,MACF,CAEA,EACE,EAAA,qBACE,EACA,EACA,EACA,EACA,CACF,CACF,EACA,EAAe,EAGf,EAAwB,CAC1B,EACA,CACE,EACA,EACA,EACA,EACA,EACA,CACF,CACF,EAEA,OACE,EAAA,EAAA,KAAC,MAAD,CACE,aAAY,EAAE,EAAA,QAAQ,qBAAqB,EAC3C,UAAU,yCAET,EAAO,IAAK,IACX,EAAA,EAAA,KAAC,EAAA,2BAAD,CAES,QACP,SAAU,CAAC,EAAkB,IAAI,EAAM,EAAE,EACzC,gBAAiB,EAAwB,IAAI,EAAM,EAAE,EACrD,WAAY,IAAmB,EAAM,GACrC,sBACE,IAAsB,EAAM,IAAM,IAAmB,EAAM,GACvD,EACA,KAES,gBACa,6BACN,uBACtB,qBAAwB,EAAuB,EAAM,EAAE,EACvD,gBAAmB,CACjB,EAAiB,EAAI,EACrB,EAAkB,EAAM,EAAE,CAC5B,EACA,cAAiB,CACf,EAAe,EACf,EAAwB,CAC1B,EACA,WAAa,GAAU,CACrB,EAAM,eAAe,EACrB,GAAM,CAAE,gBAAiB,EACrB,IACF,EAAa,WAAa,QAE5B,EAAqB,EAAM,EAAE,EAC7B,EAAgB,EAAoB,CAAK,CAAC,CAC5C,EACA,gBAAmB,CACjB,EAAsB,GACpB,IAAY,EAAM,GAAK,KAAO,CAChC,CACF,EACA,OAAS,GAAU,CACjB,EAAM,eAAe,EACrB,EAAW,EAAM,GAAI,EAAoB,CAAK,CAAC,CACjD,EACA,4BAA+B,EAA6B,EAAM,EAAE,EACpE,sBAAyB,EAAkB,EAAM,MAAM,EAC/B,wBACzB,EA3CM,EAAM,EA2CZ,CACF,CACE,CAAA,CAET"}
1
+ {"version":3,"file":"conversation-group-folder-list.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n discoveryConversationIds: ReadonlySet<string> | null;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n discoveryConversationIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n discoveryConversationIds={discoveryConversationIds}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":"0UAyCA,SAAgB,EAA4B,CAC1C,SACA,WACA,mBACA,sBACA,oBACA,0BACA,2BACA,yBACA,+BACA,6BACA,uBACA,oBACA,0BACmC,CACnC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA6C,IAAI,EAClE,CAAC,EAAmB,IAAA,EAAA,EAAA,UACxB,IACF,EACM,CAAC,EAAc,IAAA,EAAA,EAAA,UACsB,IAAI,EAGzC,CAAC,EAAe,IAAA,EAAA,EAAA,UAA6B,EAAK,EAClD,GAAA,EAAA,EAAA,QACJ,IACF,GAEA,EAAA,EAAA,mBACc,CACN,EAAwB,SAC1B,aAAa,EAAwB,OAAO,CAEhD,EACA,CAAC,CACH,EAEA,IAAM,GAAA,EAAA,EAAA,iBAA4C,CAC5C,EAAwB,SAC1B,aAAa,EAAwB,OAAO,EAE9C,EAAwB,QAAU,eAAiB,CACjD,EAAiB,EAAK,EACtB,EAAwB,QAAU,IACpC,EAAG,GAAG,CACR,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,iBAAmC,CACvC,EAAkB,IAAI,EACtB,EAAqB,IAAI,EACzB,EAAgB,IAAI,CACtB,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,aACH,GAA2D,CAC1D,IAAM,EAAO,EAAM,cAAc,sBAAsB,EACvD,OAAO,EAAM,QAAU,EAAK,IAAM,EAAK,OAAS,EAAI,SAAW,OACjE,EACA,CAAC,CACH,EAEM,GAAA,EAAA,EAAA,cACH,EAAuB,IAAsC,CAC5D,GAAI,CAAC,GAAkB,IAAmB,EAAe,CACvD,EAAe,EACf,EAAwB,EACxB,MACF,CAEA,EACE,EAAA,qBACE,EACA,EACA,EACA,EACA,CACF,CACF,EACA,EAAe,EAGf,EAAwB,CAC1B,EACA,CACE,EACA,EACA,EACA,EACA,EACA,CACF,CACF,EAEA,OACE,EAAA,EAAA,KAAC,MAAD,CACE,aAAY,EAAE,EAAA,QAAQ,qBAAqB,EAC3C,UAAU,yCAET,EAAO,IAAK,IACX,EAAA,EAAA,KAAC,EAAA,2BAAD,CAES,QACP,SAAU,CAAC,EAAkB,IAAI,EAAM,EAAE,EACzC,gBAAiB,EAAwB,IAAI,EAAM,EAAE,EACrD,WAAY,IAAmB,EAAM,GACrC,sBACE,IAAsB,EAAM,IAAM,IAAmB,EAAM,GACvD,EACA,KAES,gBACa,6BACN,uBACI,2BAC1B,qBAAwB,EAAuB,EAAM,EAAE,EACvD,gBAAmB,CACjB,EAAiB,EAAI,EACrB,EAAkB,EAAM,EAAE,CAC5B,EACA,cAAiB,CACf,EAAe,EACf,EAAwB,CAC1B,EACA,WAAa,GAAU,CACrB,EAAM,eAAe,EACrB,GAAM,CAAE,gBAAiB,EACrB,IACF,EAAa,WAAa,QAE5B,EAAqB,EAAM,EAAE,EAC7B,EAAgB,EAAoB,CAAK,CAAC,CAC5C,EACA,gBAAmB,CACjB,EAAsB,GACpB,IAAY,EAAM,GAAK,KAAO,CAChC,CACF,EACA,OAAS,GAAU,CACjB,EAAM,eAAe,EACrB,EAAW,EAAM,GAAI,EAAoB,CAAK,CAAC,CACjD,EACA,4BAA+B,EAA6B,EAAM,EAAE,EACpE,sBAAyB,EAAkB,EAAM,MAAM,EAC/B,wBACzB,EA5CM,EAAM,EA4CZ,CACF,CACE,CAAA,CAET"}
@@ -14,6 +14,7 @@ interface ConversationGroupFolderListProps {
14
14
  setGroupFolderOrder: (order: readonly string[]) => void;
15
15
  collapsedGroupIds: ReadonlySet<string>;
16
16
  expandedGroupPreviewIds: ReadonlySet<string>;
17
+ discoveryConversationIds: ReadonlySet<string> | null;
17
18
  onToggleGroupCollapsed: (groupId: string) => void;
18
19
  onToggleGroupPreviewExpanded: (groupId: string) => void;
19
20
  isCreatingConversationFlow: boolean;
@@ -21,5 +22,5 @@ interface ConversationGroupFolderListProps {
21
22
  onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;
22
23
  renderConversationCard: (conversation: AppConversation) => ReactNode;
23
24
  }
24
- export declare function ConversationGroupFolderList({ groups, groupIds, groupFolderOrder, setGroupFolderOrder, collapsedGroupIds, expandedGroupPreviewIds, onToggleGroupCollapsed, onToggleGroupPreviewExpanded, isCreatingConversationFlow, activeConversationId, onLaunchFromGroup, renderConversationCard, }: ConversationGroupFolderListProps): import("react").JSX.Element;
25
+ export declare function ConversationGroupFolderList({ groups, groupIds, groupFolderOrder, setGroupFolderOrder, collapsedGroupIds, expandedGroupPreviewIds, discoveryConversationIds, onToggleGroupCollapsed, onToggleGroupPreviewExpanded, isCreatingConversationFlow, activeConversationId, onLaunchFromGroup, renderConversationCard, }: ConversationGroupFolderListProps): import("react").JSX.Element;
25
26
  export {};
@@ -5,67 +5,68 @@ import { ConversationGroupFolderRow as r } from "./conversation-group-folder-row
5
5
  import { useCallback as i, useEffect as a, useRef as o, useState as s } from "react";
6
6
  import { jsx as c } from "react/jsx-runtime";
7
7
  //#region src/components/features/conversation-panel/conversation-group-folder-list.tsx
8
- function l({ groups: l, groupIds: u, groupFolderOrder: d, setGroupFolderOrder: f, collapsedGroupIds: p, expandedGroupPreviewIds: m, onToggleGroupCollapsed: h, onToggleGroupPreviewExpanded: g, isCreatingConversationFlow: _, activeConversationId: v, onLaunchFromGroup: y, renderConversationCard: b }) {
9
- let { t: x } = e("openhands"), [S, C] = s(null), [w, T] = s(null), [E, D] = s(null), [O, k] = s(!1), A = o(null);
8
+ function l({ groups: l, groupIds: u, groupFolderOrder: d, setGroupFolderOrder: f, collapsedGroupIds: p, expandedGroupPreviewIds: m, discoveryConversationIds: h, onToggleGroupCollapsed: g, onToggleGroupPreviewExpanded: _, isCreatingConversationFlow: v, activeConversationId: y, onLaunchFromGroup: b, renderConversationCard: x }) {
9
+ let { t: S } = e("openhands"), [C, w] = s(null), [T, E] = s(null), [D, O] = s(null), [k, A] = s(!1), j = o(null);
10
10
  a(() => () => {
11
- A.current && clearTimeout(A.current);
11
+ j.current && clearTimeout(j.current);
12
12
  }, []);
13
- let j = i(() => {
14
- A.current && clearTimeout(A.current), A.current = setTimeout(() => {
15
- k(!1), A.current = null;
13
+ let M = i(() => {
14
+ j.current && clearTimeout(j.current), j.current = setTimeout(() => {
15
+ A(!1), j.current = null;
16
16
  }, 300);
17
- }, []), M = i(() => {
18
- C(null), T(null), D(null);
19
- }, []), N = i((e) => {
17
+ }, []), N = i(() => {
18
+ w(null), E(null), O(null);
19
+ }, []), P = i((e) => {
20
20
  let t = e.currentTarget.getBoundingClientRect();
21
21
  return e.clientY < t.top + t.height / 2 ? "before" : "after";
22
- }, []), P = i((e, t) => {
23
- if (!S || S === e) {
24
- M(), j();
22
+ }, []), F = i((e, t) => {
23
+ if (!C || C === e) {
24
+ N(), M();
25
25
  return;
26
26
  }
27
- f(n(d, u, S, e, t)), M(), j();
27
+ f(n(d, u, C, e, t)), N(), M();
28
28
  }, [
29
- S,
29
+ C,
30
30
  d,
31
31
  u,
32
- M,
32
+ N,
33
33
  f,
34
- j
34
+ M
35
35
  ]);
36
36
  return /* @__PURE__ */ c("nav", {
37
- "aria-label": x(t.SIDEBAR$CONVERSATIONS),
37
+ "aria-label": S(t.SIDEBAR$CONVERSATIONS),
38
38
  className: "space-y-1 md:space-y-0.5 pb-1",
39
39
  children: l.map((e) => /* @__PURE__ */ c(r, {
40
40
  group: e,
41
41
  expanded: !p.has(e.id),
42
42
  previewExpanded: m.has(e.id),
43
- isDragging: S === e.id,
44
- dropIndicatorPosition: w === e.id && S !== e.id ? E : null,
45
- animateLayout: O,
46
- isCreatingConversationFlow: _,
47
- activeConversationId: v,
48
- onToggleExpanded: () => h(e.id),
43
+ isDragging: C === e.id,
44
+ dropIndicatorPosition: T === e.id && C !== e.id ? D : null,
45
+ animateLayout: k,
46
+ isCreatingConversationFlow: v,
47
+ activeConversationId: y,
48
+ discoveryConversationIds: h,
49
+ onToggleExpanded: () => g(e.id),
49
50
  onDragStart: () => {
50
- k(!0), C(e.id);
51
+ A(!0), w(e.id);
51
52
  },
52
53
  onDragEnd: () => {
53
- M(), j();
54
+ N(), M();
54
55
  },
55
56
  onDragOver: (t) => {
56
57
  t.preventDefault();
57
58
  let { dataTransfer: n } = t;
58
- n && (n.dropEffect = "move"), T(e.id), D(N(t));
59
+ n && (n.dropEffect = "move"), E(e.id), O(P(t));
59
60
  },
60
61
  onDragLeave: () => {
61
- T((t) => t === e.id ? null : t);
62
+ E((t) => t === e.id ? null : t);
62
63
  },
63
64
  onDrop: (t) => {
64
- t.preventDefault(), P(e.id, N(t));
65
+ t.preventDefault(), F(e.id, P(t));
65
66
  },
66
- onTogglePreviewExpanded: () => g(e.id),
67
- onLaunchFromGroup: () => y(e.launch),
68
- renderConversationCard: b
67
+ onTogglePreviewExpanded: () => _(e.id),
68
+ onLaunchFromGroup: () => b(e.launch),
69
+ renderConversationCard: x
69
70
  }, e.id))
70
71
  });
71
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-group-folder-list.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAwCA,SAAgB,EAA4B,EAC1C,WACA,aACA,qBACA,wBACA,sBACA,4BACA,2BACA,iCACA,+BACA,yBACA,sBACA,6BACmC;CACnC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAgB,KAAqB,EAAwB,IAAI,GAClE,CAAC,GAAmB,KAAwB,EAChD,IACF,GACM,CAAC,GAAc,KACnB,EAAyC,IAAI,GAGzC,CAAC,GAAe,KAAoB,EAAS,EAAK,GAClD,IAA0B,EAC9B,IACF;CAEA,cACc;EACV,AAAI,EAAwB,WAC1B,aAAa,EAAwB,OAAO;CAEhD,GACA,CAAC,CACH;CAEA,IAAM,IAA0B,QAAkB;EAIhD,AAHI,EAAwB,WAC1B,aAAa,EAAwB,OAAO,GAE9C,EAAwB,UAAU,iBAAiB;GAEjD,AADA,EAAiB,EAAK,GACtB,EAAwB,UAAU;EACpC,GAAG,GAAG;CACR,GAAG,CAAC,CAAC,GAEC,IAAiB,QAAkB;EAGvC,AAFA,EAAkB,IAAI,GACtB,EAAqB,IAAI,GACzB,EAAgB,IAAI;CACtB,GAAG,CAAC,CAAC,GAEC,IAAsB,GACzB,MAA2D;EAC1D,IAAM,IAAO,EAAM,cAAc,sBAAsB;EACvD,OAAO,EAAM,UAAU,EAAK,MAAM,EAAK,SAAS,IAAI,WAAW;CACjE,GACA,CAAC,CACH,GAEM,IAAa,GAChB,GAAuB,MAAsC;EAC5D,IAAI,CAAC,KAAkB,MAAmB,GAAe;GAEvD,AADA,EAAe,GACf,EAAwB;GACxB;EACF;EAcA,AAZA,EACE,EACE,GACA,GACA,GACA,GACA,CACF,CACF,GACA,EAAe,GAGf,EAAwB;CAC1B,GACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,OAAD;EACE,cAAY,EAAE,EAAQ,qBAAqB;EAC3C,WAAU;YAET,EAAO,KAAK,MACX,kBAAC,GAAD;GAES;GACP,UAAU,CAAC,EAAkB,IAAI,EAAM,EAAE;GACzC,iBAAiB,EAAwB,IAAI,EAAM,EAAE;GACrD,YAAY,MAAmB,EAAM;GACrC,uBACE,MAAsB,EAAM,MAAM,MAAmB,EAAM,KACvD,IACA;GAES;GACa;GACN;GACtB,wBAAwB,EAAuB,EAAM,EAAE;GACvD,mBAAmB;IAEjB,AADA,EAAiB,EAAI,GACrB,EAAkB,EAAM,EAAE;GAC5B;GACA,iBAAiB;IAEf,AADA,EAAe,GACf,EAAwB;GAC1B;GACA,aAAa,MAAU;IACrB,EAAM,eAAe;IACrB,IAAM,EAAE,oBAAiB;IAKzB,AAJI,MACF,EAAa,aAAa,SAE5B,EAAqB,EAAM,EAAE,GAC7B,EAAgB,EAAoB,CAAK,CAAC;GAC5C;GACA,mBAAmB;IACjB,GAAsB,MACpB,MAAY,EAAM,KAAK,OAAO,CAChC;GACF;GACA,SAAS,MAAU;IAEjB,AADA,EAAM,eAAe,GACrB,EAAW,EAAM,IAAI,EAAoB,CAAK,CAAC;GACjD;GACA,+BAA+B,EAA6B,EAAM,EAAE;GACpE,yBAAyB,EAAkB,EAAM,MAAM;GAC/B;EACzB,GA3CM,EAAM,EA2CZ,CACF;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"conversation-group-folder-list.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-group-folder-list.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ConversationGroupFolderRow } from \"./conversation-group-folder-row\";\nimport {\n moveGroupFolderOrder,\n type ConversationGroupLaunch,\n type GroupFolderDropPosition,\n} from \"./conversation-panel-list-helpers\";\n\ninterface ConversationGroup {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}\n\ninterface ConversationGroupFolderListProps {\n groups: ConversationGroup[];\n groupIds: readonly string[];\n groupFolderOrder: readonly string[];\n setGroupFolderOrder: (order: readonly string[]) => void;\n collapsedGroupIds: ReadonlySet<string>;\n expandedGroupPreviewIds: ReadonlySet<string>;\n discoveryConversationIds: ReadonlySet<string> | null;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleGroupPreviewExpanded: (groupId: string) => void;\n isCreatingConversationFlow: boolean;\n activeConversationId?: string | null;\n onLaunchFromGroup: (launch: ConversationGroupLaunch) => void;\n renderConversationCard: (conversation: AppConversation) => ReactNode;\n}\n\nexport function ConversationGroupFolderList({\n groups,\n groupIds,\n groupFolderOrder,\n setGroupFolderOrder,\n collapsedGroupIds,\n expandedGroupPreviewIds,\n discoveryConversationIds,\n onToggleGroupCollapsed,\n onToggleGroupPreviewExpanded,\n isCreatingConversationFlow,\n activeConversationId,\n onLaunchFromGroup,\n renderConversationCard,\n}: ConversationGroupFolderListProps) {\n const { t } = useTranslation(\"openhands\");\n const [draggedGroupId, setDraggedGroupId] = useState<string | null>(null);\n const [dropTargetGroupId, setDropTargetGroupId] = useState<string | null>(\n null,\n );\n const [dropPosition, setDropPosition] =\n useState<GroupFolderDropPosition | null>(null);\n // Layout animation is only enabled around a drag-and-drop reorder so that\n // expand/collapse clicks don't trigger sibling repositioning animations.\n const [animateLayout, setAnimateLayout] = useState(false);\n const animateLayoutTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n },\n [],\n );\n\n const stopAnimatingLayoutSoon = useCallback(() => {\n if (animateLayoutTimeoutRef.current) {\n clearTimeout(animateLayoutTimeoutRef.current);\n }\n animateLayoutTimeoutRef.current = setTimeout(() => {\n setAnimateLayout(false);\n animateLayoutTimeoutRef.current = null;\n }, 300);\n }, []);\n\n const resetDragState = useCallback(() => {\n setDraggedGroupId(null);\n setDropTargetGroupId(null);\n setDropPosition(null);\n }, []);\n\n const computeDropPosition = useCallback(\n (event: DragEvent<HTMLElement>): GroupFolderDropPosition => {\n const rect = event.currentTarget.getBoundingClientRect();\n return event.clientY < rect.top + rect.height / 2 ? \"before\" : \"after\";\n },\n [],\n );\n\n const handleDrop = useCallback(\n (targetGroupId: string, position: GroupFolderDropPosition) => {\n if (!draggedGroupId || draggedGroupId === targetGroupId) {\n resetDragState();\n stopAnimatingLayoutSoon();\n return;\n }\n\n setGroupFolderOrder(\n moveGroupFolderOrder(\n groupFolderOrder,\n groupIds,\n draggedGroupId,\n targetGroupId,\n position,\n ),\n );\n resetDragState();\n // Keep layout animation active across the reorder render, then disable\n // it once the spring settles.\n stopAnimatingLayoutSoon();\n },\n [\n draggedGroupId,\n groupFolderOrder,\n groupIds,\n resetDragState,\n setGroupFolderOrder,\n stopAnimatingLayoutSoon,\n ],\n );\n\n return (\n <nav\n aria-label={t(I18nKey.SIDEBAR$CONVERSATIONS)}\n className=\"space-y-1 md:space-y-0.5 pb-1\"\n >\n {groups.map((group) => (\n <ConversationGroupFolderRow\n key={group.id}\n group={group}\n expanded={!collapsedGroupIds.has(group.id)}\n previewExpanded={expandedGroupPreviewIds.has(group.id)}\n isDragging={draggedGroupId === group.id}\n dropIndicatorPosition={\n dropTargetGroupId === group.id && draggedGroupId !== group.id\n ? dropPosition\n : null\n }\n animateLayout={animateLayout}\n isCreatingConversationFlow={isCreatingConversationFlow}\n activeConversationId={activeConversationId}\n discoveryConversationIds={discoveryConversationIds}\n onToggleExpanded={() => onToggleGroupCollapsed(group.id)}\n onDragStart={() => {\n setAnimateLayout(true);\n setDraggedGroupId(group.id);\n }}\n onDragEnd={() => {\n resetDragState();\n stopAnimatingLayoutSoon();\n }}\n onDragOver={(event) => {\n event.preventDefault();\n const { dataTransfer } = event;\n if (dataTransfer) {\n dataTransfer.dropEffect = \"move\";\n }\n setDropTargetGroupId(group.id);\n setDropPosition(computeDropPosition(event));\n }}\n onDragLeave={() => {\n setDropTargetGroupId((current) =>\n current === group.id ? null : current,\n );\n }}\n onDrop={(event) => {\n event.preventDefault();\n handleDrop(group.id, computeDropPosition(event));\n }}\n onTogglePreviewExpanded={() => onToggleGroupPreviewExpanded(group.id)}\n onLaunchFromGroup={() => onLaunchFromGroup(group.launch)}\n renderConversationCard={renderConversationCard}\n />\n ))}\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAyCA,SAAgB,EAA4B,EAC1C,WACA,aACA,qBACA,wBACA,sBACA,4BACA,6BACA,2BACA,iCACA,+BACA,yBACA,sBACA,6BACmC;CACnC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAgB,KAAqB,EAAwB,IAAI,GAClE,CAAC,GAAmB,KAAwB,EAChD,IACF,GACM,CAAC,GAAc,KACnB,EAAyC,IAAI,GAGzC,CAAC,GAAe,KAAoB,EAAS,EAAK,GAClD,IAA0B,EAC9B,IACF;CAEA,cACc;EACV,AAAI,EAAwB,WAC1B,aAAa,EAAwB,OAAO;CAEhD,GACA,CAAC,CACH;CAEA,IAAM,IAA0B,QAAkB;EAIhD,AAHI,EAAwB,WAC1B,aAAa,EAAwB,OAAO,GAE9C,EAAwB,UAAU,iBAAiB;GAEjD,AADA,EAAiB,EAAK,GACtB,EAAwB,UAAU;EACpC,GAAG,GAAG;CACR,GAAG,CAAC,CAAC,GAEC,IAAiB,QAAkB;EAGvC,AAFA,EAAkB,IAAI,GACtB,EAAqB,IAAI,GACzB,EAAgB,IAAI;CACtB,GAAG,CAAC,CAAC,GAEC,IAAsB,GACzB,MAA2D;EAC1D,IAAM,IAAO,EAAM,cAAc,sBAAsB;EACvD,OAAO,EAAM,UAAU,EAAK,MAAM,EAAK,SAAS,IAAI,WAAW;CACjE,GACA,CAAC,CACH,GAEM,IAAa,GAChB,GAAuB,MAAsC;EAC5D,IAAI,CAAC,KAAkB,MAAmB,GAAe;GAEvD,AADA,EAAe,GACf,EAAwB;GACxB;EACF;EAcA,AAZA,EACE,EACE,GACA,GACA,GACA,GACA,CACF,CACF,GACA,EAAe,GAGf,EAAwB;CAC1B,GACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,OAAD;EACE,cAAY,EAAE,EAAQ,qBAAqB;EAC3C,WAAU;YAET,EAAO,KAAK,MACX,kBAAC,GAAD;GAES;GACP,UAAU,CAAC,EAAkB,IAAI,EAAM,EAAE;GACzC,iBAAiB,EAAwB,IAAI,EAAM,EAAE;GACrD,YAAY,MAAmB,EAAM;GACrC,uBACE,MAAsB,EAAM,MAAM,MAAmB,EAAM,KACvD,IACA;GAES;GACa;GACN;GACI;GAC1B,wBAAwB,EAAuB,EAAM,EAAE;GACvD,mBAAmB;IAEjB,AADA,EAAiB,EAAI,GACrB,EAAkB,EAAM,EAAE;GAC5B;GACA,iBAAiB;IAEf,AADA,EAAe,GACf,EAAwB;GAC1B;GACA,aAAa,MAAU;IACrB,EAAM,eAAe;IACrB,IAAM,EAAE,oBAAiB;IAKzB,AAJI,MACF,EAAa,aAAa,SAE5B,EAAqB,EAAM,EAAE,GAC7B,EAAgB,EAAoB,CAAK,CAAC;GAC5C;GACA,mBAAmB;IACjB,GAAsB,MACpB,MAAY,EAAM,KAAK,OAAO,CAChC;GACF;GACA,SAAS,MAAU;IAEjB,AADA,EAAM,eAAe,GACrB,EAAW,EAAM,IAAI,EAAoB,CAAK,CAAC;GACjD;GACA,+BAA+B,EAA6B,EAAM,EAAE;GACpE,yBAAyB,EAAkB,EAAM,MAAM;GAC/B;EACzB,GA5CM,EAAM,EA4CZ,CACF;CACE,CAAA;AAET"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/folder-open.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/plus.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.cjs"),s=require("./conversation-panel-list-helpers.cjs");let c=require("react"),l=require("react/jsx-runtime");function u({group:u,expanded:d,previewExpanded:f,isDragging:p,dropIndicatorPosition:m,animateLayout:h,isCreatingConversationFlow:g,activeConversationId:_,onToggleExpanded:v,onDragStart:y,onDragEnd:b,onDragOver:x,onDragLeave:S,onDrop:C,onTogglePreviewExpanded:w,onLaunchFromGroup:T,renderConversationCard:E}){let{t:D}=e.useTranslation(`openhands`),O=(0,c.useRef)(null),k=`thread-folder-${u.id.replace(/[^a-zA-Z0-9_-]/g,`-`)}`,A=u.id.replace(/[^a-zA-Z0-9_-]/g,`-`),{visibleConversations:j,isPreviewTruncated:M,isShowingAll:N}=s.getGroupConversationPreview(u.conversations,{expanded:f,activeConversationId:_});return(0,l.jsxs)(o.motion.section,{ref:O,layout:h?`position`:!1,transition:{type:`spring`,stiffness:600,damping:45},"aria-labelledby":k,"data-testid":`thread-folder-${A}`,onDragOver:x,onDragLeave:S,onDrop:C,className:`relative rounded-md`,children:[m?(0,l.jsx)(`div`,{"aria-hidden":!0,"data-testid":`thread-folder-drop-indicator-${A}`,className:a.cn(`pointer-events-none absolute inset-x-0 z-10 h-0.5 rounded-full bg-[var(--oh-accent)]`,m===`before`?`-top-0.5`:`-bottom-0.5`)}):null,(0,l.jsxs)(`div`,{className:a.cn(p&&`opacity-0`),children:[(0,l.jsxs)(`div`,{className:a.cn(`flex h-8 w-full min-w-0 items-center gap-0.5 rounded-md pl-2 pr-1 text-sm font-normal`,`text-[var(--oh-muted)] transition-colors hover:bg-[var(--oh-surface-raised)] hover:text-white`),children:[(0,l.jsxs)(`button`,{type:`button`,draggable:!0,id:k,"aria-expanded":d,"aria-controls":`thread-folder-content-${A}`,"data-testid":`thread-folder-drag-${A}`,"aria-label":D(d?t.I18nKey.CONVERSATION_PANEL$COLLAPSE_FOLDER:t.I18nKey.CONVERSATION_PANEL$EXPAND_FOLDER,{label:u.label}),onClick:v,onDragStart:e=>{e.stopPropagation();let{dataTransfer:t}=e;if(t){t.effectAllowed=`move`,t.setData(`text/plain`,u.id);let n=O.current;if(n&&typeof t.setDragImage==`function`){let r=n.getBoundingClientRect(),i=n.cloneNode(!0);i.style.position=`fixed`,i.style.top=`0`,i.style.left=`-9999px`,i.style.width=`${r.width}px`,i.style.margin=`0`,i.style.pointerEvents=`none`,i.style.borderRadius=`0.5rem`,i.style.padding=`0.25rem`,i.style.backgroundColor=`var(--oh-surface-raised)`,i.style.boxShadow=`0 8px 24px rgba(0, 0, 0, 0.35)`,document.body.appendChild(i),t.setDragImage(i,e.clientX-r.left,e.clientY-r.top),window.setTimeout(()=>i.remove(),0)}}y()},onDragEnd:e=>{e.stopPropagation(),b()},className:a.cn(`group/folder flex min-h-8 min-w-0 flex-1 cursor-grab items-center gap-2 rounded-md py-1 text-left text-inherit outline-none active:cursor-grabbing`,`focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`),children:[(0,l.jsx)(r.Folder,{className:a.cn(`h-4 w-4 shrink-0`,d?`hidden group-hover/folder:block`:`block group-hover/folder:hidden`),"aria-hidden":!0}),(0,l.jsx)(n.FolderOpen,{className:a.cn(`h-4 w-4 shrink-0`,d?`block group-hover/folder:hidden`:`hidden group-hover/folder:block`),"aria-hidden":!0}),(0,l.jsx)(`span`,{className:`truncate`,children:u.label})]}),(0,l.jsx)(`button`,{type:`button`,className:a.cn(`inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md`,`text-inherit transition-colors`,`hover:bg-white/10 hover:text-white`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`,`disabled:cursor-not-allowed disabled:opacity-50`),disabled:g,"aria-label":D(t.I18nKey.CONVERSATION_PANEL$ADD_CONVERSATION_TO_GROUP,{label:u.label}),"data-testid":`add-conversation-to-group-${A}`,onClick:e=>{e.preventDefault(),e.stopPropagation(),T()},children:(0,l.jsx)(i.Plus,{className:`h-3.5 w-3.5 shrink-0`,"aria-hidden":!0,strokeWidth:2})})]}),d?(0,l.jsxs)(`div`,{id:`thread-folder-content-${A}`,className:`mt-0.5 space-y-0.5`,children:[j.map(E),M?(0,l.jsx)(`div`,{className:`pl-2`,children:(0,l.jsx)(`button`,{type:`button`,"data-testid":`thread-folder-view-more-${A}`,onClick:w,className:`cursor-pointer text-xs text-[var(--oh-text-dim)] hover:text-white`,children:D(N?t.I18nKey.CONVERSATION_PANEL$LESS:t.I18nKey.CONVERSATION_PANEL$MORE)})}):null]}):null]})]})}exports.ConversationGroupFolderRow=u;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/folder-open.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/plus.cjs"),a=require("../../../utils/utils.cjs"),o=require("../../../node_modules/framer-motion/dist/es/render/components/motion/proxy.cjs"),s=require("./conversation-panel-list-helpers.cjs");let c=require("react"),l=require("react/jsx-runtime");function u({group:u,expanded:d,previewExpanded:f,isDragging:p,dropIndicatorPosition:m,animateLayout:h,isCreatingConversationFlow:g,activeConversationId:_,discoveryConversationIds:v,onToggleExpanded:y,onDragStart:b,onDragEnd:x,onDragOver:S,onDragLeave:C,onDrop:w,onTogglePreviewExpanded:T,onLaunchFromGroup:E,renderConversationCard:D}){let{t:O}=e.useTranslation(`openhands`),k=(0,c.useRef)(null),A=`thread-folder-${u.id.replace(/[^a-zA-Z0-9_-]/g,`-`)}`,j=u.id.replace(/[^a-zA-Z0-9_-]/g,`-`),{visibleConversations:M,isPreviewTruncated:N,isShowingAll:P}=s.getGroupConversationPreview(u.conversations,{expanded:f,activeConversationId:_,discoveryConversationIds:v??void 0});return(0,l.jsxs)(o.motion.section,{ref:k,layout:h?`position`:!1,transition:{type:`spring`,stiffness:600,damping:45},"aria-labelledby":A,"data-testid":`thread-folder-${j}`,onDragOver:S,onDragLeave:C,onDrop:w,className:`relative rounded-md`,children:[m?(0,l.jsx)(`div`,{"aria-hidden":!0,"data-testid":`thread-folder-drop-indicator-${j}`,className:a.cn(`pointer-events-none absolute inset-x-0 z-10 h-0.5 rounded-full bg-[var(--oh-accent)]`,m===`before`?`-top-0.5`:`-bottom-0.5`)}):null,(0,l.jsxs)(`div`,{className:a.cn(p&&`opacity-0`),children:[(0,l.jsxs)(`div`,{className:a.cn(`flex h-8 w-full min-w-0 items-center gap-0.5 rounded-md pl-2 pr-1 text-sm font-normal`,`text-[var(--oh-muted)] transition-colors hover:bg-[var(--oh-surface-raised)] hover:text-white`),children:[(0,l.jsxs)(`button`,{type:`button`,draggable:!0,id:A,"aria-expanded":d,"aria-controls":`thread-folder-content-${j}`,"data-testid":`thread-folder-drag-${j}`,"aria-label":O(d?t.I18nKey.CONVERSATION_PANEL$COLLAPSE_FOLDER:t.I18nKey.CONVERSATION_PANEL$EXPAND_FOLDER,{label:u.label}),onClick:y,onDragStart:e=>{e.stopPropagation();let{dataTransfer:t}=e;if(t){t.effectAllowed=`move`,t.setData(`text/plain`,u.id);let n=k.current;if(n&&typeof t.setDragImage==`function`){let r=n.getBoundingClientRect(),i=n.cloneNode(!0);i.style.position=`fixed`,i.style.top=`0`,i.style.left=`-9999px`,i.style.width=`${r.width}px`,i.style.margin=`0`,i.style.pointerEvents=`none`,i.style.borderRadius=`0.5rem`,i.style.padding=`0.25rem`,i.style.backgroundColor=`var(--oh-surface-raised)`,i.style.boxShadow=`0 8px 24px rgba(0, 0, 0, 0.35)`,document.body.appendChild(i),t.setDragImage(i,e.clientX-r.left,e.clientY-r.top),window.setTimeout(()=>i.remove(),0)}}b()},onDragEnd:e=>{e.stopPropagation(),x()},className:a.cn(`group/folder flex min-h-8 min-w-0 flex-1 cursor-grab items-center gap-2 rounded-md py-1 text-left text-inherit outline-none active:cursor-grabbing`,`focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`),children:[(0,l.jsx)(r.Folder,{className:a.cn(`h-4 w-4 shrink-0`,d?`hidden group-hover/folder:block`:`block group-hover/folder:hidden`),"aria-hidden":!0}),(0,l.jsx)(n.FolderOpen,{className:a.cn(`h-4 w-4 shrink-0`,d?`block group-hover/folder:hidden`:`hidden group-hover/folder:block`),"aria-hidden":!0}),(0,l.jsx)(`span`,{className:`truncate`,children:u.label})]}),(0,l.jsx)(`button`,{type:`button`,className:a.cn(`inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md`,`text-inherit transition-colors`,`hover:bg-white/10 hover:text-white`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-border)]`,`disabled:cursor-not-allowed disabled:opacity-50`),disabled:g,"aria-label":O(t.I18nKey.CONVERSATION_PANEL$ADD_CONVERSATION_TO_GROUP,{label:u.label}),"data-testid":`add-conversation-to-group-${j}`,onClick:e=>{e.preventDefault(),e.stopPropagation(),E()},children:(0,l.jsx)(i.Plus,{className:`h-3.5 w-3.5 shrink-0`,"aria-hidden":!0,strokeWidth:2})})]}),d?(0,l.jsxs)(`div`,{id:`thread-folder-content-${j}`,className:`mt-0.5 space-y-0.5`,children:[M.map(D),N?(0,l.jsx)(`div`,{className:`pl-2`,children:(0,l.jsx)(`button`,{type:`button`,"data-testid":`thread-folder-view-more-${j}`,onClick:T,className:`cursor-pointer text-xs text-[var(--oh-text-dim)] hover:text-white`,children:O(P?t.I18nKey.CONVERSATION_PANEL$LESS:t.I18nKey.CONVERSATION_PANEL$MORE)})}):null]}):null]})]})}exports.ConversationGroupFolderRow=u;
2
2
  //# sourceMappingURL=conversation-group-folder-row.cjs.map