@openhands/agent-canvas 1.16.0 → 1.17.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 (956) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DrjNsPOH.js} +1 -1
  4. package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
  5. package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-CJUrcBut.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
  7. package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
  8. package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
  10. package/build/assets/agent-settings-BJyovpJ_.js +1 -0
  11. package/build/assets/agent-settings-CpY3zObk.js +2 -0
  12. package/build/assets/{alert-banner-HP6mX-Vr.js → alert-banner-vARz1idS.js} +1 -1
  13. package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-Ve79qDcN.js} +1 -1
  14. package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
  15. package/build/assets/{app-settings-dbnneVaV.js → app-settings-BaJ7nfHt.js} +1 -1
  16. package/build/assets/automation-detail-CVoGDrKq.js +3 -0
  17. package/build/assets/{automation-export-D3a3of4G.js → automation-export-DxY47m3T.js} +1 -1
  18. package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
  19. package/build/assets/automation-setup-route-072beLz1.js +3 -0
  20. package/build/assets/{automation-templates-BRppNh99.js → automation-templates-4C4PM8K7.js} +1 -1
  21. package/build/assets/automations-list-xuqTSQL4.js +1 -0
  22. package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B8tH0BEp.js} +1 -1
  23. package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
  24. package/build/assets/{backend-synced-settings-badge-DPkz30BE.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
  25. package/build/assets/{badge-BU3S0VtE.js → badge-CcGx2TaV.js} +1 -1
  26. package/build/assets/{base-modal-D_L0oEbG.js → base-modal-DTULovNc.js} +1 -1
  27. package/build/assets/bot-CLMxGFaq.js +1 -0
  28. package/build/assets/{brand-button-BAfk4wGP.js → brand-button-DxPO4Lf8.js} +1 -1
  29. package/build/assets/{browser-DSAo0tz1.js → browser-C-_qBasq.js} +2 -2
  30. package/build/assets/{browser-tab-C9vy56R5.js → browser-tab-DZanIw5m.js} +1 -1
  31. package/build/assets/{canvas-extension-page-dx1gFrfW.js → canvas-extension-page-o_cWgE9B.js} +1 -1
  32. package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
  33. package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-DdnkgJXV.js} +1 -1
  34. package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-B3SFSIg5.js} +1 -1
  35. package/build/assets/check-fDEfgSzj.js +1 -0
  36. package/build/assets/chevron-down-CFrWHqu8.js +1 -0
  37. package/build/assets/chevron-right-C5roOrJu.js +1 -0
  38. package/build/assets/circle-check-ClTzJTdb.js +1 -0
  39. package/build/assets/{circle-plus-check-toggle-BO_kFZt3.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
  40. package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
  41. package/build/assets/{cog-D-MPQW6G.js → cog-VBlRo6iw.js} +1 -1
  42. package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
  43. package/build/assets/commits-tab-2jhtaohl.js +1 -0
  44. package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-eVKFMvap.js} +1 -1
  45. package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
  46. package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-DDROe12Z.js} +1 -1
  47. package/build/assets/conversation-BnjJSFf5.js +93 -0
  48. package/build/assets/conversation-DZ578rOX.js +1 -0
  49. package/build/assets/conversation-panel-DZ578rOX.js +1 -0
  50. package/build/assets/{conversation-state-store-B0ImPLHO.js → conversation-state-store-D1_G_9I-.js} +1 -1
  51. package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
  52. package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
  53. package/build/assets/{copy-to-clipboard-button-Ca8iSkkA.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
  54. package/build/assets/{device-verify-Bhn2e_Ye.js → device-verify-BfkCzyFB.js} +1 -1
  55. package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-B9kJVDIk.js} +1 -1
  56. package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
  57. package/build/assets/empty-state-RZz0OfnY.js +1 -0
  58. package/build/assets/{entry.client-CqyPPjOq.js → entry.client-Ds8LVp-E.js} +2 -2
  59. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
  60. package/build/assets/{environment-switch-overlay-BmBRT7gv.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
  61. package/build/assets/{error-state-Body8Ngd.js → error-state-B_5cgNPJ.js} +1 -1
  62. package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
  63. package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
  64. package/build/assets/external-link-DQtv7eTh.js +1 -0
  65. package/build/assets/files-tab-CCgAcVdc.js +1 -0
  66. package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-B-z85REi.js} +1 -1
  67. package/build/assets/get-git-path-EHrSDxTM.js +1 -0
  68. package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
  69. package/build/assets/{git-repo-dropdown-4ROKl2cB.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
  70. package/build/assets/{highlighted-source-view-BFRxGT_Q.js → highlighted-source-view-DjHO3SdW.js} +1 -1
  71. package/build/assets/home-BorS_vdS.js +1 -0
  72. package/build/assets/home-aIMbHw5M.js +1 -0
  73. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
  74. package/build/assets/home-store-DyXz0w6d.js +1 -0
  75. package/build/assets/hooks-service-C6dpRtZM.js +1 -0
  76. package/build/assets/index-home-zKFuKK2B.js +1 -0
  77. package/build/assets/info-CTIdjttz.js +1 -0
  78. package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
  79. package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
  80. package/build/assets/{key-BmVyxs-2.js → key-CfXbJa8w.js} +1 -1
  81. package/build/assets/{launch-IrTDEFCs.js → launch-BSIf9KEg.js} +1 -1
  82. package/build/assets/list-filter-CNpqTWVY.js +1 -0
  83. package/build/assets/{list-todo-apgLVjMw.js → list-todo-ByXMdY4W.js} +1 -1
  84. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
  85. package/build/assets/llm-settings-B-5AHMiX.js +1 -0
  86. package/build/assets/llm-settings-B3SjHDmA.js +1 -0
  87. package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
  88. package/build/assets/loader-circle-Dex47vVW.js +1 -0
  89. package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-DfHI77BA.js} +1 -1
  90. package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
  91. package/build/assets/manifest-8920b615.js +1 -0
  92. package/build/assets/{manifest-subpage-layout-CAOYzrYp.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
  93. package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-DXvssjw9.js} +1 -1
  94. package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
  95. package/build/assets/{mcp-BTs_SXfZ.js → mcp-CEXDhQWn.js} +1 -1
  96. package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
  97. package/build/assets/mcp-page-LGYIICMG.js +9 -0
  98. package/build/assets/messages-DUSeANAh.js +41 -0
  99. package/build/assets/{modal-body-BxZjsju9.js → modal-body-DJw4xBki.js} +1 -1
  100. package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-Dg0ngBPO.js} +1 -1
  101. package/build/assets/{modal-close-button-DDzdRvCs.js → modal-close-button-B9j4nasm.js} +1 -1
  102. package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
  103. package/build/assets/onboarding-BjFebfs5.js +1 -0
  104. package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
  105. package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
  106. package/build/assets/pencil-D5c47kyN.js +1 -0
  107. package/build/assets/pin-C7vMagvf.js +1 -0
  108. package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
  109. package/build/assets/plug-CeaqeF6u.js +1 -0
  110. package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
  111. package/build/assets/plus-B3wvU06-.js +1 -0
  112. package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
  113. package/build/assets/{providers-BhMcY5nv.js → providers-2gIIkz2N.js} +1 -1
  114. package/build/assets/proxy-CBgMd2zf.js +1 -0
  115. package/build/assets/{puzzle-JM_QaRm0.js → puzzle-DdAqbUrb.js} +1 -1
  116. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
  117. package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
  118. package/build/assets/root-Bye_XmEL.js +2 -0
  119. package/build/assets/root-Cnwwzgo0.css +1 -0
  120. package/build/assets/root-layout-CSAwxBGM.js +2 -0
  121. package/build/assets/schema-field-CK0xYNbO.js +1 -0
  122. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  123. package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
  124. package/build/assets/secret-form-CB2VwYYg.js +1 -0
  125. package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
  126. package/build/assets/{secrets-settings-B_GpxKW2.js → secrets-settings-Bh0udeKv.js} +1 -1
  127. package/build/assets/settings-DmyIgRxO.js +1 -0
  128. package/build/assets/{settings-dropdown-input-BcwylHs2.js → settings-dropdown-input-DVpyD87C.js} +1 -1
  129. package/build/assets/settings-index-BSJUFmjE.js +1 -0
  130. package/build/assets/{settings-input-Db-1g8Ql.js → settings-input-C0dd8Utu.js} +1 -1
  131. package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-Ds4jPBHK.js} +1 -1
  132. package/build/assets/{settings-modal-DfJ3tcJQ.js → settings-modal-yStgEh2o.js} +1 -1
  133. package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
  134. package/build/assets/{settings-switch-CS-dJDmA.js → settings-switch-B78Khmyz.js} +1 -1
  135. package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-8GIIgOQL.js} +1 -1
  136. package/build/assets/shared-conversation-DM96X4KV.js +1 -0
  137. package/build/assets/shield-check-DO7wa_eu.js +1 -0
  138. package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-EPfWxk11.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
  140. package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-_t4_Ef-9.js} +1 -1
  141. package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
  142. package/build/assets/{sidebar-store-DGqHkVLw.js → sidebar-store-CSDFK0W5.js} +1 -1
  143. package/build/assets/{skill-card-pill-row-B27-xyig.js → skill-card-pill-row-989y15jV.js} +1 -1
  144. package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-BBeZ4JEP.js} +1 -1
  145. package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
  146. package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
  147. package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
  148. package/build/assets/skills-settings-3e-FuHw_.js +1 -0
  149. package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
  150. package/build/assets/{task-list-tab-C5zcaktH.js → task-list-tab-3Jg8ywch.js} +1 -1
  151. package/build/assets/{terminal-CNElN42a.js → terminal-onXx0_Qz.js} +2 -2
  152. package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
  153. package/build/assets/trash-2-ZhKuTLiz.js +1 -0
  154. package/build/assets/trash-B6OIe4yX.js +1 -0
  155. package/build/assets/triangle-alert-BajLPpQg.js +1 -0
  156. package/build/assets/{typography-v1KN0tzi.js → typography-HLLg_FAn.js} +1 -1
  157. package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
  158. package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
  159. package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
  160. package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
  161. package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-BZkQNEA8.js} +1 -1
  162. package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
  163. package/build/assets/{use-automations-xijQKIl9.js → use-automations-Cg0PDIZr.js} +1 -1
  164. package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
  165. package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
  166. package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
  167. package/build/assets/use-config-DpafU_QP.js +1 -0
  168. package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
  169. package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
  170. package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CQ4b0qK8.js} +1 -1
  171. package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
  172. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
  173. package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
  174. package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
  175. package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
  176. package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
  177. package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
  178. package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
  179. package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
  180. package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-3U5K9-8x.js} +1 -1
  181. package/build/assets/use-settings-Dn00UISA.js +1 -0
  182. package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
  183. package/build/assets/use-tracking-B9prBsrq.js +3 -0
  184. package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-ZWlXtbZb.js} +1 -1
  185. package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
  186. package/build/assets/{useMutation-B-qc391N.js → useMutation-CJuK90oc.js} +1 -1
  187. package/build/assets/{useQueries-DlbhlH9I.js → useQueries-CykmpT-a.js} +1 -1
  188. package/build/assets/{useQuery-BSTgq1rl.js → useQuery-S6j94er1.js} +1 -1
  189. package/build/assets/utils-BOco8mxR.js +1 -0
  190. package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
  191. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  192. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
  193. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
  194. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
  195. package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
  196. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
  197. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
  198. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js} +1 -1
  199. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  200. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
  201. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
  202. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +12 -6
  203. package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-u2POabjH.js} +1 -1
  204. package/build/assets/{wrench-CUEI1krB.js → wrench-CkgI4rxA.js} +1 -1
  205. package/build/assets/x-By6qCmtY.js +1 -0
  206. package/build/index.html +4 -4
  207. package/build/locales/ar/openhands.json +73 -20
  208. package/build/locales/ca/openhands.json +73 -20
  209. package/build/locales/de/openhands.json +73 -20
  210. package/build/locales/en/openhands.json +73 -20
  211. package/build/locales/es/openhands.json +73 -20
  212. package/build/locales/fr/openhands.json +73 -20
  213. package/build/locales/it/openhands.json +73 -20
  214. package/build/locales/ja/openhands.json +73 -20
  215. package/build/locales/ko-KR/openhands.json +73 -20
  216. package/build/locales/no/openhands.json +73 -20
  217. package/build/locales/pt/openhands.json +73 -20
  218. package/build/locales/tr/openhands.json +73 -20
  219. package/build/locales/uk/openhands.json +73 -20
  220. package/build/locales/zh-CN/openhands.json +73 -20
  221. package/build/locales/zh-TW/openhands.json +73 -20
  222. package/config/defaults.json +3 -3
  223. package/dist/api/agent-server-adapter.cjs +3 -3
  224. package/dist/api/agent-server-adapter.cjs.map +1 -1
  225. package/dist/api/agent-server-adapter.d.ts +72 -12
  226. package/dist/api/agent-server-adapter.js +234 -132
  227. package/dist/api/agent-server-adapter.js.map +1 -1
  228. package/dist/api/agent-server-config.cjs +1 -1
  229. package/dist/api/agent-server-config.cjs.map +1 -1
  230. package/dist/api/agent-server-config.d.ts +6 -0
  231. package/dist/api/agent-server-config.js +6 -3
  232. package/dist/api/agent-server-config.js.map +1 -1
  233. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  234. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  235. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  236. package/dist/api/automation-service/automation-service.api.js +7 -7
  237. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  238. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  239. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  240. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  241. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  242. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  243. package/dist/api/cloud/skills-service.api.cjs +1 -1
  244. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  245. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  246. package/dist/api/cloud/skills-service.api.js +11 -1
  247. package/dist/api/cloud/skills-service.api.js.map +1 -1
  248. package/dist/api/conversation-metadata-store.cjs +1 -1
  249. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  250. package/dist/api/conversation-metadata-store.d.ts +24 -0
  251. package/dist/api/conversation-metadata-store.js +10 -2
  252. package/dist/api/conversation-metadata-store.js.map +1 -1
  253. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  254. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  255. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
  256. package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
  257. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  258. package/dist/api/hooks-service.cjs +2 -0
  259. package/dist/api/hooks-service.cjs.map +1 -0
  260. package/dist/api/hooks-service.d.ts +13 -0
  261. package/dist/api/hooks-service.js +20 -0
  262. package/dist/api/hooks-service.js.map +1 -0
  263. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  264. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  265. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  266. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  267. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  268. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  269. package/dist/api/settings-service/settings-service.api.d.ts +2 -0
  270. package/dist/api/settings-service/settings-service.api.js +18 -10
  271. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  272. package/dist/api/skills-service.cjs +1 -1
  273. package/dist/api/skills-service.cjs.map +1 -1
  274. package/dist/api/skills-service.d.ts +7 -0
  275. package/dist/api/skills-service.js +11 -8
  276. package/dist/api/skills-service.js.map +1 -1
  277. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  278. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  279. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  280. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  281. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  282. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  283. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  284. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  286. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  287. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  288. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  289. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  291. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  292. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  293. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  295. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  296. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  297. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  298. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  299. package/dist/components/conversation-events/chat/event-message.js +79 -70
  300. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  301. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  302. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  303. package/dist/components/conversation-events/chat/messages.js +28 -27
  304. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  305. package/dist/components/features/automations/automation-card.cjs +1 -1
  306. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  307. package/dist/components/features/automations/automation-card.js +100 -94
  308. package/dist/components/features/automations/automation-card.js.map +1 -1
  309. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  310. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  311. package/dist/components/features/automations/automation-list-row.js +88 -77
  312. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  313. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  314. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  315. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  316. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  317. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  318. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  319. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  320. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  321. package/dist/components/features/automations/kebab-menu.js +9 -5
  322. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  323. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  324. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  325. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  326. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  327. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  328. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  329. package/dist/components/features/backends/backend-selector.cjs +1 -1
  330. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  331. package/dist/components/features/backends/backend-selector.js +133 -122
  332. package/dist/components/features/backends/backend-selector.js.map +1 -1
  333. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  334. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  335. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  336. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  337. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  338. package/dist/components/features/chat/change-agent-button.js +4 -4
  339. package/dist/components/features/chat/chat-interface.cjs +2 -2
  340. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  341. package/dist/components/features/chat/chat-interface.js +137 -137
  342. package/dist/components/features/chat/chat-interface.js.map +1 -1
  343. package/dist/components/features/chat/chat-message.cjs +1 -1
  344. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  345. package/dist/components/features/chat/chat-message.d.ts +2 -1
  346. package/dist/components/features/chat/chat-message.js +88 -79
  347. package/dist/components/features/chat/chat-message.js.map +1 -1
  348. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  349. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  350. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  351. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  352. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  353. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  354. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  355. package/dist/components/features/chat/generic-event-message.js +41 -22
  356. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  357. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  358. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  359. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  360. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  361. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  362. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  363. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  364. package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
  365. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  366. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  367. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  368. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  369. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  370. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  371. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
  372. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  373. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  374. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  375. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  376. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  377. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  378. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  379. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  380. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  381. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  382. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  383. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  384. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  386. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  387. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  388. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  389. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  391. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  392. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  393. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  394. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  395. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  396. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  397. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  398. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  399. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  400. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  401. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  402. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  403. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  404. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  405. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  406. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  407. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  408. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  409. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  410. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  411. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  412. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  413. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  414. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  415. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  416. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  417. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  418. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  419. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  420. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  421. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  425. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  426. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  427. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  428. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  429. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  430. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  431. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  432. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  433. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  434. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  435. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  436. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  437. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  438. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  439. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  440. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  441. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  442. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  443. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  444. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  445. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  446. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  447. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  448. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  449. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  450. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  451. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  452. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  453. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  454. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  455. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  456. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  457. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  458. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  459. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  460. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  461. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  462. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  463. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  464. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
  465. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  466. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  467. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  468. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  469. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  470. package/dist/components/features/settings/cloud-settings-link.js +5 -3
  471. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  472. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  473. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  474. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  475. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  476. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  477. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  478. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  479. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  480. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  481. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  482. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  483. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  484. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  485. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  486. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  487. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  488. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  489. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  490. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  491. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  492. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  493. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +3 -1
  494. package/dist/components/features/sidebar/sidebar-rail-body.js +156 -139
  495. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  496. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  497. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  498. package/dist/components/features/sidebar/sidebar.js +44 -43
  499. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  500. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  501. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  502. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  503. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  504. package/dist/components/features/skills/extensions-navigation.js +3 -3
  505. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  506. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  507. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  508. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  509. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  510. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  511. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  512. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  513. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  514. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  515. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  516. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  517. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  518. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  519. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  520. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  521. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  522. package/dist/components/shared/modals/settings/model-selector.js +27 -27
  523. package/dist/config/defaults.cjs +1 -1
  524. package/dist/config/defaults.cjs.map +1 -1
  525. package/dist/config/defaults.js +3 -3
  526. package/dist/config/defaults.js.map +1 -1
  527. package/dist/constants/settings-nav.d.ts +8 -0
  528. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  529. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  530. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  531. package/dist/contexts/conversation-websocket-context.js +194 -198
  532. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  533. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  534. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  535. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  536. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  537. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  538. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  539. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  540. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  541. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  542. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  543. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  544. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  545. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  546. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  547. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  548. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  549. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  550. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  551. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  552. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  553. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  554. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  555. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  556. package/dist/hooks/mutation/use-save-settings.js +3 -3
  557. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  558. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  559. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  560. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  561. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  562. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  563. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  564. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  565. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  566. package/dist/hooks/query/query-keys.cjs +1 -1
  567. package/dist/hooks/query/query-keys.cjs.map +1 -1
  568. package/dist/hooks/query/query-keys.d.ts +6 -0
  569. package/dist/hooks/query/query-keys.js +2 -2
  570. package/dist/hooks/query/query-keys.js.map +1 -1
  571. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  572. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  573. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  574. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  575. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  576. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  577. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  578. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  579. package/dist/hooks/query/use-conversation-skills.js +20 -4
  580. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  581. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  582. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  583. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  584. package/dist/hooks/query/use-provider-connections.js +7 -3
  585. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  586. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  587. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  588. package/dist/hooks/query/use-sub-conversations.js +16 -16
  589. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  590. package/dist/hooks/use-acp-model-context.cjs +1 -1
  591. package/dist/hooks/use-acp-model-context.js +3 -3
  592. package/dist/hooks/use-agent-state.cjs +1 -1
  593. package/dist/hooks/use-agent-state.cjs.map +1 -1
  594. package/dist/hooks/use-agent-state.d.ts +17 -1
  595. package/dist/hooks/use-agent-state.js +19 -9
  596. package/dist/hooks/use-agent-state.js.map +1 -1
  597. package/dist/hooks/use-automation-permissions.cjs +2 -0
  598. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  599. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  600. package/dist/hooks/use-automation-permissions.js +52 -0
  601. package/dist/hooks/use-automation-permissions.js.map +1 -0
  602. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  603. package/dist/hooks/use-chat-input-model-state.js +3 -3
  604. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  605. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  606. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  607. package/dist/hooks/use-handle-plan-click.js +85 -26
  608. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  609. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  610. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  611. package/dist/hooks/use-home-automation-actions.js +1 -0
  612. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  613. package/dist/hooks/use-llm-configured.cjs +1 -1
  614. package/dist/hooks/use-llm-configured.js +3 -3
  615. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  616. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  617. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  618. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  619. package/dist/hooks/use-unified-websocket-status.js +5 -1
  620. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  621. package/dist/i18n/declaration.cjs +1 -1
  622. package/dist/i18n/declaration.cjs.map +1 -1
  623. package/dist/i18n/declaration.d.ts +65 -12
  624. package/dist/i18n/declaration.js +1 -1
  625. package/dist/i18n/declaration.js.map +1 -1
  626. package/dist/i18n/translation.cjs +2 -2
  627. package/dist/i18n/translation.cjs.map +1 -1
  628. package/dist/i18n/translation.js +1196 -295
  629. package/dist/i18n/translation.js.map +1 -1
  630. package/dist/locales/ar/openhands.json +73 -20
  631. package/dist/locales/ca/openhands.json +73 -20
  632. package/dist/locales/de/openhands.json +73 -20
  633. package/dist/locales/en/openhands.json +73 -20
  634. package/dist/locales/es/openhands.json +73 -20
  635. package/dist/locales/fr/openhands.json +73 -20
  636. package/dist/locales/it/openhands.json +73 -20
  637. package/dist/locales/ja/openhands.json +73 -20
  638. package/dist/locales/ko-KR/openhands.json +73 -20
  639. package/dist/locales/no/openhands.json +73 -20
  640. package/dist/locales/pt/openhands.json +73 -20
  641. package/dist/locales/tr/openhands.json +73 -20
  642. package/dist/locales/uk/openhands.json +73 -20
  643. package/dist/locales/zh-CN/openhands.json +73 -20
  644. package/dist/locales/zh-TW/openhands.json +73 -20
  645. package/dist/manifests/automation-insights.cjs.map +1 -1
  646. package/dist/manifests/automation-insights.d.ts +10 -2
  647. package/dist/manifests/automation-insights.js.map +1 -1
  648. package/dist/manifests/automation-setup.cjs +1 -1
  649. package/dist/manifests/automation-setup.cjs.map +1 -1
  650. package/dist/manifests/automation-setup.d.ts +9 -16
  651. package/dist/manifests/automation-setup.js +17 -7
  652. package/dist/manifests/automation-setup.js.map +1 -1
  653. package/dist/manifests/manifest-actions.d.ts +1 -1
  654. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  655. package/dist/manifests/manifest-local-validation.cjs +2 -0
  656. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  657. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  658. package/dist/manifests/manifest-local-validation.js +8 -0
  659. package/dist/manifests/manifest-local-validation.js.map +1 -0
  660. package/dist/manifests/manifest-template.cjs +2 -0
  661. package/dist/manifests/manifest-template.cjs.map +1 -0
  662. package/dist/manifests/manifest-template.d.ts +4 -4
  663. package/dist/manifests/manifest-template.js +12 -0
  664. package/dist/manifests/manifest-template.js.map +1 -0
  665. package/dist/manifests/manifest-validation.cjs +1 -1
  666. package/dist/manifests/manifest-validation.cjs.map +1 -1
  667. package/dist/manifests/manifest-validation.js +106 -28
  668. package/dist/manifests/manifest-validation.js.map +1 -1
  669. package/dist/manifests/types.cjs.map +1 -1
  670. package/dist/manifests/types.d.ts +39 -4
  671. package/dist/manifests/types.js.map +1 -1
  672. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  673. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  674. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  675. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  676. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  677. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  678. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
  679. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  680. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  681. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  682. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
  683. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  684. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
  685. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
  686. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
  687. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
  688. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  689. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  690. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
  691. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  692. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  693. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  694. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  695. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  696. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
  697. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
  698. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
  699. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
  700. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  701. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  702. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  703. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  704. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  705. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  706. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  707. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  708. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  709. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  710. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  711. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  712. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  713. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  714. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  715. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  716. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  717. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  718. package/dist/package.cjs +1 -1
  719. package/dist/package.cjs.map +1 -1
  720. package/dist/package.js +4 -4
  721. package/dist/package.js.map +1 -1
  722. package/dist/routes/agent-settings.d.ts +2 -0
  723. package/dist/routes/app-settings.cjs +1 -1
  724. package/dist/routes/app-settings.js +5 -5
  725. package/dist/routes/llm-settings.cjs +1 -1
  726. package/dist/routes/llm-settings.cjs.map +1 -1
  727. package/dist/routes/llm-settings.d.ts +3 -1
  728. package/dist/routes/llm-settings.js +88 -87
  729. package/dist/routes/llm-settings.js.map +1 -1
  730. package/dist/routes/planner-tab.cjs +1 -1
  731. package/dist/routes/planner-tab.cjs.map +1 -1
  732. package/dist/routes/planner-tab.js +44 -28
  733. package/dist/routes/planner-tab.js.map +1 -1
  734. package/dist/services/telemetry.cjs +1 -1
  735. package/dist/services/telemetry.cjs.map +1 -1
  736. package/dist/services/telemetry.d.ts +5 -0
  737. package/dist/services/telemetry.js +122 -115
  738. package/dist/services/telemetry.js.map +1 -1
  739. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  740. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  741. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  742. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  743. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  744. package/dist/stores/conversation-state-store.cjs +1 -1
  745. package/dist/stores/conversation-state-store.cjs.map +1 -1
  746. package/dist/stores/conversation-state-store.d.ts +9 -3
  747. package/dist/stores/conversation-state-store.js +6 -3
  748. package/dist/stores/conversation-state-store.js.map +1 -1
  749. package/dist/stores/conversation-store.cjs +1 -1
  750. package/dist/stores/conversation-store.cjs.map +1 -1
  751. package/dist/stores/conversation-store.d.ts +2 -0
  752. package/dist/stores/conversation-store.js +3 -0
  753. package/dist/stores/conversation-store.js.map +1 -1
  754. package/dist/stores/model-store.cjs +1 -1
  755. package/dist/stores/model-store.cjs.map +1 -1
  756. package/dist/stores/model-store.d.ts +7 -0
  757. package/dist/stores/model-store.js +4 -0
  758. package/dist/stores/model-store.js.map +1 -1
  759. package/dist/types/automation.cjs.map +1 -1
  760. package/dist/types/automation.d.ts +46 -1
  761. package/dist/types/automation.js.map +1 -1
  762. package/dist/ui/context-menu.d.ts +1 -1
  763. package/dist/ui/toggle-switch.cjs +1 -1
  764. package/dist/ui/toggle-switch.cjs.map +1 -1
  765. package/dist/ui/toggle-switch.d.ts +4 -1
  766. package/dist/ui/toggle-switch.js +4 -3
  767. package/dist/ui/toggle-switch.js.map +1 -1
  768. package/dist/utils/automation-catalog.cjs +1 -1
  769. package/dist/utils/automation-catalog.cjs.map +1 -1
  770. package/dist/utils/automation-catalog.d.ts +12 -1
  771. package/dist/utils/automation-catalog.js +42 -12
  772. package/dist/utils/automation-catalog.js.map +1 -1
  773. package/dist/utils/automation-run-display.cjs +2 -0
  774. package/dist/utils/automation-run-display.cjs.map +1 -0
  775. package/dist/utils/automation-run-display.d.ts +20 -0
  776. package/dist/utils/automation-run-display.js +85 -0
  777. package/dist/utils/automation-run-display.js.map +1 -0
  778. package/dist/utils/automation-schedule.cjs +1 -1
  779. package/dist/utils/automation-schedule.cjs.map +1 -1
  780. package/dist/utils/automation-schedule.d.ts +16 -0
  781. package/dist/utils/automation-schedule.js +2 -0
  782. package/dist/utils/automation-schedule.js.map +1 -1
  783. package/dist/utils/constants.cjs +1 -1
  784. package/dist/utils/constants.cjs.map +1 -1
  785. package/dist/utils/constants.d.ts +4 -0
  786. package/dist/utils/constants.js +23 -3
  787. package/dist/utils/constants.js.map +1 -1
  788. package/dist/utils/format-event-timestamp.cjs +2 -0
  789. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  790. package/dist/utils/format-event-timestamp.d.ts +1 -0
  791. package/dist/utils/format-event-timestamp.js +13 -0
  792. package/dist/utils/format-event-timestamp.js.map +1 -0
  793. package/dist/utils/git-diff-stats.cjs +2 -2
  794. package/dist/utils/git-diff-stats.cjs.map +1 -1
  795. package/dist/utils/git-diff-stats.d.ts +4 -0
  796. package/dist/utils/git-diff-stats.js +12 -2
  797. package/dist/utils/git-diff-stats.js.map +1 -1
  798. package/dist/utils/plan-file.cjs +4 -0
  799. package/dist/utils/plan-file.cjs.map +1 -0
  800. package/dist/utils/plan-file.d.ts +18 -0
  801. package/dist/utils/plan-file.js +58 -0
  802. package/dist/utils/plan-file.js.map +1 -0
  803. package/dist/utils/recommended-automation-rail.cjs +1 -1
  804. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  805. package/dist/utils/recommended-automation-rail.js +1 -0
  806. package/dist/utils/recommended-automation-rail.js.map +1 -1
  807. package/dist/utils/scroll-fade-state.cjs +1 -1
  808. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  809. package/dist/utils/scroll-fade-state.d.ts +6 -0
  810. package/dist/utils/scroll-fade-state.js +8 -1
  811. package/dist/utils/scroll-fade-state.js.map +1 -1
  812. package/dist/utils/sdk-settings-schema.cjs +1 -1
  813. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  814. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  815. package/dist/utils/sdk-settings-schema.js +25 -22
  816. package/dist/utils/sdk-settings-schema.js.map +1 -1
  817. package/dist/utils/utils.cjs +1 -1
  818. package/dist/utils/utils.cjs.map +1 -1
  819. package/dist/utils/utils.js +11 -11
  820. package/dist/utils/utils.js.map +1 -1
  821. package/package.json +4 -4
  822. package/scripts/check-sdk-version-sync.mjs +6 -6
  823. package/scripts/dev-safe.mjs +1 -1
  824. package/scripts/dev-with-automation.mjs +1 -1
  825. package/scripts/static-server.mjs +33 -1
  826. package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
  827. package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
  828. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
  829. package/build/assets/agent-settings-DLtsqaOs.js +0 -2
  830. package/build/assets/agent-settings-fFvR-XC2.js +0 -1
  831. package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
  832. package/build/assets/automation-detail-BmwlCUAB.js +0 -3
  833. package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
  834. package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
  835. package/build/assets/automations-list-DuNcRawl.js +0 -1
  836. package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
  837. package/build/assets/bot-dMYHVfYM.js +0 -1
  838. package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
  839. package/build/assets/check-CS0vmpQQ.js +0 -1
  840. package/build/assets/chevron-down-e1QBpjVy.js +0 -1
  841. package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
  842. package/build/assets/circle-check-DzWLNsbE.js +0 -1
  843. package/build/assets/command-menu--UIlGL72.js +0 -1
  844. package/build/assets/commits-tab-AnZwLvh-.js +0 -1
  845. package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
  846. package/build/assets/conversation-BbGrAO4Z.js +0 -93
  847. package/build/assets/conversation-mYT6NAoj.js +0 -1
  848. package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
  849. package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
  850. package/build/assets/empty-state-BoGVDecT.js +0 -1
  851. package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
  852. package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
  853. package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
  854. package/build/assets/external-link-DKUlnCQV.js +0 -1
  855. package/build/assets/files-tab-D4o2VyE_.js +0 -1
  856. package/build/assets/get-git-path-ChKDVHZp.js +0 -1
  857. package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
  858. package/build/assets/home-ChpSuepX.js +0 -1
  859. package/build/assets/home-DIsB440S.js +0 -1
  860. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
  861. package/build/assets/home-store-CY9Ej0ux.js +0 -1
  862. package/build/assets/index-home-BdlrFIif.js +0 -1
  863. package/build/assets/info-B6RQawoW.js +0 -1
  864. package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
  865. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
  866. package/build/assets/list-filter-DsEK7NFC.js +0 -1
  867. package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
  868. package/build/assets/llm-settings-B9juXhIa.js +0 -1
  869. package/build/assets/llm-settings-De1d5dfr.js +0 -1
  870. package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
  871. package/build/assets/loader-circle-CC1au6hc.js +0 -1
  872. package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
  873. package/build/assets/manifest-80fb1c29.js +0 -1
  874. package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
  875. package/build/assets/mcp-page-BEBYqH_K.js +0 -9
  876. package/build/assets/messages-DKV9cRc2.js +0 -41
  877. package/build/assets/onboarding-DV_OXoeP.js +0 -1
  878. package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
  879. package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
  880. package/build/assets/pencil-47jAZH_V.js +0 -1
  881. package/build/assets/pin-By41Vl5J.js +0 -1
  882. package/build/assets/planner-tab-C9uZmhme.js +0 -1
  883. package/build/assets/plug-CG5HFcNG.js +0 -1
  884. package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
  885. package/build/assets/plus-C7Slq-0I.js +0 -1
  886. package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
  887. package/build/assets/proxy-9Fe1v5na.js +0 -1
  888. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
  889. package/build/assets/refresh-cw-3q3Frrii.js +0 -1
  890. package/build/assets/root-Dc8YmC9F.js +0 -2
  891. package/build/assets/root-VDaypvK4.css +0 -1
  892. package/build/assets/root-layout-CXkhSPYh.js +0 -2
  893. package/build/assets/schema-field-D-y9-LDb.js +0 -1
  894. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  895. package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
  896. package/build/assets/secret-form-BB7the8W.js +0 -1
  897. package/build/assets/secrets-service-ByZVENbp.js +0 -1
  898. package/build/assets/settings-C0EWuBtA.js +0 -1
  899. package/build/assets/settings-index-5w5UW2K3.js +0 -1
  900. package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
  901. package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
  902. package/build/assets/shield-check-D2aCRd16.js +0 -1
  903. package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
  904. package/build/assets/skill-scope-B42H-XOc.js +0 -1
  905. package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
  906. package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
  907. package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
  908. package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
  909. package/build/assets/trash-2-D7K26eDO.js +0 -1
  910. package/build/assets/trash-D-HYiVYM.js +0 -1
  911. package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
  912. package/build/assets/usage-tab-CVDffLPt.js +0 -1
  913. package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
  914. package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
  915. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
  916. package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
  917. package/build/assets/use-config-A9QovgXO.js +0 -1
  918. package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
  919. package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
  920. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  921. package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
  922. package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
  923. package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
  924. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
  925. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
  926. package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
  927. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
  928. package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
  929. package/build/assets/use-settings-DSXLbvBl.js +0 -1
  930. package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
  931. package/build/assets/use-tracking-D53y3TH9.js +0 -3
  932. package/build/assets/utils-CN5ZfZy1.js +0 -1
  933. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
  934. package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
  935. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
  936. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
  937. package/build/assets/x-DJdhbdmt.js +0 -1
  938. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  939. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  940. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  941. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  942. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  943. package/dist/hooks/query/use-skills.cjs +0 -2
  944. package/dist/hooks/query/use-skills.cjs.map +0 -1
  945. package/dist/hooks/query/use-skills.d.ts +0 -7
  946. package/dist/hooks/query/use-skills.js +0 -13
  947. package/dist/hooks/query/use-skills.js.map +0 -1
  948. package/dist/hooks/use-has-permission.cjs +0 -2
  949. package/dist/hooks/use-has-permission.cjs.map +0 -1
  950. package/dist/hooks/use-has-permission.d.ts +0 -1
  951. package/dist/hooks/use-has-permission.js +0 -8
  952. package/dist/hooks/use-has-permission.js.map +0 -1
  953. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  954. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  955. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  956. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
