@openhands/agent-canvas 1.10.0 → 1.12.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 (531) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-B_bg5h9O.js} +1 -1
  5. package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-CzWS1DgR.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-hd2cAIZM.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +86 -0
  8. package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-D2J1dKVd.js} +1 -1
  9. package/build/assets/agent-settings-D_SVrWhI.js +1 -0
  10. package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-D70oJj2c.js} +1 -1
  12. package/build/assets/app-settings-D0OKHB3M.js +1 -0
  13. package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-C0SxWTnQ.js} +3 -3
  14. package/build/assets/{automation-export-CRq40mux.js → automation-export-BjQa_fT6.js} +1 -1
  15. package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-BzCNpljP.js} +1 -1
  16. package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-D9gs6ihu.js} +1 -1
  17. package/build/assets/{automations-list-CG4HKOTn.js → automations-list-dZg8zOCl.js} +1 -1
  18. package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/{backend-form-modal-B_lXjOGa.js → backend-form-modal-HwclKrUS.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-YI3k09Wr.js} +1 -1
  21. package/build/assets/{badge-C64c-7PO.js → badge-Dpn3-LTV.js} +1 -1
  22. package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
  24. package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
  25. package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-4CPdj3J3.js} +1 -1
  26. package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
  27. package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  28. package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CcSez21r.js} +1 -1
  29. package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
  30. package/build/assets/command-menu-BKOLj-TC.js +1 -0
  31. package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-DLQogFnB.js} +1 -1
  32. package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
  33. package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
  34. package/build/assets/{conversation-Csdxh9Xt.js → conversation-Cmyw9bFh.js} +4 -4
  35. package/build/assets/conversation-CvoGZ5vC.js +1 -0
  36. package/build/assets/conversation-panel-CvoGZ5vC.js +1 -0
  37. package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-CtgILxWF.js} +1 -1
  38. package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  39. package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  40. package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
  41. package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
  42. package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-EBn3ZtNP.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  45. package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-BZ3HYztk.js} +1 -1
  46. package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-Bnx32WAb.js} +1 -1
  47. package/build/assets/{files-tab-CLLG55-q.js → files-tab-D5zuU5TY.js} +1 -1
  48. package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
  49. package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
  50. package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-BerVamGl.js} +1 -1
  51. package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-zuKz2cwo.js} +1 -1
  52. package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B5VnMftu.js} +1 -1
  53. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +1 -0
  54. package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  55. package/build/assets/home-DqyeeFA_.js +1 -0
  56. package/build/assets/{home-BpZQkDWM.js → home-Y0aDou-a.js} +1 -1
  57. package/build/assets/{home-store-DM4qw1lF.js → home-store-Cubdq0uP.js} +1 -1
  58. package/build/assets/index-home-DqyeeFA_.js +1 -0
  59. package/build/assets/install-server-modal-DW6dSyGr.js +1 -0
  60. package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-CKydZrbH.js} +1 -1
  61. package/build/assets/{launch-C9uijypN.js → launch-c4GEP8oo.js} +1 -1
  62. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +27 -0
  63. package/build/assets/llm-settings-8eWBF3Ij.js +1 -0
  64. package/build/assets/llm-settings-D9ko42Pi.js +1 -0
  65. package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-B3K-97lP.js} +1 -1
  66. package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
  67. package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-DTCME_Pu.js} +1 -1
  68. package/build/assets/manifest-e1c3bc3b.js +1 -0
  69. package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-Ds7G5GZ8.js} +1 -1
  70. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  71. package/build/assets/markdown-renderer-DzvgdZey.js +8 -0
  72. package/build/assets/mcp-Da7wFU7A.js +9 -0
  73. package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-DSLou4n7.js} +1 -1
  74. package/build/assets/messages-B2l0qLVk.js +40 -0
  75. package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
  76. package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
  77. package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
  78. package/build/assets/npm-Cswluf6-.js +1 -0
  79. package/build/assets/{onboarding-5CZvRBbh.js → onboarding-BKbTYlW1.js} +1 -1
  80. package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-DrrGlEQq.js} +1 -1
  81. package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-DK8csGvK.js} +1 -1
  82. package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-D-mZ1I7n.js} +1 -1
  83. package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-CywqyfLK.js} +1 -1
  84. package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-vcE_jJCe.js} +1 -1
  85. package/build/assets/{providers-CeuhK46N.js → providers-CdrPPm0z.js} +1 -1
  86. package/build/assets/{proxy-CIGI9zQC.js → proxy-b4aqL4SX.js} +1 -1
  87. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +1 -0
  88. package/build/assets/{root-BQPNqNvD.js → root-CBBi6IAe.js} +2 -2
  89. package/build/assets/root-CRK9fOFd.css +1 -0
  90. package/build/assets/root-layout-BFN2rCOy.js +2 -0
  91. package/build/assets/{schema-field-z2vSLuLo.js → schema-field-Z-rMg9ti.js} +1 -1
  92. package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-m_cjygxR.js} +1 -1
  93. package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-BHF4fxML.js} +1 -1
  94. package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-aBGXtQhX.js} +1 -1
  95. package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
  96. package/build/assets/settings-CZPGNens.js +1 -0
  97. package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  98. package/build/assets/{settings-index-BECdgecg.js → settings-index-Dtlegd6s.js} +1 -1
  99. package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
  100. package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
  101. package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-CalzJP2l.js} +1 -1
  102. package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DfPYaxZJ.js} +1 -1
  103. package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
  104. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  105. package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-BIAcuORk.js} +1 -1
  106. package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
  107. package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  108. package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-C6HpQ55l.js} +1 -1
  109. package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  110. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  111. package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  112. package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  113. package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-Dt1V5X2p.js} +1 -1
  114. package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B-H0cCOP.js} +1 -1
  115. package/build/assets/skills-settings-DthdIDUb.js +2 -0
  116. package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
  117. package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-BTde81Iu.js} +1 -1
  118. package/build/assets/{terminal-DRc4rup7.js → terminal-DRrJo-cR.js} +1 -1
  119. package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
  120. package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
  121. package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DGyo0QvL.js} +1 -1
  122. package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-DrPzIKJF.js} +1 -1
  123. package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-B37XWDLq.js} +1 -1
  124. package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-BzE28H3x.js} +1 -1
  125. package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-U6HPjy50.js} +1 -1
  126. package/build/assets/{use-config-C3zGuUQI.js → use-config-DapX3pjC.js} +1 -1
  127. package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-CRf1dCm5.js} +1 -1
  128. package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-DcpT3RPw.js} +1 -1
  129. package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CHxqoHiN.js} +1 -1
  130. package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-zihHDbMW.js} +1 -1
  131. package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-6kWOW3ul.js} +1 -1
  132. package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-CqkR8kLE.js} +1 -1
  133. package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-CH9_EXQG.js} +1 -1
  134. package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-DIEurJ3D.js} +1 -1
  135. package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BmLzQjnC.js} +1 -1
  136. package/build/assets/use-settings-nav-items-DV9qgeu7.js +16 -0
  137. package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-salbPJxT.js} +1 -1
  138. package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-Dt-W6uNw.js} +1 -1
  139. package/build/assets/utils-DPQfkd-7.js +1 -0
  140. package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-oi54wEc1.js} +1 -1
  141. package/build/assets/wrench-B1_H-tL1.js +1 -0
  142. package/build/index.html +4 -4
  143. package/build/locales/ar/openhands.json +39 -2
  144. package/build/locales/ca/openhands.json +39 -2
  145. package/build/locales/de/openhands.json +39 -2
  146. package/build/locales/en/openhands.json +39 -2
  147. package/build/locales/es/openhands.json +39 -2
  148. package/build/locales/fr/openhands.json +39 -2
  149. package/build/locales/it/openhands.json +39 -2
  150. package/build/locales/ja/openhands.json +39 -2
  151. package/build/locales/ko-KR/openhands.json +39 -2
  152. package/build/locales/no/openhands.json +39 -2
  153. package/build/locales/pt/openhands.json +39 -2
  154. package/build/locales/tr/openhands.json +39 -2
  155. package/build/locales/uk/openhands.json +39 -2
  156. package/build/locales/zh-CN/openhands.json +39 -2
  157. package/build/locales/zh-TW/openhands.json +39 -2
  158. package/config/defaults.json +1 -1
  159. package/dist/api/agent-server-adapter.cjs +3 -3
  160. package/dist/api/agent-server-adapter.cjs.map +1 -1
  161. package/dist/api/agent-server-adapter.d.ts +32 -5
  162. package/dist/api/agent-server-adapter.js +120 -91
  163. package/dist/api/agent-server-adapter.js.map +1 -1
  164. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  165. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  166. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  167. package/dist/api/cloud/conversation-service.api.js +51 -47
  168. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  169. package/dist/api/conversation-file-upload.api.cjs +1 -1
  170. package/dist/api/conversation-file-upload.api.js +10 -10
  171. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  172. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  173. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  174. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  175. package/dist/api/event-service/event-service.api.cjs +1 -1
  176. package/dist/api/event-service/event-service.api.js +12 -12
  177. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  178. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  179. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  180. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  181. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  182. package/dist/api/open-hands.types.d.ts +1 -1
  183. package/dist/api/workspace-upload-path.cjs +1 -1
  184. package/dist/api/workspace-upload-path.js +8 -8
  185. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  186. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  187. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  192. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  193. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  194. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  195. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  196. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  197. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  198. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  199. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
  200. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  201. package/dist/components/features/chat/model-messages.cjs +1 -1
  202. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  203. package/dist/components/features/chat/model-messages.js +26 -25
  204. package/dist/components/features/chat/model-messages.js.map +1 -1
  205. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  206. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  207. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
  208. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +50 -53
  209. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  210. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  211. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  212. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  213. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  214. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  215. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  216. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  217. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  218. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  219. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  220. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  221. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  222. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  223. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  224. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  225. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  226. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  227. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  228. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  229. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  230. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  231. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  232. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  233. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  234. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  235. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  236. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  237. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  238. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  239. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  240. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  241. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  242. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  243. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  244. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  245. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  246. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  247. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  248. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  249. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  250. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  251. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  252. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  253. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  254. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  255. package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
  256. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  257. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  258. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  259. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  260. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  261. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  262. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  263. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  264. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  265. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  266. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  267. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  268. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  269. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  270. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  271. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  272. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  273. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
  274. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  275. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  276. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  277. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  278. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  279. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  280. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  281. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  282. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  283. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  284. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  285. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  286. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  287. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  288. package/dist/components/features/skills/extensions-navigation.js +9 -9
  289. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  290. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  291. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  292. package/dist/components/shared/modals/settings/model-selector.js +154 -98
  293. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  294. package/dist/config/defaults.cjs +1 -1
  295. package/dist/config/defaults.cjs.map +1 -1
  296. package/dist/config/defaults.js +1 -1
  297. package/dist/config/defaults.js.map +1 -1
  298. package/dist/constants/child-conversation.cjs +2 -0
  299. package/dist/constants/child-conversation.cjs.map +1 -0
  300. package/dist/constants/child-conversation.d.ts +29 -0
  301. package/dist/constants/child-conversation.js +6 -0
  302. package/dist/constants/child-conversation.js.map +1 -0
  303. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  304. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  305. package/dist/contexts/conversation-websocket-context.js +189 -188
  306. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  307. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  308. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  309. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  310. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  311. package/dist/hooks/chat/use-slash-command.js +61 -60
  312. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  313. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  314. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  315. package/dist/i18n/declaration.cjs +1 -1
  316. package/dist/i18n/declaration.cjs.map +1 -1
  317. package/dist/i18n/declaration.d.ts +38 -1
  318. package/dist/i18n/declaration.js +1 -1
  319. package/dist/i18n/declaration.js.map +1 -1
  320. package/dist/i18n/translation.cjs +2 -2
  321. package/dist/i18n/translation.cjs.map +1 -1
  322. package/dist/i18n/translation.js +644 -15
  323. package/dist/i18n/translation.js.map +1 -1
  324. package/dist/icons/docker.cjs +2 -0
  325. package/dist/icons/docker.cjs.map +1 -0
  326. package/dist/icons/docker.js +19 -0
  327. package/dist/icons/docker.js.map +1 -0
  328. package/dist/icons/npm.cjs +2 -0
  329. package/dist/icons/npm.cjs.map +1 -0
  330. package/dist/icons/npm.js +19 -0
  331. package/dist/icons/npm.js.map +1 -0
  332. package/dist/locales/ar/openhands.json +39 -2
  333. package/dist/locales/ca/openhands.json +39 -2
  334. package/dist/locales/de/openhands.json +39 -2
  335. package/dist/locales/en/openhands.json +39 -2
  336. package/dist/locales/es/openhands.json +39 -2
  337. package/dist/locales/fr/openhands.json +39 -2
  338. package/dist/locales/it/openhands.json +39 -2
  339. package/dist/locales/ja/openhands.json +39 -2
  340. package/dist/locales/ko-KR/openhands.json +39 -2
  341. package/dist/locales/no/openhands.json +39 -2
  342. package/dist/locales/pt/openhands.json +39 -2
  343. package/dist/locales/tr/openhands.json +39 -2
  344. package/dist/locales/uk/openhands.json +39 -2
  345. package/dist/locales/zh-CN/openhands.json +39 -2
  346. package/dist/locales/zh-TW/openhands.json +39 -2
  347. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  348. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  349. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  354. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  355. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  356. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  357. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  358. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  359. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  360. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  361. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  362. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  363. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  364. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  365. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  366. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  367. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  368. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  369. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  370. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  371. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  372. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  373. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  374. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  375. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  376. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  377. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  378. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  379. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  380. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  381. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  382. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  383. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  384. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  385. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  386. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  387. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  388. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  389. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  390. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  391. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  392. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  393. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  394. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  395. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  396. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  397. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  398. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  399. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  400. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  401. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  402. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  403. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  404. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  405. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  406. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  410. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  411. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  412. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  413. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  414. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  415. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  417. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  418. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  419. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  420. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  421. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  422. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  423. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  424. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  425. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  426. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  427. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  428. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  429. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  430. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  431. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  432. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  433. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  434. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  435. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  436. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  437. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  438. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  439. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  440. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  441. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  442. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  443. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  444. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  445. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  446. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  447. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  448. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  449. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  450. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  451. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  452. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  453. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  454. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  455. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  456. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  457. package/dist/package.cjs +1 -1
  458. package/dist/package.cjs.map +1 -1
  459. package/dist/package.js +6 -3
  460. package/dist/package.js.map +1 -1
  461. package/dist/routes/app-settings.cjs +1 -1
  462. package/dist/routes/app-settings.cjs.map +1 -1
  463. package/dist/routes/app-settings.js +94 -93
  464. package/dist/routes/app-settings.js.map +1 -1
  465. package/dist/routes/llm-settings.cjs +1 -1
  466. package/dist/routes/llm-settings.cjs.map +1 -1
  467. package/dist/routes/llm-settings.js +131 -119
  468. package/dist/routes/llm-settings.js.map +1 -1
  469. package/dist/services/child-conversation-launch.cjs +2 -0
  470. package/dist/services/child-conversation-launch.cjs.map +1 -0
  471. package/dist/services/child-conversation-launch.d.ts +41 -0
  472. package/dist/services/child-conversation-launch.js +182 -0
  473. package/dist/services/child-conversation-launch.js.map +1 -0
  474. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  475. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  476. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  477. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  478. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  479. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  480. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  481. package/dist/types/agent-server/type-guards.cjs +1 -1
  482. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  483. package/dist/types/agent-server/type-guards.d.ts +8 -1
  484. package/dist/types/agent-server/type-guards.js +4 -3
  485. package/dist/types/agent-server/type-guards.js.map +1 -1
  486. package/dist/types/automation.d.ts +14 -0
  487. package/dist/utils/custom-toast-handlers.cjs +1 -1
  488. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  489. package/dist/utils/custom-toast-handlers.js +18 -1
  490. package/dist/utils/custom-toast-handlers.js.map +1 -1
  491. package/dist/utils/format-model-name.cjs +1 -1
  492. package/dist/utils/format-model-name.cjs.map +1 -1
  493. package/dist/utils/format-model-name.d.ts +11 -0
  494. package/dist/utils/format-model-name.js +11 -3
  495. package/dist/utils/format-model-name.js.map +1 -1
  496. package/package.json +6 -3
  497. package/scripts/brand-dev-electron.mjs +244 -0
  498. package/scripts/check-translation-completeness.cjs +4 -0
  499. package/scripts/generate-icons.mjs +109 -0
  500. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
  501. package/build/assets/agent-settings-nmO-KSXr.js +0 -1
  502. package/build/assets/app-settings-9ok42bV6.js +0 -1
  503. package/build/assets/command-menu-CA3IjGNc.js +0 -1
  504. package/build/assets/conversation-B6t6EiVp.js +0 -1
  505. package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
  506. package/build/assets/copy-DaHuDtG4.js +0 -1
  507. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
  508. package/build/assets/home-OEx0XtfP.js +0 -1
  509. package/build/assets/index-home-OEx0XtfP.js +0 -1
  510. package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
  511. package/build/assets/list-filter-C86CBRDE.js +0 -1
  512. package/build/assets/llm-not-configured-banner-DrBrhfN0.js +0 -27
  513. package/build/assets/llm-settings-CRsLqxgu.js +0 -1
  514. package/build/assets/llm-settings-RBm_3kNm.js +0 -1
  515. package/build/assets/manifest-c352d453.js +0 -1
  516. package/build/assets/map-provider-CXU6issd.js +0 -1
  517. package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
  518. package/build/assets/mcp-DD4hPTRE.js +0 -9
  519. package/build/assets/messages-Dt77e0qi.js +0 -40
  520. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
  521. package/build/assets/root-BeuHFY2s.css +0 -1
  522. package/build/assets/root-layout-Dl_2CDoq.js +0 -3
  523. package/build/assets/settings-Co-M5bK9.js +0 -1
  524. package/build/assets/sidebar-store-B04sX8aP.js +0 -1
  525. package/build/assets/skills-settings-DnbIu2eO.js +0 -2
  526. package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
  527. package/build/assets/utils-BX9XJ0IE.js +0 -1
  528. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  529. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  530. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  531. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ import { CHILD_CONVERSATION_ISOLATIONS as e, CHILD_CONVERSATION_RESULT_PREFIX as t, CHILD_CONVERSATION_TARGETS as n, LAUNCH_CHILD_CONVERSATION_TOOL_NAME as r } from "../constants/child-conversation.js";
