@openhands/agent-canvas 1.4.0 → 1.5.1

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 (710) hide show
  1. package/README.md +11 -12
  2. package/README.windows.md +4 -2
  3. package/build/assets/{Trans-Ch-OVWEA.js → Trans-DqF_OEZB.js} +1 -1
  4. package/build/assets/{acp-providers-Sy2LKyMa.js → acp-providers-DerAmTyY.js} +1 -1
  5. package/build/assets/active-backend-context-B8rMv0X9.js +1 -0
  6. package/build/assets/{add-backend-modal-Bgy8anoR.js → add-backend-modal-CxC7BNEc.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-3mmXljZX.js → agent-profiles-settings-BJb8YXR1.js} +1 -1
  8. package/build/assets/agent-server-compatibility-BWN-EIQn.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DSPIkMwJ.js +41 -0
  10. package/build/assets/{agent-settings-B-W10B4E.js → agent-settings-CgCnqaAA.js} +2 -2
  11. package/build/assets/agent-settings-DDkSavD7.js +1 -0
  12. package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dh51WURQ.js} +1 -1
  13. package/build/assets/api-key-entry-screen-iZc7n8AI.js +1 -0
  14. package/build/assets/app-settings-B5zyipxJ.js +1 -0
  15. package/build/assets/automation-detail-CZsu2CoM.js +2 -0
  16. package/build/assets/automation-export-BwRX6H32.js +2 -0
  17. package/build/assets/automations-list-lHAVzMoA.js +1 -0
  18. package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-DVknCcSP.js} +1 -1
  19. package/build/assets/backend-form-modal-RGcu909r.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-D9hZx05w.js → backend-synced-settings-badge-BSfN0AZA.js} +1 -1
  21. package/build/assets/{base-modal-BuF2f0YL.js → base-modal-CIF_785P.js} +1 -1
  22. package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
  23. package/build/assets/{brand-button-vMVuyDXu.js → brand-button-B1izLAdR.js} +1 -1
  24. package/build/assets/{browser-BifzWIBd.js → browser-DKaeq_sT.js} +3 -3
  25. package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-qb_ftCxW.js} +1 -1
  26. package/build/assets/canvas-ui-COgjltGz.js +1 -0
  27. package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
  28. package/build/assets/check-TbOEtHKj.js +1 -0
  29. package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-DoFIjVE0.js} +1 -1
  31. package/build/assets/client-source-BZK8vRs2.js +1 -0
  32. package/build/assets/cloud-funnel-analytics-Zcv57hfT.js +1 -0
  33. package/build/assets/{color-themes-DPBzNtVg.js → color-themes-CHizm1xF.js} +1 -1
  34. package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-CxZpqoSR.js} +1 -1
  35. package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-oTvKDU3Y.js} +1 -1
  36. package/build/assets/condenser-settings-BGlWn93P.js +1 -0
  37. package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-DGBWM2Ls.js} +1 -1
  38. package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-6psNyl7X.js} +1 -1
  39. package/build/assets/conversation-BoCYx8n2.js +89 -0
  40. package/build/assets/conversation-DgHqMjnY.js +1 -0
  41. package/build/assets/conversation-panel-78Rxh_-I.js +1 -0
  42. package/build/assets/conversation-service.api-_f9GlIEi.js +1 -0
  43. package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-CNUmIms2.js} +1 -1
  44. package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-CFzH_NOX.js} +1 -1
  46. package/build/assets/declaration-BGsHjPEW.js +1 -0
  47. package/build/assets/{device-verify-Dj6I4Iqe.js → device-verify-WBSjJBLH.js} +1 -1
  48. package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-D3wMJlXT.js} +1 -1
  49. package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-CbNnHlIq.js} +1 -1
  50. package/build/assets/{entry.client-2_3ePAm0.js → entry.client-DNlPGxsu.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-JLYv1t8L.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-B1PFO8P8.js} +1 -1
  53. package/build/assets/{extensions-hub-CLjmOGqS.js → extensions-hub-CCbLA7IM.js} +1 -1
  54. package/build/assets/{extensions-navigation-B5MeUiMq.js → extensions-navigation-CPNjMNvR.js} +1 -1
  55. package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
  56. package/build/assets/files-tab-y4K7EXBO.js +1 -0
  57. package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CbdN5aO3.js} +1 -1
  58. package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
  59. package/build/assets/git-provider-icon-ITvsH4Ko.js +1 -0
  60. package/build/assets/home-BwbeOWwU.js +1 -0
  61. package/build/assets/home-DKPGQ5P3.js +1 -0
  62. package/build/assets/index-home-Bko2Itv5.js +1 -0
  63. package/build/assets/install-server-modal-Qk1gwyI8.js +1 -0
  64. package/build/assets/{launch-V_3Rp7WS.js → launch-CAGavYl-.js} +1 -1
  65. package/build/assets/lesson-plan-DMCPdtrf.js +4 -0
  66. package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
  67. package/build/assets/llm-not-configured-banner-C1ktyb3C.js +27 -0
  68. package/build/assets/llm-settings-BBsZFi9l.js +1 -0
  69. package/build/assets/llm-settings-DFkJQr_w.js +1 -0
  70. package/build/assets/llm-subscription-service-Casyzgn1.js +1 -0
  71. package/build/assets/loader-circle-CsAsfLIs.js +1 -0
  72. package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-BcdnT0mN.js} +1 -1
  73. package/build/assets/manage-backends-modal-CKQ46rvw.js +1 -0
  74. package/build/assets/manifest-03478bbf.js +1 -0
  75. package/build/assets/{map-provider-BM2SJarp.js → map-provider-BbIb12oh.js} +1 -1
  76. package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B4V2OMFP.js} +1 -1
  77. package/build/assets/{mcp-BQufNPZ6.js → mcp-BapoJsDc.js} +2 -2
  78. package/build/assets/{messages-BnJCqnFf.js → messages-CUBFMY5o.js} +26 -26
  79. package/build/assets/{modal-body-DouOE5KH.js → modal-body-Cc2zp0xb.js} +1 -1
  80. package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-3qT9Ap7Q.js} +1 -1
  81. package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-BcIBUdSq.js} +1 -1
  82. package/build/assets/model-selector-DJrMrFAr.js +1 -0
  83. package/build/assets/onboarding-6NMkdNxV.js +1 -0
  84. package/build/assets/onboarding-modal-Q4AnpIdg.js +1 -0
  85. package/build/assets/organization-service.api-vrRNwOma.js +1 -0
  86. package/build/assets/path-utils-PNfCKQDV.js +1 -0
  87. package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
  88. package/build/assets/{plan-components-CcCBmCzW.js → plan-components-BdZXPyZU.js} +1 -1
  89. package/build/assets/{planner-tab-Dhyqcqmb.js → planner-tab-ByOw1he8.js} +1 -1
  90. package/build/assets/plugins-management-service-B75jyC56.js +1 -0
  91. package/build/assets/profiles-service.api-BQTklD5D.js +1 -0
  92. package/build/assets/providers-DfTB2gPd.js +1 -0
  93. package/build/assets/proxy-B3tCGf0X.js +1 -0
  94. package/build/assets/{recommended-automations-launcher-CTcGTl4d.js → recommended-automations-launcher-Bj7PuHY1.js} +1 -1
  95. package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
  96. package/build/assets/root-CDnuTToz.js +2 -0
  97. package/build/assets/root-CYWeTrWE.css +1 -0
  98. package/build/assets/root-layout-DfYVlcRG.js +2 -0
  99. package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-CnyVhX4T.js} +1 -1
  100. package/build/assets/schema-field-CUwk4wrQ.js +1 -0
  101. package/build/assets/sdk-section-page-DLLNrYjI.js +1 -0
  102. package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-CLR01YIK.js} +1 -1
  103. package/build/assets/search-dIQ09UY2.js +1 -0
  104. package/build/assets/secrets-service-CvyPWJhg.js +1 -0
  105. package/build/assets/{secrets-settings-Cx6yJlyb.js → secrets-settings-CHy72A5C.js} +1 -1
  106. package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-kzwZkLaj.js} +1 -1
  107. package/build/assets/settings-B9S8UVQr.js +1 -0
  108. package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-Dhx9ErGd.js} +1 -1
  109. package/build/assets/{settings-index-D6sxWSRk.js → settings-index-BKDl2CQ-.js} +1 -1
  110. package/build/assets/{settings-input-bD6npsDm.js → settings-input-BsgQWS5R.js} +1 -1
  111. package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-DSJJX99U.js} +1 -1
  112. package/build/assets/settings-modal-DeK11CyT.js +1 -0
  113. package/build/assets/settings-service.api-DXk5TdeJ.js +1 -0
  114. package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-Bes8dIlV.js} +1 -1
  115. package/build/assets/{settings-utils-BMdG65By.js → settings-utils-DzCVfiR3.js} +1 -1
  116. package/build/assets/shared-conversation-9atDzTR4.js +1 -0
  117. package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Bm7pa3Vk.js} +1 -1
  118. package/build/assets/{sidebar-mobile-menu-toggle-VvvX32iF.js → sidebar-mobile-menu-toggle-giMMZctn.js} +1 -1
  119. package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-CHqyFXwV.js} +1 -1
  120. package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-uiUXBU1N.js} +1 -1
  121. package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-BPYKQ3IN.js} +1 -1
  122. package/build/assets/skills-plugins-Tropusio.js +1 -0
  123. package/build/assets/{skills-settings-BUv04tSc.js → skills-settings-BvzBBCWk.js} +2 -2
  124. package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
  125. package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-B14i_Uac.js} +1 -1
  126. package/build/assets/{suspense-BO1Tl_Vf.js → suspense-DmZ3MSSh.js} +1 -1
  127. package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-DyfgG4MC.js} +1 -1
  128. package/build/assets/telemetry-C5JMEfqB.js +2 -0
  129. package/build/assets/{terminal-B61WrJdS.js → terminal-DRXt2Lr4.js} +1 -1
  130. package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-DX_k418f.js} +1 -1
  131. package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
  132. package/build/assets/{typography-D8mHDeNG.js → typography-CzfoD9DY.js} +1 -1
  133. package/build/assets/use-acp-credential-form-Bm8qXdlc.js +1 -0
  134. package/build/assets/{use-activate-agent-profile-20v1xU0H.js → use-activate-agent-profile-DlykqEfN.js} +1 -1
  135. package/build/assets/{use-active-agent-profile-BkJN7Xsy.js → use-active-agent-profile-hI-x-UBa.js} +1 -1
  136. package/build/assets/{use-active-conversation-DOZVSVtU.js → use-active-conversation-2qeez40F.js} +1 -1
  137. package/build/assets/use-agent-profiles-0pr5bLS7.js +1 -0
  138. package/build/assets/{use-agent-state-DHZO1obC.js → use-agent-state-C6peDXUm.js} +1 -1
  139. package/build/assets/use-backends-health-CLHPitJM.js +1 -0
  140. package/build/assets/{use-can-manage-org-profiles-C-OhWVBS.js → use-can-manage-org-profiles-Ck_bsNbH.js} +1 -1
  141. package/build/assets/use-cloud-current-user-id-DUCSxNjY.js +1 -0
  142. package/build/assets/use-config-B5r8erYt.js +1 -0
  143. package/build/assets/use-create-conversation-r1JHfKO5.js +1 -0
  144. package/build/assets/{use-create-secret-D0HCOZFu.js → use-create-secret-Cf2N11d2.js} +1 -1
  145. package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-Bbaz51GR.js} +1 -1
  146. package/build/assets/{use-handle-plan-click-DyRASKMC.js → use-handle-plan-click-CsAW3FlH.js} +1 -1
  147. package/build/assets/use-is-authed-BezEyfeh.js +1 -0
  148. package/build/assets/use-llm-profiles-Dr5__SlZ.js +1 -0
  149. package/build/assets/use-plugins-marketplace-BplU65ae.js +1 -0
  150. package/build/assets/use-runtime-is-ready-vCFOcLFa.js +1 -0
  151. package/build/assets/use-save-agent-profile-RqUGqTv6.js +1 -0
  152. package/build/assets/use-save-settings-Chvzeu2s.js +1 -0
  153. package/build/assets/use-settings-CyxSlyTQ.js +1 -0
  154. package/build/assets/use-settings-nav-items-zEkSO_Bf.js +16 -0
  155. package/build/assets/use-skills-xrVoKYrF.js +1 -0
  156. package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-CfisapBW.js} +1 -1
  157. package/build/assets/use-tracking-D2Qg5Lpd.js +1 -0
  158. package/build/assets/{use-user-conversation-zpx7I18x.js → use-user-conversation-CnE4zhOA.js} +1 -1
  159. package/build/assets/{useMutation-DrCAVg5w.js → useMutation-u8UgRgDK.js} +1 -1
  160. package/build/assets/{useMutationState-D8QN0ZCy.js → useMutationState-OnAsCLA_.js} +1 -1
  161. package/build/assets/{useQueries-DClgUTc7.js → useQueries-BpIlT8Mt.js} +1 -1
  162. package/build/assets/{useQuery-CRBP8vIS.js → useQuery-D5pEZbY0.js} +1 -1
  163. package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
  164. package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
  165. package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-CsMb-pta.js} +1 -1
  166. package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-wXQ-WZEC.js} +1 -1
  167. package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
  168. package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
  169. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js +2 -0
  170. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
  171. package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-B-5fBohe.js} +1 -1
  172. package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
  173. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD7v71DM.js +2 -0
  174. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BT05Osu4.js} +1 -1
  175. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DgzWSMRc.js} +1 -1
  176. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DqZatR3B.js} +1 -1
  177. package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-_Km3J77E.js} +1 -1
  178. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ivvrgjsa-BlIZPCXX.js → vendor~module-D5a_AClf.js} +1 -1
  179. package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
  180. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BrguKXCn.js} +1 -1
  181. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BTvhGHHG.js} +1 -1
  182. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-BOKQkbc6.js} +1 -1
  183. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-B0EIDu4M.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-cFNmfAE6.js} +2 -2
  184. package/build/assets/{verification-settings-D576N2xa.js → verification-settings-CfkrXoSa.js} +1 -1
  185. package/build/assets/x-ZE4iplpF.js +1 -0
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +9 -0
  188. package/build/locales/ca/openhands.json +9 -0
  189. package/build/locales/de/openhands.json +9 -0
  190. package/build/locales/en/openhands.json +9 -0
  191. package/build/locales/es/openhands.json +9 -0
  192. package/build/locales/fr/openhands.json +9 -0
  193. package/build/locales/it/openhands.json +9 -0
  194. package/build/locales/ja/openhands.json +9 -0
  195. package/build/locales/ko-KR/openhands.json +9 -0
  196. package/build/locales/no/openhands.json +9 -0
  197. package/build/locales/pt/openhands.json +9 -0
  198. package/build/locales/tr/openhands.json +9 -0
  199. package/build/locales/uk/openhands.json +9 -0
  200. package/build/locales/zh-CN/openhands.json +9 -0
  201. package/build/locales/zh-TW/openhands.json +9 -0
  202. package/config/defaults.json +5 -4
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.d.ts +9 -1
  206. package/dist/api/agent-server-adapter.js +105 -102
  207. package/dist/api/agent-server-adapter.js.map +1 -1
  208. package/dist/api/agent-server-config.cjs +1 -1
  209. package/dist/api/agent-server-config.cjs.map +1 -1
  210. package/dist/api/agent-server-config.d.ts +3 -0
  211. package/dist/api/agent-server-config.js +45 -23
  212. package/dist/api/agent-server-config.js.map +1 -1
  213. package/dist/api/backend-registry/auth.cjs +1 -1
  214. package/dist/api/backend-registry/auth.cjs.map +1 -1
  215. package/dist/api/backend-registry/auth.js +1 -1
  216. package/dist/api/backend-registry/auth.js.map +1 -1
  217. package/dist/api/backend-registry/default-backend.cjs +1 -1
  218. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  219. package/dist/api/backend-registry/default-backend.d.ts +3 -0
  220. package/dist/api/backend-registry/default-backend.js +22 -10
  221. package/dist/api/backend-registry/default-backend.js.map +1 -1
  222. package/dist/api/backend-registry/storage.cjs +1 -1
  223. package/dist/api/backend-registry/storage.cjs.map +1 -1
  224. package/dist/api/backend-registry/storage.js +38 -33
  225. package/dist/api/backend-registry/storage.js.map +1 -1
  226. package/dist/api/backend-registry/types.d.ts +2 -0
  227. package/dist/api/canvas-ui-client-tool.cjs +38 -0
  228. package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
  229. package/dist/api/canvas-ui-client-tool.d.ts +14 -0
  230. package/dist/api/canvas-ui-client-tool.js +47 -0
  231. package/dist/api/canvas-ui-client-tool.js.map +1 -0
  232. package/dist/api/client-source.cjs +2 -0
  233. package/dist/api/client-source.cjs.map +1 -0
  234. package/dist/api/client-source.d.ts +9 -0
  235. package/dist/api/client-source.js +10 -0
  236. package/dist/api/client-source.js.map +1 -0
  237. package/dist/api/cloud/client.cjs +2 -0
  238. package/dist/api/cloud/client.cjs.map +1 -0
  239. package/dist/api/cloud/client.d.ts +4 -0
  240. package/dist/api/cloud/client.js +38 -0
  241. package/dist/api/cloud/client.js.map +1 -0
  242. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  243. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/conversation-service.api.js +35 -33
  245. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  246. package/dist/api/cloud/organization-service.api.cjs +1 -1
  247. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  248. package/dist/api/cloud/organization-service.api.js +11 -10
  249. package/dist/api/cloud/organization-service.api.js.map +1 -1
  250. package/dist/api/cloud/proxy.cjs +1 -1
  251. package/dist/api/cloud/proxy.cjs.map +1 -1
  252. package/dist/api/cloud/proxy.d.ts +2 -40
  253. package/dist/api/cloud/proxy.js +14 -39
  254. package/dist/api/cloud/proxy.js.map +1 -1
  255. package/dist/api/conversation-metadata-store.cjs +1 -1
  256. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  257. package/dist/api/conversation-metadata-store.d.ts +2 -9
  258. package/dist/api/conversation-metadata-store.js +13 -9
  259. package/dist/api/conversation-metadata-store.js.map +1 -1
  260. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  261. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +2 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
  266. package/dist/api/device-flow-client.cjs +1 -1
  267. package/dist/api/device-flow-client.cjs.map +1 -1
  268. package/dist/api/device-flow-client.d.ts +4 -58
  269. package/dist/api/device-flow-client.js +8 -98
  270. package/dist/api/device-flow-client.js.map +1 -1
  271. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  272. package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
  273. package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
  274. package/dist/api/git-service/agent-server-git-service.api.js +107 -40
  275. package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
  276. package/dist/api/open-hands.types.d.ts +11 -0
  277. package/dist/api/option-service/option-service.api.cjs +1 -1
  278. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  279. package/dist/api/option-service/option-service.api.js +0 -1
  280. package/dist/api/option-service/option-service.api.js.map +1 -1
  281. package/dist/api/option-service/option.types.d.ts +0 -1
  282. package/dist/api/secrets-service.cjs +1 -1
  283. package/dist/api/secrets-service.cjs.map +1 -1
  284. package/dist/api/secrets-service.js +15 -14
  285. package/dist/api/secrets-service.js.map +1 -1
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
  289. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
  291. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
  292. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
  293. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  295. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  296. package/dist/components/features/backends/backend-form-modal.d.ts +4 -2
  297. package/dist/components/features/backends/backend-form-modal.js +108 -101
  298. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  299. package/dist/components/features/backends/backend-row.cjs +1 -1
  300. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  301. package/dist/components/features/backends/backend-row.js +2 -1
  302. package/dist/components/features/backends/backend-row.js.map +1 -1
  303. package/dist/components/features/backends/backend-selector.cjs +1 -1
  304. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  305. package/dist/components/features/backends/backend-selector.js +51 -51
  306. package/dist/components/features/backends/backend-selector.js.map +1 -1
  307. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  308. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  309. package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
  310. package/dist/components/features/backends/device-flow-auth.js +38 -38
  311. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  312. package/dist/components/features/chat/chat-interface.cjs +2 -2
  313. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  314. package/dist/components/features/chat/chat-interface.js +173 -165
  315. package/dist/components/features/chat/chat-interface.js.map +1 -1
  316. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  317. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  318. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  319. package/dist/components/features/chat/components/chat-input-actions.js +44 -43
  320. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  321. package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
  322. package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
  323. package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
  324. package/dist/components/features/chat/components/chat-input-container.js +20 -19
  325. package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
  326. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
  327. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
  329. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
  330. package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
  331. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
  332. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
  333. package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
  334. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
  335. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  336. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  337. package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
  338. package/dist/components/features/chat/custom-chat-input.js +52 -51
  339. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  340. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  341. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  342. package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
  343. package/dist/components/features/chat/interactive-chat-box.js +9 -8
  344. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  345. package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
  346. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
  347. package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
  348. package/dist/components/features/diff-viewer/commit-list.js +27 -0
  349. package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
  350. package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
  351. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
  352. package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
  353. package/dist/components/features/diff-viewer/commit-row.js +59 -0
  354. package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
  355. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  356. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  357. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
  358. package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
  359. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  360. package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
  361. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  362. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  363. package/dist/components/providers/agent-server-ui-providers.d.ts +4 -2
  364. package/dist/components/providers/agent-server-ui-providers.js +9 -2
  365. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  366. package/dist/components/providers/index.cjs +1 -1
  367. package/dist/components/providers/index.d.ts +1 -2
  368. package/dist/components/providers/index.js +0 -1
  369. package/dist/components/providers/telemetry-provider.cjs +2 -0
  370. package/dist/components/providers/telemetry-provider.cjs.map +1 -0
  371. package/dist/components/providers/telemetry-provider.d.ts +6 -0
  372. package/dist/components/providers/telemetry-provider.js +64 -0
  373. package/dist/components/providers/telemetry-provider.js.map +1 -0
  374. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  375. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  376. package/dist/components/shared/modals/settings/settings-modal.js +23 -22
  377. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  378. package/dist/config/defaults.cjs +1 -1
  379. package/dist/config/defaults.cjs.map +1 -1
  380. package/dist/config/defaults.js +5 -4
  381. package/dist/config/defaults.js.map +1 -1
  382. package/dist/constants/acp-providers.cjs.map +1 -1
  383. package/dist/constants/acp-providers.d.ts +1 -1
  384. package/dist/constants/acp-providers.js.map +1 -1
  385. package/dist/constants/canvas-ui.cjs +2 -0
  386. package/dist/constants/canvas-ui.cjs.map +1 -0
  387. package/dist/constants/canvas-ui.d.ts +8 -0
  388. package/dist/constants/canvas-ui.js +6 -0
  389. package/dist/constants/canvas-ui.js.map +1 -0
  390. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  391. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  392. package/dist/contexts/conversation-websocket-context.js +197 -204
  393. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  394. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  395. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  396. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
  397. package/dist/hooks/mutation/use-create-conversation.js +52 -52
  398. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  399. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  400. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  401. package/dist/hooks/mutation/use-save-settings.d.ts +3 -1
  402. package/dist/hooks/mutation/use-save-settings.js +6 -5
  403. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  404. package/dist/hooks/query/query-keys.cjs +1 -1
  405. package/dist/hooks/query/query-keys.cjs.map +1 -1
  406. package/dist/hooks/query/query-keys.d.ts +2 -0
  407. package/dist/hooks/query/query-keys.js +4 -1
  408. package/dist/hooks/query/query-keys.js.map +1 -1
  409. package/dist/hooks/query/use-backends-health.cjs +1 -1
  410. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  411. package/dist/hooks/query/use-backends-health.js +50 -48
  412. package/dist/hooks/query/use-backends-health.js.map +1 -1
  413. package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
  414. package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
  415. package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
  416. package/dist/hooks/query/use-cloud-organizations.js +5 -2
  417. package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
  418. package/dist/hooks/query/use-commit-changes.cjs +2 -0
  419. package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
  420. package/dist/hooks/query/use-commit-changes.d.ts +5 -0
  421. package/dist/hooks/query/use-commit-changes.js +34 -0
  422. package/dist/hooks/query/use-commit-changes.js.map +1 -0
  423. package/dist/hooks/query/use-task-polling.cjs +1 -1
  424. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  425. package/dist/hooks/query/use-task-polling.d.ts +3 -2
  426. package/dist/hooks/query/use-task-polling.js +53 -40
  427. package/dist/hooks/query/use-task-polling.js.map +1 -1
  428. package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
  429. package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
  430. package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
  431. package/dist/hooks/query/use-unified-git-commits.js +41 -0
  432. package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
  433. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  434. package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
  435. package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
  436. package/dist/hooks/query/use-unified-git-diff.js +11 -4
  437. package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
  438. package/dist/hooks/use-acp-model-context.cjs +1 -1
  439. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  440. package/dist/hooks/use-acp-model-context.d.ts +4 -1
  441. package/dist/hooks/use-acp-model-context.js +9 -8
  442. package/dist/hooks/use-acp-model-context.js.map +1 -1
  443. package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
  444. package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
  445. package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
  446. package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
  447. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  448. package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
  449. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  450. package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
  451. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
  452. package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
  453. package/dist/hooks/use-chat-input-profile-state.js +42 -15
  454. package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
  455. package/dist/hooks/use-device-flow.cjs +1 -1
  456. package/dist/hooks/use-device-flow.cjs.map +1 -1
  457. package/dist/hooks/use-device-flow.d.ts +4 -1
  458. package/dist/hooks/use-device-flow.js +42 -40
  459. package/dist/hooks/use-device-flow.js.map +1 -1
  460. package/dist/hooks/use-telemetry.cjs +1 -1
  461. package/dist/hooks/use-telemetry.cjs.map +1 -1
  462. package/dist/hooks/use-telemetry.d.ts +3 -3
  463. package/dist/hooks/use-telemetry.js +16 -22
  464. package/dist/hooks/use-telemetry.js.map +1 -1
  465. package/dist/hooks/use-tracking.cjs +1 -1
  466. package/dist/hooks/use-tracking.cjs.map +1 -1
  467. package/dist/hooks/use-tracking.d.ts +5 -5
  468. package/dist/hooks/use-tracking.js +37 -37
  469. package/dist/hooks/use-tracking.js.map +1 -1
  470. package/dist/i18n/declaration.cjs +1 -1
  471. package/dist/i18n/declaration.cjs.map +1 -1
  472. package/dist/i18n/declaration.d.ts +9 -0
  473. package/dist/i18n/declaration.js +1 -1
  474. package/dist/i18n/declaration.js.map +1 -1
  475. package/dist/i18n/index.cjs +1 -1
  476. package/dist/i18n/index.cjs.map +1 -1
  477. package/dist/i18n/index.js +19 -18
  478. package/dist/i18n/index.js.map +1 -1
  479. package/dist/i18n/translation.cjs +2 -2
  480. package/dist/i18n/translation.cjs.map +1 -1
  481. package/dist/i18n/translation.js +153 -0
  482. package/dist/i18n/translation.js.map +1 -1
  483. package/dist/index.cjs +1 -1
  484. package/dist/index.js +32 -32
  485. package/dist/lib/index.cjs +1 -1
  486. package/dist/lib/index.d.ts +2 -2
  487. package/dist/lib/index.js +1 -1
  488. package/dist/locales/ar/openhands.json +9 -0
  489. package/dist/locales/ca/openhands.json +9 -0
  490. package/dist/locales/de/openhands.json +9 -0
  491. package/dist/locales/en/openhands.json +9 -0
  492. package/dist/locales/es/openhands.json +9 -0
  493. package/dist/locales/fr/openhands.json +9 -0
  494. package/dist/locales/it/openhands.json +9 -0
  495. package/dist/locales/ja/openhands.json +9 -0
  496. package/dist/locales/ko-KR/openhands.json +9 -0
  497. package/dist/locales/no/openhands.json +9 -0
  498. package/dist/locales/pt/openhands.json +9 -0
  499. package/dist/locales/tr/openhands.json +9 -0
  500. package/dist/locales/uk/openhands.json +9 -0
  501. package/dist/locales/zh-CN/openhands.json +9 -0
  502. package/dist/locales/zh-TW/openhands.json +9 -0
  503. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
  504. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
  505. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
  506. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
  507. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
  508. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
  509. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
  510. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
  511. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
  512. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
  513. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
  514. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
  515. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  516. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
  517. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  518. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  519. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
  520. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
  522. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
  523. package/dist/node_modules/axios/index.cjs +1 -1
  524. package/dist/node_modules/axios/index.js +1 -1
  525. package/dist/package.cjs +1 -1
  526. package/dist/package.cjs.map +1 -1
  527. package/dist/package.js +3 -3
  528. package/dist/package.js.map +1 -1
  529. package/dist/routes/app-settings.cjs +1 -1
  530. package/dist/routes/app-settings.cjs.map +1 -1
  531. package/dist/routes/app-settings.js +59 -60
  532. package/dist/routes/app-settings.js.map +1 -1
  533. package/dist/routes/commits-tab.cjs +2 -0
  534. package/dist/routes/commits-tab.cjs.map +1 -0
  535. package/dist/routes/commits-tab.d.ts +8 -0
  536. package/dist/routes/commits-tab.js +45 -0
  537. package/dist/routes/commits-tab.js.map +1 -0
  538. package/dist/routes/files-tab.cjs +1 -1
  539. package/dist/routes/files-tab.cjs.map +1 -1
  540. package/dist/routes/files-tab.js +148 -127
  541. package/dist/routes/files-tab.js.map +1 -1
  542. package/dist/routes/llm-settings.cjs +1 -1
  543. package/dist/routes/llm-settings.cjs.map +1 -1
  544. package/dist/routes/llm-settings.js +4 -1
  545. package/dist/routes/llm-settings.js.map +1 -1
  546. package/dist/services/cloud-funnel-analytics.cjs +2 -0
  547. package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
  548. package/dist/services/cloud-funnel-analytics.d.ts +4 -0
  549. package/dist/services/cloud-funnel-analytics.js +39 -0
  550. package/dist/services/cloud-funnel-analytics.js.map +1 -0
  551. package/dist/services/telemetry.cjs +1 -1
  552. package/dist/services/telemetry.cjs.map +1 -1
  553. package/dist/services/telemetry.d.ts +46 -9
  554. package/dist/services/telemetry.js +182 -71
  555. package/dist/services/telemetry.js.map +1 -1
  556. package/dist/themes/color-themes.cjs.map +1 -1
  557. package/dist/themes/color-themes.d.ts +3 -6
  558. package/dist/themes/color-themes.js.map +1 -1
  559. package/dist/types/agent-server/core/base/action.d.ts +5 -4
  560. package/dist/types/agent-server/core/base/base.d.ts +3 -2
  561. package/dist/types/agent-server/core/base/observation.d.ts +1 -1
  562. package/dist/types/agent-server/type-guards.cjs +1 -1
  563. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  564. package/dist/types/agent-server/type-guards.d.ts +3 -5
  565. package/dist/types/agent-server/type-guards.js +2 -1
  566. package/dist/types/agent-server/type-guards.js.map +1 -1
  567. package/dist/types/automation.d.ts +5 -0
  568. package/dist/utils/api-error-message.d.ts +11 -0
  569. package/dist/utils/automation-timeout.d.ts +19 -0
  570. package/dist/utils/base-path.cjs +2 -0
  571. package/dist/utils/base-path.cjs.map +1 -0
  572. package/dist/utils/base-path.d.ts +2 -0
  573. package/dist/utils/base-path.js +23 -0
  574. package/dist/utils/base-path.js.map +1 -0
  575. package/dist/utils/error-handler.cjs +1 -1
  576. package/dist/utils/error-handler.cjs.map +1 -1
  577. package/dist/utils/error-handler.d.ts +1 -4
  578. package/dist/utils/error-handler.js +6 -7
  579. package/dist/utils/error-handler.js.map +1 -1
  580. package/dist/utils/map-provider.cjs +1 -1
  581. package/dist/utils/map-provider.cjs.map +1 -1
  582. package/dist/utils/map-provider.d.ts +1 -0
  583. package/dist/utils/map-provider.js +2 -1
  584. package/dist/utils/map-provider.js.map +1 -1
  585. package/package.json +3 -3
  586. package/scripts/check-sdk-version-sync.mjs +6 -6
  587. package/scripts/dev-safe.mjs +7 -8
  588. package/scripts/dev-static.mjs +3 -0
  589. package/scripts/dev-with-automation.mjs +3 -0
  590. package/scripts/docker-build.mjs +4 -0
  591. package/scripts/static-server.mjs +93 -7
  592. package/tools/canvas_ui_tool.py +14 -8
  593. package/build/assets/active-backend-context-hxq31W25.js +0 -1
  594. package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
  595. package/build/assets/agent-server-conversation-service.api-CuSdr4Qb.js +0 -5
  596. package/build/assets/agent-settings-D_yOy8XB.js +0 -1
  597. package/build/assets/api-key-entry-screen-Dl0qVYi4.js +0 -1
  598. package/build/assets/app-settings-yVizGXox.js +0 -1
  599. package/build/assets/automation-detail-dvJfLs5u.js +0 -2
  600. package/build/assets/automation-export-BPcgLqPD.js +0 -2
  601. package/build/assets/automations-list-CUXogTe0.js +0 -1
  602. package/build/assets/backend-form-modal-CQJGmItq.js +0 -1
  603. package/build/assets/check-Bvi71siz.js +0 -1
  604. package/build/assets/condenser-settings-Ca8fYZ_Z.js +0 -1
  605. package/build/assets/conversation-9NBSRoR9.js +0 -1
  606. package/build/assets/conversation-BXg6Oti2.js +0 -89
  607. package/build/assets/conversation-panel-CZri9Rup.js +0 -1
  608. package/build/assets/conversation-service.api-DPBQvTKD.js +0 -1
  609. package/build/assets/declaration-gq8V5eTU.js +0 -1
  610. package/build/assets/files-tab-UVoray88.js +0 -1
  611. package/build/assets/git-provider-icon-o6hdnJUB.js +0 -1
  612. package/build/assets/handle-capture-consent-CPMXU29K.js +0 -1
  613. package/build/assets/home-D1IHvGTN.js +0 -1
  614. package/build/assets/index-redirect-CUUJiNki.js +0 -1
  615. package/build/assets/install-server-modal-BbuQaA2w.js +0 -1
  616. package/build/assets/lesson-plan-jC0HBoe6.js +0 -4
  617. package/build/assets/llm-not-configured-banner-DoARbcdL.js +0 -27
  618. package/build/assets/llm-settings-4JMLV8mq.js +0 -1
  619. package/build/assets/llm-settings-D91gMw3U.js +0 -1
  620. package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
  621. package/build/assets/loader-circle-BEykUKYG.js +0 -1
  622. package/build/assets/manage-backends-modal-DkWAMSle.js +0 -1
  623. package/build/assets/manifest-aa5c29f6.js +0 -1
  624. package/build/assets/model-selector-BfqpMkSJ.js +0 -1
  625. package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
  626. package/build/assets/onboarding-Bu-HN1ze.js +0 -1
  627. package/build/assets/onboarding-modal-CZgjs5Bx.js +0 -1
  628. package/build/assets/option-service.api-BrZ5q87N.js +0 -1
  629. package/build/assets/organization-service.api-Bk4pCGU1.js +0 -1
  630. package/build/assets/path-utils-CSmuZoix.js +0 -1
  631. package/build/assets/plugins-management-service-BRBLxvUl.js +0 -1
  632. package/build/assets/profiles-service.api-BMXQ9pZC.js +0 -1
  633. package/build/assets/providers-BpO967xS.js +0 -1
  634. package/build/assets/proxy-BgJLtxu7.js +0 -1
  635. package/build/assets/root-BM5WgQ4_.js +0 -2
  636. package/build/assets/root-V8fkplMy.css +0 -1
  637. package/build/assets/root-layout-BdoyoobY.js +0 -2
  638. package/build/assets/schema-field-BSHrUMme.js +0 -1
  639. package/build/assets/sdk-section-page-t82gsOqa.js +0 -1
  640. package/build/assets/search-4DHskuhE.js +0 -1
  641. package/build/assets/secrets-service-B2GqPV0N.js +0 -1
  642. package/build/assets/settings-DmPLkgq0.js +0 -1
  643. package/build/assets/settings-modal-CwrZKrTq.js +0 -1
  644. package/build/assets/settings-service.api-Ce-ub11I.js +0 -1
  645. package/build/assets/shared-conversation-BDREQPnE.js +0 -1
  646. package/build/assets/skills-plugins-2Y44YHbO.js +0 -1
  647. package/build/assets/use-acp-credential-form-MzZM6D7D.js +0 -1
  648. package/build/assets/use-agent-profiles-DwZxnwO5.js +0 -1
  649. package/build/assets/use-backends-health-CRHzuvxO.js +0 -1
  650. package/build/assets/use-cloud-current-user-id-utFreJ0i.js +0 -1
  651. package/build/assets/use-config-mJrtZHP1.js +0 -1
  652. package/build/assets/use-create-conversation-DdqsP78F.js +0 -1
  653. package/build/assets/use-is-authed-B6M0mcGL.js +0 -1
  654. package/build/assets/use-llm-profiles-RC-PkpBl.js +0 -1
  655. package/build/assets/use-plugins-marketplace-FHlbeQ4c.js +0 -1
  656. package/build/assets/use-runtime-is-ready-RKj2WmEh.js +0 -1
  657. package/build/assets/use-save-agent-profile-tvDP15mh.js +0 -1
  658. package/build/assets/use-save-settings-BGlSfuYn.js +0 -1
  659. package/build/assets/use-settings-CH5LzXD8.js +0 -1
  660. package/build/assets/use-settings-nav-items-Dwktv8wo.js +0 -16
  661. package/build/assets/use-skills-CSzSL6HG.js +0 -1
  662. package/build/assets/use-tracking-BIXzagSI.js +0 -1
  663. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lf310vj7-CSVPGId3.js +0 -10
  664. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nfpll1wp-BCpa95De.js +0 -177
  665. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jewnulst-C57fm7C-.js +0 -1
  666. package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
  667. package/build/assets/x-Cb0WAtak.js +0 -1
  668. package/dist/components/providers/posthog-wrapper.cjs +0 -2
  669. package/dist/components/providers/posthog-wrapper.cjs.map +0 -1
  670. package/dist/components/providers/posthog-wrapper.d.ts +0 -4
  671. package/dist/components/providers/posthog-wrapper.js +0 -49
  672. package/dist/components/providers/posthog-wrapper.js.map +0 -1
  673. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs +0 -2
  674. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs.map +0 -1
  675. package/dist/node_modules/posthog-js/react/dist/esm/index.js +0 -113
  676. package/dist/node_modules/posthog-js/react/dist/esm/index.js.map +0 -1
  677. package/dist/utils/handle-capture-consent.cjs +0 -2
  678. package/dist/utils/handle-capture-consent.cjs.map +0 -1
  679. package/dist/utils/handle-capture-consent.d.ts +0 -7
  680. package/dist/utils/handle-capture-consent.js +0 -8
  681. package/dist/utils/handle-capture-consent.js.map +0 -1
  682. /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-BQUj0sYu.js} +0 -0
  683. /package/build/assets/{agent-server-ui-style-scope-COnDHTm5.js → agent-server-ui-style-scope-qhnhZHBV.js} +0 -0
  684. /package/build/assets/{automation-BU8zu-FP.js → automation-LZB0MjdV.js} +0 -0
  685. /package/build/assets/{close-p3Op5lxI.js → close-DLFb5kfv.js} +0 -0
  686. /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
  687. /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
  688. /package/build/assets/{folder-mMWFvaw0.js → folder-Bk311brm.js} +0 -0
  689. /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-DBqBsCWH.js} +0 -0
  690. /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-DnL9OC8_.js} +0 -0
  691. /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-Dz51Zn5x.js} +0 -0
  692. /package/build/assets/{link-external-DfKQroKX.js → link-external-CaBmUEs_.js} +0 -0
  693. /package/build/assets/{search-BsjCEFNf.js → search-BgOCR7_c.js} +0 -0
  694. /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-Cdl6jOe5.js} +0 -0
  695. /package/build/assets/{skills-9cDZONKh.js → skills-EqzxYBvT.js} +0 -0
  696. /package/build/assets/{terminal-BuLtIrb9.js → terminal-Cgf___rK.js} +0 -0
  697. /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-MsShT8Ec.js} +0 -0
  698. /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-DL5LgKon.js} +0 -0
  699. /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-BP3lqLMx.js} +0 -0
  700. /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-D9BYdANT.js} +0 -0
  701. /package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-DJWEfVc5.js} +0 -0
  702. /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-By2MVv_N.js} +0 -0
  703. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CxfzCmkN.js} +0 -0
  704. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~epa72zsm-B4rXs7Zd.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
  705. /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
  706. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-COhHANvV.js} +0 -0
  707. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-FghQ3Z1a.js} +0 -0
  708. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-mC0v44WR.js} +0 -0
  709. /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C4-GDgiF.js} +0 -0
  710. /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-CnKZILnC.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Record<string, unknown>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;AA4BA,IAAM,KAAY,GAAc,MACzB,IACE,EAAK,SAAS,IAAY,GAAG,EAAK,UAAU,GAAG,EAAU,CAAC,OAAO,IADtD,IAKd,KACJ,GACA,MAEK,EAAK,OAAO,EAAI,GAKnB,kBAAC,GAAD;CACE,IAAG;CACH,SAAS;CACD;CACR,YAAY;EACV,MAAM,kBAAC,GAAD,EAAiB,CAAA;EACvB,KAAK,kBAAC,GAAD,EAAiB,CAAA;EACvB;CACD,CAAA,GAZK,GAwBL,KAA2B,MAC/B,+BAA+B,KAAK,EAAQ,EAExC,KACJ,MAC2B;CAC3B,IAAM,IAAU,EAAM,SAAS,MAAM,CAAC,QAAQ,QAAQ,IAAI,IAAI;AAI9D,QAHI,CAAC,KAAW,EAAwB,EAAQ,GACvC,OAEF;GAGH,KACJ,GACA,MACkB;AAClB,KAAI,OAAO,KAAU,SACnB,QAAO;CAGT,IAAM,IAAU,EAAM,MAAM;AAK5B,QAJK,IAIE,IAAY,EAAS,GAAS,EAAU,GAAG,IAHzC;GAML,KACJ,MAC2B;AAC3B,KAAI,EAAM,cAAc,4BACtB,QAAO;CAGT,IAAM,IAAS,EAAM,QACf,IAAc,EAAkB,EAAO,aAAa;AAE1D,QAAO,IACH,yBAAyB,MACzB;GAGA,KACJ,GACA,MAC2B;CAC3B,IAAM,IAAiB,GAAqB,WACtC,IAAc,EAAM,aACpB,IAAsB,EAAkB,EAAY,UAAU;AAEpE,KACE,MAAmB,+BACnB,MAAwB,+BACxB,OAAO,EAAM,YAAY,KAAK,KAAK,2BAEnC,QAAO;CAOT,IAAM,IACJ,GALc,GAAqB,UAAU,EAAE,EAKtB,aAAa,IACtC,EAAkB,EAAY,aAAa,IAC3C,EAAkB,EAAY,UAAU,GAAG,IAC3C,EAAkB,EAAY,UAAU,GAAG,IAC3C,EAAkB,EAAY,OAAO,GAAG;AAE1C,QAAO,IACH,yBAAyB,MACzB;GAIA,KAAuB,MAA2C;AAEtE,KAAI,CAAC,EAAc,EAAM,CACvB,QAAO;CAGT,IAAM,IAAqB,EAA4B,EAAM;AAC7D,KAAI,EACF,QAAO;CAGT,IAAM,IAAe,EAA8B,EAAM;AACzD,KAAI,EACF,QAAO;CAGT,IAAM,IAAa,EAAM,OAAO,MAC5B,IAAY,IACZ,IAAwC,EAAE;AAE9C,SAAQ,GAAR;EACE,KAAK;EACL,KAAK;AAEH,GADA,IAAY,sBACZ,IAAe,EACb,SAAS,EAAS,EAAM,OAAO,SAAS,GAAG,EAC5C;AACD;EACF,KAAK;EACL,KAAK;AAQH,GAPA,AAKE,IALE,EAAM,OAAO,YAAY,SACf,wBACH,EAAM,OAAO,YAAY,WACtB,yBAEA,uBAEd,IAAe,EACb,MAAM,EAAM,OAAO,MACpB;AACD;EACF,KAAK;AAEH,GADA,IAAY,gCACZ,IAAe,EACb,eAAe,EAAM,WACtB;AACD;EACF,KAAK;AAEH,GADA,IAAY,+BACZ,IAAe,EACb,MAAM,EAAM,OAAO,MACpB;AACD;EACF,KAAK;AAEH,GADA,IAAY,uBACZ,IAAe,EACb,MAAM,EAAM,OAAO,eACpB;AACD;EACF,KAAK;AACH,OAAY;AACZ;EACF,KAAK;AACH,OAAY;AACZ;EACF,KAAK;AACH,OAAY;AACZ;EACF,KAAK;AAEH,GADA,IAAY,uBACZ,IAAe,EACb,SACE,aAAa,EAAM,UAAU,EAAM,OAAO,UACtC,EAAS,OAAO,EAAM,OAAO,QAAQ,EAAE,GAAG,GAC1C,IACP;AACD;EACF,KAAK;AAEH,GADA,IAAY,uBACZ,IAAe,EACb,SACE,aAAa,EAAM,UAAU,EAAM,OAAO,UACtC,EAAS,OAAO,EAAM,OAAO,QAAQ,EAAE,GAAG,GAC1C,IACP;AACD;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACH,OAAY;AACZ;EACF,QAEE,QAAO,OAAO,EAAW,CAAC,QAAQ,UAAU,GAAG,CAAC,aAAa;;AAOjE,QAJI,IACK,EAAmB,GAAW,EAAa,GAG7C;GAIH,KACJ,GACA,MACoB;AAEpB,KAAI,CAAC,EAAmB,EAAM,CAC5B,QAAO;CAGT,IAAM,IAAgC,EACpC,GACA,EACD;AACD,KAAI,EACF,QAAO;AAGT,KAAI,GAAqB;EACvB,IAAM,IAAqB,EAA4B,EAAoB;AAC3E,MAAI,EACF,QAAO;EAGT,IAAM,IAAe,EAA8B,EAAoB;AACvE,MAAI,EACF,QAAO;;CAIX,IAAM,IAAkB,EAAM,YAAY,MACtC,IAAiB,IACjB,IAA6C,EAAE;AAEnD,SAAQ,GAAR;EACE,KAAK;EACL,KAAK;AAEH,GADA,IAAiB,2BACjB,IAAoB,EAClB,SAAS,EAAM,YAAY,UACvB,EAAS,EAAM,YAAY,SAAS,GAAG,GACvC,IACL;AACD;EACF,KAAK;EACL,KAAK;AAMH,GALA,AAGE,IAHE,EAAM,YAAY,YAAY,SACf,6BAEA,4BAEnB,IAAoB,EAClB,MAAM,EAAM,YAAY,QAAQ,IACjC;AACD;EACF,KAAK;AAEH,GADA,IAAiB,2BACjB,IAAoB,EAClB,eAAe,EAAM,YAAY,WAClC;AACD;EACF,KAAK;AAEH,GADA,IAAiB,oCACjB,IAAoB,EAClB,MAAM,EAAM,YAAY,YACzB;AACD;EACF,KAAK;AAEH,GADA,IAAiB,4BACjB,IAAoB,EAClB,MAAM,EAAM,YAAY,UACzB;AACD;EACF,KAAK;AACH,OAAiB;AACjB;EACF,KAAK;AAIH,GAHA,IAAiB,EAAM,YAAY,WAC/B,wBACA,6BACJ,IAAoB,EAClB,MAAM,EAAM,YAAY,cACzB;AACD;EACF,KAAK;AACH,OAAiB;AACjB;EACF,KAAK,0BAA0B;GAC7B,IAAM,EAAE,eAAY,EAAM;AAC1B,GAIE,IAJE,MAAY,SACG,2CAGA;AAEnB;;EAEF,KAAK;AACH,OAAiB;AACjB;EACF,KAAK;AAEH,GADA,IAAiB,4BACjB,IAAoB,EAClB,SAAS,EAAM,YAAY,UACvB,EAAS,EAAM,YAAY,SAAS,GAAG,GACvC,IACL;AACD;EACF,KAAK;AAEH,GADA,IAAiB,4BACjB,IAAoB,EAClB,SAAS,EAAM,YAAY,UACvB,EAAS,EAAM,YAAY,SAAS,GAAG,GACvC,IACL;AACD;EACF,QAEE,QAAO,EAAgB,QAAQ,eAAe,GAAG,CAAC,aAAa;;AAOnE,QAJI,IACK,EAAmB,GAAgB,EAAkB,GAGvD;GAGI,KACX,GACA,MACG;CACH,IAAI,IAAyB,IACzB,IAAoC;AAGxC,KAAI,EAAkB,EAAM,EAAE;EAE5B,IAAM,IAAgB;AAMtB,EALA,AAGE,IAHE,EAAK,OAAO,EAAc,GACpB,EAAmB,GAAe,EAAE,CAAC,GAErC,eAEV,IAAU,EAAM;QACP,EAAc,EAAM,IAC7B,IAAQ,EAAoB,EAAM,EAElC,IAAU,EAAsB,EAAM,IAAI,EAAiB,EAAM,IACxD,EAAmB,EAAM,IAClC,IAAQ,EAAyB,GAAO,EAAoB,EAG5D,AAOE,IAPE,EAAM,YAAY,SAAS,2BAE3B,kBAAC,GAAD,EACS,UACP,CAAA,GAIF,EAAsB,GAAO,EAAoB,IACjD,EAAsB,EAAM,IAEvB,EAAmB,EAAM,IAMlC,IAAQ,EAAmB,EAAuB,EAAM,EAAE,EAKxD,OAAO,EAA0B,EAAM,EACxC,CAAC,EACF,IAAU,EAAsB,EAAM,IAKtC,EAAM,WAAW,WACjB,YAAY,KACZ,EAAM,WAAW,QACjB,OAAO,EAAM,UAAW,YACxB,UAAU,EAAM,UAChB,OAAO,EAAM,OAAO,QAAS,aAE7B,IAAQ,OAAO,EAAM,OAAO,KAAK,CAAC,QAAQ,UAAU,GAAG,CAAC,aAAa;AAGvE,QAAO;EACL,OAAO,KAAS,EAAK,EAAE,EAAQ,oBAAoB;EACnD;EACD"}
