@openhands/agent-canvas 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (899) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-CYy8qA2z.js} +1 -1
  4. package/build/assets/active-backend-context-BZDG15C0.js +2 -0
  5. package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DGWBBbcp.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DrkGdf4_.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DK56YPTs.js +86 -0
  8. package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-DfcSgkLD.js} +2 -2
  9. package/build/assets/agent-settings-Lrc5-twS.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-BgDHhL7b.js} +1 -1
  11. package/build/assets/api-error-message-BEIE_yD1.js +1 -0
  12. package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-DaZnOlVo.js} +1 -1
  13. package/build/assets/{app-settings-D0OKHB3M.js → app-settings-BG5NAUbC.js} +1 -1
  14. package/build/assets/automation-detail-D4Hs831Z.js +3 -0
  15. package/build/assets/automation-export-n0X6FB0C.js +2 -0
  16. package/build/assets/automation-git-sync-CDrm8WV7.js +1 -0
  17. package/build/assets/automation-setup-route-CZCl4ONs.js +1 -0
  18. package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DFF96AdL.js} +1 -1
  19. package/build/assets/automations-list-Bl-oGOrV.js +1 -0
  20. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-H_ThtDA0.js} +1 -1
  21. package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-CbCemvHt.js} +1 -1
  22. package/build/assets/backend-not-configured-DP8KLNq_.js +1 -0
  23. package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-BBASWqsb.js} +1 -1
  24. package/build/assets/{badge-Dpn3-LTV.js → badge-B-51h-SW.js} +1 -1
  25. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-BbjycA8X.js} +1 -1
  26. package/build/assets/bot-CGPCg03p.js +1 -0
  27. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-Blxv5nww.js} +1 -1
  28. package/build/assets/browser-CuW0nWvh.js +7 -0
  29. package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-D5G0ORwt.js} +1 -1
  30. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-BD2tii1r.js} +1 -1
  31. package/build/assets/check-DSuS-lyr.js +1 -0
  32. package/build/assets/chevron-down-CgGcmtE2.js +1 -0
  33. package/build/assets/circle-check-CG5-NPw7.js +1 -0
  34. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-ASbpB8vN.js} +1 -1
  35. package/build/assets/cloud-funnel-analytics-GlCUG0gk.js +1 -0
  36. package/build/assets/cog-CZiR80uT.js +1 -0
  37. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-DvpEsh2O.js} +1 -1
  38. package/build/assets/{command-menu-BKOLj-TC.js → command-menu-DwUQzjYP.js} +1 -1
  39. package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BptcoiLA.js} +1 -1
  40. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-CiEwxZAA.js} +1 -1
  41. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-CdcamfM1.js} +1 -1
  42. package/build/assets/conversation-DREHj4nT.js +1 -0
  43. package/build/assets/conversation-DotRfiDz.js +90 -0
  44. package/build/assets/conversation-panel-DREHj4nT.js +1 -0
  45. package/build/assets/conversation-state-store-DMLtlHbE.js +1 -0
  46. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  47. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-D-puECpY.js} +1 -1
  48. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-BGxcUbgy.js} +1 -1
  49. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-CZJfWaJf.js} +1 -1
  50. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-tLhpwtxS.js} +1 -1
  51. package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-D8GnI6GZ.js} +2 -2
  52. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-Fk8k60nk.js} +1 -1
  53. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-DeztVYuL.js} +1 -1
  54. package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-Cd6GCYzq.js} +1 -1
  55. package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-C4sgZg-y.js} +1 -1
  56. package/build/assets/external-link-C0UpBgsE.js +1 -0
  57. package/build/assets/{file-text-RecuaId_.js → file-text-C6WYtNdV.js} +1 -1
  58. package/build/assets/files-tab-BW_qzyAm.js +1 -0
  59. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-CGXBLcn1.js} +1 -1
  60. package/build/assets/format-model-name-BNPKVsIq.js +1 -0
  61. package/build/assets/format-relative-time-ZhQD4rsl.js +1 -0
  62. package/build/assets/git-provider-icon-CaQ1yLPi.js +1 -0
  63. package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-CgXR6M_E.js} +1 -1
  64. package/build/assets/git-repo-dropdown-D2Uei3CO.js +1 -0
  65. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_YOp8Fo.js} +1 -1
  66. package/build/assets/home-DNzzJcMP.js +1 -0
  67. package/build/assets/home-aCos-5vc.js +1 -0
  68. package/build/assets/{home-store-Cubdq0uP.js → home-store-DgzViC3f.js} +1 -1
  69. package/build/assets/index-home-DNzzJcMP.js +1 -0
  70. package/build/assets/info-CLoC1LRo.js +1 -0
  71. package/build/assets/install-server-modal-D7zIqNKz.js +1 -0
  72. package/build/assets/kebab-menu-item-content-DERMdnDv.js +1 -0
  73. package/build/assets/{launch-c4GEP8oo.js → launch-5PjKeLak.js} +1 -1
  74. package/build/assets/{list-todo-CheUtB7F.js → list-todo-BF049YaY.js} +1 -1
  75. package/build/assets/llm-not-configured-banner-BK9z5eS0.js +27 -0
  76. package/build/assets/llm-settings-BLAMK2tR.js +1 -0
  77. package/build/assets/llm-settings-BWsbarGM.js +1 -0
  78. package/build/assets/llm-subscription-service-SfnEV9Uc.js +1 -0
  79. package/build/assets/loader-circle-D7IagAyF.js +1 -0
  80. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-DBgXgra0.js} +1 -1
  81. package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-BTqNPhzc.js} +1 -1
  82. package/build/assets/manifest-abebca3c.js +1 -0
  83. package/build/assets/manifest-subpage-layout-Rn-glaxV.js +1 -0
  84. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-BK4HnqYz.js} +1 -1
  85. package/build/assets/markdown-renderer-Cp6DlHQN.js +8 -0
  86. package/build/assets/{mcp-Da7wFU7A.js → mcp-BC-Ixn4T.js} +2 -2
  87. package/build/assets/mcp-marketplace-utils-BJWJgbB6.js +1 -0
  88. package/build/assets/messages-CzFKrzPG.js +40 -0
  89. package/build/assets/{modal-body-duRaxj_K.js → modal-body-BdKfD3Hl.js} +1 -1
  90. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D5_b5vMi.js} +1 -1
  91. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-objukxk_.js} +1 -1
  92. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-C_gXyLyD.js} +1 -1
  93. package/build/assets/{npm-Cswluf6-.js → npm-CHVHV1MC.js} +1 -1
  94. package/build/assets/{onboarding-BKbTYlW1.js → onboarding-Diw0V51A.js} +1 -1
  95. package/build/assets/onboarding-modal-Da4yHzsA.js +1 -0
  96. package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-BztSy69u.js} +1 -1
  97. package/build/assets/parse-git-remote-url-BkXN9jzl.js +1 -0
  98. package/build/assets/pencil-49avMHlD.js +1 -0
  99. package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-CJiSpNax.js} +1 -1
  100. package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-lHdNKWNU.js} +1 -1
  101. package/build/assets/plus-C0BagBpV.js +1 -0
  102. package/build/assets/profiles-service.api-BLr7FXec.js +1 -0
  103. package/build/assets/providers-CWXnb7S3.js +1 -0
  104. package/build/assets/{proxy-b4aqL4SX.js → proxy-DYDXxtje.js} +1 -1
  105. package/build/assets/{puzzle-B3v361yY.js → puzzle-Bt2B1rzf.js} +1 -1
  106. package/build/assets/recommended-automations-launcher-CcFMfJRR.js +1 -0
  107. package/build/assets/refresh-cw-nmcesifB.js +1 -0
  108. package/build/assets/root-CT4t7apy.css +1 -0
  109. package/build/assets/root-DnRgLKpU.js +2 -0
  110. package/build/assets/root-layout-2L9tr-BN.js +2 -0
  111. package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-C59lVZTA.js} +1 -1
  112. package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-BbBEQQjq.js} +1 -1
  113. package/build/assets/search-CYSDBczG.js +1 -0
  114. package/build/assets/secrets-service-BtsgYSlj.js +1 -0
  115. package/build/assets/secrets-settings-DJ0OKa4_.js +1 -0
  116. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DiVfTZuN.js} +1 -1
  117. package/build/assets/{settings-CZPGNens.js → settings-CDqL_Uqh.js} +1 -1
  118. package/build/assets/{settings-CWFxymAf.js → settings-DcNPxz0v.js} +1 -1
  119. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-Ba1UN5Du.js} +1 -1
  120. package/build/assets/{settings-index-Dtlegd6s.js → settings-index-Cz2cKt2K.js} +1 -1
  121. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-CWUEHHvS.js} +1 -1
  122. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-DdcLXDGn.js} +1 -1
  123. package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-nEEK1Kh1.js} +1 -1
  124. package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api-3yAUFcaP.js} +1 -1
  125. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-Dk9hChx1.js} +1 -1
  126. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-CxjtCSB3.js} +1 -1
  127. package/build/assets/shared-conversation-DbAcrx3s.js +1 -0
  128. package/build/assets/shield-check-CiOTXxV2.js +1 -0
  129. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-lrfPooIB.js} +1 -1
  130. package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-KERXfNu1.js} +1 -1
  131. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-B8lFD6Cb.js} +1 -1
  132. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-u6pUpxJ7.js} +1 -1
  133. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-dGIUzr_b.js} +1 -1
  134. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-kkOWZ89w.js} +1 -1
  135. package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-DWN1PBPH.js} +1 -1
  136. package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-DFjH2Nq6.js} +1 -1
  137. package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-DIHpl3ol.js} +2 -2
  138. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-ntyMLnbj.js} +1 -1
  139. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-B6JXcsmL.js} +1 -1
  140. package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-aEJzEcHD.js} +1 -1
  141. package/build/assets/{terminal-DRrJo-cR.js → terminal-Dch7Ty5K.js} +1 -1
  142. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-B2MLKsgt.js} +1 -1
  143. package/build/assets/trash-2-yZnDM4Ji.js +1 -0
  144. package/build/assets/{typography-D9tiHct7.js → typography-DB5HoCk0.js} +1 -1
  145. package/build/assets/usage-tab-DrEtBmBT.js +1 -0
  146. package/build/assets/use-acp-credential-form-c8KXAa8A.js +1 -0
  147. package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-B0p34N3q.js} +1 -1
  148. package/build/assets/use-agent-profiles-CPIc6wLH.js +1 -0
  149. package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dz_8Eqkv.js} +1 -1
  150. package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-DvUVqCle.js} +1 -1
  151. package/build/assets/use-config-C3PO4TBw.js +1 -0
  152. package/build/assets/use-create-conversation-DVrA_uLD.js +1 -0
  153. package/build/assets/use-create-secret-DbBIpaCR.js +1 -0
  154. package/build/assets/use-get-secrets-6PBitf54.js +1 -0
  155. package/build/assets/use-has-permission-CQ31Cl8j.js +1 -0
  156. package/build/assets/use-is-authed-2UrDIziV.js +1 -0
  157. package/build/assets/use-is-creating-conversation-BvYpmb3v.js +1 -0
  158. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  159. package/build/assets/use-llm-profiles-diZS4FiN.js +1 -0
  160. package/build/assets/use-manifest-capabilities-HIWCtIUm.js +1 -0
  161. package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-Bs8PcXik.js} +1 -1
  162. package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-BCuNLFsr.js} +1 -1
  163. package/build/assets/use-save-agent-profile-BaMNSpBV.js +1 -0
  164. package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-BahvC2Gw.js} +1 -1
  165. package/build/assets/{use-settings-BmLzQjnC.js → use-settings-C6ZxpBDX.js} +1 -1
  166. package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-Bqn69Ggw.js} +2 -2
  167. package/build/assets/use-tracking-Bhu7gk2y.js +3 -0
  168. package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-BkNXpXrd.js} +1 -1
  169. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-c_OmS3lK.js} +1 -1
  170. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-6ZsQCqAn.js} +1 -1
  171. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-xDrGlTO_.js} +1 -1
  172. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-Bs5NFz2s.js} +1 -1
  173. package/build/assets/utils-DUD5ScdA.js +1 -0
  174. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  175. package/build/assets/{vendor~entry.client-CgNUwtQL.js → vendor~entry.client-BFE7Llz9.js} +1 -1
  176. package/build/assets/{vendor~entry.client-zSIea5EO.js → vendor~entry.client-BaKt_PIp.js} +1 -1
  177. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-D87mAf6K.js} +3 -3
  178. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-B6POTS66.js} +1 -1
  179. package/build/assets/vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js +13 -0
  180. package/build/assets/vendor~root-layout-DeQACFVA.js +1 -0
  181. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-bv7ooVgH.js} +1 -1
  182. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-e8pX05xf.js} +1 -1
  183. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-BvS6PCK2.js} +1 -1
  184. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-DOPLJMH9.js} +2 -2
  185. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz8NQve5.js} +1 -1
  186. package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-COueVXmM.js} +1 -1
  187. package/build/assets/{wrench-B1_H-tL1.js → wrench-C95ujnYo.js} +1 -1
  188. package/build/assets/x-86ZCfxKY.js +1 -0
  189. package/build/assets/zap-DRa-r-Tf.js +1 -0
  190. package/build/index.html +4 -4
  191. package/build/locales/ar/openhands.json +88 -3
  192. package/build/locales/ca/openhands.json +88 -3
  193. package/build/locales/de/openhands.json +88 -3
  194. package/build/locales/en/openhands.json +88 -3
  195. package/build/locales/es/openhands.json +88 -3
  196. package/build/locales/fr/openhands.json +88 -3
  197. package/build/locales/it/openhands.json +88 -3
  198. package/build/locales/ja/openhands.json +88 -3
  199. package/build/locales/ko-KR/openhands.json +88 -3
  200. package/build/locales/no/openhands.json +88 -3
  201. package/build/locales/pt/openhands.json +88 -3
  202. package/build/locales/tr/openhands.json +88 -3
  203. package/build/locales/uk/openhands.json +88 -3
  204. package/build/locales/zh-CN/openhands.json +88 -3
  205. package/build/locales/zh-TW/openhands.json +88 -3
  206. package/config/defaults.json +3 -3
  207. package/dist/api/agent-server-compatibility.cjs +1 -1
  208. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  209. package/dist/api/agent-server-compatibility.js +1 -1
  210. package/dist/api/agent-server-compatibility.js.map +1 -1
  211. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  212. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  213. package/dist/api/automation-service/automation-service.api.d.ts +10 -0
  214. package/dist/api/automation-service/automation-service.api.js +42 -0
  215. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  216. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  217. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  218. package/dist/api/cloud/conversation-service.api.d.ts +9 -0
  219. package/dist/api/cloud/conversation-service.api.js +11 -1
  220. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  221. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  222. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  223. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  224. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  225. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  226. package/dist/api/llm-balance-service.cjs +2 -0
  227. package/dist/api/llm-balance-service.cjs.map +1 -0
  228. package/dist/api/llm-balance-service.d.ts +33 -0
  229. package/dist/api/llm-balance-service.js +53 -0
  230. package/dist/api/llm-balance-service.js.map +1 -0
  231. package/dist/api/llm-subscription-service.cjs +1 -1
  232. package/dist/api/llm-subscription-service.cjs.map +1 -1
  233. package/dist/api/llm-subscription-service.js +42 -34
  234. package/dist/api/llm-subscription-service.js.map +1 -1
  235. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  236. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  237. package/dist/api/profiles-service/profiles-service.api.d.ts +15 -2
  238. package/dist/api/profiles-service/profiles-service.api.js +25 -2
  239. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  240. package/dist/api/secrets-service.cjs +1 -1
  241. package/dist/api/secrets-service.cjs.map +1 -1
  242. package/dist/api/secrets-service.d.ts +5 -0
  243. package/dist/api/secrets-service.js +12 -6
  244. package/dist/api/secrets-service.js.map +1 -1
  245. package/dist/components/conversation/index.cjs +1 -1
  246. package/dist/components/conversation/index.d.ts +0 -1
  247. package/dist/components/conversation/index.js +0 -1
  248. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  249. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  250. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  251. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  252. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  253. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  254. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  255. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  256. package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
  257. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  258. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  259. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  260. package/dist/components/conversation-events/chat/group-events.js +27 -26
  261. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  262. package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
  263. package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
  264. package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
  265. package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
  266. package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
  267. package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
  268. package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
  269. package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
  270. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  271. package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
  272. package/dist/components/features/chat/chat-interface.cjs +2 -2
  273. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  274. package/dist/components/features/chat/chat-interface.js +177 -176
  275. package/dist/components/features/chat/chat-interface.js.map +1 -1
  276. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  277. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  278. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  279. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  280. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  281. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  282. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  283. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  284. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  285. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  286. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  287. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  288. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  289. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  290. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  291. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  292. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  293. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  294. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  295. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  296. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  297. package/dist/components/features/chat/custom-chat-input.js +68 -67
  298. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  299. package/dist/components/features/chat/error-message-banner.cjs +1 -1
  300. package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
  301. package/dist/components/features/chat/error-message-banner.d.ts +3 -1
  302. package/dist/components/features/chat/error-message-banner.js +64 -58
  303. package/dist/components/features/chat/error-message-banner.js.map +1 -1
  304. package/dist/components/features/chat/path-component.cjs +1 -1
  305. package/dist/components/features/chat/path-component.cjs.map +1 -1
  306. package/dist/components/features/chat/path-component.js +9 -6
  307. package/dist/components/features/chat/path-component.js.map +1 -1
  308. package/dist/components/features/chat/plan-preview.cjs +1 -1
  309. package/dist/components/features/chat/plan-preview.js +4 -4
  310. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  311. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  312. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  313. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  314. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  315. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  316. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  317. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  318. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  319. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  320. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  321. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  322. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  323. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  324. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  325. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  326. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  327. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  328. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  329. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  330. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  331. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  332. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  333. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  334. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  335. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  336. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  337. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  338. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  339. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  340. package/dist/components/features/conversation/conversation-name.js +69 -71
  341. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  342. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  343. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  344. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  345. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  346. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  347. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  348. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  349. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  350. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  351. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  352. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  353. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  354. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  355. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  356. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  357. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  358. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  359. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  360. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  361. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  362. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  363. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  364. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  365. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  366. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  367. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  368. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  369. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  370. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  371. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  372. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  373. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  374. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  375. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  376. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  377. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  378. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  379. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  380. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  381. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  382. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  383. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  384. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  385. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  386. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  387. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  388. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  389. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  390. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  391. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  392. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  393. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  394. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  395. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  396. package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
  397. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  398. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  399. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  400. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  401. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  402. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  403. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  404. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  405. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  406. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  407. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  408. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  409. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  410. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  411. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  412. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  413. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  414. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  415. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +25 -17
  416. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  417. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  425. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  426. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  427. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  428. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  429. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  430. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  431. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  432. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  433. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  434. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  435. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  436. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  437. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  438. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  439. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  440. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  441. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  442. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  443. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/conversation-panel.js +240 -175
  445. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  446. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  447. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  448. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  449. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  450. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  451. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  452. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  453. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  454. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
  455. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  456. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  457. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  458. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  459. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  460. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  461. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  462. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  463. package/dist/config/defaults.cjs +1 -1
  464. package/dist/config/defaults.cjs.map +1 -1
  465. package/dist/config/defaults.js +3 -3
  466. package/dist/config/defaults.js.map +1 -1
  467. package/dist/constants/llm-balance.cjs +2 -0
  468. package/dist/constants/llm-balance.cjs.map +1 -0
  469. package/dist/constants/llm-balance.d.ts +13 -0
  470. package/dist/constants/llm-balance.js +6 -0
  471. package/dist/constants/llm-balance.js.map +1 -0
  472. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  473. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  474. package/dist/contexts/conversation-websocket-context.js +227 -219
  475. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  476. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  477. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  478. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  479. package/dist/hooks/chat/use-grip-resize.js +39 -30
  480. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  481. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  482. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  483. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  484. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  485. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  486. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  487. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  488. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  489. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  490. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  491. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  492. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  493. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  494. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  495. package/dist/hooks/query/use-commit-changes.js +4 -4
  496. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  497. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  498. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  499. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  500. package/dist/hooks/query/use-git-sync.d.ts +19 -0
  501. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  502. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  503. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  504. package/dist/hooks/query/use-llm-balance.js +24 -0
  505. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  506. package/dist/hooks/query/use-search-providers.cjs +1 -1
  507. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  508. package/dist/hooks/query/use-search-providers.js +1 -1
  509. package/dist/hooks/query/use-search-providers.js.map +1 -1
  510. package/dist/hooks/query/use-task-polling.cjs +1 -1
  511. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  512. package/dist/hooks/query/use-task-polling.js +12 -10
  513. package/dist/hooks/query/use-task-polling.js.map +1 -1
  514. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  515. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  516. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  517. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  518. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  519. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  520. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  521. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  522. package/dist/hooks/query/use-workspace-files.d.ts +14 -4
  523. package/dist/hooks/query/use-workspace-files.js +45 -32
  524. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  525. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  526. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  527. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  528. package/dist/hooks/use-await-context-compaction.js +61 -0
  529. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  530. package/dist/hooks/use-compact-context-action.cjs +2 -0
  531. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  532. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  533. package/dist/hooks/use-compact-context-action.js +61 -0
  534. package/dist/hooks/use-compact-context-action.js.map +1 -0
  535. package/dist/hooks/use-context-window-usage.cjs +2 -0
  536. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  537. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  538. package/dist/hooks/use-context-window-usage.js +20 -0
  539. package/dist/hooks/use-context-window-usage.js.map +1 -0
  540. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  541. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  542. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  543. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  544. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  545. package/dist/hooks/use-drag-resize.cjs +1 -1
  546. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  547. package/dist/hooks/use-drag-resize.d.ts +8 -0
  548. package/dist/hooks/use-drag-resize.js +21 -18
  549. package/dist/hooks/use-drag-resize.js.map +1 -1
  550. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  551. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  552. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  553. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  554. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  555. package/dist/hooks/use-responder-url-secret.d.ts +5 -0
  556. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  557. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  558. package/dist/hooks/use-select-conversation-tab.js +2 -2
  559. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  560. package/dist/hooks/use-tracking.cjs +1 -1
  561. package/dist/hooks/use-tracking.cjs.map +1 -1
  562. package/dist/hooks/use-tracking.d.ts +6 -0
  563. package/dist/hooks/use-tracking.js +6 -0
  564. package/dist/hooks/use-tracking.js.map +1 -1
  565. package/dist/i18n/declaration.cjs +1 -1
  566. package/dist/i18n/declaration.cjs.map +1 -1
  567. package/dist/i18n/declaration.d.ts +86 -1
  568. package/dist/i18n/declaration.js +1 -1
  569. package/dist/i18n/declaration.js.map +1 -1
  570. package/dist/i18n/translation.cjs +2 -2
  571. package/dist/i18n/translation.cjs.map +1 -1
  572. package/dist/i18n/translation.js +1475 -30
  573. package/dist/i18n/translation.js.map +1 -1
  574. package/dist/index.cjs +1 -1
  575. package/dist/index.js +28 -29
  576. package/dist/lib/index.cjs +1 -1
  577. package/dist/lib/index.js +0 -1
  578. package/dist/locales/ar/openhands.json +88 -3
  579. package/dist/locales/ca/openhands.json +88 -3
  580. package/dist/locales/de/openhands.json +88 -3
  581. package/dist/locales/en/openhands.json +88 -3
  582. package/dist/locales/es/openhands.json +88 -3
  583. package/dist/locales/fr/openhands.json +88 -3
  584. package/dist/locales/it/openhands.json +88 -3
  585. package/dist/locales/ja/openhands.json +88 -3
  586. package/dist/locales/ko-KR/openhands.json +88 -3
  587. package/dist/locales/no/openhands.json +88 -3
  588. package/dist/locales/pt/openhands.json +88 -3
  589. package/dist/locales/tr/openhands.json +88 -3
  590. package/dist/locales/uk/openhands.json +88 -3
  591. package/dist/locales/zh-CN/openhands.json +88 -3
  592. package/dist/locales/zh-TW/openhands.json +88 -3
  593. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  594. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  595. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  596. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  597. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  598. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  599. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  600. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  601. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  602. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  603. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  604. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  605. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  606. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  607. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  608. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  609. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  610. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  611. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  612. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  613. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  614. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  615. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  616. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  617. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  618. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  619. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  620. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  621. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  622. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  623. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  624. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  625. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  626. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  627. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  628. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  629. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  630. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  631. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  632. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  633. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  634. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  635. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  636. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  637. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  638. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  639. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  640. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  641. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  642. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  643. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  644. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  645. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  646. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  647. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
  648. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
  649. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
  650. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  651. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  652. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  653. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  654. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  655. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  656. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  657. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  658. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  659. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  660. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  661. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  662. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  663. package/dist/package.cjs +1 -1
  664. package/dist/package.cjs.map +1 -1
  665. package/dist/package.js +17 -16
  666. package/dist/package.js.map +1 -1
  667. package/dist/routes/files-tab.cjs +1 -1
  668. package/dist/routes/files-tab.js +11 -11
  669. package/dist/routes/files-tab.js.map +1 -1
  670. package/dist/routes/usage-tab.cjs +2 -0
  671. package/dist/routes/usage-tab.cjs.map +1 -0
  672. package/dist/routes/usage-tab.d.ts +2 -0
  673. package/dist/routes/usage-tab.js +10 -0
  674. package/dist/routes/usage-tab.js.map +1 -0
  675. package/dist/services/child-conversation-launch.cjs +1 -1
  676. package/dist/services/child-conversation-launch.cjs.map +1 -1
  677. package/dist/services/child-conversation-launch.js +11 -5
  678. package/dist/services/child-conversation-launch.js.map +1 -1
  679. package/dist/services/settings.cjs +1 -1
  680. package/dist/services/settings.cjs.map +1 -1
  681. package/dist/services/settings.js +2 -2
  682. package/dist/services/settings.js.map +1 -1
  683. package/dist/services/telemetry.cjs +1 -1
  684. package/dist/services/telemetry.cjs.map +1 -1
  685. package/dist/services/telemetry.js +47 -51
  686. package/dist/services/telemetry.js.map +1 -1
  687. package/dist/stores/archived-conversations-store.cjs +2 -0
  688. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  689. package/dist/stores/archived-conversations-store.d.ts +24 -0
  690. package/dist/stores/archived-conversations-store.js +33 -0
  691. package/dist/stores/archived-conversations-store.js.map +1 -0
  692. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  693. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  694. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  695. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  696. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  697. package/dist/stores/conversation-store.cjs.map +1 -1
  698. package/dist/stores/conversation-store.d.ts +1 -1
  699. package/dist/stores/conversation-store.js.map +1 -1
  700. package/dist/stores/error-message-store.cjs +1 -1
  701. package/dist/stores/error-message-store.cjs.map +1 -1
  702. package/dist/stores/error-message-store.d.ts +3 -1
  703. package/dist/stores/error-message-store.js +5 -3
  704. package/dist/stores/error-message-store.js.map +1 -1
  705. package/dist/stores/metrics-store.cjs +1 -1
  706. package/dist/stores/metrics-store.cjs.map +1 -1
  707. package/dist/stores/metrics-store.d.ts +1 -0
  708. package/dist/stores/metrics-store.js +7 -4
  709. package/dist/stores/metrics-store.js.map +1 -1
  710. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  711. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  712. package/dist/types/agent-server/type-guards.cjs +1 -1
  713. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  714. package/dist/types/agent-server/type-guards.d.ts +5 -0
  715. package/dist/types/agent-server/type-guards.js +3 -3
  716. package/dist/types/agent-server/type-guards.js.map +1 -1
  717. package/dist/types/git-sync.d.ts +51 -0
  718. package/dist/utils/conversation-local-storage.cjs +1 -1
  719. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  720. package/dist/utils/conversation-local-storage.js +2 -1
  721. package/dist/utils/conversation-local-storage.js.map +1 -1
  722. package/dist/utils/error-handler.cjs +1 -1
  723. package/dist/utils/error-handler.cjs.map +1 -1
  724. package/dist/utils/error-handler.d.ts +3 -2
  725. package/dist/utils/error-handler.js +18 -5
  726. package/dist/utils/error-handler.js.map +1 -1
  727. package/dist/utils/format-model-name.cjs +1 -1
  728. package/dist/utils/format-model-name.cjs.map +1 -1
  729. package/dist/utils/format-model-name.d.ts +1 -0
  730. package/dist/utils/format-model-name.js +1 -0
  731. package/dist/utils/format-model-name.js.map +1 -1
  732. package/dist/utils/format-token-count.cjs +2 -0
  733. package/dist/utils/format-token-count.cjs.map +1 -0
  734. package/dist/utils/format-token-count.d.ts +3 -0
  735. package/dist/utils/format-token-count.js +19 -0
  736. package/dist/utils/format-token-count.js.map +1 -0
  737. package/dist/utils/hover-reveal-classes.cjs +2 -0
  738. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  739. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  740. package/dist/utils/hover-reveal-classes.js +41 -0
  741. package/dist/utils/hover-reveal-classes.js.map +1 -0
  742. package/dist/utils/is-markdown-file-path.cjs +2 -0
  743. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  744. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  745. package/dist/utils/is-markdown-file-path.js +14 -0
  746. package/dist/utils/is-markdown-file-path.js.map +1 -0
  747. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  748. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  749. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  750. package/dist/utils/mcp-marketplace-utils.js +19 -16
  751. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  752. package/dist/utils/transcript-export/index.cjs +3 -3
  753. package/dist/utils/transcript-export/index.cjs.map +1 -1
  754. package/dist/utils/transcript-export/index.js +12 -12
  755. package/dist/utils/transcript-export/index.js.map +1 -1
  756. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  757. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  758. package/dist/utils/transcript-export/load-complete-events.js +25 -17
  759. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  760. package/dist/utils/workspace-relative-path.cjs +2 -0
  761. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  762. package/dist/utils/workspace-relative-path.d.ts +10 -0
  763. package/dist/utils/workspace-relative-path.js +22 -0
  764. package/dist/utils/workspace-relative-path.js.map +1 -0
  765. package/package.json +17 -16
  766. package/scripts/check-sdk-version-sync.mjs +6 -6
  767. package/scripts/check-translation-completeness.cjs +3 -0
  768. package/scripts/dev-process-utils.mjs +6 -1
  769. package/scripts/dev-safe.mjs +57 -2
  770. package/scripts/dev-with-automation.mjs +98 -9
  771. package/build/assets/active-backend-context-B_bg5h9O.js +0 -2
  772. package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
  773. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
  774. package/build/assets/agent-settings-D_SVrWhI.js +0 -1
  775. package/build/assets/automation-detail-C0SxWTnQ.js +0 -3
  776. package/build/assets/automation-export-BjQa_fT6.js +0 -2
  777. package/build/assets/automation-setup-route-BzCNpljP.js +0 -1
  778. package/build/assets/automations-list-dZg8zOCl.js +0 -1
  779. package/build/assets/bot-DuN83i3p.js +0 -1
  780. package/build/assets/browser--eoQOo4M.js +0 -6
  781. package/build/assets/check-DLOKoFU9.js +0 -1
  782. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  783. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  784. package/build/assets/cloud-funnel-analytics-CcSez21r.js +0 -1
  785. package/build/assets/conversation-Cmyw9bFh.js +0 -90
  786. package/build/assets/conversation-CvoGZ5vC.js +0 -1
  787. package/build/assets/conversation-panel-CvoGZ5vC.js +0 -1
  788. package/build/assets/conversation-state-store-CtgILxWF.js +0 -1
  789. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  790. package/build/assets/external-link-zWbg5KXS.js +0 -1
  791. package/build/assets/files-tab-D5zuU5TY.js +0 -1
  792. package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
  793. package/build/assets/format-relative-time-BerVamGl.js +0 -1
  794. package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
  795. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
  796. package/build/assets/home-DqyeeFA_.js +0 -1
  797. package/build/assets/home-Y0aDou-a.js +0 -1
  798. package/build/assets/index-home-DqyeeFA_.js +0 -1
  799. package/build/assets/info-C9lpK5pw.js +0 -1
  800. package/build/assets/install-server-modal-DW6dSyGr.js +0 -1
  801. package/build/assets/kebab-menu-item-content-CKydZrbH.js +0 -1
  802. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
  803. package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
  804. package/build/assets/llm-settings-D9ko42Pi.js +0 -1
  805. package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
  806. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  807. package/build/assets/manifest-e1c3bc3b.js +0 -1
  808. package/build/assets/manifest-subpage-layout-Ds7G5GZ8.js +0 -1
  809. package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
  810. package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
  811. package/build/assets/messages-B2l0qLVk.js +0 -40
  812. package/build/assets/onboarding-modal-DrrGlEQq.js +0 -1
  813. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  814. package/build/assets/plus-CtzlyAoF.js +0 -1
  815. package/build/assets/profiles-service.api-vcE_jJCe.js +0 -1
  816. package/build/assets/providers-CdrPPm0z.js +0 -1
  817. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +0 -1
  818. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  819. package/build/assets/root-CBBi6IAe.js +0 -2
  820. package/build/assets/root-CRK9fOFd.css +0 -1
  821. package/build/assets/root-layout-BFN2rCOy.js +0 -2
  822. package/build/assets/search-CYaiKHRp.js +0 -1
  823. package/build/assets/secrets-service-BHF4fxML.js +0 -1
  824. package/build/assets/secrets-settings-aBGXtQhX.js +0 -1
  825. package/build/assets/shared-conversation-BIAcuORk.js +0 -1
  826. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  827. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  828. package/build/assets/use-acp-credential-form-DGyo0QvL.js +0 -1
  829. package/build/assets/use-agent-profiles-B37XWDLq.js +0 -1
  830. package/build/assets/use-config-DapX3pjC.js +0 -1
  831. package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
  832. package/build/assets/use-create-secret-DcpT3RPw.js +0 -1
  833. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  834. package/build/assets/use-is-creating-conversation-CVefC9Ns.js +0 -1
  835. package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
  836. package/build/assets/use-manifest-capabilities-zihHDbMW.js +0 -1
  837. package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
  838. package/build/assets/use-tracking-salbPJxT.js +0 -3
  839. package/build/assets/utils-DPQfkd-7.js +0 -1
  840. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  841. package/build/assets/x-RYDBg-e2.js +0 -1
  842. package/build/assets/zap-tbKDzCe3.js +0 -1
  843. package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
  844. package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
  845. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
  846. package/dist/components/conversation-events/index.d.ts +0 -1
  847. package/dist/components/features/automations/metadata-chip.d.ts +0 -6
  848. package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
  849. package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
  850. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
  851. package/dist/components/features/controls/tools.d.ts +0 -2
  852. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  853. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  854. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  855. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  856. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  857. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  858. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  859. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  860. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  861. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  862. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  863. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  864. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  865. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  866. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  867. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  868. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  869. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  870. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  871. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  872. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
  873. package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
  874. package/dist/components/features/home/home-header/home-header.d.ts +0 -1
  875. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
  876. package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
  877. package/dist/components/features/home/new-conversation.d.ts +0 -1
  878. package/dist/components/features/home/tasks/task-card.d.ts +0 -6
  879. package/dist/components/features/home/tasks/task-group.d.ts +0 -7
  880. package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
  881. package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
  882. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
  883. package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
  884. package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
  885. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
  886. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
  887. package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
  888. package/dist/hooks/use-should-show-user-features.d.ts +0 -1
  889. package/dist/icons/u-credit-card.cjs +0 -2
  890. package/dist/icons/u-credit-card.cjs.map +0 -1
  891. package/dist/icons/u-credit-card.js +0 -21
  892. package/dist/icons/u-credit-card.js.map +0 -1
  893. package/dist/ui/card-title.d.ts +0 -16
  894. package/dist/ui/card.d.ts +0 -14
  895. package/dist/utils/group-suggested-tasks.d.ts +0 -7
  896. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dcc51rps-rfV8mQ9m.js} +0 -0
  897. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
  898. /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BOVIFA_g.js} +0 -0
  899. /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C0JXQb_q.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-card.cjs","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.cjs","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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"}