2
+ var i = {
3
+ name: r,
4
+ description: `Start a NEW, independent conversation to work on a well-scoped task in parallel with this one, without the user having to run any CLI command. The new conversation is recorded as a child of this one.
5
+
6
+ The child runs on its own. It does not block you, you do not see its output,
7
+ and it cannot see this conversation's history — everything it needs must be in
8
+ the task brief.
9
+
10
+ Choosing target:
11
+
12
+ * target="local" — runs on the same machine, in this conversation's workspace.
13
+ Fast, no repository clone, no sandbox provisioning. Use this by default when
14
+ the work is on code that is already checked out here.
15
+
16
+ * target="cloud" — runs on OpenHands Cloud in its own isolated sandbox, from a
17
+ git repository. Use this when the work should not touch the user's machine or
18
+ when it needs a repository that is not checked out locally. Requires the user
19
+ to have an OpenHands Cloud backend connected in Agent Canvas; if none is
20
+ connected you will be told so and should fall back to target="local".
21
+
22
+ Writing the task brief:
23
+
24
+ * Put everything the child needs in "task": the goal, the relevant file paths,
25
+ the constraints, the expected deliverable, and how it should report back.
26
+ * Keep each child's scope independent of its siblings so parallel children do
27
+ not fight over the same files.
28
+ * One call per delegated task. Do NOT call this tool twice for the same task.
29
+
30
+ Parameter rules (a call that breaks one of these launches nothing and comes
31
+ back with corrective guidance):
32
+
33
+ * "repository" and "branch" apply to target="cloud" only. A local child always
34
+ inherits this conversation's workspace, so do not pass them with
35
+ target="local".
36
+ * "isolation" applies to target="local" only. Cloud sandboxes are always
37
+ isolated, so do not pass it with target="cloud".
38
+ * isolation="worktree" (the default) gives the child its own git worktree and
39
+ branch, cut from the repository's default branch — it will NOT see this
40
+ conversation's uncommitted or committed work. isolation="shared" puts the
41
+ child in this conversation's exact directory; only choose it when the child
42
+ genuinely must see work in progress, and expect the two agents to conflict.
43
+
44
+ What comes back: this tool is acknowledged immediately, before the conversation
45
+ exists. The real outcome arrives moments later as a follow-up message starting
46
+ with "${t.trim()}" that carries the child's
47
+ conversation id, URL, target and initial status — or an error with guidance.
48
+ Wait for it, then tell the user what you launched and give them the URL. If it
49
+ reports an error, fix the parameters and call this tool again.`,
50
+ parameters: {
51
+ type: "object",
52
+ additionalProperties: !1,
53
+ properties: {
54
+ target: {
55
+ type: "string",
56
+ enum: [...n],
57
+ description: "Where the child runs. 'local' reuses this machine and this conversation's workspace; 'cloud' runs in an isolated OpenHands Cloud sandbox."
58
+ },
59
+ task: {
60
+ type: "string",
61
+ description: "Self-contained task brief, sent as the child's first message. The child cannot see this conversation, so state the goal, constraints, expected output and handoff criteria."
62
+ },
63
+ title: {
64
+ type: "string",
65
+ description: "Optional short title for the child conversation. Omit to let it title itself from the task."
66
+ },
67
+ repository: {
68
+ type: "string",
69
+ description: "target='cloud' only. Repository to clone into the sandbox, as 'owner/repo'. Defaults to this conversation's repository when it has one."
70
+ },
71
+ branch: {
72
+ type: "string",
73
+ description: "target='cloud' only, and only together with 'repository'. Defaults to the repository's default branch."
74
+ },
75
+ isolation: {
76
+ type: "string",
77
+ enum: [...e],
78
+ description: "target='local' only. 'worktree' (default) gives the child its own git worktree and branch; 'shared' runs it in this conversation's exact directory."
79
+ }
80
+ },
81
+ required: ["target", "task"]
82
+ },
83
+ annotations: {
84
+ readOnlyHint: !1,
85
+ destructiveHint: !1,
86
+ idempotentHint: !1,
87
+ openWorldHint: !0
88
+ }
89
+ };
90
+ //#endregion
91
+ export { i as LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL };
92
+
93
+ //# sourceMappingURL=launch-child-conversation-client-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-child-conversation-client-tool.js","names":[],"sources":["../../src/api/launch-child-conversation-client-tool.ts"],"sourcesContent":["import {\n CHILD_CONVERSATION_ISOLATIONS,\n CHILD_CONVERSATION_RESULT_PREFIX,\n CHILD_CONVERSATION_TARGETS,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n} from \"#/constants/child-conversation\";\nimport type { ClientToolSpec } from \"./canvas-ui-client-tool\";\n\nexport {\n LAUNCH_CHILD_CONVERSATION_ACTION_KIND,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n} from \"#/constants/child-conversation\";\n\nconst LAUNCH_CHILD_CONVERSATION_DESCRIPTION = `Start a NEW, independent conversation to work on a well-scoped task in parallel with this one, without the user having to run any CLI command. The new conversation is recorded as a child of this one.\n\nThe child runs on its own. It does not block you, you do not see its output,\nand it cannot see this conversation's history — everything it needs must be in\nthe task brief.\n\nChoosing target:\n\n* target=\"local\" — runs on the same machine, in this conversation's workspace.\n Fast, no repository clone, no sandbox provisioning. Use this by default when\n the work is on code that is already checked out here.\n\n* target=\"cloud\" — runs on OpenHands Cloud in its own isolated sandbox, from a\n git repository. Use this when the work should not touch the user's machine or\n when it needs a repository that is not checked out locally. Requires the user\n to have an OpenHands Cloud backend connected in Agent Canvas; if none is\n connected you will be told so and should fall back to target=\"local\".\n\nWriting the task brief:\n\n* Put everything the child needs in \"task\": the goal, the relevant file paths,\n the constraints, the expected deliverable, and how it should report back.\n* Keep each child's scope independent of its siblings so parallel children do\n not fight over the same files.\n* One call per delegated task. Do NOT call this tool twice for the same task.\n\nParameter rules (a call that breaks one of these launches nothing and comes\nback with corrective guidance):\n\n* \"repository\" and \"branch\" apply to target=\"cloud\" only. A local child always\n inherits this conversation's workspace, so do not pass them with\n target=\"local\".\n* \"isolation\" applies to target=\"local\" only. Cloud sandboxes are always\n isolated, so do not pass it with target=\"cloud\".\n* isolation=\"worktree\" (the default) gives the child its own git worktree and\n branch, cut from the repository's default branch — it will NOT see this\n conversation's uncommitted or committed work. isolation=\"shared\" puts the\n child in this conversation's exact directory; only choose it when the child\n genuinely must see work in progress, and expect the two agents to conflict.\n\nWhat comes back: this tool is acknowledged immediately, before the conversation\nexists. The real outcome arrives moments later as a follow-up message starting\nwith \"${CHILD_CONVERSATION_RESULT_PREFIX.trim()}\" that carries the child's\nconversation id, URL, target and initial status — or an error with guidance.\nWait for it, then tell the user what you launched and give them the URL. If it\nreports an error, fix the parameters and call this tool again.`;\n\nexport const LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL: ClientToolSpec = {\n name: LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n description: LAUNCH_CHILD_CONVERSATION_DESCRIPTION,\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n target: {\n type: \"string\",\n enum: [...CHILD_CONVERSATION_TARGETS],\n description:\n \"Where the child runs. 'local' reuses this machine and this conversation's workspace; 'cloud' runs in an isolated OpenHands Cloud sandbox.\",\n },\n task: {\n type: \"string\",\n description:\n \"Self-contained task brief, sent as the child's first message. The child cannot see this conversation, so state the goal, constraints, expected output and handoff criteria.\",\n },\n title: {\n type: \"string\",\n description:\n \"Optional short title for the child conversation. Omit to let it title itself from the task.\",\n },\n repository: {\n type: \"string\",\n description:\n \"target='cloud' only. Repository to clone into the sandbox, as 'owner/repo'. Defaults to this conversation's repository when it has one.\",\n },\n branch: {\n type: \"string\",\n description:\n \"target='cloud' only, and only together with 'repository'. Defaults to the repository's default branch.\",\n },\n isolation: {\n type: \"string\",\n enum: [...CHILD_CONVERSATION_ISOLATIONS],\n description:\n \"target='local' only. 'worktree' (default) gives the child its own git worktree and branch; 'shared' runs it in this conversation's exact directory.\",\n },\n },\n required: [\"target\", \"task\"],\n },\n annotations: {\n // Launching a conversation writes real state and is not repeatable, so the\n // agent is asked to predict a security risk before every call.\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n // The cloud target reaches OpenHands Cloud.\n openWorldHint: true,\n },\n};\n"],"mappings":";AA4DA,IAAa,IAAwD;CACnE,MAAM;CACN,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAPP,EAAiC,KAAK,EAAE;;;;CAQ9C,YAAY;EACV,MAAM;EACN,sBAAsB;EACtB,YAAY;GACV,QAAQ;IACN,MAAM;IACN,MAAM,CAAC,GAAG,CAA0B;IACpC,aACE;GACJ;GACA,MAAM;IACJ,MAAM;IACN,aACE;GACJ;GACA,OAAO;IACL,MAAM;IACN,aACE;GACJ;GACA,YAAY;IACV,MAAM;IACN,aACE;GACJ;GACA,QAAQ;IACN,MAAM;IACN,aACE;GACJ;GACA,WAAW;IACT,MAAM;IACN,MAAM,CAAC,GAAG,CAA6B;IACvC,aACE;GACJ;EACF;EACA,UAAU,CAAC,UAAU,MAAM;CAC7B;CACA,aAAa;EAGX,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAEhB,eAAe;CACjB;AACF"}
@@ -48,7 +48,7 @@ export interface RepositorySelection {
48
48
  selected_branch: string | null;
49
49
  git_provider: Provider | null;
50
50
  }
