@openhands/agent-canvas 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
  4. package/build/assets/active-backend-context-IqOjobNK.js +2 -0
  5. package/build/assets/{agent-context-settings-CzWS1DgR.js → agent-context-settings-DMrObcIS.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
  8. package/build/assets/{agent-settings-D2J1dKVd.js → agent-settings-BJVk92PU.js} +1 -1
  9. package/build/assets/agent-settings-COfJsQ1d.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-D70oJj2c.js → api-key-entry-screen-D8Fade_-.js} +1 -1
  12. package/build/assets/{app-settings-D0OKHB3M.js → app-settings-CpyGB3AT.js} +1 -1
  13. package/build/assets/{automation-detail-C0SxWTnQ.js → automation-detail-B-jQ39Mm.js} +1 -1
  14. package/build/assets/{automation-export-BjQa_fT6.js → automation-export-B1dywoqk.js} +1 -1
  15. package/build/assets/{automation-setup-route-BzCNpljP.js → automation-setup-route-C-bWUZBi.js} +1 -1
  16. package/build/assets/{automation-templates-D9gs6ihu.js → automation-templates-DgpCGOJV.js} +1 -1
  17. package/build/assets/{automations-list-dZg8zOCl.js → automations-list-DnMxlxsL.js} +1 -1
  18. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
  19. package/build/assets/{backend-form-modal-HwclKrUS.js → backend-form-modal-DiVrD4Cm.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-YI3k09Wr.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
  21. package/build/assets/{badge-Dpn3-LTV.js → badge-CpYmcVZV.js} +1 -1
  22. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
  23. package/build/assets/bot-BQZx8e2i.js +1 -0
  24. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
  25. package/build/assets/browser-B9AbV6kG.js +7 -0
  26. package/build/assets/{browser-tab-4CPdj3J3.js → browser-tab-zAY12m_i.js} +1 -1
  27. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
  28. package/build/assets/check-WAFXrrs_.js +1 -0
  29. package/build/assets/chevron-down-CifNWzme.js +1 -0
  30. package/build/assets/circle-check-CtnimJa8.js +1 -0
  31. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
  32. package/build/assets/{cloud-funnel-analytics-CcSez21r.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
  33. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
  34. package/build/assets/{command-menu-BKOLj-TC.js → command-menu-BXy03FBl.js} +1 -1
  35. package/build/assets/{condenser-settings-DLQogFnB.js → condenser-settings-BmZa0ui_.js} +1 -1
  36. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
  37. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
  38. package/build/assets/conversation-BPo8SvLN.js +1 -0
  39. package/build/assets/conversation-CPCVsCUY.js +90 -0
  40. package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
  41. package/build/assets/{conversation-state-store-CtgILxWF.js → conversation-state-store-C5YpjMNy.js} +1 -1
  42. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  43. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
  44. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
  45. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
  46. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
  47. package/build/assets/{entry.client-EBn3ZtNP.js → entry.client-CxFjRYqH.js} +2 -2
  48. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
  49. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
  50. package/build/assets/{extensions-hub-BZ3HYztk.js → extensions-hub-BqUINAhp.js} +1 -1
  51. package/build/assets/{extensions-navigation-Bnx32WAb.js → extensions-navigation-lraj88Wk.js} +1 -1
  52. package/build/assets/external-link-CgtpA_a1.js +1 -0
  53. package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
  54. package/build/assets/files-tab-DV0L-lFE.js +1 -0
  55. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
  56. package/build/assets/{format-relative-time-BerVamGl.js → format-relative-time-DSErAuVr.js} +1 -1
  57. package/build/assets/git-provider-icon-BvlLAche.js +1 -0
  58. package/build/assets/{git-repo-dropdown-B5VnMftu.js → git-repo-dropdown-ByMzpNko.js} +1 -1
  59. package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
  60. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
  61. package/build/assets/{home-Y0aDou-a.js → home-BOrlwLqG.js} +1 -1
  62. package/build/assets/home-BvMNC6E-.js +1 -0
  63. package/build/assets/{home-store-Cubdq0uP.js → home-store-CxqsY9Fi.js} +1 -1
  64. package/build/assets/index-home-BvMNC6E-.js +1 -0
  65. package/build/assets/info-BRVcJAUg.js +1 -0
  66. package/build/assets/{install-server-modal-DW6dSyGr.js → install-server-modal-Bl4G1zF4.js} +1 -1
  67. package/build/assets/{kebab-menu-item-content-CKydZrbH.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
  68. package/build/assets/{launch-c4GEP8oo.js → launch-CkqiSCqi.js} +1 -1
  69. package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
  70. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
  71. package/build/assets/llm-settings-B-pkVCrt.js +1 -0
  72. package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
  73. package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
  74. package/build/assets/loader-circle-B47W9XqT.js +1 -0
  75. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
  76. package/build/assets/{manage-backends-modal-DTCME_Pu.js → manage-backends-modal-DhGk5mJt.js} +1 -1
  77. package/build/assets/manifest-653b89aa.js +1 -0
  78. package/build/assets/{manifest-subpage-layout-Ds7G5GZ8.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
  79. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
  80. package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
  81. package/build/assets/{mcp-Da7wFU7A.js → mcp-DCkvl6K0.js} +2 -2
  82. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
  83. package/build/assets/messages-DSXvyc21.js +40 -0
  84. package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
  85. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
  86. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
  87. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
  88. package/build/assets/{npm-Cswluf6-.js → npm-DLckoeJc.js} +1 -1
  89. package/build/assets/{onboarding-BKbTYlW1.js → onboarding-D7WDG66N.js} +1 -1
  90. package/build/assets/{onboarding-modal-DrrGlEQq.js → onboarding-modal-C_xVrFNv.js} +1 -1
  91. package/build/assets/{organization-service.api-DK8csGvK.js → organization-service.api-D-s9z18a.js} +1 -1
  92. package/build/assets/pencil-BGOCPRyu.js +1 -0
  93. package/build/assets/{planner-tab-D-mZ1I7n.js → planner-tab-AKaXIIfg.js} +1 -1
  94. package/build/assets/{plugins-management-service-CywqyfLK.js → plugins-management-service-wtmY4QQw.js} +1 -1
  95. package/build/assets/plus-zNEL8rcX.js +1 -0
  96. package/build/assets/{profiles-service.api-vcE_jJCe.js → profiles-service.api-DCMYxHMi.js} +1 -1
  97. package/build/assets/{providers-CdrPPm0z.js → providers-BjrtjX4L.js} +1 -1
  98. package/build/assets/{proxy-b4aqL4SX.js → proxy-9Z_WZggZ.js} +1 -1
  99. package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
  100. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
  101. package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
  102. package/build/assets/root-CanxKlNV.css +1 -0
  103. package/build/assets/{root-CBBi6IAe.js → root-DkfG_UWR.js} +2 -2
  104. package/build/assets/root-layout-D75LHYhh.js +2 -0
  105. package/build/assets/{schema-field-Z-rMg9ti.js → schema-field-OnM5Uob_.js} +1 -1
  106. package/build/assets/{sdk-section-page-m_cjygxR.js → sdk-section-page-m5WQm2sy.js} +1 -1
  107. package/build/assets/search-CycosyjN.js +1 -0
  108. package/build/assets/{secrets-service-BHF4fxML.js → secrets-service-B26R61C1.js} +1 -1
  109. package/build/assets/{secrets-settings-aBGXtQhX.js → secrets-settings-CbLYCKOX.js} +1 -1
  110. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
  111. package/build/assets/{settings-CZPGNens.js → settings-BJQI_iBM.js} +1 -1
  112. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
  113. package/build/assets/{settings-index-Dtlegd6s.js → settings-index-BiTqJoH7.js} +1 -1
  114. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
  115. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
  116. package/build/assets/{settings-modal-CalzJP2l.js → settings-modal-BIrIVn97.js} +1 -1
  117. package/build/assets/{settings-service.api-DfPYaxZJ.js → settings-service.api--rJmnuLa.js} +1 -1
  118. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
  119. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
  120. package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
  121. package/build/assets/shield-check-T3JsDJiM.js +1 -0
  122. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
  123. package/build/assets/{sidebar-mobile-menu-toggle-C6HpQ55l.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
  124. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
  125. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
  126. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
  127. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
  128. package/build/assets/{skill-scope-Dt1V5X2p.js → skill-scope-Dc3JPW-8.js} +1 -1
  129. package/build/assets/{skills-plugins-B-H0cCOP.js → skills-plugins-CpTV27n3.js} +1 -1
  130. package/build/assets/{skills-settings-DthdIDUb.js → skills-settings-CSW__IW4.js} +1 -1
  131. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
  132. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
  133. package/build/assets/{task-list-tab-BTde81Iu.js → task-list-tab-mAHMOkUz.js} +1 -1
  134. package/build/assets/{terminal-DRrJo-cR.js → terminal-BzxBaHx2.js} +1 -1
  135. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
  136. package/build/assets/trash-2-C0xNVp9c.js +1 -0
  137. package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
  138. package/build/assets/usage-tab-tEmVN0KD.js +1 -0
  139. package/build/assets/{use-acp-credential-form-DGyo0QvL.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
  140. package/build/assets/{use-activate-agent-profile-DrPzIKJF.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
  141. package/build/assets/{use-agent-profiles-B37XWDLq.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
  142. package/build/assets/{use-can-manage-org-profiles-BzE28H3x.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
  143. package/build/assets/{use-cloud-current-user-id-U6HPjy50.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
  144. package/build/assets/{use-config-DapX3pjC.js → use-config-DKAMiI5R.js} +1 -1
  145. package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
  146. package/build/assets/{use-create-secret-DcpT3RPw.js → use-create-secret-2zBlCDsF.js} +1 -1
  147. package/build/assets/use-is-authed-C52-ivnB.js +1 -0
  148. package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
  149. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  150. package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
  151. package/build/assets/{use-manifest-capabilities-zihHDbMW.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
  152. package/build/assets/{use-onboarding-completion-6kWOW3ul.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
  153. package/build/assets/{use-plugins-marketplace-CqkR8kLE.js → use-plugins-marketplace-CEiak69h.js} +1 -1
  154. package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
  155. package/build/assets/{use-save-settings-DIEurJ3D.js → use-save-settings-DNmnbG6f.js} +1 -1
  156. package/build/assets/{use-settings-nav-items-DV9qgeu7.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
  157. package/build/assets/{use-settings-BmLzQjnC.js → use-settings-wCwPaSIv.js} +1 -1
  158. package/build/assets/{use-tracking-salbPJxT.js → use-tracking-CVwPmhlX.js} +1 -1
  159. package/build/assets/{use-user-conversation-Dt-W6uNw.js → use-user-conversation-DVtfg0B_.js} +1 -1
  160. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
  161. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
  162. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
  163. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
  164. package/build/assets/utils-zxEjKE70.js +1 -0
  165. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  166. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js} +3 -3
  167. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
  168. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
  169. package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
  170. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
  171. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js} +1 -1
  172. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js} +1 -1
  173. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js} +1 -1
  174. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js} +2 -2
  175. package/build/assets/{verification-settings-oi54wEc1.js → verification-settings-B8UMQ7MG.js} +1 -1
  176. package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
  177. package/build/assets/x-BWKA2Ver.js +1 -0
  178. package/build/assets/zap-DHddTPc0.js +1 -0
  179. package/build/index.html +4 -4
  180. package/build/locales/ar/openhands.json +28 -1
  181. package/build/locales/ca/openhands.json +28 -1
  182. package/build/locales/de/openhands.json +28 -1
  183. package/build/locales/en/openhands.json +28 -1
  184. package/build/locales/es/openhands.json +28 -1
  185. package/build/locales/fr/openhands.json +28 -1
  186. package/build/locales/it/openhands.json +28 -1
  187. package/build/locales/ja/openhands.json +28 -1
  188. package/build/locales/ko-KR/openhands.json +28 -1
  189. package/build/locales/no/openhands.json +28 -1
  190. package/build/locales/pt/openhands.json +28 -1
  191. package/build/locales/tr/openhands.json +28 -1
  192. package/build/locales/uk/openhands.json +28 -1
  193. package/build/locales/zh-CN/openhands.json +28 -1
  194. package/build/locales/zh-TW/openhands.json +28 -1
  195. package/config/defaults.json +3 -3
  196. package/dist/api/agent-server-compatibility.cjs +1 -1
  197. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  198. package/dist/api/agent-server-compatibility.js +1 -1
  199. package/dist/api/agent-server-compatibility.js.map +1 -1
  200. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  201. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  202. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  203. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  204. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  205. package/dist/api/llm-balance-service.cjs +2 -0
  206. package/dist/api/llm-balance-service.cjs.map +1 -0
  207. package/dist/api/llm-balance-service.d.ts +33 -0
  208. package/dist/api/llm-balance-service.js +53 -0
  209. package/dist/api/llm-balance-service.js.map +1 -0
  210. package/dist/api/llm-subscription-service.cjs +1 -1
  211. package/dist/api/llm-subscription-service.cjs.map +1 -1
  212. package/dist/api/llm-subscription-service.js +42 -34
  213. package/dist/api/llm-subscription-service.js.map +1 -1
  214. package/dist/components/conversation/index.cjs +1 -1
  215. package/dist/components/conversation/index.d.ts +0 -1
  216. package/dist/components/conversation/index.js +0 -1
  217. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  218. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  219. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  221. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  222. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  223. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  224. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  225. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  226. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  227. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  228. package/dist/components/conversation-events/chat/group-events.js +27 -26
  229. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  230. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  231. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  232. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  233. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  234. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  235. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  236. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  237. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  238. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  239. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  240. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  241. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  242. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  243. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  244. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  245. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  246. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  247. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  248. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  249. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  250. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  251. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  252. package/dist/components/features/chat/custom-chat-input.js +68 -67
  253. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  254. package/dist/components/features/chat/path-component.cjs +1 -1
  255. package/dist/components/features/chat/path-component.cjs.map +1 -1
  256. package/dist/components/features/chat/path-component.js +9 -6
  257. package/dist/components/features/chat/path-component.js.map +1 -1
  258. package/dist/components/features/chat/plan-preview.cjs +1 -1
  259. package/dist/components/features/chat/plan-preview.js +4 -4
  260. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  261. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  262. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  263. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  264. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  265. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  266. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  267. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  268. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  269. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  270. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  271. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  272. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  273. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  274. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  275. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  276. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  277. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  278. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  279. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  280. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  281. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  282. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  283. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  284. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  285. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  286. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  287. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  288. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  289. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  290. package/dist/components/features/conversation/conversation-name.js +69 -71
  291. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  292. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  293. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  294. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  295. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  296. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  297. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  298. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  299. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  300. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  301. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  302. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  303. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  304. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  305. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  306. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  307. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  308. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  309. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  310. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  311. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  312. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  313. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  314. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  315. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  316. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  317. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  318. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  319. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  320. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  321. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  322. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  323. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  324. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  325. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  326. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  327. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  328. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  329. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  330. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  331. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  332. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  333. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  334. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  335. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  336. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  337. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  338. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  339. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  340. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  341. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  342. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  343. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  344. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  345. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  346. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  347. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  348. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  349. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  350. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  351. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  352. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  353. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  354. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  355. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  356. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  357. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  358. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  359. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  360. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  361. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  362. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  363. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +25 -17
  364. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  365. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  366. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  367. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  368. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  369. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  370. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  371. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  372. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  373. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  374. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  375. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  376. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  377. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  378. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  379. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  380. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  381. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  382. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  383. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  384. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  386. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  387. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  388. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  389. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  391. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  392. package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
  393. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  394. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  395. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  396. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  397. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  398. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  399. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  400. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  401. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  402. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  403. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  404. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  405. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  406. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  407. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  408. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  409. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  410. package/dist/config/defaults.cjs +1 -1
  411. package/dist/config/defaults.cjs.map +1 -1
  412. package/dist/config/defaults.js +3 -3
  413. package/dist/config/defaults.js.map +1 -1
  414. package/dist/constants/llm-balance.cjs +2 -0
  415. package/dist/constants/llm-balance.cjs.map +1 -0
  416. package/dist/constants/llm-balance.d.ts +13 -0
  417. package/dist/constants/llm-balance.js +6 -0
  418. package/dist/constants/llm-balance.js.map +1 -0
  419. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  420. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  421. package/dist/contexts/conversation-websocket-context.js +217 -209
  422. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  423. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  424. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  425. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  426. package/dist/hooks/chat/use-grip-resize.js +39 -30
  427. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  428. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  429. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  430. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  431. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  432. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  433. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  434. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  435. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  436. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  437. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  438. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  439. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  440. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  441. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  442. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  443. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  444. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  445. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  446. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  447. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  448. package/dist/hooks/query/use-llm-balance.js +24 -0
  449. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  450. package/dist/hooks/query/use-search-providers.cjs +1 -1
  451. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  452. package/dist/hooks/query/use-search-providers.js +1 -1
  453. package/dist/hooks/query/use-search-providers.js.map +1 -1
  454. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  455. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  456. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  457. package/dist/hooks/use-await-context-compaction.js +61 -0
  458. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  459. package/dist/hooks/use-compact-context-action.cjs +2 -0
  460. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  461. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  462. package/dist/hooks/use-compact-context-action.js +61 -0
  463. package/dist/hooks/use-compact-context-action.js.map +1 -0
  464. package/dist/hooks/use-context-window-usage.cjs +2 -0
  465. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  466. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  467. package/dist/hooks/use-context-window-usage.js +20 -0
  468. package/dist/hooks/use-context-window-usage.js.map +1 -0
  469. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  470. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  471. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  472. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  473. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  474. package/dist/hooks/use-drag-resize.cjs +1 -1
  475. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  476. package/dist/hooks/use-drag-resize.d.ts +8 -0
  477. package/dist/hooks/use-drag-resize.js +21 -18
  478. package/dist/hooks/use-drag-resize.js.map +1 -1
  479. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  480. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  481. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  482. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  483. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  484. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  485. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  486. package/dist/hooks/use-select-conversation-tab.js +2 -2
  487. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  488. package/dist/i18n/declaration.cjs +1 -1
  489. package/dist/i18n/declaration.cjs.map +1 -1
  490. package/dist/i18n/declaration.d.ts +27 -0
  491. package/dist/i18n/declaration.js +1 -1
  492. package/dist/i18n/declaration.js.map +1 -1
  493. package/dist/i18n/translation.cjs +2 -2
  494. package/dist/i18n/translation.cjs.map +1 -1
  495. package/dist/i18n/translation.js +474 -15
  496. package/dist/i18n/translation.js.map +1 -1
  497. package/dist/index.cjs +1 -1
  498. package/dist/index.js +28 -29
  499. package/dist/lib/index.cjs +1 -1
  500. package/dist/lib/index.js +0 -1
  501. package/dist/locales/ar/openhands.json +28 -1
  502. package/dist/locales/ca/openhands.json +28 -1
  503. package/dist/locales/de/openhands.json +28 -1
  504. package/dist/locales/en/openhands.json +28 -1
  505. package/dist/locales/es/openhands.json +28 -1
  506. package/dist/locales/fr/openhands.json +28 -1
  507. package/dist/locales/it/openhands.json +28 -1
  508. package/dist/locales/ja/openhands.json +28 -1
  509. package/dist/locales/ko-KR/openhands.json +28 -1
  510. package/dist/locales/no/openhands.json +28 -1
  511. package/dist/locales/pt/openhands.json +28 -1
  512. package/dist/locales/tr/openhands.json +28 -1
  513. package/dist/locales/uk/openhands.json +28 -1
  514. package/dist/locales/zh-CN/openhands.json +28 -1
  515. package/dist/locales/zh-TW/openhands.json +28 -1
  516. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  517. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  518. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  519. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  520. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  522. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  523. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  524. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  525. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  526. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  527. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  528. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  529. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  530. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  531. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  532. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  533. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  534. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  535. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  536. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  537. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  538. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  539. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  540. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  541. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  542. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  543. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  544. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  545. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  546. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  547. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  548. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  549. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  550. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  551. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  552. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  553. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  554. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  557. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  558. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  559. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  560. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  561. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  562. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  563. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  564. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  565. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  566. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  567. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  568. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  569. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  570. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  571. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  572. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  573. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  574. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  575. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  576. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  577. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  578. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  579. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  580. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  581. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  582. package/dist/package.cjs +1 -1
  583. package/dist/package.cjs.map +1 -1
  584. package/dist/package.js +17 -16
  585. package/dist/package.js.map +1 -1
  586. package/dist/routes/usage-tab.cjs +2 -0
  587. package/dist/routes/usage-tab.cjs.map +1 -0
  588. package/dist/routes/usage-tab.d.ts +2 -0
  589. package/dist/routes/usage-tab.js +10 -0
  590. package/dist/routes/usage-tab.js.map +1 -0
  591. package/dist/services/child-conversation-launch.cjs +1 -1
  592. package/dist/services/child-conversation-launch.cjs.map +1 -1
  593. package/dist/services/child-conversation-launch.js +11 -5
  594. package/dist/services/child-conversation-launch.js.map +1 -1
  595. package/dist/stores/archived-conversations-store.cjs +2 -0
  596. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  597. package/dist/stores/archived-conversations-store.d.ts +24 -0
  598. package/dist/stores/archived-conversations-store.js +33 -0
  599. package/dist/stores/archived-conversations-store.js.map +1 -0
  600. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  601. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  602. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  603. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  604. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  605. package/dist/stores/conversation-store.cjs.map +1 -1
  606. package/dist/stores/conversation-store.d.ts +1 -1
  607. package/dist/stores/conversation-store.js.map +1 -1
  608. package/dist/stores/metrics-store.cjs +1 -1
  609. package/dist/stores/metrics-store.cjs.map +1 -1
  610. package/dist/stores/metrics-store.d.ts +1 -0
  611. package/dist/stores/metrics-store.js +7 -4
  612. package/dist/stores/metrics-store.js.map +1 -1
  613. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  614. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  615. package/dist/types/agent-server/type-guards.cjs +1 -1
  616. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  617. package/dist/types/agent-server/type-guards.d.ts +5 -0
  618. package/dist/types/agent-server/type-guards.js +3 -3
  619. package/dist/types/agent-server/type-guards.js.map +1 -1
  620. package/dist/utils/conversation-local-storage.cjs +1 -1
  621. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  622. package/dist/utils/conversation-local-storage.js +2 -1
  623. package/dist/utils/conversation-local-storage.js.map +1 -1
  624. package/dist/utils/format-token-count.cjs +2 -0
  625. package/dist/utils/format-token-count.cjs.map +1 -0
  626. package/dist/utils/format-token-count.d.ts +3 -0
  627. package/dist/utils/format-token-count.js +19 -0
  628. package/dist/utils/format-token-count.js.map +1 -0
  629. package/dist/utils/hover-reveal-classes.cjs +2 -0
  630. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  631. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  632. package/dist/utils/hover-reveal-classes.js +41 -0
  633. package/dist/utils/hover-reveal-classes.js.map +1 -0
  634. package/dist/utils/is-markdown-file-path.cjs +2 -0
  635. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  636. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  637. package/dist/utils/is-markdown-file-path.js +14 -0
  638. package/dist/utils/is-markdown-file-path.js.map +1 -0
  639. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  640. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  641. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  642. package/dist/utils/mcp-marketplace-utils.js +19 -16
  643. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  644. package/dist/utils/transcript-export/index.cjs +3 -3
  645. package/dist/utils/transcript-export/index.cjs.map +1 -1
  646. package/dist/utils/transcript-export/index.js +12 -12
  647. package/dist/utils/transcript-export/index.js.map +1 -1
  648. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  649. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  650. package/dist/utils/transcript-export/load-complete-events.js +4 -4
  651. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  652. package/dist/utils/workspace-relative-path.cjs +2 -0
  653. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  654. package/dist/utils/workspace-relative-path.d.ts +10 -0
  655. package/dist/utils/workspace-relative-path.js +22 -0
  656. package/dist/utils/workspace-relative-path.js.map +1 -0
  657. package/package.json +17 -16
  658. package/scripts/check-sdk-version-sync.mjs +6 -6
  659. package/scripts/dev-process-utils.mjs +6 -1
  660. package/scripts/dev-safe.mjs +57 -2
  661. package/build/assets/active-backend-context-B_bg5h9O.js +0 -2
  662. package/build/assets/agent-profiles-settings-hd2cAIZM.js +0 -1
  663. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +0 -86
  664. package/build/assets/agent-settings-D_SVrWhI.js +0 -1
  665. package/build/assets/bot-DuN83i3p.js +0 -1
  666. package/build/assets/browser--eoQOo4M.js +0 -6
  667. package/build/assets/check-DLOKoFU9.js +0 -1
  668. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  669. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  670. package/build/assets/conversation-Cmyw9bFh.js +0 -90
  671. package/build/assets/conversation-CvoGZ5vC.js +0 -1
  672. package/build/assets/conversation-panel-CvoGZ5vC.js +0 -1
  673. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  674. package/build/assets/external-link-zWbg5KXS.js +0 -1
  675. package/build/assets/files-tab-D5zuU5TY.js +0 -1
  676. package/build/assets/git-provider-icon-zuKz2cwo.js +0 -1
  677. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +0 -1
  678. package/build/assets/home-DqyeeFA_.js +0 -1
  679. package/build/assets/index-home-DqyeeFA_.js +0 -1
  680. package/build/assets/info-C9lpK5pw.js +0 -1
  681. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +0 -27
  682. package/build/assets/llm-settings-8eWBF3Ij.js +0 -1
  683. package/build/assets/llm-settings-D9ko42Pi.js +0 -1
  684. package/build/assets/llm-subscription-service-B3K-97lP.js +0 -1
  685. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  686. package/build/assets/manifest-e1c3bc3b.js +0 -1
  687. package/build/assets/markdown-renderer-DzvgdZey.js +0 -8
  688. package/build/assets/mcp-marketplace-utils-DSLou4n7.js +0 -1
  689. package/build/assets/messages-B2l0qLVk.js +0 -40
  690. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  691. package/build/assets/plus-CtzlyAoF.js +0 -1
  692. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +0 -1
  693. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  694. package/build/assets/root-CRK9fOFd.css +0 -1
  695. package/build/assets/root-layout-BFN2rCOy.js +0 -2
  696. package/build/assets/search-CYaiKHRp.js +0 -1
  697. package/build/assets/shared-conversation-BIAcuORk.js +0 -1
  698. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  699. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  700. package/build/assets/use-create-conversation-CRf1dCm5.js +0 -1
  701. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  702. package/build/assets/use-llm-profiles-CHxqoHiN.js +0 -1
  703. package/build/assets/use-save-agent-profile-CH9_EXQG.js +0 -1
  704. package/build/assets/utils-DPQfkd-7.js +0 -1
  705. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  706. package/build/assets/x-RYDBg-e2.js +0 -1
  707. package/build/assets/zap-tbKDzCe3.js +0 -1
  708. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  709. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  710. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  711. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  712. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  713. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  714. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  715. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  716. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  717. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  718. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  719. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  720. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  721. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  722. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  723. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  724. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  725. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  726. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  727. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  728. package/dist/icons/u-credit-card.cjs +0 -2
  729. package/dist/icons/u-credit-card.cjs.map +0 -1
  730. package/dist/icons/u-credit-card.js +0 -21
  731. package/dist/icons/u-credit-card.js.map +0 -1
  732. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js} +0 -0
@@ -1,7 +1,6 @@
1
1
  import "../features/chat/chat-interface.js";
2
2
  import "../features/conversation/conversation-main/chat-interface-wrapper.js";
3
3
  import "../features/conversation/conversation-loading.js";
4
- import "../features/conversation/metrics-modal/metrics-modal.js";
5
4
  import "../features/conversation/conversation-name.js";
6
5
  import "../features/conversation/conversation-name-with-status.js";
7
6
  import "../features/conversation/conversation-tabs/conversation-tabs.js";
@@ -1,2 +1,2 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs");require("../../../../constants/canvas-ui.cjs"),require("../../../../constants/child-conversation.cjs");const i=require("../../../../types/agent-server/type-guards.cjs"),a=require("./get-acp-tool-call-content.cjs"),o=require("./get-action-event-title.cjs"),s=require("../../../features/chat/mono-component.cjs"),c=require("../../../features/chat/path-component.cjs"),l=require("./get-action-content.cjs"),u=require("./get-observation-content.cjs"),d=require("../task-tracking/task-tracking-observation-content.cjs"),f=require("./create-skill-ready-event.cjs"),p=require("../../../features/chat/tool-visualizers/dispatcher.cjs");let m=require("react");m=e.__toESM(m,1);let h=require("react/jsx-runtime");var g=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(c.PathComponent,{}),cmd:(0,h.jsx)(s.MonoComponent,{})}}):e,_=e=>e.kind===`text`?e.text:g(e.key,e.values),v=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?o.trimEventTitleText(n,t):n:null},y=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=v(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},b=(e,t)=>{let n=t?.tool_name,r=e.observation,i=v(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=v((t?.action??{}).profile_name)??v(r.profile_name)??v(r.base_url,80)??v(r.endpoint,80)??v(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},x=e=>i.isActionEvent(e)?y(e)||_(o.getActionEventTitleDescriptor(e)):``,S=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=b(e,t);if(n)return n;if(t){let e=y(t);if(e)return e;let n=o.getActionSummaryTitle(t);if(n)return n}let r=e.observation.kind,a=``,s={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,s={command:e.observation.command?o.trimEventTitleText(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,s={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,s={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,s={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,s={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){a=`OBSERVATION_MESSAGE$CANVAS_UI`;break}if(e.tool_name===`launch_child_conversation`){a=`OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,s={name:e.observation.profile_name};break;case`BrowserObservation`:a=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;a=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:a=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:a=`OBSERVATION_MESSAGE$GLOB`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,s):r},C=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!i.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,w=(e,t)=>{let o=``,s=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;o=r.default.exists(t)?g(t,{}):`Skill Ready`,s=e._skillReadyContent}else i.isActionEvent(e)?(o=x(e),s=p.resolveVisualizerBody(e)??l.getActionContent(e)):i.isObservationEvent(e)?(o=S(e,t),s=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):C(e,t)??p.resolveVisualizerBody(e,t)??u.getObservationContent(e)):i.isACPToolCallEvent(e)?(o=g(a.getACPToolCallTitleKey(e),{title:a.stripRedundantTitlePrefix(e)}),s=a.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(o=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:o||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:s}};exports.getEventContent=w;
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs");require("../../../../constants/canvas-ui.cjs"),require("../../../../constants/child-conversation.cjs");const i=require("../../../../types/agent-server/type-guards.cjs"),a=require("./get-acp-tool-call-content.cjs"),o=require("./get-action-event-title.cjs"),s=require("../../../features/chat/mono-component.cjs"),c=require("../../../features/chat/path-component.cjs"),l=require("./get-action-content.cjs"),u=require("./get-observation-content.cjs"),d=require("../task-tracking/task-tracking-observation-content.cjs"),f=require("./create-skill-ready-event.cjs"),p=require("../../../features/chat/tool-visualizers/dispatcher.cjs");let m=require("react");m=e.__toESM(m,1);let h=require("react/jsx-runtime");var g=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(c.PathComponent,{}),cmd:(0,h.jsx)(s.MonoComponent,{})}}):e,_=e=>e.kind===`text`?e.text:g(e.key,e.values),v=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?o.trimEventTitleText(n,t):n:null},y=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=v(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},b=(e,t)=>{let n=t?.tool_name,r=e.observation,i=v(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=v((t?.action??{}).profile_name)??v(r.profile_name)??v(r.base_url,80)??v(r.endpoint,80)??v(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},x=e=>i.isActionEvent(e)?y(e)||_(o.getActionEventTitleDescriptor(e)):``,S=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=b(e,t);if(n)return n;if(t){let e=y(t);if(e)return e;let n=o.getActionSummaryTitle(t);if(n)return n}let r=e.observation.kind,a=``,s={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,s={command:e.observation.command?o.trimEventTitleText(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:e.observation.command===`create`?`OBSERVATION_MESSAGE$WRITE`:`OBSERVATION_MESSAGE$EDIT`,s={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,s={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,s={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,s={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){a=`OBSERVATION_MESSAGE$CANVAS_UI`;break}if(e.tool_name===`launch_child_conversation`){a=`OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,s={name:e.observation.profile_name};break;case`BrowserObservation`:a=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;a=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:a=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:a=`OBSERVATION_MESSAGE$GLOB`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,s):r},C=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!i.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,w=(e,t)=>{let o=``,s=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;o=r.default.exists(t)?g(t,{}):`Skill Ready`,s=e._skillReadyContent}else i.isActionEvent(e)?(o=x(e),s=p.resolveVisualizerBody(e)??l.getActionContent(e)):i.isObservationEvent(e)?(o=S(e,t),s=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):C(e,t)??p.resolveVisualizerBody(e,t)??u.getObservationContent(e)):i.isACPToolCallEvent(e)?(o=g(a.getACPToolCallTitleKey(e),{title:a.stripRedundantTitlePrefix(e)}),s=a.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(o=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:o||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:s}};exports.getEventContent=w;
2
2
  //# sourceMappingURL=get-event-content.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else if (event.observation.command === \"create\") {\n observationKey = \"OBSERVATION_MESSAGE$WRITE\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
@@ -55,7 +55,7 @@ var x = (t, r) => n.exists(t) ? /* @__PURE__ */ b(e, {
55
55
  break;
56
56
  case "FileEditorObservation":
57
57
  case "StrReplaceEditorObservation":
58
- i = e.observation.command === "view" ? "OBSERVATION_MESSAGE$READ" : "OBSERVATION_MESSAGE$EDIT", a = { path: e.observation.path || "" };
58
+ i = e.observation.command === "view" ? "OBSERVATION_MESSAGE$READ" : e.observation.command === "create" ? "OBSERVATION_MESSAGE$WRITE" : "OBSERVATION_MESSAGE$EDIT", a = { path: e.observation.path || "" };
59
59
  break;
60
60
  case "MCPToolObservation":
61
61
  i = "OBSERVATION_MESSAGE$MCP", a = { mcp_tool_name: e.observation.tool_name };
@@ -1 +1 @@
1
- {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else if (event.observation.command === \"create\") {\n observationKey = \"OBSERVATION_MESSAGE$WRITE\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs"),t=require("../../../../types/agent-server/type-guards.cjs"),n=require("../../../features/chat/generic-event-message.cjs"),r=require("../../../../icons/skills.cjs"),i=require("../../../shared/buttons/conversation-confirmation-buttons.cjs"),a=require("../event-content-helpers/get-observation-result.cjs"),o=require("../event-content-helpers/create-skill-ready-event.cjs"),s=require("../event-content-helpers/get-event-content.cjs"),c=require("../event-content-helpers/get-invoke-skill-items.cjs"),l=require("./skill-ready-content-list.cjs");let u=require("react/jsx-runtime");function d(n){if(o.isSkillReadyEvent(n))return n._skillReadyItems.length>0?{items:n._skillReadyItems,titleKey:e.I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE}:null;if(t.isObservationEvent(n)&&n.observation.kind===`InvokeSkillObservation`){let t=c.getInvokeSkillItems(n);return t.length>0?{items:t,titleKey:e.I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE}:null}return null}function f({event:e,isLastMessage:c,correspondingAction:f}){let{title:p,details:m}=s.getEventContent(e,f);if(!o.isSkillReadyEvent(e)&&t.isObservationEvent(e)&&e.observation.kind===`TaskTrackerObservation`)return(0,u.jsx)(`div`,{children:m});let h;o.isSkillReadyEvent(e)?h=`success`:t.isObservationEvent(e)?h=a.getObservationResult(e):t.isACPToolCallEvent(e)&&(h=a.getACPToolCallResult(e));let g=d(e);return(0,u.jsxs)(`div`,{children:[(0,u.jsx)(n.GenericEventMessage,{title:p,details:g?(0,u.jsx)(l.SkillReadyContentList,{items:g.items,titleKey:g.titleKey}):m,success:h,initiallyExpanded:!1,titleIcon:g?(0,u.jsx)(r.default,{className:`h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2`}):void 0}),c&&(0,u.jsx)(i.ConversationConfirmationButtons,{})]})}exports.GenericEventMessageWrapper=f;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs"),t=require("../../../../types/agent-server/type-guards.cjs"),n=require("../../../features/chat/generic-event-message.cjs"),r=require("../../../../icons/skills.cjs"),i=require("../../../shared/buttons/conversation-confirmation-buttons.cjs"),a=require("../event-content-helpers/get-observation-result.cjs"),o=require("../event-content-helpers/create-skill-ready-event.cjs"),s=require("../../../features/chat/tool-visualizers/primitives/markdown-file-preview.cjs"),c=require("../event-content-helpers/get-event-content.cjs"),l=require("../event-content-helpers/get-invoke-skill-items.cjs"),u=require("./skill-ready-content-list.cjs");let d=require("react/jsx-runtime");function f(n){if(o.isSkillReadyEvent(n))return n._skillReadyItems.length>0?{items:n._skillReadyItems,titleKey:e.I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE}:null;if(t.isObservationEvent(n)&&n.observation.kind===`InvokeSkillObservation`){let t=l.getInvokeSkillItems(n);return t.length>0?{items:t,titleKey:e.I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE}:null}return null}function p({event:e,isLastMessage:l,correspondingAction:p}){let{title:m,details:h}=c.getEventContent(e,p);if(!o.isSkillReadyEvent(e)&&t.isObservationEvent(e)&&e.observation.kind===`TaskTrackerObservation`)return(0,d.jsx)(`div`,{children:h});let g;o.isSkillReadyEvent(e)?g=`success`:t.isObservationEvent(e)?g=a.getObservationResult(e):t.isACPToolCallEvent(e)&&(g=a.getACPToolCallResult(e));let _=f(e),v=_?(0,d.jsx)(u.SkillReadyContentList,{items:_.items,titleKey:_.titleKey}):h,y=!o.isSkillReadyEvent(e)&&s.isMarkdownFileEditorEvent(e,p);return(0,d.jsxs)(`div`,{children:[(0,d.jsx)(n.GenericEventMessage,{title:m,details:v,success:g,initiallyExpanded:y,titleIcon:_?(0,d.jsx)(r.default,{className:`h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2`}):void 0}),l&&(0,d.jsx)(i.ConversationConfirmationButtons,{})]})}exports.GenericEventMessageWrapper=p;
2
2
  //# sourceMappingURL=generic-event-message-wrapper.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic-event-message-wrapper.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.tsx"],"sourcesContent":["import {\n OpenHandsEvent,\n ActionEvent,\n ObservationEvent,\n} from \"#/types/agent-server/core\";\nimport { InvokeSkillObservation } from \"#/types/agent-server/core/base/observation\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GenericEventMessage } from \"../../../features/chat/generic-event-message\";\nimport { getEventContent } from \"../event-content-helpers/get-event-content\";\nimport {\n getACPToolCallResult,\n getObservationResult,\n ObservationResultStatus,\n} from \"../event-content-helpers/get-observation-result\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport {\n SkillReadyEvent,\n SkillReadyItem,\n isSkillReadyEvent,\n} from \"../event-content-helpers/create-skill-ready-event\";\nimport { getInvokeSkillItems } from \"../event-content-helpers/get-invoke-skill-items\";\nimport { ConversationConfirmationButtons } from \"#/components/shared/buttons/conversation-confirmation-buttons\";\nimport { SkillReadyContentList } from \"./skill-ready-content-list\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\n\ninterface GenericEventMessageWrapperProps {\n event: OpenHandsEvent | SkillReadyEvent;\n isLastMessage: boolean;\n correspondingAction?: ActionEvent;\n}\n\n/**\n * Resolves the expandable skill-knowledge list shared by Skill Ready events and\n * invoke-skill tool observations. Returns the list items and their header\n * label, or null when the event carries no skill knowledge (so the caller keeps\n * the default details body). Additional skill-knowledge sources slot in as one\n * more branch here.\n */\nfunction getSkillKnowledge(\n event: OpenHandsEvent | SkillReadyEvent,\n): { items: SkillReadyItem[]; titleKey: I18nKey } | null {\n if (isSkillReadyEvent(event)) {\n return event._skillReadyItems.length > 0\n ? {\n items: event._skillReadyItems,\n titleKey: I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE,\n }\n : null;\n }\n if (\n isObservationEvent(event) &&\n event.observation.kind === \"InvokeSkillObservation\"\n ) {\n const items = getInvokeSkillItems(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n return items.length > 0\n ? { items, titleKey: I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE }\n : null;\n }\n return null;\n}\n\nexport function GenericEventMessageWrapper({\n event,\n isLastMessage,\n correspondingAction,\n}: GenericEventMessageWrapperProps) {\n const { title, details } = getEventContent(event, correspondingAction);\n\n // TaskTrackerObservation has its own rendering\n if (\n !isSkillReadyEvent(event) &&\n isObservationEvent(event) &&\n event.observation.kind === \"TaskTrackerObservation\"\n ) {\n return <div>{details}</div>;\n }\n\n // Determine success status\n let success: ObservationResultStatus | undefined;\n if (isSkillReadyEvent(event)) {\n success = \"success\";\n } else if (isObservationEvent(event)) {\n success = getObservationResult(event);\n } else if (isACPToolCallEvent(event)) {\n success = getACPToolCallResult(event);\n }\n\n // Skill Ready events and invoke-skill tool observations both render the\n // expandable skill-knowledge list (with the skills icon); they differ only in\n // the header label.\n const skillKnowledge = getSkillKnowledge(event);\n const bodyDetails = skillKnowledge ? (\n <SkillReadyContentList\n items={skillKnowledge.items}\n titleKey={skillKnowledge.titleKey}\n />\n ) : (\n details\n );\n\n return (\n <div>\n <GenericEventMessage\n title={title}\n details={bodyDetails}\n success={success}\n initiallyExpanded={false}\n titleIcon={\n skillKnowledge ? (\n <SkillsIcon className=\"h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2\" />\n ) : undefined\n }\n />\n {isLastMessage && <ConversationConfirmationButtons />}\n </div>\n );\n}\n"],"mappings":"yqBAyCA,SAAS,EACP,EACuD,CACvD,GAAI,EAAA,kBAAkB,CAAK,EACzB,OAAO,EAAM,iBAAiB,OAAS,EACnC,CACE,MAAO,EAAM,iBACb,SAAU,EAAA,QAAQ,gCACpB,EACA,KAEN,GACE,EAAA,mBAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,yBAC3B,CACA,IAAM,EAAQ,EAAA,oBACZ,CACF,EACA,OAAO,EAAM,OAAS,EAClB,CAAE,QAAO,SAAU,EAAA,QAAQ,8BAA+B,EAC1D,IACN,CACA,OAAO,IACT,CAEA,SAAgB,EAA2B,CACzC,QACA,gBACA,uBACkC,CAClC,GAAM,CAAE,QAAO,WAAY,EAAA,gBAAgB,EAAO,CAAmB,EAGrE,GACE,CAAC,EAAA,kBAAkB,CAAK,GACxB,EAAA,mBAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,yBAE3B,OAAO,EAAA,EAAA,KAAC,MAAD,CAAA,SAAM,CAAa,CAAA,EAI5B,IAAI,EACA,EAAA,kBAAkB,CAAK,EACzB,EAAU,UACD,EAAA,mBAAmB,CAAK,EACjC,EAAU,EAAA,qBAAqB,CAAK,EAC3B,EAAA,mBAAmB,CAAK,IACjC,EAAU,EAAA,qBAAqB,CAAK,GAMtC,IAAM,EAAiB,EAAkB,CAAK,EAU9C,OACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,oBAAD,CACS,QACP,QAbc,GAClB,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,MAAO,EAAe,MACtB,SAAU,EAAe,QAC1B,CAAA,EAED,EAQa,UACT,kBAAmB,GACnB,UACE,GACE,EAAA,EAAA,KAAC,EAAA,QAAD,CAAY,UAAU,qDAAuD,CAAA,EAC3E,IAAA,EAEP,CAAA,EACA,IAAiB,EAAA,EAAA,KAAC,EAAA,gCAAD,CAAkC,CAAA,CACjD,CAAA,CAAA,CAET"}
1
+ {"version":3,"file":"generic-event-message-wrapper.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.tsx"],"sourcesContent":["import {\n OpenHandsEvent,\n ActionEvent,\n ObservationEvent,\n} from \"#/types/agent-server/core\";\nimport { InvokeSkillObservation } from \"#/types/agent-server/core/base/observation\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GenericEventMessage } from \"../../../features/chat/generic-event-message\";\nimport { getEventContent } from \"../event-content-helpers/get-event-content\";\nimport {\n getACPToolCallResult,\n getObservationResult,\n ObservationResultStatus,\n} from \"../event-content-helpers/get-observation-result\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport {\n SkillReadyEvent,\n SkillReadyItem,\n isSkillReadyEvent,\n} from \"../event-content-helpers/create-skill-ready-event\";\nimport { getInvokeSkillItems } from \"../event-content-helpers/get-invoke-skill-items\";\nimport { ConversationConfirmationButtons } from \"#/components/shared/buttons/conversation-confirmation-buttons\";\nimport { SkillReadyContentList } from \"./skill-ready-content-list\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport { isMarkdownFileEditorEvent } from \"#/components/features/chat/tool-visualizers/primitives/markdown-file-preview\";\n\ninterface GenericEventMessageWrapperProps {\n event: OpenHandsEvent | SkillReadyEvent;\n isLastMessage: boolean;\n correspondingAction?: ActionEvent;\n}\n\n/**\n * Resolves the expandable skill-knowledge list shared by Skill Ready events and\n * invoke-skill tool observations. Returns the list items and their header\n * label, or null when the event carries no skill knowledge (so the caller keeps\n * the default details body). Additional skill-knowledge sources slot in as one\n * more branch here.\n */\nfunction getSkillKnowledge(\n event: OpenHandsEvent | SkillReadyEvent,\n): { items: SkillReadyItem[]; titleKey: I18nKey } | null {\n if (isSkillReadyEvent(event)) {\n return event._skillReadyItems.length > 0\n ? {\n items: event._skillReadyItems,\n titleKey: I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE,\n }\n : null;\n }\n if (\n isObservationEvent(event) &&\n event.observation.kind === \"InvokeSkillObservation\"\n ) {\n const items = getInvokeSkillItems(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n return items.length > 0\n ? { items, titleKey: I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE }\n : null;\n }\n return null;\n}\n\nexport function GenericEventMessageWrapper({\n event,\n isLastMessage,\n correspondingAction,\n}: GenericEventMessageWrapperProps) {\n const { title, details } = getEventContent(event, correspondingAction);\n\n // TaskTrackerObservation has its own rendering\n if (\n !isSkillReadyEvent(event) &&\n isObservationEvent(event) &&\n event.observation.kind === \"TaskTrackerObservation\"\n ) {\n return <div>{details}</div>;\n }\n\n // Determine success status\n let success: ObservationResultStatus | undefined;\n if (isSkillReadyEvent(event)) {\n success = \"success\";\n } else if (isObservationEvent(event)) {\n success = getObservationResult(event);\n } else if (isACPToolCallEvent(event)) {\n success = getACPToolCallResult(event);\n }\n\n // Skill Ready events and invoke-skill tool observations both render the\n // expandable skill-knowledge list (with the skills icon); they differ only in\n // the header label.\n const skillKnowledge = getSkillKnowledge(event);\n const bodyDetails = skillKnowledge ? (\n <SkillReadyContentList\n items={skillKnowledge.items}\n titleKey={skillKnowledge.titleKey}\n />\n ) : (\n details\n );\n\n // Markdown file-editor cards carry a clipped preview; expand them by\n // default so the artifact is visible without an extra chevron click.\n const initiallyExpanded =\n !isSkillReadyEvent(event) &&\n isMarkdownFileEditorEvent(event, correspondingAction);\n\n return (\n <div>\n <GenericEventMessage\n title={title}\n details={bodyDetails}\n success={success}\n initiallyExpanded={initiallyExpanded}\n titleIcon={\n skillKnowledge ? (\n <SkillsIcon className=\"h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2\" />\n ) : undefined\n }\n />\n {isLastMessage && <ConversationConfirmationButtons />}\n </div>\n );\n}\n"],"mappings":"mwBA0CA,SAAS,EACP,EACuD,CACvD,GAAI,EAAA,kBAAkB,CAAK,EACzB,OAAO,EAAM,iBAAiB,OAAS,EACnC,CACE,MAAO,EAAM,iBACb,SAAU,EAAA,QAAQ,gCACpB,EACA,KAEN,GACE,EAAA,mBAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,yBAC3B,CACA,IAAM,EAAQ,EAAA,oBACZ,CACF,EACA,OAAO,EAAM,OAAS,EAClB,CAAE,QAAO,SAAU,EAAA,QAAQ,8BAA+B,EAC1D,IACN,CACA,OAAO,IACT,CAEA,SAAgB,EAA2B,CACzC,QACA,gBACA,uBACkC,CAClC,GAAM,CAAE,QAAO,WAAY,EAAA,gBAAgB,EAAO,CAAmB,EAGrE,GACE,CAAC,EAAA,kBAAkB,CAAK,GACxB,EAAA,mBAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,yBAE3B,OAAO,EAAA,EAAA,KAAC,MAAD,CAAA,SAAM,CAAa,CAAA,EAI5B,IAAI,EACA,EAAA,kBAAkB,CAAK,EACzB,EAAU,UACD,EAAA,mBAAmB,CAAK,EACjC,EAAU,EAAA,qBAAqB,CAAK,EAC3B,EAAA,mBAAmB,CAAK,IACjC,EAAU,EAAA,qBAAqB,CAAK,GAMtC,IAAM,EAAiB,EAAkB,CAAK,EACxC,EAAc,GAClB,EAAA,EAAA,KAAC,EAAA,sBAAD,CACE,MAAO,EAAe,MACtB,SAAU,EAAe,QAC1B,CAAA,EAED,EAKI,EACJ,CAAC,EAAA,kBAAkB,CAAK,GACxB,EAAA,0BAA0B,EAAO,CAAmB,EAEtD,OACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAA,oBAAD,CACS,QACP,QAAS,EACA,UACU,oBACnB,UACE,GACE,EAAA,EAAA,KAAC,EAAA,QAAD,CAAY,UAAU,qDAAuD,CAAA,EAC3E,IAAA,EAEP,CAAA,EACA,IAAiB,EAAA,EAAA,KAAC,EAAA,gCAAD,CAAkC,CAAA,CACjD,CAAA,CAAA,CAET"}
@@ -5,18 +5,19 @@ import i from "../../../../icons/skills.js";
5
5
  import { ConversationConfirmationButtons as a } from "../../../shared/buttons/conversation-confirmation-buttons.js";
6
6
  import { getACPToolCallResult as o, getObservationResult as s } from "../event-content-helpers/get-observation-result.js";
7
7
  import { isSkillReadyEvent as c } from "../event-content-helpers/create-skill-ready-event.js";
8
- import { getEventContent as l } from "../event-content-helpers/get-event-content.js";
9
- import { getInvokeSkillItems as u } from "../event-content-helpers/get-invoke-skill-items.js";
10
- import { SkillReadyContentList as d } from "./skill-ready-content-list.js";
11
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
+ import { isMarkdownFileEditorEvent as l } from "../../../features/chat/tool-visualizers/primitives/markdown-file-preview.js";
9
+ import { getEventContent as u } from "../event-content-helpers/get-event-content.js";
10
+ import { getInvokeSkillItems as d } from "../event-content-helpers/get-invoke-skill-items.js";
11
+ import { SkillReadyContentList as f } from "./skill-ready-content-list.js";
12
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
12
13
  //#region src/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.tsx
13
- function m(t) {
14
+ function h(t) {
14
15
  if (c(t)) return t._skillReadyItems.length > 0 ? {
15
16
  items: t._skillReadyItems,
16
17
  titleKey: e.SKILLS$TRIGGERED_SKILL_KNOWLEDGE
17
18
  } : null;
18
19
  if (n(t) && t.observation.kind === "InvokeSkillObservation") {
19
- let n = u(t);
20
+ let n = d(t);
20
21
  return n.length > 0 ? {
21
22
  items: n,
22
23
  titleKey: e.SKILLS$INVOKED_SKILL_KNOWLEDGE
@@ -24,24 +25,24 @@ function m(t) {
24
25
  }
25
26
  return null;
26
27
  }
27
- function h({ event: e, isLastMessage: u, correspondingAction: h }) {
28
- let { title: g, details: _ } = l(e, h);
29
- if (!c(e) && n(e) && e.observation.kind === "TaskTrackerObservation") return /* @__PURE__ */ f("div", { children: _ });
30
- let v;
31
- c(e) ? v = "success" : n(e) ? v = s(e) : t(e) && (v = o(e));
32
- let y = m(e);
33
- return /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f(r, {
34
- title: g,
35
- details: y ? /* @__PURE__ */ f(d, {
36
- items: y.items,
37
- titleKey: y.titleKey
38
- }) : _,
39
- success: v,
40
- initiallyExpanded: !1,
41
- titleIcon: y ? /* @__PURE__ */ f(i, { className: "h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2" }) : void 0
42
- }), u && /* @__PURE__ */ f(a, {})] });
28
+ function g({ event: e, isLastMessage: d, correspondingAction: g }) {
29
+ let { title: _, details: v } = u(e, g);
30
+ if (!c(e) && n(e) && e.observation.kind === "TaskTrackerObservation") return /* @__PURE__ */ p("div", { children: v });
31
+ let y;
32
+ c(e) ? y = "success" : n(e) ? y = s(e) : t(e) && (y = o(e));
33
+ let b = h(e), x = b ? /* @__PURE__ */ p(f, {
34
+ items: b.items,
35
+ titleKey: b.titleKey
36
+ }) : v, S = !c(e) && l(e, g);
37
+ return /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(r, {
38
+ title: _,
39
+ details: x,
40
+ success: y,
41
+ initiallyExpanded: S,
42
+ titleIcon: b ? /* @__PURE__ */ p(i, { className: "h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2" }) : void 0
43
+ }), d && /* @__PURE__ */ p(a, {})] });
43
44
  }
44
45
  //#endregion
45
- export { h as GenericEventMessageWrapper };
46
+ export { g as GenericEventMessageWrapper };
46
47
 
47
48
  //# sourceMappingURL=generic-event-message-wrapper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic-event-message-wrapper.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.tsx"],"sourcesContent":["import {\n OpenHandsEvent,\n ActionEvent,\n ObservationEvent,\n} from \"#/types/agent-server/core\";\nimport { InvokeSkillObservation } from \"#/types/agent-server/core/base/observation\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GenericEventMessage } from \"../../../features/chat/generic-event-message\";\nimport { getEventContent } from \"../event-content-helpers/get-event-content\";\nimport {\n getACPToolCallResult,\n getObservationResult,\n ObservationResultStatus,\n} from \"../event-content-helpers/get-observation-result\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport {\n SkillReadyEvent,\n SkillReadyItem,\n isSkillReadyEvent,\n} from \"../event-content-helpers/create-skill-ready-event\";\nimport { getInvokeSkillItems } from \"../event-content-helpers/get-invoke-skill-items\";\nimport { ConversationConfirmationButtons } from \"#/components/shared/buttons/conversation-confirmation-buttons\";\nimport { SkillReadyContentList } from \"./skill-ready-content-list\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\n\ninterface GenericEventMessageWrapperProps {\n event: OpenHandsEvent | SkillReadyEvent;\n isLastMessage: boolean;\n correspondingAction?: ActionEvent;\n}\n\n/**\n * Resolves the expandable skill-knowledge list shared by Skill Ready events and\n * invoke-skill tool observations. Returns the list items and their header\n * label, or null when the event carries no skill knowledge (so the caller keeps\n * the default details body). Additional skill-knowledge sources slot in as one\n * more branch here.\n */\nfunction getSkillKnowledge(\n event: OpenHandsEvent | SkillReadyEvent,\n): { items: SkillReadyItem[]; titleKey: I18nKey } | null {\n if (isSkillReadyEvent(event)) {\n return event._skillReadyItems.length > 0\n ? {\n items: event._skillReadyItems,\n titleKey: I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE,\n }\n : null;\n }\n if (\n isObservationEvent(event) &&\n event.observation.kind === \"InvokeSkillObservation\"\n ) {\n const items = getInvokeSkillItems(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n return items.length > 0\n ? { items, titleKey: I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE }\n : null;\n }\n return null;\n}\n\nexport function GenericEventMessageWrapper({\n event,\n isLastMessage,\n correspondingAction,\n}: GenericEventMessageWrapperProps) {\n const { title, details } = getEventContent(event, correspondingAction);\n\n // TaskTrackerObservation has its own rendering\n if (\n !isSkillReadyEvent(event) &&\n isObservationEvent(event) &&\n event.observation.kind === \"TaskTrackerObservation\"\n ) {\n return <div>{details}</div>;\n }\n\n // Determine success status\n let success: ObservationResultStatus | undefined;\n if (isSkillReadyEvent(event)) {\n success = \"success\";\n } else if (isObservationEvent(event)) {\n success = getObservationResult(event);\n } else if (isACPToolCallEvent(event)) {\n success = getACPToolCallResult(event);\n }\n\n // Skill Ready events and invoke-skill tool observations both render the\n // expandable skill-knowledge list (with the skills icon); they differ only in\n // the header label.\n const skillKnowledge = getSkillKnowledge(event);\n const bodyDetails = skillKnowledge ? (\n <SkillReadyContentList\n items={skillKnowledge.items}\n titleKey={skillKnowledge.titleKey}\n />\n ) : (\n details\n );\n\n return (\n <div>\n <GenericEventMessage\n title={title}\n details={bodyDetails}\n success={success}\n initiallyExpanded={false}\n titleIcon={\n skillKnowledge ? (\n <SkillsIcon className=\"h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2\" />\n ) : undefined\n }\n />\n {isLastMessage && <ConversationConfirmationButtons />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAyCA,SAAS,EACP,GACuD;CACvD,IAAI,EAAkB,CAAK,GACzB,OAAO,EAAM,iBAAiB,SAAS,IACnC;EACE,OAAO,EAAM;EACb,UAAU,EAAQ;CACpB,IACA;CAEN,IACE,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,0BAC3B;EACA,IAAM,IAAQ,EACZ,CACF;EACA,OAAO,EAAM,SAAS,IAClB;GAAE;GAAO,UAAU,EAAQ;EAA+B,IAC1D;CACN;CACA,OAAO;AACT;AAEA,SAAgB,EAA2B,EACzC,UACA,kBACA,0BACkC;CAClC,IAAM,EAAE,UAAO,eAAY,EAAgB,GAAO,CAAmB;CAGrE,IACE,CAAC,EAAkB,CAAK,KACxB,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,0BAE3B,OAAO,kBAAC,OAAD,EAAA,UAAM,EAAa,CAAA;CAI5B,IAAI;CACJ,AAAI,EAAkB,CAAK,IACzB,IAAU,YACD,EAAmB,CAAK,IACjC,IAAU,EAAqB,CAAK,IAC3B,EAAmB,CAAK,MACjC,IAAU,EAAqB,CAAK;CAMtC,IAAM,IAAiB,EAAkB,CAAK;CAU9C,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACS;EACP,SAbc,IAClB,kBAAC,GAAD;GACE,OAAO,EAAe;GACtB,UAAU,EAAe;EAC1B,CAAA,IAED;EAQa;EACT,mBAAmB;EACnB,WACE,IACE,kBAAC,GAAD,EAAY,WAAU,sDAAuD,CAAA,IAC3E,KAAA;CAEP,CAAA,GACA,KAAiB,kBAAC,GAAD,CAAkC,CAAA,CACjD,EAAA,CAAA;AAET"}
1
+ {"version":3,"file":"generic-event-message-wrapper.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.tsx"],"sourcesContent":["import {\n OpenHandsEvent,\n ActionEvent,\n ObservationEvent,\n} from \"#/types/agent-server/core\";\nimport { InvokeSkillObservation } from \"#/types/agent-server/core/base/observation\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GenericEventMessage } from \"../../../features/chat/generic-event-message\";\nimport { getEventContent } from \"../event-content-helpers/get-event-content\";\nimport {\n getACPToolCallResult,\n getObservationResult,\n ObservationResultStatus,\n} from \"../event-content-helpers/get-observation-result\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport {\n SkillReadyEvent,\n SkillReadyItem,\n isSkillReadyEvent,\n} from \"../event-content-helpers/create-skill-ready-event\";\nimport { getInvokeSkillItems } from \"../event-content-helpers/get-invoke-skill-items\";\nimport { ConversationConfirmationButtons } from \"#/components/shared/buttons/conversation-confirmation-buttons\";\nimport { SkillReadyContentList } from \"./skill-ready-content-list\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport { isMarkdownFileEditorEvent } from \"#/components/features/chat/tool-visualizers/primitives/markdown-file-preview\";\n\ninterface GenericEventMessageWrapperProps {\n event: OpenHandsEvent | SkillReadyEvent;\n isLastMessage: boolean;\n correspondingAction?: ActionEvent;\n}\n\n/**\n * Resolves the expandable skill-knowledge list shared by Skill Ready events and\n * invoke-skill tool observations. Returns the list items and their header\n * label, or null when the event carries no skill knowledge (so the caller keeps\n * the default details body). Additional skill-knowledge sources slot in as one\n * more branch here.\n */\nfunction getSkillKnowledge(\n event: OpenHandsEvent | SkillReadyEvent,\n): { items: SkillReadyItem[]; titleKey: I18nKey } | null {\n if (isSkillReadyEvent(event)) {\n return event._skillReadyItems.length > 0\n ? {\n items: event._skillReadyItems,\n titleKey: I18nKey.SKILLS$TRIGGERED_SKILL_KNOWLEDGE,\n }\n : null;\n }\n if (\n isObservationEvent(event) &&\n event.observation.kind === \"InvokeSkillObservation\"\n ) {\n const items = getInvokeSkillItems(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n return items.length > 0\n ? { items, titleKey: I18nKey.SKILLS$INVOKED_SKILL_KNOWLEDGE }\n : null;\n }\n return null;\n}\n\nexport function GenericEventMessageWrapper({\n event,\n isLastMessage,\n correspondingAction,\n}: GenericEventMessageWrapperProps) {\n const { title, details } = getEventContent(event, correspondingAction);\n\n // TaskTrackerObservation has its own rendering\n if (\n !isSkillReadyEvent(event) &&\n isObservationEvent(event) &&\n event.observation.kind === \"TaskTrackerObservation\"\n ) {\n return <div>{details}</div>;\n }\n\n // Determine success status\n let success: ObservationResultStatus | undefined;\n if (isSkillReadyEvent(event)) {\n success = \"success\";\n } else if (isObservationEvent(event)) {\n success = getObservationResult(event);\n } else if (isACPToolCallEvent(event)) {\n success = getACPToolCallResult(event);\n }\n\n // Skill Ready events and invoke-skill tool observations both render the\n // expandable skill-knowledge list (with the skills icon); they differ only in\n // the header label.\n const skillKnowledge = getSkillKnowledge(event);\n const bodyDetails = skillKnowledge ? (\n <SkillReadyContentList\n items={skillKnowledge.items}\n titleKey={skillKnowledge.titleKey}\n />\n ) : (\n details\n );\n\n // Markdown file-editor cards carry a clipped preview; expand them by\n // default so the artifact is visible without an extra chevron click.\n const initiallyExpanded =\n !isSkillReadyEvent(event) &&\n isMarkdownFileEditorEvent(event, correspondingAction);\n\n return (\n <div>\n <GenericEventMessage\n title={title}\n details={bodyDetails}\n success={success}\n initiallyExpanded={initiallyExpanded}\n titleIcon={\n skillKnowledge ? (\n <SkillsIcon className=\"h-4 w-4 stroke-[var(--oh-muted)] flex-shrink-0 mr-2\" />\n ) : undefined\n }\n />\n {isLastMessage && <ConversationConfirmationButtons />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA0CA,SAAS,EACP,GACuD;CACvD,IAAI,EAAkB,CAAK,GACzB,OAAO,EAAM,iBAAiB,SAAS,IACnC;EACE,OAAO,EAAM;EACb,UAAU,EAAQ;CACpB,IACA;CAEN,IACE,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,0BAC3B;EACA,IAAM,IAAQ,EACZ,CACF;EACA,OAAO,EAAM,SAAS,IAClB;GAAE;GAAO,UAAU,EAAQ;EAA+B,IAC1D;CACN;CACA,OAAO;AACT;AAEA,SAAgB,EAA2B,EACzC,UACA,kBACA,0BACkC;CAClC,IAAM,EAAE,UAAO,eAAY,EAAgB,GAAO,CAAmB;CAGrE,IACE,CAAC,EAAkB,CAAK,KACxB,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,0BAE3B,OAAO,kBAAC,OAAD,EAAA,UAAM,EAAa,CAAA;CAI5B,IAAI;CACJ,AAAI,EAAkB,CAAK,IACzB,IAAU,YACD,EAAmB,CAAK,IACjC,IAAU,EAAqB,CAAK,IAC3B,EAAmB,CAAK,MACjC,IAAU,EAAqB,CAAK;CAMtC,IAAM,IAAiB,EAAkB,CAAK,GACxC,IAAc,IAClB,kBAAC,GAAD;EACE,OAAO,EAAe;EACtB,UAAU,EAAe;CAC1B,CAAA,IAED,GAKI,IACJ,CAAC,EAAkB,CAAK,KACxB,EAA0B,GAAO,CAAmB;CAEtD,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACS;EACP,SAAS;EACA;EACU;EACnB,WACE,IACE,kBAAC,GAAD,EAAY,WAAU,sDAAuD,CAAA,IAC3E,KAAA;CAEP,CAAA,GACA,KAAiB,kBAAC,GAAD,CAAkC,CAAA,CACjD,EAAA,CAAA;AAET"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../types/agent-server/type-guards.cjs"),t=require("./event-thought-helpers.cjs");var n=t=>{if(e.isActionEvent(t)){let{kind:e}=t.action;return!(e===`FinishAction`||e===`ThinkAction`)}return e.isObservationEvent(t)?!(e.isPlanningFileEditorObservationEvent(t)||t.observation.kind===`TaskTrackerObservation`):!1},r=(e,r=2,i=e)=>{if(r<1)throw Error(`minSize must be at least 1`);let a=[],o=new Set,s=null,c=()=>{s&&=(s.events.length>=r?a.push({kind:`group`,events:s.events,startIndex:s.startIndex}):s.events.forEach((e,t)=>{a.push({kind:`single`,event:e,index:s.startIndex+t})}),null)};return e.forEach((e,r)=>{if(n(e)){let n=t.getThoughtSourceAction(e,i);n&&!o.has(n.id)&&(c(),o.add(n.id),a.push({kind:`thought`,action:n,index:r})),s||={events:[],startIndex:r},s.events.push(e)}else c(),a.push({kind:`single`,event:e,index:r})}),c(),a};exports.groupEvents=r;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../types/agent-server/type-guards.cjs"),t=require("./event-thought-helpers.cjs"),n=require("../../features/chat/tool-visualizers/primitives/markdown-file-preview.cjs");var r=(t,r)=>{if(e.isActionEvent(t)){let{kind:e}=t.action;return!(e===`FinishAction`||e===`ThinkAction`||n.isMarkdownFileEditorEvent(t,r))}return e.isObservationEvent(t)?!(e.isPlanningFileEditorObservationEvent(t)||n.isMarkdownFileEditorEvent(t,r)||t.observation.kind===`TaskTrackerObservation`):!1},i=(n,i=2,a=n)=>{if(i<1)throw Error(`minSize must be at least 1`);let o=[],s=new Set,c=null,l=()=>{c&&=(c.events.length>=i?o.push({kind:`group`,events:c.events,startIndex:c.startIndex}):c.events.forEach((e,t)=>{o.push({kind:`single`,event:e,index:c.startIndex+t})}),null)};return n.forEach((n,i)=>{if(r(n,e.isObservationEvent(n)?a.find(t=>e.isActionEvent(t)&&t.id===n.action_id):void 0)){let e=t.getThoughtSourceAction(n,a);e&&!s.has(e.id)&&(l(),s.add(e.id),o.push({kind:`thought`,action:e,index:i})),c||={events:[],startIndex:i},c.events.push(n)}else l(),o.push({kind:`single`,event:n,index:i})}),l(),o};exports.groupEvents=i;
2
2
  //# sourceMappingURL=group-events.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-events.cjs","names":[],"sources":["../../../../src/components/conversation-events/chat/group-events.ts"],"sourcesContent":["import { ActionEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isPlanningFileEditorObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { getThoughtSourceAction } from \"./event-thought-helpers\";\n\n/** Minimum run-length before consecutive actions get folded into a single\n * collapsible group. Even pairs are folded so the chat scroll stays compact\n * when the agent fires off back-to-back tool calls. */\nexport const EVENT_GROUP_MIN_SIZE = 2;\n\n/**\n * Returns true if the given event is one of the action / observation cards\n * that we want to fold into an `EventGroup` when several appear in a row.\n *\n * Events that have their own dedicated rendering (FinishAction, ThinkAction,\n * HookExecution, AgentError, MessageEvent, PlanPreview, TaskTracker) are\n * treated as group breakers.\n */\nexport const isGroupableEvent = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n const { kind } = event.action;\n if (kind === \"FinishAction\" || kind === \"ThinkAction\") {\n return false;\n }\n return true;\n }\n\n if (isObservationEvent(event)) {\n if (isPlanningFileEditorObservationEvent(event)) {\n return false;\n }\n if (event.observation.kind === \"TaskTrackerObservation\") {\n return false;\n }\n return true;\n }\n\n return false;\n};\n\nexport type RenderedItem =\n | { kind: \"single\"; event: OpenHandsEvent; index: number }\n | { kind: \"thought\"; action: ActionEvent; index: number }\n | { kind: \"group\"; events: OpenHandsEvent[]; startIndex: number };\n\n/**\n * Walk a list of UI events and bucket consecutive groupable events into\n * `group` items. Anything that breaks the run, or runs shorter than\n * `EVENT_GROUP_MIN_SIZE`, is emitted as `single` items so they keep rendering\n * the way they always have.\n *\n * Whenever a groupable event carries an agent thought (either an\n * `ActionEvent.thought` or the corresponding action of an\n * `ObservationEvent`), the thought is hoisted out as its own `thought`\n * `RenderedItem`, the current run is flushed, and a new run is started with\n * the event itself. This keeps reasoning text in the main message stream\n * instead of buried inside a collapsed action group.\n *\n * `allEvents` should be the full event history so observations can find\n * their matching action; if omitted, it defaults to `events`.\n */\nexport const groupEvents = (\n events: OpenHandsEvent[],\n minSize: number = EVENT_GROUP_MIN_SIZE,\n allEvents: OpenHandsEvent[] = events,\n): RenderedItem[] => {\n if (minSize < 1) {\n throw new Error(\"minSize must be at least 1\");\n }\n\n const items: RenderedItem[] = [];\n const emittedThoughtActionIds = new Set<string>();\n let run: { events: OpenHandsEvent[]; startIndex: number } | null = null;\n\n const flushRun = () => {\n if (!run) return;\n if (run.events.length >= minSize) {\n items.push({\n kind: \"group\",\n events: run.events,\n startIndex: run.startIndex,\n });\n } else {\n run.events.forEach((event, offset) => {\n items.push({ kind: \"single\", event, index: run!.startIndex + offset });\n });\n }\n run = null;\n };\n\n events.forEach((event, index) => {\n if (isGroupableEvent(event)) {\n const thoughtAction = getThoughtSourceAction(event, allEvents);\n if (thoughtAction && !emittedThoughtActionIds.has(thoughtAction.id)) {\n flushRun();\n emittedThoughtActionIds.add(thoughtAction.id);\n items.push({ kind: \"thought\", action: thoughtAction, index });\n }\n if (!run) run = { events: [], startIndex: index };\n run.events.push(event);\n } else {\n flushRun();\n items.push({ kind: \"single\", event, index });\n }\n });\n\n flushRun();\n return items;\n};\n"],"mappings":"2JAqBA,IAAa,EAAoB,GAAmC,CAClE,GAAI,EAAA,cAAc,CAAK,EAAG,CACxB,GAAM,CAAE,QAAS,EAAM,OAIvB,MAHA,EAAI,IAAS,gBAAkB,IAAS,cAI1C,CAYA,OAVI,EAAA,mBAAmB,CAAK,EAI1B,EAHI,EAAA,qCAAqC,CAAK,GAG1C,EAAM,YAAY,OAAS,0BAM1B,EACT,EAuBa,GACX,EACA,EAAA,EACA,EAA8B,IACX,CACnB,GAAI,EAAU,EACZ,MAAU,MAAM,4BAA4B,EAG9C,IAAM,EAAwB,CAAC,EACzB,EAA0B,IAAI,IAChC,EAA+D,KAE7D,MAAiB,CAChB,AAYL,KAXI,EAAI,OAAO,QAAU,EACvB,EAAM,KAAK,CACT,KAAM,QACN,OAAQ,EAAI,OACZ,WAAY,EAAI,UAClB,CAAC,EAED,EAAI,OAAO,SAAS,EAAO,IAAW,CACpC,EAAM,KAAK,CAAE,KAAM,SAAU,QAAO,MAAO,EAAK,WAAa,CAAO,CAAC,CACvE,CAAC,EAEG,KACR,EAmBA,OAjBA,EAAO,SAAS,EAAO,IAAU,CAC/B,GAAI,EAAiB,CAAK,EAAG,CAC3B,IAAM,EAAgB,EAAA,uBAAuB,EAAO,CAAS,EACzD,GAAiB,CAAC,EAAwB,IAAI,EAAc,EAAE,IAChE,EAAS,EACT,EAAwB,IAAI,EAAc,EAAE,EAC5C,EAAM,KAAK,CAAE,KAAM,UAAW,OAAQ,EAAe,OAAM,CAAC,GAE9D,AAAU,IAAM,CAAE,OAAQ,CAAC,EAAG,WAAY,CAAM,EAChD,EAAI,OAAO,KAAK,CAAK,CACvB,MACE,EAAS,EACT,EAAM,KAAK,CAAE,KAAM,SAAU,QAAO,OAAM,CAAC,CAE/C,CAAC,EAED,EAAS,EACF,CACT"}
1
+ {"version":3,"file":"group-events.cjs","names":[],"sources":["../../../../src/components/conversation-events/chat/group-events.ts"],"sourcesContent":["import { ActionEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isPlanningFileEditorObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { isMarkdownFileEditorEvent } from \"#/components/features/chat/tool-visualizers/primitives/markdown-file-preview\";\nimport { getThoughtSourceAction } from \"./event-thought-helpers\";\n\n/** Minimum run-length before consecutive actions get folded into a single\n * collapsible group. Even pairs are folded so the chat scroll stays compact\n * when the agent fires off back-to-back tool calls. */\nexport const EVENT_GROUP_MIN_SIZE = 2;\n\n/**\n * Returns true if the given event is one of the action / observation cards\n * that we want to fold into an `EventGroup` when several appear in a row.\n *\n * Events that have their own dedicated rendering (FinishAction, ThinkAction,\n * HookExecution, AgentError, MessageEvent, PlanPreview, markdown file\n * artifacts, TaskTracker) are treated as group breakers.\n */\nexport const isGroupableEvent = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): boolean => {\n if (isActionEvent(event)) {\n const { kind } = event.action;\n if (kind === \"FinishAction\" || kind === \"ThinkAction\") {\n return false;\n }\n // Keep markdown *create* artifact cards outside collapsed groups so their\n // clipped preview is visible without expanding a parent summary.\n if (isMarkdownFileEditorEvent(event, correspondingAction)) {\n return false;\n }\n return true;\n }\n\n if (isObservationEvent(event)) {\n if (isPlanningFileEditorObservationEvent(event)) {\n return false;\n }\n if (isMarkdownFileEditorEvent(event, correspondingAction)) {\n return false;\n }\n if (event.observation.kind === \"TaskTrackerObservation\") {\n return false;\n }\n return true;\n }\n\n return false;\n};\n\nexport type RenderedItem =\n | { kind: \"single\"; event: OpenHandsEvent; index: number }\n | { kind: \"thought\"; action: ActionEvent; index: number }\n | { kind: \"group\"; events: OpenHandsEvent[]; startIndex: number };\n\n/**\n * Walk a list of UI events and bucket consecutive groupable events into\n * `group` items. Anything that breaks the run, or runs shorter than\n * `EVENT_GROUP_MIN_SIZE`, is emitted as `single` items so they keep rendering\n * the way they always have.\n *\n * Whenever a groupable event carries an agent thought (either an\n * `ActionEvent.thought` or the corresponding action of an\n * `ObservationEvent`), the thought is hoisted out as its own `thought`\n * `RenderedItem`, the current run is flushed, and a new run is started with\n * the event itself. This keeps reasoning text in the main message stream\n * instead of buried inside a collapsed action group.\n *\n * `allEvents` should be the full event history so observations can find\n * their matching action; if omitted, it defaults to `events`.\n */\nexport const groupEvents = (\n events: OpenHandsEvent[],\n minSize: number = EVENT_GROUP_MIN_SIZE,\n allEvents: OpenHandsEvent[] = events,\n): RenderedItem[] => {\n if (minSize < 1) {\n throw new Error(\"minSize must be at least 1\");\n }\n\n const items: RenderedItem[] = [];\n const emittedThoughtActionIds = new Set<string>();\n let run: { events: OpenHandsEvent[]; startIndex: number } | null = null;\n\n const flushRun = () => {\n if (!run) return;\n if (run.events.length >= minSize) {\n items.push({\n kind: \"group\",\n events: run.events,\n startIndex: run.startIndex,\n });\n } else {\n run.events.forEach((event, offset) => {\n items.push({ kind: \"single\", event, index: run!.startIndex + offset });\n });\n }\n run = null;\n };\n\n events.forEach((event, index) => {\n const correspondingAction = isObservationEvent(event)\n ? allEvents.find(\n (candidate): candidate is ActionEvent =>\n isActionEvent(candidate) && candidate.id === event.action_id,\n )\n : undefined;\n if (isGroupableEvent(event, correspondingAction)) {\n const thoughtAction = getThoughtSourceAction(event, allEvents);\n if (thoughtAction && !emittedThoughtActionIds.has(thoughtAction.id)) {\n flushRun();\n emittedThoughtActionIds.add(thoughtAction.id);\n items.push({ kind: \"thought\", action: thoughtAction, index });\n }\n if (!run) run = { events: [], startIndex: index };\n run.events.push(event);\n } else {\n flushRun();\n items.push({ kind: \"single\", event, index });\n }\n });\n\n flushRun();\n return items;\n};\n"],"mappings":"kPAsBA,IAAa,GACX,EACA,IACY,CACZ,GAAI,EAAA,cAAc,CAAK,EAAG,CACxB,GAAM,CAAE,QAAS,EAAM,OASvB,MAHA,EALI,IAAS,gBAAkB,IAAS,eAKpC,EAAA,0BAA0B,EAAO,CAAmB,EAI1D,CAeA,OAbI,EAAA,mBAAmB,CAAK,EAO1B,EANI,EAAA,qCAAqC,CAAK,GAG1C,EAAA,0BAA0B,EAAO,CAAmB,GAGpD,EAAM,YAAY,OAAS,0BAM1B,EACT,EAuBa,GACX,EACA,EAAA,EACA,EAA8B,IACX,CACnB,GAAI,EAAU,EACZ,MAAU,MAAM,4BAA4B,EAG9C,IAAM,EAAwB,CAAC,EACzB,EAA0B,IAAI,IAChC,EAA+D,KAE7D,MAAiB,CAChB,AAYL,KAXI,EAAI,OAAO,QAAU,EACvB,EAAM,KAAK,CACT,KAAM,QACN,OAAQ,EAAI,OACZ,WAAY,EAAI,UAClB,CAAC,EAED,EAAI,OAAO,SAAS,EAAO,IAAW,CACpC,EAAM,KAAK,CAAE,KAAM,SAAU,QAAO,MAAO,EAAK,WAAa,CAAO,CAAC,CACvE,CAAC,EAEG,KACR,EAyBA,OAvBA,EAAO,SAAS,EAAO,IAAU,CAO/B,GAAI,EAAiB,EANO,EAAA,mBAAmB,CAAK,EAChD,EAAU,KACP,GACC,EAAA,cAAc,CAAS,GAAK,EAAU,KAAO,EAAM,SACvD,EACA,IAAA,EAC2C,EAAG,CAChD,IAAM,EAAgB,EAAA,uBAAuB,EAAO,CAAS,EACzD,GAAiB,CAAC,EAAwB,IAAI,EAAc,EAAE,IAChE,EAAS,EACT,EAAwB,IAAI,EAAc,EAAE,EAC5C,EAAM,KAAK,CAAE,KAAM,UAAW,OAAQ,EAAe,OAAM,CAAC,GAE9D,AAAU,IAAM,CAAE,OAAQ,CAAC,EAAG,WAAY,CAAM,EAChD,EAAI,OAAO,KAAK,CAAK,CACvB,MACE,EAAS,EACT,EAAM,KAAK,CAAE,KAAM,SAAU,QAAO,OAAM,CAAC,CAE/C,CAAC,EAED,EAAS,EACF,CACT"}
@@ -8,10 +8,10 @@ export declare const EVENT_GROUP_MIN_SIZE = 2;
8
8
  * that we want to fold into an `EventGroup` when several appear in a row.
9
9
  *
10
10
  * Events that have their own dedicated rendering (FinishAction, ThinkAction,
11
- * HookExecution, AgentError, MessageEvent, PlanPreview, TaskTracker) are
12
- * treated as group breakers.
11
+ * HookExecution, AgentError, MessageEvent, PlanPreview, markdown file
12
+ * artifacts, TaskTracker) are treated as group breakers.
13
13
  */
14
- export declare const isGroupableEvent: (event: OpenHandsEvent) => boolean;
14
+ export declare const isGroupableEvent: (event: OpenHandsEvent, correspondingAction?: ActionEvent) => boolean;
15
15
  export type RenderedItem = {
16
16
  kind: "single";
17
17
  event: OpenHandsEvent;
@@ -1,45 +1,46 @@
1
1
  import { isActionEvent as e, isObservationEvent as t, isPlanningFileEditorObservationEvent as n } from "../../../types/agent-server/type-guards.js";
2
2
  import { getThoughtSourceAction as r } from "./event-thought-helpers.js";
3
- var i = (r) => {
3
+ import { isMarkdownFileEditorEvent as i } from "../../features/chat/tool-visualizers/primitives/markdown-file-preview.js";
4
+ var a = (r, a) => {
4
5
  if (e(r)) {
5
6
  let { kind: e } = r.action;
6
- return !(e === "FinishAction" || e === "ThinkAction");
7
+ return !(e === "FinishAction" || e === "ThinkAction" || i(r, a));
7
8
  }
8
- return t(r) ? !(n(r) || r.observation.kind === "TaskTrackerObservation") : !1;
9
- }, a = (e, t = 2, n = e) => {
10
- if (t < 1) throw Error("minSize must be at least 1");
11
- let a = [], o = /* @__PURE__ */ new Set(), s = null, c = () => {
12
- s &&= (s.events.length >= t ? a.push({
9
+ return t(r) ? !(n(r) || i(r, a) || r.observation.kind === "TaskTrackerObservation") : !1;
10
+ }, o = (n, i = 2, o = n) => {
11
+ if (i < 1) throw Error("minSize must be at least 1");
12
+ let s = [], c = /* @__PURE__ */ new Set(), l = null, u = () => {
13
+ l &&= (l.events.length >= i ? s.push({
13
14
  kind: "group",
14
- events: s.events,
15
- startIndex: s.startIndex
16
- }) : s.events.forEach((e, t) => {
17
- a.push({
15
+ events: l.events,
16
+ startIndex: l.startIndex
17
+ }) : l.events.forEach((e, t) => {
18
+ s.push({
18
19
  kind: "single",
19
20
  event: e,
20
- index: s.startIndex + t
21
+ index: l.startIndex + t
21
22
  });
22
23
  }), null);
23
24
  };
24
- return e.forEach((e, t) => {
25
- if (i(e)) {
26
- let i = r(e, n);
27
- i && !o.has(i.id) && (c(), o.add(i.id), a.push({
25
+ return n.forEach((n, i) => {
26
+ if (a(n, t(n) ? o.find((t) => e(t) && t.id === n.action_id) : void 0)) {
27
+ let e = r(n, o);
28
+ e && !c.has(e.id) && (u(), c.add(e.id), s.push({
28
29
  kind: "thought",
29
- action: i,
30
- index: t
31
- })), s ||= {
30
+ action: e,
31
+ index: i
32
+ })), l ||= {
32
33
  events: [],
33
- startIndex: t
34
- }, s.events.push(e);
35
- } else c(), a.push({
34
+ startIndex: i
35
+ }, l.events.push(n);
36
+ } else u(), s.push({
36
37
  kind: "single",
37
- event: e,
38
- index: t
38
+ event: n,
39
+ index: i
39
40
  });
40
- }), c(), a;
41
+ }), u(), s;
41
42
  };
42
43
  //#endregion
43
- export { a as groupEvents };
44
+ export { o as groupEvents };
44
45
 
45
46
  //# sourceMappingURL=group-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-events.js","names":[],"sources":["../../../../src/components/conversation-events/chat/group-events.ts"],"sourcesContent":["import { ActionEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isPlanningFileEditorObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { getThoughtSourceAction } from \"./event-thought-helpers\";\n\n/** Minimum run-length before consecutive actions get folded into a single\n * collapsible group. Even pairs are folded so the chat scroll stays compact\n * when the agent fires off back-to-back tool calls. */\nexport const EVENT_GROUP_MIN_SIZE = 2;\n\n/**\n * Returns true if the given event is one of the action / observation cards\n * that we want to fold into an `EventGroup` when several appear in a row.\n *\n * Events that have their own dedicated rendering (FinishAction, ThinkAction,\n * HookExecution, AgentError, MessageEvent, PlanPreview, TaskTracker) are\n * treated as group breakers.\n */\nexport const isGroupableEvent = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n const { kind } = event.action;\n if (kind === \"FinishAction\" || kind === \"ThinkAction\") {\n return false;\n }\n return true;\n }\n\n if (isObservationEvent(event)) {\n if (isPlanningFileEditorObservationEvent(event)) {\n return false;\n }\n if (event.observation.kind === \"TaskTrackerObservation\") {\n return false;\n }\n return true;\n }\n\n return false;\n};\n\nexport type RenderedItem =\n | { kind: \"single\"; event: OpenHandsEvent; index: number }\n | { kind: \"thought\"; action: ActionEvent; index: number }\n | { kind: \"group\"; events: OpenHandsEvent[]; startIndex: number };\n\n/**\n * Walk a list of UI events and bucket consecutive groupable events into\n * `group` items. Anything that breaks the run, or runs shorter than\n * `EVENT_GROUP_MIN_SIZE`, is emitted as `single` items so they keep rendering\n * the way they always have.\n *\n * Whenever a groupable event carries an agent thought (either an\n * `ActionEvent.thought` or the corresponding action of an\n * `ObservationEvent`), the thought is hoisted out as its own `thought`\n * `RenderedItem`, the current run is flushed, and a new run is started with\n * the event itself. This keeps reasoning text in the main message stream\n * instead of buried inside a collapsed action group.\n *\n * `allEvents` should be the full event history so observations can find\n * their matching action; if omitted, it defaults to `events`.\n */\nexport const groupEvents = (\n events: OpenHandsEvent[],\n minSize: number = EVENT_GROUP_MIN_SIZE,\n allEvents: OpenHandsEvent[] = events,\n): RenderedItem[] => {\n if (minSize < 1) {\n throw new Error(\"minSize must be at least 1\");\n }\n\n const items: RenderedItem[] = [];\n const emittedThoughtActionIds = new Set<string>();\n let run: { events: OpenHandsEvent[]; startIndex: number } | null = null;\n\n const flushRun = () => {\n if (!run) return;\n if (run.events.length >= minSize) {\n items.push({\n kind: \"group\",\n events: run.events,\n startIndex: run.startIndex,\n });\n } else {\n run.events.forEach((event, offset) => {\n items.push({ kind: \"single\", event, index: run!.startIndex + offset });\n });\n }\n run = null;\n };\n\n events.forEach((event, index) => {\n if (isGroupableEvent(event)) {\n const thoughtAction = getThoughtSourceAction(event, allEvents);\n if (thoughtAction && !emittedThoughtActionIds.has(thoughtAction.id)) {\n flushRun();\n emittedThoughtActionIds.add(thoughtAction.id);\n items.push({ kind: \"thought\", action: thoughtAction, index });\n }\n if (!run) run = { events: [], startIndex: index };\n run.events.push(event);\n } else {\n flushRun();\n items.push({ kind: \"single\", event, index });\n }\n });\n\n flushRun();\n return items;\n};\n"],"mappings":";;AAqBA,IAAa,KAAoB,MAAmC;CAClE,IAAI,EAAc,CAAK,GAAG;EACxB,IAAM,EAAE,YAAS,EAAM;EAIvB,OAHA,EAAI,MAAS,kBAAkB,MAAS;CAI1C;CAYA,OAVI,EAAmB,CAAK,IAI1B,EAHI,EAAqC,CAAK,KAG1C,EAAM,YAAY,SAAS,4BAM1B;AACT,GAuBa,KACX,GACA,IAAA,GACA,IAA8B,MACX;CACnB,IAAI,IAAU,GACZ,MAAU,MAAM,4BAA4B;CAG9C,IAAM,IAAwB,CAAC,GACzB,oBAA0B,IAAI,IAAY,GAC5C,IAA+D,MAE7D,UAAiB;EAChB,AAYL,OAXI,EAAI,OAAO,UAAU,IACvB,EAAM,KAAK;GACT,MAAM;GACN,QAAQ,EAAI;GACZ,YAAY,EAAI;EAClB,CAAC,IAED,EAAI,OAAO,SAAS,GAAO,MAAW;GACpC,EAAM,KAAK;IAAE,MAAM;IAAU;IAAO,OAAO,EAAK,aAAa;GAAO,CAAC;EACvE,CAAC,GAEG;CACR;CAmBA,OAjBA,EAAO,SAAS,GAAO,MAAU;EAC/B,IAAI,EAAiB,CAAK,GAAG;GAC3B,IAAM,IAAgB,EAAuB,GAAO,CAAS;GAO7D,AANI,KAAiB,CAAC,EAAwB,IAAI,EAAc,EAAE,MAChE,EAAS,GACT,EAAwB,IAAI,EAAc,EAAE,GAC5C,EAAM,KAAK;IAAE,MAAM;IAAW,QAAQ;IAAe;GAAM,CAAC,IAE9D,AAAU,MAAM;IAAE,QAAQ,CAAC;IAAG,YAAY;GAAM,GAChD,EAAI,OAAO,KAAK,CAAK;EACvB,OAEE,AADA,EAAS,GACT,EAAM,KAAK;GAAE,MAAM;GAAU;GAAO;EAAM,CAAC;CAE/C,CAAC,GAED,EAAS,GACF;AACT"}
1
+ {"version":3,"file":"group-events.js","names":[],"sources":["../../../../src/components/conversation-events/chat/group-events.ts"],"sourcesContent":["import { ActionEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isPlanningFileEditorObservationEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { isMarkdownFileEditorEvent } from \"#/components/features/chat/tool-visualizers/primitives/markdown-file-preview\";\nimport { getThoughtSourceAction } from \"./event-thought-helpers\";\n\n/** Minimum run-length before consecutive actions get folded into a single\n * collapsible group. Even pairs are folded so the chat scroll stays compact\n * when the agent fires off back-to-back tool calls. */\nexport const EVENT_GROUP_MIN_SIZE = 2;\n\n/**\n * Returns true if the given event is one of the action / observation cards\n * that we want to fold into an `EventGroup` when several appear in a row.\n *\n * Events that have their own dedicated rendering (FinishAction, ThinkAction,\n * HookExecution, AgentError, MessageEvent, PlanPreview, markdown file\n * artifacts, TaskTracker) are treated as group breakers.\n */\nexport const isGroupableEvent = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): boolean => {\n if (isActionEvent(event)) {\n const { kind } = event.action;\n if (kind === \"FinishAction\" || kind === \"ThinkAction\") {\n return false;\n }\n // Keep markdown *create* artifact cards outside collapsed groups so their\n // clipped preview is visible without expanding a parent summary.\n if (isMarkdownFileEditorEvent(event, correspondingAction)) {\n return false;\n }\n return true;\n }\n\n if (isObservationEvent(event)) {\n if (isPlanningFileEditorObservationEvent(event)) {\n return false;\n }\n if (isMarkdownFileEditorEvent(event, correspondingAction)) {\n return false;\n }\n if (event.observation.kind === \"TaskTrackerObservation\") {\n return false;\n }\n return true;\n }\n\n return false;\n};\n\nexport type RenderedItem =\n | { kind: \"single\"; event: OpenHandsEvent; index: number }\n | { kind: \"thought\"; action: ActionEvent; index: number }\n | { kind: \"group\"; events: OpenHandsEvent[]; startIndex: number };\n\n/**\n * Walk a list of UI events and bucket consecutive groupable events into\n * `group` items. Anything that breaks the run, or runs shorter than\n * `EVENT_GROUP_MIN_SIZE`, is emitted as `single` items so they keep rendering\n * the way they always have.\n *\n * Whenever a groupable event carries an agent thought (either an\n * `ActionEvent.thought` or the corresponding action of an\n * `ObservationEvent`), the thought is hoisted out as its own `thought`\n * `RenderedItem`, the current run is flushed, and a new run is started with\n * the event itself. This keeps reasoning text in the main message stream\n * instead of buried inside a collapsed action group.\n *\n * `allEvents` should be the full event history so observations can find\n * their matching action; if omitted, it defaults to `events`.\n */\nexport const groupEvents = (\n events: OpenHandsEvent[],\n minSize: number = EVENT_GROUP_MIN_SIZE,\n allEvents: OpenHandsEvent[] = events,\n): RenderedItem[] => {\n if (minSize < 1) {\n throw new Error(\"minSize must be at least 1\");\n }\n\n const items: RenderedItem[] = [];\n const emittedThoughtActionIds = new Set<string>();\n let run: { events: OpenHandsEvent[]; startIndex: number } | null = null;\n\n const flushRun = () => {\n if (!run) return;\n if (run.events.length >= minSize) {\n items.push({\n kind: \"group\",\n events: run.events,\n startIndex: run.startIndex,\n });\n } else {\n run.events.forEach((event, offset) => {\n items.push({ kind: \"single\", event, index: run!.startIndex + offset });\n });\n }\n run = null;\n };\n\n events.forEach((event, index) => {\n const correspondingAction = isObservationEvent(event)\n ? allEvents.find(\n (candidate): candidate is ActionEvent =>\n isActionEvent(candidate) && candidate.id === event.action_id,\n )\n : undefined;\n if (isGroupableEvent(event, correspondingAction)) {\n const thoughtAction = getThoughtSourceAction(event, allEvents);\n if (thoughtAction && !emittedThoughtActionIds.has(thoughtAction.id)) {\n flushRun();\n emittedThoughtActionIds.add(thoughtAction.id);\n items.push({ kind: \"thought\", action: thoughtAction, index });\n }\n if (!run) run = { events: [], startIndex: index };\n run.events.push(event);\n } else {\n flushRun();\n items.push({ kind: \"single\", event, index });\n }\n });\n\n flushRun();\n return items;\n};\n"],"mappings":";;;AAsBA,IAAa,KACX,GACA,MACY;CACZ,IAAI,EAAc,CAAK,GAAG;EACxB,IAAM,EAAE,YAAS,EAAM;EASvB,OAHA,EALI,MAAS,kBAAkB,MAAS,iBAKpC,EAA0B,GAAO,CAAmB;CAI1D;CAeA,OAbI,EAAmB,CAAK,IAO1B,EANI,EAAqC,CAAK,KAG1C,EAA0B,GAAO,CAAmB,KAGpD,EAAM,YAAY,SAAS,4BAM1B;AACT,GAuBa,KACX,GACA,IAAA,GACA,IAA8B,MACX;CACnB,IAAI,IAAU,GACZ,MAAU,MAAM,4BAA4B;CAG9C,IAAM,IAAwB,CAAC,GACzB,oBAA0B,IAAI,IAAY,GAC5C,IAA+D,MAE7D,UAAiB;EAChB,AAYL,OAXI,EAAI,OAAO,UAAU,IACvB,EAAM,KAAK;GACT,MAAM;GACN,QAAQ,EAAI;GACZ,YAAY,EAAI;EAClB,CAAC,IAED,EAAI,OAAO,SAAS,GAAO,MAAW;GACpC,EAAM,KAAK;IAAE,MAAM;IAAU;IAAO,OAAO,EAAK,aAAa;GAAO,CAAC;EACvE,CAAC,GAEG;CACR;CAyBA,OAvBA,EAAO,SAAS,GAAO,MAAU;EAO/B,IAAI,EAAiB,GANO,EAAmB,CAAK,IAChD,EAAU,MACP,MACC,EAAc,CAAS,KAAK,EAAU,OAAO,EAAM,SACvD,IACA,KAAA,CAC2C,GAAG;GAChD,IAAM,IAAgB,EAAuB,GAAO,CAAS;GAO7D,AANI,KAAiB,CAAC,EAAwB,IAAI,EAAc,EAAE,MAChE,EAAS,GACT,EAAwB,IAAI,EAAc,EAAE,GAC5C,EAAM,KAAK;IAAE,MAAM;IAAW,QAAQ;IAAe;GAAM,CAAC,IAE9D,AAAU,MAAM;IAAE,QAAQ,CAAC;IAAG,YAAY;GAAM,GAChD,EAAI,OAAO,KAAK,CAAK;EACvB,OAEE,AADA,EAAS,GACT,EAAM,KAAK;GAAE,MAAM;GAAU;GAAO;EAAM,CAAC;CAE/C,CAAC,GAED,EAAS,GACF;AACT"}
@@ -1,4 +1,5 @@
1
1
  import { type RecommendedAutomation } from "@openhands/extensions/automations";
2
+ import { type IntegrationCatalogEntry as MarketplaceEntry } from "@openhands/extensions/integrations";
2
3
  import { MCPServerConfig } from "#/types/mcp-server";
3
4
  interface RecommendedAutomationsSectionProps {
4
5
  backendKind: "local" | "cloud";
@@ -9,5 +10,11 @@ interface RecommendedAutomationsSectionProps {
9
10
  scrollableGrid?: boolean;
10
11
  }
11
12
  export declare function getAutomationsByPopularity(catalog: RecommendedAutomation[]): RecommendedAutomation[];
13
+ export interface AutomationIntegration {
14
+ id: string;
15
+ entry?: MarketplaceEntry;
16
+ /** False when this backend has no MCP install flow for the entry. */
17
+ mcpInstallable: boolean;
18
+ }
12
19
  export declare function RecommendedAutomationsSection({ backendKind: _backendKind, installedServers, query, onSelect, scrollableGrid, }: RecommendedAutomationsSectionProps): import("react").JSX.Element | null;
13
20
  export {};