@@ -1,2 +1,2 @@
1
- const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../utils/utils.cjs"),i=require("../../shared/buttons/copy-to-clipboard-button.cjs"),a=require("../markdown/markdown-renderer.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../shared/text-shimmer.cjs"),c=require("./pending-stop-icon.cjs"),l=require("./user-message-body.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");function f({type:e,message:f,children:p,actions:m,isFromPlanningAgent:h=!1,pendingStatus:g,onRetry:_,onDismiss:v,onStop:y}){let{t:b}=t.useTranslation(`openhands`),[x,S]=u.default.useState(!1),[C,w]=u.default.useState(!1),[T,E]=u.default.useState(!1),[D,O]=u.default.useState(!1),[k,A]=u.default.useState(!0),j=u.default.useRef(null);u.default.useEffect(()=>{E(!1)},[f]);let M=async()=>{await navigator.clipboard.writeText(f),w(!0)};u.default.useEffect(()=>{let e;return C&&(e=setTimeout(()=>{w(!1)},2e3)),()=>{clearTimeout(e)}},[C]);let N=e===`user`&&(g===`error`||g===`sending`),P=g===`sending`&&y!=null,F=P&&x,I=e===`user`&&g==null,L=I&&D&&!T,R=u.default.Children.count(p)>0;u.default.useLayoutEffect(()=>{if(!P||I)return;let e=j.current;if(!e)return;let t=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight),n=Number.isFinite(t)&&t>0?t:24;A(e.scrollHeight<=n+1)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[f,P,I]);let z=I?(0,d.jsx)(l.UserMessageBody,{message:f,isHovering:x,isExpanded:T,onTruncatableChange:O}):(0,d.jsx)(`div`,{ref:j,className:`min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]`,children:(0,d.jsx)(a.MarkdownRenderer,{includeStandard:!0,includeHeadings:!0,allowHtml:e!==`user`,components:l.chatBubbleMarkdownComponents,children:f})}),B=(0,d.jsxs)(`article`,{"data-testid":`${e}-message`,"data-pending-status":g,onMouseEnter:()=>S(!0),onMouseLeave:()=>S(!1),className:r.cn(`rounded-xl relative w-fit max-w-full flex flex-col`,R&&`gap-2`,e===`user`&&`mt-6 bg-tertiary self-end px-4 py-2.5`,e===`agent`&&`mt-6 w-full max-w-full bg-transparent`,h&&e===`agent`&&`border border-[#597ff4] bg-tertiary p-4 mt-2`,g===`error`&&`border border-[var(--oh-status-error)]/40`,!N&&`last:mb-4`),children:[(0,d.jsxs)(`div`,{className:r.cn(`absolute -top-2.5 -right-2.5 z-10`,!x||g===`sending`?`hidden`:`flex`,`items-center gap-1`),onClick:e=>e.stopPropagation(),children:[m?.map((e,t)=>e.tooltip?(0,d.jsx)(o.StyledTooltip,{content:e.tooltip,placement:`top`,children:(0,d.jsx)(`button`,{type:`button`,onClick:e.onClick,className:`button-base p-1 cursor-pointer`,"aria-label":e.tooltip,children:e.icon})},t):(0,d.jsx)(`button`,{type:`button`,onClick:e.onClick,className:`button-base p-1 cursor-pointer`,"aria-label":`Action ${t+1}`,children:e.icon},t)),(0,d.jsx)(i.CopyToClipboardButton,{isHidden:!x,isDisabled:C,onClick:M,mode:C?`copied`:`copy`})]}),z,P?(0,d.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),y?.()},"data-testid":`chat-message-stop`,"aria-label":b(n.I18nKey.BUTTON$STOP),"aria-hidden":!F,tabIndex:F?0:-1,className:r.cn(`group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150`,k?`right-3 top-1/2 -translate-y-1/2`:`right-3 bottom-2.5`,F?`opacity-100`:`pointer-events-none opacity-0`),children:(0,d.jsx)(c.PendingStopIcon,{className:`block h-7 w-7 max-w-none`})}):null,L?(0,d.jsx)(`button`,{type:`button`,"data-testid":`chat-message-expand`,"aria-expanded":!1,"aria-label":b(n.I18nKey.COMMON$VIEW_MORE),className:`absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0`,onClick:()=>E(!0)}):null,p]});return e===`user`&&g===`error`?(0,d.jsxs)(`div`,{className:`flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4`,children:[B,(0,d.jsxs)(`div`,{role:`alert`,"data-testid":`chat-message-error`,className:`flex items-center gap-2 text-xs text-[var(--oh-status-error)]`,children:[(0,d.jsx)(`span`,{children:b(n.I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}),_?(0,d.jsx)(`button`,{type:`button`,onClick:_,className:`cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]`,"data-testid":`chat-message-retry`,children:b(n.I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}):null,v?(0,d.jsx)(`button`,{type:`button`,onClick:v,className:`cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]`,"data-testid":`chat-message-dismiss`,children:b(n.I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}):null]})]}):e===`user`&&g===`sending`?(0,d.jsxs)(`div`,{className:`flex w-full max-w-full flex-col last:mb-4`,children:[B,(0,d.jsx)(`div`,{className:`my-1 w-full py-1 text-sm`,children:(0,d.jsx)(s.TextShimmer,{as:`p`,role:`status`,"aria-live":`polite`,"data-testid":`chat-message-sending`,className:`block w-full text-sm font-normal`,duration:1,spread:2,children:b(n.I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)})})]}):B}exports.ChatMessage=f;
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../utils/utils.cjs"),i=require("../../shared/buttons/copy-to-clipboard-button.cjs"),a=require("../markdown/markdown-renderer.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../../utils/format-event-timestamp.cjs"),c=require("../../shared/text-shimmer.cjs"),l=require("./pending-stop-icon.cjs"),u=require("./user-message-body.cjs");let d=require("react");d=e.__toESM(d,1);let f=require("react/jsx-runtime");function p({type:e,message:p,children:m,actions:h,isFromPlanningAgent:g=!1,pendingStatus:_,onRetry:v,onDismiss:y,onStop:b,timestamp:x}){let{t:S,i18n:C}=t.useTranslation(`openhands`),[w,T]=d.default.useState(!1),[E,D]=d.default.useState(!1),[O,k]=d.default.useState(!1),[A,j]=d.default.useState(!1),[M,N]=d.default.useState(!0),P=d.default.useRef(null),F=s.formatEventTimestamp(x,C?.language);d.default.useEffect(()=>{k(!1)},[p]);let I=async()=>{await navigator.clipboard.writeText(p),D(!0)};d.default.useEffect(()=>{let e;return E&&(e=setTimeout(()=>{D(!1)},2e3)),()=>{clearTimeout(e)}},[E]);let L=e===`user`&&(_===`error`||_===`sending`),R=_===`sending`&&b!=null,z=R&&w,B=e===`user`&&_==null,V=B&&A&&!O,H=d.default.Children.count(m)>0;d.default.useLayoutEffect(()=>{if(!R||B)return;let e=P.current;if(!e)return;let t=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight),n=Number.isFinite(t)&&t>0?t:24;N(e.scrollHeight<=n+1)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[p,R,B]);let U=B?(0,f.jsx)(u.UserMessageBody,{message:p,isHovering:w,isExpanded:O,onTruncatableChange:j}):(0,f.jsx)(`div`,{ref:P,className:`min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]`,children:(0,f.jsx)(a.MarkdownRenderer,{includeStandard:!0,includeHeadings:!0,allowHtml:e!==`user`,components:u.chatBubbleMarkdownComponents,children:p})}),W=(0,f.jsxs)(`article`,{"data-testid":`${e}-message`,"data-pending-status":_,onMouseEnter:()=>T(!0),onMouseLeave:()=>T(!1),className:r.cn(`rounded-xl relative w-fit max-w-full flex flex-col`,H&&`gap-2`,e===`user`&&`mt-6 bg-tertiary self-end px-4 py-2.5`,e===`agent`&&`mt-6 w-full max-w-full bg-transparent`,g&&e===`agent`&&`border border-[#597ff4] bg-tertiary p-4 mt-2`,_===`error`&&`border border-[var(--oh-status-error)]/40`,!L&&`last:mb-4`),children:[(0,f.jsxs)(`div`,{className:r.cn(`absolute -top-2.5 -right-2.5 z-10`,!w||_===`sending`?`hidden`:`flex`,`items-center gap-1`),onClick:e=>e.stopPropagation(),children:[h?.map((e,t)=>e.tooltip?(0,f.jsx)(o.StyledTooltip,{content:e.tooltip,placement:`top`,children:(0,f.jsx)(`button`,{type:`button`,onClick:e.onClick,className:`button-base p-1 cursor-pointer`,"aria-label":e.tooltip,children:e.icon})},t):(0,f.jsx)(`button`,{type:`button`,onClick:e.onClick,className:`button-base p-1 cursor-pointer`,"aria-label":`Action ${t+1}`,children:e.icon},t)),(0,f.jsx)(i.CopyToClipboardButton,{isHidden:!w,isDisabled:E,onClick:I,mode:E?`copied`:`copy`})]}),U,R?(0,f.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),b?.()},"data-testid":`chat-message-stop`,"aria-label":S(n.I18nKey.BUTTON$STOP),"aria-hidden":!z,tabIndex:z?0:-1,className:r.cn(`group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150`,M?`right-3 top-1/2 -translate-y-1/2`:`right-3 bottom-2.5`,z?`opacity-100`:`pointer-events-none opacity-0`),children:(0,f.jsx)(l.PendingStopIcon,{className:`block h-7 w-7 max-w-none`})}):null,V?(0,f.jsx)(`button`,{type:`button`,"data-testid":`chat-message-expand`,"aria-expanded":!1,"aria-label":S(n.I18nKey.COMMON$VIEW_MORE),className:`absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0`,onClick:()=>k(!0)}):null,m]}),G=F?(0,f.jsx)(o.StyledTooltip,{content:(0,f.jsx)(`time`,{dateTime:x,children:F}),placement:`top`,isOpen:w,children:W}):W;return e===`user`&&_===`error`?(0,f.jsxs)(`div`,{className:`flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4`,children:[G,(0,f.jsxs)(`div`,{role:`alert`,"data-testid":`chat-message-error`,className:`flex items-center gap-2 text-xs text-[var(--oh-status-error)]`,children:[(0,f.jsx)(`span`,{children:S(n.I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}),v?(0,f.jsx)(`button`,{type:`button`,onClick:v,className:`cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]`,"data-testid":`chat-message-retry`,children:S(n.I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}):null,y?(0,f.jsx)(`button`,{type:`button`,onClick:y,className:`cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]`,"data-testid":`chat-message-dismiss`,children:S(n.I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}):null]})]}):e===`user`&&_===`sending`?(0,f.jsxs)(`div`,{className:`flex w-full max-w-full flex-col last:mb-4`,children:[G,(0,f.jsx)(`div`,{className:`my-1 w-full py-1 text-sm`,children:(0,f.jsx)(c.TextShimmer,{as:`p`,role:`status`,"aria-live":`polite`,"data-testid":`chat-message-sending`,className:`block w-full text-sm font-normal`,duration:1,spread:2,children:S(n.I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)})})]}):G}exports.ChatMessage=p;
2
2
  //# sourceMappingURL=chat-message.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message.cjs","names":[],"sources":["../../../../src/components/features/chat/chat-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport type { SourceType } from \"#/types/agent-server/core/base/common\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { TextShimmer } from \"#/components/shared/text-shimmer\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { PendingStopIcon } from \"./pending-stop-icon\";\nimport {\n UserMessageBody,\n chatBubbleMarkdownComponents,\n USER_MESSAGE_LINE_HEIGHT_PX,\n} from \"./user-message-body\";\n\nexport type ChatMessagePendingStatus = \"sending\" | \"error\";\n\ninterface ChatMessageProps {\n type: SourceType;\n message: string;\n actions?: Array<{\n icon: React.ReactNode;\n onClick: () => void;\n tooltip?: string;\n }>;\n isFromPlanningAgent?: boolean;\n pendingStatus?: ChatMessagePendingStatus;\n onRetry?: () => void;\n onDismiss?: () => void;\n onStop?: () => void;\n}\n\nexport function ChatMessage({\n type,\n message,\n children,\n actions,\n isFromPlanningAgent = false,\n pendingStatus,\n onRetry,\n onDismiss,\n onStop,\n}: React.PropsWithChildren<ChatMessageProps>) {\n const { t } = useTranslation(\"openhands\");\n const [isHovering, setIsHovering] = React.useState(false);\n const [isCopy, setIsCopy] = React.useState(false);\n const [isExpanded, setIsExpanded] = React.useState(false);\n const [isTruncatable, setIsTruncatable] = React.useState(false);\n const [isSingleLinePendingMessage, setIsSingleLinePendingMessage] =\n React.useState(true);\n const pendingMessageContentRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n setIsExpanded(false);\n }, [message]);\n\n const handleCopyToClipboard = async () => {\n await navigator.clipboard.writeText(message);\n setIsCopy(true);\n };\n\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n\n if (isCopy) {\n timeout = setTimeout(() => {\n setIsCopy(false);\n }, 2000);\n }\n\n return () => {\n clearTimeout(timeout);\n };\n }, [isCopy]);\n\n const isPendingUserMessage =\n type === \"user\" &&\n (pendingStatus === \"error\" || pendingStatus === \"sending\");\n const canStopPendingMessage = pendingStatus === \"sending\" && onStop != null;\n const showStopButton = canStopPendingMessage && isHovering;\n const useTruncatedUserBody = type === \"user\" && pendingStatus == null;\n const isCollapsed = useTruncatedUserBody && isTruncatable && !isExpanded;\n const hasBubbleChildren = React.Children.count(children) > 0;\n\n React.useLayoutEffect(() => {\n if (!canStopPendingMessage || useTruncatedUserBody) {\n return undefined;\n }\n\n const content = pendingMessageContentRef.current;\n if (!content) {\n return undefined;\n }\n\n const measure = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n const linePx =\n Number.isFinite(lineHeight) && lineHeight > 0\n ? lineHeight\n : USER_MESSAGE_LINE_HEIGHT_PX;\n\n setIsSingleLinePendingMessage(content.scrollHeight <= linePx + 1);\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message, canStopPendingMessage, useTruncatedUserBody]);\n\n const messageContent = useTruncatedUserBody ? (\n <UserMessageBody\n message={message}\n isHovering={isHovering}\n isExpanded={isExpanded}\n onTruncatableChange={setIsTruncatable}\n />\n ) : (\n <div\n ref={pendingMessageContentRef}\n className=\"min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]\"\n >\n <MarkdownRenderer\n includeStandard\n includeHeadings\n allowHtml={type !== \"user\"}\n components={chatBubbleMarkdownComponents}\n >\n {message}\n </MarkdownRenderer>\n </div>\n );\n\n const renderedMessageContent = messageContent;\n\n const messageBubble = (\n <article\n data-testid={`${type}-message`}\n data-pending-status={pendingStatus}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n className={cn(\n \"rounded-xl relative w-fit max-w-full flex flex-col\",\n hasBubbleChildren && \"gap-2\",\n type === \"user\" && \"mt-6 bg-tertiary self-end px-4 py-2.5\",\n type === \"agent\" && \"mt-6 w-full max-w-full bg-transparent\",\n isFromPlanningAgent &&\n type === \"agent\" &&\n \"border border-[#597ff4] bg-tertiary p-4 mt-2\",\n pendingStatus === \"error\" &&\n \"border border-[var(--oh-status-error)]/40\",\n !isPendingUserMessage && \"last:mb-4\",\n )}\n >\n <div\n className={cn(\n \"absolute -top-2.5 -right-2.5 z-10\",\n !isHovering || pendingStatus === \"sending\" ? \"hidden\" : \"flex\",\n \"items-center gap-1\",\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {actions?.map((action, index) =>\n action.tooltip ? (\n <StyledTooltip key={index} content={action.tooltip} placement=\"top\">\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={action.tooltip}\n >\n {action.icon}\n </button>\n </StyledTooltip>\n ) : (\n <button\n key={index}\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={`Action ${index + 1}`}\n >\n {action.icon}\n </button>\n ),\n )}\n\n <CopyToClipboardButton\n isHidden={!isHovering}\n isDisabled={isCopy}\n onClick={handleCopyToClipboard}\n mode={isCopy ? \"copied\" : \"copy\"}\n />\n </div>\n\n {renderedMessageContent}\n\n {canStopPendingMessage ? (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onStop?.();\n }}\n data-testid=\"chat-message-stop\"\n aria-label={t(I18nKey.BUTTON$STOP)}\n aria-hidden={!showStopButton}\n tabIndex={showStopButton ? 0 : -1}\n className={cn(\n \"group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150\",\n isSingleLinePendingMessage\n ? \"right-3 top-1/2 -translate-y-1/2\"\n : \"right-3 bottom-2.5\",\n showStopButton ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n >\n <PendingStopIcon className=\"block h-7 w-7 max-w-none\" />\n </button>\n ) : null}\n\n {isCollapsed ? (\n <button\n type=\"button\"\n data-testid=\"chat-message-expand\"\n aria-expanded={false}\n aria-label={t(I18nKey.COMMON$VIEW_MORE)}\n className=\"absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0\"\n onClick={() => setIsExpanded(true)}\n />\n ) : null}\n\n {children}\n </article>\n );\n\n if (type === \"user\" && pendingStatus === \"error\") {\n return (\n <div className=\"flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4\">\n {messageBubble}\n <div\n role=\"alert\"\n data-testid=\"chat-message-error\"\n className=\"flex items-center gap-2 text-xs text-[var(--oh-status-error)]\"\n >\n <span>{t(I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}</span>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-retry\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}\n </button>\n ) : null}\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-dismiss\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (type === \"user\" && pendingStatus === \"sending\") {\n return (\n <div className=\"flex w-full max-w-full flex-col last:mb-4\">\n {messageBubble}\n <div className=\"my-1 w-full py-1 text-sm\">\n <TextShimmer\n as=\"p\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"chat-message-sending\"\n className=\"block w-full text-sm font-normal\"\n duration={1}\n spread={2}\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)}\n </TextShimmer>\n </div>\n </div>\n );\n }\n\n return messageBubble;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-message.cjs","names":[],"sources":["../../../../src/components/features/chat/chat-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport type { SourceType } from \"#/types/agent-server/core/base/common\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { TextShimmer } from \"#/components/shared/text-shimmer\";\nimport { formatEventTimestamp } from \"#/utils/format-event-timestamp\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { PendingStopIcon } from \"./pending-stop-icon\";\nimport {\n UserMessageBody,\n chatBubbleMarkdownComponents,\n USER_MESSAGE_LINE_HEIGHT_PX,\n} from \"./user-message-body\";\n\nexport type ChatMessagePendingStatus = \"sending\" | \"error\";\n\ninterface ChatMessageProps {\n type: SourceType;\n message: string;\n actions?: Array<{\n icon: React.ReactNode;\n onClick: () => void;\n tooltip?: string;\n }>;\n isFromPlanningAgent?: boolean;\n pendingStatus?: ChatMessagePendingStatus;\n onRetry?: () => void;\n onDismiss?: () => void;\n onStop?: () => void;\n timestamp?: string;\n}\n\nexport function ChatMessage({\n type,\n message,\n children,\n actions,\n isFromPlanningAgent = false,\n pendingStatus,\n onRetry,\n onDismiss,\n onStop,\n timestamp,\n}: React.PropsWithChildren<ChatMessageProps>) {\n const { t, i18n } = useTranslation(\"openhands\");\n const [isHovering, setIsHovering] = React.useState(false);\n const [isCopy, setIsCopy] = React.useState(false);\n const [isExpanded, setIsExpanded] = React.useState(false);\n const [isTruncatable, setIsTruncatable] = React.useState(false);\n const [isSingleLinePendingMessage, setIsSingleLinePendingMessage] =\n React.useState(true);\n const pendingMessageContentRef = React.useRef<HTMLDivElement>(null);\n const timestampLabel = formatEventTimestamp(timestamp, i18n?.language);\n\n React.useEffect(() => {\n setIsExpanded(false);\n }, [message]);\n\n const handleCopyToClipboard = async () => {\n await navigator.clipboard.writeText(message);\n setIsCopy(true);\n };\n\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n\n if (isCopy) {\n timeout = setTimeout(() => {\n setIsCopy(false);\n }, 2000);\n }\n\n return () => {\n clearTimeout(timeout);\n };\n }, [isCopy]);\n\n const isPendingUserMessage =\n type === \"user\" &&\n (pendingStatus === \"error\" || pendingStatus === \"sending\");\n const canStopPendingMessage = pendingStatus === \"sending\" && onStop != null;\n const showStopButton = canStopPendingMessage && isHovering;\n const useTruncatedUserBody = type === \"user\" && pendingStatus == null;\n const isCollapsed = useTruncatedUserBody && isTruncatable && !isExpanded;\n const hasBubbleChildren = React.Children.count(children) > 0;\n\n React.useLayoutEffect(() => {\n if (!canStopPendingMessage || useTruncatedUserBody) {\n return undefined;\n }\n\n const content = pendingMessageContentRef.current;\n if (!content) {\n return undefined;\n }\n\n const measure = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n const linePx =\n Number.isFinite(lineHeight) && lineHeight > 0\n ? lineHeight\n : USER_MESSAGE_LINE_HEIGHT_PX;\n\n setIsSingleLinePendingMessage(content.scrollHeight <= linePx + 1);\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message, canStopPendingMessage, useTruncatedUserBody]);\n\n const messageContent = useTruncatedUserBody ? (\n <UserMessageBody\n message={message}\n isHovering={isHovering}\n isExpanded={isExpanded}\n onTruncatableChange={setIsTruncatable}\n />\n ) : (\n <div\n ref={pendingMessageContentRef}\n className=\"min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]\"\n >\n <MarkdownRenderer\n includeStandard\n includeHeadings\n allowHtml={type !== \"user\"}\n components={chatBubbleMarkdownComponents}\n >\n {message}\n </MarkdownRenderer>\n </div>\n );\n\n const renderedMessageContent = messageContent;\n\n const messageBubble = (\n <article\n data-testid={`${type}-message`}\n data-pending-status={pendingStatus}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n className={cn(\n \"rounded-xl relative w-fit max-w-full flex flex-col\",\n hasBubbleChildren && \"gap-2\",\n type === \"user\" && \"mt-6 bg-tertiary self-end px-4 py-2.5\",\n type === \"agent\" && \"mt-6 w-full max-w-full bg-transparent\",\n isFromPlanningAgent &&\n type === \"agent\" &&\n \"border border-[#597ff4] bg-tertiary p-4 mt-2\",\n pendingStatus === \"error\" &&\n \"border border-[var(--oh-status-error)]/40\",\n !isPendingUserMessage && \"last:mb-4\",\n )}\n >\n <div\n className={cn(\n \"absolute -top-2.5 -right-2.5 z-10\",\n !isHovering || pendingStatus === \"sending\" ? \"hidden\" : \"flex\",\n \"items-center gap-1\",\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {actions?.map((action, index) =>\n action.tooltip ? (\n <StyledTooltip key={index} content={action.tooltip} placement=\"top\">\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={action.tooltip}\n >\n {action.icon}\n </button>\n </StyledTooltip>\n ) : (\n <button\n key={index}\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={`Action ${index + 1}`}\n >\n {action.icon}\n </button>\n ),\n )}\n\n <CopyToClipboardButton\n isHidden={!isHovering}\n isDisabled={isCopy}\n onClick={handleCopyToClipboard}\n mode={isCopy ? \"copied\" : \"copy\"}\n />\n </div>\n\n {renderedMessageContent}\n\n {canStopPendingMessage ? (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onStop?.();\n }}\n data-testid=\"chat-message-stop\"\n aria-label={t(I18nKey.BUTTON$STOP)}\n aria-hidden={!showStopButton}\n tabIndex={showStopButton ? 0 : -1}\n className={cn(\n \"group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150\",\n isSingleLinePendingMessage\n ? \"right-3 top-1/2 -translate-y-1/2\"\n : \"right-3 bottom-2.5\",\n showStopButton ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n >\n <PendingStopIcon className=\"block h-7 w-7 max-w-none\" />\n </button>\n ) : null}\n\n {isCollapsed ? (\n <button\n type=\"button\"\n data-testid=\"chat-message-expand\"\n aria-expanded={false}\n aria-label={t(I18nKey.COMMON$VIEW_MORE)}\n className=\"absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0\"\n onClick={() => setIsExpanded(true)}\n />\n ) : null}\n\n {children}\n </article>\n );\n\n const messageBubbleWithTimestamp = timestampLabel ? (\n <StyledTooltip\n content={<time dateTime={timestamp}>{timestampLabel}</time>}\n placement=\"top\"\n isOpen={isHovering}\n >\n {messageBubble}\n </StyledTooltip>\n ) : (\n messageBubble\n );\n\n if (type === \"user\" && pendingStatus === \"error\") {\n return (\n <div className=\"flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4\">\n {messageBubbleWithTimestamp}\n <div\n role=\"alert\"\n data-testid=\"chat-message-error\"\n className=\"flex items-center gap-2 text-xs text-[var(--oh-status-error)]\"\n >\n <span>{t(I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}</span>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-retry\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}\n </button>\n ) : null}\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-dismiss\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (type === \"user\" && pendingStatus === \"sending\") {\n return (\n <div className=\"flex w-full max-w-full flex-col last:mb-4\">\n {messageBubbleWithTimestamp}\n <div className=\"my-1 w-full py-1 text-sm\">\n <TextShimmer\n as=\"p\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"chat-message-sending\"\n className=\"block w-full text-sm font-normal\"\n duration={1}\n spread={2}\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)}\n </TextShimmer>\n </div>\n </div>\n );\n }\n\n return messageBubbleWithTimestamp;\n}\n"],"mappings":"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"}