51
- export type ConversationTrigger = "resolver" | "gui" | "suggested_task" | "microagent_management";
51
+ export type ConversationTrigger = "resolver" | "gui" | "suggested_task" | "microagent_management" | "automation";
52
52
  export interface Conversation {
53
53
  conversation_id: string;
54
54
  title: string;
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("./agent-server-config.cjs");require("./agent-server-client-options.cjs");const t=require("./agent-server-home.cjs"),n=require("./conversation-metadata-store.cjs"),r=require("./conversation-service/agent-server-conversation-service.api.cjs");var i=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function a(e){let t=e.split(/[\\/]+/).filter(Boolean),n=t[t.length-1];if(!n||n===`.`||n===`..`)throw Error(`Invalid file name`);return n}async function o(e,n={}){return t.resolveAbsoluteAgentServerPath(e,n)}async function s(e,t,n={}){let r=a(e);return`${(await o(t,n)).replace(/[/\\]+$/,``)}/${r}`}async function c(t,a){if(a?.id===t&&a.workspace?.working_dir?.trim())return a.workspace.working_dir.trim();let o=n.getStoredConversationMetadata(t);return o?.selected_workspace?.trim()?o.selected_workspace.trim():i.test(t)?r.default.resolveConversationWorkingDir(t):e.getAgentServerWorkingDir()}exports.buildWorkspaceUploadPath=s,exports.getSafeUploadFileName=a,exports.resolveConversationUploadWorkingDir=c;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("./agent-server-config.cjs");require("./agent-server-client-options.cjs");const t=require("./conversation-metadata-store.cjs"),n=require("./agent-server-home.cjs"),r=require("./conversation-service/agent-server-conversation-service.api.cjs");var i=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function a(e){let t=e.split(/[\\/]+/).filter(Boolean),n=t[t.length-1];if(!n||n===`.`||n===`..`)throw Error(`Invalid file name`);return n}async function o(e,t={}){return n.resolveAbsoluteAgentServerPath(e,t)}async function s(e,t,n={}){let r=a(e);return`${(await o(t,n)).replace(/[/\\]+$/,``)}/${r}`}async function c(n,a){if(a?.id===n&&a.workspace?.working_dir?.trim())return a.workspace.working_dir.trim();let o=t.getStoredConversationMetadata(n);return o?.selected_workspace?.trim()?o.selected_workspace.trim():i.test(n)?r.default.resolveConversationWorkingDir(n):e.getAgentServerWorkingDir()}exports.buildWorkspaceUploadPath=s,exports.getSafeUploadFileName=a,exports.resolveConversationUploadWorkingDir=c;
2
2
  //# sourceMappingURL=workspace-upload-path.cjs.map
@@ -1,7 +1,7 @@
1
1
  import { getAgentServerWorkingDir as e } from "./agent-server-config.js";
2
2
  import "./agent-server-client-options.js";
3
- import { resolveAbsoluteAgentServerPath as t } from "./agent-server-home.js";
4
- import { getStoredConversationMetadata as n } from "./conversation-metadata-store.js";
3
+ import { getStoredConversationMetadata as t } from "./conversation-metadata-store.js";
4
+ import { resolveAbsoluteAgentServerPath as n } from "./agent-server-home.js";
5
5
  import r from "./conversation-service/agent-server-conversation-service.api.js";
6
6
  //#region src/api/workspace-upload-path.ts
7
7
  var i = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
@@ -10,17 +10,17 @@ function a(e) {
10
10
  if (!n || n === "." || n === "..") throw Error("Invalid file name");
11
11
  return n;
12
12
  }
13
- async function o(e, n = {}) {
14
- return t(e, n);
13
+ async function o(e, t = {}) {
14
+ return n(e, t);
15
15
  }
16
16
  async function s(e, t, n = {}) {
17
17
  let r = a(e);
18
18
  return `${(await o(t, n)).replace(/[/\\]+$/, "")}/${r}`;
19
19
  }
20
- async function c(t, a) {
21
- if (a?.id === t && a.workspace?.working_dir?.trim()) return a.workspace.working_dir.trim();
22
- let o = n(t);
23
- return o?.selected_workspace?.trim() ? o.selected_workspace.trim() : i.test(t) ? r.resolveConversationWorkingDir(t) : e();
20
+ async function c(n, a) {
21
+ if (a?.id === n && a.workspace?.working_dir?.trim()) return a.workspace.working_dir.trim();
22
+ let o = t(n);
23
+ return o?.selected_workspace?.trim() ? o.selected_workspace.trim() : i.test(n) ? r.resolveConversationWorkingDir(n) : e();
24
24
  }
25
25
  //#endregion
26
26
  export { s as buildWorkspaceUploadPath, a as getSafeUploadFileName, c as resolveConversationUploadWorkingDir };
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../constants/canvas-ui.cjs");var t=(e,t)=>e?e.length>t?`${e.substring(0,t)}...`:e:``,n=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),r=e=>{let t=e.summary?.trim().replace(/\s+/g,` `)||``;return!t||n(t)?null:t},i=n=>{let i=r(n);if(i)return{kind:`text`,text:i};let a=n.action.kind;switch(a){case`ExecuteBashAction`:case`TerminalAction`:return{kind:`translation`,key:`ACTION_MESSAGE$RUN`,values:{command:t(n.action.command,80)}};case`FileEditorAction`:case`StrReplaceEditorAction`:return{kind:`translation`,key:n.action.command===`view`?`ACTION_MESSAGE$READ`:n.action.command===`create`?`ACTION_MESSAGE$WRITE`:`ACTION_MESSAGE$EDIT`,values:{path:n.action.path}};case`MCPToolAction`:return{kind:`translation`,key:`ACTION_MESSAGE$CALL_TOOL_MCP`,values:{mcp_tool_name:n.tool_name}};case`InvokeSkillAction`:return{kind:`translation`,key:`ACTION_MESSAGE$INVOKE_SKILL`,values:{name:n.action.name}};case`TaskAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK`,values:{name:n.action.subagent_type}};case`ThinkAction`:return{kind:`translation`,key:`ACTION_MESSAGE$THINK`,values:{}};case`FinishAction`:return{kind:`translation`,key:`ACTION_MESSAGE$FINISH`,values:{}};case`TaskTrackerAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK_TRACKING`,values:{}};case`GrepAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GREP`,values:{pattern:n.action.pattern?t(n.action.pattern,50):``}};case`GlobAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GLOB`,values:{pattern:n.action.pattern?t(n.action.pattern,50):``}};case`BrowserNavigateAction`:case`BrowserClickAction`:case`BrowserTypeAction`:case`BrowserGetStateAction`:case`BrowserGetContentAction`:case`BrowserScrollAction`:case`BrowserGoBackAction`:case`BrowserListTabsAction`:case`BrowserSwitchTabAction`:case`BrowserCloseTabAction`:return{kind:`translation`,key:`ACTION_MESSAGE$BROWSE`,values:{}};case`CanvasUIAction`:case e.CANVAS_UI_CLIENT_ACTION_KIND:return{kind:`text`,text:`CANVASUI`};default:return{kind:`text`,text:String(a).replace(`Action`,``).toUpperCase()}}};exports.getActionEventTitleDescriptor=i,exports.getActionSummaryTitle=r,exports.trimEventTitleText=t;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../constants/canvas-ui.cjs"),t=require("../../../../constants/child-conversation.cjs");var n=(e,t)=>e?e.length>t?`${e.substring(0,t)}...`:e:``,r=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),i=e=>{let t=e.summary?.trim().replace(/\s+/g,` `)||``;return!t||r(t)?null:t},a=r=>{let a=i(r);if(a)return{kind:`text`,text:a};let o=r.action.kind;switch(o){case`ExecuteBashAction`:case`TerminalAction`:return{kind:`translation`,key:`ACTION_MESSAGE$RUN`,values:{command:n(r.action.command,80)}};case`FileEditorAction`:case`StrReplaceEditorAction`:return{kind:`translation`,key:r.action.command===`view`?`ACTION_MESSAGE$READ`:r.action.command===`create`?`ACTION_MESSAGE$WRITE`:`ACTION_MESSAGE$EDIT`,values:{path:r.action.path}};case`MCPToolAction`:return{kind:`translation`,key:`ACTION_MESSAGE$CALL_TOOL_MCP`,values:{mcp_tool_name:r.tool_name}};case`InvokeSkillAction`:return{kind:`translation`,key:`ACTION_MESSAGE$INVOKE_SKILL`,values:{name:r.action.name}};case`TaskAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK`,values:{name:r.action.subagent_type}};case`ThinkAction`:return{kind:`translation`,key:`ACTION_MESSAGE$THINK`,values:{}};case`FinishAction`:return{kind:`translation`,key:`ACTION_MESSAGE$FINISH`,values:{}};case`TaskTrackerAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK_TRACKING`,values:{}};case`GrepAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GREP`,values:{pattern:r.action.pattern?n(r.action.pattern,50):``}};case`GlobAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GLOB`,values:{pattern:r.action.pattern?n(r.action.pattern,50):``}};case`BrowserNavigateAction`:case`BrowserClickAction`:case`BrowserTypeAction`:case`BrowserGetStateAction`:case`BrowserGetContentAction`:case`BrowserScrollAction`:case`BrowserGoBackAction`:case`BrowserListTabsAction`:case`BrowserSwitchTabAction`:case`BrowserCloseTabAction`:return{kind:`translation`,key:`ACTION_MESSAGE$BROWSE`,values:{}};case`CanvasUIAction`:case e.CANVAS_UI_CLIENT_ACTION_KIND:return{kind:`text`,text:`CANVASUI`};case t.LAUNCH_CHILD_CONVERSATION_ACTION_KIND:return{kind:`translation`,key:`ACTION_MESSAGE$LAUNCH_CHILD_CONVERSATION`,values:{}};default:return{kind:`text`,text:String(o).replace(`Action`,``).toUpperCase()}}};exports.getActionEventTitleDescriptor=a,exports.getActionSummaryTitle=i,exports.trimEventTitleText=n;
2
2
  //# sourceMappingURL=get-action-event-title.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-action-event-title.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":"6GAcA,IAAa,GAAsB,EAAc,IAC1C,EACE,EAAK,OAAS,EAAY,GAAG,EAAK,UAAU,EAAG,CAAS,EAAE,KAAO,EADtD,GAId,EAA2B,GAC/B,+BAA+B,KAAK,CAAO,EAEhC,EAAyB,GAAsC,CAC1E,IAAM,EAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,OAAQ,GAAG,GAAK,GAC9D,MAAO,CAAC,GAAW,EAAwB,CAAO,EAAI,KAAO,CAC/D,EAEa,EACX,GACyB,CACzB,IAAM,EAAU,EAAsB,CAAK,EAC3C,GAAI,EACF,MAAO,CAAE,KAAM,OAAQ,KAAM,CAAQ,EAGvC,IAAM,EAAa,EAAM,OAAO,KAEhC,OAAQ,EAAR,CACE,IAAK,oBACL,IAAK,iBACH,MAAO,CACL,KAAM,cACN,IAAK,qBACL,OAAQ,CAAE,QAAS,EAAmB,EAAM,OAAO,QAAS,EAAE,CAAE,CAClE,EACF,IAAK,mBACL,IAAK,yBAOH,MAAO,CACL,KAAM,cACN,IAPA,EAAM,OAAO,UAAY,OACrB,sBACA,EAAM,OAAO,UAAY,SACvB,uBACA,sBAIN,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EAEF,IAAK,gBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAE,cAAe,EAAM,SAAU,CAC3C,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,8BACL,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CAAE,KAAM,EAAM,OAAO,aAAc,CAC7C,EACF,IAAK,cACH,MAAO,CACL,KAAM,cACN,IAAK,uBACL,OAAQ,CAAC,CACX,EACF,IAAK,eACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAC,CACX,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,wBACL,IAAK,qBACL,IAAK,oBACL,IAAK,wBACL,IAAK,0BACL,IAAK,sBACL,IAAK,sBACL,IAAK,wBACL,IAAK,yBACL,IAAK,wBACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,iBACL,KAAK,EAAA,6BACH,MAAO,CAAE,KAAM,OAAQ,KAAM,UAAW,EAC1C,QACE,MAAO,CACL,KAAM,OACN,KAAM,OAAO,CAAU,EAAE,QAAQ,SAAU,EAAE,EAAE,YAAY,CAC7D,CACJ,CACF"}
