@openhands/agent-canvas 1.3.0 → 1.5.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 (674) hide show
  1. package/README.md +11 -12
  2. package/README.windows.md +4 -2
  3. package/build/assets/{Trans-DY6toRDu.js → Trans-DqF_OEZB.js} +1 -1
  4. package/build/assets/{acp-providers-Djl6vNn-.js → acp-providers-BQwoUBpe.js} +1 -1
  5. package/build/assets/active-backend-context-BCXRv5pm.js +1 -0
  6. package/build/assets/{add-backend-modal-DljoP9lc.js → add-backend-modal-BKHzq5no.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-BJMmTZgv.js → agent-profiles-settings-CEp5CIz8.js} +1 -1
  8. package/build/assets/agent-server-compatibility-D6DSanlx.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-cylugfDz.js +41 -0
  10. package/build/assets/{agent-settings-lUknCeaF.js → agent-settings-C-tann3x.js} +2 -2
  11. package/build/assets/agent-settings-DGUKNSnU.js +1 -0
  12. package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dd4woGbm.js} +1 -1
  13. package/build/assets/api-key-entry-screen-Bll_CkuQ.js +1 -0
  14. package/build/assets/app-settings-BpViWwpC.js +1 -0
  15. package/build/assets/automation-detail-Z9dN2f5l.js +2 -0
  16. package/build/assets/automation-export-D5uL0Tf8.js +2 -0
  17. package/build/assets/automations-list-BMOWcqzZ.js +1 -0
  18. package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-ZUDTMOTB.js} +1 -1
  19. package/build/assets/backend-form-modal-DhBT8P4g.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-CanzmG12.js → backend-synced-settings-badge-Db_REKVw.js} +1 -1
  21. package/build/assets/{base-modal-BuF2f0YL.js → base-modal-Cb0C6m0Q.js} +1 -1
  22. package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
  23. package/build/assets/{brand-button-vMVuyDXu.js → brand-button-2Tp3aXk1.js} +1 -1
  24. package/build/assets/{browser-BifzWIBd.js → browser-QYLVr1kS.js} +2 -2
  25. package/build/assets/browser-store-BGXOGo-R.js +1 -0
  26. package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-BTTP1OE2.js} +1 -1
  27. package/build/assets/canvas-ui-BhxjoA1f.js +1 -0
  28. package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
  29. package/build/assets/check-TbOEtHKj.js +1 -0
  30. package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
  31. package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-QQJKUnF6.js} +1 -1
  32. package/build/assets/client-source-Biqarhgr.js +1 -0
  33. package/build/assets/cloud-funnel-analytics-D-27T5Ao.js +1 -0
  34. package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-A5jMVHgE.js} +1 -1
  35. package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-BMVEme4H.js} +1 -1
  36. package/build/assets/{command-store-D8J5LMW1.js → command-store-jrWX_CcW.js} +1 -1
  37. package/build/assets/condenser-settings-CIa6eyB4.js +1 -0
  38. package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-4n_944zq.js} +1 -1
  39. package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-DvfFic5I.js} +1 -1
  40. package/build/assets/conversation-CHnEXGRM.js +1 -0
  41. package/build/assets/conversation-D4o4dG2t.js +89 -0
  42. package/build/assets/conversation-panel-11FjLCId.js +1 -0
  43. package/build/assets/conversation-service.api-0JG_fF9d.js +1 -0
  44. package/build/assets/conversation-state-store-JiUQp02U.js +1 -0
  45. package/build/assets/{conversation-store-LptbOvKa.js → conversation-store-BCSpLuEf.js} +1 -1
  46. package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-BUhKVwoi.js} +1 -1
  47. package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
  48. package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-Dp4Q_hXi.js} +1 -1
  49. package/build/assets/declaration-BGsHjPEW.js +1 -0
  50. package/build/assets/{device-verify-BsznkV-a.js → device-verify-CM086oKs.js} +1 -1
  51. package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-DZq0BQjb.js} +1 -1
  52. package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-TPJdyxnK.js} +1 -1
  53. package/build/assets/{entry.client-JixNvFrr.js → entry.client-DypYHsYm.js} +2 -2
  54. package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-CW_mBg0e.js} +1 -1
  55. package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-6laJch-9.js} +1 -1
  56. package/build/assets/{extensions-hub-DfvgqzTc.js → extensions-hub-BJFbFfKS.js} +1 -1
  57. package/build/assets/{extensions-navigation-D9i0DL62.js → extensions-navigation-DqSl7CJw.js} +1 -1
  58. package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
  59. package/build/assets/files-tab-c316dKAq.js +1 -0
  60. package/build/assets/{files-tab-store-DJsPxYdg.js → files-tab-store-tfCav6bB.js} +1 -1
  61. package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CvUaw8_L.js} +1 -1
  62. package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
  63. package/build/assets/git-provider-icon-DUb2pEos.js +1 -0
  64. package/build/assets/home-BQ-DC06B.js +1 -0
  65. package/build/assets/home-D7ds4Jyw.js +1 -0
  66. package/build/assets/index-home-BRFDWs_4.js +1 -0
  67. package/build/assets/install-server-modal-CvHvzZj3.js +1 -0
  68. package/build/assets/{launch-BgIlZLSX.js → launch-A47TK2Me.js} +1 -1
  69. package/build/assets/lesson-plan-DSf95kQ2.js +4 -0
  70. package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
  71. package/build/assets/llm-not-configured-banner-B7DR8SPs.js +27 -0
  72. package/build/assets/llm-settings-Ch4ZbW3c.js +1 -0
  73. package/build/assets/llm-settings-Cvi7q4ox.js +1 -0
  74. package/build/assets/llm-subscription-service-Cz1yBBvE.js +1 -0
  75. package/build/assets/loader-circle-CsAsfLIs.js +1 -0
  76. package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-Txxx1I1p.js} +1 -1
  77. package/build/assets/manage-backends-modal-DAVhNUCe.js +1 -0
  78. package/build/assets/manifest-958c741a.js +1 -0
  79. package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B6cJJ_MN.js} +1 -1
  80. package/build/assets/{mcp-CHkklDMv.js → mcp-BwssgMpg.js} +2 -2
  81. package/build/assets/{messages-B3RugH7P.js → messages-D8MeG2ZQ.js} +26 -26
  82. package/build/assets/{modal-body-DouOE5KH.js → modal-body-CDZdZ-eT.js} +1 -1
  83. package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-B4oit_4c.js} +1 -1
  84. package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-DQElFMPo.js} +1 -1
  85. package/build/assets/model-selector-BxTbbKub.js +1 -0
  86. package/build/assets/{navigation-link-D8hfwvxI.js → navigation-link-imH6S7h2.js} +1 -1
  87. package/build/assets/onboarding-CyicadGt.js +1 -0
  88. package/build/assets/onboarding-modal-DQwihcTz.js +1 -0
  89. package/build/assets/option-service.api-DAkg_F7p.js +1 -0
  90. package/build/assets/organization-service.api-QknzKDh3.js +1 -0
  91. package/build/assets/package-Dk_VtWJ4.js +1 -0
  92. package/build/assets/path-utils-BECGet7G.js +1 -0
  93. package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
  94. package/build/assets/{plan-components-CcCBmCzW.js → plan-components-CgPHWz3E.js} +1 -1
  95. package/build/assets/{planner-tab-CCqdXxkL.js → planner-tab-DPKHmMAX.js} +1 -1
  96. package/build/assets/plugins-management-service-DuTTxquo.js +1 -0
  97. package/build/assets/profiles-service.api-D6jvZOWu.js +1 -0
  98. package/build/assets/providers-B8pxQK8x.js +1 -0
  99. package/build/assets/proxy-CuhhyjdX.js +1 -0
  100. package/build/assets/{recommended-automations-launcher-CVEF_1pc.js → recommended-automations-launcher-DA6DWS7V.js} +1 -1
  101. package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
  102. package/build/assets/root-BhP6bTBB.js +2 -0
  103. package/build/assets/root-CYWeTrWE.css +1 -0
  104. package/build/assets/root-layout-oBaHHW4s.js +2 -0
  105. package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-DeD9G7yJ.js} +1 -1
  106. package/build/assets/schema-field-BOLdL_U7.js +1 -0
  107. package/build/assets/sdk-section-page-ZIltERxf.js +1 -0
  108. package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-Ba_Pa9uf.js} +1 -1
  109. package/build/assets/search-dIQ09UY2.js +1 -0
  110. package/build/assets/secrets-service-50DElFny.js +1 -0
  111. package/build/assets/{secrets-settings-DxTx9HgU.js → secrets-settings-Digl7JLe.js} +1 -1
  112. package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-C1-ZVyr5.js} +1 -1
  113. package/build/assets/settings-BfgLHsgd.js +1 -0
  114. package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-BD5C9fBn.js} +1 -1
  115. package/build/assets/{settings-index-BjeuYFFa.js → settings-index-CODBijya.js} +1 -1
  116. package/build/assets/{settings-input-bD6npsDm.js → settings-input-CzNOq-Pj.js} +1 -1
  117. package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-CuxH9ZoR.js} +1 -1
  118. package/build/assets/settings-modal-BcSWpKI0.js +1 -0
  119. package/build/assets/settings-service.api-Bsu1PvYO.js +1 -0
  120. package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-DqmHAfWJ.js} +1 -1
  121. package/build/assets/{settings-utils-BMdG65By.js → settings-utils-B1lBErvV.js} +1 -1
  122. package/build/assets/shared-conversation-CDskdmrb.js +1 -0
  123. package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Cn6eQaEI.js} +1 -1
  124. package/build/assets/{sidebar-mobile-menu-toggle-CMmAYkh8.js → sidebar-mobile-menu-toggle-DmCmZgq1.js} +1 -1
  125. package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-DMc8AIe7.js} +1 -1
  126. package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-DXWSCFpa.js} +1 -1
  127. package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-DOIWjiMF.js} +1 -1
  128. package/build/assets/skills-plugins-DLgINYuY.js +1 -0
  129. package/build/assets/{skills-settings-BYn4-AQQ.js → skills-settings-DPiCWalR.js} +2 -2
  130. package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
  131. package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-CvsjHuIf.js} +1 -1
  132. package/build/assets/{suspense-X5dBsJzn.js → suspense-DmZ3MSSh.js} +1 -1
  133. package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-CuhcDycu.js} +1 -1
  134. package/build/assets/telemetry-DHiTRl5_.js +2 -0
  135. package/build/assets/{terminal-BsGcSpRS.js → terminal-CVqF-tCD.js} +1 -1
  136. package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-CS0ClOy2.js} +1 -1
  137. package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
  138. package/build/assets/{typography-D8mHDeNG.js → typography-CQn9wyEX.js} +1 -1
  139. package/build/assets/use-acp-credential-form-LlfZO_DD.js +1 -0
  140. package/build/assets/{use-activate-agent-profile-WaAZYz4E.js → use-activate-agent-profile-DpQjsXM0.js} +1 -1
  141. package/build/assets/{use-active-agent-profile-CYY3vGar.js → use-active-agent-profile-Gw_uJujV.js} +1 -1
  142. package/build/assets/{use-active-conversation-D-r929nx.js → use-active-conversation-B0sttISF.js} +1 -1
  143. package/build/assets/use-agent-profiles-LHZEK0Gg.js +1 -0
  144. package/build/assets/{use-agent-state-DijdVAQ0.js → use-agent-state-C5uA0bRj.js} +1 -1
  145. package/build/assets/use-backends-health-DKt1SmiU.js +1 -0
  146. package/build/assets/{use-can-manage-org-profiles-BEo0peGn.js → use-can-manage-org-profiles-BAtqsbCi.js} +1 -1
  147. package/build/assets/use-cloud-current-user-id-C8m1oBy4.js +1 -0
  148. package/build/assets/use-config-CXy4vD0H.js +1 -0
  149. package/build/assets/use-create-conversation-CWQGNQ9J.js +1 -0
  150. package/build/assets/{use-create-secret-D5O5qdWC.js → use-create-secret-BIrsX3OB.js} +1 -1
  151. package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-CsD17BKu.js} +1 -1
  152. package/build/assets/{use-handle-plan-click-Mn_SNTCh.js → use-handle-plan-click-DEuO7Byo.js} +1 -1
  153. package/build/assets/use-is-authed-Dvbpiu3B.js +1 -0
  154. package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-CdHOoQGM.js} +1 -1
  155. package/build/assets/use-llm-profiles-DQpQxVOD.js +1 -0
  156. package/build/assets/use-plugins-marketplace-Bkk07W_M.js +1 -0
  157. package/build/assets/use-runtime-is-ready-D4pkGT6E.js +1 -0
  158. package/build/assets/use-save-agent-profile-BxEsjnW0.js +1 -0
  159. package/build/assets/{use-save-settings-D1HoCDbn.js → use-save-settings-ioSUMqbE.js} +1 -1
  160. package/build/assets/use-settings-DNJC4gqu.js +1 -0
  161. package/build/assets/use-settings-nav-items-BUsrDbVR.js +16 -0
  162. package/build/assets/use-skills-BsmKm23M.js +1 -0
  163. package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-rs7Xbzl8.js} +1 -1
  164. package/build/assets/{use-tracking-2ZwQwpg_.js → use-tracking-poxQHMwR.js} +1 -1
  165. package/build/assets/{use-user-conversation-OAfenBRG.js → use-user-conversation-B337kUKB.js} +1 -1
  166. package/build/assets/{useMutation-DCE9RcgK.js → useMutation-u8UgRgDK.js} +1 -1
  167. package/build/assets/{useMutationState-BUab8Kxr.js → useMutationState-OnAsCLA_.js} +1 -1
  168. package/build/assets/{useQueries-CRzaAqzH.js → useQueries-BpIlT8Mt.js} +1 -1
  169. package/build/assets/{useQuery-CpjHYtZc.js → useQuery-D5pEZbY0.js} +1 -1
  170. package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
  171. package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
  172. package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-5Njjw1Cl.js} +1 -1
  173. package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-Xn94EtUo.js} +1 -1
  174. package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
  175. package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
  176. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-BIieS_OD.js +2 -0
  177. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
  178. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ljq5gbus-B2XD4bi2.js} +1 -1
  179. package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-CiC3-lGh.js} +1 -1
  180. package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
  181. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B8XNNEQZ.js} +1 -1
  182. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CnJRLn5s.js} +1 -1
  183. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DWteoTyr.js +2 -0
  184. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dc5nKwLO.js} +1 -1
  185. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-tlf6AnDe.js} +1 -1
  186. package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-28DK5Rsl.js} +1 -1
  187. package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
  188. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-lYNG9C1U.js} +1 -1
  189. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-Zhq6xAxR.js} +1 -1
  190. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-B81b08bw.js} +1 -1
  191. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-jpyLM1Nn.js} +2 -2
  192. package/build/assets/{verification-settings-DnXS6VWv.js → verification-settings-HRgEM-_3.js} +1 -1
  193. package/build/assets/x-ZE4iplpF.js +1 -0
  194. package/build/index.html +4 -4
  195. package/build/locales/ar/openhands.json +9 -0
  196. package/build/locales/ca/openhands.json +9 -0
  197. package/build/locales/de/openhands.json +9 -0
  198. package/build/locales/en/openhands.json +10 -1
  199. package/build/locales/es/openhands.json +9 -0
  200. package/build/locales/fr/openhands.json +9 -0
  201. package/build/locales/it/openhands.json +9 -0
  202. package/build/locales/ja/openhands.json +9 -0
  203. package/build/locales/ko-KR/openhands.json +9 -0
  204. package/build/locales/no/openhands.json +9 -0
  205. package/build/locales/pt/openhands.json +9 -0
  206. package/build/locales/tr/openhands.json +9 -0
  207. package/build/locales/uk/openhands.json +9 -0
  208. package/build/locales/zh-CN/openhands.json +9 -0
  209. package/build/locales/zh-TW/openhands.json +9 -0
  210. package/config/defaults.json +5 -4
  211. package/dist/api/agent-server-adapter.cjs +3 -3
  212. package/dist/api/agent-server-adapter.cjs.map +1 -1
  213. package/dist/api/agent-server-adapter.d.ts +9 -1
  214. package/dist/api/agent-server-adapter.js +105 -102
  215. package/dist/api/agent-server-adapter.js.map +1 -1
  216. package/dist/api/agent-server-config.cjs +1 -1
  217. package/dist/api/agent-server-config.cjs.map +1 -1
  218. package/dist/api/agent-server-config.d.ts +3 -0
  219. package/dist/api/agent-server-config.js +45 -23
  220. package/dist/api/agent-server-config.js.map +1 -1
  221. package/dist/api/backend-registry/auth.cjs +1 -1
  222. package/dist/api/backend-registry/auth.cjs.map +1 -1
  223. package/dist/api/backend-registry/auth.js +1 -1
  224. package/dist/api/backend-registry/auth.js.map +1 -1
  225. package/dist/api/backend-registry/default-backend.cjs +1 -1
  226. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  227. package/dist/api/backend-registry/default-backend.d.ts +3 -0
  228. package/dist/api/backend-registry/default-backend.js +22 -10
  229. package/dist/api/backend-registry/default-backend.js.map +1 -1
  230. package/dist/api/backend-registry/storage.cjs +1 -1
  231. package/dist/api/backend-registry/storage.cjs.map +1 -1
  232. package/dist/api/backend-registry/storage.js +38 -33
  233. package/dist/api/backend-registry/storage.js.map +1 -1
  234. package/dist/api/backend-registry/types.d.ts +2 -0
  235. package/dist/api/canvas-ui-client-tool.cjs +38 -0
  236. package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
  237. package/dist/api/canvas-ui-client-tool.d.ts +14 -0
  238. package/dist/api/canvas-ui-client-tool.js +47 -0
  239. package/dist/api/canvas-ui-client-tool.js.map +1 -0
  240. package/dist/api/client-source.cjs +2 -0
  241. package/dist/api/client-source.cjs.map +1 -0
  242. package/dist/api/client-source.d.ts +9 -0
  243. package/dist/api/client-source.js +10 -0
  244. package/dist/api/client-source.js.map +1 -0
  245. package/dist/api/cloud/client.cjs +2 -0
  246. package/dist/api/cloud/client.cjs.map +1 -0
  247. package/dist/api/cloud/client.d.ts +4 -0
  248. package/dist/api/cloud/client.js +38 -0
  249. package/dist/api/cloud/client.js.map +1 -0
  250. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  251. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  252. package/dist/api/cloud/conversation-service.api.js +33 -31
  253. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  254. package/dist/api/cloud/organization-service.api.cjs +1 -1
  255. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  256. package/dist/api/cloud/organization-service.api.js +11 -10
  257. package/dist/api/cloud/organization-service.api.js.map +1 -1
  258. package/dist/api/cloud/proxy.cjs +1 -1
  259. package/dist/api/cloud/proxy.cjs.map +1 -1
  260. package/dist/api/cloud/proxy.d.ts +2 -40
  261. package/dist/api/cloud/proxy.js +14 -39
  262. package/dist/api/cloud/proxy.js.map +1 -1
  263. package/dist/api/conversation-metadata-store.cjs +1 -1
  264. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  265. package/dist/api/conversation-metadata-store.d.ts +2 -9
  266. package/dist/api/conversation-metadata-store.js +13 -9
  267. package/dist/api/conversation-metadata-store.js.map +1 -1
  268. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  269. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  270. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +2 -1
  271. package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
  272. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  273. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
  274. package/dist/api/device-flow-client.cjs +1 -1
  275. package/dist/api/device-flow-client.cjs.map +1 -1
  276. package/dist/api/device-flow-client.d.ts +4 -58
  277. package/dist/api/device-flow-client.js +8 -98
  278. package/dist/api/device-flow-client.js.map +1 -1
  279. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  280. package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
  281. package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
  282. package/dist/api/git-service/agent-server-git-service.api.js +107 -40
  283. package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
  284. package/dist/api/open-hands.types.d.ts +11 -0
  285. package/dist/api/secrets-service.cjs +1 -1
  286. package/dist/api/secrets-service.cjs.map +1 -1
  287. package/dist/api/secrets-service.js +15 -14
  288. package/dist/api/secrets-service.js.map +1 -1
  289. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  291. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
  292. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  293. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
  294. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
  295. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
  296. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -1
  297. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  298. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  299. package/dist/components/features/backends/backend-form-modal.d.ts +7 -3
  300. package/dist/components/features/backends/backend-form-modal.js +216 -201
  301. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  302. package/dist/components/features/backends/backend-row.cjs +1 -1
  303. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  304. package/dist/components/features/backends/backend-row.js +2 -1
  305. package/dist/components/features/backends/backend-row.js.map +1 -1
  306. package/dist/components/features/backends/backend-selector.cjs +1 -1
  307. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  308. package/dist/components/features/backends/backend-selector.js +51 -51
  309. package/dist/components/features/backends/backend-selector.js.map +1 -1
  310. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  311. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  312. package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
  313. package/dist/components/features/backends/device-flow-auth.js +38 -38
  314. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  315. package/dist/components/features/chat/chat-interface.cjs +2 -2
  316. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  317. package/dist/components/features/chat/chat-interface.js +173 -165
  318. package/dist/components/features/chat/chat-interface.js.map +1 -1
  319. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  320. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  321. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  322. package/dist/components/features/chat/components/chat-input-actions.js +44 -43
  323. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  324. package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
  325. package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
  326. package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
  327. package/dist/components/features/chat/components/chat-input-container.js +20 -19
  328. package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
  329. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
  330. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
  331. package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
  332. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
  333. package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
  334. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
  335. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
  336. package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
  337. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
  338. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  339. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  340. package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
  341. package/dist/components/features/chat/custom-chat-input.js +52 -51
  342. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  343. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  344. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  345. package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
  346. package/dist/components/features/chat/interactive-chat-box.js +9 -8
  347. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  348. package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
  349. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
  350. package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
  351. package/dist/components/features/diff-viewer/commit-list.js +27 -0
  352. package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
  353. package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
  354. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
  355. package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
  356. package/dist/components/features/diff-viewer/commit-row.js +59 -0
  357. package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
  358. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  359. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  360. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
  361. package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
  362. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  363. package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
  364. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  365. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  366. package/dist/components/shared/modals/settings/settings-modal.js +23 -22
  367. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  368. package/dist/config/defaults.cjs +1 -1
  369. package/dist/config/defaults.cjs.map +1 -1
  370. package/dist/config/defaults.js +5 -4
  371. package/dist/config/defaults.js.map +1 -1
  372. package/dist/constants/acp-providers.cjs.map +1 -1
  373. package/dist/constants/acp-providers.d.ts +1 -1
  374. package/dist/constants/acp-providers.js.map +1 -1
  375. package/dist/constants/canvas-ui.cjs +2 -0
  376. package/dist/constants/canvas-ui.cjs.map +1 -0
  377. package/dist/constants/canvas-ui.d.ts +8 -0
  378. package/dist/constants/canvas-ui.js +6 -0
  379. package/dist/constants/canvas-ui.js.map +1 -0
  380. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  381. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  382. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  383. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  384. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
  385. package/dist/hooks/mutation/use-create-conversation.js +52 -52
  386. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  387. package/dist/hooks/query/query-keys.cjs +1 -1
  388. package/dist/hooks/query/query-keys.cjs.map +1 -1
  389. package/dist/hooks/query/query-keys.d.ts +2 -0
  390. package/dist/hooks/query/query-keys.js +4 -1
  391. package/dist/hooks/query/query-keys.js.map +1 -1
  392. package/dist/hooks/query/use-backends-health.cjs +1 -1
  393. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  394. package/dist/hooks/query/use-backends-health.js +50 -48
  395. package/dist/hooks/query/use-backends-health.js.map +1 -1
  396. package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
  397. package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
  398. package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
  399. package/dist/hooks/query/use-cloud-organizations.js +5 -2
  400. package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
  401. package/dist/hooks/query/use-commit-changes.cjs +2 -0
  402. package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
  403. package/dist/hooks/query/use-commit-changes.d.ts +5 -0
  404. package/dist/hooks/query/use-commit-changes.js +34 -0
  405. package/dist/hooks/query/use-commit-changes.js.map +1 -0
  406. package/dist/hooks/query/use-task-polling.cjs +1 -1
  407. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  408. package/dist/hooks/query/use-task-polling.d.ts +3 -2
  409. package/dist/hooks/query/use-task-polling.js +53 -40
  410. package/dist/hooks/query/use-task-polling.js.map +1 -1
  411. package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
  412. package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
  413. package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
  414. package/dist/hooks/query/use-unified-git-commits.js +41 -0
  415. package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
  416. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  417. package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
  418. package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
  419. package/dist/hooks/query/use-unified-git-diff.js +11 -4
  420. package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
  421. package/dist/hooks/use-acp-model-context.cjs +1 -1
  422. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  423. package/dist/hooks/use-acp-model-context.d.ts +4 -1
  424. package/dist/hooks/use-acp-model-context.js +9 -8
  425. package/dist/hooks/use-acp-model-context.js.map +1 -1
  426. package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
  427. package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
  428. package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
  429. package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
  430. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  431. package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
  432. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  433. package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
  434. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
  435. package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
  436. package/dist/hooks/use-chat-input-profile-state.js +42 -15
  437. package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
  438. package/dist/hooks/use-device-flow.cjs +1 -1
  439. package/dist/hooks/use-device-flow.cjs.map +1 -1
  440. package/dist/hooks/use-device-flow.d.ts +4 -1
  441. package/dist/hooks/use-device-flow.js +42 -40
  442. package/dist/hooks/use-device-flow.js.map +1 -1
  443. package/dist/hooks/use-tracking.cjs.map +1 -1
  444. package/dist/hooks/use-tracking.d.ts +2 -1
  445. package/dist/hooks/use-tracking.js.map +1 -1
  446. package/dist/i18n/declaration.cjs +1 -1
  447. package/dist/i18n/declaration.cjs.map +1 -1
  448. package/dist/i18n/declaration.d.ts +9 -0
  449. package/dist/i18n/declaration.js +1 -1
  450. package/dist/i18n/declaration.js.map +1 -1
  451. package/dist/i18n/index.cjs +1 -1
  452. package/dist/i18n/index.cjs.map +1 -1
  453. package/dist/i18n/index.js +19 -18
  454. package/dist/i18n/index.js.map +1 -1
  455. package/dist/i18n/translation.cjs +3 -3
  456. package/dist/i18n/translation.cjs.map +1 -1
  457. package/dist/i18n/translation.js +154 -1
  458. package/dist/i18n/translation.js.map +1 -1
  459. package/dist/index.cjs +1 -1
  460. package/dist/index.js +32 -32
  461. package/dist/lib/index.cjs +1 -1
  462. package/dist/lib/index.js +1 -1
  463. package/dist/locales/ar/openhands.json +9 -0
  464. package/dist/locales/ca/openhands.json +9 -0
  465. package/dist/locales/de/openhands.json +9 -0
  466. package/dist/locales/en/openhands.json +10 -1
  467. package/dist/locales/es/openhands.json +9 -0
  468. package/dist/locales/fr/openhands.json +9 -0
  469. package/dist/locales/it/openhands.json +9 -0
  470. package/dist/locales/ja/openhands.json +9 -0
  471. package/dist/locales/ko-KR/openhands.json +9 -0
  472. package/dist/locales/no/openhands.json +9 -0
  473. package/dist/locales/pt/openhands.json +9 -0
  474. package/dist/locales/tr/openhands.json +9 -0
  475. package/dist/locales/uk/openhands.json +9 -0
  476. package/dist/locales/zh-CN/openhands.json +9 -0
  477. package/dist/locales/zh-TW/openhands.json +9 -0
  478. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
  479. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
  480. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
  481. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
  482. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
  483. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
  484. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
  485. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
  486. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
  487. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
  488. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
  489. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
  490. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  491. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
  492. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  493. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  494. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
  495. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  496. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
  497. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
  498. package/dist/node_modules/axios/index.cjs +1 -1
  499. package/dist/node_modules/axios/index.js +1 -1
  500. package/dist/package.cjs +1 -1
  501. package/dist/package.cjs.map +1 -1
  502. package/dist/package.js +2 -2
  503. package/dist/package.js.map +1 -1
  504. package/dist/routes/app-settings.cjs +1 -1
  505. package/dist/routes/app-settings.cjs.map +1 -1
  506. package/dist/routes/app-settings.js +67 -66
  507. package/dist/routes/app-settings.js.map +1 -1
  508. package/dist/routes/commits-tab.cjs +2 -0
  509. package/dist/routes/commits-tab.cjs.map +1 -0
  510. package/dist/routes/commits-tab.d.ts +8 -0
  511. package/dist/routes/commits-tab.js +45 -0
  512. package/dist/routes/commits-tab.js.map +1 -0
  513. package/dist/routes/files-tab.cjs +1 -1
  514. package/dist/routes/files-tab.cjs.map +1 -1
  515. package/dist/routes/files-tab.js +148 -127
  516. package/dist/routes/files-tab.js.map +1 -1
  517. package/dist/services/cloud-funnel-analytics.cjs +2 -0
  518. package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
  519. package/dist/services/cloud-funnel-analytics.d.ts +12 -0
  520. package/dist/services/cloud-funnel-analytics.js +53 -0
  521. package/dist/services/cloud-funnel-analytics.js.map +1 -0
  522. package/dist/services/telemetry.cjs +1 -1
  523. package/dist/services/telemetry.cjs.map +1 -1
  524. package/dist/services/telemetry.js +49 -47
  525. package/dist/services/telemetry.js.map +1 -1
  526. package/dist/types/agent-server/core/base/action.d.ts +5 -4
  527. package/dist/types/agent-server/core/base/base.d.ts +3 -2
  528. package/dist/types/agent-server/core/base/observation.d.ts +1 -1
  529. package/dist/types/agent-server/type-guards.cjs +1 -1
  530. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  531. package/dist/types/agent-server/type-guards.d.ts +3 -5
  532. package/dist/types/agent-server/type-guards.js +2 -1
  533. package/dist/types/agent-server/type-guards.js.map +1 -1
  534. package/dist/types/automation.d.ts +5 -0
  535. package/dist/utils/api-error-message.d.ts +11 -0
  536. package/dist/utils/automation-timeout.d.ts +19 -0
  537. package/dist/utils/base-path.cjs +2 -0
  538. package/dist/utils/base-path.cjs.map +1 -0
  539. package/dist/utils/base-path.d.ts +2 -0
  540. package/dist/utils/base-path.js +23 -0
  541. package/dist/utils/base-path.js.map +1 -0
  542. package/package.json +2 -2
  543. package/scripts/check-sdk-version-sync.mjs +6 -6
  544. package/scripts/dev-safe.mjs +7 -8
  545. package/scripts/dev-static.mjs +3 -0
  546. package/scripts/dev-with-automation.mjs +3 -0
  547. package/scripts/docker-build.mjs +4 -0
  548. package/scripts/static-server.mjs +93 -7
  549. package/tools/canvas_ui_tool.py +14 -8
  550. package/build/assets/active-backend-context-B3umL5R-.js +0 -1
  551. package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
  552. package/build/assets/agent-server-conversation-service.api-D_ZvtJjG.js +0 -5
  553. package/build/assets/agent-settings-BVVFzBWS.js +0 -1
  554. package/build/assets/api-key-entry-screen-CWEHcPJA.js +0 -1
  555. package/build/assets/app-settings-Dj90qosy.js +0 -1
  556. package/build/assets/automation-detail-CXJU0_gF.js +0 -2
  557. package/build/assets/automation-export-FWY9LPsG.js +0 -2
  558. package/build/assets/automations-list-DDGBkWLC.js +0 -1
  559. package/build/assets/backend-form-modal-DSbrafX2.js +0 -1
  560. package/build/assets/browser-store-BI6uklCG.js +0 -1
  561. package/build/assets/check-Bvi71siz.js +0 -1
  562. package/build/assets/condenser-settings-30cX9SK6.js +0 -1
  563. package/build/assets/conversation-BltULtFA.js +0 -89
  564. package/build/assets/conversation-e0a0_X4S.js +0 -1
  565. package/build/assets/conversation-panel-Cr9_ZGI-.js +0 -1
  566. package/build/assets/conversation-service.api-DQaKzIRj.js +0 -1
  567. package/build/assets/conversation-state-store-B2Bp32XI.js +0 -1
  568. package/build/assets/declaration-gq8V5eTU.js +0 -1
  569. package/build/assets/files-tab-DDtEJcGE.js +0 -1
  570. package/build/assets/git-provider-icon-BjkecAuV.js +0 -1
  571. package/build/assets/home-BCKWpKpf.js +0 -1
  572. package/build/assets/index-redirect-CUUJiNki.js +0 -1
  573. package/build/assets/install-server-modal-BIugLhVB.js +0 -1
  574. package/build/assets/lesson-plan-DgpP80mJ.js +0 -4
  575. package/build/assets/llm-not-configured-banner-BlX8NifC.js +0 -27
  576. package/build/assets/llm-settings-DJmbryaE.js +0 -1
  577. package/build/assets/llm-settings-kU5v0H1Z.js +0 -1
  578. package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
  579. package/build/assets/loader-circle-BEykUKYG.js +0 -1
  580. package/build/assets/manage-backends-modal-C8FJQIZR.js +0 -1
  581. package/build/assets/manifest-56d40d7c.js +0 -1
  582. package/build/assets/model-selector-BOj1wBlq.js +0 -1
  583. package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
  584. package/build/assets/onboarding-DYhDxmI9.js +0 -1
  585. package/build/assets/onboarding-modal-CP_WxDC9.js +0 -1
  586. package/build/assets/option-service.api-C0tYT4-r.js +0 -1
  587. package/build/assets/organization-service.api-CnynNoT-.js +0 -1
  588. package/build/assets/path-utils-DWcgCGen.js +0 -1
  589. package/build/assets/plugins-management-service-BAp70KN7.js +0 -1
  590. package/build/assets/profiles-service.api-CeYEmSM3.js +0 -1
  591. package/build/assets/providers-BxCuC9bZ.js +0 -1
  592. package/build/assets/proxy-CHmFkV16.js +0 -1
  593. package/build/assets/root-V8fkplMy.css +0 -1
  594. package/build/assets/root-layout-CttG_lQi.js +0 -2
  595. package/build/assets/root-uJ2t9rCQ.js +0 -2
  596. package/build/assets/schema-field-xUr6rDd6.js +0 -1
  597. package/build/assets/sdk-section-page-CbLrVUa3.js +0 -1
  598. package/build/assets/search-4DHskuhE.js +0 -1
  599. package/build/assets/secrets-service-CZYjNxFw.js +0 -1
  600. package/build/assets/settings-DnlfS09K.js +0 -1
  601. package/build/assets/settings-modal-DfTcL-mV.js +0 -1
  602. package/build/assets/settings-service.api-K4ncGlBv.js +0 -1
  603. package/build/assets/shared-conversation-DWtBkJv7.js +0 -1
  604. package/build/assets/skills-plugins-BJ040luO.js +0 -1
  605. package/build/assets/use-acp-credential-form-EtnbtYt0.js +0 -1
  606. package/build/assets/use-agent-profiles-DEAMFp-W.js +0 -1
  607. package/build/assets/use-backends-health-DkC7tKkC.js +0 -1
  608. package/build/assets/use-cloud-current-user-id-Dm99wXp2.js +0 -1
  609. package/build/assets/use-config-CHzNIHpv.js +0 -1
  610. package/build/assets/use-create-conversation-CTsvZ96U.js +0 -1
  611. package/build/assets/use-is-authed-_dhQ2Xuj.js +0 -1
  612. package/build/assets/use-llm-profiles-BMhPDlwQ.js +0 -1
  613. package/build/assets/use-plugins-marketplace-BGb-KgfD.js +0 -1
  614. package/build/assets/use-runtime-is-ready-CC-KrLKe.js +0 -1
  615. package/build/assets/use-save-agent-profile-CLMmbx_X.js +0 -1
  616. package/build/assets/use-settings-BReAMxCG.js +0 -1
  617. package/build/assets/use-settings-nav-items-xe1YgLnE.js +0 -16
  618. package/build/assets/use-skills-Dqo-pDDx.js +0 -1
  619. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +0 -177
  620. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +0 -10
  621. package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
  622. package/build/assets/x-Cb0WAtak.js +0 -1
  623. /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-DU-Cb_sT.js} +0 -0
  624. /package/build/assets/{automation-BU8zu-FP.js → automation-BVEmGghX.js} +0 -0
  625. /package/build/assets/{checkmark-h7udgXMM.js → checkmark-DhcMGwtO.js} +0 -0
  626. /package/build/assets/{close-p3Op5lxI.js → close-DO5Rq_CS.js} +0 -0
  627. /package/build/assets/{code-tag-DYlAhEQY.js → code-tag-BvjtzUsr.js} +0 -0
  628. /package/build/assets/{color-themes-DPBzNtVg.js → color-themes-bVMmJJG6.js} +0 -0
  629. /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
  630. /package/build/assets/{conversation-local-storage-F6zVMM--.js → conversation-local-storage-B31voBg7.js} +0 -0
  631. /package/build/assets/{copy-BLmGeJcd.js → copy-DLUw2us-.js} +0 -0
  632. /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
  633. /package/build/assets/{dist-CodhvuAP.js → dist-Dj01FXbZ.js} +0 -0
  634. /package/build/assets/{environment-switch-store-DkjlKWzN.js → environment-switch-store-D9hB9PvY.js} +0 -0
  635. /package/build/assets/{extension-module-card-classes-9V3J9J_b.js → extension-module-card-classes-BlO4w702.js} +0 -0
  636. /package/build/assets/{folder-mMWFvaw0.js → folder-ynxP2EIL.js} +0 -0
  637. /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-rWEQrOGU.js} +0 -0
  638. /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-C3rfzUex.js} +0 -0
  639. /package/build/assets/{handle-capture-consent-CPMXU29K.js → handle-capture-consent-DDnXMC9Y.js} +0 -0
  640. /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-CuvxAQZ5.js} +0 -0
  641. /package/build/assets/{link-external-DfKQroKX.js → link-external-BVDiJfZt.js} +0 -0
  642. /package/build/assets/{llm-subscription-DtsX5Lhg.js → llm-subscription-BkdHwtQe.js} +0 -0
  643. /package/build/assets/{map-provider-BM2SJarp.js → map-provider-XSFHmdDs.js} +0 -0
  644. /package/build/assets/{middleware-DYHYNAnP.js → middleware-CWYDMVuG.js} +0 -0
  645. /package/build/assets/{modal-backdrop-zVwfOJZr.js → modal-backdrop-Dsmzgr5s.js} +0 -0
  646. /package/build/assets/{navigation-context-DPs2G0X8.js → navigation-context-SjzfpygH.js} +0 -0
  647. /package/build/assets/{objectWithoutPropertiesLoose-BgYIAs2y.js → objectWithoutPropertiesLoose-CQwg6tC0.js} +0 -0
  648. /package/build/assets/{openhands-logo-bcNw5bkY.js → openhands-logo-C-gDp1wr.js} +0 -0
  649. /package/build/assets/{react-DPDgL6du.js → react-ao3tWj6K.js} +0 -0
  650. /package/build/assets/{search-BsjCEFNf.js → search-pb4UKTfK.js} +0 -0
  651. /package/build/assets/{settings-mQUckT0g.js → settings-DksoDv5z.js} +0 -0
  652. /package/build/assets/{settings-gear-MXCyZW0x.js → settings-gear-D_HVvE5L.js} +0 -0
  653. /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-DLrsPCaI.js} +0 -0
  654. /package/build/assets/{settings-section-header-context-COMOIaxV.js → settings-section-header-context-C2MUIG88.js} +0 -0
  655. /package/build/assets/{skills-9cDZONKh.js → skills-CH4xgIh-.js} +0 -0
  656. /package/build/assets/{switch-skeleton-DqQwalyu.js → switch-skeleton-BpSOvZ-n.js} +0 -0
  657. /package/build/assets/{terminal-BuLtIrb9.js → terminal-Dokfkxn0.js} +0 -0
  658. /package/build/assets/{u-check-circle-BqoIxNz_.js → u-check-circle-DPWVO-9N.js} +0 -0
  659. /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-BGNAAjOW.js} +0 -0
  660. /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-BIskOoEG.js} +0 -0
  661. /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-OjLm94cF.js} +0 -0
  662. /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-Jpt2WWd7.js} +0 -0
  663. /package/build/assets/{use-onboarding-completion-C_Swglzp.js → use-onboarding-completion-DkRpDTsD.js} +0 -0
  664. /package/build/assets/{v4-DbCkTSoU.js → v4-DPgam_jW.js} +0 -0
  665. /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-BvEKaLBz.js} +0 -0
  666. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CznX01nZ.js} +0 -0
  667. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
  668. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g9hift2g-DmmpG9SI.js} +0 -0
  669. /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
  670. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BuL5kjfS.js} +0 -0
  671. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-DUYl8gbZ.js} +0 -0
  672. /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-pIgQDxTc.js} +0 -0
  673. /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-jAaNQWS9.js} +0 -0
  674. /package/build/assets/{x-mark-Batp6gXa.js → x-mark-C5przfXl.js} +0 -0