@@ -14,6 +14,7 @@ interface ChatMessageProps {
14
14
  onRetry?: () => void;
15
15
  onDismiss?: () => void;
16
16
  onStop?: () => void;
17
+ timestamp?: string;
17
18
  }
18
- export declare function ChatMessage({ type, message, children, actions, isFromPlanningAgent, pendingStatus, onRetry, onDismiss, onStop, }: React.PropsWithChildren<ChatMessageProps>): React.JSX.Element;
19
+ export declare function ChatMessage({ type, message, children, actions, isFromPlanningAgent, pendingStatus, onRetry, onDismiss, onStop, timestamp, }: React.PropsWithChildren<ChatMessageProps>): React.JSX.Element;
19
20
  export {};
@@ -4,146 +4,155 @@ import { cn as n } from "../../../utils/utils.js";
4
4
  import { CopyToClipboardButton as r } from "../../shared/buttons/copy-to-clipboard-button.js";
5
5
  import { MarkdownRenderer as i } from "../markdown/markdown-renderer.js";
6
6
  import { StyledTooltip as a } from "../../shared/buttons/styled-tooltip.js";
7
- import { TextShimmer as o } from "../../shared/text-shimmer.js";
8
- import { PendingStopIcon as s } from "./pending-stop-icon.js";
9
- import { UserMessageBody as c, chatBubbleMarkdownComponents as l } from "./user-message-body.js";
10
- import u from "react";
11
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
+ import { formatEventTimestamp as o } from "../../../utils/format-event-timestamp.js";
8
+ import { TextShimmer as s } from "../../shared/text-shimmer.js";
9
+ import { PendingStopIcon as c } from "./pending-stop-icon.js";
10
+ import { UserMessageBody as l, chatBubbleMarkdownComponents as u } from "./user-message-body.js";
11
+ import d from "react";
12
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
12
13
  //#region src/components/features/chat/chat-message.tsx