1
+ {"version":3,"file":"get-action-event-title.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_ACTION_KIND } from \"#/constants/child-conversation\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n case LAUNCH_CHILD_CONVERSATION_ACTION_KIND:\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$LAUNCH_CHILD_CONVERSATION\",\n values: {},\n };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":"uKAeA,IAAa,GAAsB,EAAc,IAC1C,EACE,EAAK,OAAS,EAAY,GAAG,EAAK,UAAU,EAAG,CAAS,EAAE,KAAO,EADtD,GAId,EAA2B,GAC/B,+BAA+B,KAAK,CAAO,EAEhC,EAAyB,GAAsC,CAC1E,IAAM,EAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,OAAQ,GAAG,GAAK,GAC9D,MAAO,CAAC,GAAW,EAAwB,CAAO,EAAI,KAAO,CAC/D,EAEa,EACX,GACyB,CACzB,IAAM,EAAU,EAAsB,CAAK,EAC3C,GAAI,EACF,MAAO,CAAE,KAAM,OAAQ,KAAM,CAAQ,EAGvC,IAAM,EAAa,EAAM,OAAO,KAEhC,OAAQ,EAAR,CACE,IAAK,oBACL,IAAK,iBACH,MAAO,CACL,KAAM,cACN,IAAK,qBACL,OAAQ,CAAE,QAAS,EAAmB,EAAM,OAAO,QAAS,EAAE,CAAE,CAClE,EACF,IAAK,mBACL,IAAK,yBAOH,MAAO,CACL,KAAM,cACN,IAPA,EAAM,OAAO,UAAY,OACrB,sBACA,EAAM,OAAO,UAAY,SACvB,uBACA,sBAIN,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EAEF,IAAK,gBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAE,cAAe,EAAM,SAAU,CAC3C,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,8BACL,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CAAE,KAAM,EAAM,OAAO,aAAc,CAC7C,EACF,IAAK,cACH,MAAO,CACL,KAAM,cACN,IAAK,uBACL,OAAQ,CAAC,CACX,EACF,IAAK,eACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAC,CACX,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,wBACL,IAAK,qBACL,IAAK,oBACL,IAAK,wBACL,IAAK,0BACL,IAAK,sBACL,IAAK,sBACL,IAAK,wBACL,IAAK,yBACL,IAAK,wBACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,iBACL,KAAK,EAAA,6BACH,MAAO,CAAE,KAAM,OAAQ,KAAM,UAAW,EAC1C,KAAK,EAAA,sCACH,MAAO,CACL,KAAM,cACN,IAAK,2CACL,OAAQ,CAAC,CACX,EACF,QACE,MAAO,CACL,KAAM,OACN,KAAM,OAAO,CAAU,EAAE,QAAQ,SAAU,EAAE,EAAE,YAAY,CAC7D,CACJ,CACF"}
@@ -1,42 +1,43 @@
1
1
  import { CANVAS_UI_CLIENT_ACTION_KIND as e } from "../../../../constants/canvas-ui.js";