1
+ {"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Record<string, unknown>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return \"CANVASUI\";\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../i18n/declaration.cjs`),t=require(`../../../../i18n/index.cjs`),n=require(`./shared.cjs`),r=require(`./get-observation-result.cjs`);var i=e=>{let{observation:t}=e;if(t.error)return`**Error:**\n${t.error}`;let n=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../i18n/declaration.cjs`),t=require(`../../../../i18n/index.cjs`);require(`../../../../constants/canvas-ui.cjs`);const n=require(`./shared.cjs`),r=require(`./get-observation-result.cjs`);var i=e=>{let{observation:t}=e;if(t.error)return`**Error:**\n${t.error}`;let n=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
2
  `):null;return r.getObservationResult(e)===`success`&&`old_content`in t&&`new_content`in t&&t.old_content&&t.new_content||t.command===`view`?`\`\`\`\n${n||t.output}\n\`\`\``:n||t.output},a=r=>{let{observation:i}=r,a=i.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
3
3
  `)||``;a.length>1e3&&(a=`${a.slice(0,n.MAX_CONTENT_LENGTH)}...`);let o=``;return i.command&&(o+=`Command: \`${i.command}\`\n\n`),o+=`Output:\n\`\`\`sh\n${a.trim()||t.default.t(e.I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\n\`\`\``,o},o=e=>{let{observation:t}=e,r=`content`in t&&Array.isArray(t.content)?t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
4
4
  `):t.output||``,i=``;return t.error?i+=`**Error:**\n${t.error}`:r?i+=`**Output:**\n${r}`:i+=`Browser action completed successfully.`,i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},s=e=>{let{observation:t}=e,r=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
@@ -15,5 +15,5 @@ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../
15
15
  `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},h=e=>{let{observation:t}=e,r=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
16
16
  `),i=`**Pattern:** \`${t.pattern}\`\n`;return i+=`**Search Path:** \`${t.search_path}\`\n`,t.include_pattern&&(i+=`**Include:** \`${t.include_pattern}\`\n`),i+=`
17
17
  `,t.is_error?i+=`**Error:**\n${r}`:t.matches.length===0?i+=`**Result:** No matches found.`:(i+=`**Matches (${t.matches.length}${t.truncated?`+, truncated`:``}):**\n`,i+=t.matches.map(e=>`- \`${e}\``).join(`
18
- `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},g=e=>{switch(e.observation.kind){case`FileEditorObservation`:case`StrReplaceEditorObservation`:return i(e);case`ExecuteBashObservation`:case`TerminalObservation`:return a(e);case`BrowserObservation`:return o(e);case`MCPToolObservation`:return s(e);case`TaskTrackerObservation`:return d(e);case`ThinkObservation`:return f(e);case`FinishObservation`:return p(e);case`GlobObservation`:return m(e);case`GrepObservation`:return h(e);case`InvokeSkillObservation`:return c(e);case`CanvasUIObservation`:return l(e);case`SwitchLLMObservation`:return u(e);default:return n.getDefaultEventContent(e)}};exports.getObservationContent=g;
18
+ `)),i.length>1e3&&(i=`${i.slice(0,n.MAX_CONTENT_LENGTH)}...(truncated)`),i},g=e=>{switch(e.observation.kind){case`FileEditorObservation`:case`StrReplaceEditorObservation`:return i(e);case`ExecuteBashObservation`:case`TerminalObservation`:return a(e);case`BrowserObservation`:return o(e);case`MCPToolObservation`:return s(e);case`TaskTrackerObservation`:return d(e);case`ThinkObservation`:return f(e);case`FinishObservation`:return p(e);case`GlobObservation`:return m(e);case`GrepObservation`:return h(e);case`InvokeSkillObservation`:return c(e);case`CanvasUIObservation`:return l(e);case`ClientToolObservation`:return e.tool_name===`canvas_ui_control`?l(e):n.getDefaultEventContent(e);case`SwitchLLMObservation`:return u(e);default:return n.getDefaultEventContent(e)}};exports.getObservationContent=g;
19
19
  //# sourceMappingURL=get-observation-content.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-observation-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-observation-content.ts"],"sourcesContent":["import { ObservationEvent } from \"#/types/agent-server/core\";\nimport { getObservationResult } from \"./get-observation-result\";\nimport { getDefaultEventContent, MAX_CONTENT_LENGTH } from \"./shared\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n MCPToolObservation,\n FinishObservation,\n ThinkObservation,\n BrowserObservation,\n ExecuteBashObservation,\n TerminalObservation,\n FileEditorObservation,\n StrReplaceEditorObservation,\n TaskTrackerObservation,\n GlobObservation,\n GrepObservation,\n InvokeSkillObservation,\n CanvasUIObservation,\n SwitchLLMObservation,\n} from \"#/types/agent-server/core/base/observation\";\n\n// File Editor Observations\nconst getFileEditorObservationContent = (\n event: ObservationEvent<FileEditorObservation | StrReplaceEditorObservation>,\n): string => {\n const { observation } = event;\n\n if (observation.error) {\n return `**Error:**\\n${observation.error}`;\n }\n\n // Extract text content from the observation if it exists\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : null;\n\n const successMessage = getObservationResult(event) === \"success\";\n\n // For view commands or successful edits with content changes, format as code block\n if (\n (successMessage &&\n \"old_content\" in observation &&\n \"new_content\" in observation &&\n observation.old_content &&\n observation.new_content) ||\n observation.command === \"view\"\n ) {\n // Prefer content over output for view commands, fallback to output if content is not available\n const displayContent = textContent || observation.output;\n return `\\`\\`\\`\\n${displayContent}\\n\\`\\`\\``;\n }\n\n // For other commands, prefer content if available, otherwise use output\n return textContent || observation.output;\n};\n\n// Command Observations\nconst getTerminalObservationContent = (\n event: ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = textContent || \"\";\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n // Build the output string\n let output = \"\";\n\n // Display the command if available\n if (observation.command) {\n output += `Command: \\`${observation.command}\\`\\n\\n`;\n }\n\n // Display the output\n output += `Output:\\n\\`\\`\\`sh\\n${content.trim() || i18n.t(I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\\n\\`\\`\\``;\n\n return output;\n};\n\n// Tool Observations\nconst getBrowserObservationContent = (\n event: ObservationEvent<BrowserObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : observation.output || \"\";\n\n let contentDetails = \"\";\n\n if (observation.error) {\n contentDetails += `**Error:**\\n${observation.error}`;\n } else if (textContent) {\n contentDetails += `**Output:**\\n${textContent}`;\n } else {\n contentDetails += \"Browser action completed successfully.\";\n }\n\n if (contentDetails.length > MAX_CONTENT_LENGTH) {\n contentDetails = `${contentDetails.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return contentDetails;\n};\n\nconst getMCPToolObservationContent = (\n event: ObservationEvent<MCPToolObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Tool:** ${observation.tool_name}\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += `**Result:**\\n${textContent}`;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n return content;\n};\n\n// Invoke-skill observations\nconst getInvokeSkillObservationContent = (\n event: ObservationEvent<InvokeSkillObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n const header = observation.skill_name\n ? `**Skill:** \\`${observation.skill_name}\\`\\n\\n`\n : \"\";\n const body = observation.is_error\n ? `**Error:**\\n${textContent}`\n : textContent;\n\n let content = `${header}${body}`;\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n return content;\n};\n\n// Canvas UI observations — just surface the acknowledgement text.\nconst getCanvasUIObservationContent = (\n event: ObservationEvent<CanvasUIObservation>,\n): string =>\n event.observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\nconst getSwitchLLMObservationContent = (\n event: ObservationEvent<SwitchLLMObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n if (observation.is_error) {\n return textContent\n ? `**Error:**\\n${textContent}`\n : `**Error:**\\nFailed to switch LLM profile \\`${observation.profile_name}\\`.`;\n }\n\n const parts = [`**Profile:** \\`${observation.profile_name}\\``];\n if (observation.active_model) {\n parts.push(`**Active model:** \\`${observation.active_model}\\``);\n }\n if (observation.reason) {\n parts.push(`**Reason:** ${observation.reason}`);\n }\n\n return parts.join(\"\\n\");\n};\n\n// Complex Observations\nconst getTaskTrackerObservationContent = (\n event: ObservationEvent<TaskTrackerObservation>,\n): string => {\n const { observation } = event;\n\n const { command, task_list: taskList } = observation;\n let content = `**Command:** \\`${command}\\``;\n\n if (command === \"plan\" && taskList.length > 0) {\n content += `\\n\\n**Task List (${taskList.length} ${taskList.length === 1 ? \"item\" : \"items\"}):**\\n`;\n\n taskList.forEach((task, index: number) => {\n const statusMap = {\n todo: \"⏳\",\n in_progress: \"🔄\",\n done: \"✅\",\n };\n const statusIcon =\n statusMap[task.status as keyof typeof statusMap] || \"❓\";\n\n content += `\\n${index + 1}. ${statusIcon} **[${task.status.toUpperCase().replace(\"_\", \" \")}]** ${task.title}`;\n if (task.notes) {\n content += `\\n *Notes: ${task.notes}*`;\n }\n });\n } else if (command === \"plan\") {\n content += \"\\n\\n**Task List:** Empty\";\n }\n\n if (\n \"content\" in observation &&\n observation.content &&\n typeof observation.content === \"string\" &&\n observation.content.trim()\n ) {\n content += `\\n\\n**Result:** ${observation.content.trim()}`;\n }\n\n return content;\n};\n\n// Simple Observations\nconst getThinkObservationContent = (\n event: ObservationEvent<ThinkObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n return textContent || \"\";\n};\n\nconst getFinishObservationContent = (\n event: ObservationEvent<FinishObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = \"\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += textContent;\n }\n\n return content;\n};\n\n// Glob Observations\nconst getGlobObservationContent = (\n event: ObservationEvent<GlobObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.files.length === 0) {\n content += \"**Result:** No files found.\";\n } else {\n content += `**Files Found (${observation.files.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.files.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\n// Grep Observations\nconst getGrepObservationContent = (\n event: ObservationEvent<GrepObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n`;\n if (observation.include_pattern) {\n content += `**Include:** \\`${observation.include_pattern}\\`\\n`;\n }\n content += \"\\n\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.matches.length === 0) {\n content += \"**Result:** No matches found.\";\n } else {\n content += `**Matches (${observation.matches.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.matches.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\nexport const getObservationContent = (event: ObservationEvent): string => {\n const observationType = event.observation.kind;\n\n switch (observationType) {\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n return getFileEditorObservationContent(\n event as ObservationEvent<\n FileEditorObservation | StrReplaceEditorObservation\n >,\n );\n\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n return getTerminalObservationContent(\n event as ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n );\n\n case \"BrowserObservation\":\n return getBrowserObservationContent(\n event as ObservationEvent<BrowserObservation>,\n );\n\n case \"MCPToolObservation\":\n return getMCPToolObservationContent(\n event as ObservationEvent<MCPToolObservation>,\n );\n\n case \"TaskTrackerObservation\":\n return getTaskTrackerObservationContent(\n event as ObservationEvent<TaskTrackerObservation>,\n );\n\n case \"ThinkObservation\":\n return getThinkObservationContent(\n event as ObservationEvent<ThinkObservation>,\n );\n\n case \"FinishObservation\":\n return getFinishObservationContent(\n event as ObservationEvent<FinishObservation>,\n );\n\n case \"GlobObservation\":\n return getGlobObservationContent(\n event as ObservationEvent<GlobObservation>,\n );\n\n case \"GrepObservation\":\n return getGrepObservationContent(\n event as ObservationEvent<GrepObservation>,\n );\n\n case \"InvokeSkillObservation\":\n return getInvokeSkillObservationContent(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n\n case \"CanvasUIObservation\":\n return getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n );\n\n case \"SwitchLLMObservation\":\n return getSwitchLLMObservationContent(\n event as ObservationEvent<SwitchLLMObservation>,\n );\n\n default:\n return getDefaultEventContent(event);\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-observation-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-observation-content.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { ObservationEvent } from \"#/types/agent-server/core\";\nimport { getObservationResult } from \"./get-observation-result\";\nimport { getDefaultEventContent, MAX_CONTENT_LENGTH } from \"./shared\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n MCPToolObservation,\n FinishObservation,\n ThinkObservation,\n BrowserObservation,\n ExecuteBashObservation,\n TerminalObservation,\n FileEditorObservation,\n StrReplaceEditorObservation,\n TaskTrackerObservation,\n GlobObservation,\n GrepObservation,\n InvokeSkillObservation,\n CanvasUIObservation,\n SwitchLLMObservation,\n} from \"#/types/agent-server/core/base/observation\";\n\n// File Editor Observations\nconst getFileEditorObservationContent = (\n event: ObservationEvent<FileEditorObservation | StrReplaceEditorObservation>,\n): string => {\n const { observation } = event;\n\n if (observation.error) {\n return `**Error:**\\n${observation.error}`;\n }\n\n // Extract text content from the observation if it exists\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : null;\n\n const successMessage = getObservationResult(event) === \"success\";\n\n // For view commands or successful edits with content changes, format as code block\n if (\n (successMessage &&\n \"old_content\" in observation &&\n \"new_content\" in observation &&\n observation.old_content &&\n observation.new_content) ||\n observation.command === \"view\"\n ) {\n // Prefer content over output for view commands, fallback to output if content is not available\n const displayContent = textContent || observation.output;\n return `\\`\\`\\`\\n${displayContent}\\n\\`\\`\\``;\n }\n\n // For other commands, prefer content if available, otherwise use output\n return textContent || observation.output;\n};\n\n// Command Observations\nconst getTerminalObservationContent = (\n event: ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = textContent || \"\";\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n // Build the output string\n let output = \"\";\n\n // Display the command if available\n if (observation.command) {\n output += `Command: \\`${observation.command}\\`\\n\\n`;\n }\n\n // Display the output\n output += `Output:\\n\\`\\`\\`sh\\n${content.trim() || i18n.t(I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\\n\\`\\`\\``;\n\n return output;\n};\n\n// Tool Observations\nconst getBrowserObservationContent = (\n event: ObservationEvent<BrowserObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : observation.output || \"\";\n\n let contentDetails = \"\";\n\n if (observation.error) {\n contentDetails += `**Error:**\\n${observation.error}`;\n } else if (textContent) {\n contentDetails += `**Output:**\\n${textContent}`;\n } else {\n contentDetails += \"Browser action completed successfully.\";\n }\n\n if (contentDetails.length > MAX_CONTENT_LENGTH) {\n contentDetails = `${contentDetails.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return contentDetails;\n};\n\nconst getMCPToolObservationContent = (\n event: ObservationEvent<MCPToolObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Tool:** ${observation.tool_name}\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += `**Result:**\\n${textContent}`;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n return content;\n};\n\n// Invoke-skill observations\nconst getInvokeSkillObservationContent = (\n event: ObservationEvent<InvokeSkillObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n const header = observation.skill_name\n ? `**Skill:** \\`${observation.skill_name}\\`\\n\\n`\n : \"\";\n const body = observation.is_error\n ? `**Error:**\\n${textContent}`\n : textContent;\n\n let content = `${header}${body}`;\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n return content;\n};\n\n// Canvas UI observations — just surface the acknowledgement text.\nconst getCanvasUIObservationContent = (\n event: ObservationEvent<CanvasUIObservation>,\n): string =>\n event.observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\nconst getSwitchLLMObservationContent = (\n event: ObservationEvent<SwitchLLMObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n if (observation.is_error) {\n return textContent\n ? `**Error:**\\n${textContent}`\n : `**Error:**\\nFailed to switch LLM profile \\`${observation.profile_name}\\`.`;\n }\n\n const parts = [`**Profile:** \\`${observation.profile_name}\\``];\n if (observation.active_model) {\n parts.push(`**Active model:** \\`${observation.active_model}\\``);\n }\n if (observation.reason) {\n parts.push(`**Reason:** ${observation.reason}`);\n }\n\n return parts.join(\"\\n\");\n};\n\n// Complex Observations\nconst getTaskTrackerObservationContent = (\n event: ObservationEvent<TaskTrackerObservation>,\n): string => {\n const { observation } = event;\n\n const { command, task_list: taskList } = observation;\n let content = `**Command:** \\`${command}\\``;\n\n if (command === \"plan\" && taskList.length > 0) {\n content += `\\n\\n**Task List (${taskList.length} ${taskList.length === 1 ? \"item\" : \"items\"}):**\\n`;\n\n taskList.forEach((task, index: number) => {\n const statusMap = {\n todo: \"⏳\",\n in_progress: \"🔄\",\n done: \"✅\",\n };\n const statusIcon =\n statusMap[task.status as keyof typeof statusMap] || \"❓\";\n\n content += `\\n${index + 1}. ${statusIcon} **[${task.status.toUpperCase().replace(\"_\", \" \")}]** ${task.title}`;\n if (task.notes) {\n content += `\\n *Notes: ${task.notes}*`;\n }\n });\n } else if (command === \"plan\") {\n content += \"\\n\\n**Task List:** Empty\";\n }\n\n if (\n \"content\" in observation &&\n observation.content &&\n typeof observation.content === \"string\" &&\n observation.content.trim()\n ) {\n content += `\\n\\n**Result:** ${observation.content.trim()}`;\n }\n\n return content;\n};\n\n// Simple Observations\nconst getThinkObservationContent = (\n event: ObservationEvent<ThinkObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n return textContent || \"\";\n};\n\nconst getFinishObservationContent = (\n event: ObservationEvent<FinishObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = \"\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += textContent;\n }\n\n return content;\n};\n\n// Glob Observations\nconst getGlobObservationContent = (\n event: ObservationEvent<GlobObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.files.length === 0) {\n content += \"**Result:** No files found.\";\n } else {\n content += `**Files Found (${observation.files.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.files.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\n// Grep Observations\nconst getGrepObservationContent = (\n event: ObservationEvent<GrepObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n`;\n if (observation.include_pattern) {\n content += `**Include:** \\`${observation.include_pattern}\\`\\n`;\n }\n content += \"\\n\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.matches.length === 0) {\n content += \"**Result:** No matches found.\";\n } else {\n content += `**Matches (${observation.matches.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.matches.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\nexport const getObservationContent = (event: ObservationEvent): string => {\n const observationType = event.observation.kind;\n\n switch (observationType) {\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n return getFileEditorObservationContent(\n event as ObservationEvent<\n FileEditorObservation | StrReplaceEditorObservation\n >,\n );\n\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n return getTerminalObservationContent(\n event as ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n );\n\n case \"BrowserObservation\":\n return getBrowserObservationContent(\n event as ObservationEvent<BrowserObservation>,\n );\n\n case \"MCPToolObservation\":\n return getMCPToolObservationContent(\n event as ObservationEvent<MCPToolObservation>,\n );\n\n case \"TaskTrackerObservation\":\n return getTaskTrackerObservationContent(\n event as ObservationEvent<TaskTrackerObservation>,\n );\n\n case \"ThinkObservation\":\n return getThinkObservationContent(\n event as ObservationEvent<ThinkObservation>,\n );\n\n case \"FinishObservation\":\n return getFinishObservationContent(\n event as ObservationEvent<FinishObservation>,\n );\n\n case \"GlobObservation\":\n return getGlobObservationContent(\n event as ObservationEvent<GlobObservation>,\n );\n\n case \"GrepObservation\":\n return getGrepObservationContent(\n event as ObservationEvent<GrepObservation>,\n );\n\n case \"InvokeSkillObservation\":\n return getInvokeSkillObservationContent(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n\n case \"CanvasUIObservation\":\n return getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n );\n\n case \"ClientToolObservation\":\n return event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME\n ? getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n )\n : getDefaultEventContent(event);\n\n case \"SwitchLLMObservation\":\n return getSwitchLLMObservationContent(\n event as ObservationEvent<SwitchLLMObservation>,\n );\n\n default:\n return getDefaultEventContent(event);\n }\n};\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { I18nKey as e } from "../../../../i18n/declaration.js";
2
2
  import t from "../../../../i18n/index.js";
3
+ import "../../../../constants/canvas-ui.js";
3
4
  import { MAX_CONTENT_LENGTH as n, getDefaultEventContent as r } from "./shared.js";
4
5
  import { getObservationResult as i } from "./get-observation-result.js";
5
6
  //#region src/components/conversation-events/chat/event-content-helpers/get-observation-content.ts
@@ -64,6 +65,7 @@ var a = (e) => {
64
65
  case "GrepObservation": return g(e);
65
66
  case "InvokeSkillObservation": return l(e);
66
67
  case "CanvasUIObservation": return u(e);
68
+ case "ClientToolObservation": return e.tool_name === "canvas_ui_control" ? u(e) : r(e);
67
69
  case "SwitchLLMObservation": return d(e);
68
70
  default: return r(e);
69
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-observation-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-observation-content.ts"],"sourcesContent":["import { ObservationEvent } from \"#/types/agent-server/core\";\nimport { getObservationResult } from \"./get-observation-result\";\nimport { getDefaultEventContent, MAX_CONTENT_LENGTH } from \"./shared\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n MCPToolObservation,\n FinishObservation,\n ThinkObservation,\n BrowserObservation,\n ExecuteBashObservation,\n TerminalObservation,\n FileEditorObservation,\n StrReplaceEditorObservation,\n TaskTrackerObservation,\n GlobObservation,\n GrepObservation,\n InvokeSkillObservation,\n CanvasUIObservation,\n SwitchLLMObservation,\n} from \"#/types/agent-server/core/base/observation\";\n\n// File Editor Observations\nconst getFileEditorObservationContent = (\n event: ObservationEvent<FileEditorObservation | StrReplaceEditorObservation>,\n): string => {\n const { observation } = event;\n\n if (observation.error) {\n return `**Error:**\\n${observation.error}`;\n }\n\n // Extract text content from the observation if it exists\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : null;\n\n const successMessage = getObservationResult(event) === \"success\";\n\n // For view commands or successful edits with content changes, format as code block\n if (\n (successMessage &&\n \"old_content\" in observation &&\n \"new_content\" in observation &&\n observation.old_content &&\n observation.new_content) ||\n observation.command === \"view\"\n ) {\n // Prefer content over output for view commands, fallback to output if content is not available\n const displayContent = textContent || observation.output;\n return `\\`\\`\\`\\n${displayContent}\\n\\`\\`\\``;\n }\n\n // For other commands, prefer content if available, otherwise use output\n return textContent || observation.output;\n};\n\n// Command Observations\nconst getTerminalObservationContent = (\n event: ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = textContent || \"\";\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n // Build the output string\n let output = \"\";\n\n // Display the command if available\n if (observation.command) {\n output += `Command: \\`${observation.command}\\`\\n\\n`;\n }\n\n // Display the output\n output += `Output:\\n\\`\\`\\`sh\\n${content.trim() || i18n.t(I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\\n\\`\\`\\``;\n\n return output;\n};\n\n// Tool Observations\nconst getBrowserObservationContent = (\n event: ObservationEvent<BrowserObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : observation.output || \"\";\n\n let contentDetails = \"\";\n\n if (observation.error) {\n contentDetails += `**Error:**\\n${observation.error}`;\n } else if (textContent) {\n contentDetails += `**Output:**\\n${textContent}`;\n } else {\n contentDetails += \"Browser action completed successfully.\";\n }\n\n if (contentDetails.length > MAX_CONTENT_LENGTH) {\n contentDetails = `${contentDetails.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return contentDetails;\n};\n\nconst getMCPToolObservationContent = (\n event: ObservationEvent<MCPToolObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Tool:** ${observation.tool_name}\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += `**Result:**\\n${textContent}`;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n return content;\n};\n\n// Invoke-skill observations\nconst getInvokeSkillObservationContent = (\n event: ObservationEvent<InvokeSkillObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n const header = observation.skill_name\n ? `**Skill:** \\`${observation.skill_name}\\`\\n\\n`\n : \"\";\n const body = observation.is_error\n ? `**Error:**\\n${textContent}`\n : textContent;\n\n let content = `${header}${body}`;\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n return content;\n};\n\n// Canvas UI observations — just surface the acknowledgement text.\nconst getCanvasUIObservationContent = (\n event: ObservationEvent<CanvasUIObservation>,\n): string =>\n event.observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\nconst getSwitchLLMObservationContent = (\n event: ObservationEvent<SwitchLLMObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n if (observation.is_error) {\n return textContent\n ? `**Error:**\\n${textContent}`\n : `**Error:**\\nFailed to switch LLM profile \\`${observation.profile_name}\\`.`;\n }\n\n const parts = [`**Profile:** \\`${observation.profile_name}\\``];\n if (observation.active_model) {\n parts.push(`**Active model:** \\`${observation.active_model}\\``);\n }\n if (observation.reason) {\n parts.push(`**Reason:** ${observation.reason}`);\n }\n\n return parts.join(\"\\n\");\n};\n\n// Complex Observations\nconst getTaskTrackerObservationContent = (\n event: ObservationEvent<TaskTrackerObservation>,\n): string => {\n const { observation } = event;\n\n const { command, task_list: taskList } = observation;\n let content = `**Command:** \\`${command}\\``;\n\n if (command === \"plan\" && taskList.length > 0) {\n content += `\\n\\n**Task List (${taskList.length} ${taskList.length === 1 ? \"item\" : \"items\"}):**\\n`;\n\n taskList.forEach((task, index: number) => {\n const statusMap = {\n todo: \"⏳\",\n in_progress: \"🔄\",\n done: \"✅\",\n };\n const statusIcon =\n statusMap[task.status as keyof typeof statusMap] || \"❓\";\n\n content += `\\n${index + 1}. ${statusIcon} **[${task.status.toUpperCase().replace(\"_\", \" \")}]** ${task.title}`;\n if (task.notes) {\n content += `\\n *Notes: ${task.notes}*`;\n }\n });\n } else if (command === \"plan\") {\n content += \"\\n\\n**Task List:** Empty\";\n }\n\n if (\n \"content\" in observation &&\n observation.content &&\n typeof observation.content === \"string\" &&\n observation.content.trim()\n ) {\n content += `\\n\\n**Result:** ${observation.content.trim()}`;\n }\n\n return content;\n};\n\n// Simple Observations\nconst getThinkObservationContent = (\n event: ObservationEvent<ThinkObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n return textContent || \"\";\n};\n\nconst getFinishObservationContent = (\n event: ObservationEvent<FinishObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = \"\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += textContent;\n }\n\n return content;\n};\n\n// Glob Observations\nconst getGlobObservationContent = (\n event: ObservationEvent<GlobObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.files.length === 0) {\n content += \"**Result:** No files found.\";\n } else {\n content += `**Files Found (${observation.files.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.files.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\n// Grep Observations\nconst getGrepObservationContent = (\n event: ObservationEvent<GrepObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n`;\n if (observation.include_pattern) {\n content += `**Include:** \\`${observation.include_pattern}\\`\\n`;\n }\n content += \"\\n\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.matches.length === 0) {\n content += \"**Result:** No matches found.\";\n } else {\n content += `**Matches (${observation.matches.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.matches.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\nexport const getObservationContent = (event: ObservationEvent): string => {\n const observationType = event.observation.kind;\n\n switch (observationType) {\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n return getFileEditorObservationContent(\n event as ObservationEvent<\n FileEditorObservation | StrReplaceEditorObservation\n >,\n );\n\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n return getTerminalObservationContent(\n event as ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n );\n\n case \"BrowserObservation\":\n return getBrowserObservationContent(\n event as ObservationEvent<BrowserObservation>,\n );\n\n case \"MCPToolObservation\":\n return getMCPToolObservationContent(\n event as ObservationEvent<MCPToolObservation>,\n );\n\n case \"TaskTrackerObservation\":\n return getTaskTrackerObservationContent(\n event as ObservationEvent<TaskTrackerObservation>,\n );\n\n case \"ThinkObservation\":\n return getThinkObservationContent(\n event as ObservationEvent<ThinkObservation>,\n );\n\n case \"FinishObservation\":\n return getFinishObservationContent(\n event as ObservationEvent<FinishObservation>,\n );\n\n case \"GlobObservation\":\n return getGlobObservationContent(\n event as ObservationEvent<GlobObservation>,\n );\n\n case \"GrepObservation\":\n return getGrepObservationContent(\n event as ObservationEvent<GrepObservation>,\n );\n\n case \"InvokeSkillObservation\":\n return getInvokeSkillObservationContent(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n\n case \"CanvasUIObservation\":\n return getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n );\n\n case \"SwitchLLMObservation\":\n return getSwitchLLMObservationContent(\n event as ObservationEvent<SwitchLLMObservation>,\n );\n\n default:\n return getDefaultEventContent(event);\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-observation-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-observation-content.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport { ObservationEvent } from \"#/types/agent-server/core\";\nimport { getObservationResult } from \"./get-observation-result\";\nimport { getDefaultEventContent, MAX_CONTENT_LENGTH } from \"./shared\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n MCPToolObservation,\n FinishObservation,\n ThinkObservation,\n BrowserObservation,\n ExecuteBashObservation,\n TerminalObservation,\n FileEditorObservation,\n StrReplaceEditorObservation,\n TaskTrackerObservation,\n GlobObservation,\n GrepObservation,\n InvokeSkillObservation,\n CanvasUIObservation,\n SwitchLLMObservation,\n} from \"#/types/agent-server/core/base/observation\";\n\n// File Editor Observations\nconst getFileEditorObservationContent = (\n event: ObservationEvent<FileEditorObservation | StrReplaceEditorObservation>,\n): string => {\n const { observation } = event;\n\n if (observation.error) {\n return `**Error:**\\n${observation.error}`;\n }\n\n // Extract text content from the observation if it exists\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : null;\n\n const successMessage = getObservationResult(event) === \"success\";\n\n // For view commands or successful edits with content changes, format as code block\n if (\n (successMessage &&\n \"old_content\" in observation &&\n \"new_content\" in observation &&\n observation.old_content &&\n observation.new_content) ||\n observation.command === \"view\"\n ) {\n // Prefer content over output for view commands, fallback to output if content is not available\n const displayContent = textContent || observation.output;\n return `\\`\\`\\`\\n${displayContent}\\n\\`\\`\\``;\n }\n\n // For other commands, prefer content if available, otherwise use output\n return textContent || observation.output;\n};\n\n// Command Observations\nconst getTerminalObservationContent = (\n event: ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = textContent || \"\";\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n // Build the output string\n let output = \"\";\n\n // Display the command if available\n if (observation.command) {\n output += `Command: \\`${observation.command}\\`\\n\\n`;\n }\n\n // Display the output\n output += `Output:\\n\\`\\`\\`sh\\n${content.trim() || i18n.t(I18nKey.OBSERVATION$COMMAND_NO_OUTPUT)}\\n\\`\\`\\``;\n\n return output;\n};\n\n// Tool Observations\nconst getBrowserObservationContent = (\n event: ObservationEvent<BrowserObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent =\n \"content\" in observation && Array.isArray(observation.content)\n ? observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\")\n : observation.output || \"\";\n\n let contentDetails = \"\";\n\n if (observation.error) {\n contentDetails += `**Error:**\\n${observation.error}`;\n } else if (textContent) {\n contentDetails += `**Output:**\\n${textContent}`;\n } else {\n contentDetails += \"Browser action completed successfully.\";\n }\n\n if (contentDetails.length > MAX_CONTENT_LENGTH) {\n contentDetails = `${contentDetails.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return contentDetails;\n};\n\nconst getMCPToolObservationContent = (\n event: ObservationEvent<MCPToolObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Tool:** ${observation.tool_name}\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += `**Result:**\\n${textContent}`;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...`;\n }\n\n return content;\n};\n\n// Invoke-skill observations\nconst getInvokeSkillObservationContent = (\n event: ObservationEvent<InvokeSkillObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n const header = observation.skill_name\n ? `**Skill:** \\`${observation.skill_name}\\`\\n\\n`\n : \"\";\n const body = observation.is_error\n ? `**Error:**\\n${textContent}`\n : textContent;\n\n let content = `${header}${body}`;\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n return content;\n};\n\n// Canvas UI observations — just surface the acknowledgement text.\nconst getCanvasUIObservationContent = (\n event: ObservationEvent<CanvasUIObservation>,\n): string =>\n event.observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\nconst getSwitchLLMObservationContent = (\n event: ObservationEvent<SwitchLLMObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n if (observation.is_error) {\n return textContent\n ? `**Error:**\\n${textContent}`\n : `**Error:**\\nFailed to switch LLM profile \\`${observation.profile_name}\\`.`;\n }\n\n const parts = [`**Profile:** \\`${observation.profile_name}\\``];\n if (observation.active_model) {\n parts.push(`**Active model:** \\`${observation.active_model}\\``);\n }\n if (observation.reason) {\n parts.push(`**Reason:** ${observation.reason}`);\n }\n\n return parts.join(\"\\n\");\n};\n\n// Complex Observations\nconst getTaskTrackerObservationContent = (\n event: ObservationEvent<TaskTrackerObservation>,\n): string => {\n const { observation } = event;\n\n const { command, task_list: taskList } = observation;\n let content = `**Command:** \\`${command}\\``;\n\n if (command === \"plan\" && taskList.length > 0) {\n content += `\\n\\n**Task List (${taskList.length} ${taskList.length === 1 ? \"item\" : \"items\"}):**\\n`;\n\n taskList.forEach((task, index: number) => {\n const statusMap = {\n todo: \"⏳\",\n in_progress: \"🔄\",\n done: \"✅\",\n };\n const statusIcon =\n statusMap[task.status as keyof typeof statusMap] || \"❓\";\n\n content += `\\n${index + 1}. ${statusIcon} **[${task.status.toUpperCase().replace(\"_\", \" \")}]** ${task.title}`;\n if (task.notes) {\n content += `\\n *Notes: ${task.notes}*`;\n }\n });\n } else if (command === \"plan\") {\n content += \"\\n\\n**Task List:** Empty\";\n }\n\n if (\n \"content\" in observation &&\n observation.content &&\n typeof observation.content === \"string\" &&\n observation.content.trim()\n ) {\n content += `\\n\\n**Result:** ${observation.content.trim()}`;\n }\n\n return content;\n};\n\n// Simple Observations\nconst getThinkObservationContent = (\n event: ObservationEvent<ThinkObservation>,\n): string => {\n const { observation } = event;\n\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n return textContent || \"\";\n};\n\nconst getFinishObservationContent = (\n event: ObservationEvent<FinishObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = \"\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else {\n content += textContent;\n }\n\n return content;\n};\n\n// Glob Observations\nconst getGlobObservationContent = (\n event: ObservationEvent<GlobObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n\\n`;\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.files.length === 0) {\n content += \"**Result:** No files found.\";\n } else {\n content += `**Files Found (${observation.files.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.files.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\n// Grep Observations\nconst getGrepObservationContent = (\n event: ObservationEvent<GrepObservation>,\n): string => {\n const { observation } = event;\n\n // Extract text content from the observation\n const textContent = observation.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n let content = `**Pattern:** \\`${observation.pattern}\\`\\n`;\n content += `**Search Path:** \\`${observation.search_path}\\`\\n`;\n if (observation.include_pattern) {\n content += `**Include:** \\`${observation.include_pattern}\\`\\n`;\n }\n content += \"\\n\";\n\n if (observation.is_error) {\n content += `**Error:**\\n${textContent}`;\n } else if (observation.matches.length === 0) {\n content += \"**Result:** No matches found.\";\n } else {\n content += `**Matches (${observation.matches.length}${observation.truncated ? \"+, truncated\" : \"\"}):**\\n`;\n content += observation.matches.map((f) => `- \\`${f}\\``).join(\"\\n\");\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = `${content.slice(0, MAX_CONTENT_LENGTH)}...(truncated)`;\n }\n\n return content;\n};\n\nexport const getObservationContent = (event: ObservationEvent): string => {\n const observationType = event.observation.kind;\n\n switch (observationType) {\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n return getFileEditorObservationContent(\n event as ObservationEvent<\n FileEditorObservation | StrReplaceEditorObservation\n >,\n );\n\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n return getTerminalObservationContent(\n event as ObservationEvent<ExecuteBashObservation | TerminalObservation>,\n );\n\n case \"BrowserObservation\":\n return getBrowserObservationContent(\n event as ObservationEvent<BrowserObservation>,\n );\n\n case \"MCPToolObservation\":\n return getMCPToolObservationContent(\n event as ObservationEvent<MCPToolObservation>,\n );\n\n case \"TaskTrackerObservation\":\n return getTaskTrackerObservationContent(\n event as ObservationEvent<TaskTrackerObservation>,\n );\n\n case \"ThinkObservation\":\n return getThinkObservationContent(\n event as ObservationEvent<ThinkObservation>,\n );\n\n case \"FinishObservation\":\n return getFinishObservationContent(\n event as ObservationEvent<FinishObservation>,\n );\n\n case \"GlobObservation\":\n return getGlobObservationContent(\n event as ObservationEvent<GlobObservation>,\n );\n\n case \"GrepObservation\":\n return getGrepObservationContent(\n event as ObservationEvent<GrepObservation>,\n );\n\n case \"InvokeSkillObservation\":\n return getInvokeSkillObservationContent(\n event as ObservationEvent<InvokeSkillObservation>,\n );\n\n case \"CanvasUIObservation\":\n return getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n );\n\n case \"ClientToolObservation\":\n return event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME\n ? getCanvasUIObservationContent(\n event as ObservationEvent<CanvasUIObservation>,\n )\n : getDefaultEventContent(event);\n\n case \"SwitchLLMObservation\":\n return getSwitchLLMObservationContent(\n event as ObservationEvent<SwitchLLMObservation>,\n );\n\n default:\n return getDefaultEventContent(event);\n }\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../utils/utils.cjs`),i=require(`../../../context/navigation-context.cjs`),a=require(`../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs`);require(`../../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const o=require(`../../../api/agent-server-config.cjs`),s=require(`../../../api/agent-server-client-options.cjs`),c=require(`../../../api/agent-server-compatibility.cjs`),l=require(`../../../utils/user-facing-error.cjs`),u=require(`../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs`),d=require(`../../../contexts/active-backend-context.cjs`),f=require(`../../../hooks/use-tracking.cjs`),p=require(`../../shared/modals/modal-backdrop.cjs`),m=require(`../../shared/modals/modal-body.cjs`),h=require(`../../../utils/modal-classes.cjs`),g=require(`../../shared/modals/modal-close-button.cjs`),_=require(`../settings/brand-button.cjs`),v=require(`../settings/settings-input.cjs`),y=require(`../../../hooks/query/use-backends-health.cjs`),b=require(`../../../assets/branding/openhands-logo-white.cjs`),x=require(`../files-tab/segmented-toggle.cjs`),S=require(`../../../api/device-flow-client.cjs`),C=require(`../../../icons/chevron-down-small.cjs`),w=require(`./backend-status-label.cjs`),T=require(`./backend-status-dot.cjs`),E=require(`./device-flow-auth.cjs`);let D=require(`react`);D=e.__toESM(D,1);let O=require(`react/jsx-runtime`);function k(e){return S.isOpenHandsCloudHost(e)?`cloud`:`local`}function A(e){let t=e.toLowerCase().replace(/^\[|\]$/g,``);return!!(t===`localhost`||t===`::1`||t===`::`||t===`0.0.0.0`||/^127\./.test(t)||/^::ffff:127\./i.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^fe[89ab][0-9a-f]:/i.test(t)||/^f[cd][0-9a-f]{2}:/i.test(t)||t.endsWith(`.local`)||!t.includes(`.`)&&!t.includes(`:`))}function j(e){let t=e.trim().replace(/\/+$/,``);if(!t)return``;if(/^https?:\/\//i.test(t))return t;let n=t.match(/^\[([^\]]+)\]/);return`${A(n?n[1]:(t.match(/:/g)??[]).length>1?t:t.split(`:`)[0])?`http`:`https`}://${t}`}function M(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=j(t);if(!n)return!1;try{let e=new URL(n);return(e.protocol===`http:`||e.protocol===`https:`)&&e.hostname.length>0}catch{return!1}}var N=`https://app.all-hands.dev`;function P(e,t){return e(n.I18nKey.BACKEND$CONNECTION_TEST_FAILED,{host:t,interpolation:{escapeValue:!1}})}function F(e){return l.getUserFacingConnectionErrorMessage(e)}function I(e,t){let n=F(t);return n?`${e}\n${n}`:e}async function L(e){e.kind===`local`&&c.assertAgentServerVersionIsSupported(await new a.ServerClient(s.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo())}function R({backend:e,testIdRoot:r}){let{t:i}=t.useTranslation(`openhands`),o=y.useBackendsHealth([e])[e.id],l=o?.isConnected??null,d=o?.disabled===!0,f=o?.consecutiveFailures??0,p=o?.lastError??null,{data:m}=u.useQuery({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>c.getDisplayAgentServerVersion(await new a.ServerClient(s.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`&&!d}),h=w.getBackendStatusLabel(i,e,o),g=e.kind===`cloud`?i(n.I18nKey.BACKEND$KIND_CLOUD):i(n.I18nKey.BACKEND$KIND_LOCAL);return(0,O.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,O.jsxs)(`div`,{"data-testid":`${r}-status`,className:`flex items-center gap-3 text-sm`,children:[(0,O.jsx)(T.BackendStatusDot,{isConnected:l}),(0,O.jsx)(`span`,{className:`text-white`,"data-testid":`${r}-status-label`,children:h}),(0,O.jsx)(`span`,{className:`text-tertiary-alt`,children:`·`}),(0,O.jsx)(`span`,{className:`text-[var(--oh-text-tertiary)]`,children:g}),m?(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-version`,children:i(n.I18nKey.BACKEND$VERSION_LABEL,{version:m})}):null]}),d?(0,O.jsxs)(`div`,{"data-testid":`${r}-status-error`,className:`flex flex-col gap-1 rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm`,children:[(0,O.jsx)(`span`,{className:`font-semibold text-red-300`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_TITLE)}),(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-text-tertiary)]`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_DETAIL,{count:f})}),p?(0,O.jsx)(`span`,{"data-testid":`${r}-status-error-message`,className:`text-xs text-red-300 whitespace-pre-wrap break-words`,children:p}):null]}):null]})}function z({initialName:e=``,initialHost:n=``,initialApiKey:r=``,onTestConnection:i,onSuccess:a,requireApiKey:o=!1,onSubmitOverride:s}){let{t:c}=t.useTranslation(`openhands`),[l,u]=D.default.useState(e),[d,f]=D.default.useState(n),[p,m]=D.default.useState(r),[h,g]=D.default.useState(null),[_,v]=D.default.useState(!1),[y,b]=D.default.useState(null),x=y??k(d),S=o||x!==`local`,C=l.trim().length>0&&M(d)&&(!S||p.trim().length>0);return{name:l,setName:u,host:d,setHost:f,apiKey:p,setApiKey:m,connectionError:h,setConnectionError:g,isSubmitting:_,kind:x,setKind:b,canSubmit:C,handleSubmit:D.default.useCallback(async e=>{if(e.preventDefault(),!C||_)return;let t={name:l.trim(),host:j(d),apiKey:p.trim(),kind:x};g(null),v(!0);try{s?await s(t):(await i(t),a())}catch(e){g(I(P(c,t.host),e))}finally{v(!1)}},[C,_,l,d,p,x,i,a,o,s,c])}}function B({mode:e,backend:i,onSubmitted:a,renderActions:o,testIdRoot:s,hostReadOnly:c,requireApiKey:l,hideConfigurationFields:u=!1,onSubmitOverride:f}){let{t:p}=t.useTranslation(`openhands`),{addBackend:m,updateBackend:h}=d.useActiveBackendContext(),g=e===`edit`&&i?i.kind:null,{name:y,setName:b,host:x,setHost:S,apiKey:C,setApiKey:w,connectionError:T,setConnectionError:E,isSubmitting:k,kind:A,handleSubmit:P}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:async()=>{let t={name:y.trim(),host:j(x),apiKey:C.trim(),kind:g??A};e===`edit`&&i?h(i.id,t):m(t),a()},requireApiKey:l,onSubmitOverride:f}),[F,I]=D.default.useState(!1),[B,V]=D.default.useState(!1),H=g??A,U=s??(e===`edit`?`edit-backend`:`add-backend`),W=l||H!==`local`,G=y.trim().length>0&&M(x)&&(!W||C.trim().length>0),K=F&&!y.trim()?p(n.I18nKey.BACKEND$NAME_REQUIRED):void 0,q=B?x.trim()?M(x)?void 0:p(n.I18nKey.BACKEND$HOST_INVALID):p(n.I18nKey.BACKEND$HOST_REQUIRED):void 0;return(0,O.jsxs)(`form`,{"data-testid":`${U}-form`,onSubmit:async e=>{if(!G){I(!0),V(!0);return}await P(e)},className:`flex flex-col gap-4`,children:[(0,O.jsxs)(`div`,{"data-testid":`${U}-configuration-fields`,className:r.cn(`flex flex-col gap-4`,u&&`hidden`),children:[(0,O.jsx)(v.SettingsInput,{testId:`${U}-name`,name:`${U}-name`,type:`text`,label:p(n.I18nKey.BACKEND$NAME_LABEL),value:y,onChange:e=>{b(e),E(null)},onBlur:()=>I(!0),placeholder:`Production`,className:`w-full`,showRequiredTag:!0,error:K}),(0,O.jsx)(v.SettingsInput,{testId:`${U}-host`,name:`${U}-host`,type:`text`,label:p(n.I18nKey.BACKEND$HOST_LABEL),value:x,onChange:c?void 0:e=>{S(e),E(null)},onBlur:()=>V(!0),placeholder:N,className:`w-full`,showRequiredTag:!0,error:q,isDisabled:c}),(0,O.jsx)(v.SettingsInput,{testId:`${U}-api-key`,name:`${U}-api-key`,type:`password`,label:p(n.I18nKey.BACKEND$KEY_LABEL),value:C,onChange:e=>{w(e),E(null)},placeholder:``,className:`w-full`}),T?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${U}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:T}):null,e===`edit`&&i&&(0,O.jsx)(R,{backend:i,testIdRoot:U})]}),o?o({canSubmit:G&&!k,isSubmitting:k,testIdRoot:U}):(0,O.jsxs)(`div`,{className:`flex justify-end gap-2 mt-2 w-full`,children:[(0,O.jsx)(_.BrandButton,{type:`button`,variant:`secondary`,onClick:a,testId:`${U}-cancel`,children:p(n.I18nKey.BUTTON$CANCEL)}),(0,O.jsx)(_.BrandButton,{type:`submit`,variant:`primary`,isDisabled:!G||k,testId:`${U}-submit`,children:p(n.I18nKey.BACKEND$SAVE)})]})]})}function V(){let{currentPath:e,navigate:t}=i.useNavigation();return D.default.useCallback(()=>{/^\/automations\/[^/]+/.test(e)?t(`/automations`):/^\/conversations\/[^/]+/.test(e)&&t(`/conversations`)},[e,t])}function H({onConnected:e,testIdRoot:r=`add-backend`,initialManualBackend:i,requireManualApiKey:a=!1,manualSubmitLabel:s,manualSubmittingLabel:c,manualSubmitTestId:l}){let{t:u}=t.useTranslation(`openhands`),d=o.getLockedCloudHost();return d?(0,O.jsx)(`div`,{"data-testid":`${r}-connection-options`,className:`flex justify-center`,children:(0,O.jsx)(`div`,{className:`w-full`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r,lockedHost:d})})}):(0,O.jsxs)(`div`,{"data-testid":`${r}-connection-options`,className:`flex flex-col gap-6 md:flex-row`,children:[(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(U,{onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:s??u(n.I18nKey.BACKEND$CONNECT),submittingLabel:c??u(n.I18nKey.ONBOARDING$BACKEND_STATUS_CHECKING),submitTestId:l})}),(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r})})]})}function U({onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o,submittingLabel:s,submitTestId:c}){let{t:l}=t.useTranslation(`openhands`),{name:u,setName:d,host:f,setHost:p,apiKey:m,setApiKey:h,connectionError:g,setConnectionError:y,isSubmitting:b,kind:S,setKind:C,canSubmit:w,handleSubmit:T}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:()=>{e({name:u.trim(),host:j(f),apiKey:m.trim(),kind:S},`manual`)},requireApiKey:a});return(0,O.jsxs)(`form`,{"data-testid":`${r}-form`,onSubmit:T,className:`flex flex-col gap-4 flex-1 min-w-0`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(v.SettingsInput,{testId:`${r}-name`,name:`${r}-name`,type:`text`,label:l(n.I18nKey.BACKEND$NAME_LABEL),value:u,onChange:e=>{d(e),y(null)},placeholder:`e.g. My Server`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,children:l(n.I18nKey.BACKEND$NAME_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(v.SettingsInput,{testId:`${r}-host`,name:`${r}-host`,type:`text`,label:l(n.I18nKey.BACKEND$HOST_LABEL),value:f,onChange:e=>{p(e),y(null)},placeholder:`http://localhost:8000`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-host-helper`,children:l(n.I18nKey.BACKEND$HOST_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col items-start gap-2.5`,children:[(0,O.jsx)(`span`,{className:`text-sm`,children:l(n.I18nKey.BACKEND$KIND_LABEL)}),(0,O.jsx)(x.SegmentedToggle,{value:S,options:[{value:`local`,label:l(n.I18nKey.BACKEND$KIND_LOCAL)},{value:`cloud`,label:l(n.I18nKey.BACKEND$KIND_CLOUD)}],onChange:e=>C(e),ariaLabel:l(n.I18nKey.BACKEND$KIND_LABEL),testId:`${r}-kind`})]}),(0,O.jsx)(v.SettingsInput,{testId:`${r}-api-key`,name:`${r}-api-key`,type:`password`,label:l(n.I18nKey.BACKEND$KEY_LABEL),value:m,onChange:e=>{h(e),y(null)},placeholder:`sk-••••••••••`,className:`w-full`}),g?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${r}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:g}):null,(0,O.jsx)(_.BrandButton,{type:`submit`,variant:`secondary`,isDisabled:!w||b,testId:c??`${r}-submit`,className:`w-full text-center`,children:b?s:o})]})}function W({onConnected:e,testIdRoot:i,lockedHost:a}){let{t:o}=t.useTranslation(`openhands`),[s,c]=D.default.useState(!1),[l,u]=D.default.useState(``),d=a??(l.trim()||N);return(0,O.jsxs)(`div`,{className:`flex flex-1 min-w-0 flex-col items-center gap-3 pb-8`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col items-center gap-1`,children:[(0,O.jsx)(b.default,{width:56,height:56,"aria-hidden":!0}),(0,O.jsx)(`h4`,{className:h.modalTitleLgMediumClassName,"data-testid":`${i}-cloud-title`,children:o(n.I18nKey.BACKEND$CLOUD_TITLE)})]}),(0,O.jsx)(`p`,{className:`text-center text-sm leading-relaxed text-[var(--oh-muted)]`,children:o(n.I18nKey.BACKEND$CLOUD_DESCRIPTION)}),(0,O.jsx)(E.DeviceFlowAuth,{host:d,onSuccess:t=>{e({name:`OpenHands Cloud`,host:j(d),apiKey:t,kind:`cloud`},`cloud_login`)},testIdRoot:i}),a?null:(0,O.jsxs)(`div`,{className:`w-full`,children:[(0,O.jsxs)(`button`,{type:`button`,onClick:()=>c(e=>!e),"aria-expanded":s,"data-testid":`${i}-advanced-toggle`,className:`flex w-full cursor-pointer items-center justify-center gap-1 text-center text-xs text-[var(--oh-muted)] transition-colors hover:text-content-2`,children:[(0,O.jsx)(`span`,{children:o(n.I18nKey.BACKEND$ADVANCED)}),(0,O.jsx)(C.default,{className:r.cn(`h-4 w-4 shrink-0 text-muted transition-transform`,s&&`rotate-180`),"aria-hidden":!0})]}),(0,O.jsxs)(`div`,{className:r.cn(`pt-2`,!s&&`pointer-events-none invisible`),"aria-hidden":!s,children:[(0,O.jsx)(v.SettingsInput,{testId:`${i}-cloud-host`,name:`${i}-cloud-host`,type:`text`,label:o(n.I18nKey.BACKEND$HOST_LABEL),value:l,onChange:u,placeholder:N,className:`w-full`}),(0,O.jsx)(`p`,{className:`mt-1 text-xs text-[var(--oh-muted)]`,children:o(n.I18nKey.BACKEND$LOGIN_CLOUD_HINT)})]})]})]})}function G({onClose:e,source:t}){let{addBackend:n}=d.useActiveBackendContext(),r=V(),{trackBackendAdded:i}=f.useTracking();return(0,O.jsx)(H,{onConnected:D.default.useCallback((a,o)=>{n(a);let s=a.host===N;i({backendKind:a.kind,connectionMethod:o,isOpenhandsCloud:s,isCustomHost:!s,hasApiKey:!!a.apiKey,source:t}),r(),e()},[n,r,e,i,t])})}function K({mode:e,backend:i,onClose:a,source:o=`add_backend_modal`,hideCloseButton:s=!1}){let{t:c}=t.useTranslation(`openhands`);if(e===`add`)return(0,O.jsx)(p.ModalBackdrop,{onClose:s?void 0:a,closeOnEscape:!1,closeOnBackdropClick:!s,"aria-label":c(n.I18nKey.BACKEND$ADD_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":s?`onboarding-modal`:`add-backend-modal`,className:r.cn(`relative rounded-xl border border-[var(--oh-border)] bg-base-secondary`,m.modalWidthClassName(`xl`),m.MODAL_MAX_WIDTH_VIEWPORT),children:[s?null:(0,O.jsx)(g.ModalCloseButton,{onClose:a,testId:`add-backend-close`}),s?null:(0,O.jsx)(`div`,{className:`px-6 pt-6 pb-2 pr-12`,children:(0,O.jsx)(`h2`,{className:h.modalTitleLgClassName,children:c(n.I18nKey.BACKEND$ADD_TITLE)})}),(0,O.jsx)(`div`,{className:r.cn(`px-6 pb-6`,s?`pt-6`:`pt-2`),children:(0,O.jsx)(G,{onClose:a,source:o})})]})});let l=`edit-backend`;return(0,O.jsx)(p.ModalBackdrop,{onClose:a,closeOnEscape:!1,"aria-label":c(n.I18nKey.BACKEND$EDIT_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":`${l}-modal`,className:r.cn(`relative bg-base-secondary p-6 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,m.modalWidthClassName(`md`)),children:[(0,O.jsx)(g.ModalCloseButton,{onClose:a,testId:`${l}-close`}),(0,O.jsx)(`h2`,{className:r.cn(`pr-6`,h.modalTitleLgClassName),children:c(n.I18nKey.BACKEND$EDIT_TITLE)}),(0,O.jsx)(B,{mode:`edit`,backend:i,onSubmitted:a,testIdRoot:l})]})})}exports.BackendFormModal=K;
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../utils/utils.cjs`),i=require(`../../../context/navigation-context.cjs`),a=require(`../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs`),o=require(`../../../node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs`);require(`../../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const s=require(`../../../api/agent-server-config.cjs`),c=require(`../../../api/agent-server-client-options.cjs`),l=require(`../../../api/agent-server-compatibility.cjs`),u=require(`../../../utils/user-facing-error.cjs`),d=require(`../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs`),f=require(`../../../contexts/active-backend-context.cjs`);require(`../../../api/device-flow-client.cjs`);const p=require(`../../../hooks/use-tracking.cjs`),m=require(`../../shared/modals/modal-backdrop.cjs`),h=require(`../../shared/modals/modal-body.cjs`),g=require(`../../../utils/modal-classes.cjs`),_=require(`../../shared/modals/modal-close-button.cjs`),v=require(`../settings/brand-button.cjs`),y=require(`../settings/settings-input.cjs`),b=require(`../../../hooks/query/use-backends-health.cjs`),x=require(`../../../assets/branding/openhands-logo-white.cjs`),S=require(`../files-tab/segmented-toggle.cjs`),C=require(`../../../icons/chevron-down-small.cjs`),w=require(`./backend-status-label.cjs`),T=require(`./backend-status-dot.cjs`),E=require(`./device-flow-auth.cjs`);let D=require(`react`);D=e.__toESM(D,1);let O=require(`react/jsx-runtime`);function k(e){return o.isOpenHandsCloudHost(e)?`cloud`:`local`}function A(e){let t=e.toLowerCase().replace(/^\[|\]$/g,``);return!!(t===`localhost`||t===`::1`||t===`::`||t===`0.0.0.0`||/^127\./.test(t)||/^::ffff:127\./i.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^fe[89ab][0-9a-f]:/i.test(t)||/^f[cd][0-9a-f]{2}:/i.test(t)||t.endsWith(`.local`)||!t.includes(`.`)&&!t.includes(`:`))}function j(e){let t=e.trim().replace(/\/+$/,``);if(!t)return``;if(/^https?:\/\//i.test(t))return t;let n=t.match(/^\[([^\]]+)\]/);return`${A(n?n[1]:(t.match(/:/g)??[]).length>1?t:t.split(`:`)[0])?`http`:`https`}://${t}`}function M(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=j(t);if(!n)return!1;try{let e=new URL(n);return(e.protocol===`http:`||e.protocol===`https:`)&&e.hostname.length>0}catch{return!1}}var N=`https://app.all-hands.dev`;function P(e,t){return e(n.I18nKey.BACKEND$CONNECTION_TEST_FAILED,{host:t,interpolation:{escapeValue:!1}})}function F(e){return u.getUserFacingConnectionErrorMessage(e)}function I(e,t){let n=F(t);return n?`${e}\n${n}`:e}async function L(e){e.kind===`local`&&l.assertAgentServerVersionIsSupported(await new a.ServerClient(c.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo())}function R({backend:e,testIdRoot:r}){let{t:i}=t.useTranslation(`openhands`),o=b.useBackendsHealth([e])[e.id],s=o?.isConnected??null,u=o?.disabled===!0,f=o?.consecutiveFailures??0,p=o?.lastError??null,{data:m}=d.useQuery({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>l.getDisplayAgentServerVersion(await new a.ServerClient(c.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`&&!u}),h=w.getBackendStatusLabel(i,e,o),g=e.kind===`cloud`?i(n.I18nKey.BACKEND$KIND_CLOUD):i(n.I18nKey.BACKEND$KIND_LOCAL);return(0,O.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,O.jsxs)(`div`,{"data-testid":`${r}-status`,className:`flex items-center gap-3 text-sm`,children:[(0,O.jsx)(T.BackendStatusDot,{isConnected:s}),(0,O.jsx)(`span`,{className:`text-white`,"data-testid":`${r}-status-label`,children:h}),(0,O.jsx)(`span`,{className:`text-tertiary-alt`,children:`·`}),(0,O.jsx)(`span`,{className:`text-[var(--oh-text-tertiary)]`,children:g}),m?(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-version`,children:i(n.I18nKey.BACKEND$VERSION_LABEL,{version:m})}):null]}),u?(0,O.jsxs)(`div`,{"data-testid":`${r}-status-error`,className:`flex flex-col gap-1 rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm`,children:[(0,O.jsx)(`span`,{className:`font-semibold text-red-300`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_TITLE)}),(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-text-tertiary)]`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_DETAIL,{count:f})}),p?(0,O.jsx)(`span`,{"data-testid":`${r}-status-error-message`,className:`text-xs text-red-300 whitespace-pre-wrap break-words`,children:p}):null]}):null]})}function z({initialName:e=``,initialHost:n=``,initialApiKey:r=``,onTestConnection:i,onSuccess:a,requireApiKey:o=!1,onSubmitOverride:s}){let{t:c}=t.useTranslation(`openhands`),[l,u]=D.default.useState(e),[d,f]=D.default.useState(n),[p,m]=D.default.useState(r),[h,g]=D.default.useState(null),[_,v]=D.default.useState(!1),[y,b]=D.default.useState(null),x=y??k(d),S=o||x!==`local`,C=l.trim().length>0&&M(d)&&(!S||p.trim().length>0);return{name:l,setName:u,host:d,setHost:f,apiKey:p,setApiKey:m,connectionError:h,setConnectionError:g,isSubmitting:_,kind:x,setKind:b,canSubmit:C,handleSubmit:D.default.useCallback(async e=>{if(e.preventDefault(),!C||_)return;let t={name:l.trim(),host:j(d),apiKey:p.trim(),kind:x};g(null),v(!0);try{s?await s(t):(await i(t),a())}catch(e){g(I(P(c,t.host),e))}finally{v(!1)}},[C,_,l,d,p,x,i,a,o,s,c])}}function B({mode:e,backend:i,onSubmitted:a,renderActions:o,testIdRoot:s,hostReadOnly:c,requireApiKey:l,hideConfigurationFields:u=!1,onSubmitOverride:d}){let{t:p}=t.useTranslation(`openhands`),{addBackend:m,updateBackend:h}=f.useActiveBackendContext(),g=e===`edit`&&i?i.kind:null,{name:_,setName:b,host:x,setHost:S,apiKey:C,setApiKey:w,connectionError:T,setConnectionError:E,isSubmitting:k,kind:A,handleSubmit:P}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:async()=>{let t={name:_.trim(),host:j(x),apiKey:C.trim(),kind:g??A};e===`edit`&&i?h(i.id,t):m(t),a()},requireApiKey:l,onSubmitOverride:d}),[F,I]=D.default.useState(!1),[B,V]=D.default.useState(!1),H=g??A,U=s??(e===`edit`?`edit-backend`:`add-backend`),W=l||H!==`local`,G=_.trim().length>0&&M(x)&&(!W||C.trim().length>0),K=F&&!_.trim()?p(n.I18nKey.BACKEND$NAME_REQUIRED):void 0,q=B?x.trim()?M(x)?void 0:p(n.I18nKey.BACKEND$HOST_INVALID):p(n.I18nKey.BACKEND$HOST_REQUIRED):void 0;return(0,O.jsxs)(`form`,{"data-testid":`${U}-form`,onSubmit:async e=>{if(!G){I(!0),V(!0);return}await P(e)},className:`flex flex-col gap-4`,children:[(0,O.jsxs)(`div`,{"data-testid":`${U}-configuration-fields`,className:r.cn(`flex flex-col gap-4`,u&&`hidden`),children:[(0,O.jsx)(y.SettingsInput,{testId:`${U}-name`,name:`${U}-name`,type:`text`,label:p(n.I18nKey.BACKEND$NAME_LABEL),value:_,onChange:e=>{b(e),E(null)},onBlur:()=>I(!0),placeholder:`Production`,className:`w-full`,showRequiredTag:!0,error:K}),(0,O.jsx)(y.SettingsInput,{testId:`${U}-host`,name:`${U}-host`,type:`text`,label:p(n.I18nKey.BACKEND$HOST_LABEL),value:x,onChange:c?void 0:e=>{S(e),E(null)},onBlur:()=>V(!0),placeholder:N,className:`w-full`,showRequiredTag:!0,error:q,isDisabled:c}),(0,O.jsx)(y.SettingsInput,{testId:`${U}-api-key`,name:`${U}-api-key`,type:`password`,label:p(n.I18nKey.BACKEND$KEY_LABEL),value:C,onChange:e=>{w(e),E(null)},placeholder:``,className:`w-full`}),T?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${U}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:T}):null,e===`edit`&&i&&(0,O.jsx)(R,{backend:i,testIdRoot:U})]}),o?o({canSubmit:G&&!k,isSubmitting:k,testIdRoot:U}):(0,O.jsxs)(`div`,{className:`flex justify-end gap-2 mt-2 w-full`,children:[(0,O.jsx)(v.BrandButton,{type:`button`,variant:`secondary`,onClick:a,testId:`${U}-cancel`,children:p(n.I18nKey.BUTTON$CANCEL)}),(0,O.jsx)(v.BrandButton,{type:`submit`,variant:`primary`,isDisabled:!G||k,testId:`${U}-submit`,children:p(n.I18nKey.BACKEND$SAVE)})]})]})}function V(){let{currentPath:e,navigate:t}=i.useNavigation();return D.default.useCallback(()=>{/^\/automations\/[^/]+/.test(e)?t(`/automations`):/^\/conversations\/[^/]+/.test(e)&&t(`/conversations`)},[e,t])}function H({onConnected:e,testIdRoot:r=`add-backend`,initialManualBackend:i,requireManualApiKey:a=!1,manualSubmitLabel:o,manualSubmittingLabel:c,manualSubmitTestId:l,analyticsSource:u}){let{t:d}=t.useTranslation(`openhands`),f=s.getLockedCloudHost();return f?(0,O.jsx)(`div`,{"data-testid":`${r}-connection-options`,className:`flex justify-center`,children:(0,O.jsx)(`div`,{className:`w-full`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r,lockedHost:f,analyticsSource:u})})}):(0,O.jsxs)(`div`,{"data-testid":`${r}-connection-options`,className:`flex flex-col gap-6 md:flex-row`,children:[(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(U,{onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o??d(n.I18nKey.BACKEND$CONNECT),submittingLabel:c??d(n.I18nKey.ONBOARDING$BACKEND_STATUS_CHECKING),submitTestId:l})}),(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r,analyticsSource:u})})]})}function U({onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o,submittingLabel:s,submitTestId:c}){let{t:l}=t.useTranslation(`openhands`),{name:u,setName:d,host:f,setHost:p,apiKey:m,setApiKey:h,connectionError:g,setConnectionError:_,isSubmitting:b,kind:x,setKind:C,canSubmit:w,handleSubmit:T}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:()=>{e({name:u.trim(),host:j(f),apiKey:m.trim(),kind:x},`manual`)},requireApiKey:a});return(0,O.jsxs)(`form`,{"data-testid":`${r}-form`,onSubmit:T,className:`flex flex-col gap-4 flex-1 min-w-0`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(y.SettingsInput,{testId:`${r}-name`,name:`${r}-name`,type:`text`,label:l(n.I18nKey.BACKEND$NAME_LABEL),value:u,onChange:e=>{d(e),_(null)},placeholder:`e.g. My Server`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,children:l(n.I18nKey.BACKEND$NAME_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(y.SettingsInput,{testId:`${r}-host`,name:`${r}-host`,type:`text`,label:l(n.I18nKey.BACKEND$HOST_LABEL),value:f,onChange:e=>{p(e),_(null)},placeholder:`http://localhost:8000`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-host-helper`,children:l(n.I18nKey.BACKEND$HOST_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col items-start gap-2.5`,children:[(0,O.jsx)(`span`,{className:`text-sm`,children:l(n.I18nKey.BACKEND$KIND_LABEL)}),(0,O.jsx)(S.SegmentedToggle,{value:x,options:[{value:`local`,label:l(n.I18nKey.BACKEND$KIND_LOCAL)},{value:`cloud`,label:l(n.I18nKey.BACKEND$KIND_CLOUD)}],onChange:e=>C(e),ariaLabel:l(n.I18nKey.BACKEND$KIND_LABEL),testId:`${r}-kind`})]}),(0,O.jsx)(y.SettingsInput,{testId:`${r}-api-key`,name:`${r}-api-key`,type:`password`,label:l(n.I18nKey.BACKEND$KEY_LABEL),value:m,onChange:e=>{h(e),_(null)},placeholder:`sk-••••••••••`,className:`w-full`}),g?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${r}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:g}):null,(0,O.jsx)(v.BrandButton,{type:`submit`,variant:`secondary`,isDisabled:!w||b,testId:c??`${r}-submit`,className:`w-full text-center`,children:b?s:o})]})}function W({onConnected:e,testIdRoot:i,lockedHost:a,analyticsSource:o}){let{t:s}=t.useTranslation(`openhands`),[c,l]=D.default.useState(!1),[u,d]=D.default.useState(``),f=a??(u.trim()||N);return(0,O.jsxs)(`div`,{className:`flex flex-1 min-w-0 flex-col items-center gap-3 pb-8`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col items-center gap-1`,children:[(0,O.jsx)(x.default,{width:56,height:56,"aria-hidden":!0}),(0,O.jsx)(`h4`,{className:g.modalTitleLgMediumClassName,"data-testid":`${i}-cloud-title`,children:s(n.I18nKey.BACKEND$CLOUD_TITLE)})]}),(0,O.jsx)(`p`,{className:`text-center text-sm leading-relaxed text-[var(--oh-muted)]`,children:s(n.I18nKey.BACKEND$CLOUD_DESCRIPTION)}),(0,O.jsx)(E.DeviceFlowAuth,{host:f,onSuccess:t=>{e({name:`OpenHands Cloud`,host:j(f),apiKey:t,kind:`cloud`},`cloud_login`)},testIdRoot:i,analyticsSource:o}),a?null:(0,O.jsxs)(`div`,{className:`w-full`,children:[(0,O.jsxs)(`button`,{type:`button`,onClick:()=>l(e=>!e),"aria-expanded":c,"data-testid":`${i}-advanced-toggle`,className:`flex w-full cursor-pointer items-center justify-center gap-1 text-center text-xs text-[var(--oh-muted)] transition-colors hover:text-content-2`,children:[(0,O.jsx)(`span`,{children:s(n.I18nKey.BACKEND$ADVANCED)}),(0,O.jsx)(C.default,{className:r.cn(`h-4 w-4 shrink-0 text-muted transition-transform`,c&&`rotate-180`),"aria-hidden":!0})]}),(0,O.jsxs)(`div`,{className:r.cn(`pt-2`,!c&&`pointer-events-none invisible`),"aria-hidden":!c,children:[(0,O.jsx)(y.SettingsInput,{testId:`${i}-cloud-host`,name:`${i}-cloud-host`,type:`text`,label:s(n.I18nKey.BACKEND$HOST_LABEL),value:u,onChange:d,placeholder:N,className:`w-full`}),(0,O.jsx)(`p`,{className:`mt-1 text-xs text-[var(--oh-muted)]`,children:s(n.I18nKey.BACKEND$LOGIN_CLOUD_HINT)})]})]})]})}function G({onClose:e,source:t}){let{addBackend:n}=f.useActiveBackendContext(),r=V(),{trackBackendAdded:i}=p.useTracking();return(0,O.jsx)(H,{onConnected:D.default.useCallback((a,s)=>{n(a);let c=o.isOpenHandsCloudHost(a.host);i({backendKind:a.kind,connectionMethod:s,isOpenhandsCloud:c,isCustomHost:!c,hasApiKey:!!a.apiKey,source:t}),r(),e()},[n,r,e,i,t]),analyticsSource:t})}function K({mode:e,backend:i,onClose:a,source:o=`add_backend_modal`,hideCloseButton:s=!1}){let{t:c}=t.useTranslation(`openhands`);if(e===`add`)return(0,O.jsx)(m.ModalBackdrop,{onClose:s?void 0:a,closeOnEscape:!1,closeOnBackdropClick:!s,"aria-label":c(n.I18nKey.BACKEND$ADD_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":s?`onboarding-modal`:`add-backend-modal`,className:r.cn(`relative rounded-xl border border-[var(--oh-border)] bg-base-secondary`,h.modalWidthClassName(`xl`),h.MODAL_MAX_WIDTH_VIEWPORT),children:[s?null:(0,O.jsx)(_.ModalCloseButton,{onClose:a,testId:`add-backend-close`}),s?null:(0,O.jsx)(`div`,{className:`px-6 pt-6 pb-2 pr-12`,children:(0,O.jsx)(`h2`,{className:g.modalTitleLgClassName,children:c(n.I18nKey.BACKEND$ADD_TITLE)})}),(0,O.jsx)(`div`,{className:r.cn(`px-6 pb-6`,s?`pt-6`:`pt-2`),children:(0,O.jsx)(G,{onClose:a,source:o})})]})});let l=`edit-backend`;return(0,O.jsx)(m.ModalBackdrop,{onClose:a,closeOnEscape:!1,"aria-label":c(n.I18nKey.BACKEND$EDIT_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":`${l}-modal`,className:r.cn(`relative bg-base-secondary p-6 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,h.modalWidthClassName(`md`)),children:[(0,O.jsx)(_.ModalCloseButton,{onClose:a,testId:`${l}-close`}),(0,O.jsx)(`h2`,{className:r.cn(`pr-6`,g.modalTitleLgClassName),children:c(n.I18nKey.BACKEND$EDIT_TITLE)}),(0,O.jsx)(B,{mode:`edit`,backend:i,onSubmitted:a,testIdRoot:l})]})})}exports.BackendFormModal=K;
2
2
  //# sourceMappingURL=backend-form-modal.cjs.map