@@ -2,9 +2,10 @@ import { SettingsClient as e } from "../node_modules/@openhands/typescript-clien
2
2
  import "../node_modules/@openhands/typescript-client/dist/clients.js";
3
3
  import { getActiveBackend as t } from "./backend-registry/active-store.js";
4
4
  import { getAgentServerClientOptions as n } from "./agent-server-client-options.js";
5
- import { createCloudSecret as r, deleteCloudSecret as i, fetchCloudSecrets as a, updateCloudSecret as o } from "./cloud/secrets-service.api.js";
5
+ import { isSdkHttpStatusError as r } from "./agent-server-compatibility.js";
6
+ import { createCloudSecret as i, deleteCloudSecret as a, fetchCloudSecrets as o, updateCloudSecret as s } from "./cloud/secrets-service.api.js";
6
7
  //#region src/api/secrets-service.ts
7
- async function s(e, t = 3, n = 500) {
8
+ async function c(e, t = 3, n = 500) {
8
9
  for (let r = 0; r < t; r += 1) try {
9
10
  return await e();
10
11
  } catch (e) {
@@ -16,10 +17,10 @@ async function s(e, t = 3, n = 500) {
16
17
  }
17
18
  throw Error("Retry attempts exhausted");
18
19
  }
19
- var c = class {
20
+ var l = class {
20
21
  static async getSecrets() {
21
22
  try {
22
- return t().backend.kind === "cloud" ? await s(() => a()) : (await s(() => new e(n()).listSecrets())).secrets.map((e) => ({
23
+ return t().backend.kind === "cloud" ? await c(() => o()) : (await c(() => new e(n()).listSecrets())).secrets.map((e) => ({
23
24
  name: e.name,
24
25
  description: e.description
25
26
  }));
@@ -27,38 +28,38 @@ var c = class {
27
28
  return console.error("Failed to fetch secrets after retries:", e), [];
28
29
  }
29
30
  }
30
- static async createSecret(i, a, o) {
31
+ static async createSecret(r, a, o) {
31
32
  if (t().backend.kind === "cloud") {
32
- await s(() => r(i, a, o));
33
+ await c(() => i(r, a, o));
33
34
  return;
34
35
  }
35
- await s(() => new e(n()).upsertSecret({
36
- name: i,
36
+ await c(() => new e(n()).upsertSecret({
37
+ name: r,
37
38
  value: a,
38
39
  description: o
39
40
  }));
40
41
  }
41
42
  static async updateSecret(e, n, r) {
42
43
  if (t().backend.kind === "cloud") {
43
- await s(() => o(e, n, r));
44
+ await c(() => s(e, n, r));
44
45
  return;
45
46
  }
46
47
  await this.createSecret(e, n, r);
47
48
  }
48
- static async deleteSecret(r) {
49
+ static async deleteSecret(i) {
49
50
  try {
50
51
  if (t().backend.kind === "cloud") {
51
- await s(() => i(r));
52
+ await c(() => a(i));
52
53
  return;
53
54
  }
54
- await s(() => new e(n()).deleteSecret(r));
55
+ await c(() => new e(n()).deleteSecret(i));
55
56
  } catch (e) {
56
- if (e && typeof e == "object" && "response" in e && e.response?.status === 404) return;
57
+ if (r(e, 404) || e && typeof e == "object" && "response" in e && e.response?.status === 404) return;
57
58
  throw e;
58
59
  }
59
60
  }
60
61
  };
61
62
  //#endregion
62
- export { c as SecretsService };
63
+ export { l as SecretsService };
63
64
 
64
65
  //# sourceMappingURL=secrets-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secrets-service.js","names":[],"sources":["../../src/api/secrets-service.ts"],"sourcesContent":["import { SettingsClient } from \"@openhands/typescript-client/clients\";\nimport { getActiveBackend } from \"./backend-registry/active-store\";\nimport {\n createCloudSecret,\n deleteCloudSecret,\n fetchCloudSecrets,\n updateCloudSecret,\n} from \"./cloud/secrets-service.api\";\nimport { getAgentServerClientOptions } from \"./agent-server-client-options\";\nimport { CustomSecretWithoutValue } from \"./secrets-service.types\";\n\n/**\n * Retry helper for API calls with exponential backoff.\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelayMs: number = 500,\n): Promise<T> {\n for (let attempt = 0; attempt < maxRetries; attempt += 1) {\n try {\n return await fn();\n } catch (error) {\n if (attempt >= maxRetries - 1) {\n throw error;\n }\n\n const delay = baseDelayMs * 2 ** attempt;\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delay);\n });\n }\n }\n\n throw new Error(\"Retry attempts exhausted\");\n}\n\nexport class SecretsService {\n /**\n * List all custom secrets (names and descriptions only, no values).\n * Uses the agent-server API endpoint: GET /api/settings/secrets\n *\n * Note: The agent-server API doesn't support pagination or search filtering.\n * All secrets are returned in a single response.\n */\n static async getSecrets(): Promise<CustomSecretWithoutValue[]> {\n try {\n if (getActiveBackend().backend.kind === \"cloud\") {\n return await withRetry(() => fetchCloudSecrets());\n }\n const response = await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).listSecrets(),\n );\n return response.secrets.map((s) => ({\n name: s.name,\n description: s.description,\n }));\n } catch (error) {\n console.error(\"Failed to fetch secrets after retries:\", error);\n return [];\n }\n }\n\n /**\n * Create or update a custom secret (upsert by name).\n * Uses the agent-server API endpoint: PUT /api/settings/secrets\n *\n * @param name - Secret name (must start with letter, contain only letters/numbers/underscores, 1-64 chars)\n * @param value - Secret value\n * @param description - Optional description\n * @throws Error if the API call fails after retries\n */\n static async createSecret(\n name: string,\n value: string,\n description?: string,\n ): Promise<void> {\n if (getActiveBackend().backend.kind === \"cloud\") {\n await withRetry(() => createCloudSecret(name, value, description));\n return;\n }\n await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).upsertSecret({\n name,\n value,\n description,\n }),\n );\n }\n\n /**\n * Update a secret's value and/or description.\n * Uses the same upsert endpoint as createSecret since agent-server\n * doesn't have a separate update endpoint.\n *\n * @param name - Secret name (used as identifier)\n * @param value - New secret value\n * @param description - Optional new description\n * @throws Error if the API call fails after retries\n */\n static async updateSecret(\n name: string,\n value: string,\n description?: string,\n ): Promise<void> {\n if (getActiveBackend().backend.kind === \"cloud\") {\n // The cloud PUT endpoint renames + redescribes only (no value field),\n // matching what `useUpdateSecret` actually sends:\n // (secretToEdit=name, newName=value, description).\n await withRetry(() => updateCloudSecret(name, value, description));\n return;\n }\n // Agent-server uses upsert, so update is the same as create\n await this.createSecret(name, value, description);\n }\n\n /**\n * Delete a custom secret by name.\n * Uses the agent-server API endpoint: DELETE /api/settings/secrets/{name}\n *\n * @param name - Secret name to delete\n * @throws Error if the API call fails (except 404, which is treated as success)\n */\n static async deleteSecret(name: string): Promise<void> {\n try {\n if (getActiveBackend().backend.kind === \"cloud\") {\n await withRetry(() => deleteCloudSecret(name));\n return;\n }\n await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).deleteSecret(name),\n );\n } catch (error) {\n // 404 means secret doesn't exist - treat as successful deletion\n if (\n error &&\n typeof error === \"object\" &&\n \"response\" in error &&\n (error as { response?: { status?: number } }).response?.status === 404\n ) {\n return;\n }\n throw error;\n }\n }\n}\n"],"mappings":";;;;;;AAcA,eAAe,EACb,GACA,IAAqB,GACrB,IAAsB,KACV;AACZ,MAAK,IAAI,IAAU,GAAG,IAAU,GAAY,KAAW,EACrD,KAAI;AACF,SAAO,MAAM,GAAI;UACV,GAAO;AACd,MAAI,KAAW,IAAa,EAC1B,OAAM;EAGR,IAAM,IAAQ,IAAc,KAAK;AAEjC,QAAM,IAAI,SAAe,MAAY;AACnC,cAAW,GAAS,EAAM;IAC1B;;AAIN,OAAU,MAAM,2BAA2B;;AAG7C,IAAa,IAAb,MAA4B;CAQ1B,aAAa,aAAkD;AAC7D,MAAI;AAOF,UANI,GAAkB,CAAC,QAAQ,SAAS,UAC/B,MAAM,QAAgB,GAAmB,CAAC,IAK5C,MAHgB,QACrB,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa,CAChE,EACe,QAAQ,KAAK,OAAO;IAClC,MAAM,EAAE;IACR,aAAa,EAAE;IAChB,EAAE;WACI,GAAO;AAEd,UADA,QAAQ,MAAM,0CAA0C,EAAM,EACvD,EAAE;;;CAab,aAAa,aACX,GACA,GACA,GACe;AACf,MAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAC/C,SAAM,QAAgB,EAAkB,GAAM,GAAO,EAAY,CAAC;AAClE;;AAEF,QAAM,QACJ,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa;GAC7D;GACA;GACA;GACD,CAAC,CACH;;CAaH,aAAa,aACX,GACA,GACA,GACe;AACf,MAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAI/C,SAAM,QAAgB,EAAkB,GAAM,GAAO,EAAY,CAAC;AAClE;;AAGF,QAAM,KAAK,aAAa,GAAM,GAAO,EAAY;;CAUnD,aAAa,aAAa,GAA6B;AACrD,MAAI;AACF,OAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAC/C,UAAM,QAAgB,EAAkB,EAAK,CAAC;AAC9C;;AAEF,SAAM,QACJ,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa,EAAK,CACrE;WACM,GAAO;AAEd,OACE,KACA,OAAO,KAAU,YACjB,cAAc,KACb,EAA6C,UAAU,WAAW,IAEnE;AAEF,SAAM"}
1
+ {"version":3,"file":"secrets-service.js","names":[],"sources":["../../src/api/secrets-service.ts"],"sourcesContent":["import { SettingsClient } from \"@openhands/typescript-client/clients\";\nimport { isSdkHttpStatusError } from \"./agent-server-compatibility\";\nimport { getActiveBackend } from \"./backend-registry/active-store\";\nimport {\n createCloudSecret,\n deleteCloudSecret,\n fetchCloudSecrets,\n updateCloudSecret,\n} from \"./cloud/secrets-service.api\";\nimport { getAgentServerClientOptions } from \"./agent-server-client-options\";\nimport { CustomSecretWithoutValue } from \"./secrets-service.types\";\n\n/**\n * Retry helper for API calls with exponential backoff.\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelayMs: number = 500,\n): Promise<T> {\n for (let attempt = 0; attempt < maxRetries; attempt += 1) {\n try {\n return await fn();\n } catch (error) {\n if (attempt >= maxRetries - 1) {\n throw error;\n }\n\n const delay = baseDelayMs * 2 ** attempt;\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delay);\n });\n }\n }\n\n throw new Error(\"Retry attempts exhausted\");\n}\n\nexport class SecretsService {\n /**\n * List all custom secrets (names and descriptions only, no values).\n * Uses the agent-server API endpoint: GET /api/settings/secrets\n *\n * Note: The agent-server API doesn't support pagination or search filtering.\n * All secrets are returned in a single response.\n */\n static async getSecrets(): Promise<CustomSecretWithoutValue[]> {\n try {\n if (getActiveBackend().backend.kind === \"cloud\") {\n return await withRetry(() => fetchCloudSecrets());\n }\n const response = await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).listSecrets(),\n );\n return response.secrets.map((s) => ({\n name: s.name,\n description: s.description,\n }));\n } catch (error) {\n console.error(\"Failed to fetch secrets after retries:\", error);\n return [];\n }\n }\n\n /**\n * Create or update a custom secret (upsert by name).\n * Uses the agent-server API endpoint: PUT /api/settings/secrets\n *\n * @param name - Secret name (must start with letter, contain only letters/numbers/underscores, 1-64 chars)\n * @param value - Secret value\n * @param description - Optional description\n * @throws Error if the API call fails after retries\n */\n static async createSecret(\n name: string,\n value: string,\n description?: string,\n ): Promise<void> {\n if (getActiveBackend().backend.kind === \"cloud\") {\n await withRetry(() => createCloudSecret(name, value, description));\n return;\n }\n await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).upsertSecret({\n name,\n value,\n description,\n }),\n );\n }\n\n /**\n * Update a secret's value and/or description.\n * Uses the same upsert endpoint as createSecret since agent-server\n * doesn't have a separate update endpoint.\n *\n * @param name - Secret name (used as identifier)\n * @param value - New secret value\n * @param description - Optional new description\n * @throws Error if the API call fails after retries\n */\n static async updateSecret(\n name: string,\n value: string,\n description?: string,\n ): Promise<void> {\n if (getActiveBackend().backend.kind === \"cloud\") {\n // The cloud PUT endpoint renames + redescribes only (no value field),\n // matching what `useUpdateSecret` actually sends:\n // (secretToEdit=name, newName=value, description).\n await withRetry(() => updateCloudSecret(name, value, description));\n return;\n }\n // Agent-server uses upsert, so update is the same as create\n await this.createSecret(name, value, description);\n }\n\n /**\n * Delete a custom secret by name.\n * Uses the agent-server API endpoint: DELETE /api/settings/secrets/{name}\n *\n * @param name - Secret name to delete\n * @throws Error if the API call fails (except 404, which is treated as success)\n */\n static async deleteSecret(name: string): Promise<void> {\n try {\n if (getActiveBackend().backend.kind === \"cloud\") {\n await withRetry(() => deleteCloudSecret(name));\n return;\n }\n await withRetry(() =>\n new SettingsClient(getAgentServerClientOptions()).deleteSecret(name),\n );\n } catch (error) {\n // 404 means secret doesn't exist - treat as successful deletion.\n // Both the SDK's HttpError (status on the error itself) and\n // axios-style errors (status under `response`) count.\n if (\n isSdkHttpStatusError(error, 404) ||\n (error &&\n typeof error === \"object\" &&\n \"response\" in error &&\n (error as { response?: { status?: number } }).response?.status ===\n 404)\n ) {\n return;\n }\n throw error;\n }\n }\n}\n"],"mappings":";;;;;;;AAeA,eAAe,EACb,GACA,IAAqB,GACrB,IAAsB,KACV;AACZ,MAAK,IAAI,IAAU,GAAG,IAAU,GAAY,KAAW,EACrD,KAAI;AACF,SAAO,MAAM,GAAI;UACV,GAAO;AACd,MAAI,KAAW,IAAa,EAC1B,OAAM;EAGR,IAAM,IAAQ,IAAc,KAAK;AAEjC,QAAM,IAAI,SAAe,MAAY;AACnC,cAAW,GAAS,EAAM;IAC1B;;AAIN,OAAU,MAAM,2BAA2B;;AAG7C,IAAa,IAAb,MAA4B;CAQ1B,aAAa,aAAkD;AAC7D,MAAI;AAOF,UANI,GAAkB,CAAC,QAAQ,SAAS,UAC/B,MAAM,QAAgB,GAAmB,CAAC,IAK5C,MAHgB,QACrB,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa,CAChE,EACe,QAAQ,KAAK,OAAO;IAClC,MAAM,EAAE;IACR,aAAa,EAAE;IAChB,EAAE;WACI,GAAO;AAEd,UADA,QAAQ,MAAM,0CAA0C,EAAM,EACvD,EAAE;;;CAab,aAAa,aACX,GACA,GACA,GACe;AACf,MAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAC/C,SAAM,QAAgB,EAAkB,GAAM,GAAO,EAAY,CAAC;AAClE;;AAEF,QAAM,QACJ,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa;GAC7D;GACA;GACA;GACD,CAAC,CACH;;CAaH,aAAa,aACX,GACA,GACA,GACe;AACf,MAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAI/C,SAAM,QAAgB,EAAkB,GAAM,GAAO,EAAY,CAAC;AAClE;;AAGF,QAAM,KAAK,aAAa,GAAM,GAAO,EAAY;;CAUnD,aAAa,aAAa,GAA6B;AACrD,MAAI;AACF,OAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAC/C,UAAM,QAAgB,EAAkB,EAAK,CAAC;AAC9C;;AAEF,SAAM,QACJ,IAAI,EAAe,GAA6B,CAAC,CAAC,aAAa,EAAK,CACrE;WACM,GAAO;AAId,OACE,EAAqB,GAAO,IAAI,IAC/B,KACC,OAAO,KAAU,YACjB,cAAc,KACb,EAA6C,UAAU,WACtD,IAEJ;AAEF,SAAM"}
@@ -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`),i=require(`../../../../types/agent-server/type-guards.cjs`),a=require(`../../../features/chat/mono-component.cjs`),o=require(`../../../features/chat/path-component.cjs`),s=require(`./get-action-content.cjs`),c=require(`./get-observation-content.cjs`),l=require(`./get-acp-tool-call-content.cjs`),u=require(`../task-tracking/task-tracking-observation-content.cjs`),d=require(`./create-skill-ready-event.cjs`),f=require(`../../../features/chat/tool-visualizers/dispatcher.cjs`);let p=require(`react`);p=e.__toESM(p,1);let m=require(`react/jsx-runtime`);var h=(e,t)=>e?e.length>t?`${e.substring(0,t)}...`:e:``,g=(e,n)=>r.default.exists(e)?(0,m.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,m.jsx)(o.PathComponent,{}),cmd:(0,m.jsx)(a.MonoComponent,{})}}):e,_=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),v=e=>{let t=e.summary?.trim().replace(/\s+/g,` `)||``;return!t||_(t)?null:t},y=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?h(n,t):n:null},b=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=y(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},x=(e,t)=>{let n=t?.tool_name,r=e.observation,i=y(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=y((t?.action??{}).profile_name)??y(r.profile_name)??y(r.base_url,80)??y(r.endpoint,80)??y(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},S=e=>{if(!i.isActionEvent(e))return``;let t=b(e);if(t)return t;let n=v(e);if(n)return n;let r=e.action.kind,a=``,o={};switch(r){case`ExecuteBashAction`:case`TerminalAction`:a=`ACTION_MESSAGE$RUN`,o={command:h(e.action.command,80)};break;case`FileEditorAction`:case`StrReplaceEditorAction`:a=e.action.command===`view`?`ACTION_MESSAGE$READ`:e.action.command===`create`?`ACTION_MESSAGE$WRITE`:`ACTION_MESSAGE$EDIT`,o={path:e.action.path};break;case`MCPToolAction`:a=`ACTION_MESSAGE$CALL_TOOL_MCP`,o={mcp_tool_name:e.tool_name};break;case`InvokeSkillAction`:a=`ACTION_MESSAGE$INVOKE_SKILL`,o={name:e.action.name};break;case`TaskAction`:a=`ACTION_MESSAGE$TASK`,o={name:e.action.subagent_type};break;case`ThinkAction`:a=`ACTION_MESSAGE$THINK`;break;case`FinishAction`:a=`ACTION_MESSAGE$FINISH`;break;case`TaskTrackerAction`:a=`ACTION_MESSAGE$TASK_TRACKING`;break;case`GrepAction`:a=`ACTION_MESSAGE$GREP`,o={pattern:`pattern`in e.action&&e.action.pattern?h(String(e.action.pattern),50):``};break;case`GlobAction`:a=`ACTION_MESSAGE$GLOB`,o={pattern:`pattern`in e.action&&e.action.pattern?h(String(e.action.pattern),50):``};break;case`BrowserNavigateAction`:case`BrowserClickAction`:case`BrowserTypeAction`:case`BrowserGetStateAction`:case`BrowserGetContentAction`:case`BrowserScrollAction`:case`BrowserGoBackAction`:case`BrowserListTabsAction`:case`BrowserSwitchTabAction`:case`BrowserCloseTabAction`:a=`ACTION_MESSAGE$BROWSE`;break;default:return String(r).replace(`Action`,``).toUpperCase()}return a?g(a,o):r},C=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=x(e,t);if(n)return n;if(t){let e=b(t);if(e)return e;let n=v(t);if(n)return n}let r=e.observation.kind,a=``,o={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,o={command:e.observation.command?h(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,o={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,o={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,o={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,o={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,o={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`,o={pattern:e.observation.pattern?h(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,o={pattern:e.observation.pattern?h(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,o):r},w=(e,t)=>{let a=``,o=``;if(d.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;a=r.default.exists(t)?g(t,{}):`Skill Ready`,o=e._skillReadyContent}else i.isActionEvent(e)?(a=S(e),o=f.resolveVisualizerBody(e)??s.getActionContent(e)):i.isObservationEvent(e)?(a=C(e,t),o=e.observation.kind===`TaskTrackerObservation`?(0,m.jsx)(u.TaskTrackingObservationContent,{event:e}):f.resolveVisualizerBody(e,t)??c.getObservationContent(e)):i.isACPToolCallEvent(e)?(a=g(l.getACPToolCallTitleKey(e),{title:l.stripRedundantTitlePrefix(e)}),o=l.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(a=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:a||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:o}};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`),i=require(`../../../../constants/canvas-ui.cjs`),a=require(`../../../../types/agent-server/type-guards.cjs`),o=require(`../../../features/chat/mono-component.cjs`),s=require(`../../../features/chat/path-component.cjs`),c=require(`./get-action-content.cjs`),l=require(`./get-observation-content.cjs`),u=require(`./get-acp-tool-call-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,t)=>e?e.length>t?`${e.substring(0,t)}...`:e:``,_=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(s.PathComponent,{}),cmd:(0,h.jsx)(o.MonoComponent,{})}}):e,v=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),y=e=>{let t=e.summary?.trim().replace(/\s+/g,` `)||``;return!t||v(t)?null:t},b=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?g(n,t):n:null},x=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=b(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},S=(e,t)=>{let n=t?.tool_name,r=e.observation,i=b(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=b((t?.action??{}).profile_name)??b(r.profile_name)??b(r.base_url,80)??b(r.endpoint,80)??b(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},C=e=>{if(!a.isActionEvent(e))return``;let t=x(e);if(t)return t;let n=y(e);if(n)return n;let r=e.action.kind,o=``,s={};switch(r){case`ExecuteBashAction`:case`TerminalAction`:o=`ACTION_MESSAGE$RUN`,s={command:g(e.action.command,80)};break;case`FileEditorAction`:case`StrReplaceEditorAction`:o=e.action.command===`view`?`ACTION_MESSAGE$READ`:e.action.command===`create`?`ACTION_MESSAGE$WRITE`:`ACTION_MESSAGE$EDIT`,s={path:e.action.path};break;case`MCPToolAction`:o=`ACTION_MESSAGE$CALL_TOOL_MCP`,s={mcp_tool_name:e.tool_name};break;case`InvokeSkillAction`:o=`ACTION_MESSAGE$INVOKE_SKILL`,s={name:e.action.name};break;case`TaskAction`:o=`ACTION_MESSAGE$TASK`,s={name:e.action.subagent_type};break;case`ThinkAction`:o=`ACTION_MESSAGE$THINK`;break;case`FinishAction`:o=`ACTION_MESSAGE$FINISH`;break;case`TaskTrackerAction`:o=`ACTION_MESSAGE$TASK_TRACKING`;break;case`GrepAction`:o=`ACTION_MESSAGE$GREP`,s={pattern:`pattern`in e.action&&e.action.pattern?g(String(e.action.pattern),50):``};break;case`GlobAction`:o=`ACTION_MESSAGE$GLOB`,s={pattern:`pattern`in e.action&&e.action.pattern?g(String(e.action.pattern),50):``};break;case`BrowserNavigateAction`:case`BrowserClickAction`:case`BrowserTypeAction`:case`BrowserGetStateAction`:case`BrowserGetContentAction`:case`BrowserScrollAction`:case`BrowserGoBackAction`:case`BrowserListTabsAction`:case`BrowserSwitchTabAction`:case`BrowserCloseTabAction`:o=`ACTION_MESSAGE$BROWSE`;break;case`CanvasUIAction`:case i.CANVAS_UI_CLIENT_ACTION_KIND:return`CANVASUI`;default:return String(r).replace(`Action`,``).toUpperCase()}return o?_(o,s):r},w=(e,t)=>{if(!a.isObservationEvent(e))return``;let n=S(e,t);if(n)return n;if(t){let e=x(t);if(e)return e;let n=y(t);if(n)return n}let r=e.observation.kind,i=``,o={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:i=`OBSERVATION_MESSAGE$RUN`,o={command:e.observation.command?g(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:i=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,o={path:e.observation.path||``};break;case`MCPToolObservation`:i=`OBSERVATION_MESSAGE$MCP`,o={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:i=`OBSERVATION_MESSAGE$INVOKE_SKILL`,o={name:e.observation.skill_name};break;case`TaskObservation`:i=`OBSERVATION_MESSAGE$TASK`,o={name:e.observation.subagent};break;case`CanvasUIObservation`:i=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){i=`OBSERVATION_MESSAGE$CANVAS_UI`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:i=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,o={name:e.observation.profile_name};break;case`BrowserObservation`:i=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;i=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:i=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:i=`OBSERVATION_MESSAGE$GLOB`,o={pattern:e.observation.pattern?g(e.observation.pattern,50):``};break;case`GrepObservation`:i=`OBSERVATION_MESSAGE$GREP`,o={pattern:e.observation.pattern?g(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return i?_(i,o):r},T=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!a.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,E=(e,t)=>{let i=``,o=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;i=r.default.exists(t)?_(t,{}):`Skill Ready`,o=e._skillReadyContent}else a.isActionEvent(e)?(i=C(e),o=p.resolveVisualizerBody(e)??c.getActionContent(e)):a.isObservationEvent(e)?(i=w(e,t),o=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):T(e,t)??p.resolveVisualizerBody(e,t)??l.getObservationContent(e)):a.isACPToolCallEvent(e)?(i=_(u.getACPToolCallTitleKey(e),{title:u.stripRedundantTitlePrefix(e)}),o=u.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(i=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:i||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:o}};exports.getEventContent=E;
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 {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\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\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: 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\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\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 ? trimText(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 const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\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 = getSummaryTitleForActionEvent(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 ? trimText(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 \"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 ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(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\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 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 {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\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\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: 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\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\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 ? trimText(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 const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return \"CANVASUI\";\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\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 = getSummaryTitleForActionEvent(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 ? trimText(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 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 ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(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,81 +1,82 @@
1
1
  import { Trans as e } from "../../../../node_modules/react-i18next/dist/es/Trans.js";
2
2
  import { I18nKey as t } from "../../../../i18n/declaration.js";
3
3
  import n from "../../../../i18n/index.js";
4
- import { isACPToolCallEvent as r, isActionEvent as i, isObservationEvent as a } from "../../../../types/agent-server/type-guards.js";
5
- import { MonoComponent as o } from "../../../features/chat/mono-component.js";
6
- import { PathComponent as s } from "../../../features/chat/path-component.js";
7
- import { getActionContent as c } from "./get-action-content.js";
8
- import { getObservationContent as l } from "./get-observation-content.js";
9
- import { getACPToolCallContent as u, getACPToolCallTitleKey as d, stripRedundantTitlePrefix as f } from "./get-acp-tool-call-content.js";
10
- import { TaskTrackingObservationContent as p } from "../task-tracking/task-tracking-observation-content.js";
11
- import { isSkillReadyEvent as m } from "./create-skill-ready-event.js";
12
- import { resolveVisualizerBody as h } from "../../../features/chat/tool-visualizers/dispatcher.js";
4
+ import { CANVAS_UI_CLIENT_ACTION_KIND as r } from "../../../../constants/canvas-ui.js";
5
+ import { isACPToolCallEvent as i, isActionEvent as a, isCanvasUIActionEvent as o, isObservationEvent as s } from "../../../../types/agent-server/type-guards.js";
6
+ import { MonoComponent as c } from "../../../features/chat/mono-component.js";
7
+ import { PathComponent as l } from "../../../features/chat/path-component.js";
8
+ import { getActionContent as u } from "./get-action-content.js";
9
+ import { getObservationContent as d } from "./get-observation-content.js";
10
+ import { getACPToolCallContent as f, getACPToolCallTitleKey as p, stripRedundantTitlePrefix as m } from "./get-acp-tool-call-content.js";
11
+ import { TaskTrackingObservationContent as h } from "../task-tracking/task-tracking-observation-content.js";
12
+ import { isSkillReadyEvent as g } from "./create-skill-ready-event.js";
13
+ import { resolveVisualizerBody as _ } from "../../../features/chat/tool-visualizers/dispatcher.js";
13
14
  import "react";
14
- import { jsx as g } from "react/jsx-runtime";
15
+ import { jsx as v } from "react/jsx-runtime";
15
16
  //#region src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx
16
- var _ = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", v = (t, r) => n.exists(t) ? /* @__PURE__ */ g(e, {
17
+ var y = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", b = (t, r) => n.exists(t) ? /* @__PURE__ */ v(e, {
17
18
  ns: "openhands",
18
19
  i18nKey: t,
19
20
  values: r,
20
21
  components: {
21
- path: /* @__PURE__ */ g(s, {}),
22
- cmd: /* @__PURE__ */ g(o, {})
22
+ path: /* @__PURE__ */ v(l, {}),
23
+ cmd: /* @__PURE__ */ v(c, {})
23
24
  }
24
- }) : t, y = (e) => /^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e), b = (e) => {
25
+ }) : t, x = (e) => /^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e), S = (e) => {
25
26
  let t = e.summary?.trim().replace(/\s+/g, " ") || "";
26
- return !t || y(t) ? null : t;
27
- }, x = (e, t) => {
27
+ return !t || x(t) ? null : t;
28
+ }, C = (e, t) => {
28
29
  if (typeof e != "string") return null;
29
30
  let n = e.trim();
30
- return n ? t ? _(n, t) : n : null;
31
- }, S = (e) => {
31
+ return n ? t ? y(n, t) : n : null;
32
+ }, w = (e) => {
32
33
  if (e.tool_name !== "inspect_image_with_vision") return null;
33
- let t = e.action, n = x(t.profile_name);
34
+ let t = e.action, n = C(t.profile_name);
34
35
  return n ? `Describing image with ${n}` : "Describing image with auxiliary vision LLM";
35
- }, C = (e, t) => {
36
- let n = t?.tool_name, r = e.observation, i = x(r.tool_name);
36
+ }, T = (e, t) => {
37
+ let n = t?.tool_name, r = e.observation, i = C(r.tool_name);
37
38
  if (n !== "inspect_image_with_vision" && i !== "inspect_image_with_vision" && String(e.observation.kind) !== "VisionInspectObservation") return null;
38
- let a = x((t?.action ?? {}).profile_name) ?? x(r.profile_name) ?? x(r.base_url, 80) ?? x(r.endpoint, 80) ?? x(r.model, 80);
39
+ let a = C((t?.action ?? {}).profile_name) ?? C(r.profile_name) ?? C(r.base_url, 80) ?? C(r.endpoint, 80) ?? C(r.model, 80);
39
40
  return a ? `Describing image with ${a}` : "Describing image with auxiliary vision LLM";
40
- }, w = (e) => {
41
- if (!i(e)) return "";
42
- let t = S(e);
41
+ }, E = (e) => {
42
+ if (!a(e)) return "";
43
+ let t = w(e);
43
44
  if (t) return t;
44
- let n = b(e);
45
+ let n = S(e);
45
46
  if (n) return n;
46
- let r = e.action.kind, a = "", o = {};
47
- switch (r) {
47
+ let i = e.action.kind, o = "", s = {};
48
+ switch (i) {
48
49
  case "ExecuteBashAction":
49
50
  case "TerminalAction":
50
- a = "ACTION_MESSAGE$RUN", o = { command: _(e.action.command, 80) };
51
+ o = "ACTION_MESSAGE$RUN", s = { command: y(e.action.command, 80) };
51
52
  break;
52
53
  case "FileEditorAction":
53
54
  case "StrReplaceEditorAction":
54
- a = e.action.command === "view" ? "ACTION_MESSAGE$READ" : e.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT", o = { path: e.action.path };
55
+ o = e.action.command === "view" ? "ACTION_MESSAGE$READ" : e.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT", s = { path: e.action.path };
55
56
  break;
56
57
  case "MCPToolAction":
57
- a = "ACTION_MESSAGE$CALL_TOOL_MCP", o = { mcp_tool_name: e.tool_name };
58
+ o = "ACTION_MESSAGE$CALL_TOOL_MCP", s = { mcp_tool_name: e.tool_name };
58
59
  break;
59
60
  case "InvokeSkillAction":
60
- a = "ACTION_MESSAGE$INVOKE_SKILL", o = { name: e.action.name };
61
+ o = "ACTION_MESSAGE$INVOKE_SKILL", s = { name: e.action.name };
61
62
  break;
62
63
  case "TaskAction":
63
- a = "ACTION_MESSAGE$TASK", o = { name: e.action.subagent_type };
64
+ o = "ACTION_MESSAGE$TASK", s = { name: e.action.subagent_type };
64
65
  break;
65
66
  case "ThinkAction":
66
- a = "ACTION_MESSAGE$THINK";
67
+ o = "ACTION_MESSAGE$THINK";
67
68
  break;
68
69
  case "FinishAction":
69
- a = "ACTION_MESSAGE$FINISH";
70
+ o = "ACTION_MESSAGE$FINISH";
70
71
  break;
71
72
  case "TaskTrackerAction":
72
- a = "ACTION_MESSAGE$TASK_TRACKING";
73
+ o = "ACTION_MESSAGE$TASK_TRACKING";
73
74
  break;
74
75
  case "GrepAction":
75
- a = "ACTION_MESSAGE$GREP", o = { pattern: "pattern" in e.action && e.action.pattern ? _(String(e.action.pattern), 50) : "" };
76
+ o = "ACTION_MESSAGE$GREP", s = { pattern: "pattern" in e.action && e.action.pattern ? y(String(e.action.pattern), 50) : "" };
76
77
  break;
77
78
  case "GlobAction":
78
- a = "ACTION_MESSAGE$GLOB", o = { pattern: "pattern" in e.action && e.action.pattern ? _(String(e.action.pattern), 50) : "" };
79
+ o = "ACTION_MESSAGE$GLOB", s = { pattern: "pattern" in e.action && e.action.pattern ? y(String(e.action.pattern), 50) : "" };
79
80
  break;
80
81
  case "BrowserNavigateAction":
81
82
  case "BrowserClickAction":
@@ -87,45 +88,53 @@ var _ = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", v = (t,
87
88
  case "BrowserListTabsAction":
88
89
  case "BrowserSwitchTabAction":
89
90
  case "BrowserCloseTabAction":
90
- a = "ACTION_MESSAGE$BROWSE";
91
+ o = "ACTION_MESSAGE$BROWSE";
91
92
  break;
92
- default: return String(r).replace("Action", "").toUpperCase();
93
+ case "CanvasUIAction":
94
+ case r: return "CANVASUI";
95
+ default: return String(i).replace("Action", "").toUpperCase();
93
96
  }
94
- return a ? v(a, o) : r;
95
- }, T = (e, t) => {
96
- if (!a(e)) return "";
97
- let n = C(e, t);
97
+ return o ? b(o, s) : i;
98
+ }, D = (e, t) => {
99
+ if (!s(e)) return "";
100
+ let n = T(e, t);
98
101
  if (n) return n;
99
102
  if (t) {
100
- let e = S(t);
103
+ let e = w(t);
101
104
  if (e) return e;
102
- let n = b(t);
105
+ let n = S(t);
103
106
  if (n) return n;
104
107
  }
105
- let r = e.observation.kind, i = "", o = {};
108
+ let r = e.observation.kind, i = "", a = {};
106
109
  switch (r) {
107
110
  case "ExecuteBashObservation":
108
111
  case "TerminalObservation":
109
- i = "OBSERVATION_MESSAGE$RUN", o = { command: e.observation.command ? _(e.observation.command, 80) : "" };
112
+ i = "OBSERVATION_MESSAGE$RUN", a = { command: e.observation.command ? y(e.observation.command, 80) : "" };
110
113
  break;
111
114
  case "FileEditorObservation":
112
115
  case "StrReplaceEditorObservation":
113
- i = e.observation.command === "view" ? "OBSERVATION_MESSAGE$READ" : "OBSERVATION_MESSAGE$EDIT", o = { path: e.observation.path || "" };
116
+ i = e.observation.command === "view" ? "OBSERVATION_MESSAGE$READ" : "OBSERVATION_MESSAGE$EDIT", a = { path: e.observation.path || "" };
114
117
  break;
115
118
  case "MCPToolObservation":
116
- i = "OBSERVATION_MESSAGE$MCP", o = { mcp_tool_name: e.observation.tool_name };
119
+ i = "OBSERVATION_MESSAGE$MCP", a = { mcp_tool_name: e.observation.tool_name };
117
120
  break;
118
121
  case "InvokeSkillObservation":
119
- i = "OBSERVATION_MESSAGE$INVOKE_SKILL", o = { name: e.observation.skill_name };
122
+ i = "OBSERVATION_MESSAGE$INVOKE_SKILL", a = { name: e.observation.skill_name };
120
123
  break;
121
124
  case "TaskObservation":
122
- i = "OBSERVATION_MESSAGE$TASK", o = { name: e.observation.subagent };
125
+ i = "OBSERVATION_MESSAGE$TASK", a = { name: e.observation.subagent };
123
126
  break;
124
127
  case "CanvasUIObservation":
125
128
  i = "OBSERVATION_MESSAGE$CANVAS_UI";
126
129
  break;
130
+ case "ClientToolObservation":
131
+ if (e.tool_name === "canvas_ui_control") {
132
+ i = "OBSERVATION_MESSAGE$CANVAS_UI";
133
+ break;
134
+ }
135
+ return r.replace("Observation", "").toUpperCase();
127
136
  case "SwitchLLMObservation":
128
- i = e.observation.is_error ? "MODEL$SWITCH_FAILED" : "MODEL$SWITCHED_TO_PROFILE", o = { name: e.observation.profile_name };
137
+ i = e.observation.is_error ? "MODEL$SWITCH_FAILED" : "MODEL$SWITCHED_TO_PROFILE", a = { name: e.observation.profile_name };
129
138
  break;
130
139
  case "BrowserObservation":
131
140
  i = "OBSERVATION_MESSAGE$BROWSE";
@@ -139,26 +148,26 @@ var _ = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", v = (t,
139
148
  i = "OBSERVATION_MESSAGE$THINK";
140
149
  break;
141
150
  case "GlobObservation":
142
- i = "OBSERVATION_MESSAGE$GLOB", o = { pattern: e.observation.pattern ? _(e.observation.pattern, 50) : "" };
151
+ i = "OBSERVATION_MESSAGE$GLOB", a = { pattern: e.observation.pattern ? y(e.observation.pattern, 50) : "" };
143
152
  break;
144
153
  case "GrepObservation":
145
- i = "OBSERVATION_MESSAGE$GREP", o = { pattern: e.observation.pattern ? _(e.observation.pattern, 50) : "" };
154
+ i = "OBSERVATION_MESSAGE$GREP", a = { pattern: e.observation.pattern ? y(e.observation.pattern, 50) : "" };
146
155
  break;
147
156
  default: return r.replace("Observation", "").toUpperCase();
148
157
  }
149
- return i ? v(i, o) : r;
150
- }, E = (e, o) => {
151
- let s = "", _ = "";
152
- if (m(e)) {
158
+ return i ? b(i, a) : r;
159
+ }, O = (e, t) => e.observation.kind !== "ClientToolObservation" || e.tool_name !== "canvas_ui_control" || !t || !o(t) ? null : `UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`, k = (e, r) => {
160
+ let o = "", c = "";
161
+ if (g(e)) {
153
162
  let t = "OBSERVATION_MESSAGE$SKILL_READY";
154
- s = n.exists(t) ? v(t, {}) : "Skill Ready", _ = e._skillReadyContent;
155
- } else i(e) ? (s = w(e), _ = h(e) ?? c(e)) : a(e) ? (s = T(e, o), _ = e.observation.kind === "TaskTrackerObservation" ? /* @__PURE__ */ g(p, { event: e }) : h(e, o) ?? l(e)) : r(e) ? (s = v(d(e), { title: f(e) }), _ = u(e)) : e.source === "agent" && "action" in e && e.action !== null && typeof e.action == "object" && "kind" in e.action && typeof e.action.kind == "string" && (s = String(e.action.kind).replace("Action", "").toUpperCase());
163
+ o = n.exists(t) ? b(t, {}) : "Skill Ready", c = e._skillReadyContent;
164
+ } else a(e) ? (o = E(e), c = _(e) ?? u(e)) : s(e) ? (o = D(e, r), c = e.observation.kind === "TaskTrackerObservation" ? /* @__PURE__ */ v(h, { event: e }) : O(e, r) ?? _(e, r) ?? d(e)) : i(e) ? (o = b(p(e), { title: m(e) }), c = f(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());
156
165
  return {
157
- title: s || n.t(t.EVENT$UNKNOWN_EVENT),
158
- details: _
166
+ title: o || n.t(t.EVENT$UNKNOWN_EVENT),
167
+ details: c
159
168
  };
160
169
  };
161
170
  //#endregion
162
- export { E as getEventContent };
171
+ export { k as getEventContent };
163
172
 
164
173
  //# sourceMappingURL=get-event-content.js.map
@@ -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 {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\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\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: 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\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\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 ? trimText(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 const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\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 = getSummaryTitleForActionEvent(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 ? trimText(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 \"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 ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(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\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 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 {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\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\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: 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\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\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 ? trimText(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 const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return \"CANVASUI\";\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\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 = getSummaryTitleForActionEvent(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 ? trimText(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 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 ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(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,4 +1,4 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../i18n/declaration.cjs`),t=require(`../../../../i18n/index.cjs`),n=require(`./shared.cjs`),r=require(`./get-observation-result.cjs`);var i=e=>{let{observation:t}=e;if(t.error)return`**Error:**\n${t.error}`;let n=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../i18n/declaration.cjs`),t=require(`../../../../i18n/index.cjs`);require(`../../../../constants/canvas-ui.cjs`);const n=require(`./shared.cjs`),r=require(`./get-observation-result.cjs`);var i=e=>{let{observation:t}=e;if(t.error)return`**Error:**\n${t.error}`;let n=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
2
  `):null;return r.getObservationResult(e)===`success`&&`old_content`in t&&`new_content`in t&&t.old_content&&t.new_content||t.command===`view`?`\`\`\`\n${n||t.output}\n\`\`\``:n||t.output},a=r=>{let{observation:i}=r,a=i.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
3
3
  `)||``;a.length>1e3&&(a=`${a.slice(0,n.MAX_CONTENT_LENGTH)}...`);let o=``;return i.command&&(o+=`Command: \`${i.command}\`\n\n`),o+=`Output:\n\`\`\`sh\n${a.trim()||t.default.t(e.I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\n\`\`\``,o},o=e=>{let{observation:t}=e,r=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
4
4
  `):t.output||``,i=``;return t.error?i+=`**Error:**\n${t.error}`:r?i+=`**Output:**\n${r}`:i+=`Browser action completed successfully.`,i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},s=e=>{let{observation:t}=e,r=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
@@ -15,5 +15,5 @@ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../
15
15
  `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},h=e=>{let{observation:t}=e,r=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
16
16
  `),i=`**Pattern:** \`${t.pattern}\`\n`;return i+=`**Search Path:** \`${t.search_path}\`\n`,t.include_pattern&&(i+=`**Include:** \`${t.include_pattern}\`\n`),i+=`
17
17
  `,t.is_error?i+=`**Error:**\n${r}`:t.matches.length===0?i+=`**Result:** No matches found.`:(i+=`**Matches (${t.matches.length}${t.truncated?`+, truncated`:``}):**\n`,i+=t.matches.map(e=>`- \`${e}\``).join(`
18
- `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},g=e=>{switch(e.observation.kind){case`FileEditorObservation`:case`StrReplaceEditorObservation`:return i(e);case`ExecuteBashObservation`:case`TerminalObservation`:return a(e);case`BrowserObservation`:return o(e);case`MCPToolObservation`:return s(e);case`TaskTrackerObservation`:return d(e);case`ThinkObservation`:return f(e);case`FinishObservation`:return p(e);case`GlobObservation`:return m(e);case`GrepObservation`:return h(e);case`InvokeSkillObservation`:return c(e);case`CanvasUIObservation`:return l(e);case`SwitchLLMObservation`:return u(e);default:return n.getDefaultEventContent(e)}};exports.getObservationContent=g;
18
+ `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},g=e=>{switch(e.observation.kind){case`FileEditorObservation`:case`StrReplaceEditorObservation`:return i(e);case`ExecuteBashObservation`:case`TerminalObservation`:return a(e);case`BrowserObservation`:return o(e);case`MCPToolObservation`:return s(e);case`TaskTrackerObservation`:return d(e);case`ThinkObservation`:return f(e);case`FinishObservation`:return p(e);case`GlobObservation`:return m(e);case`GrepObservation`:return h(e);case`InvokeSkillObservation`:return c(e);case`CanvasUIObservation`:return l(e);case`ClientToolObservation`:return e.tool_name===`canvas_ui_control`?l(e):n.getDefaultEventContent(e);case`SwitchLLMObservation`:return u(e);default:return n.getDefaultEventContent(e)}};exports.getObservationContent=g;
19
19
  //# sourceMappingURL=get-observation-content.cjs.map