2
+ import { LAUNCH_CHILD_CONVERSATION_ACTION_KIND as t } from "../../../../constants/child-conversation.js";
2
3
  //#region src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts
3
- var t = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", n = (e) => /^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e), r = (e) => {
4
+ var n = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", r = (e) => /^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e), i = (e) => {
4
5
  let t = e.summary?.trim().replace(/\s+/g, " ") || "";
5
- return !t || n(t) ? null : t;
6
- }, i = (n) => {
7
- let i = r(n);
8
- if (i) return {
6
+ return !t || r(t) ? null : t;
7
+ }, a = (r) => {
8
+ let a = i(r);
9
+ if (a) return {
9
10
  kind: "text",
10
- text: i
11
+ text: a
11
12
  };
12
- let a = n.action.kind;
13
- switch (a) {
13
+ let o = r.action.kind;
14
+ switch (o) {
14
15
  case "ExecuteBashAction":
15
16
  case "TerminalAction": return {
16
17
  kind: "translation",
17
18
  key: "ACTION_MESSAGE$RUN",
18
- values: { command: t(n.action.command, 80) }
19
+ values: { command: n(r.action.command, 80) }
19
20
  };
20
21
  case "FileEditorAction":
21
22
  case "StrReplaceEditorAction": return {
22
23
  kind: "translation",
23
- key: n.action.command === "view" ? "ACTION_MESSAGE$READ" : n.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT",
24
- values: { path: n.action.path }
24
+ key: r.action.command === "view" ? "ACTION_MESSAGE$READ" : r.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT",
25
+ values: { path: r.action.path }
25
26
  };
26
27
  case "MCPToolAction": return {
27
28
  kind: "translation",
28
29
  key: "ACTION_MESSAGE$CALL_TOOL_MCP",
29
- values: { mcp_tool_name: n.tool_name }
30
+ values: { mcp_tool_name: r.tool_name }
30
31
  };
31
32
  case "InvokeSkillAction": return {
32
33
  kind: "translation",
33
34
  key: "ACTION_MESSAGE$INVOKE_SKILL",
34
- values: { name: n.action.name }
35
+ values: { name: r.action.name }
35
36
  };
36
37
  case "TaskAction": return {
37
38
  kind: "translation",
38
39
  key: "ACTION_MESSAGE$TASK",
39
- values: { name: n.action.subagent_type }
40
+ values: { name: r.action.subagent_type }
40
41
  };
41
42
  case "ThinkAction": return {
42
43
  kind: "translation",
@@ -56,12 +57,12 @@ var t = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", n = (e)
56
57
  case "GrepAction": return {
57
58
  kind: "translation",
58
59
  key: "ACTION_MESSAGE$GREP",
59
- values: { pattern: n.action.pattern ? t(n.action.pattern, 50) : "" }
60
+ values: { pattern: r.action.pattern ? n(r.action.pattern, 50) : "" }
60
61
  };
61
62
  case "GlobAction": return {
62
63
  kind: "translation",
63
64
  key: "ACTION_MESSAGE$GLOB",
64
- values: { pattern: n.action.pattern ? t(n.action.pattern, 50) : "" }
65
+ values: { pattern: r.action.pattern ? n(r.action.pattern, 50) : "" }
65
66
  };
66
67
  case "BrowserNavigateAction":
67
68
  case "BrowserClickAction":
@@ -82,13 +83,18 @@ var t = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", n = (e)
82
83
  kind: "text",
83
84
  text: "CANVASUI"
84
85
  };
86
+ case t: return {
87
+ kind: "translation",
88
+ key: "ACTION_MESSAGE$LAUNCH_CHILD_CONVERSATION",
89
+ values: {}
90
+ };
85
91
  default: return {
86
92
  kind: "text",
87
- text: String(a).replace("Action", "").toUpperCase()
93
+ text: String(o).replace("Action", "").toUpperCase()
88
94
  };
89
95
  }
90
96
  };
91
97
  //#endregion
92
- export { i as getActionEventTitleDescriptor, r as getActionSummaryTitle, t as trimEventTitleText };
98
+ export { a as getActionEventTitleDescriptor, i as getActionSummaryTitle, n as trimEventTitleText };
93
99
 
94
100
  //# sourceMappingURL=get-action-event-title.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-action-event-title.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":";;AAcA,IAAa,KAAsB,GAAc,MAC1C,IACE,EAAK,SAAS,IAAY,GAAG,EAAK,UAAU,GAAG,CAAS,EAAE,OAAO,IADtD,IAId,KAA2B,MAC/B,+BAA+B,KAAK,CAAO,GAEhC,KAAyB,MAAsC;CAC1E,IAAM,IAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,QAAQ,GAAG,KAAK;CAC9D,OAAO,CAAC,KAAW,EAAwB,CAAO,IAAI,OAAO;AAC/D,GAEa,KACX,MACyB;CACzB,IAAM,IAAU,EAAsB,CAAK;CAC3C,IAAI,GACF,OAAO;EAAE,MAAM;EAAQ,MAAM;CAAQ;CAGvC,IAAM,IAAa,EAAM,OAAO;CAEhC,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,kBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,SAAS,EAAmB,EAAM,OAAO,SAAS,EAAE,EAAE;EAClE;EACF,KAAK;EACL,KAAK,0BAOH,OAAO;GACL,MAAM;GACN,KAPA,EAAM,OAAO,YAAY,SACrB,wBACA,EAAM,OAAO,YAAY,WACvB,yBACA;GAIN,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EAEF,KAAK,iBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,eAAe,EAAM,UAAU;EAC3C;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,cAAc;EAC7C;EACF,KAAK,eACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,yBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK;EACL,KAAK,GACH,OAAO;GAAE,MAAM;GAAQ,MAAM;EAAW;EAC1C,SACE,OAAO;GACL,MAAM;GACN,MAAM,OAAO,CAAU,EAAE,QAAQ,UAAU,EAAE,EAAE,YAAY;EAC7D;CACJ;AACF"}
1
+ {"version":3,"file":"get-action-event-title.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_ACTION_KIND } from \"#/constants/child-conversation\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n case LAUNCH_CHILD_CONVERSATION_ACTION_KIND:\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$LAUNCH_CHILD_CONVERSATION\",\n values: {},\n };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":";;;AAeA,IAAa,KAAsB,GAAc,MAC1C,IACE,EAAK,SAAS,IAAY,GAAG,EAAK,UAAU,GAAG,CAAS,EAAE,OAAO,IADtD,IAId,KAA2B,MAC/B,+BAA+B,KAAK,CAAO,GAEhC,KAAyB,MAAsC;CAC1E,IAAM,IAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,QAAQ,GAAG,KAAK;CAC9D,OAAO,CAAC,KAAW,EAAwB,CAAO,IAAI,OAAO;AAC/D,GAEa,KACX,MACyB;CACzB,IAAM,IAAU,EAAsB,CAAK;CAC3C,IAAI,GACF,OAAO;EAAE,MAAM;EAAQ,MAAM;CAAQ;CAGvC,IAAM,IAAa,EAAM,OAAO;CAEhC,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,kBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,SAAS,EAAmB,EAAM,OAAO,SAAS,EAAE,EAAE;EAClE;EACF,KAAK;EACL,KAAK,0BAOH,OAAO;GACL,MAAM;GACN,KAPA,EAAM,OAAO,YAAY,SACrB,wBACA,EAAM,OAAO,YAAY,WACvB,yBACA;GAIN,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EAEF,KAAK,iBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,eAAe,EAAM,UAAU;EAC3C;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,cAAc;EAC7C;EACF,KAAK,eACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,yBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK;EACL,KAAK,GACH,OAAO;GAAE,MAAM;GAAQ,MAAM;EAAW;EAC1C,KAAK,GACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,SACE,OAAO;GACL,MAAM;GACN,MAAM,OAAO,CAAU,EAAE,QAAQ,UAAU,EAAE,EAAE,YAAY;EAC7D;CACJ;AACF"}
@@ -1,2 +1,2 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs");require("../../../../constants/canvas-ui.cjs");const i=require("../../../../types/agent-server/type-guards.cjs"),a=require("./get-acp-tool-call-content.cjs"),o=require("./get-action-event-title.cjs"),s=require("../../../features/chat/mono-component.cjs"),c=require("../../../features/chat/path-component.cjs"),l=require("./get-action-content.cjs"),u=require("./get-observation-content.cjs"),d=require("../task-tracking/task-tracking-observation-content.cjs"),f=require("./create-skill-ready-event.cjs"),p=require("../../../features/chat/tool-visualizers/dispatcher.cjs");let m=require("react");m=e.__toESM(m,1);let h=require("react/jsx-runtime");var g=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(c.PathComponent,{}),cmd:(0,h.jsx)(s.MonoComponent,{})}}):e,_=e=>e.kind===`text`?e.text:g(e.key,e.values),v=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?o.trimEventTitleText(n,t):n:null},y=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=v(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},b=(e,t)=>{let n=t?.tool_name,r=e.observation,i=v(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=v((t?.action??{}).profile_name)??v(r.profile_name)??v(r.base_url,80)??v(r.endpoint,80)??v(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},x=e=>i.isActionEvent(e)?y(e)||_(o.getActionEventTitleDescriptor(e)):``,S=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=b(e,t);if(n)return n;if(t){let e=y(t);if(e)return e;let n=o.getActionSummaryTitle(t);if(n)return n}let r=e.observation.kind,a=``,s={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,s={command:e.observation.command?o.trimEventTitleText(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,s={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,s={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,s={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,s={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){a=`OBSERVATION_MESSAGE$CANVAS_UI`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,s={name:e.observation.profile_name};break;case`BrowserObservation`:a=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;a=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:a=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:a=`OBSERVATION_MESSAGE$GLOB`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,s):r},C=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!i.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,w=(e,t)=>{let o=``,s=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;o=r.default.exists(t)?g(t,{}):`Skill Ready`,s=e._skillReadyContent}else i.isActionEvent(e)?(o=x(e),s=p.resolveVisualizerBody(e)??l.getActionContent(e)):i.isObservationEvent(e)?(o=S(e,t),s=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):C(e,t)??p.resolveVisualizerBody(e,t)??u.getObservationContent(e)):i.isACPToolCallEvent(e)?(o=g(a.getACPToolCallTitleKey(e),{title:a.stripRedundantTitlePrefix(e)}),s=a.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(o=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:o||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:s}};exports.getEventContent=w;
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs");require("../../../../constants/canvas-ui.cjs"),require("../../../../constants/child-conversation.cjs");const i=require("../../../../types/agent-server/type-guards.cjs"),a=require("./get-acp-tool-call-content.cjs"),o=require("./get-action-event-title.cjs"),s=require("../../../features/chat/mono-component.cjs"),c=require("../../../features/chat/path-component.cjs"),l=require("./get-action-content.cjs"),u=require("./get-observation-content.cjs"),d=require("../task-tracking/task-tracking-observation-content.cjs"),f=require("./create-skill-ready-event.cjs"),p=require("../../../features/chat/tool-visualizers/dispatcher.cjs");let m=require("react");m=e.__toESM(m,1);let h=require("react/jsx-runtime");var g=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(c.PathComponent,{}),cmd:(0,h.jsx)(s.MonoComponent,{})}}):e,_=e=>e.kind===`text`?e.text:g(e.key,e.values),v=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?o.trimEventTitleText(n,t):n:null},y=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=v(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},b=(e,t)=>{let n=t?.tool_name,r=e.observation,i=v(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=v((t?.action??{}).profile_name)??v(r.profile_name)??v(r.base_url,80)??v(r.endpoint,80)??v(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},x=e=>i.isActionEvent(e)?y(e)||_(o.getActionEventTitleDescriptor(e)):``,S=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=b(e,t);if(n)return n;if(t){let e=y(t);if(e)return e;let n=o.getActionSummaryTitle(t);if(n)return n}let r=e.observation.kind,a=``,s={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,s={command:e.observation.command?o.trimEventTitleText(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,s={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,s={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,s={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,s={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){a=`OBSERVATION_MESSAGE$CANVAS_UI`;break}if(e.tool_name===`launch_child_conversation`){a=`OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,s={name:e.observation.profile_name};break;case`BrowserObservation`:a=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;a=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:a=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:a=`OBSERVATION_MESSAGE$GLOB`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,s):r},C=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!i.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,w=(e,t)=>{let o=``,s=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;o=r.default.exists(t)?g(t,{}):`Skill Ready`,s=e._skillReadyContent}else i.isActionEvent(e)?(o=x(e),s=p.resolveVisualizerBody(e)??l.getActionContent(e)):i.isObservationEvent(e)?(o=S(e,t),s=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):C(e,t)??p.resolveVisualizerBody(e,t)??u.getObservationContent(e)):i.isACPToolCallEvent(e)?(o=g(a.getACPToolCallTitleKey(e),{title:a.stripRedundantTitlePrefix(e)}),s=a.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(o=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:o||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:s}};exports.getEventContent=w;
2
2
  //# sourceMappingURL=get-event-content.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Trans as e } from "../../../../node_modules/react-i18next/dist/es/Trans
2
2
  import { I18nKey as t } from "../../../../i18n/declaration.js";
3
3
  import n from "../../../../i18n/index.js";
4
4
  import "../../../../constants/canvas-ui.js";
5
+ import "../../../../constants/child-conversation.js";
5
6
  import { isACPToolCallEvent as r, isActionEvent as i, isCanvasUIActionEvent as a, isObservationEvent as o } from "../../../../types/agent-server/type-guards.js";
6
7
  import { getACPToolCallContent as s, getACPToolCallTitleKey as c, stripRedundantTitlePrefix as l } from "./get-acp-tool-call-content.js";
7
8
  import { getActionEventTitleDescriptor as u, getActionSummaryTitle as d, trimEventTitleText as f } from "./get-action-event-title.js";
@@ -73,6 +74,10 @@ var x = (t, r) => n.exists(t) ? /* @__PURE__ */ b(e, {
73
74
  i = "OBSERVATION_MESSAGE$CANVAS_UI";
74
75
  break;
75
76
  }
77
+ if (e.tool_name === "launch_child_conversation") {
78
+ i = "OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION";
79
+ break;
80
+ }
76
81
  return r.replace("Observation", "").toUpperCase();
77
82
  case "SwitchLLMObservation":
78
83
  i = e.observation.is_error ? "MODEL$SWITCH_FAILED" : "MODEL$SWITCHED_TO_PROFILE", a = { name: e.observation.profile_name };
@@ -1 +1 @@
1
- {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n if (event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../types/agent-server/type-guards.cjs");var t=[`The goal is NOT yet complete (audit iteration`,`Resuming a goal that was paused or interrupted.`],n=e=>{if(e.llm_message?.role!==`user`)return!1;let n=e.llm_message.content,r=Array.isArray(n)?n.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
- `):``;return t.some(e=>r.startsWith(e))},r=t=>{if(e.isConversationStateUpdateEvent(t))return e.isGoalConversationStateUpdateEvent(t)&&!t.value.active;if(e.isActionEvent(t)){let e=t.action.kind;return!(!e||e===`ExecuteBashAction`&&t.source===`user`||e===`PlanningFileEditorAction`||e===`SwitchLLMAction`)}return e.isObservationEvent(t)?!(t.observation.kind===`SwitchLLMObservation`&&!t.observation.is_error):e.isMessageEvent(t)?!n(t):e.isAgentErrorEvent(t)||e.isHookExecutionEvent(t)||e.isACPToolCallEvent(t)?!0:e.isStreamingDeltaEvent(t)?t.content!==null||t.reasoning_content!==null:!1},i=e=>e.some(e=>e.source===`user`);exports.hasUserEvent=i,exports.shouldRenderEvent=r;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs"),require("../../../../constants/child-conversation.cjs");const e=require("../../../../types/agent-server/type-guards.cjs");var t=[`The goal is NOT yet complete (audit iteration`,`Resuming a goal that was paused or interrupted.`],n=e=>{if(e.llm_message?.role!==`user`)return null;let t=e.llm_message.content;return Array.isArray(t)?t.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
+ `):``},r=e=>{let r=n(e);return r===null?!1:t.some(e=>r.startsWith(e))},i=e=>n(e)?.startsWith(`[child-conversation] `)??!1,a=t=>{if(e.isConversationStateUpdateEvent(t))return e.isGoalConversationStateUpdateEvent(t)&&!t.value.active;if(e.isActionEvent(t)){let e=t.action.kind;return!(!e||e===`ExecuteBashAction`&&t.source===`user`||e===`PlanningFileEditorAction`||e===`SwitchLLMAction`)}return e.isObservationEvent(t)?!(t.observation.kind===`SwitchLLMObservation`&&!t.observation.is_error):e.isMessageEvent(t)?!r(t)&&!i(t):e.isAgentErrorEvent(t)||e.isHookExecutionEvent(t)||e.isACPToolCallEvent(t)?!0:e.isStreamingDeltaEvent(t)?t.content!==null||t.reasoning_content!==null:!1},o=e=>e.some(e=>e.source===`user`);exports.hasUserEvent=o,exports.shouldRenderEvent=a;
3
3
  //# sourceMappingURL=should-render-event.cjs.map