13
- function p({ type: p, message: m, children: h, actions: g, isFromPlanningAgent: _ = !1, pendingStatus: v, onRetry: y, onDismiss: b, onStop: x }) {
14
- let { t: S } = e("openhands"), [C, w] = u.useState(!1), [T, E] = u.useState(!1), [D, O] = u.useState(!1), [k, A] = u.useState(!1), [j, M] = u.useState(!0), N = u.useRef(null);
15
- u.useEffect(() => {
16
- O(!1);
17
- }, [m]);
18
- let P = async () => {
19
- await navigator.clipboard.writeText(m), E(!0);
14
+ function m({ type: m, message: h, children: g, actions: _, isFromPlanningAgent: v = !1, pendingStatus: y, onRetry: b, onDismiss: x, onStop: S, timestamp: C }) {
15
+ let { t: w, i18n: T } = e("openhands"), [E, D] = d.useState(!1), [O, k] = d.useState(!1), [A, j] = d.useState(!1), [M, N] = d.useState(!1), [P, F] = d.useState(!0), I = d.useRef(null), L = o(C, T?.language);
16
+ d.useEffect(() => {
17
+ j(!1);
18
+ }, [h]);
19
+ let R = async () => {
20
+ await navigator.clipboard.writeText(h), k(!0);
20
21
  };
21
- u.useEffect(() => {
22
+ d.useEffect(() => {
22
23
  let e;
23
- return T && (e = setTimeout(() => {
24
- E(!1);
24
+ return O && (e = setTimeout(() => {
25
+ k(!1);
25
26
  }, 2e3)), () => {
26
27
  clearTimeout(e);
27
28
  };
28
- }, [T]);
29
- let F = p === "user" && (v === "error" || v === "sending"), I = v === "sending" && x != null, L = I && C, R = p === "user" && v == null, z = R && k && !D, B = u.Children.count(h) > 0;
30
- u.useLayoutEffect(() => {
31
- if (!I || R) return;
32
- let e = N.current;
29
+ }, [O]);
30
+ let z = m === "user" && (y === "error" || y === "sending"), B = y === "sending" && S != null, V = B && E, H = m === "user" && y == null, U = H && M && !A, W = d.Children.count(g) > 0;
31
+ d.useLayoutEffect(() => {
32
+ if (!B || H) return;
33
+ let e = I.current;
33
34
  if (!e) return;
34
35
  let t = () => {
35
36
  let t = Number.parseFloat(getComputedStyle(e).lineHeight), n = Number.isFinite(t) && t > 0 ? t : 24;
36
- M(e.scrollHeight <= n + 1);
37
+ F(e.scrollHeight <= n + 1);
37
38
  };
38
39
  t();
39
40
  let n = new ResizeObserver(t);
40
41
  return n.observe(e), () => n.disconnect();
41
42
  }, [
42
- m,
43
- I,
44
- R
43
+ h,
44
+ B,
45
+ H
45
46
  ]);
46
- let V = R ? /* @__PURE__ */ d(c, {
47
- message: m,
48
- isHovering: C,
49
- isExpanded: D,
50
- onTruncatableChange: A
51
- }) : /* @__PURE__ */ d("div", {
52
- ref: N,
47
+ let G = H ? /* @__PURE__ */ f(l, {
48
+ message: h,
49
+ isHovering: E,
50
+ isExpanded: A,
51
+ onTruncatableChange: N
52
+ }) : /* @__PURE__ */ f("div", {
53
+ ref: I,
53
54
  className: "min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]",
54
- children: /* @__PURE__ */ d(i, {
55
+ children: /* @__PURE__ */ f(i, {
55
56
  includeStandard: !0,
56
57
  includeHeadings: !0,
57
- allowHtml: p !== "user",
58
- components: l,
59
- children: m
58
+ allowHtml: m !== "user",
59
+ components: u,
60
+ children: h
60
61
  })
61
- }), H = /* @__PURE__ */ f("article", {
62
- "data-testid": `${p}-message`,
63
- "data-pending-status": v,
64
- onMouseEnter: () => w(!0),
65
- onMouseLeave: () => w(!1),
66
- className: n("rounded-xl relative w-fit max-w-full flex flex-col", B && "gap-2", p === "user" && "mt-6 bg-tertiary self-end px-4 py-2.5", p === "agent" && "mt-6 w-full max-w-full bg-transparent", _ && p === "agent" && "border border-[#597ff4] bg-tertiary p-4 mt-2", v === "error" && "border border-[var(--oh-status-error)]/40", !F && "last:mb-4"),
62
+ }), K = /* @__PURE__ */ p("article", {
63
+ "data-testid": `${m}-message`,
64
+ "data-pending-status": y,
65
+ onMouseEnter: () => D(!0),
66
+ onMouseLeave: () => D(!1),
67
+ className: n("rounded-xl relative w-fit max-w-full flex flex-col", W && "gap-2", m === "user" && "mt-6 bg-tertiary self-end px-4 py-2.5", m === "agent" && "mt-6 w-full max-w-full bg-transparent", v && m === "agent" && "border border-[#597ff4] bg-tertiary p-4 mt-2", y === "error" && "border border-[var(--oh-status-error)]/40", !z && "last:mb-4"),
67
68
  children: [
68
- /* @__PURE__ */ f("div", {
69
- className: n("absolute -top-2.5 -right-2.5 z-10", !C || v === "sending" ? "hidden" : "flex", "items-center gap-1"),
69
+ /* @__PURE__ */ p("div", {
70
+ className: n("absolute -top-2.5 -right-2.5 z-10", !E || y === "sending" ? "hidden" : "flex", "items-center gap-1"),
70
71
  onClick: (e) => e.stopPropagation(),
71
- children: [g?.map((e, t) => e.tooltip ? /* @__PURE__ */ d(a, {
72
+ children: [_?.map((e, t) => e.tooltip ? /* @__PURE__ */ f(a, {
72
73
  content: e.tooltip,
73
74
  placement: "top",
74
- children: /* @__PURE__ */ d("button", {
75
+ children: /* @__PURE__ */ f("button", {
75
76
  type: "button",
76
77
  onClick: e.onClick,
77
78
  className: "button-base p-1 cursor-pointer",
78
79
  "aria-label": e.tooltip,
79
80
  children: e.icon
80
81
  })
81
- }, t) : /* @__PURE__ */ d("button", {
82
+ }, t) : /* @__PURE__ */ f("button", {
82
83
  type: "button",
83
84
  onClick: e.onClick,
84
85
  className: "button-base p-1 cursor-pointer",
85
86
  "aria-label": `Action ${t + 1}`,
86
87
  children: e.icon
87
- }, t)), /* @__PURE__ */ d(r, {
88
- isHidden: !C,
89
- isDisabled: T,
90
- onClick: P,
91
- mode: T ? "copied" : "copy"
88
+ }, t)), /* @__PURE__ */ f(r, {
89
+ isHidden: !E,
90
+ isDisabled: O,
91
+ onClick: R,
92
+ mode: O ? "copied" : "copy"
92
93
  })]
93
94
  }),
94
- V,
95
- I ? /* @__PURE__ */ d("button", {
95
+ G,
96
+ B ? /* @__PURE__ */ f("button", {
96
97
  type: "button",
97
98
  onClick: (e) => {
98
- e.stopPropagation(), x?.();
99
+ e.stopPropagation(), S?.();
99
100
  },
100
101
  "data-testid": "chat-message-stop",
101
- "aria-label": S(t.BUTTON$STOP),
102
- "aria-hidden": !L,
103
- tabIndex: L ? 0 : -1,
104
- className: n("group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150", j ? "right-3 top-1/2 -translate-y-1/2" : "right-3 bottom-2.5", L ? "opacity-100" : "pointer-events-none opacity-0"),
105
- children: /* @__PURE__ */ d(s, { className: "block h-7 w-7 max-w-none" })
102
+ "aria-label": w(t.BUTTON$STOP),
103
+ "aria-hidden": !V,
104
+ tabIndex: V ? 0 : -1,
105
+ className: n("group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150", P ? "right-3 top-1/2 -translate-y-1/2" : "right-3 bottom-2.5", V ? "opacity-100" : "pointer-events-none opacity-0"),
106
+ children: /* @__PURE__ */ f(c, { className: "block h-7 w-7 max-w-none" })
106
107
  }) : null,
107
- z ? /* @__PURE__ */ d("button", {
108
+ U ? /* @__PURE__ */ f("button", {
108
109
  type: "button",
109
110
  "data-testid": "chat-message-expand",
110
111
  "aria-expanded": !1,
111
- "aria-label": S(t.COMMON$VIEW_MORE),
112
+ "aria-label": w(t.COMMON$VIEW_MORE),
112
113
  className: "absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0",
113
- onClick: () => O(!0)
114
+ onClick: () => j(!0)
114
115
  }) : null,
115
- h
116
+ g
116
117
  ]
117
- });
118
- return p === "user" && v === "error" ? /* @__PURE__ */ f("div", {
118
+ }), q = L ? /* @__PURE__ */ f(a, {
119
+ content: /* @__PURE__ */ f("time", {
120
+ dateTime: C,
121
+ children: L
122
+ }),
123
+ placement: "top",
124
+ isOpen: E,
125
+ children: K
126
+ }) : K;
127
+ return m === "user" && y === "error" ? /* @__PURE__ */ p("div", {
119
128
  className: "flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4",
120
- children: [H, /* @__PURE__ */ f("div", {
129
+ children: [q, /* @__PURE__ */ p("div", {
121
130
  role: "alert",
122
131
  "data-testid": "chat-message-error",
123
132
  className: "flex items-center gap-2 text-xs text-[var(--oh-status-error)]",
124
133
  children: [
125
- /* @__PURE__ */ d("span", { children: S(t.CHAT_INTERFACE$MESSAGE_SEND_FAILED) }),
126
- y ? /* @__PURE__ */ d("button", {
134
+ /* @__PURE__ */ f("span", { children: w(t.CHAT_INTERFACE$MESSAGE_SEND_FAILED) }),
135
+ b ? /* @__PURE__ */ f("button", {
127
136
  type: "button",
128
- onClick: y,
137
+ onClick: b,
129
138
  className: "cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]",
130
139
  "data-testid": "chat-message-retry",
131
- children: S(t.CHAT_INTERFACE$MESSAGE_RETRY)
140
+ children: w(t.CHAT_INTERFACE$MESSAGE_RETRY)
132
141
  }) : null,
133
- b ? /* @__PURE__ */ d("button", {
142
+ x ? /* @__PURE__ */ f("button", {
134
143
  type: "button",
135
- onClick: b,
144
+ onClick: x,
136
145
  className: "cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]",
137
146
  "data-testid": "chat-message-dismiss",
138
- children: S(t.CHAT_INTERFACE$MESSAGE_DISMISS)
147
+ children: w(t.CHAT_INTERFACE$MESSAGE_DISMISS)
139
148
  }) : null
140
149
  ]
141
150
  })]
142
- }) : p === "user" && v === "sending" ? /* @__PURE__ */ f("div", {
151
+ }) : m === "user" && y === "sending" ? /* @__PURE__ */ p("div", {
143
152
  className: "flex w-full max-w-full flex-col last:mb-4",
144
- children: [H, /* @__PURE__ */ d("div", {
153
+ children: [q, /* @__PURE__ */ f("div", {
145
154
  className: "my-1 w-full py-1 text-sm",
146
- children: /* @__PURE__ */ d(o, {
155
+ children: /* @__PURE__ */ f(s, {
147
156
  as: "p",
148
157
  role: "status",
149
158
  "aria-live": "polite",
@@ -151,12 +160,12 @@ function p({ type: p, message: m, children: h, actions: g, isFromPlanningAgent:
151
160
  className: "block w-full text-sm font-normal",
152
161
  duration: 1,
153
162
  spread: 2,
154
- children: S(t.CHAT_INTERFACE$MESSAGE_SENDING)
163
+ children: w(t.CHAT_INTERFACE$MESSAGE_SENDING)
155
164
  })
156
165
  })]
157
- }) : H;
166
+ }) : q;
158
167
  }
159
168
  //#endregion
160
- export { p as ChatMessage };
169
+ export { m as ChatMessage };
161
170
 
162
171
  //# sourceMappingURL=chat-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message.js","names":[],"sources":["../../../../src/components/features/chat/chat-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport type { SourceType } from \"#/types/agent-server/core/base/common\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { TextShimmer } from \"#/components/shared/text-shimmer\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { PendingStopIcon } from \"./pending-stop-icon\";\nimport {\n UserMessageBody,\n chatBubbleMarkdownComponents,\n USER_MESSAGE_LINE_HEIGHT_PX,\n} from \"./user-message-body\";\n\nexport type ChatMessagePendingStatus = \"sending\" | \"error\";\n\ninterface ChatMessageProps {\n type: SourceType;\n message: string;\n actions?: Array<{\n icon: React.ReactNode;\n onClick: () => void;\n tooltip?: string;\n }>;\n isFromPlanningAgent?: boolean;\n pendingStatus?: ChatMessagePendingStatus;\n onRetry?: () => void;\n onDismiss?: () => void;\n onStop?: () => void;\n}\n\nexport function ChatMessage({\n type,\n message,\n children,\n actions,\n isFromPlanningAgent = false,\n pendingStatus,\n onRetry,\n onDismiss,\n onStop,\n}: React.PropsWithChildren<ChatMessageProps>) {\n const { t } = useTranslation(\"openhands\");\n const [isHovering, setIsHovering] = React.useState(false);\n const [isCopy, setIsCopy] = React.useState(false);\n const [isExpanded, setIsExpanded] = React.useState(false);\n const [isTruncatable, setIsTruncatable] = React.useState(false);\n const [isSingleLinePendingMessage, setIsSingleLinePendingMessage] =\n React.useState(true);\n const pendingMessageContentRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n setIsExpanded(false);\n }, [message]);\n\n const handleCopyToClipboard = async () => {\n await navigator.clipboard.writeText(message);\n setIsCopy(true);\n };\n\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n\n if (isCopy) {\n timeout = setTimeout(() => {\n setIsCopy(false);\n }, 2000);\n }\n\n return () => {\n clearTimeout(timeout);\n };\n }, [isCopy]);\n\n const isPendingUserMessage =\n type === \"user\" &&\n (pendingStatus === \"error\" || pendingStatus === \"sending\");\n const canStopPendingMessage = pendingStatus === \"sending\" && onStop != null;\n const showStopButton = canStopPendingMessage && isHovering;\n const useTruncatedUserBody = type === \"user\" && pendingStatus == null;\n const isCollapsed = useTruncatedUserBody && isTruncatable && !isExpanded;\n const hasBubbleChildren = React.Children.count(children) > 0;\n\n React.useLayoutEffect(() => {\n if (!canStopPendingMessage || useTruncatedUserBody) {\n return undefined;\n }\n\n const content = pendingMessageContentRef.current;\n if (!content) {\n return undefined;\n }\n\n const measure = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n const linePx =\n Number.isFinite(lineHeight) && lineHeight > 0\n ? lineHeight\n : USER_MESSAGE_LINE_HEIGHT_PX;\n\n setIsSingleLinePendingMessage(content.scrollHeight <= linePx + 1);\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message, canStopPendingMessage, useTruncatedUserBody]);\n\n const messageContent = useTruncatedUserBody ? (\n <UserMessageBody\n message={message}\n isHovering={isHovering}\n isExpanded={isExpanded}\n onTruncatableChange={setIsTruncatable}\n />\n ) : (\n <div\n ref={pendingMessageContentRef}\n className=\"min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]\"\n >\n <MarkdownRenderer\n includeStandard\n includeHeadings\n allowHtml={type !== \"user\"}\n components={chatBubbleMarkdownComponents}\n >\n {message}\n </MarkdownRenderer>\n </div>\n );\n\n const renderedMessageContent = messageContent;\n\n const messageBubble = (\n <article\n data-testid={`${type}-message`}\n data-pending-status={pendingStatus}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n className={cn(\n \"rounded-xl relative w-fit max-w-full flex flex-col\",\n hasBubbleChildren && \"gap-2\",\n type === \"user\" && \"mt-6 bg-tertiary self-end px-4 py-2.5\",\n type === \"agent\" && \"mt-6 w-full max-w-full bg-transparent\",\n isFromPlanningAgent &&\n type === \"agent\" &&\n \"border border-[#597ff4] bg-tertiary p-4 mt-2\",\n pendingStatus === \"error\" &&\n \"border border-[var(--oh-status-error)]/40\",\n !isPendingUserMessage && \"last:mb-4\",\n )}\n >\n <div\n className={cn(\n \"absolute -top-2.5 -right-2.5 z-10\",\n !isHovering || pendingStatus === \"sending\" ? \"hidden\" : \"flex\",\n \"items-center gap-1\",\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {actions?.map((action, index) =>\n action.tooltip ? (\n <StyledTooltip key={index} content={action.tooltip} placement=\"top\">\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={action.tooltip}\n >\n {action.icon}\n </button>\n </StyledTooltip>\n ) : (\n <button\n key={index}\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={`Action ${index + 1}`}\n >\n {action.icon}\n </button>\n ),\n )}\n\n <CopyToClipboardButton\n isHidden={!isHovering}\n isDisabled={isCopy}\n onClick={handleCopyToClipboard}\n mode={isCopy ? \"copied\" : \"copy\"}\n />\n </div>\n\n {renderedMessageContent}\n\n {canStopPendingMessage ? (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onStop?.();\n }}\n data-testid=\"chat-message-stop\"\n aria-label={t(I18nKey.BUTTON$STOP)}\n aria-hidden={!showStopButton}\n tabIndex={showStopButton ? 0 : -1}\n className={cn(\n \"group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150\",\n isSingleLinePendingMessage\n ? \"right-3 top-1/2 -translate-y-1/2\"\n : \"right-3 bottom-2.5\",\n showStopButton ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n >\n <PendingStopIcon className=\"block h-7 w-7 max-w-none\" />\n </button>\n ) : null}\n\n {isCollapsed ? (\n <button\n type=\"button\"\n data-testid=\"chat-message-expand\"\n aria-expanded={false}\n aria-label={t(I18nKey.COMMON$VIEW_MORE)}\n className=\"absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0\"\n onClick={() => setIsExpanded(true)}\n />\n ) : null}\n\n {children}\n </article>\n );\n\n if (type === \"user\" && pendingStatus === \"error\") {\n return (\n <div className=\"flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4\">\n {messageBubble}\n <div\n role=\"alert\"\n data-testid=\"chat-message-error\"\n className=\"flex items-center gap-2 text-xs text-[var(--oh-status-error)]\"\n >\n <span>{t(I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}</span>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-retry\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}\n </button>\n ) : null}\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-dismiss\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (type === \"user\" && pendingStatus === \"sending\") {\n return (\n <div className=\"flex w-full max-w-full flex-col last:mb-4\">\n {messageBubble}\n <div className=\"my-1 w-full py-1 text-sm\">\n <TextShimmer\n as=\"p\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"chat-message-sending\"\n className=\"block w-full text-sm font-normal\"\n duration={1}\n spread={2}\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)}\n </TextShimmer>\n </div>\n </div>\n );\n }\n\n return messageBubble;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-message.js","names":[],"sources":["../../../../src/components/features/chat/chat-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport type { SourceType } from \"#/types/agent-server/core/base/common\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { TextShimmer } from \"#/components/shared/text-shimmer\";\nimport { formatEventTimestamp } from \"#/utils/format-event-timestamp\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { PendingStopIcon } from \"./pending-stop-icon\";\nimport {\n UserMessageBody,\n chatBubbleMarkdownComponents,\n USER_MESSAGE_LINE_HEIGHT_PX,\n} from \"./user-message-body\";\n\nexport type ChatMessagePendingStatus = \"sending\" | \"error\";\n\ninterface ChatMessageProps {\n type: SourceType;\n message: string;\n actions?: Array<{\n icon: React.ReactNode;\n onClick: () => void;\n tooltip?: string;\n }>;\n isFromPlanningAgent?: boolean;\n pendingStatus?: ChatMessagePendingStatus;\n onRetry?: () => void;\n onDismiss?: () => void;\n onStop?: () => void;\n timestamp?: string;\n}\n\nexport function ChatMessage({\n type,\n message,\n children,\n actions,\n isFromPlanningAgent = false,\n pendingStatus,\n onRetry,\n onDismiss,\n onStop,\n timestamp,\n}: React.PropsWithChildren<ChatMessageProps>) {\n const { t, i18n } = useTranslation(\"openhands\");\n const [isHovering, setIsHovering] = React.useState(false);\n const [isCopy, setIsCopy] = React.useState(false);\n const [isExpanded, setIsExpanded] = React.useState(false);\n const [isTruncatable, setIsTruncatable] = React.useState(false);\n const [isSingleLinePendingMessage, setIsSingleLinePendingMessage] =\n React.useState(true);\n const pendingMessageContentRef = React.useRef<HTMLDivElement>(null);\n const timestampLabel = formatEventTimestamp(timestamp, i18n?.language);\n\n React.useEffect(() => {\n setIsExpanded(false);\n }, [message]);\n\n const handleCopyToClipboard = async () => {\n await navigator.clipboard.writeText(message);\n setIsCopy(true);\n };\n\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n\n if (isCopy) {\n timeout = setTimeout(() => {\n setIsCopy(false);\n }, 2000);\n }\n\n return () => {\n clearTimeout(timeout);\n };\n }, [isCopy]);\n\n const isPendingUserMessage =\n type === \"user\" &&\n (pendingStatus === \"error\" || pendingStatus === \"sending\");\n const canStopPendingMessage = pendingStatus === \"sending\" && onStop != null;\n const showStopButton = canStopPendingMessage && isHovering;\n const useTruncatedUserBody = type === \"user\" && pendingStatus == null;\n const isCollapsed = useTruncatedUserBody && isTruncatable && !isExpanded;\n const hasBubbleChildren = React.Children.count(children) > 0;\n\n React.useLayoutEffect(() => {\n if (!canStopPendingMessage || useTruncatedUserBody) {\n return undefined;\n }\n\n const content = pendingMessageContentRef.current;\n if (!content) {\n return undefined;\n }\n\n const measure = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n const linePx =\n Number.isFinite(lineHeight) && lineHeight > 0\n ? lineHeight\n : USER_MESSAGE_LINE_HEIGHT_PX;\n\n setIsSingleLinePendingMessage(content.scrollHeight <= linePx + 1);\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message, canStopPendingMessage, useTruncatedUserBody]);\n\n const messageContent = useTruncatedUserBody ? (\n <UserMessageBody\n message={message}\n isHovering={isHovering}\n isExpanded={isExpanded}\n onTruncatableChange={setIsTruncatable}\n />\n ) : (\n <div\n ref={pendingMessageContentRef}\n className=\"min-w-0 text-sm leading-6 whitespace-normal [word-break:break-word]\"\n >\n <MarkdownRenderer\n includeStandard\n includeHeadings\n allowHtml={type !== \"user\"}\n components={chatBubbleMarkdownComponents}\n >\n {message}\n </MarkdownRenderer>\n </div>\n );\n\n const renderedMessageContent = messageContent;\n\n const messageBubble = (\n <article\n data-testid={`${type}-message`}\n data-pending-status={pendingStatus}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n className={cn(\n \"rounded-xl relative w-fit max-w-full flex flex-col\",\n hasBubbleChildren && \"gap-2\",\n type === \"user\" && \"mt-6 bg-tertiary self-end px-4 py-2.5\",\n type === \"agent\" && \"mt-6 w-full max-w-full bg-transparent\",\n isFromPlanningAgent &&\n type === \"agent\" &&\n \"border border-[#597ff4] bg-tertiary p-4 mt-2\",\n pendingStatus === \"error\" &&\n \"border border-[var(--oh-status-error)]/40\",\n !isPendingUserMessage && \"last:mb-4\",\n )}\n >\n <div\n className={cn(\n \"absolute -top-2.5 -right-2.5 z-10\",\n !isHovering || pendingStatus === \"sending\" ? \"hidden\" : \"flex\",\n \"items-center gap-1\",\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {actions?.map((action, index) =>\n action.tooltip ? (\n <StyledTooltip key={index} content={action.tooltip} placement=\"top\">\n <button\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={action.tooltip}\n >\n {action.icon}\n </button>\n </StyledTooltip>\n ) : (\n <button\n key={index}\n type=\"button\"\n onClick={action.onClick}\n className=\"button-base p-1 cursor-pointer\"\n aria-label={`Action ${index + 1}`}\n >\n {action.icon}\n </button>\n ),\n )}\n\n <CopyToClipboardButton\n isHidden={!isHovering}\n isDisabled={isCopy}\n onClick={handleCopyToClipboard}\n mode={isCopy ? \"copied\" : \"copy\"}\n />\n </div>\n\n {renderedMessageContent}\n\n {canStopPendingMessage ? (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onStop?.();\n }}\n data-testid=\"chat-message-stop\"\n aria-label={t(I18nKey.BUTTON$STOP)}\n aria-hidden={!showStopButton}\n tabIndex={showStopButton ? 0 : -1}\n className={cn(\n \"group absolute z-10 inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded-full bg-[var(--oh-color-tertiary)] text-[var(--oh-foreground)] transition-opacity duration-150\",\n isSingleLinePendingMessage\n ? \"right-3 top-1/2 -translate-y-1/2\"\n : \"right-3 bottom-2.5\",\n showStopButton ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n >\n <PendingStopIcon className=\"block h-7 w-7 max-w-none\" />\n </button>\n ) : null}\n\n {isCollapsed ? (\n <button\n type=\"button\"\n data-testid=\"chat-message-expand\"\n aria-expanded={false}\n aria-label={t(I18nKey.COMMON$VIEW_MORE)}\n className=\"absolute inset-0 z-[1] cursor-pointer rounded-xl border-0 bg-transparent p-0\"\n onClick={() => setIsExpanded(true)}\n />\n ) : null}\n\n {children}\n </article>\n );\n\n const messageBubbleWithTimestamp = timestampLabel ? (\n <StyledTooltip\n content={<time dateTime={timestamp}>{timestampLabel}</time>}\n placement=\"top\"\n isOpen={isHovering}\n >\n {messageBubble}\n </StyledTooltip>\n ) : (\n messageBubble\n );\n\n if (type === \"user\" && pendingStatus === \"error\") {\n return (\n <div className=\"flex w-fit max-w-full flex-col items-end gap-1.5 self-end last:mb-4\">\n {messageBubbleWithTimestamp}\n <div\n role=\"alert\"\n data-testid=\"chat-message-error\"\n className=\"flex items-center gap-2 text-xs text-[var(--oh-status-error)]\"\n >\n <span>{t(I18nKey.CHAT_INTERFACE$MESSAGE_SEND_FAILED)}</span>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-retry\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_RETRY)}\n </button>\n ) : null}\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"cursor-pointer rounded-md border border-[var(--oh-border)] px-2 py-1 text-xs font-normal text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\"\n data-testid=\"chat-message-dismiss\"\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_DISMISS)}\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (type === \"user\" && pendingStatus === \"sending\") {\n return (\n <div className=\"flex w-full max-w-full flex-col last:mb-4\">\n {messageBubbleWithTimestamp}\n <div className=\"my-1 w-full py-1 text-sm\">\n <TextShimmer\n as=\"p\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"chat-message-sending\"\n className=\"block w-full text-sm font-normal\"\n duration={1}\n spread={2}\n >\n {t(I18nKey.CHAT_INTERFACE$MESSAGE_SENDING)}\n </TextShimmer>\n </div>\n </div>\n );\n }\n\n return messageBubbleWithTimestamp;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../node_modules/lucide-react/dist/esm/icons/gauge.cjs"),i=require("../../../../node_modules/lucide-react/dist/esm/icons/loader-circle.cjs"),a=require("../../../../node_modules/lucide-react/dist/esm/icons/minimize.cjs"),o=require("../../../../utils/utils.cjs"),s=require("../../../../utils/form-control-classes.cjs"),c=require("../../../shared/buttons/styled-tooltip.cjs"),l=require("../../context-menu/context-menu-list-item.cjs"),u=require("../../../../hooks/use-click-outside-element.cjs"),d=require("../../../../ui/divider.cjs"),f=require("../../../../hooks/use-select-conversation-tab.cjs"),p=require("../../../../hooks/use-context-window-usage.cjs"),m=require("../../../../utils/format-token-count.cjs"),h=require("../../../../hooks/use-compact-context-action.cjs"),g=require("../../conversation/conversation-name-context-menu-icon-text.cjs"),_=require("../../conversation/usage-panel/context-meter.cjs"),v=require("./context-window-ring.cjs");let y=require("react");y=e.__toESM(y,1);let b=require("react/jsx-runtime");var x={neutral:`bg-foreground`,warning:`bg-amber-500`,danger:`bg-red-500`},S={neutral:`text-[var(--oh-muted)]`,warning:`text-amber-500`,danger:`text-red-500`};function C(){let{t:e}=t.useTranslation(`openhands`),C=p.useContextWindowUsage(),{navigateToTab:w}=f.useSelectConversationTab(),[T,E]=y.default.useState(!1),D=y.default.useRef(null),O=u.useClickOutsideElement(()=>E(!1),D),{handleCompact:k,isCompacting:A,isDisabled:j}=h.useCompactContextAction(C?.perTurnToken??0);if(!C)return null;let M=m.getContextWindowUsagePercentage(C.perTurnToken,C.contextWindow),N=Math.round(M),P=Math.max(0,100-N),F=`${N}% ${e(n.I18nKey.CONVERSATION$USED)} (${P}% ${e(n.I18nKey.CONVERSATION$LEFT)})`,I=`${m.formatCompactTokenCount(C.perTurnToken)} / ${m.formatCompactTokenCount(C.contextWindow)}`,L=_.getContextFillTone(M),R=()=>{E(!1),w(`usage`)};return(0,b.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,b.jsx)(c.StyledTooltip,{content:e(n.I18nKey.CHAT_INTERFACE$SHOW_CONTEXT),placement:`top`,children:(0,b.jsx)(`button`,{ref:D,type:`button`,className:o.cn(s.chatInputIconButtonClassName,`size-8`),"aria-label":`${e(n.I18nKey.CHAT_INTERFACE$CONTEXT_WINDOW_METER_LABEL)}: ${F}`,"aria-expanded":T,"aria-haspopup":`dialog`,"data-testid":`context-window-meter`,onClick:e=>{e.preventDefault(),e.stopPropagation(),E(e=>!e)},children:(0,b.jsx)(v.ContextWindowRing,{percentage:M})})}),T&&(0,b.jsxs)(`div`,{ref:O,"data-testid":`context-window-meter-popover`,className:o.cn(`absolute bottom-full right-0 z-[60] mb-2 w-[280px]`,`flex flex-col gap-0.5 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 shadow-lg`),children:[(0,b.jsxs)(`div`,{className:`flex flex-col gap-2 px-2 py-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2 text-sm`,children:[(0,b.jsx)(`span`,{className:`font-semibold text-[var(--oh-foreground)]`,children:e(n.I18nKey.CONVERSATION$CONTEXT_WINDOW)}),(0,b.jsx)(`span`,{className:o.cn(`shrink-0 text-xs`,S[L]),children:F})]}),(0,b.jsx)(`button`,{type:`button`,"data-testid":`context-window-meter-bar-button`,className:`relative h-1.5 w-full rounded-full cursor-pointer`,style:{backgroundColor:v.CONTEXT_WINDOW_TRACK_COLOR},"aria-label":e(n.I18nKey.COMMON$USAGE),onClick:e=>{e.preventDefault(),e.stopPropagation(),R()},children:(0,b.jsx)(`span`,{className:o.cn(`absolute inset-y-0 left-0 rounded-full transition-all duration-300`,x[L]),style:{width:`${Math.min(100,M)}%`}})}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`button`,{type:`button`,"data-testid":`context-window-compact-button`,disabled:j,"aria-busy":A,"aria-label":e(n.I18nKey.CONVERSATION$COMPACT_CONTEXT),className:o.cn(`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs`,`text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-[var(--oh-foreground)]`,`transition-colors disabled:cursor-not-allowed disabled:opacity-50`),onClick:e=>{e.preventDefault(),e.stopPropagation(),k()},children:[A?(0,b.jsx)(i.LoaderCircle,{className:`size-3 animate-spin`,"aria-hidden":!0}):(0,b.jsx)(a.Minimize,{className:`size-3`,"aria-hidden":!0}),(0,b.jsx)(`span`,{children:e(n.I18nKey.CONVERSATION$COMPACT_CONTEXT)})]}),(0,b.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,children:I})]})]}),(0,b.jsx)(d.Divider,{inset:`menu`}),(0,b.jsx)(l.ContextMenuListItem,{testId:`context-window-plan-usage`,onClick:e=>{e.preventDefault(),e.stopPropagation(),R()},children:(0,b.jsx)(g.ConversationNameContextMenuIconText,{icon:(0,b.jsx)(r.Gauge,{size:16}),text:e(n.I18nKey.COMMON$USAGE)})})]})]})}exports.ContextWindowMeter=C;
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../node_modules/lucide-react/dist/esm/icons/gauge.cjs"),i=require("../../../../node_modules/lucide-react/dist/esm/icons/loader-circle.cjs"),a=require("../../../../node_modules/lucide-react/dist/esm/icons/minimize.cjs"),o=require("../../../../utils/utils.cjs"),s=require("../../../shared/buttons/styled-tooltip.cjs"),c=require("../../../../utils/form-control-classes.cjs"),l=require("../../context-menu/context-menu-list-item.cjs"),u=require("../../../../hooks/use-click-outside-element.cjs"),d=require("../../../../ui/divider.cjs"),f=require("../../../../hooks/use-select-conversation-tab.cjs"),p=require("../../../../hooks/use-context-window-usage.cjs"),m=require("../../../../utils/format-token-count.cjs"),h=require("../../../../hooks/use-compact-context-action.cjs"),g=require("../../conversation/conversation-name-context-menu-icon-text.cjs"),_=require("../../conversation/usage-panel/context-meter.cjs"),v=require("./context-window-ring.cjs");let y=require("react");y=e.__toESM(y,1);let b=require("react/jsx-runtime");var x={neutral:`bg-foreground`,warning:`bg-amber-500`,danger:`bg-red-500`},S={neutral:`text-[var(--oh-muted)]`,warning:`text-amber-500`,danger:`text-red-500`};function C(){let{t:e}=t.useTranslation(`openhands`),C=p.useContextWindowUsage(),{navigateToTab:w}=f.useSelectConversationTab(),[T,E]=y.default.useState(!1),D=y.default.useRef(null),O=u.useClickOutsideElement(()=>E(!1),D),{handleCompact:k,isCompacting:A,isDisabled:j}=h.useCompactContextAction(C?.perTurnToken??0);if(!C)return null;let M=m.getContextWindowUsagePercentage(C.perTurnToken,C.contextWindow),N=Math.round(M),P=Math.max(0,100-N),F=`${N}% ${e(n.I18nKey.CONVERSATION$USED)} (${P}% ${e(n.I18nKey.CONVERSATION$LEFT)})`,I=`${m.formatCompactTokenCount(C.perTurnToken)} / ${m.formatCompactTokenCount(C.contextWindow)}`,L=_.getContextFillTone(M),R=()=>{E(!1),w(`usage`)};return(0,b.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,b.jsx)(s.StyledTooltip,{content:e(n.I18nKey.CHAT_INTERFACE$SHOW_CONTEXT),placement:`top`,children:(0,b.jsx)(`button`,{ref:D,type:`button`,className:o.cn(c.chatInputIconButtonClassName,`size-8`),"aria-label":`${e(n.I18nKey.CHAT_INTERFACE$CONTEXT_WINDOW_METER_LABEL)}: ${F}`,"aria-expanded":T,"aria-haspopup":`dialog`,"data-testid":`context-window-meter`,onClick:e=>{e.preventDefault(),e.stopPropagation(),E(e=>!e)},children:(0,b.jsx)(v.ContextWindowRing,{percentage:M})})}),T&&(0,b.jsxs)(`div`,{ref:O,"data-testid":`context-window-meter-popover`,className:o.cn(`absolute bottom-full right-0 z-[60] mb-2 w-[280px]`,`flex flex-col gap-0.5 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 shadow-lg`),children:[(0,b.jsxs)(`div`,{className:`flex flex-col gap-2 px-2 py-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2 text-sm`,children:[(0,b.jsx)(`span`,{className:`font-semibold text-[var(--oh-foreground)]`,children:e(n.I18nKey.CONVERSATION$CONTEXT_WINDOW)}),(0,b.jsx)(`span`,{className:o.cn(`shrink-0 text-xs`,S[L]),children:F})]}),(0,b.jsx)(`button`,{type:`button`,"data-testid":`context-window-meter-bar-button`,className:`relative h-1.5 w-full rounded-full cursor-pointer`,style:{backgroundColor:v.CONTEXT_WINDOW_TRACK_COLOR},"aria-label":e(n.I18nKey.COMMON$USAGE),onClick:e=>{e.preventDefault(),e.stopPropagation(),R()},children:(0,b.jsx)(`span`,{className:o.cn(`absolute inset-y-0 left-0 rounded-full transition-all duration-300`,x[L]),style:{width:`${Math.min(100,M)}%`}})}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`button`,{type:`button`,"data-testid":`context-window-compact-button`,disabled:j,"aria-busy":A,"aria-label":e(n.I18nKey.CONVERSATION$COMPACT_CONTEXT),className:o.cn(`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs`,`text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-[var(--oh-foreground)]`,`transition-colors disabled:cursor-not-allowed disabled:opacity-50`),onClick:e=>{e.preventDefault(),e.stopPropagation(),k()},children:[A?(0,b.jsx)(i.LoaderCircle,{className:`size-3 animate-spin`,"aria-hidden":!0}):(0,b.jsx)(a.Minimize,{className:`size-3`,"aria-hidden":!0}),(0,b.jsx)(`span`,{children:e(n.I18nKey.CONVERSATION$COMPACT_CONTEXT)})]}),(0,b.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,children:I})]})]}),(0,b.jsx)(d.Divider,{inset:`menu`}),(0,b.jsx)(l.ContextMenuListItem,{testId:`context-window-plan-usage`,onClick:e=>{e.preventDefault(),e.stopPropagation(),R()},children:(0,b.jsx)(g.ConversationNameContextMenuIconText,{icon:(0,b.jsx)(r.Gauge,{size:16}),text:e(n.I18nKey.COMMON$USAGE)})})]})]})}exports.ContextWindowMeter=C;
2
2
  //# sourceMappingURL=context-window-meter.cjs.map
@@ -4,8 +4,8 @@ import { Gauge as n } from "../../../../node_modules/lucide-react/dist/esm/icons
4
4
  import { LoaderCircle as r } from "../../../../node_modules/lucide-react/dist/esm/icons/loader-circle.js";
5
5
  import { Minimize as i } from "../../../../node_modules/lucide-react/dist/esm/icons/minimize.js";
6
6
  import { cn as a } from "../../../../utils/utils.js";
7
- import { chatInputIconButtonClassName as o } from "../../../../utils/form-control-classes.js";
8
- import { StyledTooltip as s } from "../../../shared/buttons/styled-tooltip.js";
7
+ import { StyledTooltip as o } from "../../../shared/buttons/styled-tooltip.js";
8
+ import { chatInputIconButtonClassName as s } from "../../../../utils/form-control-classes.js";
9
9
  import { ContextMenuListItem as c } from "../../context-menu/context-menu-list-item.js";
10
10
  import { useClickOutsideElement as l } from "../../../../hooks/use-click-outside-element.js";
11
11
  import { Divider as u } from "../../../../ui/divider.js";
@@ -36,13 +36,13 @@ function T() {
36
36
  };
37
37
  return /* @__PURE__ */ S("div", {
38
38
  className: "relative shrink-0",
39
- children: [/* @__PURE__ */ x(s, {
39
+ children: [/* @__PURE__ */ x(o, {
40
40
  content: T(t.CHAT_INTERFACE$SHOW_CONTEXT),
41
41
  placement: "top",
42
42
  children: /* @__PURE__ */ x("button", {
43
43
  ref: A,
44
44
  type: "button",
45
- className: a(o, "size-8"),
45
+ className: a(s, "size-8"),
46
46
  "aria-label": `${T(t.CHAT_INTERFACE$CONTEXT_WINDOW_METER_LABEL)}: ${R}`,
47
47
  "aria-expanded": O,
48
48
  "aria-haspopup": "dialog",
@@ -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("../../shared/buttons/styled-tooltip.cjs"),r=require("../../../hooks/query/use-settings.cjs"),i=require("../../../icons/lock.cjs");let a=require("react/jsx-runtime");function o(){let{t:o}=e.useTranslation(`openhands`),{data:s}=r.useSettings();return s?.confirmation_mode?(0,a.jsx)(n.StyledTooltip,{closeDelay:100,content:o(t.I18nKey.COMMON$CONFIRMATION_MODE_ENABLED),tooltipClassName:`bg-white text-black hover:bg-transparent`,children:(0,a.jsx)(`div`,{className:`flex items-center justify-center w-[26px] h-[26px] rounded-lg bg-[var(--oh-surface)]`,children:(0,a.jsx)(i.default,{width:15,height:15})})}):null}exports.default=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("../../../hooks/query/use-settings.cjs"),r=require("../../shared/buttons/styled-tooltip.cjs"),i=require("../../../icons/lock.cjs");let a=require("react/jsx-runtime");function o(){let{t:o}=e.useTranslation(`openhands`),{data:s}=n.useSettings();return s?.confirmation_mode?(0,a.jsx)(r.StyledTooltip,{closeDelay:100,content:o(t.I18nKey.COMMON$CONFIRMATION_MODE_ENABLED),tooltipClassName:`bg-white text-black hover:bg-transparent`,children:(0,a.jsx)(`div`,{className:`flex items-center justify-center w-[26px] h-[26px] rounded-lg bg-[var(--oh-surface)]`,children:(0,a.jsx)(i.default,{width:15,height:15})})}):null}exports.default=o;
2
2
  //# sourceMappingURL=confirmation-mode-enabled.cjs.map
@@ -1,13 +1,13 @@
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 { StyledTooltip as n } from "../../shared/buttons/styled-tooltip.js";
4
- import { useSettings as r } from "../../../hooks/query/use-settings.js";
3
+ import { useSettings as n } from "../../../hooks/query/use-settings.js";
4
+ import { StyledTooltip as r } from "../../shared/buttons/styled-tooltip.js";
5
5
  import i from "../../../icons/lock.js";
6
6
  import { jsx as a } from "react/jsx-runtime";
7
7
  //#region src/components/features/chat/confirmation-mode-enabled.tsx
8
8
  function o() {
9
- let { t: o } = e("openhands"), { data: s } = r();
10
- return s?.confirmation_mode ? /* @__PURE__ */ a(n, {
9
+ let { t: o } = e("openhands"), { data: s } = n();
10
+ return s?.confirmation_mode ? /* @__PURE__ */ a(r, {
11
11
  closeDelay: 100,
12
12
  content: o(t.COMMON$CONFIRMATION_MODE_ENABLED),
13
13
  tooltipClassName: "bg-white text-black hover:bg-transparent",
@@ -1,2 +1,2 @@
1
- const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../utils/utils.cjs"),i=require("../../../icons/angle-down-solid.cjs"),a=require("../../../icons/angle-up-solid.cjs"),o=require("./success-indicator.cjs"),s=require("../markdown/markdown-renderer.cjs");let c=require("react");c=e.__toESM(c,1);let l=require("react/jsx-runtime");function u({title:e,details:u,success:d,initiallyExpanded:f=!1,chevronPosition:p=`after`,titleTrailing:m,titleIcon:h}){let{t:g}=t.useTranslation(`openhands`),[_,v]=c.default.useState(f),y=u?(0,l.jsx)(`button`,{type:`button`,onClick:()=>v(e=>!e),className:`cursor-pointer text-left`,"aria-label":g(_?n.I18nKey.BUTTON$COLLAPSE:n.I18nKey.BUTTON$EXPAND),children:_?(0,l.jsx)(a.default,{className:r.cn(`h-4 w-4 inline fill-[var(--oh-muted)]`,p===`after`?`ml-2`:`mr-2`)}):(0,l.jsx)(i.default,{className:r.cn(`h-4 w-4 inline fill-[var(--oh-muted)]`,p===`after`?`ml-2`:`mr-2`)})}):null;return(0,l.jsxs)(`div`,{className:`flex flex-col gap-1.5 my-1 py-1 text-sm w-full`,children:[(0,l.jsxs)(`div`,{className:`flex items-center justify-between font-normal text-[var(--oh-muted)]`,children:[(0,l.jsxs)(`div`,{className:`flex items-center`,children:[p===`before`&&y,h,(0,l.jsx)(`span`,{children:e}),p===`after`&&y]}),(0,l.jsxs)(`div`,{className:`flex items-center`,children:[m,d&&(0,l.jsx)(o.SuccessIndicator,{status:d})]})]}),_&&(typeof u==`string`?(0,l.jsx)(s.MarkdownRenderer,{children:u}):u)]})}exports.GenericEventMessage=u;
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../utils/utils.cjs"),i=require("../../../icons/angle-down-solid.cjs"),a=require("../../../icons/angle-up-solid.cjs"),o=require("./success-indicator.cjs"),s=require("../markdown/markdown-renderer.cjs"),c=require("../../shared/buttons/styled-tooltip.cjs"),l=require("../../../utils/format-event-timestamp.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");function f({title:e,details:f,success:p,initiallyExpanded:m=!1,chevronPosition:h=`after`,titleTrailing:g,titleIcon:_,timestamp:v}){let{t:y,i18n:b}=t.useTranslation(`openhands`),[x,S]=u.default.useState(m),[C,w]=u.default.useState(!1),[T,E]=u.default.useState(!1),D=l.formatEventTimestamp(v,b?.language),O=f?(0,d.jsx)(`button`,{type:`button`,onClick:e=>{S(e=>!e),e.detail>0&&(w(!1),e.currentTarget.blur())},className:`cursor-pointer text-left`,"aria-label":y(x?n.I18nKey.BUTTON$COLLAPSE:n.I18nKey.BUTTON$EXPAND),children:x?(0,d.jsx)(a.default,{className:r.cn(`h-4 w-4 inline fill-[var(--oh-muted)]`,h===`after`?`ml-2`:`mr-2`)}):(0,d.jsx)(i.default,{className:r.cn(`h-4 w-4 inline fill-[var(--oh-muted)]`,h===`after`?`ml-2`:`mr-2`)})}):null,k=(0,d.jsxs)(`div`,{"data-testid":`generic-event-message-title`,className:`flex items-center`,onMouseEnter:()=>w(!0),onMouseLeave:()=>w(!1),onFocusCapture:()=>E(!0),onBlurCapture:e=>{e.currentTarget.contains(e.relatedTarget)||E(!1)},children:[h===`before`&&O,_,(0,d.jsx)(`span`,{children:e}),h===`after`&&O]});return(0,d.jsxs)(`div`,{className:`flex flex-col gap-1.5 my-1 py-1 text-sm w-full`,children:[(0,d.jsxs)(`div`,{className:`flex items-center justify-between font-normal text-[var(--oh-muted)]`,children:[D?(0,d.jsx)(c.StyledTooltip,{content:(0,d.jsx)(`time`,{dateTime:v,children:D}),placement:`top`,isOpen:C||T,children:k}):k,(0,d.jsxs)(`div`,{className:`flex items-center`,children:[g,p&&(0,d.jsx)(o.SuccessIndicator,{status:p})]})]}),x&&(typeof f==`string`?(0,d.jsx)(s.MarkdownRenderer,{children:f}):f)]})}exports.GenericEventMessage=f;
2
2
  //# sourceMappingURL=generic-event-message.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic-event-message.cjs","names":[],"sources":["../../../../src/components/features/chat/generic-event-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport ArrowDown from \"#/icons/angle-down-solid.svg?react\";\nimport ArrowUp from \"#/icons/angle-up-solid.svg?react\";\nimport { SuccessIndicator } from \"./success-indicator\";\nimport { ObservationResultStatus } from \"#/components/conversation-events/chat/event-content-helpers/get-observation-result\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\ninterface GenericEventMessageProps {\n title: React.ReactNode;\n details: string | React.ReactNode;\n success?: ObservationResultStatus;\n initiallyExpanded?: boolean;\n /** Where to place the expand/collapse chevron relative to the title. */\n chevronPosition?: \"before\" | \"after\";\n /** Extra content rendered at the end of the title row (right side). */\n titleTrailing?: React.ReactNode;\n /** Optional icon rendered before the title text. */\n titleIcon?: React.ReactNode;\n}\n\nexport function GenericEventMessage({\n title,\n details,\n success,\n initiallyExpanded = false,\n chevronPosition = \"after\",\n titleTrailing,\n titleIcon,\n}: GenericEventMessageProps) {\n const { t } = useTranslation(\"openhands\");\n const [showDetails, setShowDetails] = React.useState(initiallyExpanded);\n\n const chevron = details ? (\n <button\n type=\"button\"\n onClick={() => setShowDetails((prev) => !prev)}\n className=\"cursor-pointer text-left\"\n aria-label={\n showDetails ? t(I18nKey.BUTTON$COLLAPSE) : t(I18nKey.BUTTON$EXPAND)\n }\n >\n {showDetails ? (\n <ArrowUp\n className={cn(\n \"h-4 w-4 inline fill-[var(--oh-muted)]\",\n chevronPosition === \"after\" ? \"ml-2\" : \"mr-2\",\n )}\n />\n ) : (\n <ArrowDown\n className={cn(\n \"h-4 w-4 inline fill-[var(--oh-muted)]\",\n chevronPosition === \"after\" ? \"ml-2\" : \"mr-2\",\n )}\n />\n )}\n </button>\n ) : null;\n\n return (\n <div className=\"flex flex-col gap-1.5 my-1 py-1 text-sm w-full\">\n <div className=\"flex items-center justify-between font-normal text-[var(--oh-muted)]\">\n <div className=\"flex items-center\">\n {chevronPosition === \"before\" && chevron}\n {titleIcon}\n {/* Wrap the title in a span so any whitespace inside Trans-rendered\n fragments (e.g. \"Editing <path>...</path>\") is preserved by\n normal inline flow instead of being collapsed between\n anonymous flex items. */}\n <span>{title}</span>\n {chevronPosition === \"after\" && chevron}\n </div>\n\n <div className=\"flex items-center\">\n {titleTrailing}\n {success && <SuccessIndicator status={success} />}\n </div>\n </div>\n\n {showDetails &&\n (typeof details === \"string\" ? (\n <MarkdownRenderer>{details}</MarkdownRenderer>\n ) : (\n details\n ))}\n </div>\n );\n}\n"],"mappings":"udAuBA,SAAgB,EAAoB,CAClC,QACA,UACA,UACA,oBAAoB,GACpB,kBAAkB,QAClB,gBACA,aAC2B,CAC3B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,CAAiB,EAEhE,EAAU,GACd,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,YAAe,EAAgB,GAAS,CAAC,CAAI,EAC7C,UAAU,2BACV,aACgB,EAAd,EAAgB,EAAA,QAAQ,gBAAqB,EAAA,QAAQ,aAAa,WAGnE,GACC,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,GACT,wCACA,IAAoB,QAAU,OAAS,MACzC,CACD,CAAA,GAED,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,GACT,wCACA,IAAoB,QAAU,OAAS,MACzC,CACD,CAAA,CAEG,CAAA,EACN,KAEJ,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0DAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gFAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6BAAf,CACG,IAAoB,UAAY,EAChC,GAKD,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,CAAY,CAAA,EAClB,IAAoB,SAAW,CAC7B,KAEL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6BAAf,CACG,EACA,IAAW,EAAA,EAAA,KAAC,EAAA,iBAAD,CAAkB,OAAQ,CAAU,CAAA,CAC7C,GACF,IAEJ,IACE,OAAO,GAAY,UAClB,EAAA,EAAA,KAAC,EAAA,iBAAD,CAAA,SAAmB,CAA0B,CAAA,EAE7C,EAED,GAET"}
1
+ {"version":3,"file":"generic-event-message.cjs","names":[],"sources":["../../../../src/components/features/chat/generic-event-message.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport ArrowDown from \"#/icons/angle-down-solid.svg?react\";\nimport ArrowUp from \"#/icons/angle-up-solid.svg?react\";\nimport { SuccessIndicator } from \"./success-indicator\";\nimport { ObservationResultStatus } from \"#/components/conversation-events/chat/event-content-helpers/get-observation-result\";\nimport { MarkdownRenderer } from \"../markdown/markdown-renderer\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { formatEventTimestamp } from \"#/utils/format-event-timestamp\";\n\ninterface GenericEventMessageProps {\n title: React.ReactNode;\n details: string | React.ReactNode;\n success?: ObservationResultStatus;\n initiallyExpanded?: boolean;\n /** Where to place the expand/collapse chevron relative to the title. */\n chevronPosition?: \"before\" | \"after\";\n /** Extra content rendered at the end of the title row (right side). */\n titleTrailing?: React.ReactNode;\n /** Optional icon rendered before the title text. */\n titleIcon?: React.ReactNode;\n timestamp?: string;\n}\n\nexport function GenericEventMessage({\n title,\n details,\n success,\n initiallyExpanded = false,\n chevronPosition = \"after\",\n titleTrailing,\n titleIcon,\n timestamp,\n}: GenericEventMessageProps) {\n const { t, i18n } = useTranslation(\"openhands\");\n const [showDetails, setShowDetails] = React.useState(initiallyExpanded);\n const [isHovered, setIsHovered] = React.useState(false);\n const [hasFocusWithin, setHasFocusWithin] = React.useState(false);\n const timestampLabel = formatEventTimestamp(timestamp, i18n?.language);\n\n const chevron = details ? (\n <button\n type=\"button\"\n onClick={(event) => {\n setShowDetails((prev) => !prev);\n if (event.detail > 0) {\n setIsHovered(false);\n event.currentTarget.blur();\n }\n }}\n className=\"cursor-pointer text-left\"\n aria-label={\n showDetails ? t(I18nKey.BUTTON$COLLAPSE) : t(I18nKey.BUTTON$EXPAND)\n }\n >\n {showDetails ? (\n <ArrowUp\n className={cn(\n \"h-4 w-4 inline fill-[var(--oh-muted)]\",\n chevronPosition === \"after\" ? \"ml-2\" : \"mr-2\",\n )}\n />\n ) : (\n <ArrowDown\n className={cn(\n \"h-4 w-4 inline fill-[var(--oh-muted)]\",\n chevronPosition === \"after\" ? \"ml-2\" : \"mr-2\",\n )}\n />\n )}\n </button>\n ) : null;\n\n const titleContent = (\n <div\n data-testid=\"generic-event-message-title\"\n className=\"flex items-center\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocusCapture={() => setHasFocusWithin(true)}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setHasFocusWithin(false);\n }\n }}\n >\n {chevronPosition === \"before\" && chevron}\n {titleIcon}\n {/* Wrap the title in a span so any whitespace inside Trans-rendered\n fragments (e.g. \"Editing <path>...</path>\") is preserved by\n normal inline flow instead of being collapsed between\n anonymous flex items. */}\n <span>{title}</span>\n {chevronPosition === \"after\" && chevron}\n </div>\n );\n\n const titleContentWithTimestamp = timestampLabel ? (\n <StyledTooltip\n content={<time dateTime={timestamp}>{timestampLabel}</time>}\n placement=\"top\"\n isOpen={isHovered || hasFocusWithin}\n >\n {titleContent}\n </StyledTooltip>\n ) : (\n titleContent\n );\n\n const titleRow = (\n <div className=\"flex items-center justify-between font-normal text-[var(--oh-muted)]\">\n {titleContentWithTimestamp}\n <div className=\"flex items-center\">\n {titleTrailing}\n {success && <SuccessIndicator status={success} />}\n </div>\n </div>\n );\n\n return (\n <div className=\"flex flex-col gap-1.5 my-1 py-1 text-sm w-full\">\n {titleRow}\n {showDetails &&\n (typeof details === \"string\" ? (\n <MarkdownRenderer>{details}</MarkdownRenderer>\n ) : (\n details\n ))}\n </div>\n );\n}\n"],"mappings":"mkBA0BA,SAAgB,EAAoB,CAClC,QACA,UACA,UACA,oBAAoB,GACpB,kBAAkB,QAClB,gBACA,YACA,aAC2B,CAC3B,GAAM,CAAE,IAAG,QAAS,EAAA,eAAe,WAAW,EACxC,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,CAAiB,EAChE,CAAC,EAAW,GAAgB,EAAA,QAAM,SAAS,EAAK,EAChD,CAAC,EAAgB,GAAqB,EAAA,QAAM,SAAS,EAAK,EAC1D,EAAiB,EAAA,qBAAqB,EAAW,GAAM,QAAQ,EAE/D,EAAU,GACd,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAAU,GAAU,CAClB,EAAgB,GAAS,CAAC,CAAI,EAC1B,EAAM,OAAS,IACjB,EAAa,EAAK,EAClB,EAAM,cAAc,KAAK,EAE7B,EACA,UAAU,2BACV,aACgB,EAAd,EAAgB,EAAA,QAAQ,gBAAqB,EAAA,QAAQ,aAAa,WAGnE,GACC,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,GACT,wCACA,IAAoB,QAAU,OAAS,MACzC,CACD,CAAA,GAED,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,GACT,wCACA,IAAoB,QAAU,OAAS,MACzC,CACD,CAAA,CAEG,CAAA,EACN,KAEE,GACJ,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,8BACZ,UAAU,oBACV,iBAAoB,EAAa,EAAI,EACrC,iBAAoB,EAAa,EAAK,EACtC,mBAAsB,EAAkB,EAAI,EAC5C,cAAgB,GAAU,CACnB,EAAM,cAAc,SAAS,EAAM,aAAa,GACnD,EAAkB,EAAK,CAE3B,WAVF,CAYG,IAAoB,UAAY,EAChC,GAKD,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,CAAY,CAAA,EAClB,IAAoB,SAAW,CAC7B,IAyBP,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0DAAf,EACG,EAAA,EAAA,MAXF,MAAD,CAAK,UAAU,gFAAf,CAbgC,GAChC,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,SAAS,EAAA,EAAA,KAAC,OAAD,CAAM,SAAU,WAAY,CAAqB,CAAA,EAC1D,UAAU,MACV,OAAQ,GAAa,WAEpB,CACY,CAAA,EAEf,GAME,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6BAAf,CACG,EACA,IAAW,EAAA,EAAA,KAAC,EAAA,iBAAD,CAAkB,OAAQ,CAAU,CAAA,CAC7C,GACF,EAKF,EACA,IACE,OAAO,GAAY,UAClB,EAAA,EAAA,KAAC,EAAA,iBAAD,CAAA,SAAmB,CAA0B,CAAA,EAE7C,EAED,GAET"}
@@ -11,6 +11,7 @@ interface GenericEventMessageProps {
11
11
  titleTrailing?: React.ReactNode;
12
12
  /** Optional icon rendered before the title text. */
13
13
  titleIcon?: React.ReactNode;
14
+ timestamp?: string;
14
15
  }
15
- export declare function GenericEventMessage({ title, details, success, initiallyExpanded, chevronPosition, titleTrailing, titleIcon, }: GenericEventMessageProps): React.JSX.Element;
16
+ export declare function GenericEventMessage({ title, details, success, initiallyExpanded, chevronPosition, titleTrailing, titleIcon, timestamp, }: GenericEventMessageProps): React.JSX.Element;
16
17
  export {};