@@ -5,6 +5,13 @@ import { RepositorySelection } from "#/api/open-hands.types";
5
5
  interface ConversationCardProps {
6
6
  onClick?: () => void;
7
7
  onDelete?: () => void;
8
+ onArchive?: () => void;
9
+ /**
10
+ * Restores an archived conversation. The panel passes this instead of
11
+ * `onArchive` for rows that are already archived, so the menu offers exactly
12
+ * one of the two directions.
13
+ */
14
+ onUnarchive?: () => void;
8
15
  onStop?: () => void;
9
16
  onChangeTitle?: (title: string) => void;
10
17
  showOptions?: boolean;
@@ -27,10 +34,11 @@ interface ConversationCardProps {
27
34
  tags?: Record<string, string> | null;
28
35
  /** Gates the tag-chip row; wired to the panel's "Tags" metadata toggle. */
29
36
  showTags?: boolean;
37
+ isArchived?: boolean;
30
38
  isPinned?: boolean;
31
39
  onTogglePin?: () => void;
32
40
  /** When true and pinned, keep the pin icon visible without hovering. */
33
41
  alwaysShowPinIcon?: boolean;
34
42
  }
35
- export declare function ConversationCard({ onClick, onDelete, onStop, onChangeTitle, showOptions, title, selectedRepository, lastUpdatedAt, createdAt, conversationId, executionStatus, sandboxStatus, contextMenuOpen, onContextMenuToggle, isActive, workspaceWorkingDir, showRepositoryMetadata, llmModel, showLlmProfiles, agentKind, acpServer, tags, showTags, isPinned, onTogglePin, alwaysShowPinIcon, }: ConversationCardProps): React.JSX.Element;
43
+ export declare function ConversationCard({ onClick, onDelete, onArchive, onUnarchive, onStop, onChangeTitle, showOptions, title, selectedRepository, lastUpdatedAt, createdAt, conversationId, executionStatus, sandboxStatus, contextMenuOpen, onContextMenuToggle, isActive, workspaceWorkingDir, showRepositoryMetadata, llmModel, showLlmProfiles, agentKind, acpServer, tags, showTags, isArchived, isPinned, onTogglePin, alwaysShowPinIcon, }: ConversationCardProps): React.JSX.Element;
36
44
  export {};
@@ -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
  }